Wie öffne ich mehrere Dateien, die einem Platzhalterausdruck entsprechen?


10

Ich möchte mehrere Dateien bearbeiten, die einem Glob-Ausdruck entsprechen. Um beispielsweise alle Git-Konfigurationsdateien in untergeordneten Verzeichnissen zu bearbeiten, kann ich dies in der Shell tun:

vim */.git/config

In der Vim- :Befehlszeile hatte ich erwartet :find */.git/config, etwas Ähnliches zu tun (dh alle Dateien zu öffnen, die dem Glob-Ausdruck entsprechen), aber stattdessen beschwert es sich E77: Too many file names.

Gibt es einen Vim-Befehl oder einen Einzeiler, um mehrere Dateien zu öffnen, die einem Platzhalter- / Glob-Ausdruck entsprechen (ohne dass eine Funktion geschrieben werden muss)?

Antworten:


8

Sie können verwenden :args {glob}. Durchläuft in Ihrem Glob **Verzeichnisse rekursiv.

Dadurch wird die Argumentliste gefüllt. Dies ist dieselbe Liste, die beim Starten von Vim mit einem oder mehreren Dateinamen als Argumente gefüllt wird.

Sobald Ihre Argumentliste ausgefüllt ist, können Sie mit :nextund durch die Liste navigieren :previous. Sie können auch mit den Befehlen :firstund zum ersten und letzten Element springen :last.


1
Nizza :) füllt :args */.git/configtatsächlich auch die Pufferliste, :bnextfunktioniert also auch. Scheint das seltsam? (Vim 7.4.52 und Neovim)
Justin M. Keyes

1
Auch eine Erinnerung an andere, ]azykliert die :argsListe, wenn github.com/tpope/vim-unimpaired installiert ist.
Justin M. Keyes

Auch :argadd file*kann tun.
Kenorb

Um glob pattern ( **) verwenden zu können, müssen Sie Folgendes festgelegt haben globstar: Siehe Alle Dateien unter allen verschachtelten Verzeichnissen mit Shell-Globbing abgleichen .
Kenorb

@ JustinM.Keyes Die Pufferliste ist eine Obermenge der Args-Liste, das wird also erwartet.
Jamessan

3

So öffnen Sie übereinstimmende Dateien in separaten Registerkarten…

:n */.git/config | tab all

Erläuterung: :n ( :next) setzt die Liste der nächsten Dateien auf alle Übereinstimmungen. tab allöffnet alle Dateien in der Liste der nächsten Dateien in neuen Registerkarten.

… oder …

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

Erläuterung: In glob(…)bedeutet 0, dass alle übereinstimmenden Dateien eingeschlossen werden, auch wenn sie ansonsten aufgrund der Einstellungen suffixesoder ignoriert würden wildignorecase. Die 1 bedeutet, anstelle einer Zeichenfolge eine Liste zurückzugeben. exe "tabe" fist eine Kurzform von execute "tabedit" fund bedeutet, die von der Variablen angegebene Datei fin einer neuen Registerkarte zu öffnen .


1
Sieht aus wie :n */.git/config | bufferfunktioniert.
Mateen Ulhaq

2

In der Vim: -Befehlszeile hatte ich erwartet :find */.git/config, etwas Ähnliches zu tun (dh alle Dateien zu öffnen, die dem Glob-Ausdruck entsprechen), aber stattdessen beschwert es sich E77: Too many file names.

Erwarten Sie nichts, bevor Sie die Dokumentation gelesen haben.

Zusätzlich zu Toms Antwort können Sie direkt :nextals Alternative zu verwenden :args.


0

Das Öffnen von Dateien sollte auf vim */.git/configjeden Fall funktionieren. Wenn dies nicht der Fall ist, sollten Sie Ihr Vim auf 7.4 aktualisieren (die vorherige Version war fehlerhafter).

Versuchen Sie alternativ eine der folgenden Möglichkeiten (im Editor):

:n `find .git/ -name config`
:args `find . -name config`

Sie haben meine Frage nicht sorgfältig gelesen. Und die akzeptierte Antwort erwähnt bereits :args.
Justin M. Keyes

@ JustinM.Keyes Danke für deine Punkte. Wildcard sollte standardmäßig funktionieren und dies ist die einzige Antwort, die besagt, dass es in 7.4 funktionieren sollte (da ich vor dem Upgrade genau den gleichen Fehler hatte). Die Verwendung argsist nur die Problemumgehung, zeigt Ihnen jedoch, wie Sie die Shell-Erweiterung in vim it-self verwenden können, falls weitere Benutzer sie für komplexere Lösungen verwenden möchten find, indem Sie diese verwenden . Ich denke, es gibt Ihrer Frage einen zusätzlichen Wert. Also ich hoffe es geht dir gut.
Kenorb

Ich hatte nie ein Problem mit vim */foound es gibt keine Möglichkeit, die mit der Vim-Version in Verbindung gebracht werden könnte, da dies eine Shell- Funktion ist.
Justin M. Keyes

0

Offensichtlich, aber oben nicht aufgeführt - Beispiel finden Sie alle SQL-Dateien, deren Name die Zeichenfolge create_table enthält

:args **/*create_table*sql

und überprüfe sie

:ls

und öffne den ersten

:b 1
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.