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



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



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




  • Я делаю что-то вроде set group=1 для выбора конфигурации

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

659   10  
vim

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


Подробнее

https://github.com/dawsonbotsford/swim

после опробования плагина 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

    Ничего не найдено.