Pythonキーワード引数を強調表示するVim構文パターン


17

私はvim正規表現の学習に苦労しています(他の正規表現もよくわかりません)ので、主な問題は一致する正規表現を定義することです

some_function_call(simple_value, keyword=value)

この例のキーワード。

したがって、かっこ内にあり、その後に等号がある場合は、単語と一致する必要があります。

次の問題は、vimで構文ファイルを定義する方法です。私はそれを手伝っていただければ幸いですが、学ぶのはそれほど難しくないはずなので、おそらく自分でそれを行うことができます。

pythonの独自の構文スクリプトを作成したという回答に基づいて編集します。試してみてください。 ここにリンクの説明を入力してください


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。ただし、関数と組み込み変数(TrueFalseおよび)Noneも区別されませんpythonBuiltin。おそらく、使用するために定義をコピーできます。
ムル

さて、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
@ user1685095奇数。追加の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
    
  • 2番目の値を好みの値に適合させます。

これにより、引数に構文一致を追加し、その後にaを追加=して使用するスタイルを設定する構文ファイルが作成されます。このトピック: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検索を介してこの正規表現を試していますが、関数呼び出しの1つのキーワードのみに一致すると思います。それらのすべてに一致する必要があります」
-user1685095

@ user1685095:そうですね、私のパターンは良くありません。私はそれを改善し、答えを編集しようとします。
statox

3

私は見つけWolfieの回答@キーワードとしてタプルのアンラップキャプチャをし、それはまた、キーワード引数linebrokenトラブルキャプチャを持っていました。

彼の正規表現に触発されて、python.vim構文ファイルに入れる次のものを思いつきました。(私はもともとsheerun / vim-polyglotのpython.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の1に基づいて、おそらくより安全なバージョンがあります。

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

それはいいです; 他の誰かが私と同じ問題に遭遇した場合、うまくいけばここを覗くことができます。
ウルフィー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.