2026-03-12 16:57:02 +03:00

126 lines
3.0 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
# fc -l 1 выводит всю историю с номерами.
# Мы используем процесс-подстановку <(...) чтобы передать вывод fc напрямую в fzf.
# Сед (sed) убирает номера строк в начале, оставляя только текст команды.
# Важно: fc корректно обрабатывает многострочные команды, не разрывая их.
cmd=$(fc -l 1 | \
sed 's/^[ ]*[0-9]*[ ]*//' | \
fzf \
--ignore-case \
--scheme=history \
--no-multi \
--tiebreak=begin,index \
--height="$(($LINES/4))" \
--query="$BUFFER" \
--preview="echo {}" \
--preview-window=wrap:30%:50%)
if [[ -n "$cmd" ]]; then
# Очищаем буфер и вставляем выбранную команду
BUFFER=$cmd
# Перемещаем курсор в конец строки (опционально, но удобно)
CURSOR=$#BUFFER
fi
zle reset-prompt
}
zle -N fzfhistory
bindkey "^R" fzfhistory
bindkey -M vicmd "^R" fzfhistory