Вставка из буфера обмена в 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 
  • Внедрить десериализацию значения ключа или что-то подобное
  • Ruby Version Prompt (Oh My ZSH) не работает вне TMUX
  • zsh: отдельное завершение для имен команд и имен файлов
  • find -exec on zsh: эхо работает, как и ожидалось, печать не
  • Почему замена процесса <() не работает с ssh -F
  • Все каталоги ошибочно идентифицированы как git repos в zsh
  • Почему zsh и ksh93 решили быть несоответствующими при сопоставлении с образцом?
  • Команда zsh git auto-complete добавляет дополнительное происхождение к имени ветки git
  • Удалить keymap и полностью отключить ключ в zsh
  • Почему $ COLUMNS не отображается ни в env, ни в наборе? (по zsh)
  • Прочитайте первую строку вывода команды. Команда соединяет меня с удаленным терминалом
  • Interesting Posts

    Список установленных программ без запуска программы в системе

    Что такое lvmetad и почему я хочу или должен его использовать?

    почему этот параллельный процесс не записывает вывод в файлы, а вместо этого печатает на консоли?

    Как заблокировать root от запуска скрипта

    Что это '!' действительно, когда он добавляется в команду ex (: wq! |: w! |: q!)?

    Как избавиться от ненужных строк в gnuplot

    awk вырезано из определенного слова в строке

    Проблемы с установкой источника

    спящий режим на диск не восстанавливается, но приостанавливается работа барана

    Измените значение в файле конфигурации или добавьте параметр, если он не существует?

    openvpn –config conf.ovpn приводит к ответам «RTNETLINK: файл существует»

    Как проверить, что «ls» выводит что-то … с помощью одной команды?

    Preseed – недостаточно места на диске?

    Тестирование строки, содержащей только пробелы (вкладки или «»)?

    Arch устанавливает, но GRUB не загружает

    Linux и Unix - лучшая ОС в мире.