Perché gli esperti Vim preferiscono i buffer rispetto alle schede?


243

Non capisco i buffer. Quando apro 3 file nella stessa scheda e chiudo la mia finestra, in genere sono infastidito nello scoprire la prossima volta che apro uno di quei file che ci sono strani file di scambio che persistono e mi danno fastidiosi messaggi. Ma di volta in volta leggo che queste cose sono il nirvana della produttività che mi sto perdendo e che le schede sono state create per essere utilizzate dai plebei.

Quindi chiedo a te, l'esperto di Vim: quali sono i vantaggi dell'utilizzo dei buffer rispetto alle schede? Non vedo come la differenza potrebbe essere profondamente diversa, ma mi considererei solo a livello principiante-intermedio al funzionamento di Vim. È :ls :b#davvero molto più veloce di gting in giro? Sento che deve andare più in profondità di così.


6
Per coloro che stanno imparando Vim o che stanno arrivando a Vim fortemente influenzato da altri editor basati sulla GUI, consiglio vivamente di leggere prima la risposta di @Jonathan Brink e poi di tornare alla risposta principale qui.
icc97,

1
Non preoccuparti troppo. Uso le schede come principale modo di navigazione tra i file. Come dici tu, <#> gt è facile da scrivere. Per renderlo ancora più facile da usare, personalizzo i miei dati di tabline per includere il numero di scheda. Se devo visualizzare più di un buffer alla volta, divido una nuova finestra all'interno della scheda. Nonostante ciò che sostiene @romaini, questo modo di usare Vim mi rende molto produttivo perché si adatta alle mie metafore personali. Nota anche che in una carriera di 37 (finora) anni come programmatore, non ho ancora dovuto aprire più di cinque o sei file contemporaneamente - e molto raramente. Fai ciò che funziona per te. :)
Tony,

Fai quello che funziona. Alcune persone usano molti file in una sessione, quindi i buffer contano molto di più. Anche Bram Moolenaar dice "organizzali come preferisci". Avere 20 schede aperte non è il modo giusto, ma le schede per alcuni file non sono la fine del mondo. La soluzione di Bram per la gestione di molti file sta aprendo diverse sessioni terminali. Dice che è così, ma non è così che tutti dovrebbero farlo.
artigianato

La sola differenza più ovvia che non sembra essere evidenziata correttamente è che se rimani in una scheda puoi visualizzare più buffer contemporaneamente con :splitting in "windows". Se hai tutti i tuoi buffer (file) in schede separate non otterrai quella vista simultanea. Consiglio di imparare vim usando 1 tab per iniziare e abituarsi alle divisioni.
NeilG,

Risposte:


500

Come ha detto ZyX su #vim, questa domanda suona come "Perché gli esperti di Vim preferiscono gustosi piuttosto che caldi?" .

Gli "esperti Vim" non preferiscono i buffer rispetto alle schede: usano i buffer come proxy file e le schede come aree di lavoro. I buffer e le schede hanno scopi diversi, quindi preferire l'uno all'altro non ha alcun senso.

Il problema con buffer e schede è di confusione , causato da una combinazione di fatti indipendenti.

  1. La maggior parte degli editor di testo e degli IDE "moderni" utilizza una metafora di tabulazione per rappresentare i file caricati. Quella metafora funge da sistema di informazione - mostra all'utente quali file sono aperti e il loro stato - e come dispositivo interattivo - consente all'utente di manipolare (riordinare, selezionare, chiudere ...) quei file aperti. Nonostante i loro numerosi limiti, le schede sono ovunque e le persone sono abituate a loro e si aspettano che siano ovunque.

  2. Vim ha introdotto le tabulazioni in 7.0 come modo per i suoi utenti di creare "aree di lavoro" ad hoc. Nulla nelle loro funzionalità, nelle loro opzioni specifiche, nei loro comandi specifici o nelle loro :helpsezioni suggerisce che le pagine delle schede potrebbero o debbano essere utilizzate come proxy di file.

    Nient'altro che il nome e l'aspetto delle "schede", ovviamente, che creano molta confusione.

  3. Senza :set hidden, che è disabilitato di default e non molto facile da trovare, Vim rende impossibile passare a un altro buffer senza scrivere quello corrente o abbandonare le sue modifiche. I nuovi utenti, ignari di tale opzione, non hanno altra scelta che passare a un uso intensivo di Windows o alla funzionalità "simile a una scheda" più vicina che possono trovare: schede.

