Perché gli esperti di Vim preferiscono i buffer alle tabs?

Non capisco i buffer. Quando apro 3 file nella stessa scheda e chiudo la mia finestra, sono generalmente infastidito nello scoprire che la prossima volta che apro uno di quei file ci sono strani file di swap che mi rimangono e mi danno fastidiosi messaggi. Ma più e più volte leggo che queste cose sono il nirvana della produttività che mi sto perdendo e che le tabs erano fatte per i plebei da usare.

Quindi, vi chiedo, l’esperto di Vim: quali sono i vantaggi dell’utilizzo di buffer su tabs? Non vedo come la differenza potrebbe essere profondamente diversa, ma mi considererei solo al livello principiante-intermedio nell’operare Vim. Is :ls :b# davvero molto più veloce di gt ing? Sento che deve andare più in profondità di questo.

Come ha detto ZyX su #vim, questa domanda suona come “Perché gli esperti di Vim preferiscono il gusto al caldo?” .

Gli “esperti Vim” non preferiscono i buffer sulle tabs: usano i buffer come proxy dei file e tabpage come aree di lavoro. Buffer e tabs hanno scopi diversi, quindi preferire l’uno all’altro non ha assolutamente senso.

Il problema con i buffer e le tabs è uno di confusione , causato da una combinazione di fatti indipendenti.

  1. La maggior parte degli editor di testo e degli IDE “moderni” utilizzano una metafora di tabulazione per rappresentare i file caricati. Questa metafora agisce come un 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 tabs sono ovunque e le persone sono abituate a loro e le aspettano ovunque.

  2. Vim ha introdotto le tabs in 7.0 per consentire agli utenti di creare “spazi di lavoro” ad-hoc. Niente nelle loro caratteristiche, le loro opzioni specifiche, i loro comandi specifici o le loro :help sezioni di :help suggerisce che le tabs possono o dovrebbero essere utilizzate come proxy di file.

    Nulla tranne il nome e l’aspetto di “tabpage”, ovviamente, che porta a molta confusione.

  3. Senza :set hidden , che è disabilitato di default e non molto facile da trovare, Vim rende imansible passare a un altro buffer senza scrivere quello corrente o abbandonare le sue modifiche. I nuovi utenti, inconsapevoli di tale opzione, non hanno altra scelta se non quella di passare all’utilizzo di windows pesanti o alla funzione “tab-like” più vicina che possono trovare: tab pages.

“Tabpage” è una scelta sfortunata per questa caratteristica, specialmente in un’epoca dominata dall’idea che leggere la documentazione sia una perdita di tempo.

In Vim, le tabpage sono un’astrazione costruita in cima alle windows, a loro volta un’astrazione costruita sopra i buffer. Ogni nuovo livello aggiunge funzionalità utili ma limita il tuo stream di lavoro.

Il “buffer way”

Con un stream di lavoro basato su buffer, i file su cui stai lavorando sono distribuiti lungo una singola dimensione. È ansible scorrere i buffer, è ansible accedere a un buffer specifico digitando parte del suo nome (con completamento) o il suo numero, è ansible alternare tra i buffer, è ansible targetizzarli abbastanza facilmente. Non c’è praticamente nessun attrito.

  1. Otto buffer aperti, solo uno visibile:

    Otto buffer aperti

  2. Passaggio per numero:

    Passaggio per numero

  3. Passaggio per nome:

    Cambio per nome

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

Il “modo della finestra”

Con un stream di lavoro basato su windows, i “file” vengono entrambi distribuiti lungo la stessa singola dimensione “virtuale” come se fossero utilizzati solo buffer e altre due dimensioni “fisiche”. Ma gli spazi cartesiani in cui si trovano queste dimensioni sono quasi completamente separati: passare a un altro buffer significa ancora “passare a un altro file” ma non spostarsi in un’altra finestra. Il buffer che corrisponde al file desiderato può essere visualizzato in quella finestra ma potrebbe anche essere visualizzato in un altro, magari in un’altra scheda, o non del tutto.

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

Windows ha il loro uso, come descritto di seguito, ma non hanno quello che serve per sostituire i buffer nel stream di lavoro di nessuno.

Qui sto lavorando a un Vim colorscheme. Le due windows sono viste differenti dello stesso buffer: quella in alto serve da riferimento, con una tabella dei codici colore usati nel colorscheme, e quella in basso è dove lavoro:

Lavorando su un colorante

Le windows non sono progettate come proxy di file e non possono essere trasformate in quelle: sono “contenitori” o “windows di visualizzazione” progettate per offrire una vista in un buffer. Ne più ne meno.

Il “tab way”

Con un stream di lavoro basato su tabs, in sostanza, si tenta di imitare l’esperienza utente a cui si è abituati dal precedente editor ignorando completamente la natura stessa delle tabs di Vim. Se dimentichiamo per un momento che questa strategia è generalmente molto improduttiva, è anche imansible, proprio come con Windows, forzare Vim ad aderire a quel paradigma “un file = una scheda” senza perdere molta flessibilità.

Lavorando ancora con gli stessi file di cui sopra, la tablatura occupa uno spazio significativo praticamente privo di vantaggi. Tutti i miei file e tutte le mie tabs sono chiamati javascript*.vim quindi non posso fare il 3gt e sono sicuro che 3gt nel posto giusto ed è imansible raggiungere una scheda specifica per nome. Aggiungete a ciò il fatto che la sua etichetta può essere molto utile, ma perfettamente logica [Quickfix List] … Dal momento che non esiste un modo pratico per bind un file / buffer a una tabpage, in pratica vi rimane solo un modo pratico per navigare tra le tabs / buffer / file: ciclismo.

