Utilizzo delle schede di Vim come buffer


366

Ho esaminato la possibilità di utilizzare le schede in Vim (con :tabe, :tabnewecc.) In sostituzione della mia pratica corrente di avere molti file aperti nella stessa finestra in buffer nascosti.

Vorrei che ogni file distinto che ho aperto fosse sempre nella sua scheda. Tuttavia, ci sono alcune cose che ostacolano questo. Come posso risolvere questi:

  1. Quando i comandi piacciono gfe ^]saltano in una posizione in un altro file, il file si apre in un nuovo buffer nella scheda corrente. C'è un modo per avere tutti questi tipi di comandi per aprire il file in una nuova scheda o passare alla scheda esistente con il file se è già aperto?

  2. Quando cambio i buffer posso usare :b <part of filename><tab> e completerà i nomi dei file nei buffer esistenti. <part of filename>può anche essere al centro di un nome file anziché all'inizio. Esiste un equivalente per cambiare scheda?

Risposte:


642

Stop, stop, stop.

Non è così che le schede di Vim sono progettate per essere utilizzate. In realtà, sono sbagliati. Un nome migliore sarebbe "viewport" o "layout", perché è una scheda: è un diverso layout di finestre di tutti i buffer esistenti.

Cercare di battere Vim in 1 tab == 1 buffer è un esercizio di futilità. Vim non conosce o non cura e non rispetterà su tutti i comandi-in particolare, tutto ciò che utilizza il buffer quickfix ( :make, :grep, e :helpgrepsono quelli che vengono in mente) sarà felice di ignorare le schede e non c'è niente che tu possa fare per fermare quello.

Anziché:

  • :set hidden
    Se non hai già questo set, allora fallo. Fa funzionare vim come ogni altro editor a più file del pianeta. Puoi avere buffer modificati che non sono visibili in una finestra da qualche parte.
  • Uso :bn, :bp, :b #, :b name, e ctrl-6per passare tra buffer. Mi piaccio ctrl-6(da solo passa al buffer utilizzato in precedenza o #ctrl-6passa al numero di buffer #).
  • Utilizzare :lsper elencare i buffer o un plug-in come MiniBufExpl o BufExplorer .

192
Per me, questo è un bug, non "errore dell'utente". La ricerca nel Web di "schede VIM" indica che quasi tutti gli altri non sono d'accordo con te o non sono a conoscenza del modo "reale" di utilizzare le schede Vim. Inoltre, se le schede sono davvero visualizzazioni "layout", perché sono i titoli delle schede predefiniti, il nome del file corrente? Se volessi più visualizzazioni dello stesso file, tutti i titoli delle mie schede avrebbero lo stesso nome (non molto utile?). Quindi, in entrambi i casi, l'implementazione della scheda predefinita in Vim è difettosa.
cmcginty,

45
Cos'altro hai intenzione di mostrare nel titolo della scheda? Mostra il nome del buffer corrente (non "nome file"). È comunque possibile modificare ciò che viene visualizzato nel titolo della scheda.
aehlke,

