파이썬 키워드 인수를 강조하는 Vim 구문 패턴


17

vim 정규 표현식을 배우는 데 어려움을 겪고 있습니다 (다른 정규 표현식도 잘 모릅니다). 주된 문제는 정규 표현식을 정의하는 것입니다.

some_function_call(simple_value, keyword=value)

이 예에서 키워드.

따라서 단어가 괄호 안에 있고 그 뒤에 등호가 있으면 단어와 일치해야합니다.

다음 문제는 vim에서 구문 파일을 정의하는 방법입니다. 도움을 주셔서 감사하지만 배우기가 어렵지 않아야하므로 내 스스로 할 수 있습니다.

나는 파이썬에 대한 내 자신의 구문 스크립트를 메이드 답변을 기반으로 편집하십시오. 자유롭게 사용해보십시오. 여기에 링크 설명을 입력하십시오


Github에서 내가 알고있는 최신 Python 구문 파일에 키워드 강조 표시가 포함되도록 공개 문제가 있습니다. github.com/hdima/python-syntax/issues/44 나중에 확인하고 싶을 수도 있습니다. 방법을 알아 내면 모든 사람들이이 기능을 사용할 수 있도록 사람들에게 알려주십시오.
cbaumhardt

1
그래, 내가 열어 본 사람이야
user1685095

답변:


12

이 설정으로 :

syn region FCall start='[[:alpha:]_]\i*\s*(' end=')' contains=FCall,FCallKeyword
syn match FCallKeyword /\i*\ze\s*=[^=]/ contained
hi FCallKeyword ctermfg=yellow

나는 얻다:

여기에 이미지 설명을 입력하십시오

여기:

  1. 키워드 인수를 찾을 수 있는 구문 영역을 정의합니다 .이 함수는 함수 호출입니다. 이 contains옵션을 사용하면 함수 호출을 중첩시킬 수 있습니다.
  2. 해당 지역 내에서 유효한 식별자 문자 ( \i*)와 뒤에 오는 문자열로 일치 =하지만 ==일치하지 않으므로 동등성 테스트가 일치하지 않습니다.

지역을 사용하면 필요한만큼 일치 항목을 중첩시킬 수 있습니다 match. 정규 표현식 만 사용하면 매우 복잡 할 수 있습니다 .

함수 호출과 키워드를 일치시키는 데 사용되는 정규 표현식을 구체화 할 수 있다고 생각하지만 Python 3에서 유효한 것을 고려할 때 그것은 기꺼이 취할 일이 아닙니다.

선택적으로 이것을 사용하여 함수 호출을 강조 표시 할 수 있다고 생각합니다 matchgroup.

syn region FCall matchgroup=FName start='[[:alpha:]_]\i*\s*(' end=')' contains=FCall,FCallKeyword
syn match FCallKeyword /\i*\ze\s*=[^=]/ contained
hi FCallKeyword ctermfg=yellow
hi FName ctermfg=blue

여기에 이미지 설명을 입력하십시오


아마도 다른 질문을 만들어야하지만 내장 함수 만 강조 표시하는 방법에 대한 아이디어가 있습니까?
user1685095

@ user1685095 내장 함수는 pythonBuiltin기본적으로 구문 그룹에 나열됩니다 syntax/python.vim. 그러나, 내장 함수 및 변수를 구별하지 않고 ( True, FalseNone도있다 pythonBuiltin). 사용하기 위해 정의를 복사 할 수 있습니다.
muru

글쎄, 나는 hdima / python 및 vim-polyglot과 같이 vim default보다 더 세련된 구문을 사용했습니다. 그들은 모두 중요한 결과를 초래하는 키워드와 같은 내장 함수를 정의합니다. 내장 함수가 강조 될뿐만 아니라 동일한 이름을 가진 변수와 같은 이름을 가진 다른 모듈의 함수 만 강조됩니다. query(...).***filter***()내장 필터 기능과 관련이없는 것처럼 필터 처럼 강조 표시됩니다.
user1685095

@ user1685095는 기본값으로 syntax.vim키워드를 만듭니다. 참조 github.com/vim/vim/blob/master/runtime/syntax/python.vim#L184
muru

1
홀수. 추가 syntax/python.vim파일 이 없습니다 (기본값 만 사용하고 동작이 표시되지 않습니다 : i.stack.imgur.com/LgF6F.png ) 키워드 정의에 동의합니다-가장 가깝습니다. 키워드가 같은 경우에 일치 생각하지 않는다 nonkeyword.keyword변수.로, 노트이 내장 매크로는 있습니다 함수 객체를 포함하는 변수들이있는 거 변수 및 다른 모든 변수처럼 할당 할 수 있습니다. 일을에서 아무것도 방지를 sorted = filter하고 사용하여 sorted같은를 filter.
muru

8

여기부터 시작할 수 있습니다 :

/([^,]\+,\s\(\w\+\)=.*)

분해 :

/(       start matching a (
[^,]\+   match multiple characters that are not ,
,\s      match a , and a space
\(       start a matching group
\w\+     match word characters
\)       end the matching group
=.*)      match an = and anything until the closing )

