Почему эксперты Vim предпочитают буферы вкладкам?

245

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

Итак, я спрашиваю вас, эксперт Vim: каковы преимущества использования буферов перед вкладками? Я не понимаю, насколько сильно может быть разница, но я бы считал себя только на уровне начального и среднего уровня при работе с Vim. Неужели :ls :b#это намного быстрее, чем gtсуетиться? Я чувствую, что это должно пойти глубже, чем это.

2c2c
источник
6
Для тех, кто изучает Vim или приходит на Vim под большим влиянием других редакторов на основе графического интерфейса, я настоятельно рекомендую сначала прочитать ответ @Jonathan Brink, а затем вернуться к главному ответу здесь.
icc97
1
Не беспокойся об этом. Я использую вкладки в качестве основного способа навигации по файлам. Как вы говорите, <#> gt легко набрать. Чтобы сделать его еще проще в использовании, я настраиваю свои данные табуляции для включения номера табуляции. Если мне нужно просматривать более одного буфера одновременно, я делю новое окно на вкладке. Несмотря на то, что заявляет @romaini, такой способ использования Vim делает меня очень продуктивным, потому что он соответствует моим личным метафорам. Также обратите внимание, что за 37 (пока) карьеру программиста мне еще не приходилось открывать более пяти или шести файлов одновременно - и это очень редко. Делай то, что работает для тебя. :)
Тони
Делай то, что работает. Некоторые люди используют много файлов в сеансе, поэтому буферы имеют гораздо большее значение. Даже Брэм Муленаар говорит: «Организуйте их так, как вам нравится». Открывать 20 вкладок - не правильный путь, но вкладки для нескольких файлов - это не конец света. Решением Брэма по управлению большим количеством файлов является открытие нескольких сеансов терминала. Он говорит, вот как он это делает, но не так, как все должны это делать.
ремесло
Единственное наиболее очевидное отличие, которое, кажется, не выделено должным образом, состоит в том, что, если вы остаетесь в одной вкладке, вы можете просматривать несколько буферов одновременно с помощью :split«окон». Если у вас есть все ваши буферы (файлы) на отдельных вкладках, вы не получите этот одновременный просмотр. Я бы порекомендовал изучить vim с помощью 1 вкладки и привыкнуть к расщеплению.
NeilG

Ответы:

501

Как сказал ZyX на #vim, этот вопрос звучит так: «Почему эксперты Vim предпочитают вкусное теплому?»,

«Эксперты Vim» не предпочитают буферы вкладкам: они используют буферы в качестве прокси-серверов, а вкладки - в качестве рабочих областей. Буферы и вкладки имеют разные цели, поэтому предпочтение одного другому не имеет смысла.

Проблема с буферами и вкладками связана с путаницей , вызванной сочетанием независимых фактов.

  1. Большинство «современных» текстовых редакторов и IDE используют метафору табуляции для представления загруженных файлов. Эта метафора действует как информационная система - она ​​показывает пользователю, какие файлы открыты и их состояние - и как интерактивное устройство - она ​​позволяет пользователю манипулировать (переупорядочивать, выбирать, закрывать ...) этими открытыми файлами. Несмотря на их многочисленные ограничения, вкладки есть везде, и люди привыкли к ним и ожидают их везде.

  2. Vim представил вкладки в 7.0 как способ для своих пользователей создавать специальные «рабочие пространства». Ничего в их особенностях, их определенных опциях, их определенных командах или их:help разделах не предполагает, что вкладки могут или должны использоваться в качестве файловых прокси.

    Ничего, кроме названия и появления «вкладок», конечно, что приводит к большой путанице.

  3. Без :set hidden, который по умолчанию отключен и не очень легко найти, Vim делает невозможным переключение на другой буфер без записи текущего или отмены его изменений. У новых пользователей, не подозревающих об этой опции, нет другого выбора, кроме как переключиться на использование тяжелых окон или ближайшую «похожую на вкладку» функцию, которую они могут найти: вкладки.

«Закладка» - неудачный выбор имени для этой функции, особенно в эпоху, когда доминирует идея, что чтение документации - пустая трата времени.

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

«Буферный путь»

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

  1. Открыты восемь буферов, виден только один:

    Восемь буферов открыты

  2. Переключение по номеру:

    Переключение по номеру

  3. Переключение по имени:

    Переключение по имени

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

«Оконный путь»

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

В Windows навигация между открытыми файлами либо становится слишком сложной, либо слишком простой, даже если 'switchbuf' и :sb. Главным образом потому, что вы вынуждены использовать два набора команд для того, что по сути одно и то же: доступ к буферу.

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

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

Работа над цветовым решением

Windows не спроектированы как файловые прокси и не могут быть превращены в них: они являются «контейнерами» или «областями просмотра», предназначенными для того, чтобы предложить вам просмотр в буфер. Ни больше ни меньше.

