14

vim で Python コードを書いているときに、かっこが一致しないために繰り返しやけどを負っています。C コードでの処理方法が気に入っています。vim は、一致しない括弧に続くすべての中括弧を赤で強調表示します。構文ファイルをざっと見c.vimて理解しようとしましたが、ブラケット エラーを処理するセクションは非常に複雑です。誰かがそのコードがどのように機能するかを説明し、Python コードに似たものを書く方法を提案できますか?

括弧が一致しない C コードの例:

int main(void
{  /* brace highlighted in red */
}  /* brace highlighted in red */

Python コードには強調表示する中括弧がないため、別のもの (おそらく別の括弧) を選択する必要があります。

ところで、この vim プラグインを試してみましたが、動作に満足できませんでした。

編集:

Python を使用して C++ コード (括弧とセミコロンが好きな言語) を生成しています。file.write()メソッド呼び出しの末尾の括弧を残すという厄介な癖があります。その間違いを視覚的により明確にするためにvimを取得できたらいいのにと思います。

アップデート:

わかりました、これが私がこれまでに試したことです。

:syn region pParen transparent start="(" end=")" contains=ALL
:syn match pError display ")"
:hi def link pError Error

残念ながら、これはすべて、バランスのとれたすべての括弧の右括弧をエラーとして強調表示するだけであり、私がやりたいこととは反対です。ここで何をしているのか本当にわかりません (既存の C 構文ファイルからコピーしただけです)。誰かが私がしたこと(間違っていること)を説明できれば幸いです。

4

7 に答える 7

8

vim に反対のことをさせることができます:

:ショーマッチを設定

一致する括弧が強調表示されます。何かが強調されていないときは、バランスが崩れていることがわかります。

また、一致する要素に移動する '%' コマンドに慣れていることも前提としています。

于 2009-02-12T21:55:23.577 に答える
6

私が正しく理解していて、C コード (Python で生成された) の一致しない括弧を見ようとしている場合は、Dr Chip's Siteから rainbow.vim をインストールすることをお勧めします。これにより、インデントのレベルに応じて中括弧が異なる色で強調表示され、一致しない中括弧が要求どおりに赤で強調表示されます。スクリーンショットhttp://img294.imageshack.us/img294/8586/rainbow.jpg http://img294.imageshack.us/img294/8586/rainbow.jpg

インストールするには、ダウンロードrainbow.vimして配置しvimfiles/after/syntax/c/ます (存在しない場合は、このディレクトリを作成します)。

Linux では、これは次のようになります。~/.vim/after/syntax/c/rainbow.vim

Windows では、c:\vim\vimfiles\after\syntax\c\rainbow.vim別の場所にある可能性があります。 を参照してください:help runtimepath

と競合するプラグインがいくつかあることに注意してください。ただしrainbow.vim、それらを連携させるのはそれほど難しくありません。

Python コードで一致しない括弧を強調表示しようとしている場合は、rainbow.vim を変更して、C の代わりに Python 構文クラスターを使用することができますが、これはもう少し複雑ですが、次の行に沿って何かを使用できます。 (チップ博士のレインボー コードの修正版):

syn cluster pyParenGroup contains=pythonString,pythonRawString,pythonEscape,pythonNumber,pythonBuiltin,pythonException
syn match pyParenError display ')'
syn region  pyParen     transparent matchgroup=hlLevel0 start='(' end=')' contains=@pyParenGroup,pyParen1
syn region  pyParen1        transparent matchgroup=hlLevel1 start='(' end=')' contains=@pyParenGroup,pyParen2
syn region  pyParen2        transparent matchgroup=hlLevel2 start='(' end=')' contains=@pyParenGroup,pyParen3
syn region  pyParen3        transparent matchgroup=hlLevel3 start='(' end=')' contains=@pyParenGroup,pyParen4
syn region  pyParen4        transparent matchgroup=hlLevel4 start='(' end=')' contains=@pyParenGroup,pyParen5
syn region  pyParen5        transparent matchgroup=hlLevel5 start='(' end=')' contains=@pyParenGroup,pyParen6
syn region  pyParen6        transparent matchgroup=hlLevel6 start='(' end=')' contains=@pyParenGroup,pyParen7
syn region  pyParen7        transparent matchgroup=hlLevel7 start='(' end=')' contains=@pyParenGroup,pyParen8
syn region  pyParen8        transparent matchgroup=hlLevel8 start='(' end=')' contains=@pyParenGroup,pyParen9
syn region  pyParen9        transparent matchgroup=hlLevel9 start='(' end=')' contains=@pyParenGroup,pyParen
hi link pyParenError Error

if &bg == "dark"
    hi default   hlLevel0 ctermfg=red         guifg=red1
    hi default   hlLevel1 ctermfg=yellow      guifg=orange1      
    hi default   hlLevel2 ctermfg=green       guifg=yellow1      
    hi default   hlLevel3 ctermfg=cyan        guifg=greenyellow  
    hi default   hlLevel4 ctermfg=magenta     guifg=green1       
    hi default   hlLevel5 ctermfg=red         guifg=springgreen1 
    hi default   hlLevel6 ctermfg=yellow      guifg=cyan1        
    hi default   hlLevel7 ctermfg=green       guifg=slateblue1   
    hi default   hlLevel8 ctermfg=cyan        guifg=magenta1     
    hi default   hlLevel9 ctermfg=magenta     guifg=purple1
else
    hi default   hlLevel0 ctermfg=red         guifg=red3
    hi default   hlLevel1 ctermfg=darkyellow  guifg=orangered3
    hi default   hlLevel2 ctermfg=darkgreen   guifg=orange2
    hi default   hlLevel3 ctermfg=blue        guifg=yellow3
    hi default   hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
    hi default   hlLevel5 ctermfg=red         guifg=green4
    hi default   hlLevel6 ctermfg=darkyellow  guifg=paleturquoise3
    hi default   hlLevel7 ctermfg=darkgreen   guifg=deepskyblue4
    hi default   hlLevel8 ctermfg=blue        guifg=darkslateblue
    hi default   hlLevel9 ctermfg=darkmagenta guifg=darkviolet
endif

編集:

テストとして、ftp://ftp.vim.org/pub/vim/pc/からgvim70.zipvim70rt.zipをダウンロードしました (これらは Vim 7.0 の Windows バージョンです)。2 つのファイルを新しいディレクトリに解凍し、. 「C:\Documents and Settings」に vim 構成が保存されていないため、この vim を実行することは「バニラ」構成を実行することと同じです次に、サンプル コードの一部としてamk.ca/python/simple/pyprint.htmlからダウンロードし、上記のコードを code.vim というファイルにコピーしました。gVim では、 と入力しました。構文が強調表示されていない、白い背景のウィンドウで開かれました。それから私は入りましたgvim.exevim/vim70/gvim.exepyprint.py:e pyprint.py:syntax on、デフォルトの構文強調表示をオンに切り替えました。8 行目に 2 番目の文字を追加しました)。最後に を入力:source code.vimすると、2 番目の)文字が赤く強調表示されます。

次のコマンド シーケンスを入力して、Linux (Vim 7.2 を使用) でもこのテストを実行しました。

cd ~
mv .vimrc old_dot_vimrc
mv .gvimrc old_dot_gvimrc
mv .vim old_dot_vim
vim pyprint.py
:e pyprint.py
" Add extra bracket here!
:syntax on
:source code.vim

再び、2 番目の括弧が強調表示され、他のすべてが正常に見えます。

于 2009-03-02T14:07:48.780 に答える
3

多かれ少なかれ混乱するかどうかはわかりませんが、lisp.vim構文ファイル (特にg:lisp_rainbowが処理される部分) を見て、一致する括弧を強調表示する方法を確認できます。

一致するすべての括弧を強調表示することができた場合、残りの括弧 (つまり、一致しない括弧) にデフォルトのエラー強調表示を設定できます。これは、lisp ファイルが行っているように見えることです。

編集:これはどうですか:

syn match parenError ")"
syn region matchingParens transparent start="(" end=")" contains=matchingParens
hi parenError guifg=red

それらを:syn clear実行すると、うまくいくようです。synコマンドが実行される順序が重要であることに注意してください。ごとに、最後:h :syn-priorityに一致したルールが有効になります。これが、ルールがファイル内のすべての終了括弧を強調表示した理由である可能性があります。

編集#2:

c.vim が実際に行っていることは、すべてが適切に閉じられているかどうかに関係なく、 {}の内部を強調表示することです。()C モードで入力({})してみてください。それでも{}エラーとして強調表示されます。

エンドパターンが存在するかどうかは気にしないため、このアプローチを使用し(て、一致しないを直接テストすることはできないと思います。):syn region

そのため、決して内部に属してはならない Python 固有のものを見つける必要があります()。その後、 と対戦し"(\_[^)]*the_forbidden_something"ます。それが何であるかを知るのに十分なほどPythonを知りません。

他に何もない場合は、次のことができます。

syn match openParen "(\_[^)]*\%$"

これは、ファイルの終わりの前に閉じ括弧のない開き括弧に一致します。閉じ括弧がまったく見つからない場合、これは失敗します。つまり、キャッチさえしません(()<EOF>

于 2009-02-12T22:54:55.633 に答える
1

matchit.vimを使ってみましたか? あらゆる種類の一致をサポートし、Python で動作するはずです。

于 2009-03-02T14:51:30.610 に答える
0

プラグインvim-matchopenは、探していることを行います


カラースキームに基づいてハイライトの色が変わります

于 2016-06-17T16:15:19.867 に答える