Comment pré-traiter les arguments de ligne de commande fournis à vim?

Aug 27 2020

Je veux ajouter la prise en charge de divers formats de nom de fichier avec numéro de lin pour que vim comprenne. Par exemple, je reçois une sortie git grep <keyword>comme ceci:

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

Pour ouvrir ces fichiers et passer à une ligne spécifique, je dois changer le format par exemple:

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

Je me demande s'il existe un moyen de faire automatiquement cette conversion afin qu'en ligne de commande cette instruction:

vim first/foo.py:123:

aurait le même résultat que cette commande:

vim first/foo.py +123

Ce serait également formidable si vim pouvait comprendre le format de ligne de trace Python, par exemple:

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

Réponses

2 filbranden Aug 28 2020 at 06:28

Je me demande s'il y a un moyen de faire automatiquement cette conversion afin que la ligne de commande cette déclaration: vim first/foo.py:123:aurait le même résultat que cette commande: vim first/foo.py +123.

Il existe un plug-in Vim qui implémente précisément cela: lervag / file-line .

Il reconnaît les séparateurs communs tels que les deux points ou également parens ( first/foo.py(123)), et il peut prendre un deuxième nombre facultatif pour indiquer la colonne vers laquelle basculer.

Cela fonctionne à la fois sur la ligne de commande ( vim first/foo.py:123:) ou sur la :editcommande dans Vim ( :e first/foo.py:123:).

Comment pré-traiter les arguments de ligne de commande fournis à vim?

Vous pouvez regarder l'implémentation de ce plug-in pour voir comment il le fait ... C'est un peu compliqué, mais c'est moins de 100 lignes de Vimscript.


Cela dit, l'utilisation de la fonction de correction rapide de Vim est probablement le moyen le plus approprié de gérer cela. Vous pouvez définir de 'errorformat'manière appropriée pour gérer d'autres fichiers: formats de ligne (tels que celui des exceptions Python.) Et vous pouvez utiliser l' -qoption de ligne de commande pour démarrer Vim avec une liste de références aux lignes pour remplir la liste de correctifs rapides lorsque vous ouvrez Vim.

4 AriSweedler Aug 28 2020 at 03:49

Cela ne répond pas à votre question, mais cela répond à votre cas d'utilisation.

Si vous le faites, l' :let &grepprg = "git grep --line-number"exécution :grep <keyword>à l' intérieur de vim remplira votre liste de correctifs rapides. Avec lequel vous pouvez naviguer :cnextet autres.


Alors, comment cela fonctionne-t-il à un niveau élevé? La commande vim :grepappelle une commande spécifiée par l'option vim grepprget essaie d'analyser la sortie avec l'option vim errorformat(en fait une liste de scanf"matchers" de style -style). Les lignes qui peuvent être mises en correspondance avec un "matcher" de format d'erreur sont analysées en fonction du matcher et utilisées pour remplir la liste de correctifs rapides. Les lignes de sortie d'une invocation de grepprg qui ne peuvent pas être mises en correspondance sont ignorées.

Sachant cela, vous pouvez écrire un correcteur de format d'erreur pour tout ce que vous voulez, y compris File "/third/foo.py", line 55,:

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

Pour une compréhension complète / bas niveau, consultez:

  • :help 'grepprg' et
  • :help quickfix et
  • :help 'errorformat'