
構文の強調表示は簡単なタスクであり、何度も解決されています。 しかし、1つの不快な機能があります-新しい言語の構文(たとえば、habra-editorのbbタグの言語、またはどのプログラムのログ)を強調したい場合、ほとんどのソリューションには、文法、パーサーを作成し、それをどこかに埋め込むことが含まれます。 しかし、ログの強調表示を取得したいが、これに3時間を費やす必要がない場合はどうでしょうか。
適切なテキストエディター
テキストに色を付ける前に、これを行うテキストエディターを選択する必要があります。 私たちは、あらゆる味と色に対応した多くのテキストエディターを持っています。 何が必要ですか? テキストが編集しやすいように、任意のオペレーティングシステムで動作するためのシンプルで、もちろん無料の何か。 そしてもちろん、構文の強調表示を埋め込むことは、そこにPEG文法を埋め込むハードコアCコードの再コンパイルにはなりません:)。 そのような要件があっても、多くのテキストエディターが存在するのは奇妙なことではありません。 私はそれを最もよく知っているので、シテを選択します:)。 Windowsの場合は
、こちらからダウンロード
します 。MacOSおよび* NIXの場合は、リポジトリから直接ダウンロードできます。 インストール、実行、次のようなものを取得します。

エディターの内部に接続します
最初に合意したように、何もコンパイルしません。これは長くて退屈なビジネスであり、「15分でペイント」のパラダイムには適合しません。 再コンパイルせずにテキストエディターの内部にアクセスする方法は? これを行うには、エディターがスクリプトをサポートするか、COMなどのプロセス間通信のインターフェイスを提供する必要があります。 Sciteにはスクリプトがあります。 これらは
luaで書かれています。これは3ルーブルと同じくらい簡単で、10分で習得できます。 ほぼ基本的な:)。 それをサイトに接続するのも簡単です:
- テキストファイルscite.luaで快適な場所を作成します(名前は何でもかまいません)。
- サイトで、オプション->「グローバルオプションファイルを開く」を選択します。
- 開いた設定ファイルで、次のようにscript.luaへのフルパスを指定します。

「=」の前後にスペースがないことに注意してください。これは重要です。 - サイトを再起動します。
ハローワールド
これで、サイトを実行するたびに、指定されたスクリプトが自動的にダウンロードおよび実行されます。 すべてが古典的な方法で動作することを確認しましょう-sciteで既知のテキストを表示する空のscite.luaファイルにコマンドを追加します。

ここでサイトを実行すると、結果が表示されます。

誇らしげに「出力ウィンドウ」と呼ばれる特別なウィンドウに、スクリプトで出力をポイントしたテキストが表示されます。 スクリプトおよび出力ウィンドウでprint()コマンドを使用すると、スクリプトをデバッグし、必要な情報(たとえば、記事の顔文字の数など)を表示するのは非常に簡単です。
ペイントの準備をする
テキストエディタが内部に正常に接続されていることを確認したら、ペイントを開始できます。 ペイントを成功させるには、
iocの原則を使用し、スクリプトでsciteを指定して、テキストが更新されるたびに相談するようにする必要があります。 これを行うには、関数に特別な名前を設定するだけです:
function OnUpdateUI()
print( "text update" )
end
この関数は、テキストエディタウィンドウのテキストが変更されるたびに呼び出されます。 次の図は、テストエディターを起動して「a」を入力した場合の動作を示しています。ハンドラー関数への一括呼び出しが提供されています。

ペイント
実際、すべての準備が整っています。テキストが変更されるたびに自動的に呼び出される関数があります。 ペイントできます。 sciteについて最も価値のあることは、それがscintillaがどのように機能するかを示すエディターであるということです-テキスト編集ウィンドウを作成するためのライブラリー。 ちなみに、ライブラリは人気があります-Komodo Edit、wxWidgets、GTKはテキスト編集にそれだけを使用します。 また、このライブラリには、SCT_メッセージなど、あらゆるものとやり取りするための定期的なメカニズムがあります。 サイトの
詳細なドキュメントは、どのメッセージとどの順序で送信する必要があるかを明確に説明するので、テキストエディター
はテキスト
をガンで塗り、必要な単語を強調し、余白に美しいラベルを付けます。 特に、テキストに色を付けるには、2つのメッセージを送信するだけで十分です。
- SCI_STARTSTYLINGは、ペイントを開始する文字番号を示します。 最初の文字は番号1です
- ペイントする文字の数を示すSCI_SETSTYLINGおよび数字の色付け
次のコードは、2文字ごとにある色で色付けします。
function OnUpdateUI()
text = editor:textrange( 0, editor.Length )
for i = 1, string.len( text ), 2 do
scite.SendEditor( SCI_STARTSTYLING, i, 31 )
scite.SendEditor( SCI_SETSTYLING, 1, 5 )
end
end
いくつかのニュアンスに注意してください。「31」はスタイル番号のマスクであり、この関数に常に渡す必要がある魔法の番号の一種です。 「5」は色番号です。 デフォルトでは、サイトは各番号に色を割り当てます。 この例では、結果は...奇妙に見えます。

ニュアンス
ご覧のとおり、複雑なことは何もありません。 luaを簡単に理解し、サイトを送信するためのメッセージのリストを用意して10分間費やした後、テキストを使用して多くの不要で役に立たないことができます:)。 他に何に注意を払うことができます:
- OnUpdateUI()関数の開始時に、SCI_CLEARDOCUMENTSTYLEメッセージを送信して、前回設定したカラーリングをリセットすることは理にかなっています。
- どの色がどの番号に対応するかをエディターに伝えるには、オプション->「グローバルオプションファイルを開く」を選択し、フォームの行を追加する必要があります。
file.patterns.habr=*.habr
lexer.$(file.patterns.habr)=habr
style.habr.5=fore:#FF0000,back:#0000FF
ここで、「habr」は色付けするファイル拡張子です。
すべてに幸せな休日を!