로컬 vimrc에 구문 강조 규칙을 추가하려면 어떻게해야합니까?


11

Fedora와 Win7에 gvim을 설치했습니다. Fedora의 vim과 gvim은 c 코드에서 함수 이름을 강조 표시하지 않았지만 win7의 gvim은 강조 표시했습니다.

win7 vim73/syntax/c.vim에서 끝에 추가 줄이 있음을 발견했습니다 .

syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
hi cFunction gui=NONE guifg=#B5A1FF

c.vimFedora 에서이 행을 추가하면 gvim이 함수 이름을 강조 표시 할 수도 있습니다.

이식성을 유지하기 위해 .vimrc함수 이름을 강조 표시 하기 위해를 수정하고 싶습니다 . 그러나 이러한 줄을에 추가하면 .vimrc작동하지 않습니다.

누구든지 나를 도울 수 있습니까? 검색을했는데 vim에서 함수 이름을 강조 표시하는 많은 솔루션이 있습니다. 그러나 나는이 라인을 어떻게 작동시키는 지 궁금합니다 .vimrc. 매우 감사합니다!


5
~/.vim/after/syntax/c.vim대신에 추가하십시오 .
muru

@muru 예, 작동합니다. 그러나 그것을 추가하는 것은 .vimrc어떻습니까?
tamlok

아마도와 같은 것을 사용해야 할 수도 autocmd BufEnter *.c hl ...있지만에 보관해야합니다 after/syntax/c.vim. Vim의 모든 최신 버전은 .vim/after/디렉토리 를 이해합니다 . Windows에서 경로는 vimfiles/after/...이므로 이식성에 큰 문제가되지 않아야합니다 (특히 플러그인을 사용하는 경우).
muru

답변:


14

그러나 이러한 행을 .vimrc에 추가 한 후에는 작동하지 않았습니다.

Vim은 'syntax'옵션을 설정할 때 기존 구문 항목을 지우기 때문입니다 . 이전 구문 항목을 유지하면 이상한 상황이 발생할 수 있기 때문입니다. 당신이 가지고있는 버퍼가있는 경우 syntax=foo와 사용 set syntax=bar당신은을위한 구문 강조가 버퍼 될 겁니다 모두 foobar.

Vim이 시작되면 vimrc시작시 한 번만 로드 되지만 filetype또는 syntax옵션이 설정 될 때마다 파일 유형 및 구문 파일이로드되어 vimrc에서 설정 한 값이 재설정됩니다.

재설정하지 않더라도 vimrc에 추가하는 것은 좋은 생각이 아닙니다. 이는 vimrc를 사용 하는 버퍼뿐만 아니라 모든 버퍼에 적용되기 때문입니다 syntax=c.


아래 텍스트는 Unix-y 시스템에서 Vim을 가정하지만 Neovim 및 Windows 사용자에게도 적용됩니다.

  • Neovim 사용자는 교체해야합니다 ~/.vim/함께 ~/.config/nvim/.
  • 윈도우 사용자는 교체해야합니다 ~/.vim/함께 %USERPROFILE%\vimfiles\.

전체 파일 재정의

무엇인가를 바꾸는 가장 쉬운 방법 은 그것을 재정의하는 것 입니다. 파일을 만들려면에 파일을 만드십시오 ~/.vim/<file>.vim.

<file.vim>$VIMRUNTIME(하위 디렉토리 포함)에 상대적인 경로 입니다. 귀하의 예에서는이어야합니다 syntax/c.vim. 의 파일 대신로드됩니다 $VIMRUNTIME.

이것의 결론은 변경하기가 더 쉽다는 것입니다. 구문 파일을 종료하는 것이 때때로 까다로울 수 있습니다. 단점은 시스템 전체 파일에 대한 향후 업데이트가 없다는 것입니다.

나는 종종 이것을 구문 파일을 실험하기 위한 시작점 으로 사용 하고 나중에 아래 설명 된 방법 중 하나를 사용하여 로컬 변경 사항을 로컬 추가로 추출합니다.

지역 추가

구문 파일에 로컬 추가를 추가하는 두 가지 방법이 있으며 기능적으로 동일하며 원하는 방법을 사용할 수 있습니다.

Syntax autocmd

Syntaxautocmd를 사용하십시오 .

augroup ft_c
    autocmd!
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    autocmd Syntax c hi cFunction gui=NONE guifg=#B5A1FF
augroup end

여러 명령을 체인으로 묶는 |것은 :syn명령의 일부로 해석되는 경향이 있기 때문에 여기서 문제가됩니다. 그래서 autocmd Syntax c여러 번 반복했습니다 . 대안은 함수를 사용하는 것입니다.

fun s:c()
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    hi cFunction gui=NONE guifg=#B5A1FF
endfun

augroup ft_c
  autocmd!
  autocmd Syntax c call s:c()
augroup end

모든 변경 사항을 단일 파일에 포함 할 수 있다는 이점이 있습니다. 단점은 특히 변경 사항이 많은 경우 약간 추악하다는 것입니다.

디렉토리 뒤

이후 디렉토리를 사용하십시오 ~/.vim/after/<file>.vim.

이것은 (하위 디렉토리를 포함하여) 상대 경로가있는 <file>.vim위치에 로드됩니다 . 귀하의 예에서는이어야합니다 .<file.vim>$VIMRUNTIMEsyntax/c.vim

도 참조하십시오 :help after-directory.

장점은 특히 많은 변경 사항이있는 경우 autocmd보다 조금 더 읽기 쉽다는 것입니다. 단점은 Vim 설정을 다른 머신에 미러링하려면 추가 파일을 복사해야한다는 것입니다. 이는 많은 사람들이 Vim 파일을 GitHub 저장소에 보관하는 중요한 이유이므로 머신간에 쉽게 미러링 할 수 있습니다. ).

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