Использование вкладок Vim, таких как буферы

366

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

Мне бы хотелось, чтобы каждый отдельный файл, который у меня открыт, всегда был на отдельной вкладке. Однако есть некоторые вещи, которые мешают этому. Как мне исправить это:

  1. Когда команды любят gfи ^]переходят к расположению в другом файле, файл открывается в новом буфере на текущей вкладке. Есть ли способ заставить все эти виды команд открыть файл в новой вкладке или переключиться на существующую вкладку с файлом, если он уже открыт?

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

вдавливание
источник

Ответы:

642

Остановись, остановись, остановись.

Это не то, как вкладки Vim предназначены для использования. На самом деле, они ошибочно названы. Лучшее имя будет «viewport» или «layout», потому что это вкладка - это другой макет окон всех ваших существующих буферов.

Попытка превратить 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 .
Zathrus
источник
192
Для меня это ошибка, а не «ошибка пользователя». Поиск в Интернете «вкладок vim» показывает, что почти все остальные не согласны с вами или не знают о «реальном» способе использования вкладок Vim. Кроме того, если вкладки действительно являются представлениями «макета», то почему заголовки вкладок по умолчанию являются текущим именем файла? Если бы я хотел несколько просмотров одного и того же файла, то все названия моих вкладок были бы одинаковыми (не очень полезно?). В любом случае, реализация вкладок по умолчанию в Vim имеет недостатки.
cmcginty
45
Что еще вы собираетесь показать в заголовке вкладки? Показывает текущее имя буфера (не «имя файла»). В любом случае вы можете изменить то, что отображается в заголовке вкладки.
aehlke
46
@Casey: FWIW, когда я впервые узнал о вкладках Vim и должен был обернуть голову о них и о том, для чего они были, подумал именно об определении, данном Zathrus. (Кстати, я новичок Vim). Так что нет, я не согласен с тем, что это такая нарушенная или неинтуитивная особенность ... еще меньше согласен с тем, что «обо всех» не согласен (и думаю, что по крайней мере один или два рефери могли бы придать больше веса утверждению). Это работает удивительно хорошо для нескольких одновременных макетов экрана.
ата
17
Этот комментарий неправильный, я не уверен, почему он проголосовал или принят. Робинс ниже имеет правильный ответ -: tab sball и: switchbuf - это то, что вы ищете.
Roel
38
+1 за «Стоп, стоп, стоп». Vim - такой же менталитет, как и инструмент. Важно научить новых пользователей менталитету, чтобы они могли использовать инструмент в полной мере.
опрос Коди
273

Немного опоздал на вечеринку, но удивился, что не увидел в этом списке следующего:

:tab sball - это открывает новую вкладку для каждого открытого буфера.

:help switchbuf- это контролирует поведение переключения буфера, попробуйте :set switchbuf=usetab,newtab. Это должно означать переключение на существующую вкладку, если буфер открыт, или создание новой, если нет.

robince
источник
4
+1 за switchbuf- set switchbuf=useopenэто здорово , чтобы избежать раздражающего поведения :make, :vimgrepи подобные команды , которая изменяет буферы в макете окна , даже когда уже отображается буфер.
mMontu
3
почему не подходит мне? после установки :se switchbuf=usetab,newtab, когда используется bnдля переключения буфера, он по-прежнему открывает файл буфера в текущей вкладке вместо переключения на существующую вкладку? Здесь что-то не так?
жиэлее
173

Вим :help windowдовольно хорошо объясняет путаницу "табуляция против буфера".

Буфер - это текст файла в памяти.
Окно - это окно просмотра в буфере.
Закладка представляет собой набор окон.

Открытие нескольких файлов осуществляется в vim с помощью буферов . В других редакторах (например, notepad ++) это делается с помощью вкладок, поэтому имя вкладки в vim может вводить в заблуждение.

Окна предназначены для разделения рабочего пространства и отображения нескольких файлов (буферов) на одном экране. В других редакторах это можно сделать, открыв несколько окон графического интерфейса и переставив их на рабочем столе.

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

Как help: tab-pageобъясняет vim, вкладка может использоваться, когда кто-то хочет временно отредактировать файл, но не хочет ничего менять в текущей компоновке окон и буферов. В таком случае можно использовать другую вкладку только для редактирования этого конкретного файла.

Конечно, вы должны помнить, что отображение одного и того же файла на многих вкладках или окнах приведет к отображению одной и той же рабочей копии (буфера).

городчатые
источник
11
Это на самом деле потрясающий ответ, но потребовалось несколько прочтений, чтобы иметь смысл. буферы = вкладки, windows = графические окна, вкладки страниц = рабочие столы имеют наилучший смысл, так как я нашел для кого-то, кто не знаком с понятиями
icc97
4
Я склонен думать, что они смотрят через окно в комнату - buffer= объект , window= панель и tab= окно . Я могу передвигаться по комнате и смотреть из разных окон ( tabs). Разные окна могут иметь разное количество, расположение и размер окон . Один и тот же объект можно одновременно просматривать с разных панелей в разных окнах .
go2null
Если вы знакомы с парадигмой Linux Workspaces и 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

Чтобы открыть несколько файлов в vim с каждым файлом на отдельной вкладке, используйте vim -p file1 file2 .... Если вы похожи на меня и всегда забываете добавить -p, вы можете добавить его в конце, так как vim следует обычным правилам разбора параметров командной строки. Кроме того, вы можете добавить отображение псевдонима bash vimв vim -p.

