Використання вкладок Vim, як буфери


366

Я розглядав можливість використання вкладок у Vim (з :tabe, :tabnewі т. Д.) Як заміну моєї поточної практики відкриття багатьох файлів у одному вікні в прихованих буферах.

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

  1. Коли команди люблять gfі ^]переходять до місця в іншому файлі, файл відкриється в новому буфері на поточній вкладці. Чи є спосіб, щоб усі ці різновиди команд відкрили файл на новій вкладці або перейшли на існуючу вкладку разом із файлом, якщо він уже відкритий?

  2. Під час перемикання буферів я можу використовувати, :b <part of filename><tab> і він доповнить імена файлів у існуючих буферах. <part of filename>може навіть бути серединою імені файлу замість початку. Чи існує еквівалент для перемикання вкладок?

Відповіді:


642

Стоп, стоп, стоп.

Це не так, як призначені вкладки Vim для використання. Насправді вони неправильно названі. Кращою назвою було б «огляд перегляду» або «макет», тому що це вкладка - це інша компоновка вікон усіх існуючих буферів.

Спроба перемогти Vim в 1 таб == 1 буфер - це вправність. Vim не знає , чи догляд , і він не буде поважати його на все команди, зокрема, все , що використовує QuickFix буфер ( :make, :grepі :helpgrepті , які приходять на розум) буде щасливо ігнорувати вкладки і немає нічого , що ви можете зробити , щоб зупинити що.

Замість цього:

  • :set hidden
    Якщо у вас ще немає цього набору, зробіть це. Це змушує vim працювати, як і будь-який інший багатофайловий редактор на планеті. Ви можете редагувати буфери, які не видно десь у вікні.
  • Використовуйте :bn, :bp, :b #, :b name, і ctrl-6для перемикання між буферами. Мені подобається ctrl-6сам (поодинці він перемикається на раніше використаний буфер, або #ctrl-6переходить на номер буфера #).
  • Використовуйте :lsдля переліку буферів або плагінів, таких як MiniBufExpl або BufExplorer .

192
Для мене це помилка, а не «помилка користувача». Пошук в Інтернеті "vim tabs" вказує на те, що майже всі інші з вами не згодні або не знають про "реальний" спосіб використання вкладок Vim. Крім того, якщо вкладки дійсно переглядають "макет", то чому тоді титули вкладки за замовчуванням - поточне ім'я файлу? Якби я хотів кілька переглядів одного і того ж файлу, то всі назви моїх вкладок мали б те саме ім’я (не дуже корисно?). Отже, як би ви не подивилися на це, реалізація вкладки за замовчуванням у Vim є хибною.
cmcginty

45
Що ще ви будете показувати у заголовку вкладки? Він показує поточне ім'я буфера (не "ім'я файлу"). Ви можете змінити, що відображається в заголовку вкладки.
aehlke

46
@Casey: FWIW, коли мені вперше було відомо про вкладки Vim і мені довелося обернути голову про них і для чого вони призначені, я подумав саме про визначення, яке дав Затрус. (Я Vim Novice btw). Так що ні, я не згоден, що це така зламана чи неінтуїтивна особливість ... ще менше погоджуюсь, що "про всіх" не згоден (і думаю, що принаймні один чи два відмови можуть надати більше ваги твердженню). Він працює надзвичайно добре, маючи кілька одночасних макетів екрана.
ота

17
Цей коментар невірний, я не впевнений, чому це схвалено чи прийнято. Робінс нижче має правильну відповідь -: вкладку sball і: switchbuf - те, що ви шукаєте.
Roel

38
+1 для "Стоп, стоп, стоп". Вім - стільки менталітет, скільки інструмент. Важливо навчити нових користувачів менталітету, щоб вони могли використовувати інструмент до повного потенціалу.
опитування Коді

273

Трохи спізнившись на вечірку тут, але здивований, я не побачив у цьому списку наступного:

:tab sball - це відкриває нову вкладку для кожного відкритого буфера.

:help switchbuf- це керує поведінкою комутації буфера, спробуйте :set switchbuf=usetab,newtab. Це повинно означати перехід на існуючу вкладку, якщо буфер відкритий, або створення нової, якщо ні.


4
+1 за switchbuf- set switchbuf=useopenце здорово , щоб уникнути дратівної поведінки :make, :vimgrepі подібні команди , яка змінює буфери в макеті вікна , навіть коли вже відображається буфер.
mMontu

3
чому мені не підходить? після встановлення :se switchbuf=usetab,newtab, коли використовується bnдля перемикання буфера, він все ще відкриє буферний файл у поточній вкладці замість переходу на існуючу вкладку? Щось не так?
zhiyelee

173

Vim :help windowдосить добре пояснює плутанину "tabs vs buffers".

Буфер - це текст у пам'яті файлу.
Вікно - це вікно перегляду на буфері.
Сторінка вкладки - це колекція вікон.

