This repository has been archived on 2022-08-21. You can view files and clone it, but cannot push or open issues or pull requests.
dotfiles/home/.config/zsh/keybinds.zsh

119 lines
3.5 KiB
Bash

# ___ ______ _________
# __ | / /__(_) _______ _______________ /____
# __ | / /__ / __ __ `__ \ __ \ __ /_ _ \
# __ |/ / _ / _ / / / / / /_/ / /_/ / / __/
# _____/ /_/ /_/ /_/ /_/\____/\__,_/ \___/
#
bindkey -v
export KEYTIMEOUT=15 # long enough for the 'jk' to work
# Change cursor shape for different vi modes
function vi_zle-keymap-select {
if [[ ${KEYMAP} == vicmd ]]; then
echo -ne '\e[1 q'
elif [[ ${KEYMAP} == main ]] ||
[[ ${KEYMAP} == viins ]] ||
[[ ${KEYMAP} = '' ]]; then
echo -ne '\e[5 q'
fi
}
# Check for existing keymap-select widget
local existing_keymap_select_fn=$widgets[zle-keymap-select]
# zle-keymap-select is a special widget so it'll be "user:fnName" or nothing. Let's get fnName only.
existing_keymap_select_fn=${existing_keymap_select_fn//user:}
if [[ -z ${existing_keymap_select_fn} ]]; then
zle -N zle-keymap-select vi_zle-keymap-select
else
function vi_zle-keymap-select-wrapped {
${existing_keymap_select_fn} "$@"
vi_zle-keymap-select "$@"
}
zle -N zle-keymap-select vi_zle-keymap-select-wrapped
fi
echo -ne '\e[5 q' # Use beam shape cursor on startup.
precmd() { echo -ne '\e[5 q' ;} # Use beam shape cursor for each new prompt.
# Work with brackets/quotes
# ci", ci', ci`, di", etc
autoload -U select-quoted
zle -N select-quoted
for m in visual viopp; do
for c in {a,i}{\',\",\`}; do
bindkey -M $m $c select-quoted
done
done
# ci{, ci(, ci<, di{, etc
autoload -U select-bracketed
zle -N select-bracketed
for m in visual viopp; do
for c in {a,i}${(s..)^:-'()[]{}<>bB'}; do
bindkey -M $m $c select-bracketed
done
done
# surround
autoload -Uz surround
zle -N delete-surround surround
zle -N add-surround surround
zle -N change-surround surround
bindkey -a cs change-surround
bindkey -a ds delete-surround
bindkey -a ys add-surround
# __________________
# __ __ \_ /___ /_____________________
# _ / / / __/_ __ \ _ \_ ___/_ ___/
# / /_/ // /_ _ / / / __/ / _(__ )
# \____/ \__/ /_/ /_/\___//_/ /____/
#
# Basics
bindkey -M viins 'jk' vi-cmd-mode # noone likes Esc
bindkey -M viins ' ' magic-space
# bindkey -M viins '^I' expand-or-complete-prefix
bindkey -M viins '^U' backward-kill-line
bindkey -M viins '^K' kill-line
bindkey -M viins '^W' backward-kill-word
bindkey -M viins '^B' backward-word
bindkey -M viins '^F' forward-word
bindkey -M viins '^G' push-line-or-edit
bindkey -M viins '^A' beginning-of-line
bindkey -M viins '^E' end-of-line
bindkey -M viins '^S' history-incremental-pattern-search-backward
bindkey -M vicmd '^U' backward-kill-line
bindkey -M vicmd '^K' kill-line
bindkey -M vicmd 'H' run-help
# Shift + Tab
bindkey -M viins '^[[Z' reverse-menu-complete
# Open current prompt in external editor
autoload -Uz edit-command-line; zle -N edit-command-line
bindkey '^[ ' edit-command-line
# Fix the DEL key
bindkey -M vicmd "^[[3~" delete-char
bindkey "^[[3~" delete-char
# Use vim keys in tab complete menu
bindkey -M menuselect '^H' vi-backward-char
bindkey -M menuselect '^J' vi-down-line-or-history
bindkey -M menuselect '^K' vi-up-line-or-history
bindkey -M menuselect '^L' vi-forward-char
bindkey -M menuselect 'left' vi-backward-char
bindkey -M menuselect 'down' vi-down-line-or-history
bindkey -M menuselect 'up' vi-up-line-or-history
bindkey -M menuselect 'right' vi-forward-char
# C-z to toggle current process (background/foreground)
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
BUFFER="fg"
zle accept-line
else
zle push-input
zle clear-screen
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z