6

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

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

2 ответа2

12

Вы, вероятно, можете использовать 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 .

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

Помимо 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
    
2

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

tslime.vim @ vimscripts

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .