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

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

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

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

Ответ 1

В резюме

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

  • Per-directory vimrc - имеет тот недостаток, что Vim должен быть запущен в правом каталоге: если ваш проект находится в ~/project1 и у вас есть ~/project1/.vim.custom и do 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, рассмотрите что-то вроде этого, которое будет проверять, когда файл .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

Ответ 2

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

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

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

UPDATE:

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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


Swim

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


Использование

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

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

Здесь вариация на jamessan's

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

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

Ответ 10

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

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

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

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

Мне еще нужно проверить это.