Как переключаться между несколькими конфигурациями vim с помощью команды или локальных файлов vimrc?
Я работаю в нескольких группах, каждая из которых имеет свои собственные стандарты табуляции/отступа/интервала в C.
есть ли способ иметь отдельные выбираемые конфигурации VIM для каждого так, когда я редактирую файл, либо:
- Я делаю что-то вроде
set group=1для выбора конфигурации - местный житель .vimrc, который живет в рабочем каталоге, используется для установки автоматической конфигурации
10 ответов:
В Резюме
есть несколько способов сделать это, из которых большинство было предложено, но я подумал, что я бы суммировал их с двумя дополнительными:
- Per-directory vimrc - имеет недостаток, что Vim должен быть запущен в правильном каталоге: если ваш проект находится в
~/project1и~/project1/.vim.customиcd ~ ; vim project1/file.cпользовательские параметры не будут найдены.- Modelines - очень эффективный, но имеет недостаток в необходимости добавлять их во все файлы (и не забудьте добавить их в новые файлы)
- каталог конкретных автокоманд - это очень эффективно
- поиск определенного заголовка в файле (см. ниже) - это тот, который я использовал больше всего в прошлом, когда работал в разных компаниях или на четко названных проектах
- Per-directory 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, рассмотрим что-то вроде этого, которое будет проверять, когда a .файл c открывается для a .напор.выполненный в одном каталоге .с файл.
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
у меня это в
$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
вы также можете поставить автокоманды в своем
.vimrcкоторые устанавливают определенные параметры на основе каждого пути.au BufRead,BufNewFile /path/to/project1/* setl sw=4 et au BufRead,BufNewFile /path/to/project2/* setl sw=3 noet
плагин делает правильные вещи: http://www.vim.org/scripts/script.php?script_id=441
"этот плагин ищет локальные файлы vimrc в дереве файловой системы текущего открытого файла. По умолчанию он ищет все ".lvimrc " файлы из каталога файла до корневого каталога и загружает их в обратном порядке. Имя файла и количество загруженных файлов настраивается с помощью глобальных переменных."
предполагая, что ваши коллеги-разработчики не будут жаловаться на это, вы всегда можете добавить настройки vim в каждый файл в комментариях.
/* * vim:ts=4:sw=4:expandtab:... */ int main(int argc, char **argv) { ...
Я создал инструмент с открытым кодом для этой цели. Забудьте заголовки, сканирование, конфигурации и локальные файлы vimrc.
попробуйте плавать.
плавать
swimбыстрый инструмент для переключения файлов vimrc и создания удобных псевдонимов. Вот краткий список использования. Смотрите GitHub РЕПО для пошагового руководства gif и скачать инструкции:
использование
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
Подробнее
после опробования плагина localvimrc, предложенного предыдущим плакатом, мне очень нравится иметь контроль над настройками vim без futzy для каждого проекта.
он запрашивает подтверждение перед загрузкой a .файл lvimrc по умолчанию, но есть параметр для автоматической загрузки .файлы lvimrc. Некоторые могут рассматривать это как дыру в безопасности, но она работает так, как рекламируется.
Я выбрал .гитюдного на .файлы lvimrc. Кроме того, вы можете проверить их в виде общих настроек (расширение вкладки / пространства, вкладки, другие настройки для конкретного проекта).
как отметил санки использование этого плагина является лучшим вариантом, который я видел и использую. jerseyboy прокомментировал, что утилита рекомендовала запрашивать подтверждение перед загрузкой (т. е. после открытия каждого файла). Чтобы избежать этого просто установите на своем основном
.vimrcсписок.lvimrcфайлы:
let g:localvimrc_whitelist='/development/kernel/.lvimrc'
вот вариация на тему jamessan's
function! ConditionalLoad() let cwd = getcwd() if getcwd() =~ $HOME . "/src/mobile" so $HOME/.vim.mobile endif endfunction autocmd VimEnter * call ConditionalLoad()Я часто запускаю vi без определенного файла, к которому я перехожу, поэтому это позволяет загружать конфигурацию условно на основе текущего рабочего каталога. Недостатком является то, что конфигурация применяется не на основе файла, а вне рабочего каталога.
ища в основном ту же проблему, я также нашел плагин Sauce:http://www.vim.org/scripts/script.php?script_id=3992
Он утверждает:
Sauce-это легкий менеджер для нескольких файлов vimrc, который можно использовать для загрузки различных настроек для разных сред. Короче говоря, вы можете поддерживать множество различных файлов настроек vim и загружать только те, которые вам нужны, когда они вам нужны.
Я нахожу это особенно интересно, что он сохраняет его конфигурацию в своем каталоге данных, а не ожидает, что пользователь будет разбрызгивать dotfiles по всей файловой системе. Это, хотя часто довольно Меттер личного вкуса.
Я еще не проверил его, Хотя.
Comments