126 lines
3.0 KiB
Bash
126 lines
3.0 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
|
||
# 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
|