답변:
사용자 정의 구문 규칙을 추가하고 @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
).
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 기반 왓슨. 우리는 다음을 추가합니다.
transparent
Vim에게 부모 구문 (예 : 주석, 문자열)에서이 자식 구문의 강조 속성을 상속하도록 지시 하는 키워드입니다. 이를 통해 highlight def link
각 하위 구문 그룹에 대해 명시 적으로 휴식을 피할 수 있습니다 .contained
이 하위 구문이 상위 구문의 경계를 넘어 확장되지 않도록 하는 키워드 (예 : 주석의 경우 EOL, 문자열의 문자열 구분 기호)containedin
키워드 로 쉼표로 구분 된 모든 상위 구문 그룹 . .*
정규식 연산자는 우리가 교묘하게 일치 할 수 있도록 모든 파이썬 문자열 구문 그룹 (즉, pythonString
, pythonUniString
, pythonRawString
, pythonUniRawString
, pythonDocstring
) 최소한의 고통과 최대 앞으로 호환성.기술적으로는 유효하지만 Martin의 답변에 포함 된 vimscript는 DRY (Do n't Repeat Yourself) 원칙을 위반합니다. 자세한 내용은 이와 유사한 답변을 참조하십시오 .
하지만 기다려 ... 더 많은 것이 있습니다.
나는 충분히 두 빔의 지나치게 순진한 기본 맞춤법 검사 짜증있어 및 (예를 들어, 타사 플러그인 Spelunker ... 내가 결정했다고 무조건 단순히 코드 주석 및 문자열이 아닌 검사에게 전체 버퍼 철자) 실제로 뭔가를 그것에 대해. </gasp>
아래에서 잘 테스트 된 Vim 스 니펫 은 Python 주석 및 문자열 내에서 다음을 모두 철자 검사하는 것을 지능적으로 피합니다.
CamelCase
식별자.snake_case
식별자.UPPERCASE
식별자.@
-prefixed 식별자 (예를 들어, @muhdecorator
)."
-구분 된 파일 형식의 파일 이름 (예 :) "muh_module.py"
.:
-로 구분 된 하위 문자열 (예 :func:
: in : func :`re.sub`)re.sub
: in : func :`re.sub`).~/.vim/after/syntax/python.vim
Vim은 실제로 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가 항상 당신과 함께 할 수 있습니다!