Come posso aprire più schede contemporaneamente?


14

Se uso:

:tabedit file1 file2

Ottengo:

E172: Only one file name allowed

Esiste un modo per utilizzare :tabeditcon più nomi di file? O un altro modo per aprire più schede contemporaneamente?



@kenorb Sì. E ha esattamente la stessa risposta già qui, tranne che senza spiegazioni su ciò che fa. In che modo il collegamento ad esso aggiunge valore?
Martin Tournoij,

Ci sono alcune altre risposte e nuove risposte possono arrivare lì. In secondo luogo, ci sono pochi altri simili collegati / correlati lì, quindi gli utenti possono imparare di più anche da quelli correlati.
Kenorb,

Ho imparato questo one-liner: :args *.c | tab all. L'altra domanda è più popolare di così, quindi è bene anche collegarla.
Kenorb,

Risposte:


10

Dati i problemi e la complessità nella mia altra risposta usando il modo "incorporato" modificando la lista degli argomenti, ho aggiunto una piccola funzione per fare questo:

" 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>])

Ora puoi usare :Tabedit *.vim. Questa funzione espande tutti i modelli di globbing ed esegue :tabedit <f>per ogni file. Puoi aggiungere tutti i percorsi desiderati, ad esempio tutto funziona:

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

Bene, e così via ...

Ho messo questo in un piccolo globedit.vim plug-in, che contiene anche il comando per :Edit, :Splitecc


2
Grande funzione e comando! Alcuni miglioramenti: (1) Usa [<f-args>]invece di "<args>"- in questo modo, il patternparametro sarà un Elenco (array) e non dovrai occuparti di dividere manualmente la stringa. (2) Passa un valore diverso da zero come terzo argomento per glob()farlo restituire un elenco. Quindi puoi evitare di suddividere manualmente anche lì. Avrete bisogno di passare 0come il secondo argomento di saltarlo senza influenzare il comportamento: glob(l:p, 0, 1).
Tommaso,

7

Per quanto ne so, l'unico modo integrato per farlo è:

:args *.vim
:tab all

Innanzitutto, :argssostituirà l'elenco degli argomenti. L'elenco degli argomenti elenca i file con cui hai aperto Vim; quindi vim file1 file2significa che l'elenco degli argomenti contiene file1e file2.
Possiamo modificarlo in fase di esecuzione e Vim aprirà un buffer per ogni nuova voce nell'elenco degli argomenti.
Vedi :help argument-listper maggiori informazioni.

Il :allcomando apre una finestra per ogni voce nell'elenco degli argomenti, il :tabcomando esegue un comando e apre una nuova scheda quando il comando fornito aprirà una nuova finestra.

Avvertenze

Ci sono alcuni avvertimenti su questo metodo.

Prima di tutto, non c'è controllo per i duplicati, quindi puoi finire con 2 o più schede per lo stesso buffer.

Ma il problema più grande è che sostituisce tutte le schede con ciò che è nella lista degli argomenti; quindi hai perso tutte le schede esistenti.
Puoi aggirare leggermente questo problema usando :argadd *.vimper aggiungere all'elenco degli argomenti, invece di sostituirlo; ma comandi come :edito :tabeditnon non alterare la lista degli argomenti, e si perde quelle schede meno che non li aggiunge alla lista di argomenti (li avete ancora nella lista dei buffer, però). Potresti anche non voler aprire tutto nel tuo elenco di argomenti in una scheda, forse vuoi solo aprire 2 file come una scheda aggiuntiva.

Potresti forse renderlo leggermente migliore aggiungendo prima di tutto aggiungendo tutte le schede attualmente aperte all'elenco degli argomenti (che non riesco davvero a lavorare), ma questo è ancora tutt'altro che perfetto. Se una scheda ha 2 o più finestre, le modificherà comunque ...


Potrei sbagliarmi, ma questo non apre una scheda aggiuntiva (come visto nella mia domanda sull'apertura delle schede per impostazione predefinita)?
muru,

1
Se ti riferisci alla mia risposta su quella domanda, la differenza è che ho usato :argdo tabedit %, che apre una nuova scheda per ogni argomento. Iniziare con una scheda e aprirne n nuove ti lascerebbe naturalmente con n + 1 schede. :tab allè una soluzione molto migliore.
Tommaso,

@tommcdo Stavo parlando della risposta di Josh Petrie . Non ti capiterebbe uno dei suoi alias, vero? :)
muru,

Ahah, no. Devo aver pensato a una domanda diversa!
Tommaso,

2

È possibile utilizzare :nextinvece il comando, ad esempio:

:n file1 file2

o:

:n *.txt

Questo sembra uguale all'utilizzo :args *.vim? Almeno, si comporta allo stesso modo e lo :help next_fdocumenta come lo stesso ...
Martin Tournoij,

È più breve e semplice e non lo hai menzionato. Il comportamento è lo stesso, come hai chiesto nella domanda per quello.
Kenorb,

2

Dalla riga di comando puoi usare:

vim file1 ... filen -p

E se hai dimenticato di usare -pancora puoi usare

:tab ball

A proposito, non dimenticare che la variabile tabpagemax(valore predefinito 10) limita il numero di schede che puoi aprire in questo modo.


0

Puoi effettivamente aprire nuove schede e mantenere le tue schede correnti senza scrivere nuove funzioni (vedi questa risposta su Stack Overflow ):

:args file1 file2 | argdo tabe

Potresti voler aprire una nuova scheda vuota ( :tabe) prima di farlo, perché il primo file si aprirà nella scheda corrente. Inoltre, una scheda vuota aggiuntiva verrà lasciata aperta (vedi :help argdoper capire perché).


È inoltre necessario correggere l'evidenziazione della sintassi (per qualche motivo), come spiegato nel collegamento e chiudere l'ultima scheda, quindi il comando "completo" sarebbe: :tabnew | args file1 file2 | argdo tabe | tabdo syntax onIl necessario premere Invio per cancellare il prompt e digitare :closeper rimuovere l'ultimo ( vuoto) ... è un sacco di digitazione, e ne vale la pena solo se si aprono molte schede (per 2 o 3 file, usare solo :tabedue volte sarebbe più veloce).
Martin Tournoij,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.