Esiste un comando vim per riposizionare una scheda?


200

Come posso modificare la posizione / ordine della mia scheda attuale in Vim? Ad esempio, se voglio riposizionare la mia scheda corrente in modo che sia la prima scheda?

Risposte:


271

È possibile riposizionare una scheda :tabmutilizzando argomenti assoluti relativi o con indice zero.

assoluto:

  • Sposta la scheda in posizione i: :tabm i

parente:

  • Sposta la scheda i posizioni a destra: :tabm +i
  • Sposta la scheda i posizioni a sinistra: :tabm -i

È una funzionalità relativamente nuova. Quindi, se non funziona, prova ad aggiornare il tuo VIM.


2
Questo non funziona : tabm non accetta argomenti relativi, anche se dovrebbe davvero.
Gavin,

6
In caso contrario, è necessario aggiornare VIM, poiché :tabmaccetta argomenti relativi in ​​Vim 7.3.
Maybeshewill,

Ho VIM - Vi IMproved 7.3 (15 agosto 2010, compilato il 2 aprile 2013 09:17:34) Patch incluse: 1-547 e + - non supportate lì, la documentazione dice che dovrei specificare zero o valore positivo
Vladimir

6
Nota che la posizione assoluta è zero-index, il che è un po 'strano dal momento che vim mostra le schede 1-index (o potrebbe essere solo la mia configurazione di vim)
Elliot Foster

1
Questo non gestisce la confezione
Andy Ray,

38

Intendi spostare la scheda corrente? Funziona con tabmove.

:tabm[ove] [N]                                          *:tabm* *:tabmove*
            Move the current tab page to after tab page N.  Use zero to
            make the current tab page the first one.  Without N the tab
            page is made the last one.

Ho due combinazioni di tasti che spostano la mia scheda corrente a sinistra o a destra. Molto maneggevole!

EDIT: ecco la mia macro VIM. Non sono un grande programmatore ViM , quindi forse potrebbe essere fatto meglio, ma è così che funziona per me:

" Move current tab into the specified direction.
"
" @param direction -1 for left, 1 for right.
function! TabMove(direction)
    " get number of tab pages.
    let ntp=tabpagenr("$")
    " move tab, if necessary.
    if ntp > 1
        " get number of current tab page.
        let ctpn=tabpagenr()
        " move left.
        if a:direction < 0
            let index=((ctpn-1+ntp-1)%ntp)
        else
            let index=(ctpn%ntp)
        endif

        " move tab page.
        execute "tabmove ".index
    endif
endfunction

Dopodiché puoi associare le chiavi, ad esempio così nel tuo .vimrc:

map <F9> :call TabMove(-1)<CR>
map <F10> :call TabMove(1)<CR>

Ora puoi spostare la scheda corrente premendo F9 o F10.


Hmm ... quindi spostare una scheda di una posizione a sinistra oa destra richiede uno script? Puoi incollarlo?
Gavin,

2
Ho aggiunto i miei script. Questo ti aiuta?
Hochl,

25

Stavo cercando lo stesso e dopo alcuni post ho trovato un modo più semplice di una funzione:

:execute "tabmove" tabpagenr() # Move the tab to the right
:execute "tabmove" tabpagenr() - 2 # Move the tab to the left

Il tabpagenr () restituisce la posizione attuale scheda, e tabmove utilizza gli indici.

Ho mappato la destra su Ctrl + L e la sinistra su Ctrl + H:

map <C-H> :execute "tabmove" tabpagenr() - 2 <CR>
map <C-J> :execute "tabmove" tabpagenr() <CR>

1
Questo non gestisce la confezione, FYI
Andy Ray del

2
Ho dovuto usare :execute "tabmove" tabpagenr() + 1 <CR>per spostarmi a destra. Per MacVim 8.0.1420 (144) .
Paul Oliver,

5

Sposta la scheda corrente al n ° posizione

:tabm n

Dove nè un numero che indica la posizione (a partire da zero)


Sposta le schede verso sinistra / destra

Penso che una soluzione migliore sia quella di spostare la scheda a sinistra o a destra nella sua posizione corrente invece di capire il valore numerico della nuova posizione in cui la desideri.

noremap <A-Left>  :-tabmove<cr>
noremap <A-Right> :+tabmove<cr>

