Есть ли команда vim для перемещения вкладки?


200

Как я могу изменить положение / порядок моей текущей вкладки в Vim? Например, если я хочу изменить свою текущую вкладку, чтобы быть первой вкладкой?

Ответы:


271

Вы можете переместить вкладку, :tabmиспользуя относительные аргументы или абсолютные аргументы с нулевым индексом.

абсолют:

  • Переместите вкладку в положение i: :tabm i

родственник:

  • Переместить вкладку i на позиции вправо: :tabm +i
  • Переместить табуляцию i влево: :tabm -i

Это относительно новая функция. Так что, если это не сработает, попробуйте обновить vim.


2
Это не работает : tabm не принимает относительные аргументы, хотя это действительно должно быть.
Гэвин

6
Вы должны обновить ваш vim, если он этого не делает, потому что :tabmпринимает относительные аргументы в vim 7.3.
Maybeshewill

У меня есть VIM - Vi IMproved 7.3 (15 августа 2010 г., скомпилировано 2 апреля 2013 г. 09:17:34) Включенные исправления: 1-547 и + - там не поддерживаются, в документации сказано, что я должен указать нулевое или положительное значение
Владимир

6
Обратите внимание, что абсолютная позиция является нулевым индексом, что немного странно, поскольку vim отображает вкладки с 1 индексом (или это может быть просто моя конфигурация vim)
Эллиот Фостер

1
Это не касается случая упаковки
Энди Рэй

38

Вы имеете в виду перемещение текущей вкладки? Это работает с использованием 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.

У меня есть две привязки клавиш, которые перемещают мою текущую вкладку на одну влево или одну вправо. Очень кстати!

РЕДАКТИРОВАТЬ: Вот мой макрос VIM. Я не большой виМ кодер , так что, возможно, это можно сделать лучше, но вот как это работает для меня:

" 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

После этого вы можете связать ключи, например, так .vimrc:

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

Теперь вы можете перемещать текущую вкладку, нажимая F9 или F10.


Хм ... так что для перемещения вкладки на одну позицию влево или вправо требуется скрипт? Вы можете вставить это?
Гэвин

2
Я добавил свои сценарии. Вам это помогает?
hochl

25

Я искал то же самое, и после некоторых сообщений я нашел более простой способ, чем функция:

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

Tabpagenr () возвращает фактическое положение вкладки и tabmove использует индексы.

Я сопоставил правую клавишу Ctrl + L, а левую - Ctrl + H:

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

1
Это не касается упаковки, FYI
Энди Рэй

2
Я должен был использовать :execute "tabmove" tabpagenr() + 1 <CR>для перемещения вправо. Для MacVim 8.0.1420 (144) .
Пол Оливер

5

Переместить текущую вкладку в n- ю позицию

:tabm n

Где nчисло, обозначающее позицию (начиная с нуля)


Переместить вкладки влево / вправо

Я думаю, что лучшее решение состоит в том, чтобы переместить вкладку влево или вправо в ее текущее положение вместо того, чтобы вычислять числовое значение новой позиции, в которой вы хотите ее разместить.

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

С помощью приведенных выше комбинаций клавиш вы сможете перемещать текущую вкладку:

  • Слева используя: Alt +Left
  • Справа с помощью: Alt +Right

Есть ли разница между +tabmoveи tabmove+? Имеет ли значение положение?

4

В дополнение к хорошим предложениям в других ответах, вы также можете просто перетаскивать вкладки мышью, чтобы перемещать их, если у вас включена поддержка мыши.

Это включено по умолчанию в MacVim и других реализациях GUI vim, независимо от того, используете ли вы вкладки виджетов GUI или вкладки стилей терминала в режиме GUI.

Он также работает в чистом tty режиме Vim, если у вас есть set mouse=aи есть подходящий терминал (xterm и большинство его эмуляторов, такие как gnome-терминал, Terminal.app, iTerm2 и PuTTY / KiTTY, чтобы назвать представление). Обратите внимание, что щелчки мыши за столбцом 222 также требуют set ttymouse=sgr; см. в Vim, почему моя мышь не работает после 220-го столбца? для фона на это.

Я написал плагин под названием vim-tabber, который предоставляет некоторые дополнительные функции для переключения вкладок, их смещения и добавления к возможностям встроенных команд манипулирования вкладками, при этом оставаясь в значительной степени совместимым со встроенными модулями. Даже если вы решите не использовать плагин, в README есть некоторая общая информация об использовании вкладок.


после изменения расположения вкладки с помощью мыши я больше не могу изменять размер панели с помощью мыши. Вместо этого каждый раз, когда я щелкаю и перетаскиваю курсор мыши, вкладки снова меняются, как будто щелчок мыши «застрял». Ты хоть представляешь, что здесь происходит?
17

Джим, я разместил вопрос отдельно: stackoverflow.com/questions/43734501/…
gmile

1

Почему-то у меня перестала работать функция ответа. Я подозреваю конфликт с vim-ctrlspace . Несмотря на это, математика в ответе функции не нужна, поскольку Vim может перемещать вкладки влево и вправо с помощью встроенных функций. Нам просто нужно обработать упаковку , потому что Vim не удобен для пользователя.

" 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>

В -tabmи +tabmмой vim 7.4 не правильно перемещать вкладки. Также my :help tabmне перечисляет это как допустимый синтаксис. Поэтому я заменил последнее else execute ...endifс elseif a:direction == 1 execute "tabmove" s:current_tab else execute "tabmove" s:current_tab - 2 endif использованием ответа Пабло
Cfi

Для переноса в начало / конец я сейчас использую это решение поверх своего, потому что я использовал две функции и его очиститель кода для чтения и поддержки. Просто поменял местами порядок tabmoveи знак -/ +в executeстроке.
сл.

1

Вот мой макрос, использующий относительные аргументы из ответа @ 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>

Он обрабатывает упаковочный футляр.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.