Как переключаться между несколькими конфигурациями vim с помощью команды или локальных файлов vimrc?


85

Я работаю в нескольких группах, каждая из которых имеет свои стандарты табуляции / отступов / интервалов в C.

Есть ли способ иметь отдельные выбираемые конфигурации VIM для каждой, поэтому, когда я редактирую файл, либо:

  • Я что то хотел set group=1выбрать конфигурацию
  • локальный .vimrc, который находится в рабочем каталоге, используется для автоматической установки конфигурации


См. Также вопрос Переключение между двумя разными конфигурациями vim в суперпользователе.
Hotschke

Ответы:


40

В итоге

Есть несколько способов сделать это, большинство из которых было предложено, но я подумал, что резюмирую их двумя дополнительными:

  • Vimrc для каждого каталога - имеет тот недостаток, что Vim должен запускаться в правильном каталоге: если ваш проект находится в нем, ~/project1и вы уже используете ~/project1/.vim.customего cd ~ ; vim project1/file.c, пользовательские настройки не будут найдены.
  • Моделины - очень эффективны, но имеют недостаток, заключающийся в необходимости добавлять их ко всем файлам (и не забывать добавлять их в новые файлы).
  • Автокоманды для конкретных каталогов - это очень эффективно
  • Поиск в файле определенного заголовка (см. Ниже) - именно его я использовал чаще всего в прошлом, работая в разных компаниях или над четко названными проектами.
  • Vimrc для каждого каталога, который проверяется при открытии файла (см. Ниже). Еще один довольно простой в реализации, особенно если весь код вашего проекта находится в одном месте.

Поиск заголовка

Во многих организациях в верхней части каждого исходного файла есть стандартный заголовок (с уведомлением об авторских правах, названием проекта и т. Д.). Если это так, вы можете заставить Vim автоматически сканировать первые (например) 10 строк файла в поисках ключевого слова. Если он его найдет, он может изменить ваши настройки. Я изменил это, чтобы сделать его проще, чем форма, которую я использую (которая выполняет множество других функций), но создайте ~/.vim/after/filetype.vim(если у вас ее еще нет) и добавьте что-то вроде этого:

au FileType * call <SID>ConfigureFiletypes(expand("<amatch>"))

" List of file types to customise
let s:GROUPNAMETypes = ['c', 'cpp', 'vhdl', 'c.doxygen']

func! <SID>CheckForGROUPNAMECode()
    " Check if any of the first ten lines contain "GROUPNAME".

    " Read the first ten lines into a variable
    let header = getline(1)
    for i in range(2, 10)
        let header = header . getline(i)
    endfor

    if header =~ '\<GROUPNAME\>'
        " Change the status line to make it clear which
        " group we're using
        setlocal statusline=%<%f\ (GROUPNAME)\ %h%m%r%=%-14.(%l,%c%V%)\ %P
        " Do other customisation here
        setlocal et
        " etc
    endif
endfunc

func! <SID>ConfigureFiletypes(filetype)
    if index(s:GROUPNAMETypes, a:filetype) != -1
        call <SID>CheckForGROUPNAMECode()
    endif
endfunc

Функция вызывается всякий раз, когда открывается файл любого типа и устанавливается тип файла ( au FileType *строка) ConfigureFiletypes. Это проверяет, находится ли тип файла в списке типов файлов, связанных с текущей группой (GROUPNAME), в данном случае 'c', 'cpp', 'vhdl' или 'c.doxygen'. Если это так, он вызывает CheckForGROUPNAMECode (), который читает первые 10 строк файла и, если они содержат GROUPNAME, выполняет некоторые настройки. Помимо настройки expandtabs или чего-то еще, это также изменяет строку состояния, чтобы четко отображать имя группы, чтобы вы знали, что она работает с первого взгляда.

Проверка конфигурации при открытии

Как и предложение JS Bangs, может быть полезно иметь собственный файл конфигурации. Однако вместо загрузки его в vimrc рассмотрите что-то вроде этого, которое будет проверять, когда файл .c открывается для .vim.custom в том же каталоге, что и файл .c.

au BufNewFile,BufRead *.c call CheckForCustomConfiguration()

