Як прив’язати набір буферів до вкладки?


14

Коли мені потрібно одночасно працювати над різними проектами, у мене є наступний робочий процес:

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

Для навігації між моїми буферами я не дуже використовую, :lsі :b [name or number of buffer]натомість я створив зручні відображення, що дозволяють мені перемикатися між буферами :bnextта:bprevious

Цей спосіб роботи досить хороший, але щось мене непокоїть: буфери поділяються між вкладками.

Якщо я відкрию file1і file2в, tab1і file3в tab2, якщо tab1я використовую кілька разів, :bnextя побачу file3на цій вкладці те, чого не хочу. Робочий процес, який я хочу отримати, - це наступне :

  • Start vim (у мене перша вкладка з буфером): $ vim foo
  • Додайте буфер на цю вкладку: :e bar
  • Відкрийте нову вкладку та перейдіть на неї: :tabnew
  • Відкрийте новий буфер на цій вкладці: :e baz
  • Якщо я залишаюсь у цьому буфері і виконую :bnextабо :bpreviousбуду залишатися на bazбуфері (оскільки це єдиний на цій вкладці)
  • Якщо я йду на попередній вкладці :tabpreviousі виконати кілька разів , :bnextя буду перемикатися тільки між fooі barбуферами , але не буду бачитиbaz

Ось тут виникає моє запитання: чи можна прив’язати набір буферів до вкладки і зробити так, щоб vim заборонив доступ до деяких буферів з іншої вкладки, ніж до того, в якому вони мають бути?

Примітка. Я знаю, що використання :b [myBuffer]буде способом збереження буфера на вкладці, але коли у мене є 3 або 4 файли для редагування, я відчуваю, що я дійсно швидше використовую свої відображення, ніж набираю ім’я буфера (навіть якщо я можу введіть лише деякі символи, щоб відповідати імені буфера) .


1
Ось стара дискусія, в якій висвітлюються плюси та мінуси такого підходу, і натомість пропонується щось таке, що сьогодні можна перекласти як: декілька екземплярів vim (один на проект / список буфера) + tmux: vim.1045645.n5.nabble.com/…
VanLaser

@VanLaser: Дякую за посилання, це цікава дискусія! Я фактично включаю tmux та різні випадки vim, коли я перебуваю на своїй персональній машині. Моє запитання випливає з того, що мені доводиться використовувати вікна для своєї професійної роботи, і мені дуже не подобається, як обробляються вікна: використання alt+tab(або ще гірше миші) відчуває себе набагато менш просто, ніж перемикання вкладки в рамках vim.
statox

1
Можливо, vim-ctrlspace може допомогти - він рекламує за списками буфера вкладки; Я цим не користуюся.
VanLaser

Відповіді:


7

Гм, я не знайшов там жодного плагіна, але ви могли написати це самостійно. Для цього вам потрібно вивчити вимскрипт. Я щойно реалізував функціонал, який можна перемикати між буферами на вкладці (ще немає видалення). Ви можете скопіювати це у свій vimrc:

if !exists("g:WindowBufManager") 
  let g:WindowBufManager= {}
endif

function! StoreBufTab()
  if !has_key(g:WindowBufManager, tabpagenr())
    let  g:WindowBufManager[tabpagenr()] = []
  endif

  " add the new buffer to our explorer
  if index(g:WindowBufManager[tabpagenr()], bufname("%")) == -1 && bufname("%") != ""
    call add (g:WindowBufManager[tabpagenr()],bufname("%"))
  endif
endfunction

function! WindowBufManagerNext() 
  " find the next index of the buffer
  let s = index(g:WindowBufManager[tabpagenr()], bufname("%"))
  if (s!= -1)
    let s = (s +1) % len(g:WindowBufManager[tabpagenr()])
    execute 'b ' . g:WindowBufManager[tabpagenr()][s]
  endif
endfunction

augroup WindowBufManagerGroup
  autocmd! BufEnter * call StoreBufTab()
augroup END

Закрийте свій vimrc і відкрийте його знову. Щоб знайти наступний буфер, просто використовуйте

:call WindowBufManagerNext()

або визначити власну команду чи відображення. Це працюватиме до тих пір, поки ви не закриєте та не видалите вкладку чи буфер. Він також не працюватиме для декількох буферів. Щоб додати ці функції, знадобиться ще трохи роботи, але це, безумовно, можливо.


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

6

Буфери є глобальними, і ви нічого з цим не можете зробити, крім написання власного шару абстракції на верхній частині вкладок, вікон та буферів. Відповідь philolo1 показує розумний підхід до проблеми, але ви швидко знайдете межі такого "рішення" і вам потрібно буде дублювати багато вбудованих функцій, таких як :bufdoабо альтернативний файл ...

"Аргументи", з іншого боку, можуть бути локальними для вікна, тому вони можуть бути кориснішими у вашому робочому процесі, ніж "буфери" (у найсуворішому значенні слова):

$ vim file1 file2
:tabnew
:argl file3 file4 file5
:n
:n
gt
:n
gt
:N
and so on…

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

Але робота над кожним проектом у власному екземплярі Vim - це, на мою думку, єдине практичне рішення.


Я погоджуюся з думкою, що використовувати окремі екземпляри vim краще, коли я можу використовувати його в терміналі, як я вже говорив в іншому коментарі, що мені потрібно використовувати Windows на моєму професійному комп’ютері, а перемикання між екземплярами gvim - це біль в задній частині цієї ОС . Я погляну на аргументи, які я ніколи раніше не використовував, і це може бути вдалим рішенням, дякую!
statox

