Вставка из буфера обмена в vi-enabled zsh или bash shell

Я хотел бы иметь возможность вставлять из системного буфера обмена (или текста) в мое приглашение оболочки «vi-like» с помощью клавиатуры. Обычно я использую zsh и иногда bash. В обоих случаях у меня есть оболочка с vi-подобным поведением ( bindkey -v / set -o vi ).

В vim поведение, которое я ищу, доступно с помощью последовательности клавиш "+p . Однако эта конкретная последовательность клавиш работает не так, как ожидалось, в приглашении оболочки с поддержкой vi. Есть ли способ включить это или похожее поведение, используя только клавиатуру, оставаясь с vi-подобными ключами в командной строке zsh или bash?

— редактировать —

Случай использования: я часто перемещаюсь между Firefox с помощью приложения Pentadactyl , эмулятора терминала и самого vim – с помощью диспетчера окон Xmonad с настраиваемыми ключами для перемещения. Все три программы имеют vi-подобные сочетания клавиш, которые очень эффективны (для «памяти пальцев»), поэтому было бы идеально обмениваться текстом между ними, используя синтаксис vim (или очень похожий синтаксис).

4 Solutions collect form web for “Вставка из буфера обмена в vi-enabled zsh или bash shell”

Насколько я знаю, Zsh не поддерживает ничего, кроме внутренних регистров, и bash не поддерживает регистрацию. По большому счету, оболочки поддерживают команды vi, а не команды vim.

В zsh здесь приведено доказательство для доступа к выбору X из командного режима. Для реального использования вы хотели бы подробнее остановиться на этих методах. Я использую программу xclip вместо этого вы можете использовать xclip ; см. Как копировать из одного экземпляра vim в другой с помощью регистров . Вы найдете функции, которые я использовал в руководстве zle .

 vi-append-x-selection () { RBUFFER=$(xsel -o -p </dev/null)$RBUFFER; } zle -N vi-append-x-selection bindkey -a '^X' vi-append-x-selection vi-yank-x-selection () { print -rn -- $CUTBUFFER | xsel -i -p; } zle -N vi-yank-x-selection bindkey -a '^Y' vi-yank-x-selection 

Функция vi-append-x-selection вставляет текущий X-выбор после курсора (аналогично p или P ). Функция vi-yank-x-selection копирует последний убитый или выдернутый текст в X-выбор. zle -N объявляет функции как zle widgets (т.е. команды редактирования). bindkey -a устанавливает привязки для режима командной bindkey -a vi.

Выбор и буфер обмена – это разные вещи в X Window, а IMHO «настольные среды», как правило, делают проблему еще более мутной, чем она была.

Работает ли сменная вставка? В приложениях с открытым X он должен вставлять выделение, когда такое связывание выполняется.

xsel Gilles xsel и zle не работало для меня. Однако, поскольку я настроил vim на использование моего системного буфера обмена по умолчанию ( set clipboard=unnamedplus в ~/.vimrc ), я просто set clipboard=unnamedplus v в нормальном режиме терминала, чтобы открыть текущую команду в vim а затем я могу скопировать ее в X -clipboard с любыми командами vim yank.

Вот решение для zsh (vi mode), которое обертывает исходные виджеты, поэтому буфер обмена всегда синхронизируется

Замените xclip вашим предпочтительным инструментом буфера обмена.

 function x11-clip-wrap-widgets() { # NB: Assume we are the first wrapper and that we only wrap native widgets # See zsh-autosuggestions.zsh for a more generic and more robust wrapper local copy_or_paste=$1 shift for widget in $@; do # Ugh, zsh doesn't have closures if [[ $copy_or_paste == "copy" ]]; then eval " function _x11-clip-wrapped-$widget() { zle .$widget xclip -in -selection clipboard <<<\$CUTBUFFER } " else eval " function _x11-clip-wrapped-$widget() { CUTBUFFER=\$(xclip -out -selection clipboard) zle .$widget } " fi zle -N $widget _x11-clip-wrapped-$widget done } local copy_widgets=( vi-yank vi-yank-eol vi-delete vi-backward-kill-word vi-change-whole-line ) local paste_widgets=( vi-put-{before,after} ) # NB: can atm. only wrap native widgets x11-clip-wrap-widgets copy $copy_widgets x11-clip-wrap-widgets paste $paste_widgets 
  • Получение «zsh: command not found: time» при запуске `time` в подселле
  • Отключить завершение имени файла подстроки в zsh
  • Что означает: $ {param: = значение} означает?
  • Почтовая папка без указания пути к папке и требует только один аргумент
  • Как я могу вывести «временно» в оболочку, как это делает завершение вкладки zsh?
  • Что эквивалентно «stty -echo» для zsh?
  • Расширяет ли расширение zsh по-разному в неинтерактивных скриптах?
  • Путь независимых shebangs
  • find -exec on zsh: эхо работает, как и ожидалось, печать не
  • Завершение первого аргумента cd OLD NEW
  • поиск файлов с использованием группового разрешения
  • Linux и Unix - лучшая ОС в мире.