6

Notepad++ でアクセス ログ用のカスタム言語を記述したいと考えています。

問題は、数字 (ここでは HTTP ステータス コード) が実際のキーワード (つまり GET) のように強調表示されないことです。Notepad++ は、一般的に数字のハイライト色のみを提供します。

数値をテキストのように扱うにはどうすればよいですか?

サンプルログファイル

192.23.0.9 - - [10/Sep/2012:13:46:42 +0200] "GET /js/jquery-ui.custom.min.js HTTP/1.1" 200 206731
192.23.0.9 - - [10/Sep/2012:13:46:43 +0200] "GET /js/onmediaquery.min.js HTTP/1.1" 200 1229
192.23.0.9 - - [10/Sep/2012:13:46:43 +0200] "GET /en/contact HTTP/1.1" 200 12836
192.23.0.9 - - [10/Sep/2012:13:46:44 +0200] "GET /en/imprint HTTP/1.1" 200 17380
192.23.0.9 - - [10/Sep/2012:13:46:46 +0200] "GET /en/nothere HTTP/1.1" 404 2785

カスタム言語のサンプル
http://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=User_Defined_Language_Files

また、次のような事前定義された言語を編集してインポートしようとしました:
http://notepad-plus.sourceforge.net/commun/userDefinedLang/Log4Net.xml

カスタム言語は次のようになるはずだと思いました。

<KeywordLists>
[...]
    <Keywords name="Words1">404 501</Keywords>
    <Keywords name="Words2">301 303</Keywords>
    <Keywords name="Words3">200</Keywords>
</KeywordLists>

<Styles>
    <WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" colorStyle="0" fontName="Courier New" fontStyle="0"/>
    [...]
    <WordsStyle name="KEYWORD1" styleID="5" fgColor="FF0000" bgColor="FFFFFF" colorStyle="1" fontName="" fontStyle="0"/>
    <WordsStyle name="KEYWORD2" styleID="6" fgColor="0000FF" bgColor="FFFFFF" colorStyle="1" fontName="" fontStyle="1"/>
    <WordsStyle name="KEYWORD3" styleID="7" fgColor="00FF00" bgColor="FFFFFF" colorStyle="1" fontName="" fontStyle="0"/>
    [...]

    // This line causes number highlighting. Deletion doesn't work either.
    <WordsStyle name="NUMBER" styleID="4" fgColor="0F7F00" bgColor="FFFFFF" fontName="" fontStyle="0"/>
</Styles>

残念ながら、数字は同じ色で着色されます。

次のように色を付けたいと思います。
アクセスログの番号の強調表示の例

助言がありますか?数字をキーワードのように扱うには?

4

1 に答える 1

2

組み込みのレクサー (パーサー/言語定義) は数値をトークンとして使用するため、数値をキーワードとして強調表示することはできません。次に、キーワード リストと比較します。この場合、数値ブロックの前後の区切り文字も解析して、.200.として強調表示されないようにする必要があります200。これが、数字がすべて同じ色で強調表示される理由です。つまり、「数字」の色です。

これは、固定位置トークンまたは正規表現マッチングのいずれかを使用するカスタム lexer を使用して実行できますが、ユーザー定義言語 (私が最後に聞いた言語) にはこの機能がないことがわかります。

あなたのリクエストは実際にはかなり単純なので、私が理解していることから、可能な限り一般的です(コメントでリクエストされているように)...

Highlight space delimited numeric values contained in a given set.

    [[:space:]](200|301|404)[[:space:]]

その正規表現で「検索」ダイアログの「マーク」機能を使用できますが、失敗した実験のようにすべてが同じ色でマークされます。

Mark Styleおそらく、npp pythonscript と の設定を使用しStyle Configuratorて目的の結果を得るには、簡単でニーズに合ったものになるでしょうか?

この粗雑なマクロ スタイルのようなもの:

from Npp import *

def found(line, m):
    global first
    pos = editor.positionFromLine(line)
    if first:
        editor.setSelection(pos + m.end(), pos + m.start())
        first = False
    else:
        editor.addSelection(pos + m.end(), pos + m.start())


editor.setMultipleSelection(True)
lines = editor.getUserLineSelection()

# Use space padded search since MARKALLEXT2 will act just
# like the internal lexer if only the numeric is selected
# when it is called.

first = True
editor.pysearch( " 200 ", found, 0, lines[0], lines[1])
notepad.menuCommand(MENUCOMMAND.SEARCH_MARKALLEXT1)

first = True
editor.pysearch( " 301 ", found, 0, lines[0], lines[1])
notepad.menuCommand(MENUCOMMAND.SEARCH_MARKALLEXT2)

first = True
editor.pysearch( " 404 ", found, 0, lines[0], lines[1])
notepad.menuCommand(MENUCOMMAND.SEARCH_MARKALLEXT3)

使用するには、プラグイン マネージャーを使用して をインストールPython Scriptし、プラグイン メニューに移動して選択しNew Script、貼り付けて保存し、解析するドキュメントのタブを選択して、スクリプトを実行します (もう一度プラグイン メニューから)。

明らかに、さまざまな用語に 5 つの Mark スタイルすべてを使用したり、ショートカットに割り当てたり、nppPython の「スクリプト」-vs-「マクロ」スタイルをさらに利用したり、必要なものを解析する本格的なスクリプトを作成したりできます。 .. 特定のレクサー スタイルを選択するたびにスクリプト トリガーを使用して撮影することも可能です。

于 2012-10-01T22:38:39.587 に答える