Скопіюйте буфер на нову вкладку, а не переміщуючи її


10

Я часто хочу тимчасово збільшити розмір буфера на сторінці вкладки, а потім повернутися до старої конфігурації буфера, яку я переглядав. Мій поточний робочий процес для того, щоб зробити щось подібне, це або закрити всі інші буфери, що використовуються, <c-w>oабо перемістити буфер, який я зараз переглядаю, на його власну вкладку <c-w>T. Проблема другого підходу полягає в тому, що він видаляє буфер із початкової сторінки вкладки.

Я заселити три файли a.txt, b.txtі c.txtз a, bі cвідповідно.

% echo a > a.txt
% echo b > b.txt
% echo c > c.txt

Коли я відкриваю всі ці три файли на одній сторінці вкладки, я отримую наступне.

введіть тут опис зображення

Тоді я можу перейти a.txtна вкладку самостійно. Однак я все-таки a.txtвидаляється із початкової сторінки вкладки. (Отже, це було б після <c-w>Tgt)

введіть тут опис зображення

Я хотів би можливість вибору в той час, я б пресованим <c-w>Tзберегти вміст вихідного буфера, створити нову закладку , що містять тільки буфер , який в даний час зосереджений, а потім зосередитися на нову закладці Я просто створено. Іншими словами, команда майже точно подобається <c-w>Tза винятком того, що збережена початкова сторінка вкладок і тепер a.txtзнаходиться на двох сторінках вкладок.

Чи є спосіб це зробити?

Відповіді:


13

Я не впевнений, але ви можете спробувати :tab split(або коротша версія :tab sp).

:splitКоманда повинна дублювати вікно перегляду , що відображає a.txt, в той час як :tabмодифікатор повинен перемістити це видове вікно на виділену закладку.


Якщо ви хочете змінити поведінку C-w T, ви можете змінити її так:

nnoremap <C-w>T :tab split<CR>

Більш загально, кожен раз, коли ви знайдете команду, яка розбиває вікно, і ви, скоріше, вона створить нову сторінку вкладки, ви можете встановити префікс :tab.

Його можна використовувати, наприклад, для читання буфера допомоги на новій сторінці вкладки:

:tab help {your_topic}

За замовчуванням нова сторінка вкладки з’явиться після поточної. Але якщо ви хочете, щоб він з’явився десь в іншому місці, ви можете :tabвстановити префікс з кількістю.

Наприклад, щоб дублювати поточний огляд перегляду на сторінці вкладки після 3-го, ви можете ввести:

:3tab split

І щоб він виглядав як перший:

:0tab split

Для отримання додаткової інформації ви можете прочитати :h :tab:

:[count]tab {cmd}                   *:tab*
        Execute {cmd} and when it opens a new window open a new tab
        page instead.  Doesn't work for |:diffsplit|, |:diffpatch|,
        |:execute| and |:normal|.
        If [count] is given the new tab page appears after the tab
        page [count] otherwise the new tab page will appear after the
        current one.
        Examples:

            :tab split      " opens current buffer in new tab page
            :tab help gt    " opens tab page with help for "gt"
            :.tab help gt   " as above
            :+tab help      " opens tab page with help after the next
                            " tab page
            :-tab help      " opens tab page with help before the
                            " current one
            :0tab help      " opens tab page with help before the
                            " first one
            :$tab help      " opens tab page with help after the last
                            " one

2

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

Одна з проблем функції полягає в тому, що вона не дублює деякий стан з попередньої пари буфер-вікна (наприклад, включено set numberчи ні). Спекуляції трохи, c-w Tмабуть, не має цієї проблеми, оскільки дублювання не виконується, і вікно, ймовірно, просто відремонтоване.

Vim має пару списків на основі 1 для таких речей, як буфери, вкладки та вікна. Наскільки я можу сказати, вони базуються на 1, оскільки 0ключ використовується для переміщення на початок рядка, і в результаті проходження нуля як числового аргументу неможливо.

Ми дбаємо про три списки для емуляції цієї функціональності:

  • Глобальний список сторінок вкладок
  • Список вікон per [[вкладка]
  • Глобальний список буферів

Ми зберігаємо всі ці значення, а потім створюємо нову вкладку через "tabnew". Нові вкладки завжди створюються праворуч, тому жоден з індексів нижче вкладки, з якої ми tabnewзнаходимось, недійсний. (Можливо, більш надійний спосіб зробити це).

tabnewКоманда також переміщує фокус на нову вкладку і єдине вікно в ньому. Звідти ми можемо використовувати bufferкоманду для створення подання на буфер, який спочатку мав фокус.

Потім ми використовуємо збережений індекс початкової вкладки, щоб відновити фокус назад до цієї вкладки. І тоді, значною мірою поза параної, ми задаємо фокус всередині цієї вкладки на початкове вікно. Vim, схоже, пам’ятає, яке вікно має фокус на невидимих ​​вкладках, але мені не подобається покладатися на це.

(Кілька стилістичних моментів: явне числове перетворення 0+, глобальні змінні та твердження - все навмисне)

function! TabDuplicate()
  " set vars, sanity checking
  let g:tabdup_win      = 0+ winnr()
  let g:tabdup_buf      = 0+ bufnr('%')
  let g:tabdup_tabpage  = 0+ tabpagenr()
  call assert_true(g:tabdup_win > 0)
  call assert_true(g:tabdup_buf > 0)
  call assert_true(g:tabdup_tabpage > 0)
  " make a new tab page,
  " the new tab page will have focus
  " none of the indices, which are all
  " less than the current index, are
  " invalidated by creating a new tab
  execute "tabnew"
  " visit the buffer we saved
  execute "buffer " . g:tabdup_buf
  " return to the original tab page
  execute "tabnext " . g:tabdup_tabpage
  " return focus to original window
  execute g:tabdup_win . " windcmd w"
endfunction
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.