Vim : 디렉토리의 파일에 설정 적용


103

현재 디렉토리에있는 모든 파일에 대해 Vim 설정을 어떻게 지정합니까?

이상적인 해결책은 Vim이 ~ / .vimrc를 검색하기 전에 현재 디렉토리에서 .vimrc를 검색하고 읽은 다음 전체 트리에 설정을 적용하는 것입니다.

나는 플러그인 을 보았지만 이것은 플러그인을 설치해야하므로 적용된 설정이 투명하지 않다는 것을 의미합니다. 반대로, 모델 라인은 사용자의 vimrc 또는 특정 vim 호출에 관계없이 해당 파일에 대해 모델 라인 설정이 적용되므로 투명합니다.

내가 시도한 것은

  • 작업 디렉토리에 .vimrc 배치
  • :so vimrc modeline에서.

보안상의 이유로 둘 다 작동하지 않는 것 같습니다. vimrc의 모든 기능이 필요하지 않습니다. 모델 린이 허용하는 설정에 묶여 있으면 충분합니다. 제 목표는 vimmers가 프로젝트에서 코딩 표준을 쉽게 채택 할 수 있도록하는 것입니다.


답변:


42

나는 플러그인 방식 의 옹호자입니다 . 몇 가지 이유가 있습니다.

  • 모델 인은 특히 제한적입니다. "for-snippet의 중괄호가 줄 바꿈에 있어야합니까?"와 같이 다른 (ft) 플러그인을 조정하는 변수를 설정하거나 그들로부터 함수를 호출 할 수 없습니다 (나는 자신을 제한하지 않습니다). 코딩 표준에 따라 현재 디렉토리에 따라 사용할 메이크 파일도 설정했습니다.)
  • DRY : 모델 인을 사용하면 모든 파일에서 설정을 반복해야합니다. 설정하거나 변경할 조정 사항이 너무 많으면 유지 관리가 금방 어려워지고 템플릿 확장 플러그인을 사용해야합니다 ( 프로젝트에 여러 명의 vimmer가있는 경우 고려해야합니다).
  • 모든 사람이 vim을 사용하여 개발하는 것은 아닙니다. 다른 사람들의 편집자 설정에 방해 받고 싶지 않습니다. 왜 그들의 설정을 기생시켜야합니까?
  • vimmers에게 .vimrc의 동일한 줄을 복사하여 붙여넣고 유지하도록 요청하는 대신 동일한 플러그인을 설치하도록 요청하는 것이 더 쉽습니다.
  • 설정은 다른 프로젝트 파일 (cvs / svn / git / whatever)과 함께 저장할 수 있습니다.
  • 프로젝트별로 구성 파일을 만드는 것은 정말 쉽습니다. 플러그인을 사용하면 전체 프로젝트의 코딩 표준에 대한 전역 구성 파일과 각 하위 프로젝트에 대한 특정 구성 파일 (사용할 makefile, 호출 할 실행 파일)이 있습니다. , ...)

BTW, sth의 솔루션 을 사용하여 단일 구성 파일을 소싱 할 수 있습니다. 이것은 .vimrc가 비 글로벌 옵션으로 기생해야한다는 점을 제외하고 플러그인 접근 방식과 매우 유사하며 쉽게 다중 / 공유 구성 파일을 지원하지 않습니다.


플러그인을 올바르게 실행하기 전에 경로에 새 파일을 저장해야합니다.
cmcginty

과연. 이 플러그인 제품군은 프레임 워크를 정의 할뿐입니다. 프레임 워크가 자동으로 소싱 할 프로젝트 특정 정의를 파일에 작성해야합니다.
Luc Hermitte

1
Luc는 자신의 플러그인을 링크합니다. 이것은 질문에 연결된 것보다 훨씬 잘 작동하는 것 같습니다. 감사.
데이터

