############### # keybindings # ############### autoload -U edit-command-line zle -N edit-command-line ## Superseded by bracketed paste mode: # autoload -Uz url-quote-magic # zle -N self-insert url-quote-magic bindboth() { bindkey -M viins "$@" bindkey -M vicmd "$@" } # redefine history widgets to drop into cmd mode widget-vicmd() { local cur=$CURSOR zle .${WIDGET%-vicmd} zle vi-cmd-mode CURSOR=$cur } for W in up-line-or-history down-line-or-history \ history-beginning-search-backward history-beginning-search-forward do zle -N ${W}-vicmd widget-vicmd done # insert bindboth "^[[2~" overwrite-mode # delete bindboth "^[[3~" delete-char bindboth "^[3~" delete-char # home bindboth "^[[7~" beginning-of-line bindboth "^[[1~" beginning-of-line bindboth "^[[H" beginning-of-line bindboth "^[OH" beginning-of-line # end bindboth "^[[8~" end-of-line bindboth "^[[4~" end-of-line bindboth "^[[F" end-of-line bindboth "^[OF" end-of-line # page up bindboth "^[[5~" history-beginning-search-backward # page down bindboth "^[[6~" history-beginning-search-forward bindkey -M vicmd n history-beginning-search-backward bindkey -M vicmd N history-beginning-search-forward bindboth "^[n" history-beginning-search-backward-vicmd bindboth "^[N" history-beginning-search-forward-vicmd bindboth "^N" down-line-or-history-vicmd bindboth "^P" up-line-or-history-vicmd # ctrl-z #bindkey '^z' edit-command-line bindkey -M vicmd "^V" edit-command-line bindkey -M vicmd 'v' edit-command-line # ctrl-e #bindkey -M viins '^E' menu-expand-or-complete bindboth -M viins '^A' beginning-of-line bindboth -M viins '^E' end-of-line # tab bindkey -M viins '^I' complete-word # no escape timeout viins #bindkey -M viins '^C' vi-cmd-mode bindkey -M viins '^F' vi-cmd-mode bindkey -M vicmd '^F' vi-cmd-mode #bindkey -M vicmd ^F send-break # no escape timeout vicmd #bindkey -rpM vicmd '^C' # consider / a word break, for ctrl-w WORDCHARS=${WORDCHARS//\/} autoload forward-word-match; zle -N forward-word-match autoload backward-word-match; zle -N backward-word-match autoload transpose-words-match; zle -N transpose-words-match autoload select-word-style select-word-style shell zstyle ':zle:*kill*' word-style normal transpose-words-match-left() { zle backward-word-match zle transpose-words-match zle backward-word-match } zle -N transpose-words-match-left transpose-words-match-right() { zle backward-word-match zle forward-word-match zle transpose-words-match } zle -N transpose-words-match-right # VIM-style i_CTRL-V_digit input for character codes bindkey -M viins '^V0' viins-ctrl-v-digit bindkey -M viins '^V1' viins-ctrl-v-digit bindkey -M viins '^V2' viins-ctrl-v-digit bindkey -M viins '^Vo' viins-ctrl-v-octal bindkey -M viins '^VO' viins-ctrl-v-octal bindkey -M viins '^Vx' viins-ctrl-v-hex bindkey -M viins '^VX' viins-ctrl-v-hex bindkey -M viins '^Vu' viins-ctrl-v-hex bindkey -M viins '^VU' viins-ctrl-v-hex zle -N viins-ctrl-v-digit _viins_escape_decimal zle -N viins-ctrl-v-octal _viins_escape_octal zle -N viins-ctrl-v-hex _viins_escape_hex function _viins_escape_decimal() { IFS= read -srk 2 REPLY='10#'$KEYS[2]${REPLY//[^0-9]/} LBUFFER+=${(#)REPLY} } function _viins_escape_octal() { IFS= read -srk 3 REPLY='8#'${REPLY//[^0-7]/} LBUFFER+=${(#)REPLY} } function _viins_escape_hex() { case $KEYS[2] in (u) IFS= read -srk 4;; (U) IFS= read -srk 8;; (*) IFS= read -srk 2;; esac REPLY='16#'${REPLY//[^0-9a-fA-F]/} LBUFFER+=${(#)REPLY} } # arrow movements bindboth "^[OC" vi-forward-word bindboth "^[OD" vi-backward-word bindboth "^[^[OC" forward-word-match bindboth "^[^[OD" backward-word-match bindboth "^[^[[C" transpose-words-match-right bindboth "^[^[[D" transpose-words-match-left # arrows: up down right left # ^[[A ^[[B ^[[C ^[[D # alt ^[^[[A ^[^[[B ^[^[[C ^[^[[D # ctrl ^[OA ^[OB ^[OC ^[OD # ctrl+alt ^[^[OA ^[^[OB ^[^[OC ^[^[OD bindboth '^[h' vi-backward-char bindboth "^[H" backward-word-match bindboth '^[l' vi-forward-char bindboth "^[L" forward-word-match bindboth '^[j' beginning-of-line bindboth '^[k' end-of-line bindboth '^[J' transpose-words-match-left bindboth '^[K' transpose-words-match-right widget-tmux-previous-prompt() { tmux copy-mode \; send-keys $(print -P '?%n@%m ') C-m n j } zle -N widget-tmux-previous-prompt bindboth '^K' widget-tmux-previous-prompt widget-tmux-pageup-prompt() { tmux copy-mode \; send-keys $LINES k $(print -P '?%n@%m ') C-m } zle -N widget-tmux-pageup-prompt bindboth '^U' widget-tmux-pageup-prompt if ((${+functions[zaw-register-src]})); then bindkey -M filterselect '^U' widget-tmux-pageup-prompt # zaw bindboth '^X^X' zaw-tmux-word bindboth '^Xt' zaw-tmux-word bindboth '^Xl' zaw-tmux-line bindboth '^XT' zaw-tmux-word-all bindboth '^XL' zaw-tmux-line-all bindboth '^[q' zaw-zmuch-saved-search bindboth '^[Q' zaw-zmuch-saved-search-all bindboth '^[m' zaw-zmuch-message-unread bindboth '^[M' zaw-zmuch-message bindboth '^[t' zaw-zmuch-thread-unread bindboth '^[T' zaw-zmuch-thread mark-and-move-next() { zle set-mark-command zle down-line-or-history } zle -N mark-and-move-next bindkey -M filterselect '^X' mark-and-move-next fi # vim: ft=zsh noet