function! CheckForCustomConfiguration()
    " Check for .vim.custom in the directory containing the newly opened file
    let custom_config_file = expand('%:p:h') . '/.vim.custom'
    if filereadable(custom_config_file)
        exe 'source' custom_config_file
    endif
endfunction

66

У меня это в $HOME/.vimrc:

if filereadable(".vim.custom")
    so .vim.custom
endif

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

ОБНОВИТЬ:

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

let b:thisdir=expand("%:p:h")
let b:vim=b:thisdir."/.vim"
if (filereadable(b:vim))
    execute "source ".b:vim
endif

1
Это круто, я такого еще не видел!
Джим Митченер,

1
Это отличное решение для проектов, которые живут в репозиториях!
bradreaves

2
'exrc'Вариант уже позволяет делать что - то очень похожее на это. Он загрузит .vimrc/ .exrc/ .gvimrcв текущий рабочий каталог.
jamessan

Комментарий exrcдолжен быть правильным ответом. Все остальное кажется хакерским и сложным.
Silvenon

Использование exrc- это хорошо, но я ценю получение правильного файла, даже если я не нахожусь в том же рабочем каталоге, что и файл, который редактирую.
JSB ձոգչ

34

Вы также можете поместить в свой файл автокоманды,.vimrc которые устанавливают определенные параметры для каждого пути.

au BufRead,BufNewFile /path/to/project1/* setl sw=4 et
au BufRead,BufNewFile /path/to/project2/* setl sw=3 noet

Это замечательно, когда вы не контролируете репозиторий и не можете помещать туда файлы ".vim.custom". Мне нравится, что он сохраняет репозиторий в чистоте. Спасибо. Отказ от ответственности: если путь продолжает меняться не в соответствии с шаблоном, то версия ".vim.custom", возможно, лучше, если предположить, что можно изменить репозиторий.
lpapp

17

Плагин делает правильные вещи: http://www.vim.org/scripts/script.php?script_id=441

«Этот плагин ищет локальные файлы vimrc в дереве файловой системы текущего открытого файла. По умолчанию он ищет все файлы «.lvimrc» от каталога файла до корневого каталога и загружает их в обратном порядке. Имя файла и количество загружаемых файлов можно настроить с помощью глобальных переменных ».


3
И версия на github также поддерживает загрузку с патогеном :-)
Граза

Другой похожий плагин - localrc.vim; он также позволяет настраивать каталоги для конкретных типов файлов; Я считаю это незаменимым. vim.org/scripts/script.php?script_id=3393
Инго Каркат,

12

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

/*
 * vim:ts=4:sw=4:expandtab:...
 */

int main(int argc, char **argv)
{
    ...

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

1
Я предпочитаю добавлять их внизу, чтобы они были ненавязчивыми, но я думаю, это вопрос стиля.
nyuszika7h

5

Я создал инструмент с открытым исходным кодом именно для этой цели. Забудьте о заголовках, сканировании, конфигурациях и локальных файлах vimrc.

Попробуй плавать.


Плавать

swimэто быстрый инструмент для переключения файлов vimrc и создания удобных псевдонимов. Вот краткий список использования. См. Репозиторий Github для ознакомления с гифкой и инструкциями по загрузке:


Применение

swim add ~/dotfiles/myVimrc favorite    #Add new swim alias
swim ls                                 #Show available swim aliases
swim add https://raw.githubusercontent.com/dawsonbotsford/swim/master/exampleVimrcs/vimrcWikia.vim example
swim with favorite         #Set alias favorite as primary .vimrc
swim with main             #Set alias main as primary .vimrc

Прочитайте больше

https://github.com/dawsonbotsford/swim


4

После того, как я опробовал плагин localvimrc, предложенный на предыдущем постере, мне очень понравилось, что над настройками vim не зависит от проекта.

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

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


1
Это потрясающий сценарий: github.com/MarcWeber/vim-addon-local-vimrc . 1) Теперь он запрашивает только один раз и помечает хеш файла как ОК. 2) Он пересекает дерево каталогов от корня к текущему каталогу, в последнюю очередь находя более близкие файлы с более высоким приоритетом.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Зачем добавлять .lvimrcфайл .gitignore? Дело в том, что у всех, кто использует vim и установлен плагин, одинаковые настройки.
nyuszika7h

