Zsh копировать и вставлять, как Emacs


10

Я заметил, что у zsh есть много вещей, которые я вижу в emacs. Я могу сделать выбор с помощью Ctrl + пробел и выбора региона. Я могу делать копии, как в Emacs, пока я остаюсь внутри Zsh. В emacs я могу использовать мой системный буфер обмена (ранее с некоторой дополнительной конфигурацией, необходимой, но теперь это работает прямо из коробки в emacs). В zsh я не могу вставить из буфера обмена с помощью Cy, и копирование из zsh в системную панель управления вызывает такую ​​же проблему. Это можно обойти?

Ответы:


11

Zsh's имеет встроенный буфер обмена, который не связывается с другими приложениями. Так как это очень хорошо подходит для сценариев, вы можете сделать так, чтобы он связывался с несколькими строчками в вашем ~/.zshrc. Вам понадобится xclip или xsel . См. Вставка из буфера обмена в оболочку zsh или bash с поддержкой vi для проверки концепции в режиме 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, поэтому я могу получить согласованный интерфейс, связав их в обоих приложениях. Таким образом, обычные операции редактирования, обрезки буфера и списка уничтожений остаются одни. Если я хочу скопировать что-то в буфер обмена, я устанавливаю регион и выполняю «^ 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.