2012-09-13 3 views
6

Ich möchte eine benutzerdefinierte Sprache für Zugriffsprotokolle in Notepad ++ schreiben.Markieren Sie Zahlen wie Schlüsselwörter in einer benutzerdefinierten Notepad ++ Sprache (für Zugriffsprotokolle)

Das Problem ist, dass Zahlen (hier: HTTP-Statuscodes) nicht wie echte Schlüsselwörter (d. H. GET) hervorgehoben werden. Notepad ++ bietet nur eine Hervorhebungsfarbe für Zahlen im Allgemeinen.

Wie gehe ich mit Zahlen wie Text um?

Beispielprotokolldatei

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 

Beispiel für einen benutzerdefinierten Sprachen
http://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=User_Defined_Language_Files

Ich habe auch versucht, die Bearbeitung und eine vordefinierte Sprache wie folgt importieren:
http://notepad-plus.sourceforge.net/commun/userDefinedLang/Log4Net.xml

ich thou Die benutzerdefinierte Sprache sollte so aussehen:

<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> 

Leider werden Zahlen in der gleichen Farbe gefärbt.

würde Ich mag sie so färben:
Sample highlighting of numbers in the access log

usw.

Irgendwelche Vorschläge? Wie mit den Zahlen wie Keywords umgehen?

Antwort

2

Es ist nicht möglich Zahlen markieren als Schlüsselwörter wie die eingebaute in lexers (Parser/Sprachdefinitionen) eine numerische als Zeichen Bedeutung verwenden, dass die einzige Möglichkeit, zwischen einer numerischen und Ihre Keyword wäre zu unterscheiden Analysieren Sie den gesamten numerischen Block und vergleichen Sie ihn dann mit der Schlüsselwortliste. In diesem Fall müssen die Trennzeichen auch um den numerischen Block herum analysiert werden, um sicherzustellen, dass .200. nicht als 200 hervorgehoben wird. Dies ist der Grund, warum Ihre Nummern alle dieselbe Farbe haben. nämlich die Farbe "Nummer".

Während dies mit einem benutzerdefinierten Lexer mit festen Positionsmarker oder Regex-Abgleich getan werden konnte, finden Sie die benutzerdefinierten Sprachen (die letzten, die ich gehört habe) nicht diese Fähigkeit.

Als Ihr Antrag ist eigentlich eine ziemlich einfache, von dem, was ich verstehe, so allgemein wie möglich zu sein (wie in Ihrem Kommentar angefordert) ...

Highlight space delimited numeric values contained in a given set. 

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

Wir können die Funktion ‚Mark‘ Die Nutzung der 'Find' Dialog mit dieser Regex, aber dann ist alles mit der gleichen Farbe wie bei Ihrem gescheiterten Experiment markiert.

Vielleicht was wäre einfach und würde Ihren Bedürfnissen entsprechen würde ein Npp Pythonscript und die Mark Style Einstellungen in der Style Configurator verwenden, um das gewünschte Ergebnis zu erhalten?

so etwas wie dieses rohen Makro-Stil:

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) 

Which, zu bedienen, einfach das Plugin-Manager verwenden Python Script zu installieren, um das Plug-Menü gehen und wählen Sie New Script dann einfügen, speichern, wählen Sie die Registerkarte für die doc, das Sie analysieren möchten, und führen Sie das Skript aus (noch einmal aus dem Plugin-Menü).

Offensichtlich könnten Sie alle 5 Mark-Stile für verschiedene Begriffe verwenden, Sie könnten eine Verknüpfung zuweisen, und Sie könnten mehr in den 'Scripting' -VS- 'Makro' Stil von NppPython und machen ein voll durchgebranntes Skript zum Parsen was auch immer Sie wollen ... schießen mit einem Skript-Trigger, wann immer Sie einen bestimmten Lexer-Stil auswählen, ist auch machbar.

+0

Könnte leicht viel effizienter und nützlicher gemacht werden, aber es ist explizit zu illustrieren, dass N ++ ziemlich offen und skriptfähig ist, um zu kratzen, was auch immer Ihr 'Juckreiz' ist. :) – Thell

+1

Ich hoffte, eine automatische Highlight-Funktion basierend auf der Dateierweiterung zu bekommen. Diese Lösung ist fair genug. Ich denke, ich muss ein Python-Tutorial für weitere Funktionen erstellen. Danke für Ihre Bemühungen! - Noch ein Kommentar: Das Plugin 'NppPython' existiert hier nicht (nicht' PyNPP'). Ich habe 'Python script' verwendet, was genauso funktioniert. – Smamatti

+0

Yep, meine schlecht auf den Namen des Plugins. Bearbeitete Antwort. – Thell

Verwandte Themen