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

200

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

Gavin
источник

Ответы:

271

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

абсолют:

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

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

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

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

Maybeshewill
источник
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.

hochl
источник
Хм ... так что для перемещения вкладки на одну позицию влево или вправо требуется скрипт? Вы можете вставить это?
Гэвин
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
Sheharyar
источник
Есть ли разница между +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>

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

Жером
источник