2
@ nyuszika7h одни настройки должны быть принудительными, а другие - сугубо личными. Для настроек, которые должны быть обязательными для всех, EditorConfig даже лучше, поскольку он не зависит от редактора: github.com/editorconfig/editorconfig-vim
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1

Как уже упоминал sledge, использование этого плагина - лучший вариант, который я когда-либо видел и использовал. jerseyboy прокомментировал, что утилита рекомендует запрашивать подтверждение перед загрузкой (то есть после открытия каждого файла). Чтобы этого не .vimrcпроизошло, просто установите на своей главной странице список локальных .lvimrcфайлов:

let g:localvimrc_whitelist='/development/kernel/.lvimrc'


1

Вот вариант Джемессана

function! ConditionalLoad()
    let cwd = getcwd()
    if getcwd() =~ $HOME . "/src/mobile"
        so $HOME/.vim.mobile
    endif
endfunction
autocmd VimEnter * call ConditionalLoad()

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


Именно то, что я искал. В качестве примера использования: я поместил этот код ~/.vimrc, изменил его /src/mobileв каталог проектов Symfony (в моем случае это было /www/symfony) и изменил, .vim.mobileчтобы .vim.symfonyзатем поместить новую конфигурацию .vimrc внутри ~/.vim.symfonyфайла
jmarceli

1

Я работаю в нескольких группах, каждая из которых имеет свои стандарты табуляции / отступов / интервалов в C.

Я работаю со всеми видами открытого кода одновременно. Создавать отдельные .vimrcфайлы и изменять стандарты форматирования непрактично . Более десяти лет назад мне, наконец, надоело иметь дело с конфигурацией редактора, и я написал программу, призванную autotabее обрабатывать.

Когда autotabон настроен с предложенным Vim, каждый раз, когда вы загружаете файл в Vim, autotabон вызывается, и выходные autotabданные настроек Vim передаются :setкоманде.

autotabчитает несколько тысяч строк из файла, анализирует их и определяет настройки для параметров expandtab, tabstopи shiftwidth.

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

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

Он также «не зависит от типа файла» и хорошо работает с множеством разных языков. Я использую его не только поверх C, но и сценариев оболочки, Lisp, Makefiles, HTML и прочего.

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


0

В поисках той же проблемы я также нашел плагин Sauce: http://www.vim.org/scripts/script.php?script_id=3992

Он утверждает:

Sauce - это легкий менеджер для нескольких файлов vimrc, который можно использовать для загрузки различных настроек для разных сред. Короче говоря, вы можете поддерживать множество различных файлов настроек vim и загружать только те, которые вам нужны, когда они вам нужны.

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

Однако мне еще предстоит это проверить.


0

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

Установить stow:

$ apt install stow

Создайте несколько каталогов для каждой конфигурации:

~$ ls -d ~/dotfiles/vim*
vim-all vim-webdev vim-go

Поместите .vimrcв них разные :

$ find ~/dotfiles -name .vimrc
/home/username/vim-golang/.vimrc
/home/username/vim-webdev/.vimrc
/home/username/vim-all/.vimrc

Теперь вы можете мгновенно активировать конфигурацию vim-golang с помощью этой команды (она должна запускаться внутри каталога dotfiles):

~$ cd ~/dotfiles

dotfiles$ stow -v vim-golang
LINK: .vimrc => dotfiles/vim-golang/.vimrc

Теперь это связано:

$ cd ~ && ls -l .vimrc 
.vimrc -> dotfiles/vim-golang/.vimrc

Если вам нужно переключить конфиг, просто переустановите stowего:

~$ cd dotfiles

dotfiles$ stow -v -D vim-golang
UNLINK: .vimrc

dotfiles$ stow -v vim-webdev
LINK: .vimrc => dotfiles/vim-webdev/.vimrc

$ cd ~ && ls -l .vimrc 
.vimrc -> dotfiles/vim-webdev/.vimrc

Подробнее об этом здесь: Управление точечными файлами с помощью GNU stow

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.