Con le mappe di tasti di cui sopra, sarai in grado di spostare la scheda corrente:

  • A sinistra usando: Alt +Left
  • A destra usando: Alt +Right

C'è qualche differenza tra +tabmovee tabmove+? La posizione è importante?

4

Oltre ai suggerimenti di precisione in altre risposte, puoi anche semplicemente trascinare le schede con il mouse per spostarle, se hai il supporto del mouse abilitato.

Questo è attivo per impostazione predefinita in MacVim e altre implementazioni vim della GUI, sia utilizzando le schede del widget GUI sia le schede di stile del terminale in modalità GUI.

Funziona anche in modalità Vty, se hai set mouse=ae disponi di un terminale adatto (xterm e la maggior parte degli emulatori, come gnome-terminal, Terminal.app, iTerm2 e PuTTY / KiTTY, per nominare una vista). Si noti che sono necessari anche clic del mouse oltre la colonna 222 set ttymouse=sgr; vedi In Vim, perché il mio mouse non funziona oltre la 220a colonna? per lo sfondo.

Ho scritto un plug-in chiamato vim-tabber che fornisce alcune funzionalità aggiuntive per scambiare le schede, spostarle e aggiungerle alle capacità dei comandi di manipolazione delle schede incorporate, pur rimanendo ampiamente compatibile con i builtin. Anche se si sceglie di non utilizzare il plug-in, nel README sono presenti alcune informazioni generali sull'utilizzo della scheda.


dopo aver riorganizzato la scheda usando il mouse, non posso più ridimensionare il riquadro usando il mouse. Invece, ogni volta che clicco e trascino il cursore del mouse, le schede si riorganizzano di nuovo, come se il clic del mouse "bloccato". Hai idea di cosa potrebbe succedere qui?
gmile

Jim, ho postato la domanda a parte: stackoverflow.com/questions/43734501/...
gmile

1

Per qualche motivo, la risposta alla funzione ha smesso di funzionare per me. Sospetto un conflitto con vim-ctrlspace . Indipendentemente da ciò, la matematica nella risposta della funzione non è necessaria, poiché Vim può spostare le schede a destra e sinistra con le funzioni integrate. Dobbiamo solo gestire la custodia , perché Vim non è facile da usare.

" Move current tab into the specified direction.
"
" @param direction -1 for left, 1 for right.
function! TabMove(direction)
    let s:current_tab=tabpagenr()
    let s:total_tabs = tabpagenr("$")

    " Wrap to end
    if s:current_tab == 1 && a:direction == -1
        tabmove
    " Wrap to start
    elseif s:current_tab == s:total_tabs && a:direction == 1
        tabmove 0
    " Normal move
    else
        execute (a:direction > 0 ? "+" : "-") . "tabmove"
    endif
    echo "Moved to tab " . tabpagenr() . " (previosuly " . s:current_tab . ")"
endfunction

" Move tab left or right using Command-Shift-H or L
map <D-H> :call TabMove(-1)<CR>
map <D-L> :call TabMove(1)<CR>

Il -tabme +tabmnel mio vim 7.4 non spostano correttamente le schede. Inoltre my :help tabmnon elenca questo come una sintassi valida. Quindi ho sostituito l'ultimo else execute ...endifcon l' elseif a:direction == 1 execute "tabmove" s:current_tab else execute "tabmove" s:current_tab - 2 endif uso della risposta di Pablo
cfi

Per iniziare / finire il wrapping, sto usando questa soluzione ora per conto mio perché ho usato due funzioni e il suo pulitore di codice per leggere e mantenere. Ho appena invertito l'ordine di tabmovee il segno -/ +nella executeriga.
rld.

1

Ecco la mia macro, usando argomenti relativi dalla risposta di @ maybeshewill:

" Shortcuts to move between tabs with Ctrl+Shift+Left/Right
function TabLeft()
   if tabpagenr() == 1
      execute "tabm"
   else
      execute "tabm -1"
   endif
endfunction

function TabRight()
   if tabpagenr() == tabpagenr('$')
      execute "tabm" 0
   else
      execute "tabm +1"
   endif
endfunction

map <silent><C-S-Right> :execute TabRight()<CR>
map <silent><C-S-Left> :execute TabLeft()<CR>

Gestisce la custodia.

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.