Come posso modificare un buffer esistente in una nuova scheda in vim?


51

Supponiamo di aver iniziato Vim in questo modo:

vim foo bar

Ora decido che voglio ognuno di quei file nella sua scheda. C'è un modo per farlo senza uscire da Vim e aggiungere l' -popzione alla mia riga di comando?


Molti di voi probabilmente stanno cercando ciò tabe %che è menzionato nella risposta di liuyang1 di seguito.
Mateusz Piotrowski,

1
@MateuszPiotrowski Come ho già detto in questo commento a questa risposta , :tabe %non funziona con i buffer che non hanno un percorso file valido. :tab sbfunziona ogni volta.
JoL

Risposte:


30

Quando avvii Vim in questo modo, non ottieni un client VIM, l'editor di testo utilizza il prompt terminal o cmd: i due file si trovano in due buffer diversi. Utilizzare :lsper elencare i buffer:

:ls
  1 %a   "foo"                 line 6
  2      "bar"             line 0

% A è il buffer attivo. È possibile utilizzare :b2per passare al buffer 2 o utilizzare :bnper passare al successivo o :bpal precedente. Preferisco (CTRL-W v) per dividere le finestre verticalmente, piuttosto che (CTRL-W s), che si divide in orizzontale.

Se hai 2 file caricati e nessuna :tabnewscheda (ancora), puoi e nel nuovo tipo di scheda:b2

Se si desidera caricare sempre i buffer nelle proprie schede, consultare questo articolo .


Sì, ma voglio avere schede.
innaM

Quindi hai già avviato vim in modo da avere i tuoi file nel client vim, non in una shell cmd / terminal?
DaveParillo,

1
Non sono sicuro di cosa intendi. Uso la shell per avviare Vim come descritto sopra e quindi ho un VIM in esecuzione.
innaM

Ah! Immagino di non aver mai veramente capito che i buffer non sono locali nelle schede. Ho sempre pensato (senza pensarci molto) che ogni scheda abbia il suo elenco di buffer.
innaM

Sulla mia macchina, vimlancerò un editor all'interno della shell. Per ottenere l'interfaccia utente grafica di Vim devo usare gvim. E hai ragione: i buffer sono globali per l'applicazione vim.
DaveParillo,

47

Desideri aprire un buffer in una nuova scheda?

Dividi lo schermo (Ctrl-W s), apri una finestra e Ctrl-W T


Hmm. Non proprio quello che avevo in mente, ma non male per cominciare. Non lo sapevo Ctrl-w Tancora. Ovviamente, la prima scheda avrà ancora due buffer in questo modo.
innaM

No. Dopo aver diviso lo schermo in due finestre e averne aperto uno in una nuova scheda, questo si allontana dalla prima scheda. Non rimarrà (almeno non sul mio gvim72). Per quanto riguarda i buffer, non sono collegati a finestre / schede ... sono più simili alla memoria in cui vim memorizza i contenuti dei file.
Rook,

Ah! Hai ragione. Stavo fraintendendo l'output di :ls.
innaM

Inoltre, ctrl-w V divide la finestra verticalmente.
Shannon Nelson,

1
CTRL-w v è il comando corretto per dividere le finestre verticalmente
JRM

27

È possibile ottenere ciò combinando il tabcomando con il sb[uffer]comando.

Per prima cosa devi conoscere l'ID del buffer che desideri aprire in una nuova scheda. Puoi scoprirlo con il lscomando:

:ls
  1 %a   "foo"                          line 1
  2      "bar"                          line 0

Una volta che hai l'ID, puoi facilmente aprirlo in una nuova scheda usando:

:tab sb 2

Il sbcomando normalmente apre il buffer dato in una nuova finestra divisa, ma il tabcomando lo fa invece aprire in una nuova scheda.

Il tabcomando consente inoltre di specificare dove nell'elenco delle schede deve essere creata la nuova scheda. Ad esempio, :0tab sb 2la nuova scheda "barra" verrebbe visualizzata all'inizio dell'elenco anziché dopo la scheda corrente.


2
Non è necessario il numero di buffer, assegnagli una parte inequivocabile del nome del buffer e VIM fa il resto per te.
dessert

