diff --git a/keyboard.zsh b/keyboard.zsh index 2eaa68c0..eca51a95 100644 --- a/keyboard.zsh +++ b/keyboard.zsh @@ -58,27 +58,38 @@ if zstyle -m ':omz:editor' keymap 'emacs'; then # Use Emacs key bindings. bindkey -e - bindkey "$keyinfo[Escape]b" emacs-backward-word - bindkey "$keyinfo[Escape]f" emacs-forward-word - bindkey "$keyinfo[Escape]$keyinfo[Left]" emacs-backward-word - bindkey "$keyinfo[Escape]$keyinfo[Right]" emacs-forward-word + [[ -n "$keyinfo[Escape]" ]] && \ + bindkey "$keyinfo[Escape]b" emacs-backward-word + [[ -n "$keyinfo[Escape]" ]] && \ + bindkey "$keyinfo[Escape]f" emacs-forward-word + [[ -n "$keyinfo[Escape]" ]] && [[ -n "$keyinfo[Left]" ]] && \ + bindkey "$keyinfo[Escape]$keyinfo[Left]" emacs-backward-word + [[ -n "$keyinfo[Escape]" ]] && [[ -n "$keyinfo[Right]" ]] && \ + bindkey "$keyinfo[Escape]$keyinfo[Right]" emacs-forward-word # Kill to the beginning of the line. - bindkey "$keyinfo[Control]u" backward-kill-line + [[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Control]u" backward-kill-line # Kill to the beginning of the word. - bindkey "$keyinfo[Control]w" backward-kill-word + [[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Control]w" backward-kill-word # Undo/Redo - bindkey "$keyinfo[Control]_" undo - bindkey "$keyinfo[Escape]_" redo + [[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Control]_" undo + [[ -n "$keyinfo[Escape]" ]] && \ + bindkey "$keyinfo[Escape]_" redo # Search character. - bindkey "$keyinfo[Control]]" vi-find-next-char - bindkey "$keyinfo[Escape]$keyinfo[Control]]" vi-find-prev-char + [[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Control]]" vi-find-next-char + [[ -n "$keyinfo[Escape]" ]] && [[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Escape]$keyinfo[Control]]" vi-find-prev-char # Edit command in an external editor. - bindkey "$keyinfo[Control]x$keyinfo[Control]e" edit-command-line + [[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Control]x$keyinfo[Control]e" edit-command-line # Expand .... to ../.. if zstyle -t ':omz:editor' dot-expansion; then @@ -88,11 +99,15 @@ if zstyle -m ':omz:editor' keymap 'emacs'; then # Bind to history substring search plugin if enabled; # otherwise, bind to built-in Zsh history search. if (( $+widgets[history-incremental-pattern-search-backward] )); then - bindkey "$keyinfo[Control]r" history-incremental-pattern-search-backward - bindkey "$keyinfo[Control]s" history-incremental-pattern-search-forward + [[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Control]r" history-incremental-pattern-search-backward + [[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Control]s" history-incremental-pattern-search-forward else - bindkey "$keyinfo[Control]r" history-incremental-search-backward - bindkey "$keyinfo[Control]s" history-incremental-search-forward + [[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Control]r" history-incremental-search-backward + [[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Control]s" history-incremental-search-forward fi elif zstyle -m ':omz:editor' keymap 'vi'; then # Use vi key bindings. @@ -140,7 +155,8 @@ elif zstyle -m ':omz:editor' keymap 'vi'; then # Undo/Redo bindkey -M vicmd "u" undo - bindkey -M vicmd "$keyinfo[Control]r" redo + [[ -n "$keyinfo[Control]" ]] && \ + bindkey -M vicmd "$keyinfo[Control]r" redo # Expand .... to ../.. if zstyle -t ':omz:editor' dot-expansion; then @@ -152,21 +168,36 @@ elif zstyle -m ':omz:editor' keymap 'vi'; then bindkey -M viins "kj" vi-cmd-mode # Emacs key bindings in insert mode. - bindkey -M viins "$keyinfo[Control]a" beginning-of-line - bindkey -M viins "$keyinfo[Control]b" backward-char - bindkey -M viins "$keyinfo[Escape]b" emacs-backward-word - bindkey -M viins "$keyinfo[Control]d" delete-char-or-list - bindkey -M viins "$keyinfo[Escape]d" kill-word - bindkey -M viins "$keyinfo[Control]e" end-of-line - bindkey -M viins "$keyinfo[Control]f" forward-char - bindkey -M viins "$keyinfo[Escape]f" emacs-forward-word - bindkey -M viins "$keyinfo[Control]k" kill-line - bindkey -M viins "$keyinfo[Control]u" backward-kill-line - bindkey -M viins "$keyinfo[Control]w" backward-kill-word - bindkey -M viins "$keyinfo[Escape]w" copy-region-as-kill - bindkey -M viins "$keyinfo[Escape]h" run-help - bindkey -M viins "$keyinfo[Escape]$keyinfo[Left]" emacs-backward-word - bindkey -M viins "$keyinfo[Escape]$keyinfo[Right]" emacs-forward-word + [[ -n "$keyinfo[Control]" ]] && \ + bindkey -M viins "$keyinfo[Control]a" beginning-of-line + [[ -n "$keyinfo[Control]" ]] && \ + bindkey -M viins "$keyinfo[Control]b" backward-char + [[ -n "$keyinfo[Escape]" ]] && \ + bindkey -M viins "$keyinfo[Escape]b" emacs-backward-word + [[ -n "$keyinfo[Control]" ]] && \ + bindkey -M viins "$keyinfo[Control]d" delete-char-or-list + [[ -n "$keyinfo[Escape]" ]] && \ + bindkey -M viins "$keyinfo[Escape]d" kill-word + [[ -n "$keyinfo[Control]" ]] && \ + bindkey -M viins "$keyinfo[Control]e" end-of-line + [[ -n "$keyinfo[Control]" ]] && \ + bindkey -M viins "$keyinfo[Control]f" forward-char + [[ -n "$keyinfo[Escape]" ]] && \ + bindkey -M viins "$keyinfo[Escape]f" emacs-forward-word + [[ -n "$keyinfo[Control]" ]] && \ + bindkey -M viins "$keyinfo[Control]k" kill-line + [[ -n "$keyinfo[Control]" ]] && \ + bindkey -M viins "$keyinfo[Control]u" backward-kill-line + [[ -n "$keyinfo[Control]" ]] && \ + bindkey -M viins "$keyinfo[Control]w" backward-kill-word + [[ -n "$keyinfo[Escape]" ]] && \ + bindkey -M viins "$keyinfo[Escape]w" copy-region-as-kill + [[ -n "$keyinfo[Escape]" ]] && \ + bindkey -M viins "$keyinfo[Escape]h" run-help + [[ -n "$keyinfo[Escape]" ]] && [[ -n "$keyinfo[Left]" ]] && \ + bindkey -M viins "$keyinfo[Escape]$keyinfo[Left]" emacs-backward-word + [[ -n "$keyinfo[Escape]" ]] && [[ -n "$keyinfo[Right]" ]] && \ + bindkey -M viins "$keyinfo[Escape]$keyinfo[Right]" emacs-forward-word # History bindkey -M vicmd "gg" beginning-of-history @@ -187,15 +218,19 @@ elif zstyle -m ':omz:editor' keymap 'vi'; then bindkey -M vicmd "/" history-incremental-pattern-search-forward # Emacs key bindings in insert mode. - bindkey -M viins "$keyinfo[Control]r" history-incremental-pattern-search-backward - bindkey -M viins "$keyinfo[Control]s" history-incremental-pattern-search-forward + [[ -n "$keyinfo[Control]" ]] && \ + bindkey -M viins "$keyinfo[Control]r" history-incremental-pattern-search-backward + [[ -n "$keyinfo[Control]" ]] && \ + bindkey -M viins "$keyinfo[Control]s" history-incremental-pattern-search-forward else bindkey -M vicmd "?" history-incremental-search-backward bindkey -M vicmd "/" history-incremental-search-forward # Emacs key bindings in insert mode. - bindkey -M viins "$keyinfo[Control]r" history-incremental-search-backward - bindkey -M viins "$keyinfo[Control]s" history-incremental-search-forward + [[ -n "$keyinfo[Control]" ]] && \ + bindkey -M viins "$keyinfo[Control]r" history-incremental-search-backward + [[ -n "$keyinfo[Control]" ]] && \ + bindkey -M viins "$keyinfo[Control]s" history-incremental-search-forward fi else print "omz: \`zstyle ':omz:editor' keymap\` must be set to 'emacs' or 'vi'" >&2 @@ -203,45 +238,65 @@ else fi # The next key bindings are for both Emacs and Vi. -bindkey "$keyinfo[Home]" beginning-of-line -bindkey "$keyinfo[End]" end-of-line - -bindkey "$keyinfo[Insert]" overwrite-mode -bindkey "$keyinfo[Delete]" delete-char -bindkey "$keyinfo[Backspace]" backward-delete-char - -bindkey "$keyinfo[Left]" backward-char -bindkey "$keyinfo[Right]" forward-char +[[ -n "$keyinfo[Home]" ]] && \ + bindkey "$keyinfo[Home]" beginning-of-line +[[ -n "$keyinfo[End]" ]] && \ + bindkey "$keyinfo[End]" end-of-line + +[[ -n "$keyinfo[Insert]" ]] && \ + bindkey "$keyinfo[Insert]" overwrite-mode +[[ -n "$keyinfo[Delete]" ]] && \ + bindkey "$keyinfo[Delete]" delete-char +[[ -n "$keyinfo[Backspace]" ]] && \ + bindkey "$keyinfo[Backspace]" backward-delete-char + +[[ -n "$keyinfo[Left]" ]] && \ + bindkey "$keyinfo[Left]" backward-char +[[ -n "$keyinfo[Right]" ]] && \ + bindkey "$keyinfo[Right]" forward-char # Expand history on space. bindkey ' ' magic-space if (( $+plugins[(er)history-substring-search] )); then - bindkey "$keyinfo[Up]" history-substring-search-up - bindkey "$keyinfo[Down]" history-substring-search-down - bindkey "$keyinfo[Control]p" history-substring-search-up - bindkey "$keyinfo[Control]n" history-substring-search-down + [[ -n "$keyinfo[Up]" ]] && \ + bindkey "$keyinfo[Up]" history-substring-search-up + [[ -n "$keyinfo[Down]" ]] && \ + bindkey "$keyinfo[Down]" history-substring-search-down + [[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Control]p" history-substring-search-up + [[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Control]n" history-substring-search-down else - bindkey "$keyinfo[Up]" up-line-or-history - bindkey "$keyinfo[Down]" down-line-or-history - bindkey "$keyinfo[Control]p" up-line-or-history - bindkey "$keyinfo[Control]n" down-line-or-history + [[ -n "$keyinfo[Up]" ]] && \ + bindkey "$keyinfo[Up]" up-line-or-history + [[ -n "$keyinfo[Down]" ]] && \ + bindkey "$keyinfo[Down]" down-line-or-history + [[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Control]p" up-line-or-history + [[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Control]n" down-line-or-history fi # Clear screen. -bindkey "$keyinfo[Control]l" clear-screen +[[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Control]l" clear-screen # Expand command name to full path. -bindkey "$keyinfo[Escape]e" expand-cmd-path +[[ -n "$keyinfo[Escape]" ]] && \ + bindkey "$keyinfo[Escape]e" expand-cmd-path # Duplicate the previous word. -bindkey "$keyinfo[Escape]m" copy-prev-shell-word +[[ -n "$keyinfo[Escape]" ]] && \ + bindkey "$keyinfo[Escape]m" copy-prev-shell-word # Bind Shift + Tab to go to the previous menu item. -bindkey "$keyinfo[BackTab]" reverse-menu-complete +[[ -n "$keyinfo[BackTab]" ]] && \ + bindkey "$keyinfo[BackTab]" reverse-menu-complete # Complete in the middle of word. -bindkey "$keyinfo[Control]i" expand-or-complete-prefix +[[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Control]i" expand-or-complete-prefix # Convert .... to ../.. automatically. if zstyle -t ':omz:editor' dot-expansion; then @@ -266,5 +321,6 @@ function expand-or-complete-prefix-with-indicator() { zle redisplay } zle -N expand-or-complete-prefix-with-indicator -bindkey "$keyinfo[Control]i" expand-or-complete-prefix-with-indicator +[[ -n "$keyinfo[Control]" ]] && \ + bindkey "$keyinfo[Control]i" expand-or-complete-prefix-with-indicator