Jak otworzyć wiele plików pasujących do wyrażenia wieloznacznego?


10

Chcę edytować kilka plików pasujących do wyrażenia glob. Na przykład, aby edytować wszystkie pliki konfiguracyjne git w katalogach potomnych, mogę to zrobić w powłoce:

vim */.git/config

W :wierszu poleceń Vima spodziewałem :find */.git/configsię zrobić coś podobnego (tj. Otworzyć wszystkie pliki pasujące do wyrażenia glob), ale zamiast tego narzeka E77: Too many file names.

Czy istnieje polecenie Vima lub jeden wiersz do otwierania wielu plików pasujących do wyrażenia wieloznacznego / globalnego (które nie wymagają pisania funkcji)?

Odpowiedzi:


8

Możesz użyć :args {glob}. W twoim globu **będzie rekurencyjnie przeglądać katalogi.

Spowoduje to zapełnienie listy argumentów, która jest tą samą listą, która jest zapełniana po uruchomieniu Vima z jedną lub kilkoma nazwami plików jako argumentami.

Po wypełnieniu listy argumentów możesz nawigować po niej za pomocą :nexti :previous. Możesz także przejść do pierwszego i ostatniego elementu za pomocą poleceń :firsti :last.


1
Fajnie :) :args */.git/configfaktycznie zapełnia również listę buforów, więc :bnextteż działa. Czy to wydaje się dziwne? (Vim 7.4.52 i Neovim)
Justin M. Keyes

1
Również przypomnienie dla innych, ]acyklicznie wyświetla :argslistę, jeśli github.com/tpope/vim-unimpaired jest zainstalowany.
Justin M. Keyes,

:argadd file*Mogę też zrobić.
kenorb

Aby użyć glob wzorców ( **), musisz mieć globstarustawiony, zobacz: Dopasuj wszystkie pliki we wszystkich zagnieżdżonych katalogach z globowaniem powłoki .
kenorb

@ JustinM.Keyes Lista buforów jest nadzbiorem listy argumentów, więc jest to oczekiwane.
jamessan

3

Aby otworzyć pasujące pliki na osobnych kartach…

:n */.git/config | tab all

Objaśnienie: :n ( :next) ustawia listę następnego pliku na wszystkie dopasowania. tab allotwiera wszystkie pliki na liście następnych plików w nowych kartach.

… Lub…

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

Objaśnienie: W glob(…)polu 0 oznacza uwzględnienie wszystkich pasujących plików, nawet jeśli w przeciwnym razie zostałyby zignorowane ze względu na ustawienia suffixeslub wildignorecase. 1 oznacza zwrócenie listy zamiast ciągu. exe "tabe" fjest krótką formą execute "tabedit" fi środkiem do otwarcia pliku określonego przez zmienną fw nowej karcie.


1
Wygląda jak :n */.git/config | bufferprace.
Mateen Ulhaq

2

W wierszu poleceń Vim: spodziewałem :find */.git/configsię zrobić coś podobnego (tj. Otworzyć wszystkie pliki pasujące do wyrażenia glob), ale zamiast tego narzeka E77: Too many file names.

Nie oczekuj niczego przed przeczytaniem dokumentacji.

Oprócz odpowiedzi Toma możesz bezpośrednio użyć :nextjako alternatywy dla :args.


0

Otwieranie plików vim */.git/configzdecydowanie powinno działać. Jeśli tak się nie stanie, powinieneś zaktualizować Vima do wersji 7.4 (poprzednia wersja była bardziej wadliwa).

Możesz też wypróbować jedną z następujących opcji (w edytorze):

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

Nie przeczytałeś dokładnie mojego pytania. I zaakceptowana odpowiedź już wspomina :args.
Justin M. Keyes,

@ JustinM.Keyes Dzięki za twoje punkty. Symbol wieloznaczny powinien działać domyślnie i jest to jedyna odpowiedź, która mówi, że powinien on działać w wersji 7.4 (ponieważ miałem dokładnie ten sam błąd przed aktualizacją). Użycie argsjest tylko obejściem, ale ponadto pokazuje, jak używać rozszerzenia powłoki w vimie, na wypadek, gdyby inni użytkownicy chcieli go użyć do bardziej złożonych rozwiązań find, takich jak to . Myślę więc, że daje to dodatkową wartość twojemu pytaniu. Mam nadzieję, że u ciebie wszystko w porządku.
kenorb

Nigdy nie miałem z tym problemu vim */fooi nie ma sposobu, aby można go było powiązać z wersją Vima, ponieważ jest to funkcja powłoki .
Justin M. Keyes,

0

Oczywiste, ale niewymienione powyżej - na przykład znajdź wszystkie pliki SQL mające w swoim łańcuchu ciąg create_table

:args **/*create_table*sql

i sprawdź je

:ls

i otwórz pierwszy

:b 1
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.