Enviando comandos para a sessão pai do tmux do vim

5

Eu tenho uma configuração de janela dividida com o vim e o Lynx no tmux. Eu estou tentando construir um script para que eu possa enviar um comando personalizado para vim que irá salvar o script que estou trabalhando, mudar o foco para o painel Lynx, atualizar a página do Lynx e, em seguida, voltar para o painel vim.

Existe um script existente que faz isso? Se não, qual seria a melhor abordagem para construir esse script?

    
por leo 04.12.2011 / 20:38

2 respostas

11

Provavelmente você pode usar o comando Vim :! para executar tmux send-keys para envie um Control-R para o outro painel. Como o send-keys pode enviar pressionamentos de teclas para qualquer painel (não apenas o ativo), você nem precisa alternar os painéis ativos para frente e para trás.

Aqui está um mapeamento do Vim (você pode colocá-lo no seu .vimrc ou apenas colá-lo no prompt : para experimentá-lo):

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

Isso mapeia a sequência de teclas \rl (os padrões <Leader> são definidos como \ , mas pode ser personalizado), para a seguinte sequência de comandos do Vim (separados por <Bar> ; consulte :help map_bar ):

  1. Escreva o buffer atual em seu arquivo.
  2. Execute o comando tmux para enviar o Control-R para o painel inferior.
    Usamos execute aqui para que o próximo comando Vim ( redraw ) não seja considerado parte do comando :! shell.
    Usamos o comando silent para evitar o aviso "Pressione ENTER para continuar".
    Você pode omitir slient se você quiser o prompt ou quiser ver a saída do comando :! (por exemplo, o comando tmux não está funcionando e você deseja ver se está dando erro mensagem).
  3. Redesenhar a tela.
    Isso normalmente ocorre após o prompt "Press ENTER", mas estamos suprimindo-o com silent .

Eu não tenho lynx em mãos, mas o Control-R parece ser a chave de recarga baseada em minha pesquisa por “reload lynx” (ie "Recarregar arquivos e atualizar a exibição" do guia do usuário.

Além de bottom , existem outras formas de especificar o painel de destino (procure por “target-pane” no página de manual do tmux ):

  • .+1 , .-1 : próximo painel anterior nesta janela
  • top , bottom , left , right e combinações de top / bottom com left / right
    (por exemplo, bottom-left )
  • %42 ( tmux > 1.5+): um número do painel pré-mes% % da variável de ambiente TMUX_PANE do painel de destino

    Este último formulário pode ser útil se o seu painel Lynx não estiver sempre na mesma janela tmux da sua instância do Vim. Antes de iniciar o Lynx, salve o valor de TMUX_PANE em um arquivo temporário e leia o arquivo para formar o argumento do painel de destino:

    # 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
    
por 05.12.2011 / 06:48
2

Você deve começar com o plugin tslime.vim, que interage com uma sessão tmux selecionada manualmente e envia um buffer para ela. Você estaria escrevendo um plugin quase idêntico; no entanto, em vez de enviar um buffer, você estaria emitindo comandos (consulte man 1 tmux).

tslime.vim @ vimscripts

    
por 05.12.2011 / 03:19