set_cursor_shape() { local block='\e[1 q' # blinking block local underline='\e[3 q' # blinking underline, 4 for steady local bar='\e[5 q' # blinkind bar, 6 for steady if [[ -n "$ITERM_SESSION_ID" && -z "$TMUX" ]] { block='\e]1337;CursorShape=0\a' bar='\e]1337;CursorShape=1\a' underline='\e]1337;CursorShape=2\a' } case "$1" in block) echo -n $block ;; bar) echo -n $bar ;; underline) echo -n $underline ;; esac } # Start new prompts with bar shaped cursor. zle-line-init() { set_cursor_shape bar } zle -N zle-line-init # Switch cursor shape depending on editing mode. zle-keymap-select() { case $KEYMAP in vicmd) set_cursor_shape block ;; viins|main) set_cursor_shape bar ;; esac } zle -N zle-keymap-select # Use vi mode for line editing. bindkey -v export KEYTIMEOUT=1 # Restore some common and useful emacs mode shortcuts. bindkey -M viins '^a' vi-beginning-of-line bindkey -M viins '^e' vi-end-of-line bindkey -M viins '^l' clear-screen bindkey -M viins '^u' kill-whole-line bindkey -M viins '^y' yank bindkey -M viins '^[.' insert-last-word # Search through history in insert mode. bindkey -M viins '^j' history-beginning-search-forward bindkey -M viins '^k' history-beginning-search-backward # Move word-wise with Alt. bindkey -M viins '^[b' vi-backward-word bindkey -M viins '^[f' vi-forward-word # Edit current command line in $EDITOR. autoload edit-command-line && zle -N edit-command-line bindkey -M viins '^x^e' edit-command-line bindkey -M vicmd ' ' edit-command-line clear-status-line() { zle -R -c # zle -R hello world and the rest } zle -N clear-status-line bindkey -M viins '^q' clear-status-line # Shortcut to start neovim. bindkey -s '^v' '^unvim\r' # cd to the root of the git repository (if within one). cd-git-root() { local top_level="$(git rev-parse --show-toplevel 2>/dev/null)" [[ -z "$top_level" ]] && return 1 zle push-line BUFFER="builtin cd -- ${(q)top_level}" zle accept-line } zle -N cd-git-root bindkey -M viins '^g' cd-git-root if command -v fzf >/dev/null 2>&1; then # Add `fzf` key bindings if it's installed: # - CTRL-T: paste the selected file path(s) into the command line # - ALT-C: cd into the selected directory # - CTRL-R: paste the selected command from history into the command line source "$ZDOTDIR/line-editor-fzf.zsh" else # Fall back to incremental search bindkey -M viins '^r' history-incremental-search-backward bindkey -M isearch '^j' history-incremental-search-forward bindkey -M isearch '^k' history-incremental-search-backward bindkey -M isearch '^y' accept-search fi