Как разрешается история команд между несколькими экземплярами Vim?

15

Vim хранит историю ex-команд (доступную через :и q:), и эта история сохраняется после выхода.

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

200_success
источник
1
В самом деле? Эта история не сохраняется после ухода для меня. (Vim 7.4.52, Ubuntu 14.04)
дверная ручка
3
@ Doorknob Убедитесь, что ваша ~/.viminfoсобственность принадлежит вам. Распространенная ошибка - запускать людей, sudo vim ...которые, если вы ранее не запускали vim от имени своего собственного пользователя, будут созданы ~/.viminfoкак root. Если это проблема, я бы предложил научиться использовать sudoeditили sudo -eредактировать привилегированные файлы.
Jamessan
@jamessan Да, похоже, это действительно была проблема; chown'мой мой .viminfo обратно к себе исправил. (Не уверен, как его владелец изменился на root, так как я всегда использовал sudoedit, ну да ладно.)
Doorknob

Ответы:

10

Ответ на ваш заглавный вопрос - это то, что вы заметили. Из руководства пользователя vim:help 21.3

Когда вы запускаете Vim несколько раз, последний выходящий будет хранить его информацию. Это может привести к потере информации, которая ранее была сохранена из Vims. Каждый предмет можно запомнить только один раз.

Однако имя файла viminfo (где хранится история команд, среди прочего, например, глобальные метки и содержимое регистра, если так настроено) является изменяемым! Это означает, что вы можете установить разные «истории» для разных проектов или экземпляров vim. Предполагая, что вы не запускаете более одного экземпляра vim на проект, управление именем файла viminfo с помощью vimrc (или другого плагина настроек проекта) является отличным способом справиться с этим.

Настройка альтернативных файлов viminfo

Для управления уровнем проекта мы хотим настроить vim для сохранения вашего viminfo в другом файле. Это может быть сделано в работающем vim перед выходом или вашим vimrc, например, в вашем vimrc могут быть строки, которые определяют, что определенный каталог принадлежит проекту.

:set viminfo+=nPath/to/custom/viminfofile

Пример того, как vimrc автоматически устанавливает это на основе каталога:

 if getcwd() == "/projects/projA"
     set viminfo+=n~/.viminfo-projA
 endif

Результатом вышеизложенного является то, что история проекта будет загружена при запуске и сохранена при выходе, если vim запущен в каталоге / projects / projA.

Загрузите альтернативный viminfo во время запуска

Это хорошо для случая, когда вы хотите сохранить свою историю в сторону и загрузить ее позже, не управляя ею на уровне проекта.

Во-первых, чтобы сохранить историю, вы добавляете к опции viminfo, как указано выше, перед выходом. Затем, чтобы загрузить историю, запустите vim с опцией -i

vim -i Path/to/custom/viminfofile

Если вы не хотите выходить из vim для сохранения файла viminfo, вы можете использовать :wv( :wviminfo). Это сохранит файл viminfo без выхода из vim в соответствии с настройкой n выше. Вы также :wv SomeOtherFileможете сохранить в месте, которое не совпадает с настройкой параметра viminfo. Это может быть более удобным, чем настройка имени файла для использования при выходе, но не мешает vim использовать файл по умолчанию после его выхода.

Например, в первом vim:

:wv ~/customInfo

и во втором терминале:

vim -i ~/customInfo

Или, если второй vim уже запущен и вы хотите загрузить viminfo:

:rv ~/customInfo

Обратите внимание , что :wvи :rvне изменить имя файла Vim будет экономить на выходе , ни имя файла для чтения во время запуска.

Дополнительная информация

Описание set viminfo+=nSomePath: Мы используем команду set для настройки названной опции viminfo. +=Показывает , что мы хотим , чтобы добавить к выбору, а не изменить все. Мы добавляем nпараметр, который указывает имя файла для viminfo. Сразу после nтого, как у нас SomePathбудет имя файла, используемого для сохранения viminfo.

Документация для wv( :help wv) указывает, что эта команда сначала прочитает файл viminfo, а затем объединит старую и новую информацию. Пока у меня нет информации о том, как происходит слияние в этом случае, но я предполагаю, что он сохраняет метки для неизвестных файлов и регистров, которые не установлены в текущем сеансе.

Джон ОМ.
источник