«Способ вкладки»

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

Продолжая работать с теми же файлами, что и выше, таблица занимает значительное место практически без пользы. Все мои файлы и все мои вкладки называются, javascript*.vimпоэтому я не могу этого сделать 3gtи быть уверенным, что окажусь в нужном месте, и невозможно получить доступ к определенной вкладке по имени. Добавьте к этому тот факт, что его метка вполне может быть очень бесполезной, но совершенно логичной [Quickfix List]… Поскольку практического способа привязать файл / буфер к вкладке не существует, у вас остается только один практичный способ навигации между вкладками. / buffers / files: cycling.

И да, моя вкладка изобилует только 8 вкладками, представьте, если бы у меня было 20!

  1. Восемь буферов открываются на восьми вкладках (неправильно)

    Неправильно

  2. Две вкладки для двух конкретных задач (справа)

    Правильно

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

В заключение

«Эксперты Vim» (допустим, я могу говорить так, как если бы я был одним из них) не предпочитают буферы над вкладками: они просто используют Vim в том виде, как он был спроектирован, и им совершенно комфортно с таким дизайном:

  • «Эксперты Vim» загружают 2, 30 или 97 буферов и очень рады, что им не приходится иметь дело с пространственным распределением;

  • когда им нужно сравнить два файла или работать в одной части текущего буфера, сохраняя другой в качестве ссылки, «эксперты Vim» используют окна, потому что именно так они и должны использоваться;

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

romainl
источник
10
Для некоторых дополнительных ссылок смотрите мой пост Эффективного использования буферов
Питер Ринкер
7
@DavidEG, имея 20 буферов, это совсем не проблема, так что в плагине нет особой необходимости. С другой стороны, 20 вкладок - являются ли они убедительными файловыми прокси или нет - не могут поместиться на большинстве экранов, плагина или нет.
Ромен
2
@Kache, да, это точно суть моей точки зрения: вы можете использовать окна и вкладки для того, что они есть, но не в качестве файловых прокси. Поэтому аргумент не в том, должны ли люди использовать вкладки или буферы, а в том, должны ли люди использовать вкладки в качестве прокси файлов или нет.
romainl
14
В качестве «Вьет эксперт» Я могу сказать , что более 4 сотни буферов «открытых» ( на самом деле « в списке, но выгружено, в течение нескольких из них , за исключением») является регулярной ситуацией , когда я имею дело с проектом , как NeoVim (я просто открыть все *.c, *.h, scripts/*и test/**/*.luaфайлы). Учитывая, что мой терминал имеет ширину всего 239 столбцов, использование «один файл на вкладку» невозможно.
ZyX
3
А учитывая, что существует ряд плагинов (Command-T,…), которые облегчают переключение между буферами и / или файлами, использование вкладок для любого относительно большого проекта не имеет смысла. И неовим с ≈500 «интересных» файлов - это большой проект, но не самый большой. Когда вы сталкиваетесь с необходимостью иметь дело с такими проектами, вы всегда используете какой-то поиск для навигации по нему (поиск файлов / тегов с помощью Command-T и друзей, различные способы перехода к определению символов), и, таким образом, у вас нет абсолютно никаких причин для использования вкладок. таким образом: в любом случае вы не будете использовать функциональность с привязкой к вкладкам для навигации по проекту.
ZyX
90

Я использовал , чтобы каждый буфер в отдельной вкладке, но я уставал постоянно gtи gT-ную повсюду.

Я также чувствовал, что буферами было слишком сложно управлять.

Вот некоторые приемы, которые полностью изменили мое прежнее мнение:

Вот мой типичный рабочий процесс:

  • Откройте Vim и используйте :e(обычно с регулярным выражением :e src/**/F*Bar.js), чтобы открыть буфер
  • Поймите, мне нужно открыть другой файл. Используйте :eдля этого также. Если я хочу переключаться между этим буфером и текущим открытым буфером, я буду использовать :spили, :vspчтобы открыть его в отдельном окне.
  • Повторяйте, пока я не получу 3-5 файлов, между которыми я буду переключаться, используя методы из вышеприведенного маркированного списка, чтобы летать между вашими буферами.
  • Если я хочу «начать заново» со своими буферами, просто закройте Vim и снова откройте.

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

