4

ファイルタイプの現在のフォーマットをすべて保持しながら、機能を追加するにはどうすればよいですか。

.vim ファイルの色を強調表示して、各色が端末でどのように解決されるかを強調表示したいと思います。

以下を含む vim.vim ファイルを作成しました。

syn keyword yellow yellow containedin=All                                                    
highlight yellow ctermfg=yellow                                                              
                                                                                             
syn keyword red red containedin=all                                                          
highlight red ctermfg=red                                                                    
                                                                                        

入れて~/.vim/after/syntax/vim.vim

ここで提案されているように。

これは効果がありません。


アップデート

実際、私の変更が効果がないと言ったのは間違いでした。行に単独で入力yellowすると、黄色で強調表示されます。残念ながら、これは私の問題を解決しません。

Alで説明されている F3 機能を追加しました。

黄色の上に f3 すると (コンテキストでctermfg=yellow)、次のように返されます。

hi<vimHiCtermColor> trans<vimHiCtermColor> lo<vimHiCtermColor> FG:-1 BG:-1

次に:syn list vimHiCtermColor戻ります:

--- Syntax items ---
vimHiCtermColor xxx contained lightmagenta darkgray lightgrey darkgrey lightgreen lightgray darkmagenta gray white red grey darkred brown darkblue darkgreen lightblue yellow cyan
                   contained lightcyan lightred black blue green magenta darkcyan darkyellow

:syn list darkgray存在するかどうかを確認するために(定義していないもの)をチェックしました:

--- Syntax items ---
E28: No such highlight group name: darkgray
Hit ENTER or type command to continue

ここからどこへ行けばいいですか?

4

2 に答える 2

6

解決

これは、黄色という単語だけに色を付けるための直接的な答えです。

syn cluster vimHiCtermColors contains=vimHiCtermColorYellow
syn keyword vimHiCtermColorYellow yellow contained

syn match  vimHiCtermFgBg   contained   "\ccterm[fb]g="he=e-1   nextgroup=vimNumber,vimHiCtermColor,@vimHiCtermColors,vimFgBgAttrib,vimHiCtermError

highlight vimHiCtermColorYellow ctermfg=yellow

そして、すべての色の端末名を色付けするための解決策があります。それらは (GUI ではなく) 端末でのみ色付けされ、他の属性 (256 色の端末、GUI の色、太字などの属性) はまったく強調表示されません。これをさらに拡張するには、何らかのスクリプトですべての可能な値を反復処理する必要があるでしょう。

syn cluster vimHiCtermColors contains=vimHiCtermColorBlack,vimHiCtermColorBlue,vimHiCtermColorBrown,vimHiCtermColorCyan,vimHiCtermColorDarkBlue,vimHiCtermColorDarkcyan,vimHiCtermColorDarkgray,vimHiCtermColorDarkgreen,vimHiCtermColorDarkgrey,vimHiCtermColorDarkmagenta,vimHiCtermColorDarkred,vimHiCtermColorDarkyellow,vimHiCtermColorGray,vimHiCtermColorGreen,vimHiCtermColorGrey,vimHiCtermColorLightblue,vimHiCtermColorLightcyan,vimHiCtermColorLightgray,vimHiCtermColorLightgreen,vimHiCtermColorLightgrey,vimHiCtermColorLightmagenta,vimHiCtermColorLightred,vimHiCtermColorMagenta,vimHiCtermColorRed,vimHiCtermColorWhite,vimHiCtermColorYellow