1
Questa era quindi la risposta che cercavo e di cui avevo bisogno. Sono rimasto sgomento quando :tab buffer part-of-namenon ho aperto una nuova scheda! Ma ha :tab sb part-of-namefunzionato come un fascino. Grazie!!!!
Sukima,

Questa non è la domanda esatta di OP, ma era esattamente quello che stavo cercando :)
jackcogdill

25

Un modo migliore per realizzare ciò che OP ha richiesto è questo:

:bufdo tab split

Questo aprirà ogni buffer in una sua scheda, indipendentemente da quanti ce ne siano. Se usi così tanto, è facile creare una mappatura nel tuo .vimrc. In combinazione con qualcosa come questo piccolo plugin vim, il seguente aprirà ogni elemento da :grep(o : Ack ) in una scheda a sé stante:

:grep foo
:QuickFixOpenAll
:bufdo tab split

Ovviamente, quando si ricorre a un plug-in, sarebbe abbastanza facile modificarlo per aprire il contenuto dell'elenco delle correzioni rapide direttamente nelle schede.

AGGIORNAMENTO : Devo davvero dare un grido al commento di ggustafsson qui sotto. È di gran lunga la migliore risposta del lotto e illustra magnificamente la tendenza di Vim verso il comportamento compositivo. Il suggerimento è:

 :tab sball

Vale la pena cercare l'aiuto di Vim per : tab e : sball per vedere cosa sta succedendo qui.


Un approccio simile da una modifica precedente, per i posteri, è :bufdo execute "tabnew %". Penso che il nuovo approccio sia un po 'più chiaro.
John Whitley,

Un avvertimento: se il buffer iniziale in vim non è vuoto, questo sembra aprire l'ultimo buffer due volte. Pubblicherò un aggiornamento se trovo una soluzione semplice.
John Whitley,

12
:tab sballsembra funzionare meglio.
ggustafsson,

6

1. Apri due file in Vim.

$ vim foo bar

2. Controllare il numero di buffer.

: ls
  1% a "foo"
  2 "bar"

3. Catena due comandi: tabnewper aprire una nuova scheda e b <buffer_number>caricare il buffer desiderato nella scheda.

: tabnew | b 2

8
Il problema con il passaggio 3 è che prima crea una nuova scheda con un buffer vuoto, quindi apre il buffer 2, risultando in un buffer senza titolo aggiuntivo nell'elenco dei buffer. Meglio usare:tab sb 2
rkjnsn

1
@rkjnsn dovresti postarlo come una risposta - risponde meglio alla domanda "come posso modificare un buffer esistente in una nuova scheda in vim?"
JonnyRaa,

1
@JonnyLeeds fatto.
rkjnsn,

4

Basta aggiungere un punto che altri ragazzi non hanno menzionato.

  • finestra corrente in una nuova scheda

Se hanno più finestre, <C-W>Tquesta finestra verrà spostata in una nuova scheda. Tuttavia, questo collegamento solo per "Finestra", non per "buffer". Se preferisci questo stile :spo <C-W>sduplica il buffer corrente in un'altra finestra, quindi <C-W>Tspostalo in una nuova scheda.

4 battute o 7 battute.

  • buffer corrente in una nuova scheda

:tabe % per aprire una nuova scheda per il buffer corrente.

7 sequenze di tasti.

  • buffer in una nuova scheda

Se si utilizza il plug-in CtrlP, è possibile utilizzare anche "CtrlPBuffer", quindi con un <C-t>collegamento per aprirlo con una nuova scheda. Questo stile consente di passare facilmente a diversi buffer.

Con la scorciatoia di "CtrlPBuffer", 4 tasti o più.


:tabe %è quello che stavo cercando da molto tempo, grazie!
pevik,

No, in :tabe %realtà non apre una nuova scheda per il buffer corrente. Quello che succede è che %si espande nel percorso del file del buffer corrente e :tabeapre quel percorso. Vim vedrà che stai provando ad aprire un file che hai già aperto e riutilizzerà il buffer che hai. Ciò significa che questo non funziona con i buffer che non hanno un percorso file. Se apri un nuovo file con :newe non lo hai salvato, non puoi inserirlo in una nuova scheda con questo. Il vero comando di cui hai bisogno è ciò che rkjnsn ha inserito nella loro risposta: :tab sb %o più breve::tab sb
JoL
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.