Запустить произвольную команду в режиме копирования tmux

По-видимому, вы не можете, запись в файл stdin процесса не заставляет процесс читать то, что вы добавили. См. этот ответ для полного объяснения:https://serverfault.com/a/962956

0
18.08.2021, 11:29
2 ответа

Основываясь на ответе NotTheDr01ds , я получил полное решение как:

bind-key -T copy-mode   !  command-prompt -p "cmd:" "send-keys -X copy-selection-no-clear \; run-shell \"tmux show-buffer | %1\" "
bind-key -T copy-mode-vi   !  command-prompt -p "cmd:" "send-keys -X copy-selection-no-clear \; run-shell \"tmux show-buffer | %1\" "

Использование :выберите текст, затем нажмите !. Вам будет предложено ввести команду оболочки для запуска. Выбранный текст будет передан команде оболочки как стандартный ввод. Стандартный вывод команды оболочки будет отображаться обратно на панель tmux.

Спасибо NotTheDr01ds за отличный совет!

1
26.10.2021, 07:06

Вы близко; ну вроде -оф. Команды режима копирования -необходимо отправлять через sendkeys -X.

Таким образом, чтобы передать выделенный текст команде,было бы:

  • Префикс:
  • send-keys -X copy-pipe "wc"

НО, Tmux нигде не отображает вывод copy-pipe. При использовании run-commandвывод отображается в буфере копирования -. Для copy-pipeвроде бы просто сожрали. Пример, на который вы ссылались в другом ответе, просто сохранил буфер, поэтому вывод/обратная связь не требовались.

Для wcэто не слишком полезно. И я предполагаю, что вывод pastebin— это вполне -полезный URL-адрес...

Самая простая альтернатива, которую я нашел, начинает запутываться, особенно , поскольку вы хотите сделать это с помощью произвольных команд:

  • Префикс:
  • send-keys -X copy-selection-no-clear ; run-shell "tmux show-buffer | wc"

Обратите внимание, что там нет проверки ошибок, чтобы определить, выбрано ли что-то. Он просто запустит show-bufferдля самого последнего буфера.

Потенциально лучший вариант, ИМХО

Поскольку Vim хорошо подходит для этого -варианта использования, используйте его. Настройте привязку клавиши -, которая открывает буфер обратной прокрутки в vim, используя подстановку процесса.

Для испытаний в оболочке (испытано):

tmux bind-key -T copy-mode v new-window -d -n scrollback "vi <(tmux capture-pane -p -S - -E -)" \\\; run-shell "sleep 1" \\\; select-window -t scrollback

Или в вашем конфиге (untested):

bind-key -T copy-mode v new-window -d -n scrollback "vi <(tmux capture-pane -p -S - -E -)" \; run-shell "sleep 1" \; select-window -t scrollback

Хаки, да, и вам может понадобиться увеличить sleepдля больших буферов --Я не проверял это. Вероятно, есть лучший способ, но это то, что я придумал.

Также вы потеряете цветовые коды ANSI, но вы можете справиться с этим (, если хотите )с расширением AnsiEsc VIM, а также с добавлением -eк capture-buffer(, чтобы сохранить коды ANSI в выходном буфере ).

2
20.08.2021, 10:26

Теги

Похожие вопросы