개선이 필요하지만 수행 방법에 대한 개요를 제공합니다.


6

@ Nobe4 답변 외에도 다음을 수행 할 수 있습니다.

  • 파일 만들기 ~/.vim/after/syntax/python.vim
  • 이 줄을 파일에 넣으십시오.

    syntax match PythonArg /(.*\,\s*\zs\w\+\ze\s*=.*)/
    hi PythonArg guibg=blue
    
  • 두 번째 값을 원하는 값으로 조정하십시오.

그러면 구문 파일이 생성되어 인수에 구문 일치가 추가되고 그 뒤에 =사용할 스타일이 설정됩니다. 이 주제 :h mysyntaxfile-add는 당신에게 흥미로워 야합니다.

또한 다른 답변과 다른 정규 표현식을 사용했습니다. 자세한 내용은 다음과 같습니다 (어느 것이 더 잘 작동하는지 모르므로 시도해야합니다).

(      Begin the pattern with a bracket
.*,    Look for any number of any character before a ,
\s*    Zero or more white spaces after the ,
\zs    Start the matching group (what will be highlighted)
\w\+   Match one or more word characters
\ze    End the matching group
\s*    Zero or more white spaces between your argument and the = sign
=      A literal = sign after your argument
.*)    Any number of any characters between your = sign and the closing bracket

도와 주셔서 감사합니다. 기존 규칙을 수정하지 않고 사용자 지정 구문을 추가 할 수 있다는 것을 몰랐습니다. 함수에서 첫 번째 인수 인 경우 패턴이 키워드 인수와 일치하지 않습니다. 나는 그것을 스스로 고치려고 노력할 것입니다 (지금은 정규 표현식을 배우고 있습니다). 그 방법을 배우 자마자 의견을 게시 할 것입니다.
user1685095

vim 검색을 통해이 정규 표현식을 시도하고 있으며 함수 호출에서 하나의 키워드와 만 일치한다고 생각합니다. 나는 그들 모두와 일치해야합니다. '
user1685095

@ user1685095 : 그렇습니다. 제 패턴이 좋지 않습니다. 나는 그것을 개선하고 답을 편집하려고 노력할 것입니다.
statox

3

그 발견 늑대의 응답 @ 키워드로 터플 풀기 캡처를하고 또한 키워드 인자 linebroken 문제 캡처를했다.

그의 정규 표현식에서 영감을 받아 python.vim구문 파일 에 넣을 다음을 생각해 냈습니다 . (나는 원래 sheerun / vim-polyglotpython.vim구문 파일을 사용하고 있음을 명심 하십시오 )

syn match pythonFunctionKeyword "\v\s{-}\zs\w+\ze\=(\=)@!(\_s)@!" display
syn cluster pythonExpression add=pythonFunctionKeyword
syn region pythonFunctionKwargs start=+(+ end=+)+ contains=@pythonExpression

그리고 정규식 분석은 @Wolfie의 답변 과 매우 유사합니다 .

\v      set to very magic mode
\s{-}   capture whitespace, nongreedy
\zs     start of the match (what to actually highlight)
\w+     one or more alphanumeric character, underscore included
\ze     stop matching; anything after this is delimiting only
\=      one single equal sign
(\=)@!  ...not followed by another equal sign
(\_s)@! ...not followed by any whitespace or newline character

다음과 같이 작성된 키워드 인수에는 색상이 표시되지 않습니다 key = value. 키워드 인수 에 대한 공식 PEP-8 공백 권장 사항에 위배되므로 좋은 점이 좋습니다 .


2

필자가 받아 들인 대답 은 함수 인수 목록 내에서 문자열을 강조 표시했습니다 ( 알코 미가 모르는 것에 의해). 그래서 Statox의 one 기반의 더 안전한 버전이 있습니다.

syntax match PythonArg "\v[\(\,]\s{-}\zs\w+\ze\s{-}\=(\=)@!"
hi PythonArg ctermfg = 214 guifg = #ffaf00

ctermfg콘솔 터미널 guifg용이며 GUI 용입니다. 물론 색상을 원하는대로 바꿀 수 있습니다. 다음은 편리한 목록 입니다.

언제나처럼, 당신은 이것을 안에 넣는 것이 가장 좋습니다 ~/.vim/after/syntax/python.vim

정규식 분석의 경우 다음을 수행하십시오.

\v      set to very magic mode
[\(\,]  capture either a ( or a ,
\s{-}   capture whitespace, nongreedy
\zs     start of the match (what to actually highlight)
\w+     one or more alphanumeric character, underscore included
\ze     stop matching; anything after this is delimiting only
\s{-}   once again, capture whitespace.
\=      one single equal sign
(\=)@!  ...not followed by another equal sign

마지막 확인은 색상 조건부에서 강조 표시를 중지합니다. 원하는 경우 제거 할 수 있습니다.


죄송합니다. 늦었습니다. 나는 자신을 위해 구문 파일을 메이드했습니다.
user1685095

괜찮아; 다른 사람이 같은 문제에 부딪 치면 여기에서 희망을 가질 수 있습니다.
Wolfie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.