0

次のようなグラフのカスタム ファイル形式があります。

node1.link1 : node2
node1.attribute1 : an_attribute_for_node1
node2.my_attribute1 : an_attribute_for_node2

(属性名について特別なことは何もありません。属性は、ドットの左側にその値を見つけることができる場合はリンクです。node2ファイルのどこかに で始まる行があるため、リンクもそうですnode2.<something>)。

リンクの場合は属性値を強調表示したいと思います (したがって、node2 を強調表示したいのですが、ではありませんattribute_for_node1)。

明らかに、この種の構文強調表示は、正しい強調表示を行うためにファイル全体を読み取る必要があるため、行全体の正規表現のみに基づくことはできません。

この種のファイル用の python パーサー ( dict の dict を提供するstring -> (string -> string)) を既に持っていますが、python が vim 7 の構文強調表示と対話できるかどうかはわかりません。

編集 明確にするために、この例のために作成された辞書は次のとおりです。

d = {
  'node1': {'link1': 'node2', 'attribute1': 'an_attribute_for_node1'},
  'node2': {'attribute2': 'an_attribute_for_node2'}
}

定義により、次の場合にのみlノードのリンクになります。n

d[n][l] in d

名前は意味がなく、形式は構造に依存するだけで、言語キーワードはありません。node2ノードの名前なので、最初の行で強調表示したいと思います。

より明確になったことを願っています。

誰かがアイデアを持っていますか?

4

1 に答える 1

2

これは非常に簡単なはずですが、辞書がどのように見えるかを正確に理解するのは少し難しいです (「文字列」とは何ですか? ノード 1? 属性 1? 他の何か?)。私が作成したctags ハイライターと呼ばれるプラグインは、かなり似たようなことを行います: ctags を使用してキーワードのリストを生成し、python を使用して、これらのキーワードを適切に強調表示する単純な vim スクリプトに変換します。

基本的に、パーサー (またはパーサーを使用する別の python モジュール) を作成して、キーワード (node1、node2 など) のリストを生成し、それらをこの形式で出力する必要があります (行ごとに好きなだけ使用しますが、行を長くしすぎないでください):

syn keyword GraphNode node1 node2
syn keyword GraphNode node3

これをファイルに書き込み、次のような自動コマンドを作成します。

autocmd BufRead,BufNewFile *.myextension if filereadable('nodelist.vim') | source nodelist.vim | endif

次に、次のようにします。

hi GraphNode guifg=blue

または何でも。詳細が必要な場合は、パーサーについてもう少し情報を投稿するか、私のプラグインのコードを見てください。

詳細については、次を参照してください。

:help :autocmd
:help syn-keyword
:help BufEnter
:help BufNewFile
:help filereadable()
:help :source
:help :highlight

編集

私はあなたが何を望んでいるのかまだ完全にはわかりませんが、私が正しく理解していれば、次のようなことがうまくいくはずです:

mypyparser.pyPython パーサーが と呼ばれ、1 つの引数 (現在のファイル名) を取り、それが作成する辞書が と呼ばれると仮定しましょうMyPyDict。パーサーの実際の使用に合わせてスクリプトを変更する必要があることは明らかです。このスクリプトをランタイムパスのどこかに追加し (.vimrc や ~/.vim/ftplugin/myfiletype.vim など)、ファイルを開いて:HighlightNodes.

" Create a command for ease of use
command! HighlightNodes call HighlightNodes()
function! HighlightNodes()
    " Run the parser to create MyPyDict
    exe 'pyfile mypyparser.py ' . expand('%:p')
    " Next block is python code (indent gone to keep python happy)
    py <<EOF
# Import the Vim interface
import vim
# Iterate through the keys in the dictionary and highlight them in Vim
for key in MyPyDict.keys():
    vim.command('syn keyword GraphNode ' + key)
endfor
EOF
    " Make sure that the GraphNode is highlighted in some colour or other
    hi link GraphNode Keyword
endfunction
于 2009-08-26T11:30:10.947 に答える