Я хотел интегрировать вырезанный буфер Zsh с буфером обмена X. Я попробовал вышеупомянутый http://stchaz.free.fr/mouse.zsh, но обнаружил, что мне не нравится, когда все мои операции Zsh заполняют буфер обмена. Например, иногда я копировал что-то в браузер, а затем переходил в оболочку, редактировал командную строку и вставлял. Но часто редактирование командной строки - например, удаление слова - изменяет буфер вырезания Zsh. К лучшему или к худшему, у X есть только буфер обмена, а не список уничтожений, поэтому, когда операция редактирования Zsh перезаписывает буфер обмена, то, что я хотел вставить, теряется - я не могу выдернуть (Cy My), как мог делай в Zsh или Emacs.
Вместо этого я создал новые специальные сочетания клавиш для взаимодействия с буфером обмена X через zsh. Оказывается, «^ Xw» и «^ Xy» не используются ни в Emacs, ни в Zsh, поэтому я могу получить согласованный интерфейс, связав их в обоих приложениях. Таким образом, обычные операции редактирования, обрезки буфера и списка уничтожений остаются одни. Если я хочу скопировать что-то в буфер обмена, я устанавливаю регион и выполняю «^ Xw» (или, если я уже убил это, а регион неактивен, я могу просто сделать «^ Xw», чтобы скопировать буфер вырезания). Вставка из буфера обмена выполняется с помощью «^ Xy».
# define commands to copy and paste x clipboard
# ^Xw - copy region, or cut buffer
# ^Xy - paste x clipboard
# in both cases, modifies CUTBUFFER
copy-to-xclip() {
[[ "$REGION_ACTIVE" -ne 0 ]] && zle copy-region-as-kill
print -rn -- $CUTBUFFER | xclip -selection clipboard -i
}
zle -N copy-to-xclip
bindkey "^Xw" copy-to-xclip
paste-xclip() {
killring=("$CUTBUFFER" "${(@)killring[1,-2]}")
CUTBUFFER=$(xclip -selection clipboard -o)
zle yank
}
zle -N paste-xclip
bindkey "^Xy" paste-xclip
kill-region
наvi-delete
иyank
сvi-put-after
и т. Д. Аналогичным образом обернитеvi-yank
и другие. (Я не нашел способ сделать это более централизованно)