스펠 파일에서 URL 및 이메일 주소 무시


12

vim이 HTTP URL과 이메일 주소를 철자 오류로 표시하지 않는 방법이 있습니까? 또는 더 일반적으로 유효한 철자의 정규식을 나열하는 방법은 무엇입니까?

답변:


16

사용자 정의 구문 규칙을 추가하고 @nospell키워드를 제공하면 Vim에이 구문 일치에 맞춤법 검사를 적용하지 않도록 지시합니다. 예를 들면 다음과 같습니다.

:syn match UrlNoSpell "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell

위의 내용은 텍스트 파일 및 일부 파일 형식 (예 : 마크 다운)에는 적용되지만 일부 파일 형식에는 적용되지 않습니다.

여기서는 매우 간단한 정규식을 사용했습니다. 일부 대안 은 텍스트에서 URL을 구문 분석하는 방법을 참조하십시오 .


다른 파일 형식의 경우 약간 더 많은 작업을 수행해야합니다. 예를 들어 python파일의 경우 다음과 같은 주석이 pythonComment 그룹에 포함됩니다 /usr/share/vim/vim74/syntax/python.vim.

syn match   pythonComment   "#.*$" contains=pythonTodo,@Spell

이를 무시하려면 다음을 수행해야합니다.

:syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
:highlight def link UrlNoSpellComment Comment

트릭은 우리의 사용자 정의 구문 일치에 포함 될 수있는 이전에 일치 구문 일치 목록에 추가하는 것입니다 containedin=이것은을 찾아 빔을 알려줍니다 UrlNoSpell정규식 내에서pythonComment 일치.

또한 highlight색상이 상속되지 않으므로 올바른 색상을 설정하는 데 사용해야 합니다.

예를 들어 Python 문자열의 경우 여러 위치에서이 작업을 수행해야합니다.

:syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
:highlight def link UrlNoSpellString String

올바른 구문 강조를 적용하려면 2 개의 서로 다른 구문 일치 그룹이 필요합니다.

