2

「:highlight Normal」コマンドで変更した後、端末の元の前景色を復元する方法は vim にありますか?

たとえば、Windows コマンド プロンプトで vim.exe 7.2 を使用しています。コマンド プロンプトに緑色のテキストが表示されます。vim.exe を起動すると、次のコマンドを実行してテキストを赤に変更できます。

:highlight Normal ctermfg=red

ただし、前景色を元の色に戻す方法がわかりません。

もちろん、この単純な例では、元の色が緑であることがわかっているので、明示的に緑に戻すことができます。ただし、実際には、vim スクリプトを作成していて、元の色に戻すための一般的なソリューションが必要です。

ここ数時間、vim のドキュメントを調べて、「:syntax off」、「:highlight normal clear」、「syntax reset」などを試しましたが、役に立ちませんでした。termcap セクションに 't_op' 変数に関する興味深い情報がありましたが、その使用方法がわかりません。私がこれまでに経験した唯一の成功は、vim を終了し、コマンド プロンプトを元の色に戻すことです。同じvimセッション内からこれを実行できるようにしたいと本当に思っています。

事前に、ご意見をお寄せいただきありがとうございます。

------[20100723 13:30]-----

rq へのコメントの混乱で申し訳ありません。代わりに、関連するフォローアップ情報を元の質問に投稿してみます。

私のマシン (vim 7.2、Windows 7、コマンド プロンプト) では、 synIDattr() 関数はすべての通常の前景色に対して同じ値を返します。次のことを考慮してください: 構文の強調表示を無効にして、コマンド プロンプトで新しい vim セッションを開始し、次のスクリプトを実行して、最初の行の最初の文字の前景色を報告します。

let numID = synID(1, 1, 1)
let numIDtrans = synIDtrans(numID)
let numFG = synIDattr(numIDtrans, "fg")
echo "synID: *" . numID . "*"
echo "synIDtrans: *" . numIDtrans . "*"
echo "synIDattr(fg): *" . numFG . "*"

応答として、次のようになります。

synID: *0*
synIDtrans: *0*
synIDattr(fg): **

synIDattr() によって返される値がないことに注意してください。追加したリテラル アスタリスク区切り記号だけです。

次に、Normal グループの前景色を変更します。

highlight Normal ctermfg=red

同じスクリプトを実行すると、同じ応答が得られます - synIDattr() からの値はありません。構文の強調表示を有効にすると、スクリプトは有用な情報を返すことに注意してください (ただし、その時点では手遅れです)。

------[20100728 16:11]-----

「highlight Normal ctermfg=NONE」ソリューションが機能しました。今後の参考のために、もう少しコンテキストを提供します。

私の目標は、構文の強調表示のオンとオフをすばやく切り替えるための関数とホットキーを作成することでした。構文の強調表示を無効にした後に前景色を元の色に戻すには、colorscheme ファイルから「highlight Normal...」コマンドを削除し、対応する 2 つのコマンドを関数自体に追加する必要がありました。

function! fSwitchSyntax()

        if exists("g:syntax_on")

                syntax off    
                highlight normal ctermfg=NONE  <--- New command

        else

                syntax on    
                highlight normal ctermfg=white <--- New command

        endif

endfunction
4

1 に答える 1

2

Vim スクリプトでは、次のスニペットを使用して、カーソルの下のテキスト部分の前景色を取得できます。

let oldcolor = synIDattr(synIDtrans(synID(line("."), col("."), 1)), "fg")

元の色に戻すには、変更した構文項目を追跡する必要があります。次のスニペットは、カーソルの下の ctermfg の色を設定する方法を出力します。

let synhere = synID(line("."), col("."), 1)
let oldcolor = synIDattr(synIDtrans(synhere), "fg")
let what = synIDattr(synhere, "name")
echo ":highlight " . what . " ctermfg=" . oldcolor

太字、下線、および背景色も追跡する必要がある場合があります。:help synIDattr()に詳細があります。

編集: 更新が表示されませんでした。コメントを追加する必要があるかもしれません。

構文がオフの場合、 syn* 関数は何もしないと思います。質問を読み直して、元の状態に戻す最も簡単な方法は:highlight Normal ctermfg=NONE.

于 2010-07-23T07:17:56.073 に答える