2026-03-12 18:48:19 +03:00

126 lines
2.7 KiB
Bash

# vim: ft=zsh
KEYTIMEOUT=1
# Activate vim mode.
bindkey -v
bindkey -M visual 'i' vi-insert
bindkey -M visual 'a' vi-add-next
# Yank to the system clipboard
function vi-yank-xclip {
zle vi-yank
echo -n "$CUTBUFFER" | \copy
}
zle -N vi-yank-xclip
bindkey -M visual 'y' vi-yank-xclip
bindkey ' ' magic-space
bindkey '^K' up-line-or-history # C-k
bindkey -M vicmd '^K' up-line-or-history # C-k
bindkey '^J' down-line-or-history # C-j
bindkey -M vicmd '^J' down-line-or-history # C-j
bindkey '^U' kill-whole-line # C-u
bindkey -M vicmd '^U' kill-whole-line # C-u
bindkey -M viins '\e.' insert-last-word # M-.
bindkey '^[[Z' reverse-menu-complete # S-Tab
bindkey -M viins '`' autosuggest-accept
bindkey -M vicmd '`' autosuggest-accept
bindkey -M viins '^?' backward-delete-char
bindkey -M vicmd '^?' backward-delete-char
bindkey -M viins '^W' backward-delete-word
bindkey -M vicmd '^W' backward-delete-word
bindkey -M viins '^H' backward-delete-char
bindkey -M vicmd '^H' backward-delete-char
insert-sudo() {
local sudo_template="${SUDO:=sudo} "
local template_len="${#sudo_template}"
if [ -z "${LBUFFER}${RBUFFER}" ]; then
zle up-history
if [ ! "${LBUFFER::$template_len}" = "$sudo_template" ]; then
LBUFFER="${sudo_template}${LBUFFER}"
fi
return
fi
if [ "${LBUFFER::$template_len}" = "$sudo_template" ]; then
LBUFFER="${LBUFFER:$template_len}"
else
LBUFFER="${sudo_template}${LBUFFER}"
fi
}
zle -N insert-sudo
bindkey -M vicmd '^S' insert-sudo # C-s
bindkey -M viins '^S' insert-sudo # C-s
popdquiet() {
popd &>/dev/null
zle reset-prompt
}
zle -N popdquiet
bindkey "^P" popdquiet
bindkey -M vicmd "^P" popdquiet
cddotdot() {
cd ..
zle reset-prompt
}
zle -N cddotdot
bindkey "^O" cddotdot
bindkey -M vicmd "^O" cddotdot
fzfhistory() {
local cmd
cmd=$(fc -il 1 | \
awk '{
original = $0;
clean = $0;
sub(/^[ ]*[0-9]+[ ]+[0-9]{4}-[0-9]{2}-[0-9]{2}[ ]+[0-9]{2}:[0-9]{2}[ ]*/, "", clean);
print clean "\t" original
}' | \
fzf \
--ignore-case \
--scheme=history \
--no-multi \
--tac \
--tiebreak=begin,index \
--height="$((${LINES}/4))" \
--query="${BUFFER}" \
--delimiter=$'\t' \
--with-nth=1 \
--preview="echo {2} | sed 's/\\\n/\\n/g' | highlight -O ansi -S zsh" \
--preview-window=wrap:30%:50% | \
cut -f1 | sed 's/\\n/\n/g')
if [[ -n "${cmd}" ]]; then
BUFFER="${cmd}"
CURSOR=$#BUFFER
fi
zle reset-prompt
}
zle -N fzfhistory
bindkey "^R" fzfhistory
bindkey -M vicmd "^R" fzfhistory