Відкриття декількох файлів досягається in vim з буферами . В інших редакторах (наприклад, блокнот ++) це робиться за допомогою вкладок, тому вкладка імен у vim може вводити в оману.

Windows призначена для розділення робочої області та відображення декількох файлів (буферів) разом на одному екрані. В інших редакторах цього можна досягти, відкривши кілька вікон GUI та переставивши їх на робочому столі.

Нарешті, у цій аналогії сторінки вкладок vim відповідатимуть декільком робочим столам, тобто різним перестановкам windows.

Як help: tab-pageпояснює vim , сторінка вкладки може бути використана, коли потрібно тимчасово відредагувати файл, але не хоче нічого змінювати в поточному макеті вікон та буферів. У такому випадку інша сторінка вкладки може бути використана саме для редагування конкретного файлу.

Звичайно, ви повинні пам’ятати, що відображення одного і того ж файлу на багатьох сторінках вкладок або вікон призведе до відображення тієї ж робочої копії (буфера).


11
Це насправді приголомшлива відповідь, але для того, щоб мати сенс, знадобилося кілька прочитань. буфери = вкладки, windows = gui windows, сторінки вкладок = настільні комп'ютери мають найкращий сенс досі, що я знайшов того, хто не знайомий з поняттями
icc97

4
Я схильний вважати їх такими, що дивляться через вікно в кімнату - buffer= об'єкт , window= панель і tab= вікно . Я можу пересуватися по кімнаті і заглянути в різні вікна ( tabs). Різні вікна можуть мати різну кількість, розташування та розмір стекол . Один і той же об'єкт можна одночасно переглядати з різних панелей в різних вікнах .
go2null

Якщо ви знайомі з робочими просторами Linux та парадигмою Windows, ви побачите спадщину vimвикористання. На початку було просто вікно . Потім менеджери вікон дозволили вам розділити вікна на панелі (плитка WM) або на панелі, що перекриваються (, плаваючий WM), але вони все ще називали кожну панель як вікно. Тепер додайте концепцію робочої області, де панель може бути показана в декількох робочих просторах. Отже, у цій парадигмі buffer= додаток , window= вікно та tab= робоча область .
go2null

56

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

<C-w>gf- це еквівалент команди буферів gf. <C-PageUp>і <C-PageDown>переключатиметься між вкладками. (У Byobu ці дві команди ніколи не працюють для мене, але вони працюють за межами Byobu / tmux. Альтернативи є gtі gT.) <C-w>TПеремістять поточне вікно на нову сторінку вкладки.

Якщо ви хочете, щоб vim використовував існуючу вкладку, якщо це можливо, а не створював дублікат, додайте :set switchbuf=usetabу свій .vimrc файл. Ви можете додати newtabдо списку ( :set switchbuf=usetab,newtab), щоб змусити команди QuickFix, які відображають помилки компіляції, відкриватися на окремих вкладках. Я вважаю за краще split, що відкриває помилки компіляції у розділеному вікні.

Якщо у вас включена підтримка миші :set mouse=a, ви можете взаємодіяти з вкладками, натискаючи на них. Також +за замовчуванням є кнопка, яка створить нову вкладку.

Для документації на вкладках введіть :help tab-pageу звичайному режимі. (Після цього ви можете практикувати переміщення вікна на вкладку, використовуючи <C-w>T.) Існує довгий список команд. Деякі команди вікон мають відношення до вкладок, тому ви, можливо, захочете також переглянути цю документацію через :help windows.

Доповнення: 2013-12-19

Щоб відкрити кілька файлів in vim з кожним файлом на окремій вкладці, використовуйте vim -p file1 file2 .... Якщо ви схожі на мене і завжди забули додати -p, ви можете додати його наприкінці, оскільки vim дотримується звичайних правил розбору параметрів командного рядка. Крім того , ви можете додати відображення Баш псевдоніма vimдля vim -p.


3
+1, vim -pоднак пам’ятайте, що за замовчуванням буде відображено лише до 10 вкладок. Додаткові файли завантажуються в буфери, але не відображаються на власній вкладці.
ЯнВ

@IanB: як подолати налаштування за замовчуванням, обмеживши його на 10 вкладок?
0xC0000022L

3
@ 0xC0000022L дивіться tabpagemaxналаштування
IanB

14

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

Перевірте плагін під назвою Mini Buffer Explorer , після його встановлення та налаштування ви зможете працювати з буферами по-справжньому так само, як і вкладки, не втрачаючи жодної функціональності.


10

Це відповідь для тих, хто не знайомий з Vim та надходить з інших текстових редакторів (у моєму випадку Піднесений текст).

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

Перше, як пояснили інші:

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

Перший опис, який я зрозумів, був з відповіді @ crenate, що вони є еквівалентом кількох робочих столів. Якщо ви бачите в цьому плані, у вас буде відкрито лише пару робочих столів, але в них відкрито багато вікон GUI.