Jonathan.Brink
источник
24
Обидно, что добрые объяснения, дружественные к пользователю / новичку, такие, как это, получают около 3% голосов очень самоуверенных, уничижительных, слишком сложных ответов, таких как один из самых популярных. Я даже этого не зналаgT была команда для переключения вкладок, я искал замену ctrl+tab. Так что спасибо вам за то, что вы действительно помогаете новому пользователю, а не просто заставляете его чувствовать себя глупо.
icc97
11
Я должен сказать, что мой комментарий несправедлив к ответу @ romainl, он был очень рад ответить на вопросы, которые у меня были об этом. Но, конечно, как кто-то, кто пытается выучить Vim, ваш ответ гораздо легче понять, но его ответ становится более полным, если вы действительно знаете немного больше.
icc97
3
Я думаю, что ответ @ romainl чрезвычайно полезен и дает нам четкое представление о том, как устроены буферы, окна и вкладки, и как они должны использоваться. Тем не менее, я думаю, что пользователи Vim не упускают возможности ответить на вопросы, которые вы не любите , и это может разочаровать.
Keyofnight
3
Не могу вспомнить, откуда я его взял, но nnoremap <leader>b :ls<CR>:b<space>он очень удобен для быстрого переключения буферов, так как показывает список открытых в данный момент буферов. Также допускаются частичные имена (при условии совпадения только одного).
ничто101
1
Этот метод также имеет действительно удивительное преимущество автозаполнения vim (по умолчанию, никаких дополнительных плагинов). Так как вы используете несколько буферов, когда вы находитесь в режиме вставки и выполняете a ctrl Nили ctrl P(P - то, что я обычно использую), он выдаст вам список слов, чтобы закончить то, что вы печатали ... Это умно, основываясь на вашем текущем буфер, разделенные, разделенные, и все остальные открытые файлы!
g19fanatic
12

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

Проблемы, которые вы описываете, создают впечатление, что вы используете Vim неправильно. Либо есть (в основном) один, выделенный экземпляр. Тогда буферы, которые станут скрытыми, просто «появятся» снова, если вы их отредактируете (и теперь вы можете использовать список буферов для их вызова), и сообщений об обмене файлами не будет. Или используйте отдельные экземпляры Vim для каждой сессии проекта / файла / редактирования, но затем сделайте привычкой заполнять :quitкаждый экземпляр, когда вы закончите работу с файлом.

Инго Каркат
источник
Я использую сплит иногда. Я не знал, что их считают «использующими буферы». Для меня это загадочная концепция.
2c2c
1
В качестве интересного повторного открытия вкладок tabman может сгенерировать NerdTree-подобную боковую панель, которая детализирует все буферы так, как они отображались на каждой вкладке.
llinfeng
7

Другой совет: при использовании имени буфера в качестве аргумента для: buffer вам не нужно указывать полные имена. Однако если данному аргументу соответствует несколько буферов, они не будут переключены.

Любой фрагмент имени буфера может быть использован для сопоставления. Например, если у вас есть буферы, request_manager.javaа queue_manager.javaзатем :buffer queили :b queсовпадает с ними обоими, но вы переключитесь на queue_manager.java, поскольку он совпадает в начале.

Юлиус Мартин
источник
3