물론, 다른 파일 형식의 경우 다른 containedin=구문 일치 를 사용해야 합니다. "유니버설"솔루션이없는 AFAIK가 있지만 올바른 것을 찾는 /usr/share/vim/vim74/syntax/*.vim것이 그리 어렵지 않아야합니다.


위의 모든 명령은 구문 파일 다음 에 실행되어야 합니다. 이를 수행하는 두 가지 방법이 있습니다.

  • 명령 또는 키 맵핑에서 매번 수동으로 호출해야합니다. 예 :

    fun! NoUrlSpell()
        if &filetype == 'python'
            :syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
            :highlight def link UrlNoSpellComment Comment
            :syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
            :highlight def link UrlNoSpellString String
        elseif &filetype == 'ruby'
            " ...
        else
            syn match   pythonComment   "#.*$" contains=pythonTodo,@Spell
        endif
    endfun
    command NoUrlSpell :call NoUrlSpell()
    
  • 에 명령을 넣습니다 ~/.vim/after/syntax/[filetype].vim. Vim은이 파일들을 가져 와서 기본 구문 파일 다음에 실행합니다 (: 참조 :help after-directory).


3

Martin Tournoij탁월한 답변 은 예상대로 작동하지 않습니다. 아마도 Vim의 Python의 기본 구문 파일이 아닌 diraol경이로운 python-mode플러그인을 활용 했기 때문일 것입니다 .

에서 파이썬 주석, 문자열 또는 docstring에서 URI를 강조 표시하지 않으려면 python-mode다음과 같은 간결한 한 줄을 사용자 별 ~/.vim/after/syntax/python.vim파일에 추가하십시오.

syntax match NoSpellUriPython '\w\+:\/\/[^[:space:]]\+' transparent contained containedin=pythonComment,python.*String contains=@NoSpell

그게 다야. 결정적으로, 이것은 Martin의 대답에서 12 개의 분리 된 줄을 하나의 줄로 압축 합니다. 어떻게? 초등, Vim 기반 왓슨. 우리는 다음을 추가합니다.

  • transparentVim에게 부모 구문 (예 : 주석, 문자열)에서이 자식 구문의 강조 속성을 상속하도록 지시 하는 키워드입니다. 이를 통해 highlight def link각 하위 구문 그룹에 대해 명시 적으로 휴식을 피할 수 있습니다 .
  • contained이 하위 구문이 상위 구문의 경계를 넘어 확장되지 않도록 하는 키워드 (예 : 주석의 경우 EOL, 문자열의 문자열 구분 기호)
  • containedin키워드 로 쉼표로 구분 된 모든 상위 구문 그룹 . .*정규식 연산자는 우리가 교묘하게 일치 할 수 있도록 모든 파이썬 문자열 구문 그룹 (즉, pythonString, pythonUniString, pythonRawString, pythonUniRawString, pythonDocstring) 최소한의 고통과 최대 앞으로 호환성.

기술적으로는 유효하지만 Martin의 답변에 포함 된 vimscript는 DRY (Do n't Repeat Yourself) 원칙을 위반합니다. 자세한 내용은 이와 유사한 답변을 참조하십시오 .

하지만 기다려 ... 더 많은 것이 있습니다.

위대한 영광을위한 무조건 개선

나는 충분히 두 빔의 지나치게 순진한 기본 맞춤법 검사 짜증있어 (예를 들어, 타사 플러그인 Spelunker ... 내가 결정했다고 무조건 단순히 코드 주석 및 문자열이 아닌 검사에게 전체 버퍼 철자) 실제로 뭔가를 그것에 대해. </gasp>

아래에서 잘 테스트 된 Vim 스 니펫 은 Python 주석 및 문자열 내에서 다음을 모두 철자 검사하는 것을 지능적으로 피합니다.

  • URI (위와 같이).
  • CamelCase 식별자.
  • snake_case 식별자.
  • UPPERCASE 식별자.
  • @-prefixed 식별자 (예를 들어, @muhdecorator).
  • "-구분 된 파일 형식의 파일 이름 (예 :) "muh_module.py".
  • :-로 구분 된 하위 문자열 (예 :func:: in : func :`re.sub`)
  • `로 구분 된 하위 문자열 (예 re.sub: in : func :`re.sub`).

~/.vim/after/syntax/python.vimVim은 실제로 RightStuff ™의 맞춤법 검사를 한 번만 수행하므로 사용자 특정 파일에 다음 중 일부 또는 전부를 추가 하고 헐떡 거립니다.

" Avoid spell checking URIs.
syntax match NoSpellPythonUri /\v\w+:\/\/[^[:space:]]+/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking both CamelCase-formatted identifiers and uppercase
" identifiers. Since most languages (excluding Raku) prohibit Unicode in
" identifiers, these matches are intentionally confined to ASCII codepoints
" (e.g., "[A-Z]" rather than "[[:upper:]]").
syntax match NoSpellPythonCaps /\v<[A-Z]([A-Z0-9]{-1,}|[a-z0-9]+[A-Z0-9].{-})>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking snake_case-formatted identifiers.
syntax match NoSpellPythonSnake /\v<\w+_.{-1,}>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking "@"-prefixed identifiers.
syntax match NoSpellPythonDecorator /\v\@[a-zA-Z].{-}>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking ":"-delimited substrings.
syntax match NoSpellPythonColons /\v:[^:]+:/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking "`"-delimited substrings.
syntax match NoSpellPythonTicks /\v`[^`]+`/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking '"'-delimited filetyped filenames matched as a
" double-quoted substring containing a filename prefix, a period, and one to
" four characters comprising a filetype.
syntax match NoSpellPythonPath /\v"[^"]+.[^"]{1,4}"/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

물론, 위의 모든 내용은 고질라와 같은 정규 표현과 일치하는 하나의 단일 라이너로 축소 될 수 있으며 아마도 자신을 포함하여 아무도 유지하거나 읽을 수 없었습니다. 모두의 정신을 위해 나는 그렇게하지 않았습니다.

누군가 경우 없는 나를 원하는 다른 인기있는 언어로 위의 확장의 플러그인 GitHub의 호스팅 빔을 만들기 위해, 그건 그냥 좋은거야. Vim의 기본 맞춤법 검사 구현은 거의 있습니다. 오픈 소스 커뮤니티의 도움이 필요합니다.

그때까지 StackOverflow가 항상 당신과 함께 할 수 있습니다!


2
나는 여기에 답변을 쓰는 ​​동안 Vim 구문 전체를 강조하는 것을 알아 냈습니다. 나는 내가 정직하기 위해 무엇을하고 있는지 항상 알지 못 했으므로, 특히 오래된 답변 중 일부는 최적보다 적을 수 있습니다.
Martin Tournoij

당신은 너무 겸손합니다, 마틴 "얼음 깨기"라는 대답이 없으면 저와 다른 많은 사람들은 어디서부터 시작해야할지 알지 못했을 것입니다. 이 편집자 파티를 시작해 주셔서 감사합니다! 로마는 하루에 지어지지 않았지만 적어도 지금은 철자를 확인할 수 있습니다.
세실 카레
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.