"Scheda" è una scelta di nome sfortunata per quella caratteristica, specialmente in un'epoca dominata dall'idea che leggere la documentazione è una perdita di tempo.

In Vim, le pagine delle schede sono un'astrazione costruita sopra le finestre, esse stesse un'astrazione costruita sopra i buffer. Ogni nuovo livello aggiunge funzionalità utili ma limita il flusso di lavoro.

Il "modo buffer"

Con un flusso di lavoro basato su buffer, i file con cui stai lavorando sono distribuiti lungo una singola dimensione. Puoi scorrere i tuoi buffer, puoi accedere a un buffer specifico digitando parte del suo nome (con completamento) o il suo numero, puoi alternare tra i buffer, puoi indirizzarli abbastanza facilmente. Non c'è praticamente alcun attrito.

  1. Otto buffer aperti, solo uno visibile:

    Otto buffer aperti

  2. Cambio per numero:

    Commutazione per numero

  3. Cambio per nome:

    Cambio per nome

I buffer sono proxy di file di Vim. Se pensi in termini di file, pensi in termini di buffer.

La "via della finestra"

Con un flusso di lavoro basato su finestre, i tuoi "file" sono entrambi distribuiti lungo la stessa singola dimensione "virtuale" come farebbero se tu utilizzassi solo i buffer e lungo altre due dimensioni "fisiche". Ma gli spazi cartesiani in cui si trovano quelle dimensioni sono quasi completamente separati: spostarsi su un altro buffer significa ancora "spostarsi su un altro file", ma spostarsi su un'altra finestra no. Il buffer che corrisponde al file desiderato può essere visualizzato in quella finestra ma potrebbe anche essere visualizzato in un altro, forse in un'altra scheda, o per niente.

Con Windows, la navigazione tra i file aperti o diventa troppo complessa o troppo semplicistica, anche con 'switchbuf'e :sb. Soprattutto perché sei costretto a usare due serie di comandi per quello che è essenzialmente la stessa cosa: accedere a un buffer.

Windows ha il suo utilizzo, come descritto di seguito, ma non ha le carte in regola per sostituire i buffer nel flusso di lavoro di chiunque.

Qui sto lavorando a un sistema di colori Vim. Le due finestre sono viste diverse dello stesso buffer: quella in alto funge da riferimento, con una tabella dei codici colore utilizzati nel sistema dei colori e quella in basso è dove lavoro:

Lavorando su un colorismo

Le finestre non sono progettate come proxy di file e non possono essere trasformate in unità: sono "contenitori" o "finestre" progettate per offrire una vista in un buffer. Ne più ne meno.

Il "modo tab"

Con un flusso di lavoro basato su schede, essenzialmente si tenta di imitare l'esperienza utente a cui si è abituati dal proprio editor precedente, ignorando completamente la natura stessa delle pagine delle schede di Vim. Se dimentichiamo per un momento che questa strategia è generalmente molto improduttiva, è anche impossibile, proprio come con Windows, forzare Vim ad aderire a quel paradigma "un file = una scheda" senza perdere molta flessibilità.

Continuando a lavorare con gli stessi file di cui sopra, il tabline occupa uno spazio significativo praticamente senza alcun vantaggio. Tutti i miei file e tutte le mie schede sono chiamati, javascript*.vimquindi non posso fare 3gted essere sicuro che finirò nel posto giusto ed è impossibile raggiungere una scheda specifica per nome. Aggiungete a ciò il fatto che la sua etichetta può benissimo essere molto inutile ma perfettamente logica [Quickfix List]... Dato che non esiste un modo pratico per legare un file / buffer a una scheda, in pratica rimane solo un modo pratico per navigare tra le schede / buffers / files: ciclismo.

