Отправка команд родительскому сеансу tmux из vim

2817
leo

У меня есть разделенное окно настройки с vim и Lynx в tmux. Я пытаюсь создать сценарий, чтобы я мог отправить пользовательскую команду в vim, которая сохранит сценарий, над которым я работаю, переключит фокус на панель Lynx, обновит страницу Lynx, а затем переключится обратно на панель vim.

Есть ли существующий скрипт, который делает это? Если нет, то какой будет лучший подход для создания этого скрипта?

5

2 ответа на вопрос

11
Chris Johnsen

Вероятно, вы можете использовать :!команду Vim для запуска, tmux send-keysчтобы отправить Control-R на другую панель. Поскольку вы send-keysможете отправлять нажатия клавиш на любую панель (не только активную), вам даже не нужно переключать активные панели вперед и назад.

Вот это отображение Vim (вы можете поместить его в свой .vimrcили просто вставить в :подсказку, чтобы попробовать):

:map <Leader>rl :w<Bar>execute 'silent !tmux send-keys -t bottom C-r'<Bar>redraw!<C-M> 

Это сопоставляет \rlпоследовательность клавиш (по <Leader>умолчанию \, но ее можно настроить) со следующей последовательностью команд Vim (разделенных <Bar>; см. :help map_bar):

  1. Запишите текущий буфер в его файл.
  2. Запустите tmux команду для отправки Control-R на нижней панели.
    Мы используем executeздесь, чтобы следующая команда Vim ( redraw) не принималась как часть команды :!оболочки.
    Мы используем silentпрефиксную команду, чтобы избежать запроса «Нажмите ENTER для продолжения».
    Вы можете опустить, slientесли хотите получить приглашение или хотите увидеть вывод :!команды (например, команда tmux не работает, и вы хотите увидеть, выдает ли она сообщение об ошибке).
  3. Перерисовать экран.
    Обычно это происходит после запроса «Нажать ENTER», но мы подавляем его с помощью silent.

У меня нет lynx под рукой, но Control-R, кажется, является ключом перезагрузки, основанным на моем поиске «перезагрузки lynx» (то есть «Перезагрузка файлов и обновление дисплея» руководства пользователя).

Кроме того bottom, есть и другие способы указания целевой панели (найдите «target-pane» на странице руководства tmux ):

  • .+1, .-1: следующая, предыдущая панель в этом окне
  • top, bottom, left, right, И их комбинации top/ bottomс left/ right
    (т.е. bottom-left)
  • %42( tmux 1.5+): %номер панели с префиксом из переменной среды TMUX_PANE целевой панели

    Эта последняя форма может быть полезна, если ваша панель Lynx не всегда находится в том же окне tmux, что и ваш экземпляр Vim. Перед запуском Lynx сохраните значение TMUX_PANE во временном файле, затем прочитайте файл, чтобы сформировать аргумент целевой панели:

    # before running Lynx (anytime really, but "before" is usually scriptable) echo "$TMUX_PANE" > /tmp/my-lynx-pane  # in the Vim :! command in the mapping: tmux send-keys -t "$(cat /tmp/my-lynx-pane)" C-r 
@ chris-johnsen, спасибо .. это прекрасно работает. Вы могли бы объяснить разницу между Cntrl-r и Cntrl-M в приведенной выше команде? Представляет ли Cntrl-r «Enter» в оболочке, а Cntrl-M аналогично нажатию «Enter» в exmode? Они оба эквивалентны наличию «E», «N», «T», «E», «R», каждая буква прописана в exmode или vimrc? alpha_989 6 лет назад 0
2
user836295

Вам следует начать с плагина tslime.vim, который взаимодействует с выбранным вручную сеансом tmux и отправляет ему буфер. Вы бы написали почти идентичный плагин; однако вместо отправки буфера вы будете выдавать команды (см. man 1 tmux).

tslime.vim @ vimscripts

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