Duplica il buffer in una nuova scheda invece di spostarlo


10

Spesso desidero massimizzare temporaneamente un buffer in una scheda e poi tornare alla vecchia configurazione del buffer che stavo guardando. Il mio attuale flusso di lavoro per fare qualcosa del genere è chiudere tutti gli altri buffer usando <c-w>oo spostare il buffer che sto guardando nella sua scheda <c-w>T. Il problema con il secondo approccio è che rimuove il buffer dalla scheda originale.

Io popolo tre file a.txt, b.txte c.txtcon a, be c, rispettivamente.

% echo a > a.txt
% echo b > b.txt
% echo c > c.txt

Quando apro tutti e tre questi file in una scheda, ottengo quanto segue.

inserisci qui la descrizione dell'immagine

Quindi posso passare a.txta una scheda da solo. Quando lo faccio, tuttavia, a.txtviene rimosso dalla pagina della scheda originale. (Quindi questo sarebbe dopo a <c-w>Tgt)

inserisci qui la descrizione dell'immagine

Vorrei la possibilità di scegliere nel momento in cui avrei premuto <c-w>Tper preservare il contenuto del buffer originale, creare una nuova scheda contenente solo il buffer attualmente focalizzato, quindi focalizzare la nuova scheda che ho appena creato. In altre parole, un comando è quasi esattamente uguale <c-w>Tall'eccezione che la pagina della scheda originale viene conservata e ora si a.txttrova in due schede.

C'è un modo per fare questo?

Risposte:


13

Non sono sicuro ma potresti provare :tab split(o la versione più breve :tab sp).

Il :splitcomando dovrebbe duplicare la visualizzazione della finestra a.txt, mentre il :tabmodificatore dovrebbe spostare questa finestra in una scheda dedicata.


Se si desidera modificare il comportamento di C-w T, è possibile rimappare in questo modo:

nnoremap <C-w>T :tab split<CR>

Più in generale, ogni volta che trovi un comando che divide la finestra e preferisci che crei una nuova scheda, puoi prefissarla :tab.

Può essere utilizzato, ad esempio, per leggere un buffer della guida in una nuova scheda:

:tab help {your_topic}

Per impostazione predefinita, la nuova scheda apparirà dopo quella corrente. Ma se vuoi farlo apparire altrove, puoi aggiungere il prefisso :tabcon un conteggio.

Ad esempio, per duplicare la finestra corrente in una scheda dopo la terza, è possibile digitare:

:3tab split

E per farlo apparire come il primo:

:0tab split

Per ulteriori informazioni, puoi leggere :h :tab:

:[count]tab {cmd}                   *:tab*
        Execute {cmd} and when it opens a new window open a new tab
        page instead.  Doesn't work for |:diffsplit|, |:diffpatch|,
        |:execute| and |:normal|.
        If [count] is given the new tab page appears after the tab
        page [count] otherwise the new tab page will appear after the
        current one.
        Examples:

            :tab split      " opens current buffer in new tab page
            :tab help gt    " opens tab page with help for "gt"
            :.tab help gt   " as above
            :+tab help      " opens tab page with help after the next
                            " tab page
            :-tab help      " opens tab page with help before the
                            " current one
            :0tab help      " opens tab page with help before the
                            " first one
            :$tab help      " opens tab page with help after the last
                            " one

2

Ho principalmente evitato le schede a causa di questo problema, ma ora ho una funzione che ha il comportamento di duplicazione delle schede che desidero. L'ho provato, ma non ho iniziato ad usarlo sul serio. Potrebbe esserci qualche inconveniente nascosto a questo flusso di lavoro.

Un problema con la funzione è che non duplica parte dello stato dalla precedente coppia buffer-window (come se set numbersia attiva o meno). Speculando un po ', c-w Tprobabilmente non ha questo problema perché non viene eseguita alcuna duplicazione e la finestra è probabilmente appena riparata.

Vim ha un paio di elenchi basati su 1 per cose come buffer, schede e finestre. Per quanto ne so, sono basati su 1 perché la 0chiave viene utilizzata per spostarsi all'inizio di una riga e, di conseguenza, passare zero come argomento numerico è impossibile.

Abbiamo a cuore tre elenchi per emulare questa funzionalità:

  • L'elenco globale delle pagine della scheda
  • L'elenco per- [tab page] di finestre
  • L'elenco globale di buffer

Salviamo tutti questi valori, quindi creiamo una nuova scheda tramite "tabnew". Le nuove schede vengono sempre create a destra, quindi nessuno degli indici sotto la scheda da cui tabnewverremmo invalidati. (Un modo più efficace per farlo sarebbe probabilmente meglio però).

Il tabnewcomando sposta inoltre lo stato attivo sulla nuova scheda e sulla singola finestra al suo interno. Da lì possiamo usare il buffercomando per creare una vista sul buffer che originariamente aveva il focus.

Quindi utilizziamo l'indice salvato della scheda originale per ripristinare lo stato attivo su quella scheda. E poi, in gran parte fuori dalla paranoia, mettiamo il focus all'interno di quella scheda sulla finestra originale. Vim sembra ricordare quale finestra è attiva nelle schede non visibili, ma non mi piace fare affidamento su di esso.

(Alcuni punti stilistici: la conversione numerica esplicita 0+, le variabili globali e le asserzioni sono tutte intenzionali)

function! TabDuplicate()
  " set vars, sanity checking
  let g:tabdup_win      = 0+ winnr()
  let g:tabdup_buf      = 0+ bufnr('%')
  let g:tabdup_tabpage  = 0+ tabpagenr()
  call assert_true(g:tabdup_win > 0)
  call assert_true(g:tabdup_buf > 0)
  call assert_true(g:tabdup_tabpage > 0)
  " make a new tab page,
  " the new tab page will have focus
  " none of the indices, which are all
  " less than the current index, are
  " invalidated by creating a new tab
  execute "tabnew"
  " visit the buffer we saved
  execute "buffer " . g:tabdup_buf
  " return to the original tab page
  execute "tabnext " . g:tabdup_tabpage
  " return focus to original window
  execute g:tabdup_win . " windcmd w"
endfunction
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.