E sì, il mio tabline è ostruito da solo 8 schede, immagina se ne avessi 20!

  1. Otto buffer aperti in otto schede (errato)

    Sbagliato

  2. Due schede per due attività specifiche (a destra)

    Destra

Le schede sono "contenitori" o "finestre" progettate per contenere una o più finestre, a loro volta "contenitori" progettati per contenere buffer.

In conclusione

Gli "esperti Vim" (supponiamo che io possa parlare come se fossi uno) non preferiscono i buffer rispetto alle schede: usano semplicemente Vim come è stato progettato e sono perfettamente a suo agio con quel design:

  • Gli "esperti Vim" hanno 2, 30 o 97 buffer caricati e sono molto contenti di non avere a che fare con la distribuzione spaziale;

  • quando hanno bisogno di confrontare due file o lavorare in una parte del buffer corrente mentre ne tiene un altro come riferimento, "esperti di Vim" usano Windows perché è così che devono essere usati;

  • quando hanno bisogno di lavorare per un po 'su una parte separata del progetto senza fare confusione con la loro vista attuale, "Esperti Vim" caricano una nuova scheda.


10
Per alcuni link aggiuntivi, vedi i miei buffer di utilizzo effettivamente pubblicati
Peter Rincker,

7
@DavidEG, avere 20 buffer non è affatto problematico, quindi non c'è davvero bisogno di un plugin. D'altra parte, 20 pagine di schede - che siano convincenti o meno proxy di file - non possono adattarsi alla maggior parte degli schermi, plugin o no.
Romainl,

2
@Kache, sì, questo è esattamente il nocciolo del mio punto: puoi usare finestre e tab per quello che sono ma non come proxy di file. Quindi l'argomento non è se le persone dovrebbero usare le tab tab o i buffer, ma se le persone dovrebbero usare le tab come proxy o no.
romainl,

14
Come un “esperto Vim” Posso dire che più di 4 centinaio di buffer “aperto” (in realtà “elencato, ma scaricato, ad eccezione di alcune fra le più”) è una situazione normale quando ho a che fare con il progetto del genere NeoVim (ho semplicemente aperto tutto *.c, *.h, scripts/*e test/**/*.luafile). Dato che il mio terminale è largo solo 239 colonne, è impossibile usare un approccio "un file per scheda".
ZyX,

3
E dato che esiste un numero di plug-in (Command-T, ...) che rende più semplice il passaggio tra buffer e / o file utilizzando le schede per qualsiasi progetto relativamente grande non ha senso. E neovim con ≈500 file "interessanti" è un grande progetto, ma non il più grande. Quando affronti la necessità di gestire tali progetti, usi sempre un qualche tipo di ricerca per navigare (ricerca di file / tag con Command-T e amici, vari modi per andare alla definizione del simbolo) e quindi non hai assolutamente alcun motivo per usare le schede in questo modo: in ogni caso non utilizzerai la funzionalità associata a tab per navigare nel progetto.
ZyX,

88

Ho usato per mantenere ogni buffer in una scheda separata, ma sono cresciuto stanco di costantemente gte gT-ing in giro ovunque.

Ho anche sentito che i buffer erano troppo difficili da gestire.

Ecco alcune tecniche che hanno completamente cambiato la mia precedente opinione:

Ecco il mio flusso di lavoro tipico:

  • Apri Vim e usa :e(di solito con un regex come :e src/**/F*Bar.js) per aprire un buffer
  • Mi rendo conto che devo aprire un altro file. Utilizzare anche :eper quello. Se voglio alternare tra questo buffer e il buffer attualmente aperto lo userò :spo :vspper aprirlo in una finestra separata.
  • Ripeti finché non avrò i 3-5 file tra i quali passerò dall'uso delle tecniche nell'elenco puntato sopra per volare tra i tuoi buffer.
  • Se voglio "ricominciare" con i miei buffer, basta chiudere Vim e riaprire.

