Чи є команда 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 (2010, 15 серпня, складено 2 квітня 2013 09:17:34) Включено патчі: 1-547 та + - там не підтримується, в документації сказано, що я повинен вказати нульове або додатне значення
Володимир

6
Зауважте, що абсолютна позиція - нульовий індекс, що трохи дивно, оскільки vim відображає вкладки 1-індексованими (або це може бути просто конфігурація vim)
Elliot Foster

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.

У мене є дві ключові прив’язки, які переміщують мою поточну вкладку вліво або вправо. Дуже зручно!

EDIT: Ось мій макрос VIM. Я не великий кодер 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, Terminal.app, iTerm2 і PuTTY / KiTTY, щоб назвати перегляд). Зауважте, що також потрібні клацання миші поза стовпцем 222 set ttymouse=sgr; див. у Vim, чому моя миша не працює повз 220-ту колонку? для фону на цьому.

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


після перестановки вкладки за допомогою миші я більше не можу змінити розмір панелі за допомогою миші. Натомість, кожного разу, коли я клацаю та перетягую курсор миші, вкладки знову переставляються, як ніби натискання миші «застрягло». Чи маєте ви якесь уявлення, що тут може статися?
гміль

Джим, я відправив питання окремо: 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 неправильно переміщати вкладки. Також мій :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рядку.
rld.

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.