Я б сказав, що вони подібні до інших редакторів / браузерів:

  1. Групування вкладок
  2. Робочі простори Sublime Text (тобто список відкритих файлів, які ви маєте в проекті)

Коли ви бачите їх такими, ви усвідомлюєте силу їх, що ви можете легко групувати набори файлів (буферів) разом, наприклад ваші CSS-файли, ваші HTML-файли та JS-файли на різних сторінках вкладок. Що насправді досить приголомшливо.

Інші описи, які я вважаю заплутаними

Вигляд

Це для мене немає сенсу. Вікно перегляду, який хоча і має визначений словниковий термін , я чув лише посилання на Vim windows у :help windowдокументі. Viewport - це не термін, який я коли-небудь чув стосовно таких редакторів, як Sublime Text, Visual Studio, Atom, Notepad ++. Насправді я ніколи не чув про це для Vim, поки не почав намагатися використовувати сторінки вкладок.

Якщо ви переглядаєте сторінки вкладок, як кілька робочих столів, то посилання на робочий стіл як єдине вікно видається дивним.

Робочі простори

Це, можливо, має більше сенсу, визначення словника :

Зберігання пам'яті для тимчасового користування.

Тож це як місце, де ви зберігаєте групу буферів.

Спочатку я не звучав як концепція робочого простору Sublime Text, що є списком усіх файлів, які ви відкрили у своєму проекті:

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

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

Колекція вікон

Таким чином :help windowпосилається на сторінки вкладок. Плюс численні інші відповіді використовують ту саму концепцію. Однак, поки ти не обернеш головою, що таке вікно, тоді це не дуже корисно, як побудова замку на піску.

Як я вже згадував вище, вікно vim - це те саме, що і вікно перегляду, і цілком чудово пояснено в цій статті linux.com :

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

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

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


1
Нарешті, після солідного року повного використання Vim, я натрапив на випадок, коли я хотів використовувати більше однієї сторінки вкладок. В даний час буфери для мене відмінно працюють, як я б використовував вкладки в інших редакторах. Але маючи великий монітор, я порівнював цілу купу з 3-4 різних буферів. Тоді колега хотів, щоб я шукав якийсь код в іншому місці в кодовій базі. Замість того, щоб втратити набір вікон порівняння, я міг просто створити нову сторінку вкладки, яка потім дозволяє мені здійснити окремий пошук, як я б, коли звичайно використовую Vim звичайно, і тоді я можу закрити сторінку вкладки після завершення і повернутися до свого початкового набору
icc97

4

Дивлячись: вкладки довідки виглядають не так, як vim хоче працювати так, як ви ...

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

Хоча це гарна ідея.

Можливо, ви можете отримати потрібний ефект, скориставшись терміналом, який підтримує вкладки, наприклад, multi-gnome-terminal, а потім запустивши екземпляри vim у кожній вкладці терміналу. Не ідеально, хоча ...


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

@puk: Спробуйте плагін YankRing vim. Він зберігає текст, який витягується у файлі, тому його можна ділити через всі екземпляри vim.
пікселастичний

@Pixelastic Я знайшов тут відповідне рішення для переходу на буфер обміну системи. Також Vim найкраще працює в одному випадку. Я перестав робити це робити то , що я хотів, і дізнався , як правильно використовувати ВІМ :-) stackoverflow.com/a/8757876/654789
PUK

@puk: Спасибі, мені не прийшло в голову, що використання буфера обміну системи означає також поділитися ним через vim екземпляри :)
pixelastic

4
  • Ви можете зіставити команди, які зазвичай маніпулюють буферами для маніпулювання вкладками, як я це робив з gf у своєму .vimrc:

    map gf :tabe <cfile><CR>
    

    Я впевнений, що ви можете зробити те ж саме з [^

  • Я не думаю, що vim підтримує це для вкладок (поки). Я використовую gt і gT для переходу до наступної та попередньої вкладок відповідно. Ви також можете використовувати Ngt, де N - номер вкладки. Один peeve у мене є те, що за замовчуванням номер вкладки не відображається в рядку вкладки. Щоб виправити це, я помістив пару функцій в кінці мого .vimrc-файлу (я тут не вставляв, оскільки він довгий і не форматувався правильно).


<c-w>gfвідкриє ім'я файлу під курсором у новій вкладці
Пітер Рінкер

4

Я використовую буфери, як вкладки, використовуючи плагін BufExplorer і кілька макросів:

" CTRL+b opens the buffer list
map <C-b> <esc>:BufExplorer<cr>

" gz in command mode closes the current buffer
map gz :bdelete<cr>

" g[bB] in command mode switch to the next/prev. buffer
map gb :bnext<cr>
map gB :bprev<cr>

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


2

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

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

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