# Enable vi keybindings bindkey -v export KEYTIMEOUT="1" autoload -z edit-command-line zle -N edit-command-line bindkey '^e' edit-command-line # Fix backspace character behavior in vi mode bindkey '^?' backward-delete-char bindkey '^W' backward-kill-word bindkey '^H' backward-delete-char # Control-h also deletes the previous char. bindkey '^U' backward-kill-line # Change cursor shape for different vi modes zle-keymap-select() { if [[ "${KEYMAP}" == "vicmd" ]] || [[ "$1" == "block" ]]; then echo -ne '\e[2 q' psvar[1]="(cmd) " elif [[ "${KEYMAP}" == "main" ]] || [[ "${KEYMAP}" == "viins" ]] || [[ -z "${KEYMAP}" ]] || [[ "$1" == "beam" ]]; then echo -ne '\e[6 q' psvar[1]="(ins) " fi zle reset-prompt } zle -N zle-keymap-select zle-line-init() { zle -K viins # Initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere) echo -ne '\e[6 q' psvar[1]="(ins) " } zle -N zle-line-init echo -ne '\e[6 q' # Use beam shape cursor on startup preexec() { echo -ne '\e[6 q' } # Use beam shape cursor for each new prompt