Comment ouvrir plusieurs fichiers correspondant à une expression générique?

10

Je souhaite modifier plusieurs fichiers correspondant à une expression globale. Par exemple, pour éditer tous les fichiers de configuration git dans les répertoires enfants, je peux le faire dans le shell:

vim */.git/config

Sur la :ligne de commande Vim , je m'attendais :find */.git/configà faire quelque chose de similaire (c'est-à-dire ouvrir tous les fichiers correspondant à l'expression glob), mais à la place, il se plaint E77: Too many file names.

Existe-t-il une commande Vim ou une ligne pour ouvrir plusieurs fichiers correspondant à une expression générique / glob (qui n'implique pas d'écrire une fonction)?

Justin M. Keyes
la source

Réponses:

8

Vous pouvez utiliser :args {glob}. Dans votre glob, parcourra les **répertoires récursivement.

Cela remplira la liste des arguments, qui est la même liste qui est remplie lorsque vous démarrez Vim avec un ou plusieurs noms de fichiers comme arguments.

Une fois votre liste d'arguments remplie, vous pouvez la parcourir à l'aide de :nextet :previous. Vous pouvez également accéder au premier et au dernier élément avec les commandes :firstet :last.

tommcdo
la source
1
Nice :) :args */.git/configremplit également la liste des tampons, donc ça :bnextmarche aussi. Cela vous semble-t-il étrange? (Vim 7.4.52, et Neovim)
Justin M. Keyes
1
Rappel également aux autres, fait défiler]a la :argsliste si github.com/tpope/vim-unimpaired est installé.
Justin M. Keyes
:argadd file*Peut aussi faire.
kenorb
Pour utiliser des modèles glob ( **), vous devez avoir globstardéfini, voir: Faire correspondre tous les fichiers sous tous les répertoires imbriqués avec globbing shell .
kenorb
@ JustinM.Keyes La liste des tampons est un sur-ensemble de la liste des arguments, donc c'est prévu.
jamessan
3

Pour ouvrir les fichiers correspondants dans des onglets séparés…

:n */.git/config | tab all

Explication: :n ( :next) définit la liste des fichiers suivants sur toutes les correspondances. tab allouvre tous les fichiers de la liste des fichiers suivants dans de nouveaux onglets.

… ou …

for f in glob("*.py", 0, 1) | exe "tabe" f | endfor

Explication: dans glob(…), le 0 signifie d'inclure tous les fichiers correspondants, même s'ils seraient autrement ignorés en raison des paramètres suffixesou wildignorecase. Le 1 signifie retourner une liste, au lieu d'une chaîne. exe "tabe" fest une forme abrégée execute "tabedit" fet signifie ouvrir le fichier spécifié par la variable fdans un nouvel onglet.

Alex Quinn
la source
1
On dirait des :n */.git/config | bufferœuvres.
Mateen Ulhaq
2

Sur la ligne de commande Vim:, je m'attendais :find */.git/configà faire quelque chose de similaire (c'est-à-dire ouvrir tous les fichiers correspondant à l'expression glob), mais à la place, il se plaint E77: Too many file names.

N'attendez rien avant de lire la documentation.

En plus de la réponse de Tom, vous pouvez directement l'utiliser :nextcomme alternative à :args.

romainl
la source
0

L'ouverture de fichiers par vim */.git/configdevrait certainement fonctionner. Si ce n'est pas le cas, vous devriez mettre à niveau votre Vim vers 7.4 (la version précédente était plus boguée).

Vous pouvez également essayer l'une des options suivantes (dans l'éditeur):

:n `find .git/ -name config`
:args `find . -name config`
Kenorb
la source
Vous n'avez pas lu attentivement ma question. Et, la réponse acceptée mentionne déjà :args.
Justin M. Keyes
@ JustinM.Keyes Merci pour vos points. Le caractère générique devrait fonctionner par défaut et c'est la seule réponse qui dit qu'il devrait fonctionner en 7.4 (car j'avais exactement la même erreur avant la mise à niveau). L'utilisation argsn'est qu'une solution de contournement, mais en plus, elle vous montre comment utiliser l'expansion du shell dans vim it-self au cas où d'autres utilisateurs voudraient l'utiliser pour des solutions plus complexes, en utilisant find, comme celle-ci . Je pense donc que cela donne une valeur supplémentaire à votre question. J'espère donc que ça vous va.
kenorb
Je n'ai jamais eu de problème avec vim */foo, et il n'y a aucun moyen qui pourrait être lié à la version Vim, car c'est une fonction shell .
Justin M. Keyes
0

Évident, mais non répertorié ci-dessus - par exemple, recherchez tous les fichiers sql ayant la chaîne create_table dans leur nom

:args **/*create_table*sql

et vérifiez-les

:ls

et ouvrez le premier

:b 1
Yordan Georgiev
la source