명령 또는 로컬 vimrc 파일을 사용하여 여러 vim 구성간에 전환하는 방법은 무엇입니까?


85

저는 여러 그룹에서 작업하며 각 그룹에는 C에서 고유 한 탭 / 들여 쓰기 / 간격 표준이 있습니다.

각각에 대해 별도의 선택 가능한 VIM 구성을 갖는 방법이 있습니까? 그래서 파일을 편집 할 때 다음 중 하나를 수행하십시오.

  • set group=1구성을 선택하는 것과 같은 작업 을합니다.
  • 작업 디렉토리에있는 로컬 .vimrc는 구성을 자동으로 설정하는 데 사용됩니다.

이것을 확인하십시오 : stackoverflow.com/a/14407951/1099240
Dmitry Frank

수퍼 유저에서 서로 다른 두 vim 구성 간 전환 질문도 참조하십시오 .
Hotschke

답변:


40

요약해서 말하자면

이를 수행하는 몇 가지 방법이 있으며 그 중 대부분이 제안되었지만 두 가지 추가 방법으로 요약 할 것이라고 생각했습니다.

  • vimrc에 디렉토리 당 - 빔이 올바른 디렉토리에서 시작해야한다는 단점이있다 : 프로젝트가있는 경우 ~/project1와, 당신은 ~/project1/.vim.custom하고 할cd ~ ; vim project1/file.c 사용자 지정 설정을 찾을 수 없습니다.
  • Modelines-매우 효과적이지만 모든 파일에 추가해야한다는 단점이 있습니다 (새 파일에 추가해야 함).
  • 디렉토리 특정 자동 명령-이것은 매우 효과적입니다.
  • 파일에서 특정 헤더를 스캔합니다 (아래 참조)-이것은 과거에 다른 회사에서 일하거나 명확하게 이름이 지정된 프로젝트에서 가장 많이 사용했던 헤더입니다.
  • 파일이 열릴 때 확인되는 디렉토리 별 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을 포함하면 일부 사용자 지정을 수행합니다. 확장 탭 등을 설정하는 것 외에도 그룹 이름이 명확하게 표시되도록 상태 표시 줄이 변경되어 한 눈에 작동하는지 알 수 있습니다.

열 때 구성 확인

JS Bangs의 제안과 마찬가지로 사용자 정의 구성 파일을 갖는 것이 유용 할 수 있습니다. 그러나 vimrc에서로드하는 대신 .c 파일과 동일한 디렉토리에있는 .vim.custom에 대해 .c 파일이 열릴 때 확인하는 다음과 같은 것을 고려하십시오.

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

66

나는 이것을 가지고있다 $HOME/.vimrc:

if filereadable(".vim.custom")
    so .vim.custom
endif

이를 통해 .vim.custom모든 디렉토리에 파일 을 넣어 해당 디렉토리에 특정한 명령과 옵션을로드 할 수 있습니다. 디렉토리 구조가 깊은 여러 프로젝트에서 작업하는 경우 더 정교한 것이 필요할 수 있지만 (예 : a .vim.custom가 발견 될 때까지 디렉토리 트리 위로 이동 ) 동일한 기본 아이디어가 작동합니다.

최신 정보:

이제 .vim현재 디렉토리가 무엇이든 상관없이 편집중인 파일과 동일한 디렉토리에서 파일 을 읽기 위해 이와 같은 작업을 수행합니다 .

let b:thisdir=expand("%:p:h")
let b:vim=b:thisdir."/.vim"
if (filereadable(b:vim))
    execute "source ".b:vim
endif

1
이것은 대단합니다, 나는 이것을 본 적이 없습니다!
Jim Mitchener 2009

1
이것은 repos에있는 프로젝트를위한 훌륭한 솔루션입니다!
bradreaves 2009

2
'exrc'옵션은 이미 이와 매우 유사한 작업을 허용합니다. 현재 작업 디렉토리에 .vimrc/ .exrc/ .gvimrc를 로드합니다 .
jamessan

에 대한 의견이 exrc정답이어야합니다. 다른 모든 것은 엉망이고 복잡해 보입니다.
silvenon 2014 년

사용하는 exrc것은 좋지만 편집중인 파일과 동일한 작업 디렉토리에 있지 않아도 올바른 파일을 얻는 것에 감사드립니다.
JSB ձոգչ 2014 년

34

경로별로 특정 옵션을 설정하는 자동 명령 을 넣을 수도 .vimrc있습니다.

