Gibt es einen vim-Befehl zum Verschieben einer Registerkarte?

200

Wie kann ich die Position / Reihenfolge meiner aktuellen Registerkarte ändern Vim? Wenn ich beispielsweise meine aktuelle Registerkarte als erste Registerkarte neu positionieren möchte?

Gavin
quelle

Antworten:

271

Sie können eine Registerkarte mit :tabmrelativen oder absoluten Nullindexargumenten verschieben.

absolut:

  • Bewegen Sie die Registerkarte an Position i: :tabm i

relativ:

  • Verschieben Sie die Positionen der Registerkarte i nach rechts: :tabm +i
  • Verschieben Sie die Positionen der Registerkarte i nach links: :tabm -i

Es ist eine relativ neue Funktion. Wenn es nicht funktioniert, aktualisieren Sie Ihr vim.

vielleicht wird sie
quelle
2
Das funktioniert nicht. : tabm akzeptiert keine relativen Argumente, obwohl es wirklich sollte.
Gavin
6
Sie sollten Ihr vim aktualisieren, wenn dies nicht der Fall ist, da :tabmin vim 7.3 relative Argumente akzeptiert werden.
Maybeshewill
Ich habe VIM - Vi IMproved 7.3 (2010 Aug 15, kompiliert 2. April 2013 09:17:34) Enthaltene Patches: 1-547 und + - dort nicht unterstützt, Dokumentation besagt, ich sollte Null oder positiven Wert angeben
Vladimir
6
Beachten Sie, dass die absolute Position Null-Index ist, was etwas seltsam ist, da vim Tabs mit 1-Index anzeigt (oder es könnte nur meine vim-Konfiguration sein)
Elliot Foster
1
Dies behandelt nicht die Verpackung Fall
Andy Ray
38

Meinen Sie damit, die aktuelle Registerkarte zu verschieben? Dies funktioniert mit 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.

Ich habe zwei Tastenkombinationen, die meine aktuelle Registerkarte nach links oder rechts verschieben. Sehr praktisch!

EDIT: Hier ist mein VIM-Makro. Ich bin kein großer ViM- Codierer, also könnte es vielleicht besser gemacht werden, aber so funktioniert es bei mir:

" 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

Danach können Sie Schlüssel binden, zum Beispiel wie folgt in .vimrc:

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

Jetzt können Sie Ihre aktuelle Registerkarte verschieben, indem Sie F9 oder F10 drücken.

hochl
quelle
Hmm ... also erfordert das Verschieben eines Tabs um eine Position nach links oder rechts ein Skript? Kannst du es einfügen?
Gavin
2
Ich habe meine Skripte hinzugefügt. Hilft dir das?
hochl
25

Ich habe nach dem gleichen gesucht und nach einigen Beiträgen einen einfacheren Weg als eine Funktion gefunden:

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

Die tabpagenr () gibt die aktuelle Registerkarte Position, und tabmove verwendet Indizes.

Ich habe rechts Strg + L und links Strg + H zugeordnet:

map <C-H> :execute "tabmove" tabpagenr() - 2 <CR>
map <C-J> :execute "tabmove" tabpagenr() <CR>
Pablo Díaz Ogni
quelle
1
Dies behandelt nicht die Verpackung Fall, FYI
Andy Ray
2
Ich musste mich :execute "tabmove" tabpagenr() + 1 <CR>nach rechts bewegen. Für MacVim 8.0.1420 (144) .
Paul Oliver
5

Bewegen Sie die Registerkarte Aktuell an die n- te Position

:tabm n

Wo nist eine Zahl, die die Position bezeichnet (beginnend bei Null)?


Bewegen Sie die Registerkarten nach links / rechts

Ich denke, eine bessere Lösung besteht darin, die Registerkarte nach links oder rechts an ihre aktuelle Position zu verschieben, anstatt den numerischen Wert der neuen Position herauszufinden, an der Sie sie haben möchten.

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

Mit den obigen Keymaps können Sie die aktuelle Registerkarte verschieben:

  • Links mit: Alt +Left
  • Rechts mit: Alt +Right
Sheharyar
quelle
Gibt es einen Unterschied zwischen +tabmoveund tabmove+? Ist die Position wichtig?
4

Zusätzlich zu den feinen Vorschlägen in anderen Antworten können Sie Tabs auch einfach mit der Maus ziehen, um sie zu verschieben, wenn Sie die Mausunterstützung aktiviert haben.

Dies ist in MacVim und anderen GUI vim-Implementierungen standardmäßig aktiviert, unabhängig davon, ob Sie die GUI-Widget-Registerkarten oder die Registerkarten im Terminalstil im GUI-Modus verwenden.

Es funktioniert auch im reinen tty-Modus Vim, wenn Sie set mouse=aein geeignetes Terminal haben und haben (xterm und die meisten Emulatoren davon, wie gnome-terminal, Terminal.app, iTerm2 und PuTTY / KiTTY, um eine Ansicht zu benennen). Beachten Sie, dass auch Mausklicks über Spalte 222 hinaus erforderlich sind set ttymouse=sgr. siehe In Vim, warum funktioniert meine Maus nicht über die 220. Spalte hinaus? für den Hintergrund dazu.

Ich habe ein Plugin namens vim-tabber geschrieben , das einige zusätzliche Funktionen zum Vertauschen, Verschieben und Verschieben von Registerkarten bietet und die Funktionen der integrierten Befehle zur Manipulation von Registerkarten erweitert, während es weitgehend mit den integrierten Funktionen kompatibel bleibt. Selbst wenn Sie das Plugin nicht verwenden, finden Sie in der README-Datei einige allgemeine Informationen zur Verwendung von Registerkarten.

Jim Stewart
quelle
Nachdem ich die Registerkarte mit der Maus neu angeordnet habe, kann ich die Größe des Fensters nicht mehr mit der Maus ändern. Stattdessen werden die Registerkarten jedes Mal neu angeordnet, wenn ich mit dem Mauszeiger klicke und ziehe, als ob der Mausklick "stecken geblieben" wäre. Haben Sie eine Idee, was hier los sein könnte?
Meile
Jim, ich habe die Frage separat gestellt: stackoverflow.com/questions/43734501/…
gmile
1

Aus irgendeinem Grund funktionierte die Funktionsantwort bei mir nicht mehr. Ich vermute einen Konflikt mit vim-ctrlspace . Unabhängig davon ist die Mathematik in der Funktionsantwort nicht erforderlich, da Vim die Registerkarten mit integrierten Funktionen nach links und rechts verschieben kann. Wir müssen uns nur um den Verpackungskoffer kümmern , da Vim nicht benutzerfreundlich ist.

" 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>
Andy Ray
quelle
Die -tabmund +tabmin meinem vim 7.4 verschieben Tabs nicht richtig. Auch my :help tabmlistet dies nicht als gültige Syntax auf. So ersetzen ich die letzte else execute ...endifmit elseif a:direction == 1 execute "tabmove" s:current_tab else execute "tabmove" s:current_tab - 2 endif mit Pablos Antwort
cfi
Damit das Umbrechen beginnt / endet, verwende ich diese Lösung jetzt über meine eigene, da ich zwei Funktionen und seinen Code-Cleaner zum Lesen und Verwalten verwendet habe. Habe gerade die Reihenfolge tabmoveund das -/ +-Zeichen in der executeZeile umgekehrt .
rld.
1

Hier ist mein Makro mit relativen Argumenten aus der Antwort von @ 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>

Es behandelt den Verpackungskoffer.

Jérôme
quelle