E sì, la mia tabline è piena di sole 8 tabs, immagina se ne avessi 20!

  1. Otto buffer aperti in otto tabs (errate)

    Sbagliato

  2. Due tabs per due compiti specifici (a destra)

    Destra

Le pagine di tabulazione sono “contenitori” o “viewport” progettati per contenere una o più windows, anch’essi “contenitori” progettati per contenere i buffer.

In conclusione

“Esperti di Vim” (supponiamo di poter parlare come se fossi uno) non preferisco i buffer alle tabs: usano solo Vim come è stato progettato e sono perfettamente a proprio 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 mantenendo un altro come riferimento, “gli 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 interferire con la loro visualizzazione corrente, “esperti Vim” caricano una nuova scheda.

Ho usato per mantenere ogni buffer in una scheda separata, ma mi sono stancato di costantemente gt e gt-ing in tutto il mondo.

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

Ecco alcune tecniche che hanno totalmente cambiato il mio precedente parere:

  • gestione del buffer:: b. Si ottiene sorprendentemente veloce a questo. Vedi vim, passando da un file all’altro rapidamente usando vanilla Vim (senza plugin)
  • Salta / Cambia liste (ctrl o / i e g;)
  • File alternativo (^)
  • Il plugin inpaired di tpope: https://github.com/tpope/vim-unimpaired . Vola tra le diverse liste di buffer con mappature.

Ecco il mio tipico stream di lavoro:

  • Apri vim e usa modifica (di solito con un’espressione regolare) per aprire un buffer
  • Renditi conto che ho bisogno di aprire un altro file. Usa “modifica” anche per quello. Se voglio passare tra questo buffer e il buffer attualmente aperto userò “sp” o “vsp” per aprirlo in una finestra separata.
  • Ripeti fino a quando non avrò i 3-5 file che cambierò usando le tecniche nella lista puntata 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 pattern, è diventato molto più facile visualizzare quali buffer avessi aperto e come arrivare a uno di essi in pochi tratti automatici.

Lo svantaggio delle tabs è che puoi vedere solo i contenuti di uno alla volta. Quindi, se li si utilizza come in un browser, si perde la possibilità di visualizzare più buffer affiancati o addirittura di visualizzare parti separate dello stesso file in split. Pertanto, molti consigliano di utilizzare le tabs solo per separare spazi di lavoro diversi (ad esempio, uno per un progetto Java, un altro per un elenco di cose da fare, un terzo per l’hacking su uno script sul lato).

I problemi che descrivi fanno sembrare che stai usando Vim. O hanno (soprattutto) una singola istanza dedicata. Quindi, i buffer che diventano nascosti semplicemente “riappariranno” se li ri-modifichi (e ora puoi usare l’elenco dei buffer per richiamarli) e non ci saranno messaggi di scambio dei file. Oppure, usa istanze di Vim separate per project / file / edit session, ma poi abitua completamente :quit ogni istanza quando hai finito con il file.

Un altro consiglio, quando si utilizza il nome del buffer come argomento per: buffer, non è necessario specificare l’intero nome. Tuttavia, se più di un buffer corrisponde all’argomento dato, i buffer non verranno scambiati.

Qualsiasi frammento del nome del buffer può essere utilizzato per corrispondere. Ad esempio, se si hanno i buffer request_manager.java e queue_manager.java allora :buffer que matches : b que` entrambi, ma passerà a queue_manager.java poiché corrisponde all’inizio.

Uso le tabs, le sessioni CtrlP e Vim nel mio stream di lavoro e da oltre un anno:

  • Ho ) e ( mappato su “vai alla scheda successiva” e “vai alla scheda precedente” rispettivamente. T n apre una nuova scheda. Inoltre uso la tabm per aiutare a mantenere le cose organizzate.

  • Uso le sessioni di Vim per gruppi di file relativi alla storia / bug corrente su cui sto lavorando, di solito eseguita per categoria. Queste sessioni vengono sovrascritte durante il processo.

  • Devo ancora trovare qualcosa di meglio di CtrlP , ma ci vuole un po ‘per elaborare tutti i file per la ricerca.

Aggiungi questi al tuo .vimrc e inizia ad amare i buffer:

 :nnoremap  :n :nnoremap  :N 

In questo modo puoi scorrere avanti / indietro attraverso di loro in modalità normale tramite Tab / Maiusc Tab .

Carico i buffer “selezionati” come tabs in modo rapido (TAB / S-TAB) per alternarli. La struttura degli spazi di lavoro si adatta qui come per me i buffer VS tab è principalmente la visibilità. Posso inserire file importanti / di lavoro in windows e tabs e hide quelli che attualmente non ho bisogno di utilizzare in background senza dover ricordare percorsi o prendere tempo per cercare e caricarli di nuovo una volta che si presenta la necessità. Ciò consente di gestire diverse attività o progetti in una sessione VIM, immagino che questo fosse importante nelle macchine a bassa memoria, ma è anche utile per concentrare tutte le attività di modifica in un frame di applicazione. Ho anche le scorciatoie di spostamento del buffer impostate su Ctrl-Destra / Sinistra in modo da poter spostare rapidamente anche vari buffer.

In conclusione, si può dividere solo in alcune windows per i suoi usi tanto quanto lo spazio sullo schermo, ma si possono tenere più impostazioni di Windows in diverse tabs espandendo così il proprio spazio di lavoro e migliorando il stream di lavoro permettendo la comoda suddivisione di compiti complicati ruotando 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 .