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)?

Justin M. Keyes
źródło

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.

tommcdo
źródło
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.

Alex Quinn
źródło
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.

romainl
źródło
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`
kenorb
źródło
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
Yordan Georgiev
źródło