syn keyword vimHiCtermColorBlack black contained
syn keyword vimHiCtermColorBlue blue contained
syn keyword vimHiCtermColorBrown brown contained
syn keyword vimHiCtermColorCyan cyan contained
syn keyword vimHiCtermColorDarkBlue darkBlue contained
syn keyword vimHiCtermColorDarkcyan darkcyan contained
syn keyword vimHiCtermColorDarkgray darkgray contained
syn keyword vimHiCtermColorDarkgreen darkgreen contained
syn keyword vimHiCtermColorDarkgrey darkgrey contained
syn keyword vimHiCtermColorDarkmagenta darkmagenta contained
syn keyword vimHiCtermColorDarkred darkred contained
syn keyword vimHiCtermColorDarkyellow darkyellow contained
syn keyword vimHiCtermColorGray gray contained
syn keyword vimHiCtermColorGreen green contained
syn keyword vimHiCtermColorGrey grey contained
syn keyword vimHiCtermColorLightblue lightblue contained
syn keyword vimHiCtermColorLightcyan lightcyan contained
syn keyword vimHiCtermColorLightgray lightgray contained
syn keyword vimHiCtermColorLightgreen lightgreen contained
syn keyword vimHiCtermColorLightgrey lightgrey contained
syn keyword vimHiCtermColorLightmagenta lightmagenta contained
syn keyword vimHiCtermColorLightred lightred contained
syn keyword vimHiCtermColorMagenta magenta contained
syn keyword vimHiCtermColorRed red contained
syn keyword vimHiCtermColorWhite white contained
syn keyword vimHiCtermColorYellow yellow contained

syn match  vimHiCtermFgBg   contained   "\ccterm[fb]g="he=e-1   nextgroup=vimNumber,@vimHiCtermColors,vimFgBgAttrib,vimHiCtermError

highlight vimHiCtermColorBlack ctermfg=black
highlight vimHiCtermColorBlue ctermfg=blue
highlight vimHiCtermColorBrown ctermfg=brown
highlight vimHiCtermColorCyan ctermfg=cyan
highlight vimHiCtermColorDarkBlue ctermfg=darkBlue
highlight vimHiCtermColorDarkcyan ctermfg=darkcyan
highlight vimHiCtermColorDarkgray ctermfg=darkgray
highlight vimHiCtermColorDarkgreen ctermfg=darkgreen
highlight vimHiCtermColorDarkgrey ctermfg=darkgrey
highlight vimHiCtermColorDarkmagenta ctermfg=darkmagenta
highlight vimHiCtermColorDarkred ctermfg=darkred
highlight vimHiCtermColorDarkyellow ctermfg=darkyellow
highlight vimHiCtermColorGray ctermfg=gray
highlight vimHiCtermColorGreen ctermfg=green
highlight vimHiCtermColorGrey ctermfg=grey
highlight vimHiCtermColorLightblue ctermfg=lightblue
highlight vimHiCtermColorLightcyan ctermfg=lightcyan
highlight vimHiCtermColorLightgray ctermfg=lightgray
highlight vimHiCtermColorLightgreen ctermfg=lightgreen
highlight vimHiCtermColorLightgrey ctermfg=lightgrey
highlight vimHiCtermColorLightmagenta ctermfg=lightmagenta
highlight vimHiCtermColorLightred ctermfg=lightred
highlight vimHiCtermColorMagenta ctermfg=magenta
highlight vimHiCtermColorRed ctermfg=red
highlight vimHiCtermColorWhite ctermfg=white
highlight vimHiCtermColorYellow ctermfg=yellow

説明

colors/vim.vimを調べて を検索するとcterm、次の行が表示されます。

syn match  vimHiCtermFgBg   contained   "\ccterm[fb]g="he=e-1   nextgroup=vimNumber,vimHiCtermColor,vimFgBgAttrib,vimHiCtermError

これは、ctermfg=orctermbg=が検出された場合、次の単語をvimNumbervimHiCtermColorvimFgBgAttrib、またはとして強調表示することを示していvimHiCtermErrorます。vimHiCtermColor(上の数行)を見ると、

syn keyword vimHiCtermColor contained   black blue brown cyan darkBlue darkcyan darkgray darkgreen darkgrey darkmagenta darkred darkyellow gray green grey lightblue lightcyan lightgray lightgreen lightgrey lightmagenta lightred magenta red white yellow

