zsh скопіюйте та вставте, як emacs


10

Я помітив, що в zsh є багато речей, які я бачу в emacs. Я можу зробити вибір з пробілом ctrl + та вибравши регіон. Я можу робити копії так само, як у emacs, поки я залишаюсь у zsh. У emacs я можу використовувати мій буфер обміну системи (раніше потрібна додаткова конфігурація, але це працює поза коробкою зараз у emacs). У zsh я, здається, не можу вставити з буфера обміну за допомогою Cy, а копіювання з zsh у мій системний кліпборд має ту саму проблему. Чи є шлях до цього?

Відповіді:


11

У Zsh's є вбудований буфер обміну, який не спілкується з іншими програмами. Оскільки це дуже чітко, ви можете змусити його спілкуватися кількома рядками у вашому ~/.zshrc. Вам знадобиться xclip або xsel . Див. Розділ Вставка з буфера обміну в z-включений zsh або bash оболонку для підтвердження концепції у режимі vi. Ось відповідний код для режиму emacs (ви, ймовірно, захочете зробити щось подібне до інших kill-*віджетів).

x-copy-region-as-kill () {
  zle copy-region-as-kill
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-copy-region-as-kill
x-kill-region () {
  zle kill-region
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-kill-region
x-yank () {
  CUTBUFFER=$(xsel -o -b </dev/null)
  zle yank
}
zle -N x-yank
bindkey -e '\ew' x-copy-region-as-kill
bindkey -e '^W' x-kill-region
bindkey -e '^Y' x-yank

Для цього використовується буфер обміну X11 (як правило, доступ до Ctrl+ C/ Ctrl+ V); видаліть -bнатомість можливість використовувати основний вибір X11 (автоматична копія при виборі та вставте середньою кнопкою миші).


Якщо ви користуєтесь режимом vi, просто замініть kill-regionна vi-deleteі yankз vi-put-afterтощо. Аналогічно обгортайте vi-yankта інші. (Я не знайшов способу зробити це центральніше)
olejorgenb

4

Я хотів інтегрувати вирізаний буфер 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.