au BufRead,BufNewFile /path/to/project1/* setl sw=4 et
au BufRead,BufNewFile /path/to/project2/* setl sw=3 noet

이것은 당신이 저장소를 통제하지 않을 때 ".vim.custom"파일을 거기에 넣을 수 없을 때 좋습니다. 저장소를 깨끗하게 유지하는 것이 좋습니다. 감사. 면책 조항 : 경로가 패턴 친화적이지 않은 방식으로 계속 변경되면 ".vim.custom"버전이 저장소를 수정할 수 있다고 가정하면 더 좋을 것입니다.
lpapp 2014

17

올바른 일을하는 플러그인 : http://www.vim.org/scripts/script.php?script_id=441

“이 플러그인은 현재 열려있는 파일의 파일 시스템 트리에서 로컬 vimrc 파일을 검색합니다. 기본적으로 파일 디렉토리에서 루트 디렉토리까지 모든 ".lvimrc"파일을 검색하여 역순으로로드합니다. 로드 된 파일의 파일 이름과 양은 전역 변수를 통해 사용자 정의 할 수 있습니다.”


3
그리고 github 버전은 병원체 로딩도 지원합니다 :-)
Graza

또 다른 유사한 플러그인은 localrc.vim입니다. 또한 파일 유형별 디렉토리 별 설정을 허용합니다. 나는 그것이 필수 불가결하다고 생각한다. vim.org/scripts/script.php?script_id=3393
잉고 Karkat

12

동료 개발자가 이에 대해 불평하지 않는다고 가정하면 언제든지 주석의 각 파일에 vim 설정을 추가 할 수 있습니다.

/*
 * vim:ts=4:sw=4:expandtab:...
 */

int main(int argc, char **argv)
{
    ...

2
나는 대부분의 팀 에서 유일한 에헴 계몽 개발자이므로 아무도 신경 쓰지 말아야합니다. 이것은 정말 깔끔한 파일 솔루션입니다.
bradreaves 2009

1
눈에 잘 띄지 않도록 하단에 추가하는 것을 선호하지만 스타일 문제인 것 같습니다.
nyuszika7h

5

이 목적을 위해 오픈 소스 도구를 만들었습니다. 헤더, 스캔, 구성 및 로컬 vimrc 파일은 잊어 버리십시오.

수영을 시도하십시오.


수영

swimvimrc 파일을 전환하고 편리한 별칭을 만드는 빠른 도구입니다. 다음은 간단한 사용 목록입니다. 연습 gif 및 다운로드 지침 은 Github repo 를 참조하십시오 .


용법

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


4

이전 포스터에서 제안한 localvimrc 플러그인을 사용해 본 후, vim 설정을 프로젝트별로 제어하는 ​​것이 매우 마음에 듭니다.

기본적으로 .lvimrc 파일을로드하기 전에 확인을 요청하지만 .lvimrc 파일을 자동으로로드하는 설정이 있습니다. 일부는 이것을 보안 허점으로 볼 수 있지만 광고 된대로 작동합니다.

.lvimrc 파일을 .gitignore로 선택했습니다. 또는 공유 설정 (탭 / 스페이스 확장, 탭 중지, 기타 프로젝트 별 설정)의 형태로 체크인 할 수 있습니다.


1
이 스크립트는 놀랍습니다 : github.com/MarcWeber/vim-addon-local-vimrc . 1) 이제 한 번만 요청하고 파일 해시를 OK로 표시합니다. 2) 루트에서 현재 디렉터리로 디렉터리 트리를 가로 질러 더 높은 우선 순위의 파일을 마지막에 소싱합니다.
치로 틸리는郝海东冠状病六四事件法轮功

.lvimrc파일을에 추가하는 이유는 무엇 .gitignore입니까? 요점은 vim을 사용하고 플러그인이 설치된 모든 사람이 동일한 설정을 갖게된다는 것입니다.
nyuszika7h

2
@ nyuszika7h 일부 설정은 적용해야하며 다른 설정은 순전히 개인적인 설정입니다. 모든 사람에게 적용해야하는 설정의 경우 EditorConfig가 편집기에 구애받지 않으므로 훨씬 더 좋습니다. github.com/editorconfig/editorconfig-vim
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1

sledge 에서 언급했듯이 해당 플러그인의 사용은 내가보고 사용한 최고의 옵션입니다. jerseyboy는 유틸리티가로드하기 전에 (즉, 모든 파일을 연 후) 확인을 요청하도록 권장했다고 언급했습니다. 이를 방지하려면 기본 .vimrc로컬 .lvimrc파일 목록을 설정 하십시오.

let g:localvimrc_whitelist='/development/kernel/.lvimrc'


1

다음은 jamessan의 변형입니다.

function! ConditionalLoad()
    let cwd = getcwd()
    if getcwd() =~ $HOME . "/src/mobile"
        so $HOME/.vim.mobile
    endif
endfunction
autocmd VimEnter * call ConditionalLoad()

점프하는 특정 파일없이 vi를 자주 실행하여 현재 작업 디렉토리를 기반으로 조건부로 구성을로드 할 수 있습니다. 단점은 구성이 파일을 기반으로 적용되지 않고 작업 디렉토리 외부에 적용된다는 것입니다.


내가 찾던 바로 그것. 사용의 예를 들어 :이 코드 위치 ~/.vimrc변경, /src/mobile내 심포니 프로젝트 디렉토리에 (내 경우에는 그것이 /www/symfony) 수정 .vim.mobile.vim.symfony다음 배치 새의 .vimrc의 구성 내부의 ~/.vim.symfony파일
jmarceli

