Expansão percentual do modo de comando Vim

2

Meu fluxo de trabalho típico no dia-a-dia no Vim envolve ter dois painéis verticais; código de produção à esquerda e os testes à direita.

Freqüentemente alterno idiomas (e estruturas de teste), portanto, gosto de criar um novo mapeamento para executar meu código de teste em cada sessão. Digamos que eu esteja fazendo um projeto Ruby e estou expulsando uma turma em lib/importer.rb . As especificações que acompanham vivem em spec/lib/importer_spec.rb .

Para criar meu mapeamento para executar as especificações, eu me concentro no painel que mostra as especificações e insiro o seguinte:

:nnoremap -g :!rspec %<cr>

Observação: eu uso o hífen / subtração como minha chave de líder.

Isso funciona, mas somente se o painel de especificações estiver em foco quando eu clicar em - g . Se o painel de produção tiver foco e eu atingir o mapeamento, o rspec tentará executar o código de produção, o que não faz sentido.

Para contornar isso, posso escrever o caminho absoluto para o arquivo de especificação:

:nnoremap -g :!rspec spec/lib/importer_spec.rb<cr>

Isso funciona, embora seja um pouco trabalhoso escrever.

Enquanto lia Vim Prático ontem à noite, percebi que no modo de comando você pode usar % expansion - você escreve % e depois clica em tab , e a porcentagem é substituída pelo caminho absoluto para o arquivo no painel atualmente em foco.

Se eu fizer isso:

:!rspec %

… E depois clico em tab , eu obtenho isto:

:!rspec spec/lib/importer_spec.rb

E isso é ótimo! No entanto, se eu fizer isso:

:nnoremap -g :!rspec %

… E depois clico em tab , eu obtenho isto:

:nnoremap -g :!rspec %^I

Eu sou uma boa pessoa e pago meus impostos. Por que isso está acontecendo comigo?

    
por Jezen Thomas 06.06.2014 / 11:54

1 resposta

5

A conclusão do comando por padrão não é reconhecida nos mapeamentos (e gravada em macros). Você pode definir uma chave alternativa na opção 'wildcharm' obscura e usá-la. No entanto, a inserção do nome do arquivo atual pode ser feita de maneira mais fácil e direta. Em vez de preencher % , basta inserir uma expressão Vimscript equivalente via <C-r> :

:nnoremap -g :!rspec <C-r>=expand('%')<cr><cr>

PS: Para lidar adequadamente com todos tipos de nomes de arquivos, use adicionalmente shellescape() :

:nnoremap -g :!rspec <C-r>=shellescape(expand('%'), 1)<cr><cr>

PPS: Espero que você não esteja digitando manualmente no mapeamento todas as vezes, mas use um plug-in de tipo de arquivo ou :autocmd para definir isso automaticamente para os buffers de teste. Eu recomendaria definitivamente automatizá-lo dessa maneira.

    
por 06.06.2014 / 12:06