2

Отже, з деякою затримкою я думаю, що, можливо, я знайшов задовільну (принаймні для мене!) Відповідь. Вам знадобляться два плагіни Shougo:

і карту швидкого доступу, яку слід використовувати замість :ls, для перегляду (та вибору) лише буферів із поточної вкладки.

Наприклад, щось на кшталт:

nnoremap <leader>b :<C-u>Unite buffer_tab -no-split<CR>

об'єднати - за буферами вкладки

Тепер ви можете переміщатися через список буфера вкладки поточного ( j, k), вибрати один ( CR), скасувати ( q), ввести режим "введення" (вставки) для швидкого фільтра вибору буфера, набравши деякі букви, або навіть натиснути, Tabщоб відкрити список дій для поточного вибраного елемента (наприклад, щоб відкрити буфер вище поточного активного) - коротше, ви дієте загальним способом "Об'єднати".

(див. також « :h unite_default_key_mappingsОб’єднання довідки загалом»).


А тепер для остаточного (поки що необов’язкового) трюку. За допомогою altercmd ви можете створити власну lsкоманду з вкладками (на основі описаних вище функцій Unite):

:command! LS Unite buffer_tab -no-split
:AlterCommand ls LS

... і кожного разу, коли ви натиснете :ls, Vim насправді замість цього виконає вашу команду.

Зауважте, що вам також не знадобиться :bnабо :bp, оскільки перегляд та вибір буферів вкладки тепер є тією ж командою.


Я також спробую це рішення. На даний момент я намагаюся спробувати ctrl-space, згаданий VanLaser у коментарі, що досить добре. Я побачу, яке рішення є найзручнішим. Також +1 для плагіна altercmd, який досить класно!
statox

2

Я не можу коментувати, оскільки мій акаунт новий, тому шкода про це, але ++++ 1 для ctrl-space.

Мене продали до того моменту, як я це зробив на півдорозі через допомогу. Ctrlspace має таку структуру:

workspaces --> contain tabs --> contain buffers

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

Ви також можете назвати свої вкладки. Якщо цього недостатньо, ви також можете дуже легко змінювати робочі каталоги та створювати закладки для каталогів, якими ви часто користуєтесь.

Це добре поєднується з nerdtree, якщо ви користуєтесь цим (хоча, чесно кажучи, ви, мабуть, навіть не відчуєте, що вам це потрібно через тиждень із ctrlspace)


Розглянемо цей випадок використання:

У вас є проект. Він передбачає посадку дерев. Є фруктові дерева та гроші. Грошові дерева містять долари та центи, а фруктові дерева - яблука та апельсини.

У цьому прикладі яблука, апельсини, долари та центи - це "буфери".

Ctrlspace дозволяє розділяти яблука та апельсини на одну "вкладку", яку можна позначити "фруктом" - ця мітка з’явиться в рядку тегів у верхній частині вікна. Так само долари та центи переходять на вкладку "гроші".

Робоча область "дерев" зберігає всю цю конфігурацію і дозволяє отримати доступ до неї негайно у будь-який час, коли ви відкриєте vim.


Тепер, коли я усвідомлюю його існування, я справді не уявляю, як робити об'єктно-орієнтовану розробку в vim без цього плагіна. На всякий випадок, ось посилання: https://github.com/szw/vim-ctrlspace


2

Тож нарешті вирішив створити власний плагін, щоб вирішити свою проблему, він доступний на github .

Я використав ідею @ philolo1 і спробував її виконати, на той час, як я пишу цю відповідь, вона все ще триває.

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


Плагін прив'язує буфери до вкладок: Коли користувач відкриває буфер, він автоматично "зберігається" на вкладці і не може бути доступний з іншої вкладки.

Установка повинна бути "зручною для менеджера плагінів" (принаймні, вона добре працює з Vim-Plug та Vundle )

Деякі основні особливості:

  • Автоматично обробляти прив'язку буферів (користувач може відкривати їх, як це робив раніше)
  • :NextBufі :PrevBufзамінити :bnта :bNпідтримувати постійний стан вкладок
  • :ListBufдозволяє перелічити буфери аналогічно :lsвинятку, який вони розділені на вкладках, і знак дозволяє користувачеві легко бачити, на якій вкладці він зараз знаходиться.
  • :ChangeBuf прийняти номер буфера або ім'я буфера, щоб змінити буфер і змінити вкладку автоматично
  • Закриття буфера виконується за допомогою :CloseBuf
  • Закриття вкладки робиться за допомогою :CloseTab

Для інших операцій користувач повинен мати можливість використовувати вбудовані функції (як :tabopen, :tabnextі т.д ...)

Для кожної команди надаються деякі відображення за замовчуванням, і їх можна легко відключити, додавши let g:betterTabsVim_map_keys = 0до свого .vimrc.

Я також спробував зробити явний файл довідки ( :h betterTabs.txt): він ще не повний, але користувачі повинні знайти мінімум, щоб використовувати плагін.

У мене ще дуже багато тестування, щоб переконатися, що плагін не зіпсує будь-якої рідної поведінки.

Нарешті, якщо хтось хоче допомогти, завжди можна створити проблеми на сторінці github або створити запити на тягнення.


1

Перевірте цей плагін. Мені здається, він ідеально відповідає вашим потребам. https://github.com/szw/vim-ctrlspace


Дійсно, VanLaser згадував це у коментарях, і я спочатку не дивився на це досить близько, але, здається, це справді добре, я пробую це вже кілька днів.
statox
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.