46
@Casey: FWIW, quando ho saputo per la prima volta delle schede di Vim e ho dovuto avvolgere la mia testa su di loro e su cosa fossero, pensato esattamente alla definizione data da Zathrus. (Sono un Vim Novice tra l'altro). Quindi no, non sono d'accordo sul fatto che sia una funzionalità così rotta o non intuitiva ... ancora meno d'accordo sul fatto che "su tutti" non è d'accordo (e penso che almeno uno o due riferimenti potrebbero dare più peso all'asserzione). Funziona incredibilmente bene per avere layout di schermo multipli e simultanei.
ata

17
Questo commento è sbagliato, non sono sicuro del perché sia ​​stato votato o accettato. Robince sotto ha la risposta corretta -: tab sball e: switchbuf sono quello che stai cercando.
Roel,

38
+1 per "Stop, stop, stop". Vim è tanto una mentalità quanto uno strumento. È importante insegnare ai nuovi utenti la mentalità, in modo che possano utilizzare lo strumento al massimo delle sue potenzialità.
Cody Poll

273

Un po 'tardi alla festa qui, ma sorpreso di non aver visto quanto segue in questo elenco:

:tab sball - questo apre una nuova scheda per ogni buffer aperto.

:help switchbuf- controlla il comportamento di commutazione del buffer, provare :set switchbuf=usetab,newtab. Ciò dovrebbe significare passare alla scheda esistente se il buffer è aperto o crearne una nuova in caso contrario.


4
+1 Per switchbuf- set switchbuf=useopenè grande per evitare il comportamento fastidioso :make, :vimgrepe comandi simili che cambia i buffer nel layout finestra anche quando il buffer è stato già visualizzato.
mMontu,

3
perché non mi va bene? dopo aver impostato :se switchbuf=usetab,newtab, quando un uso bnper cambiare buffer, apre ancora il file buffer nella scheda corrente invece di passare alla scheda esistente? C'è qualcosa di sbagliato?
Zhiyelee,

173

Vim :help windowspiega abbastanza bene la confusione "tabs vs buffers".

Un buffer è il testo in memoria di un file.
Una finestra è una finestra su un buffer.
Una scheda è una raccolta di finestre.

L'apertura di più file si ottiene in vim con buffer . In altri editor (ad esempio notepad ++) questo viene fatto con le schede, quindi la scheda del nome in Vim potrebbe essere fuorviante.

Le finestre hanno lo scopo di dividere l'area di lavoro e visualizzare più file (buffer) su una schermata. In altri editor questo potrebbe essere ottenuto aprendo più finestre della GUI e riorganizzandole sul desktop.

Infine, in questa analogia, le pagine delle schede di Vim corrisponderebbero a più desktop, ovvero a diversi riarrangiamenti di Windows.

Come help: tab-pagespiega vim, è possibile utilizzare una scheda, quando si desidera modificare temporaneamente un file, ma non si desidera cambiare nulla nel layout corrente di finestre e buffer. In tal caso, è possibile utilizzare un'altra scheda per lo scopo di modificare quel determinato file.

Ovviamente devi ricordare che la visualizzazione dello stesso file in molte schede o finestre comporterebbe la visualizzazione della stessa copia di lavoro (buffer).


11
Questa è in realtà una risposta fantastica, ma ha avuto un paio di letture per avere un senso. buffers = tabs, windows = gui windows, tab pages = desktop ha il miglior senso finora che ho trovato per qualcuno che non ha familiarità con i concetti
icc97

4
Tendo a pensarli come guardare attraverso una finestra in una stanza - buffer= oggetto , window= riquadro e tab= finestra . Posso spostarmi nella stanza e guardare da diverse finestre ( tabs). Finestre diverse possono avere numero, disposizione e dimensioni dei riquadri diversi . Lo stesso oggetto può essere visualizzato contemporaneamente da riquadri diversi in finestre diverse .
go2null,

Se hai familiarità con il paradigma di Linux Workspaces e Windows, vedrai l'eredità vimdell'uso. All'inizio c'era solo una finestra . I gestori di finestre ti hanno quindi permesso di dividere le finestre in riquadri (piastrellatura WM) o in riquadri sovrapposti (, WM mobile) ma si riferivano comunque a ciascun riquadro come a una finestra. Ora aggiungi il concetto di un'area di lavoro in cui il riquadro può essere mostrato in più aree di lavoro. Quindi, in questo paradigma, buffer= app , window= window e tab= workspace .
go2null,

56

Contrariamente ad alcune delle altre risposte qui, dico che puoi usare le schede come vuoi. vim è stato progettato per essere versatile e personalizzabile, piuttosto che costringerti a lavorare secondo parametri predefiniti. Sappiamo tutti come a noi programmatori piace imporre la nostra "etica" a tutti gli altri, quindi questo risultato è sicuramente una caratteristica principale.

<C-w>gfè l'equivalente di tabulazione del gfcomando dei buffer . <C-PageUp>e <C-PageDown>passerà da una scheda all'altra. (In Byobu, questi due comandi non funzionano mai per me, ma funzionano al di fuori di Byobu / tmux. Le alternative sono gte gT.) <C-w>TSposta la finestra corrente in una nuova scheda.

Se preferisci che vim usi una scheda esistente, se possibile, piuttosto che creare una scheda duplicata, aggiungi :set switchbuf=usetabal tuo file .vimrc. È possibile aggiungere newtaball'elenco ( :set switchbuf=usetab,newtab) per forzare i comandi QuickFix che visualizzano gli errori di compilazione da aprire in schede separate. Preferisco splitinvece, che apre gli errori di compilazione in una finestra divisa.

Se hai abilitato il supporto del mouse con :set mouse=a, puoi interagire con le schede facendo clic su di esse. C'è anche un +pulsante per impostazione predefinita che creerà una nuova scheda.

Per la documentazione sulle schede, digitare :help tab-pagein modalità normale. (Dopo averlo fatto, puoi esercitarti a spostare una finestra in una scheda usando <C-w>T.) C'è un lungo elenco di comandi. Alcuni dei comandi della finestra hanno a che fare con le schede, quindi potresti voler consultare anche quella documentazione tramite :help windows.

Aggiunta: 19-12-2013

Per aprire più file in vim con ogni file in una scheda separata, utilizzare vim -p file1 file2 .... Se sei come me e dimentica sempre di aggiungere -p, puoi aggiungerlo alla fine, poiché vim segue le normali regole di analisi delle opzioni della riga di comando. In alternativa, è possibile aggiungere un mapping alias bash vima vim -p.


3
+1, vim -ptuttavia, tenere presente che per impostazione predefinita verranno visualizzate solo fino a 10 schede. I file extra vengono caricati nei buffer, ma non visualizzati nella propria scheda.
IanB,

@IanB: come superare l'impostazione predefinita di limitarla a 10 schede?
0xC0000022L,

3
@ 0xC0000022L vedi tabpagemaximpostazione
IanB

14

Ho riscontrato lo stesso problema. Volevo che le schede funzionassero come buffer e non riesco mai a farle funzionare. La soluzione su cui ho finalmente deciso era di fare in modo che i buffer si comportassero come schede!

Dai un'occhiata al plugin chiamato Mini Buffer Explorer , una volta installato e configurato, sarai in grado di lavorare con i buffer praticamente allo stesso modo delle schede senza perdere alcuna funzionalità.


10

Questa è una risposta per chi non ha familiarità con Vim e proviene da altri editor di testo (nel mio caso Sublime Text).

Ho letto tutte queste risposte e non era ancora chiaro. Se li leggi abbastanza, le cose iniziano a dare un senso, ma mi ci sono volute ore per andare avanti e indietro tra le domande.

La prima cosa è, come altri hanno spiegato:

Le Tab Tab , assomigliano molto alle tab , si comportano come tab e assomigliano molto alle tab nella maggior parte degli altri editor di GUI, ma non lo sono. Penso che sia un cattivo modello mentale costruito su Vim, che purtroppo offusca il potere extra che hai in una scheda.

La prima descrizione che ho capito è stata dalla risposta di @ crenate è che sono l'equivalente di più desktop. Se visto a questo proposito, avresti sempre solo un paio di desktop aperti ma molte finestre della GUI aperte all'interno di ognuno.

Direi che sono simili in altri editor / browser:

  1. Raggruppamenti di schede
  2. Aree di lavoro di testo sublime (ovvero un elenco dei file aperti presenti in un progetto)

Quando li vedi in questo modo, ti rendi conto del potere di essi di poter facilmente raggruppare gruppi di file (buffer), ad esempio i tuoi file CSS, i tuoi file HTML e i tuoi file JS in diverse schede. Il che è davvero fantastico.

Altre descrizioni che trovo confuse

viewport

Questo non ha senso per me. Un viewport che sebbene abbia un termine del dizionario definito , ho sentito solo riferirsi alle finestre di Vim nel :help windowdocumento. Viewport non è un termine che abbia mai sentito parlare di editor come Sublime Text, Visual Studio, Atom, Notepad ++. In realtà non ne avevo mai sentito parlare per Vim fino a quando non ho iniziato a provare a usare le schede.

Se visualizzi le schede come più desktop, fare riferimento a un desktop come una singola finestra sembra strano.

Aree di lavoro

Questo forse ha più senso, la definizione del dizionario è:

Una funzione di archiviazione di memoria per uso temporaneo.

Quindi è come un posto in cui si memorizza un gruppo di buffer.

Inizialmente non suonavo come il concetto di Sublime Text di un'area di lavoro che è un elenco di tutti i file aperti nel progetto:

il file sublime-workspace, che contiene dati specifici dell'utente, come i file aperti e le modifiche a ciascuno.

Tuttavia, pensandoci di più, questo in realtà è d'accordo. Se consideri una pagina della scheda Vim come un progetto di testo sublime, allora sarebbe strano avere solo un file aperto in ciascun progetto e continuare a passare da un progetto all'altro. Quindi perché usare una scheda per aprire solo un file è strano.

Collezione di finestre

Si :help windowriferisce alle pagine delle schede in questo modo. Inoltre numerose altre risposte usano lo stesso concetto. Tuttavia fino a quando non riesci a capire cosa sia una finestra di VIM, non è molto utile, come costruire un castello sulla sabbia.

Come ho detto sopra, una finestra di vim è la stessa di una finestra e quiete spiegata in modo eccellente in questo articolo di linux.com :

Una funzionalità davvero utile in Vim è la possibilità di dividere l'area visualizzabile tra uno o più file o semplicemente di dividere la finestra per visualizzare più facilmente due bit dello stesso file. La documentazione di Vim si riferisce a questa come finestra o finestra, in modo intercambiabile.

Potresti già avere familiarità con questa funzione se hai mai usato la funzione di aiuto di Vim usando: argomento della guida o premendo il tasto F1. Quando si inserisce la guida, Vim divide la finestra e apre la documentazione della guida nella vista superiore, lasciando il documento aperto nella vista inferiore.

Trovo strano che una scheda sia denominata raccolta di finestre anziché raccolta di buffer. Ma suppongo che tu possa avere due diverse schede aperte ciascuna con più finestre tutte puntate sullo stesso buffer, almeno questo è quello che ho capito finora.


1
Alla fine, dopo un anno solido di utilizzo a tempo pieno di Vim, mi sono imbattuto in un caso in cui volevo usare più di una scheda. Al momento i buffer funzionano perfettamente per me, poiché utilizzerei le schede in altri editor. Ma avendo un monitor di grandi dimensioni stavo confrontando un intero gruppo di 3-4 buffer diversi. Quindi un collega voleva che cercassi del codice altrove nella base di codici. Invece di perdere il mio set di finestre di confronto, potrei semplicemente creare una nuova scheda che poi mi permette di fare una ricerca separata come farei quando uso Vim normalmente e quindi una volta terminata la pagina posso tornare al mio set iniziale
icc97,

4

Guardando: schede di aiuto non sembra che VIM voglia lavorare nel modo in cui lo fai ...

I buffer sono condivisi tra le schede, quindi non sembra possibile bloccare un determinato buffer in modo che appaia solo su una determinata scheda.

È una buona idea, comunque.

Probabilmente potresti ottenere l'effetto desiderato usando un terminale che supporta le schede, come multi-gnome-terminal, quindi eseguendo istanze vim in ciascuna scheda del terminale. Non perfetto, però ...


Ho provato a farlo, il problema è che, oltre a rendere difficile la navigazione tra le schede, è che il testo strappato non può essere condiviso tra le schede dei terminali, poiché sono essenzialmente due terminali / shell diversi
puk

@puk: prova il plugin vim di YankRing. Salva il testo strappato in un file, quindi può essere condiviso attraverso le istanze vim.
pixelastic,

@Pixelastic Ho trovato qui una soluzione adatta per il montaggio negli appunti di sistema. Inoltre, Vim funziona meglio in un'istanza. Ho smesso di farlo fare quello che volevo e ho imparato a usare correttamente vim :-) stackoverflow.com/a/8757876/654789
puk,

@puk: Grazie, non mi è venuto in mente che usare gli appunti di sistema significhi condividerlo anche su istanze vim :)
pixelastic

4
  • Puoi mappare i comandi che normalmente manipolano i buffer per manipolare le schede, come ho fatto con gf nel mio .vimrc:

    map gf :tabe <cfile><CR>
    

    Sono sicuro che puoi fare lo stesso con [^

  • Non credo che vim lo supporti per le schede (ancora). Uso gt e gT per passare rispettivamente alle schede successiva e precedente. Puoi anche usare Ngt, dove N è il numero della scheda. Una peeve che ho è che, per impostazione predefinita, il numero di scheda non viene visualizzato nella riga della scheda. Per risolvere questo problema, ho inserito un paio di funzioni alla fine del mio file .vimrc (non ho incollato qui perché è lungo e non è stato formattato correttamente).


<c-w>gfaprirà il nome del file sotto il cursore in una nuova scheda
Peter Rincker,

4

Uso i buffer come le schede, usando il plugin BufExplorer e alcune macro:

" CTRL+b opens the buffer list
map <C-b> <esc>:BufExplorer<cr>

" gz in command mode closes the current buffer
map gz :bdelete<cr>

" g[bB] in command mode switch to the next/prev. buffer
map gb :bnext<cr>
map gB :bprev<cr>

Con BufExplorer non hai una barra delle schede nella parte superiore, ma d'altra parte consente di risparmiare spazio sullo schermo, inoltre puoi avere un numero infinito di file / buffer aperti e l'elenco dei buffer è ricercabile ...


2

Se vuoi che i buffer funzionino come le schede, dai un'occhiata al plugin tabline .

Questo utilizza una singola finestra e aggiunge una riga in alto per simulare le schede (mostrando solo l'elenco dei buffer). Ciò è emerso molto tempo fa quando le schede erano supportate solo in GVim ma non nella riga di comando vim. Dal momento che funziona solo con buffer, tutto si integra bene con il resto di VIM.

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.