Czy istnieje polecenie vim do przeniesienia karty?

200

Jak mogę zmienić pozycję / kolejność mojej bieżącej karty Vim? Na przykład, jeśli chcę zmienić pozycję mojej bieżącej karty na pierwszą?

Gavin
źródło

Odpowiedzi:

271

Możesz przenieść kartę za :tabmpomocą względnych lub bezwzględnych argumentów o indeksie zerowym.

absolutny:

  • Przesuń zakładkę do pozycji i: :tabm i

krewny:

  • Przesuń tab i pozycje w prawo: :tabm +i
  • Przesuń tab i pozycje w lewo: :tabm -i

To stosunkowo nowa funkcja. Więc jeśli to nie działa spróbuj zaktualizować vima.

moze powinna
źródło
2
To nie działa : tabm nie akceptuje względnych argumentów, chociaż tak naprawdę powinno.
Gavin,
6
Powinieneś zaktualizować vima, jeśli nie, ponieważ :tabmakceptuje względne argumenty w vimie 7.3.
maybeshewill
Mam VIM - Vi IMproved 7.3 (15 sierpnia 2010, skompilowany 2 kwietnia 2013 09:17:34) Zawarte łaty: 1-547 i + - nie są tam obsługiwane, dokumentacja mówi, że powinienem podać zero lub wartość dodatnią
Vladimir
6
Zauważ, że pozycja bezwzględna to zero-index, co jest trochę dziwne, ponieważ vim wyświetla zakładki 1-indeksowane (lub może to być tylko moja konfiguracja vim)
Elliot Foster
1
To nie zajmuje się pakowaniem
Andy Ray
38

Masz na myśli przesunięcie bieżącej karty? Działa to przy użyciu 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.

Mam dwa powiązania klawiszy, które przesuwają moją bieżącą kartę o jeden w lewo lub jeden w prawo. Bardzo przydatne!

EDYCJA: Oto moje makro VIM. Nie jestem wielkim programistą ViM , więc może lepiej to zrobić, ale tak to działa dla mnie:

" 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

Następnie możesz powiązać klucze, na przykład w następujący sposób .vimrc:

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

Teraz możesz przenieść bieżącą kartę, naciskając F9 lub F10.

hochl
źródło
Hmm ... więc przenoszenie karty o jedną pozycję w lewo lub w prawo wymaga skryptu? Czy możesz to wkleić?
Gavin
2
Dodałem moje skrypty. Czy to ci pomaga?
hochl
25

Szukałem tego samego i po kilku postach znalazłem prostszy sposób niż funkcję:

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

Tabpagenr () zwraca rzeczywiste położenie zakładki i tabmove wykorzystuje indeksów.

Odwzorowałem prawą stronę na Ctrl + L, a lewą na Ctrl + H:

map <C-H> :execute "tabmove" tabpagenr() - 2 <CR>
map <C-J> :execute "tabmove" tabpagenr() <CR>
Pablo Díaz Ogni
źródło
1
To nie obsługuje opakowania, FYI
Andy Ray,
2
Musiałem użyć :execute "tabmove" tabpagenr() + 1 <CR>do przejścia w prawo. Dla MacVim 8.0.1420 (144) .
Paul Oliver
5

Przenieś bieżącą kartę do n- tej pozycji

:tabm n

Gdzie njest liczba oznaczająca pozycję (od zera)


Przenieś karty w lewo / w prawo

Myślę, że lepszym rozwiązaniem jest przesunięcie tabulatora w lewo lub w prawo do jego aktualnej pozycji zamiast obliczania wartości liczbowej nowej pozycji, w której chcesz.

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

Dzięki powyższym mapom klawiszy możesz przenieść bieżącą kartę:

  • W lewo za pomocą: Alt +Left
  • W prawo za pomocą: Alt +Right
Sheharyar
źródło
Czy jest jakaś różnica między +tabmovei tabmove+? Czy pozycja ma znaczenie?
4

Oprócz drobnych sugestii w innych odpowiedziach, możesz także przeciągać tabulatory za pomocą myszy, aby je przenosić, jeśli masz włączoną obsługę myszy.

Jest to domyślnie włączone w MacVim i innych implementacjach GUI vim, bez względu na to, czy korzystasz z kart widgetów GUI, czy kart stylów terminali w trybie GUI.

Działa również w trybie VIM w czystym tty, jeśli masz set mouse=ai masz odpowiedni terminal (xterm i większość jego emulatorów, takich jak gnome-terminal, Terminal.app, iTerm2 i PuTTY / KiTTY, aby nazwać widok). Pamiętaj, że kliknięcia myszą poza kolumną 222 również wymagają set ttymouse=sgr; zobacz w Vimie, dlaczego moja mysz nie działa poza 220. kolumną? na tle tego.

Napisałem wtyczkę o nazwie vim-tabber, która zapewnia pewne dodatkowe funkcje do zamiany kart, przesuwania ich i dodawania możliwości wbudowanych poleceń manipulacji tabulatorami, pozostając w dużej mierze kompatybilnymi z wbudowanymi. Nawet jeśli zdecydujesz się nie używać wtyczki, w pliku README znajduje się kilka ogólnych informacji o użyciu kart.

Jim Stewart
źródło
po ponownym rozmieszczeniu karty za pomocą myszy nie mogę już zmieniać rozmiaru okienka za pomocą myszy. Zamiast tego za każdym razem, gdy klikam i przeciągam kursor myszy, zakładki zmieniają się ponownie, tak jakby kliknięcie myszy „utknęło”. Czy masz pojęcie, co się tutaj dzieje?
gmile
Jim,
wysłałem
1

Z jakiegoś powodu funkcja przestała działać. Podejrzewam konflikt z vim-ctrlspace . Niezależnie od tego, matematyka w odpowiedzi na funkcję jest niepotrzebna, ponieważ Vim może przesuwać tabulatory w lewo i prawo dzięki wbudowanym funkcjom. Musimy po prostu poradzić sobie z opakowaniem , ponieważ Vim nie jest przyjazny dla użytkownika.

" 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
źródło
-tabmI +tabmmoim vim 7.4 nie prawidłowo przenieść karty. Również mój :help tabmnie wymienia tego jako prawidłowej składni. Więc otrzymuje ostatni else execute ...endifz elseif a:direction == 1 execute "tabmove" s:current_tab else execute "tabmove" s:current_tab - 2 endif użyciem Pablo odpowiedź
CFI
Do pakowania / rozpoczynania / kończenia używam teraz tego rozwiązania samodzielnie, ponieważ użyłem dwóch funkcji i jego narzędzia do czyszczenia kodu do odczytu i obsługi. Właśnie odwróciłem kolejność tabmovei znak -/ +w executelinii.
rld.
1

Oto moje makro, używając względnych argumentów z odpowiedzi @ 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>

Obsługuje opakowanie owijające.

Jérôme
źródło