Zenexer
источник
3
+1, vim -pоднако учтите, что по умолчанию будет отображаться только до 10 вкладок. Дополнительные файлы загружаются в буферы, но не отображаются на собственной вкладке.
Янв
@IanB: как мне преодолеть настройку по умолчанию, ограничив ее до 10 вкладок?
0xC0000022L
3
@ 0xC0000022L см. tabpagemaxНастройку
IanB
14

Я столкнулся с той же проблемой. Я хотел, чтобы вкладки работали как буферы, и мне никогда не удавалось их получить. Решение, на котором я наконец остановился, состояло в том, чтобы буферы вели себя как вкладки!

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

Доминик Дос Сантос
источник
10

Это ответ для тех, кто не знаком с Vim и поступает из других текстовых редакторов (в моем случае Sublime Text).

Я прочитал все эти ответы, и это все еще не было ясно. Если вы прочитаете их достаточно, вещи начнут иметь смысл, но мне потребовались часы, чтобы переходить от одного вопроса к другому.

Первое, как объяснили другие:

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

Первое описание, которое я понял, было из ответа @ crenate: они эквивалентны нескольким рабочим столам. С этой точки зрения у вас будет только несколько открытых рабочих столов, но в каждом из них будет открыто множество окон графического интерфейса.

Я бы сказал, что они похожи на другие редакторы / браузеры:

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

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

Другие описания, которые я нахожу запутанным

Viewport

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

Если вы просматриваете страницы вкладок как несколько рабочих столов, то обращение к рабочему столу как к одному окну кажется странным.

Workspaces

Возможно, это имеет больше смысла, словарное определение :

Память для временного использования.

Так что это как место, где вы храните группу буферов.

Изначально я не походил на концепцию Sublime Text о рабочем пространстве, представляющем собой список всех файлов, которые вы открыли в своем проекте:

файл sublime-workspace, который содержит специфические данные пользователя, такие как открытые файлы и модификации каждого из них.

Однако, думая об этом больше, это на самом деле согласен. Если вы рассматриваете вкладку Vim как проект Sublime Text, то было бы странно иметь только один файл, открытый в каждом проекте, и продолжать переключаться между проектами. Следовательно, странно использовать вкладку, чтобы открыть только один файл.

Коллекция окон

:help windowСсылается на закладки этого пути. Плюс многие другие ответы используют ту же концепцию. Однако, пока вы не разберетесь в том, что такое окно vim, это не очень полезно, как строительство замка на песке.

Как я упоминал выше, окно vim - это то же самое, что и окно просмотра, и тихо, отлично объясненное в этом статье на linux.com :

Действительно полезная функция в Vim - это возможность разделить видимую область между одним или несколькими файлами или просто разделить окно, чтобы легче просматривать два бита одного и того же файла. В документации Vim это называется окном просмотра или окном, взаимозаменяемо.

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

Мне кажется странным, что вкладка называется коллекцией окон, а не коллекцией буферов. Но я думаю, у вас может быть две открытые вкладки, каждая с несколькими окнами, указывающими на один и тот же буфер, по крайней мере, я так понимаю.

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

Глядя на вкладки справки, не похоже, что vim хочет работать так, как вы ...

Буферы распределяются между вкладками, поэтому кажется невозможным заблокировать данный буфер, чтобы он отображался только на определенной вкладке.

Это хорошая идея.

Вы могли бы, вероятно, получить желаемый эффект, используя терминал, который поддерживает вкладки, такие как multi-gnome-терминал, а затем запустив экземпляры vim на каждой вкладке терминала. Не идеально, хотя ...

Майк Г.
источник
Я попробовал это, проблема в том, что, кроме того, что трудно перемещаться между вкладками, заключается в том, что извлеченный текст не может быть разделен между вкладками терминала, так как это по сути два разных терминала / оболочки
puk
@puk: попробуйте плагин YankRing vim. Сохраняет восстановленный текст в файл, поэтому его можно использовать в разных экземплярах vim.
pixelastic
@Pixelastic Я нашел подходящее решение для восстановления системного буфера обмена. Кроме того, Vim работает лучше всего в одном случае. Я перестал заставлять его делать то, что хотел, и научился правильно использовать vim :-) stackoverflow.com/a/8757876/654789
puk
@puk: Спасибо, мне не пришло в голову, что использование системного буфера обмена означает разделение его и между экземплярами vim :)
pixelastic
4
  • Вы можете отобразить команды, которые обычно управляют буферами для управления вкладками, как я сделал с gf в моем .vimrc:

    map gf :tabe <cfile><CR>
    

    Я уверен, что вы можете сделать то же самое с [^

  • Я не думаю, что Vim поддерживает это для вкладок (пока). Я использую gt и gT для перехода к следующей и предыдущей вкладкам соответственно. Вы также можете использовать Ngt, где N - номер вкладки. У меня есть один недостаток: по умолчанию номер вкладки не отображается в строке вкладок. Чтобы исправить это, я поместил несколько функций в конец моего файла .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 у вас нет панели вкладок вверху, но, с другой стороны, это экономит место на вашем экране, плюс вы можете иметь неограниченное количество открытых файлов / буферов и список буферов для поиска ...

jkramer
источник
2

Если вы хотите, чтобы буферы работали как вкладки, проверьте плагин tabline .

При этом используется одно окно и добавляется строка сверху для имитации вкладок (просто отображается список буферов). Это вышло очень давно, когда вкладки поддерживались только в GVim, но не в командной строке vim. Поскольку он работает только с буферами, все хорошо интегрируется с остальной частью vim.

thien.vuong
источник