Ho sentito che dopo una settimana circa di forzare questi nuovi modelli, è diventato molto più facile visualizzare quali buffer avevo aperto e come arrivare a uno di essi in pochi passaggi automatici.


24
È un peccato che spiegazioni amichevoli come quelle degli utenti / neofiti come questa ottengano circa il 3% dei voti positivi di risposte eccessivamente complesse, sprezzanti e sconcertanti come quella più votata qui. Non sapevo nemmeno che gTfosse il comando per cambiare scheda, cercavo il sostituto ctrl+tab. Quindi grazie per aver aiutato davvero un nuovo utente piuttosto che semplicemente per farli sentire stupidi.
icc97,

11
Devo dire che il mio commento è ingiusto alla risposta di @ romainl, è stato molto felice di rispondere alle domande che avevo a riguardo. Ma certamente come qualcuno che cerca di imparare Vim la tua risposta è molto più facile da capire, ma la sua risposta è più completa una volta che ne sai davvero un po 'di più.
icc97,

3
Penso che la risposta di @ romainl sia estremamente utile e ci dia un'idea chiara di come sono progettati buffer, finestre e schede e come devono essere usati. Tuttavia, penso che gli utenti di Vim possano cogliere l'occasione per rispondere alle domande in un modo che non ti piace , e questo può essere frustrante.
keyofnight

3
Non riesco a ricordare da dove l'ho preso, ma nnoremap <leader>b :ls<CR>:b<space>è abbastanza bello per cambiare rapidamente i buffer, in quanto mostra un elenco dei buffer attualmente aperti. Inoltre, vengono accettati nomi parziali (purché vi sia una sola corrispondenza).
nulla101

1
Questo metodo ha anche il fantastico vantaggio del completamento automatico di vim (impostazione predefinita, nessun plug-in aggiuntivo). Dato che stai usando più buffer, quando sei in modalità inserimento e fai un ctrl No ctrl P(P è quello che di solito uso), ti darà un elenco di parole per finire quello che stavi digitando ... È intelligente in base al tuo attuale buffer, quelli suddivisi, quelli che stavi guardando e ogni altro file aperto!
g19fanatic,

12

L'aspetto negativo delle schede è che puoi vedere solo il contenuto di uno alla volta. Quindi, se li usi come in un browser, stai perdendo la visualizzazione di più buffer affiancati o anche la visualizzazione di parti separate dello stesso file in suddivisioni. Pertanto, molti consigliano di utilizzare le schede solo per separare aree di lavoro diverse (ad esempio, una per un progetto Java, un'altra per una lista di cose da fare, una terza per hackerare uno script sul lato).

I problemi che descrivi fanno sembrare che stai usando Vim nel modo sbagliato. O hanno (principalmente) un'unica istanza dedicata. Quindi, i buffer che vengono nascosti semplicemente "riappaiono" se li modificate nuovamente (e ora potete usare l'elenco dei buffer per richiamarli) e non ci saranno messaggi di file di scambio. In alternativa, utilizzare istanze Vim separate per progetto / file / sessione di modifica, ma prendere l'abitudine di completare :quitogni istanza al termine del file.


Uso spaccate di tanto in tanto. Non sapevo che fossero considerati "usando i buffer". È un concetto misterioso per me davvero.
2c2c,

1
Come interessante riscoperta delle schede, tabman può generare un pannello laterale simile a NerdTree, che dettaglia tutti i buffer come sono stati visualizzati in ogni scheda.
Llinfeng,

7

Un altro suggerimento, quando si utilizza il nome del buffer come argomento per: buffer, non è necessario specificare interi nomi. Tuttavia, se più di un buffer corrisponde all'argomento dato, i buffer non verranno commutati.