Я использую вкладки, Ctrl- Pи сеансы Vim в своем рабочем процессе и уже более года:

  • Я )и (сопоставил «перейти к следующей вкладке» и «перейти к предыдущей вкладке» соответственно. tnоткрывает новую вкладку. Я также использую tabm, чтобы помочь организовать вещи.

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

  • Мне еще предстоит найти что-то лучше, чем Ctrl- P, но для обработки всех файлов требуется некоторое время.

ShangoThrax
источник
1

Бросает 2с в кучу.

TLDR; :b *part-of-filename*это лучший способ найти нужный файл в списке буферов, т.е. он БЫСТРЕЕ и имеет МЕНЬШУЮ когнитивную нагрузку, чем номера буферов, вкладки или окна для отслеживания файлов.

Для меня нет ничего, чтобы было открыто 30 буферов (то есть я не занимался домашним хозяйством), и прелесть используемых буферов в том, что это совсем не замедляет меня. На самом деле, это ускоряет процесс, когда через четыре дня после открытия нужного мне файла, звоните:b *part-of-filename* и он волшебным образом появляется, производя впечатление на коллег и постоянных коллективистов.

Буферы для файлов.

Чтобы быть эффективными:

  • Откройте важный первый файл из чертовски хорошо выбранного корневого каталога
  • Откройте последующие файлы с :e
  • использование ls ВСЕ время, когда вы впервые начинаете получать хорошую мысленную модель (вы не можете обмануть то, что не видите, мысленно или буквально)
  • Никогда :qне дует
  • Войдите :bв свою мышечную память
  • :b1 подходит для первого файла, который вы открыли, иначе цифры и буквы быстро становятся неуклюжими
  • :b# подходит для перехода к последнему файлу, который является общей потребностью
  • :bd#подходит для случаев, когда вы переключились на временный файл, сделали то, что вам нужно было сделать, переключились обратно :b#и теперь хотите закрыть этот временный файл
  • :b *part-of-filename* В противном случае это лучший способ найти нужный файл в списке, т.е. он БЫСТРЕЕ и имеет МЕНЬШУЮ когнитивную нагрузку, чем номера буферов, вкладки или окна для отслеживания файлов.

Единственное раздражение в :b *part-of-filename*том, что иногда вы еще не открыли файл, и вам нужно вернуться и:e path/to/full-filename сначала.

Вкладки предназначены для выделения действительно не связанных файлов.

Или держать под рукой определенный макет окна (отказ от ответственности: я никогда не использовал его для этого сам).

Или для файлов, которые используются редко, но, как ожидается, необходимы. Для меня это обычно commitMessageфайл, который я аннотирую во время работы, поэтому мне не нужно слишком много думать, когда приходит время делать коммит. gtбыстрее чем :b com<enter>(если вам повезет, иначе :b com<tab><enter>)

  • :tabe commitMessage
  • gtили gTтакже любимая мышечная память

Окна разделены для визуального сравнения информации

Или, имея непосредственный доступ к важной информации (честно говоря, если только эта информация мне не нужна для обновления в реальном времени, :eнапример, файла журнала, я обычно просто вытягиваю содержимое в текущий файл и работаю с ним там).

  • :vspили C-w vоткрывает вертикальное разделение, то есть влево | правильно, затем используйте :bили, :eчтобы получить файл, который вы хотите
  • :spили C-w sоткройте горизонтальное разделение, т.е. сверху / снизу
  • C-w C-w т.е. двойной Ctrl-W, вращает вас вокруг доступных окон
  • C-w c закрыть текущее окно
  • C-w o закройте все остальные окна, сохраняйте ТОЛЬКО
Пол Паркер
источник
Невероятно полезный ответ, должно быть гораздо больше голосов. Спасибо за советы, особенно понимание вашего рабочего процесса с :b#и :bd#!
Алакрит
0

Добавьте их в свой .vimrcи начните любить буферы:

:nnoremap <Tab> :n<cr>
:nnoremap <S-Tab> :N<cr>

Таким образом, вы можете переключаться между ними в обычном режиме через Tab/ ShiftTab.

sjas
источник
5
Не делай этого. Вы потеряете отображение для <C-I>. Карта <C-Tab>вместо этого, если вы действительно хотите.
6
Также :nи :Nотносятся к списку аргументов, а не к открытым буферам. Вы бы хотели :bnи :bp( :bnextи :bprev). Непревзойденный tpope предоставляет отображения ]bи [bдля этого (и других хороших вещей), если хотите. (и ), или <left>и <right>стрелки, возможно, будут менее полезными клавишами для переопределения, чем tab, если вы действительно хотите короткое отображение.
Ваз
1
@jeyoung согласился - это также имеет гораздо больше смысла в использовании, Ctrl + Tabпоскольку это то, что используют большинство других графических редакторов и браузеров.
icc97
0

Я хотел бы предложить блестящую реализацию, сделанную много лет назад: kien / tabman.vim . Это разъясняет следующее:

  • Можно иметь как можно больше буферов, которые где-то тщательно спрятаны;
  • По своему дизайну вкладки предназначены для креативного отображения буферов.
    • С помощью какого-то правильного плагина табуляции можно отобразить все скрытые буферы в верхней строке (таблин);
    • Согласно моему опыту работы с vim-Airlines , при создании новой вкладки на вкладке будет отображаться очень мало актуальной информации.
    • Два тега будут занимать слот таблицы рядом, тратя впустую оставшиеся горизонтальные пространства
    • Что еще хуже, я больше не имею представления о том, какие буферы скрыты.

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

llinfeng
источник
0

Tab и Buffers - это два разных стандарта в Vi. Прочитайте эти три определения:

A buffer is the in-memory text of a file
A window is a viewport on a buffer.
A tab page is a collection of windows.

Прочитайте эту статью для получения дополнительной информации https://joshldavis.com/2014/04/05/vim-tab-madness-buffers-vs-tabs/

Gentrit
источник
0

Я загружаю «выбранные» буферы как вкладки, чтобы быстро (TAB / S-TAB) переключаться между ними. Здесь подходит структура рабочих пространств, так как для меня буферы вкладки VS - это, в основном, видимость. Я могу вставлять важные / рабочие файлы в окна и вкладки и скрывать те, которые мне не нужны, в фоновом режиме, на лету, без необходимости запоминать пути или тратить время на их поиск и загрузку снова, когда возникнет такая необходимость. Это позволяет обрабатывать несколько задач или проектов в одном сеансе VIM, я думаю, это было важно для машин с малым объемом памяти, но также хорошо для концентрации всех задач редактирования в одном фрейме приложения. У меня также есть ярлыки для переключения буфера на Ctrl-Right / Left, чтобы я мог быстро переключаться между различными буферами.

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

Для файлов подкачки вы можете указать VIM хранить их все в одной папке вашего назначения. Для этого используйте :set directory.

elig
источник