Como pré-processar os argumentos da linha de comando fornecidos ao vim?

Aug 27 2020

Eu quero adicionar suporte para vários formatos de nome de arquivo com linho para o vim entender. Por exemplo, recebo resultados git grep <keyword>assim:

first/foo.py:123:
first/bar.py:333:
second/foo.py:777:

Para abrir esses arquivos e pular para uma linha específica, tenho que alterar o formato para, por exemplo:

first/foo.py +123
first/bar.py +333
second/foo.py +777

Gostaria de saber se existe uma maneira de fazer essa conversão automaticamente para que na linha de comando esta instrução:

vim first/foo.py:123:

teria o mesmo resultado que este comando:

vim first/foo.py +123

Também seria ótimo se o vim pudesse entender o formato da linha de rastreamento do Python, por exemplo:

File "/third/foo.py", line 55,   

Respostas

2 filbranden Aug 28 2020 at 06:28

Gostaria de saber se existe uma maneira de fazer automaticamente esta conversão de modo que na linha de comando a seguinte declaração: vim first/foo.py:123:teria o mesmo resultado como este comando: vim first/foo.py +123.

Existe um plug-in do Vim que implementa precisamente isso: lervag / file-line .

Ele reconhece separadores comuns, como dois pontos ou também parênteses ( first/foo.py(123)), e pode levar um segundo número opcional para indicar para qual coluna alternar.

Ele funciona tanto na linha de comando ( vim first/foo.py:123:) quanto no :editcomando dentro do Vim ( :e first/foo.py:123:).

Como pré-processar os argumentos da linha de comando fornecidos ao vim?

Você pode observar a implementação desse plug-in para ver como ele funciona ... É um pouco complicado, mas tem menos de 100 linhas de Vimscript.


Dito isso, usar o recurso de correção rápida do Vim é provavelmente a maneira mais apropriada de lidar com isso. Você pode definir 'errorformat'apropriadamente para lidar com outros formatos de arquivo: linha (como aquele das exceções do Python). E você pode usar a -qopção de linha de comando para iniciar o Vim com uma lista de referências a linhas para preencher a lista de correção rápida conforme você abre o Vim.

4 AriSweedler Aug 28 2020 at 03:49

Isso não responde à sua pergunta, mas responde ao seu caso de uso.

Se você fizer :let &grepprg = "git grep --line-number"isso, a execução :grep <keyword>dentro do vim irá preencher sua lista de correções rápidas. Com o qual você pode navegar :cnexte assim por diante .


Então, como isso funciona em alto nível? O comando vim :grepchama um comando especificado pela opção vim grepprge tenta analisar a saída com a opção vim errorformat(efetivamente uma lista de scanf"matchers" de estilo). As linhas que podem ser combinadas com um "matcher" de formato de erro são analisadas de acordo com o matcher e usadas para preencher a lista de correções rápidas. As linhas de saída de uma chamada de grepprg que não podem ser correspondidas são ignoradas.

Sabendo disso, você pode escrever uma correspondência de formato de erro para qualquer coisa que desejar, incluindo File "/third/foo.py", line 55,:

:let &errorformat += 'File "%f", line %l,'

Para um entendimento completo / baixo nível, confira:

  • :help 'grepprg' e
  • :help quickfix e
  • :help 'errorformat'