これにより、すべてのカラー ターミナル名が一覧表示され、同じ構文グループのキーワードとして強調表示されます。したがって、それらをまとめて強調表示する代わりに、個別に強調表示することができます。上記の最初のソリューションの 4 行は、次の手順を説明しています。

  1. @vimHiCtermColorsステップ 2 の各グループを含む新しいクラスターを作成します。
  2. 色の値ごとに新しいキーワードを追加します。
  3. の代わりにvimHiCtermFgBg使用する定義を変更します。@vimHiCtermColorsvimHiCtermColor
  4. 必要に応じて各キーワードをハイライトします。

試したことがうまくいかなかった理由は 2 つあります。まず、 で指定された構文グループは、一般的なグループ (特にnextgroupあなたのグループ) よりも優先されます。yellowしかし、あなたは「どうcontainedin=ALLですか?」と言うかもしれません。これが 2 番目のポイントです。キーワードは個々の単位であり、それ以外のものを含めることはできません。元のvimHiCtermColorグループはすべてキーワードだったので、containedin=ALL上書きできませんでした。vimHiCtermColorキーワードではなく一致していた場合は、機能していた可能性があります。

于 2010-03-28T17:38:42.023 に答える
4

このアプローチが機能することを期待して~/.vim/after/syntax/vim.vimいますが、キーワード (黄色) が既に強調表示されている場合は、マッチャーを次のように変更する必要がある場合があります。

syn keyword yellow yellow containedin=ALL

強調表示しようとしているファイルは何ですか?

編集

java.vim ファイルを調べたところ、重複する構文グループが多数あるように見えます。これにより、ハイライトのカスタマイズが非常に困難になる可能性があります。これが役立つ場合に備えて、私がやったことです。

便利なマッピングは次のとおりです。

" What is the current syntax highlighting group?
map <F3> :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") . '> trans<' . synIDattr(synID(line("."),col("."),0),"name") . "> lo<" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">" . " FG:" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"fg#") . " BG:" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"bg#")<CR>

次に、関心のあるものの上にカーソルを移動し、 を押すF3と、現在のハイライト グループが何であるかを確認できます。テストとして、syntax ディレクトリで java.vim を開き、javaStorageClass を定義する 52 行目に移動しました。transientその行の単語を強調表示することにしました(yellowファイルのどこにもなかったため、何か作業する必要がありました)。

カーソルを合わせてtransientを押しF3ました。Vim は次のように報告しました。

hi<vimSynKeyRegion> trans<vimSynKeyRegion> lo<vimSynKeyRegion> FG: BG:

これは明らかに vimSynKeyRegion の一部であり、名前から推測するとsyn region. これをさらに調べることにしたので、現在の強調表示の構成を調査しました。

:redir @a>
:silent syn list
:redir END
:vnew
"ap

これにより、すべての構文情報を含むファイルが生成されます。私はこの行を検索しvimSynKeyRegionて見つけました:

vimSynKeyRegion xxx matchgroup=vimGroupName start=/\k\+/ skip=/\\\\\|\\|/ matchgroup=vimSep end=/|\|$/  contained oneline keepend contains=@vimSynKeyGroup 

vimSynKeyRegion、 という名前の構文クラスタからのアイテムを含むように構成されていますvimSynKeyGroup。したがって、transientこのグループのキーワードにすることで強調できます。

:syn keyword MyNewGroup transient
:hi MyNewGroup guifg=#ff00ff
:syn cluster vimSynKeyGroup add=MyNewGroup

これはあなたがやりたいことと正確に一致しないかもしれませんが、うまくいけば、それがあなたに何かをもたらすでしょう. 一部の部分をオーバーライドできない場合がありますが (キーワードまたは類似のものと一致する場合)、いつでもハイライトを再定義して色を変更できます。

:hi vimGroupName guifg=#ffff00

それがすべて役立つことを願っています。

于 2010-03-18T21:46:03.270 に答える