polecenie vim, które wykona: buff lub: e, jeśli plik nie znajduje się jeszcze w buforze?

3

w zasadzie mój przepływ pracy jest następujący: mam kilka okien otwartych przy użyciu podziałów w terminalu w zwykłym vimie. Czasami mam plik otwarty, czasami nie przełączam się między :bufi, :tagaby uzyskać plik. Idealnie chciałbym coś, co by działało, :bufale jeśli plik nie znajduje się obecnie w buforze, to wykonałby a :e.

Dlatego w celu uproszczenia:

Wpisuję :bufi wpisuję część nazwy pliku i uderzam <tab>to daje mi dopasowanie do plików i dopasowuje tyle plików, ile to możliwe, jeśli żądanego pliku nie ma już w buforze, chciałbym nadal móc wpisać ten plik nazwij i załaduj plik. Zwykle teraz muszę wrócić i zmienić polecenie z a :buf [file]na a :e [file].

Czy istnieje sposób na utworzenie polecenia, które działałoby jak :bufale otwiera plik, jeśli jeszcze nie istnieje? Powodem, :bufdla którego zacznę od tego jest to, że ogranicza zakres do plików w niektórych katalogach i dopasuje je po naciśnięciu klawisza. Mam nadzieję, że wyjaśniłem to poprawnie :).

Przykład:

:buf FooX[tab]

pokazuje 4 pliki i ma

:buf [very long path]/FooX

Teraz, jeśli plik Dokładny z przedrostkiem FooX nie jest wyświetlany, nadal chcę móc pisać FooXFileNotShown.cppi ładować go tak, jak :epowinien.

Z góry dziękuje za twoją pomoc.

bjackfly
źródło

Odpowiedzi:

1

:b[uffer]służy tylko do uzyskiwania dostępu do otwartych buforów. „Zakres” jego ukończenia nie jest ograniczony do „niektórych katalogów”, ale do buforów na liście buforów / liście argumentów. Nie możesz użyć tego polecenia, aby otworzyć plik, który nie został jeszcze otwarty.

:e[dit]służy do edycji pliku, a jego zakończenie jest „ograniczone” do plików i katalogów bezpośrednio w katalogu roboczym Vima. Możesz ograniczyć listę ukończeń za pomocą wildignoreopcji ( :help 'wildignore') lub za pomocą niesamowitej **symboli wieloznacznych ( :help starstar).

Kiedy :eedytujesz plik, który już znajduje się na liście buforów / liście argumentów, Vim nie tworzy nowego bufora, po prostu przełącza się do istniejącego bufora, działając podobnie :b.

Więc… Wygląda na to, że jesteś trochę zdezorientowany zachowaniem :bi którego po prostu szukasz :e file<Tab>.

romainl
źródło
Nie mylisz się co do 2 poleceń ... jeśli masz plik <długa ścieżka> /fileA.cpp, możesz wpisać: buf plikA <tab>, a to rozwiąże cały plik ze ścieżką. Nie dzieje się tak z: e, co było sednem pytania.
bjackfly
OK, w ogóle nie otrzymałem tego z twojego pytania z powodu twojego nadużywania słowa „plik”. Otrzymujesz :b fileA<Tab>nazwę bufora przechowywaną przez Vima na stosunkowo krótkiej liście, ale ta lista nie istnieje dla nieotwartych plików, tylko dla otwartych buforów. Aby tego rodzaju uzupełnienie było możliwe w przypadku rzeczywistych nazw plików, system plików musi zostać przeskanowany, wynik tego skanowania musi być buforowany i tak dalej. :finddziała mniej więcej tak, ale może być bardzo powolny w przypadku dużych struktur katalogów. Proponuję rzucić okiem na CtrlP i podobne wtyczki.
romainl
ok dziękuję ma sens Myślę, że w przypadku
nieotwartych
1

Chcesz więc komendy z zakończeniem istniejących buforów, która następnie albo otworzy bufor (jeśli istnieje), albo edytuje przekazany plik zamiast dawać E94: No matching bufferbłąd.

Co powiesz na to:

:command! -nargs=1 -complete=buffer Buf try | execute 'buffer' <q-args> | catch /^Vim\%((\a\+)\)\=:E94/ | execute 'edit' <q-args> | endtry

Polecenia niestandardowe muszą zaczynać się wielką literą, ale używasz cmdalias.vim - Utwórz aliasy dla wtyczki poleceń Vima, aby przeciążyć istniejące :bufpolecenie.

Ingo Karkat
źródło