dotfiles/config/zsh/vi-mode.zsh
Fernando Schauenburg fb1b6a3bda zsh: fix changing cursor shape in tmux + iTerm2
Most terminals use the VT520 DECSCUSR escape sequences for setting the
cursor shape, documented at:

    https://invisible-island.net/xterm/ctlseqs/ctlseqs.txt

iTerm2, however, uses a set of proprietary escape codes, documented at:

    https://iterm2.com/documentation-escape-codes.html

The issue I had was that tmux recognizes the VT520 DECSCUSR codes and
knows how to translate them itself to iTerm2. But tmux does not accept
the iTerm2 codes as input, so deciding to use these proprietary codes
only based on the presence of `$ITERM_SESSION_ID` did not work when
running tmux. The solution is to revert to the VT520 codes when running
inside of tmux (even inside iTerm2) and let it translate to iTerm2.
2022-11-18 20:34:32 +01:00

43 lines
1.2 KiB
Bash

# Use vi mode for line editing.
bindkey -v
export KEYTIMEOUT=1
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
}
# 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
# Start new prompts with bar shaped cursor.
zle-line-init() { set_cursor_shape bar }
zle -N zle-line-init
# Search through history in insert mode.
bindkey -M viins '^j' history-beginning-search-forward
bindkey -M viins '^k' history-beginning-search-backward
# Restore some common and useful emacs mode shortcut.
bindkey -M viins '^a' vi-beginning-of-line
bindkey -M viins '^e' vi-end-of-line
bindkey -M viins '^l' clear-screen