vim: несколько «сеансов» в одном экземпляре?

#vim #vim-plugin

#vim #vim-плагин

Вопрос:

Я работаю над растущим проектом с vim. Мне нравится, когда большинство файлов проекта открываются в одном сеансе. Однако по мере роста проекта у меня одновременно открывается слишком много файлов; переключение между файлами [*] становится немного непродуктивным при более чем 40 файлах, потому что список становится слишком длинным (для, скажем, 20 файлов этот способ навигации работает очень хорошо для меня, однако).

Есть ли способ разделить сеанс на несколько «подсессий» в одном экземпляре vim?

Как я себе представляю, что каждый сеанс будет содержать, скажем, 20 файлов и перечислять только те :ls , с которыми я могу переключаться между ними в одном окне vim (в основном так же, как если бы я запускал несколько экземпляров vim в одной оболочке и переключался между ними Ctrl-Z; fg %X , просто не выходя из vim).

[*] Мне нравится перемещаться между файлами с :ls последующим :bX (или непосредственно :bX , если я запомнил номер буфера), а также :bp / :bn , и у меня всегда есть как минимум два открытых разделения, и этот рабочий процесс работает для меня довольно хорошо, поэтому я не ищу более эффективные альтернативы :ls .

Комментарии:

1. С какой проблемой вы столкнулись? В вашем вопросе вы говорите о том, что ваш текущий рабочий процесс «становится немного непродуктивным» (не объясняя, что это значит для вас), но в своем комментарии к ответу Luc вы говорите о размере файла сеанса.

2. Кстати, если вы все еще сталкиваетесь с той же проблемой, вы можете посмотреть, есть ли ответ в бета-версии Vim .

Ответ №1:

Я никогда не использую :ls . Однако я часто работаю над большими проектами и открываю (много) файлов из разных проектов (и я все еще могу компилировать то, что хочу, в нужном мне режиме (debug, release, …), генерировать теги независимо для каждого проекта, иметь разные стили кодирования и т. Д.)

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

  • :sb , который поддерживает завершение табуляции для имен файлов (уже открытых в буфере)
  • :sp **/filename*<tab> (Когда он еще не открыт)
  • мой старый плагин — другие обычно используют Unite, command-T или другие подобные плагины — для объединения :sp и :sb в одну команду.
  • Теги. Интеграция тегов по умолчанию (/ csope) уже хороша. Тем не менее, я разработал lh-теги, чтобы просто использовать навигацию по тегам в мире перегруженных и переопределенных функций, как это имеет место в C .

РЕДАКТИРОВАТЬ: я только что запустил экспериментальную :Project <name> :ls функцию в lh-vim-lib. Примечание: эта новая функция проекта не предназначалась для выполнения того, что вы ищете, но благодаря ей легко получить ограничение :ls .

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

 :let s:k_version = 1
" Global definitions executed everytime we enter a file belonging to the project
" This is where we set g:lobal_variables and options for project-unaware plugins.
....

" Then the anti-reinclusion guards for buffer definitions
if amp;cp || (exists("b:loaded__my_foobar_project_settings")
       amp;amp; (b:loaded__my_foobar_project_settings > s:k_version)
       amp;amp; !exists('g:force_reload__my_foobar_project_settings'))
  finish
endif
let b:loaded__my_foobar_project_settings = s:k_version
let s:cpo_save=amp;cpo
set cpoamp;vim

" HERE, we say the current buffer belongs to a project
" solution 1 when we need more control
:call lh#project#define(s:, {'name': 'YouProjectName'})
" OR solution 2 which is easier to manipulate (tab completion, ...)
:Project --define YourProjectName
  

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

Затем вы сможете просмотреть список проектов :Project --list или просмотреть буферы, связанные с данным проектом :Project YouProjectName :ls .

Комментарии:

1. Спасибо за ваши предложения, я не знал :sb , что выглядит удобно. Однако вопрос заключается не столько в том, «как перейти из одного файла в другой»; :ls за которым следует :bX (или непосредственно bX , как только я запомнил номер буфера) вместе :bn с / :bp работает достаточно хорошо для меня. Основная проблема на самом деле заключается в том, что сеанс становится немного большим, и я бы хотел избежать использования нескольких экземпляров vim в разных окнах tmux (хотя, вероятно, это был бы путь, если что-то похожее на то, что я описал в вопросе, невозможно).

2. Вот в чем дело: вам не нужно запоминать номера буферов, чтобы открыть буфер в текущем окне. :sb и :b поддержка завершения вкладки частично в имени файла буфера. Нам действительно не нужно :ls знать номера буферов, чтобы загрузить эти открытые буферы в текущее окно.

3. В противном случае, в лучшем случае, есть вкладки, но все равно все будет видно по :ls

4. Что заставляет меня задуматься. В настоящее время я работаю над новой функцией проекта в моей lh-vim-lib — мне в основном нужно написать документы и использовать их в других моих шагах плагинов. Было бы довольно легко добавить a :Ls <projectname> для отображения буферов, связанных с активными проектами.

5. Для чего это стоит, я тоже не использую :ls , я просто печатаю :b , начинаю вводить имя файла и нажимаю клавишу TAB для завершения