잘. 말할 수 없습니다. 수년간 내 것을 사용해 왔기 때문에 다른 구현을 면밀히 살펴본 적이 없습니다. 때때로 나는 내가 결국 고려하는 버그 보고서를 받는다. BTW, 내 버전은 템플릿을 확장하기 전에 프로젝트 별 변수를 설정하기 위해 mu-template 이전에 트리거되도록 구현되었습니다 (현재 프로젝트 루트 디렉토리를 가져와 확장 된 경로 이름에서 트리밍하는 데 매우 유용합니다)
Luc Hermitte

1
@JasonMcCarrell 나의 local_vimrc 구현과 Markus "embear"Braun의 구현은 블랙리스트, 화이트리스트를 지원합니다 ... 들여 쓰기가 수행되는 방식을 지정해야하는 경우 EditorConfig-vim 플러그인이 더 나은 선택 일 수 있습니다.
Luc Hermitte

91

이런 걸 넣을 수 있습니다 $VIM/vimrc

autocmd BufNewFile,BufRead /path/to/files/* set nowrap tabstop=4 shiftwidth=4

1
이것은 재귀 적이지만 *. / path / to / files / 또는 / path / to / files로 줄이려고하면 작동하지 않습니다.
SystemParadox

프로젝트에 "noexpandtab"로 작성된 파일 트리와 모든 파일 "expandtab"(예 : CodeIgniter)가있는 다른 트리가있는 경우 유용합니다. 하나의 구성 파일로 각 트리의 파일에 대한 적절한 작업을 개별적으로 설정할 수 있습니다.
user9645

2
이상하게도 내 경로에 심볼릭 링크가 포함되어있을 때는 작동하지 않았습니다. 작동하기 전에 심볼릭 링크가없는 전체 경로를 입력해야했습니다.
Dolan Antenucci 2014 년

이 접근 방식 (분산 .vimrc 대 중앙 집중식)의 대안으로 "신뢰할 수있는 vim"을 사용하는 방법에 대한 joseph07의 답변을 참조하십시오.
Nathan Schulte

50

사용하지 않는 것이 좋습니다. set exrc

을 사용하더라도 set secure* nix에서 파일을 소유하고 있다면 vim은 자동 명령, 쉘 등을 실행합니다. 따라서 해당 tarball에서 파일을 편집 한 경우 다음을 .vimrc포함 하여 보냈습니다 .

autocmd BufEnter * :silent! !echo rm -rf ~/

당신은 아마 나보다 덜 재미있을 것입니다.


6
이는 vim이로드 될 때 자동으로 실행되는 플러그인에서도 마찬가지입니다.
Luc Hermitte

31

이 질문은 오래되었지만 매우 자연스럽고 지속적인 관심사 인 것 같습니다.

내 솔루션은 매우 간단합니다. 나는 장소 .vimrc내 프로젝트의 루트 디렉토리에 파일을. .vimrc파일 의 첫 번째 줄은 일반적으로 소스 ~/.vimrc를 지정한 다음 원하는 특정 구성을 추가합니다. 나는 별칭 tvim='vim -u .vimrc'을 지정하고 tvim개인 프로젝트 디렉토리에서 사용합니다. "신뢰할 수있는 vim"을 의미하는 "tvim"은 .vimrc파일이 있는 디렉토리에서 실행 했는데 문제가 발생하면 명시 적으로 신뢰한다고 말했기 때문에 나 자신을 비난 할 사람이 없다는 뜻입니다. 또한 특정 종류의 프로젝트에 대해 원하는 항목을 소프트 링크 할 수 있도록 이러한 그룹을 저장해 둡니다.


1
이 접근 방식은 간단하고 제 요구에 완벽하게 부합합니다.
Jinxed

내가 이것을 시도하고 source $HOME/.vimrc내 로컬 .vimrc에서 Vim은 시스템 전체에 설치된 플러그인을 찾을 수 없다고 불평합니다 (이 경우 병원균; execute pathogen#infect()내 맨 위 의 명령은 $HOME/.vimrc실패합니다 Unknown function ...). 이 문제를 어떻게 해결할 수 있습니까?
Nathan Schulte

20

작업 디렉토리에 .vimrc를 배치하는 것은 실제로 지원되며 기본적으로 비활성화되어 있습니다. 참조 :h 'exrc':h startup자세한 내용은, 설정은 'exrc'읽기 가능하게 .vimrc현재 디렉토리를.

:set secure이것을 사용할 때도 추천합니다 . 이것은 현재 디렉토리에서 :autocmd, 쉘 및 쓰기 명령을 잠급니다 .vimrc.

살펴볼 가치가있는 또 다른 것은 :h session프로젝트에 대한 표준보기 및 설정 으로 세션 ( )을 설정하는 것입니다.

즉, Luc Hermitte가 직접 설명한 플러그인 옵션을 사용할 것입니다.


6
phen으로 주석을 참조하십시오. 이것은 심각한 보안 문제로 이어질 수 있습니다.
데이터

11

요즘 ANYTHING에 대한 모든 "자동 실행"기능으로 보안 위험을 최소화하려면 플러그인 (휴대용 수하물) 대신 vim의 기존 기능을 활용하는 것이 좋습니다.

예 :

내 로컬 폴더의 vimrc 파일 이름은 "_gvimrc"(의도적으로)입니다. 이것은 펜과 같은 사람들이 우리의 비용으로 자신을 즐겁게하는 희망을 줄입니다. :-)

$ VIM / .vimrc 파일에 다음을 삽입했습니다.

if filereadable("_gvimrc")
    source _gvimrc
endif

끝에.

나는 "fileexists ()"보다 "fileReadable ()"을 사용한다. 나중에 여러 개의 (10 개 이상의) 파일을 동시에 열 때 고문을 당할 때 약간의 기이함이 있기 때문이다.

물론 고유 한 파일 이름을 지정하여 잠재적 인 문제를 일으키는 원인을 더 명확하게 할 수 있습니다. "_mygvimrc", "_gobbledygook"등. 하나의 표준화 된 이름을 정하고 그에 따라 $ VIM / .vimrc에서 소스를 지정하면됩니다. 이를 위해 vi / vim 내부에 의존하면 이식성 문제가 배제됩니다. 그러나 나중에 vim으로 $ VIM / .vimrc 파일을 편집하는 경우 재귀 적 소싱을 방지하기 위해 이름을 .vimrc (또는 _vimrc)로 지정하지 마십시오.

Windoze 98SE부터 Windork XP Pro, 현재 Windorkier 7 (이미 5 년 이상)을 통해 이것을 사용하고 있습니다. Explorer에서 .txt 파일 목록을 표시 한 다음 "Edit with multiple Vim"을 사용하면 여러 vim 창이 동시에 열립니다. 제 작업을 위해 매일 여러 번이 작업을 수행합니다. 모든 파일은 내 로컬 _gvimrc에서 설정 한 것으로 처리되었습니다.


여기서, 플러그인 이식성에 대한 불신은 근거가 없습니다. 이러한 local_vimrc 플러그인 (적어도 내 것)은 이식성이 있기 때문입니다 (다양한 다른 OS, 심지어 Windows 95에서도 유지 되곤했습니다). 보안 위험에 대한 문제도 과장되어 있습니다. 이렇게하면 작업을 쉽게하기 위해 아무것도 설치하지 않을 것입니다.
Luc Hermitte

그러나 내가 아는 한, 첫 번째 진짜 문제는 접근 방식으로 _gvimrc 파일이 포함 된 정확한 디렉토리에서 작업해야한다는 것입니다 (gvim 특정 항목을 포함하기위한 잘못된 이름입니다). 프로젝트가 공통 구성이 필요할 수있는 여러 디렉토리와 특정 디렉토리 (여러 모듈의 경우)로 구성되어있는 경우 제한 사항이 빠르게 표시됩니다.
Luc Hermitte

두 번째 문제는 한 번에 하나의 프로젝트에서만 작업 할 수 있다는 것입니다. OTB, openjpeg 및 두 라이브러리를 모두 처리하는 프로젝트에서 작업하려는 경우이 솔루션을 사용하면 각 라이브러리에 대한 특정 설정을 지정할 수 없습니다. 세 가지 프로젝트.
Luc Hermitte

이것은 또한 로컬 디렉토리에서 구문 파일을로드하는 데이지 체인으로 작동합니다.
maharvey67

2

사람들이 며칠마다 파일을 추가하지 않는다고 가정하면 각 파일의 맨 위에 모델을 추가 할 수 있습니다. 실제로 버전 제어 시스템에서 허용하는 경우 각 파일이 체크인 될 때 ​​모델 인이 있어야한다는 규칙을 시행 할 수 있습니다.



2

"editorconfig"사용

적용하려는 코딩 표준의 종류가 들여 쓰기 스타일, 탭 크기, 파일 형식 및 문자 집합과 관련 이있는 경우 이러한 종류의 설정을 지정하기위한 교차 편집기 표준 인 "editorconfig" 를 살펴볼 수 있습니다 . 모든 편집자가 해당 구성을 따르도록합니다.

"editorconfig"사양을 사용하면 프로젝트에서 파일 확장자 또는 프로젝트 내 이름에 따라 다른 설정을 요청할 수 있습니다. (따라서 TAB을 사용하는 Makefile, 4 개의 공백을 사용하는 Python 스크립트 및 들여 쓰기를 위해 2 개의 공백을 사용하는 쉘 스크립트를 가질 수 있습니다.)

Vim에서 "editorconfig"를 사용하려면 플러그인이 필요합니다. 공식 웹 사이트에서 제공하지만 개인적 으로 순수한 Vimscript로 작성된 sgur / vim-editorconfig를 권장 하므로 외부 종속성에 대해 너무 걱정할 필요가 없습니다.

"editorconfig"는 편집기 간 호환성을 목표로하기 때문에 수행하는 작업이 상당히 제한되어 있으므로 일관된 공백, 파일 형식 (DOS 대 Unix) 및 인코딩 (유니 코드 utf-8 등)을 원하면 "editorconfig"를 선택하십시오. "는 당신을위한 것입니다.



0

나는 존재하는 플러그인을 살펴 보았고 그중 어떤 것도 좋아하지 않았기 때문에 vim-fugitive를 사용 하는 간단한 함수를 작성했습니다 . 이것의 장점은 프로젝트의 루트가 항상 저장소의 루트라는 것을 알고 있으며 추가로 파일을 해시하여 신뢰 테이블을 유지할 수 있다는 것입니다. .vimrc파일에 다음을 넣으십시오 .

function LoadRepoVimrc()
  let l:path = fugitive#repo().tree('.vimrc')
  if filereadable(l:path)
    let l:sha1 = fugitive#repo().git_chomp('hash-object',l:path)
    if !exists('g:SAFE_VIMRC') | let g:SAFE_VIMRC = {} | endif
    if has_key(g:SAFE_VIMRC,l:path) && g:SAFE_VIMRC[l:path] ==? l:sha1
      execute 'source '.fnameescape(l:path)
    elseif confirm("Trust ".l:path."?", "&Yes\n&No",2) == 1
      let g:SAFE_VIMRC[l:path] = l:sha1
      execute 'source '.fnameescape(l:path)
    else
      execute 'sandbox source '.fnameescape(l:path)
    endif
  endif
endfunction
autocmd User FugitiveBoot call LoadRepoVimrc()
set viminfo ^= !

경우 !옵션이 설정되어 viminfo설정, 다음 SAFE_VIMRC사전은 (음 실행 사이에 유지됩니다 ^그것은까지 혼란을하지 않도록하는 옵션을 앞에 추가하는 n옵션).

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