1

저는 여러 그룹에서 작업하며 각 그룹에는 C에서 고유 한 탭 / 들여 쓰기 / 간격 표준이 있습니다.

저는 모든 종류의 오픈 소스로 동시에 작업합니다. 별도의 .vimrc파일을 만들고 서식 표준을 재구성하는 것은 실용적이지 않습니다 . 10여 년 전, 마침내 에디터 구성을 다루는 데 지쳐서 autotab그것을 처리 하는 프로그램을 작성 했습니다.

autotabVim이 제안한 상태로가 설정 되면 파일을 Vim에로드 할 때마다 파일 autotab이 호출되고 Vim 설정 출력 autotab:set명령에 전달됩니다 .

autotab파일에서 수천 줄을 읽고 분석 한 다음 expandtab, tabstopshiftwidth매개 변수에 대한 설정을 결정합니다 .

파일이 하드 탭을 사용하는지 아니면 들여 쓰기에 공백 만 사용하는지 파악하고 들여 쓰기 크기를 파악합니다. 파일이 탭으로 들여 쓰기되면 다양한 탭 크기를 사용하여 파일 샘플을 렌더링하고 내부 요소의 줄 단위 정렬과 같은 휴리스틱 스에 따라 판단하여 올바른 탭 크기를 파악합니다.

몇 년 전에 알고리즘 조정을 중단 할만큼 충분히 잘 작동합니다. 혼란스러워지면 거의 항상 파일에 여러 규칙을 동시에 사용하는 것과 같은 서식 문제가 있기 때문입니다.

또한 파일 유형에 대해 "무관"하며 다양한 언어에서 잘 작동합니다. 나는 C뿐만 아니라 쉘 스크립트, Lisp, Makefiles, HTML 등을 사용합니다.

예를 들어, C 파일 case에서, switch명령문의 레이블 이 들여 쓰기되었는지 여부 또는 래핑 된 함수 인수 목록이 단순히 들여 쓰기되었는지 또는 인수 목록의 여는 괄호. Vim에는 그런 종류의 설정이 있으므로 스타일을 분석하고 해당 매개 변수를 출력하도록 프로그램을 확장 할 수 있습니다.


0

거의 동일한 문제를 찾고 Sauce 플러그인도 발견했습니다 : http://www.vim.org/scripts/script.php?script_id=3992

주장 :

Sauce는 여러 vimrc 파일을위한 경량 관리자로, 다양한 환경에 대해 다른 설정을로드하는 데 사용할 수 있습니다. 간단히 말해서, 다양한 vim 설정 파일을 많이 유지하고 필요할 때 필요한 파일 만로드 할 수 있습니다.

사용자가 파일 시스템에 도트 파일을 뿌릴 것으로 기대하는 대신 데이터 디렉토리에 모든 구성을 유지한다는 것이 특히 흥미 롭습니다. 이것은 종종 개인적인 취향의 미터입니다.

그래도 아직 테스트하지 않았습니다.


0

구성을 전환 하는 데 stow 를 사용할 수 있습니다 (.vimrc ).

설치 stow:

$ apt install stow

각 구성에 대해 여러 디렉터리를 만듭니다.

~$ ls -d ~/dotfiles/vim*
vim-all vim-webdev vim-go

다른 것을 넣으십시오 .vimrc.

$ find ~/dotfiles -name .vimrc
/home/username/vim-golang/.vimrc
/home/username/vim-webdev/.vimrc
/home/username/vim-all/.vimrc

이제 다음 명령으로 vim-golang 구성을 인스턴스화 할 수 있습니다 (dotfiles 디렉토리 내에서 실행해야 함).

~$ cd ~/dotfiles

dotfiles$ stow -v vim-golang
LINK: .vimrc => dotfiles/vim-golang/.vimrc

이제 연결되었습니다.

$ cd ~ && ls -l .vimrc 
.vimrc -> dotfiles/vim-golang/.vimrc

구성을 전환해야하는 경우 다시 설정 stow하십시오.

~$ cd dotfiles

dotfiles$ stow -v -D vim-golang
UNLINK: .vimrc

dotfiles$ stow -v vim-webdev
LINK: .vimrc => dotfiles/vim-webdev/.vimrc

$ cd ~ && ls -l .vimrc 
.vimrc -> dotfiles/vim-webdev/.vimrc

여기에 대한 더 많은 정보 : GNU stow로 dotfile 관리하기

장점 : 매우 간단하고 vim 플러그인 종속성이 없으며 모든 도트 파일을 관리하는 데 사용할 수 있습니다..vimrc .

단점 : 구성은 서로 독립적이므로 각각을 개별적으로 관리 / 업데이트해야합니다 (구성을 너무 자주 전환 / 업데이트하지 않으면 문제가되지 않습니다).

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