Sposta la finestra esistente nella scheda esistente


14

A volte ho bisogno di spostare le finestre in una scheda già esistente e mi chiedevo se ci fosse un comando / scorciatoia da tastiera che potesse farlo. So di poter chiudere la finestra, passare alla scheda e quindi aprirla in una nuova divisione, ma mi chiedevo se ci fosse un modo più breve per farlo. Nota che voglio spostarlo in una scheda esistente , non in una nuova scheda come <C-w>Tfa.


Non è possibile spostare le finestre tra le schede.
lcd047,

Hmm, è troppo male. Probabilmente potrei creare qualche mappatura o comando che potrebbe realizzarlo però.
EvergreenTree

Penso che il meglio che puoi fare sia salvare tutte le impostazioni della finestra e quindi ricrearlo nella scheda esistente.
tommcdo,

Risposte:


10

Sebbene ci siano comandi per spostare le finestre esistenti nella pagina della scheda corrente (cioè influenzare il layout della finestra ruotando, ridimensionando e spostando), non ci sono comandi per spostare una finestra in un'altra scheda.

Poiché una finestra è solo una finestra in un buffer caricato, è necessario:

  1. Nota il numero di buffer visualizzato nella finestra corrente.
  2. :close! la finestra.
  3. Passa alla scheda di destinazione esistente.
  4. :sbuffer il numero del buffer per riaprirlo.

In questo modo perderai qualsiasi opzione specifica per la finestra. Puoi anche salvare e ripristinare quelli in uno script.


Ho pensato che fosse così. Probabilmente potrei fare una sceneggiatura che fa esattamente questo.
EvergreenTree

2
  1. vai alla scheda target esistente
  2. dividerlo come vuoi
  3. :b ab(tab-complete il resto)

absono solo lettere casuali, sostituiscile con l'inizio del nome file desiderato. :bil completamento della scheda ha funzionato molto bene per me, di solito può trovare il giusto buffer di origine basato su una sola lettera e 1-2 Tabtasti.

Il vantaggio di questo approccio rispetto a quello di Ingo è la mancanza di notare o ricordare qualcosa, il che significa meno carico cognitivo. Nome del file che già conosci comunque.


2

I due comandi definiti di seguito spostano tutti i buffer dalla scheda destra alla scheda corrente e quindi chiudono la scheda destra. Mtabspli sposta dividendosi in orizzontale e si Mtabvspdivide in verticale. È necessario spostare la scheda unita prima di utilizzare i comandi. Usa +tabm, -tabmo <n>tabm.

Impostare

Aggiungi il seguente script vim al tuo vimrc:

function! Mtab(vert)
    if tabpagenr() == tabpagenr("$")
        return 0
    endif
    +tabnext
    let s:killed_tab = tabpagenr()
    let s:buf_list = tabpagebuflist()
    -tabnext
    for item in s:buf_list
        if a:vert
            vsp
        else
            sp
        endif
        execute "buf " . item
    endfor
    execute "tabclose " . s:killed_tab
endfunction

command! Mtabsp call Mtab(0)
command! Mtabvsp call Mtab(1)

Dettagli tecnici

La funzione Mtab riceve un parametro vert. Determina se la scheda corrente è divisa in orizzontale o in verticale.

Il risultato desiderato si ottiene con le seguenti fasi:

  1. Passiamo temporaneamente alla scheda successiva
  2. Utilizzare due variabili per fare riferimento al numero di scheda e ai buffer
  3. Ritorna alla scheda corrente
  4. Dividiamo la scheda e apriamo ogni buffer
  5. Infine, chiudiamo la scheda a destra

Se la nostra scheda corrente è l'ultima, i comandi vengono ignorati.


1

Se è un buffer di file (non funziona per i buffer di memoria virtuale, ecc.), Puoi:

  1. :let @f=@%ENTER - nella finestra sorgente;
    • Questo sostituisce i contenuti del registro regolare f con i contenuti del registro speciale % , che contiene il nome del file corrente.
    • Nota: ho scelto il registro f come nel file , ma è possibile utilizzare qualsiasi altro registro che ti piace.
    • Puoi verificare che il registro contenga il percorso corretto con: :echo @f
  2. Opzionalmente: Ctrl-WCtrl-Q- per chiudere la vecchia finestra;
  3. gt/ gT- passa alla scheda (e alla finestra) di destinazione;
  4. Ctrl-Ws - dividi la scheda come preferisci, per aprire una nuova finestra;
  5. :e␣Ctrl-RfENTER
    • nella finestra appena aperta, carica un file dal percorso memorizzato nel registro f ;
    • Nota: il carattere here qui segna uno spazio normale.

Nota importante: il passaggio finale non funzionerà correttamente se il percorso contiene spazi o alcuni caratteri speciali! :-( Per ovviare al problema, il comando seguente, leggermente più lungo, dovrebbe funzionare per i percorsi con spazi (sebbene possa ancora non riuscire per alcuni altri caratteri speciali):

  • :e␣"Ctrl-Rf"ENTER

(ovvero, citando il risultato di Ctrl-R, f )

Ispirato dalle risposte di lkraav e ingo-karkat .


Questo è fantastico, ho bisogno di impostare una mappatura per "tagliare e incollare" di Windows in schede.
dragon788,
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.