Я хотів інтегрувати вирізаний буфер Zsh із буфером обміну X. Я спробував вищезгаданий http://stchaz.free.fr/mouse.zsh, але виявив, що мені не подобається, що всі мої операції Zsh заповнюють буфер обміну. Наприклад, іноді я би скопіював щось у браузер, а потім перейшов до оболонки і відредагував командний рядок, а потім вставив. Але часто редагуючи командний рядок - наприклад, видаляючи слово - змінюється буфер вирізання Zsh. На краще чи гірше, у X є просто буфер обміну, а не кільце для вбивства, тому коли операція редагування Zsh замінює буфер обміну, те, що я хотів вставити, втрачено - я не можу потягнути його (Cy My), як міг робити в Zsh або Emacs.
Тож, що я зробив замість цього, це створити нові спеціальні палітурки для взаємодії з буфером обміну X через zsh. Виявляється, "^ Xw" і "^ Xy" не використовуються в Emacs і Zsh, тому я можу отримати послідовний інтерфейс, прив'язуючи їх в обох додатках. Таким чином, звичайні операції редагування, cutbuffer і кільце вбивання залишаються в спокої. Якщо я хочу скопіювати щось у буфер обміну, я встановив регіон і роблю "^ 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
та інші. (Я не знайшов способу зробити це центральніше)