Jak mogę otworzyć wiele kart jednocześnie?

14

Jeśli użyję:

:tabedit file1 file2

Dostaję:

E172: Only one file name allowed

Czy jest jakiś sposób na użycie :tabeditwielu nazw plików? Lub inny sposób otwierania wielu kart jednocześnie?

Martin Tournoij
źródło
@kenorb Tak. I ma już dokładnie tę samą odpowiedź, z wyjątkiem braku wyjaśnienia, co robi. Więc w jaki sposób link do niego wnosi jakąkolwiek wartość?
Martin Tournoij
Istnieje kilka innych odpowiedzi i mogą tam pojawić się nowe odpowiedzi. Po drugie, istnieje kilka innych podobnych powiązanych / powiązanych, więc użytkownicy mogą dowiedzieć się więcej z pokrewnych treści.
kenorb
Nauczyłem się tego jednego-liner: :args *.c | tab all. Drugie pytanie jest bardziej popularne, więc dobrze jest je również połączyć.
kenorb
Powiązane: Otwórz kilka plików w nowych kartach za pomocą VIM w Stack Overflow.
Mihai Capotă

Odpowiedzi:

10

Biorąc pod uwagę problemy i złożoność mojej drugiej odpowiedzi przy użyciu „wbudowanego” sposobu modyfikowania listy argumentów, dodałem własną funkcję, aby to zrobić:

" Open multiple tabs at once
fun! OpenMultipleTabs(pattern_list)
    for p in a:pattern_list
        for c in glob(l:p, 0, 1)
            execute 'tabedit ' . l:c
        endfor
    endfor
endfun

command! -bar -bang -nargs=+ -complete=file Tabedit call OpenMultipleTabs([<f-args>])

Możesz teraz użyć :Tabedit *.vim. Ta funkcja rozszerzy wszystkie wzorce globowania i wykona :tabedit <f>dla każdego pliku. Możesz dodać dowolną liczbę ścieżek, na przykład to wszystko działa:

:Tabedit file.rb
:Tabedit *.c
:Tabedit file1.py file2.py _*.py
:Tabedit /etc/hosts file{1,2}.sh

Cóż, i tak dalej ...

Ja to w małym globedit.vim wtyczce, która zawiera również polecenie :Edit, :Splititd

Martin Tournoij
źródło
2
Świetna funkcja i dowodzenie! Kilka ulepszeń: (1) Użyj [<f-args>]zamiast "<args>"- w ten sposób patternparametrem będzie List (tablica) i nie będziesz musiał radzić sobie z ręcznym dzieleniem łańcucha. (2) Podaj niezerową wartość jako trzeci argument, aby glob()zwrócić listę. Wtedy możesz również uniknąć ręcznego podziału. Musisz zdać 0jako drugi argument, aby pominąć to bez wpływu na zachowanie: glob(l:p, 0, 1).
tommcdo
7

O ile mi wiadomo, jedynym wbudowanym sposobem na to jest:

:args *.vim
:tab all

Najpierw :argszastąpi listę argumentów. Lista argumentów zawiera listę plików, w których otworzyłeś Vima; tak vim file1 file2oznacza, że lista argument zawiera file1i file2.
Możemy to zmodyfikować w czasie wykonywania, a Vim otworzy bufor dla każdego nowego wpisu na liście argumentów.
Zobacz :help argument-listpo więcej informacji.

:allPolecenie otwiera okno dla każdego wpisu na liście argumentu :tabpolecenie wykonuje polecenie i otwiera nową kartę, gdy polecenie danego otworzy się nowe okno.

Ostrzeżenia

Istnieje kilka zastrzeżeń dotyczących tej metody.

Przede wszystkim nie ma sprawdzania duplikatów, więc możesz uzyskać 2 lub więcej zakładek dla tego samego bufora.

Ale największym problemem jest to, że zastępuje wszystkie twoje zakładki tym, co znajduje się na liście argumentów; więc straciłeś wszystkie istniejące karty.
Można obejść ten nieznacznie używając :argadd *.vimaby dodać do listy argumentów, a nie zastąpienie go; ale poleceń takich jak :editlub :tabeditczy nie zmienia listę argumentów, a stracisz te zaczepy chyba dodać je do listy argumentów (wciąż masz je na liście bufora, chociaż). Możesz także nie chcieć otwierać wszystkiego na liście argumentów na karcie, być może po prostu chcesz otworzyć 2 pliki jako dodatkową kartę.

Być może mógłbyś to nieco poprawić, dodając najpierw wszystkie aktualnie otwarte karty do listy argumentów (czego tak naprawdę nie mogę zabrać do pracy), ale nadal nie jest to idealne. Jeśli karta ma 2 lub więcej okien, nadal je zmodyfikuje ...

Martin Tournoij
źródło
Mogę się mylić, ale czy to nie otwiera dodatkowej karty (jak widać w moim pytaniu dotyczącym domyślnego otwierania kart)?
muru
1
Jeśli odwołujesz się do mojej odpowiedzi na to pytanie, z tą różnicą, że użyłem tego :argdo tabedit %, co otwiera nową kartę dla każdego argumentu. Zaczynając od jednej karty i otwierając n nowych, naturalnie pozostawisz z n + 1 kartami. :tab alljest znacznie lepszym rozwiązaniem.
tommcdo
@tommcdo Mówiłem o odpowiedzi Josha Petrie . Nie spotkałbyś jednego z jego pseudonimów, prawda? :)
muru
Haha, nie. Musiałem myśleć o innym pytaniu!
tommcdo
2

Zamiast tego możesz użyć :nextpolecenia, na przykład:

:n file1 file2

lub:

:n *.txt
kenorb
źródło
Wydaje się to tak samo jak przy użyciu :args *.vim? Przynajmniej zachowuje się tak samo i :help next_fdokumentuje to jako to samo ...
Martin Tournoij
Jest krótszy i prosty i nie wspomniałeś o tym. Zachowanie jest takie samo, jak zadałeś to pytanie.
kenorb
2

Z wiersza poleceń możesz użyć:

vim file1 ... filen -p

A jeśli zapomniałeś użyć -pnadal możesz użyć

:tab ball

Przy okazji nie zapominaj, że zmienna tabpagemax(wartość domyślna 10) ogranicza liczbę kart, które możesz otworzyć w ten sposób.

dsueiro
źródło
0

W rzeczywistości możesz otwierać nowe karty i przechowywać bieżące karty bez pisania nowych funkcji (zobacz tę odpowiedź na temat przepełnienia stosu ):

:args file1 file2 | argdo tabe

:tabePrzed otwarciem możesz chcieć otworzyć nową pustą kartę ( ), ponieważ pierwszy plik otworzy się na bieżącej karcie. Dodatkowa pusta karta pozostanie otwarta (zobacz, :help argdoaby zrozumieć, dlaczego).

Mihai Capotă
źródło
Musisz także naprawić podświetlanie składni (z jakiegoś powodu), jak wyjaśniono w linku i zamknąć ostatnią kartę, aby polecenie „pełne” brzmiało: :tabnew | args file1 file2 | argdo tabe | tabdo syntax on Musisz nacisnąć Enter, aby wyczyścić monit i wpisać, :closeaby usunąć ostatnie ( pusta) karta ... to strasznie dużo pisania i warto, jeśli otwierasz dużo kart (dla 2 lub 3 plików, użycie tylko :tabedwa razy byłoby szybsze).
Martin Tournoij