Qualsiasi frammento del nome del buffer può essere utilizzato per la corrispondenza. Ad esempio, se si dispone dei buffer request_manager.javae queue_manager.javaquindi :buffer queo :b quecorrisponde a entrambi, ma passerà a queue_manager.java come corrisponde all'inizio.


3

Uso le schede, Ctrl- Pe le sessioni Vim nel mio flusso di lavoro e ho da oltre un anno:

  • Ho )e (mappato su "vai alla scheda successiva" e "vai alla scheda precedente", rispettivamente. tnapre una nuova scheda. Uso anche il tabm per aiutare a mantenere le cose organizzate.

  • Uso le sessioni di Vim per gruppi di file relativi alla storia / al bug su cui sto lavorando, di solito per categoria. Queste sessioni vengono sovrascritte nel corso del processo.

  • Devo ancora trovare qualcosa di meglio di Ctrl- P, ma ci vuole un po 'per elaborare tutti i file per la ricerca.


1

Lancia 2c nella pila.

TLDR; :b *part-of-filename*è il modo migliore per trovare un file necessario nell'elenco dei buffer, ovvero è più veloce e ha un carico cognitivo MENO rispetto ai numeri di buffer, alle schede o alle finestre per il tracciamento dei file.

Non è per me avere 30 buffer aperti (vale a dire che non ho fatto le pulizie), e la bellezza dei buffer usati è che non mi rallenta affatto. In effetti, accelera le cose quando quattro giorni dopo aver aperto il file ne ho bisogno, lo chiamo :b *part-of-filename*e appare magicamente, impressionando i colleghi e i collettivisti.

I buffer sono per i file.

Per essere efficace:

  • Apri un primo file importante da una directory root diabolicamente ben scelta
  • Apri i file successivi con :e
  • Usa lsTUTTO il tempo in cui inizi a ottenere un buon modello mentale (non riesci a capire ciò che non riesci a vedere, mentalmente o letteralmente)
  • Mai :q, soffia
  • Entra :bnella tua memoria muscolare
  • :b1 è buono per il primo file che sai di aver aperto, altrimenti numeri e lettere diventano goffi in fretta
  • :b# è buono per passare all'ultimo file, che è un'esigenza comune
  • :bd#è utile per quando sei passato a un file temporaneo, hai fatto ciò che dovevi fare, sei tornato con :b#e ora vuoi chiudere quel file temporaneo
  • :b *part-of-filename* è altrimenti il ​​modo migliore per trovare un file necessario nell'elenco, ovvero è PIÙ VELOCE e ha MENO carico cognitivo rispetto ai numeri di buffer, alle schede o alle finestre per il tracciamento dei file.

L'unico fastidio :b *part-of-filename*è che a volte non hai ancora aperto il file e devi tornare indietro e :e path/to/full-filenameprima.

Le schede servono per differenziare file veramente non correlati.

O tenere a portata di mano un particolare layout di Windows (dichiarazione di non responsabilità: non l'ho mai usato per questo da solo).

O per i file usati raramente, ma prevedibilmente necessari. Per me, di solito è un commitMessagefile che annoto mentre lavoro, quindi non devo pensarci troppo quando arriva il momento di impegnarmi. gtè più veloce di :b com<enter>(se ti senti fortunato, altrimenti :b com<tab><enter>)

  • :tabe commitMessage
  • gto gTanche un favorito della memoria muscolare

Le suddivisioni delle finestre servono per confrontare visivamente le informazioni

O avere accesso immediato a informazioni importanti (a :edire il vero, a meno che quelle informazioni non siano in qualche modo qualcosa di cui ho bisogno per aggiornare con un file di registro, di solito estraggo il contenuto nel file corrente e lo gestisco lì).

  • :vspo C-w vapre una divisione verticale, ovvero a sinistra | giusto, quindi usa :bo :eper ottenere il file che desideri
  • :spo C-w saprire una divisione orizzontale, ovvero superiore / inferiore
  • C-w C-w cioè doppio Ctrl-w, ti ruota attorno alle finestre disponibili
  • C-w c chiudi la finestra corrente
  • C-w o chiudi tutte le altre finestre, mantieni aggiornato SOLO

Risposta incredibilmente utile, dovrebbe avere molti più voti. Grazie per i suggerimenti, in particolare la visione del flusso di lavoro con :b#e :bd#!
Alacritas,

0

Aggiungi questi al tuo .vimrce inizia ad amare i buffer:

:nnoremap <Tab> :n<cr>
:nnoremap <S-Tab> :N<cr>

In questo modo è possibile scorrere in avanti / indietro in modalità normale tramite Tab/ ShiftTab.


5
Non farlo. Perderai la mappatura per <C-I>. Mappa <C-Tab>invece se vuoi davvero.

6
Inoltre, :ne si :Nriferiscono all'elenco degli argomenti, non ai buffer aperti. Vorresti :bne :bp( :bnexte :bprev). tpope's integra fornisce mappature ]be [bper questo (e altre cose buone) se lo desideri. (e ), o <left>e <right>frecce, sarebbe forse essere meno utili chiavi di ignorare di scheda, se si vuole veramente una breve mappatura.
Vaz,

1
@jeyoung ha concordato: ha anche molto più senso l'uso Ctrl + Tabpoiché è quello che usano la maggior parte degli altri editor e browser della GUI.
icc97,

0

Vorrei suggerire un'implementazione brillante di un buon numero di anni fa: kien / tabman.vim . Chiarisce quanto segue:

  • Si possono avere tanti buffer che sono accuratamente nascosti, da qualche parte;
  • In base alla progettazione, le schede hanno lo scopo di visualizzare i buffer in modo creativo.
    • Con alcuni plugin tabline adeguati, si possono visualizzare tutti i buffer nascosti nella riga superiore (tabline);
    • Secondo la mia esperienza con vim-compagnia aerea , il tabline mostrerà pochissime informazioni rilevanti quando creo una nuova scheda.
    • Due tag occuperanno la fessura della tablatura, fianco a fianco, sprecando il resto degli spazi orizzontali
    • Peggio ancora, non ho più idea di quali siano i buffer nascosti.

È stata una meravigliosa riscoperta di questo plugin magico, che avrebbe dovuto rimanere nella mia configurazione di Vim anche per un buon numero di anni. Mentre continuerei a cercare qualcosa che mostri anche tutti i buffer nascosti, TabMan è il mio superuomo quando si tratta di avere una visione a volo d'uccello di come i buffer sono stati disposti su diverse schede.



0

Carico i buffer "selezionati" come schede per passare rapidamente (TAB / S-TAB) tra di loro. Il framework delle aree di lavoro si adatta qui come per me buffer VS schede è principalmente la cosa di visibilità. Posso inserire file importanti / di lavoro in finestre e schede e nascondere quelli che non è attualmente necessario utilizzare in background al volo senza dover ricordare i percorsi o impiegare del tempo per cercare e caricarli di nuovo quando si presenta la necessità. Ciò consente di gestire diverse attività o progetti in una sessione VIM, immagino che questo fosse importante nelle macchine a memoria ridotta ma è anche buono per concentrare tutte le attività di modifica in un frame dell'applicazione. Ho anche scorciatoie di spostamento del buffer impostate su Ctrl-Destra / Sinistra, così posso spostarmi rapidamente anche su vari buffer.

In conclusione, si può dividere solo alcune finestre per i suoi usi per quanto riguarda la proprietà dello schermo, ma si possono mantenere più impostazioni di Windows in diverse schede espandendo così il proprio spazio di lavoro e migliorando il flusso di lavoro consentendo la comoda divisione di attività complicate che ruotano più di un file .

Per i file di scambio, puoi dire a VIM di conservarli tutti in una cartella della tua designazione. Per questo uso :set directory.

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.