Skip to content

Instantly share code, notes, and snippets.

@amirrajan
Created April 15, 2025 22:31
Show Gist options
  • Save amirrajan/0b600f86b4417c8bb1ea94c98bb3eacc to your computer and use it in GitHub Desktop.
Save amirrajan/0b600f86b4417c8bb1ea94c98bb3eacc to your computer and use it in GitHub Desktop.
ZSH vim mode
set -o vi
# =====================
# vi mode
# =====================
bindkey -v
export KEYTIMEOUT=1
# =====================
# Change cursor shape for different vi modes.
# =====================
function zle-keymap-select {
if [[ ${KEYMAP} == vicmd ]] ||
[[ $1 = 'block' ]]; then
echo -ne '\e[1 q'
elif [[ ${KEYMAP} == main ]] ||
[[ ${KEYMAP} == viins ]] ||
[[ ${KEYMAP} = '' ]] ||
[[ $1 = 'beam' ]]; then
echo -ne '\e[5 q'
fi
}
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[5 q"
}
zle -N zle-line-init
echo -ne '\e[5 q' # Use beam shape cursor on startup.
preexec() { echo -ne '\e[5 q' ;} # Use beam shape cursor for each new prompt.
# =========================
# yank to clipboard
function vi-yank-xclip {
zle vi-yank
echo "$CUTBUFFER" | pbcopy
}
zle -N vi-yank-xclip
bindkey -M vicmd 'y' vi-yank-xclip
# =====================
# ctrl+f does fzf
# =====================
# fzf-file-search() {
# item="$(find '/' -type d \( -path '/proc/*' -o -path '/dev/*' \) -prune -false -o -iname '*' 2>/dev/null | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --rev erse --bind=ctrl-z:ignore $FZF_DEFAULT_OPTS $FZF_CTRL_T_OPTS" $(__fzfcmd) -m "$@")"
# if [[ -d ${item} ]]; then
# cd "${item}" || return 1
# elif [[ -f ${item} ]]; then
# (vi "${item}" < /dev/tty) || return 1
# else
# return 1
# fi
# zle accept-line
# }
# zle -N fzf-file-search
# have to eval fzf after enabling vi mode
eval "$(fzf --zsh)"
bindkey -s '^f' 'cd **\t'
bindkey -a '^g' vi-insert
bindkey -s '^e' 'ruby **\t'
bindkey -s '^b' 'sh **\t'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment