Mapeamento de comandos do Vim

2

Minha pergunta é sobre o mapeamento de um comando com várias partes para uma única combinação de teclas.

No meu .vimrc, eu tenho a seguinte linha:

nnoremap <leader>ss :w\|:silent !execute_external_script > output_of_script.txt\|:redraw!<cr>

Como você pode ver, eu tenho três comandos que quero executar quando pressiono <leader>ss . Primeiro, escreva o arquivo e execute meu script externo (o script executa um teste de unidade). Infelizmente, meu terminal não redesenharia o Vim depois de executar o comando shell. Então eu tentei anexar esse comando :redraw! , aparentemente esse comando está sendo passado para o shell, não para o Vim, porque estou recebendo este erro:

bash: :redrawecho: command not found .

Como eu escrevo o comando para que o script seja executado no shell e, em seguida, o redesenho é executado no Vim? (Além disso, como bônus, alguém poderia explicar o que o <cr> faz?)

    
por Nathan Wallace 06.06.2013 / 22:26

1 resposta

4

Sim, o comando :! considera o restante da linha de comando como argumentos. Para concatenar outros comandos do Vim, você pode envolver o comando com :execute :

nnoremap <leader>ss :w\|:silent execute '!execute_external_script > output_of_script.txt'\|:redraw!<cr>

Como alternativa, você pode apenas emitir várias linhas de comando, separadas por <CR> ; afinal, um mapeamento é apenas uma macro fixa:

nnoremap <leader>ss :w\|:silent !execute_external_script > output_of_script.txt<cr>:redraw!<cr>

Outra nota: em vez de escapar do separador de comando \| , a maneira usual é usar o código de tecla especial <Bar> ; veja a lista completa em :help keycodes ; Isso também explica que <CR> significa retorno de carro .

    
por 06.06.2013 / 22:56

Tags