2012-09-13 12 views
6

Chcę napisać niestandardowy język dla dzienników dostępu w Notepad ++.Wyróżnij liczby, takie jak słowa kluczowe w niestandardowym języku Notepad ++ (dla dzienników dostępu)

Problem polega na tym, że liczby (tutaj: kody stanu HTTP) nie zostaną podświetlone, tak jak rzeczywiste słowa kluczowe (np. GET). Notepad ++ zapewnia tylko kolor podświetlenia dla liczb ogólnie.

Jak obsługiwać liczby takie jak tekst?

pliku dziennika Próbka

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 

niestandardowe Próbka języki
http://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=User_Defined_Language_Files

Próbowałem też edytowanie i importowanie predefiniowany język tak:
http://notepad-plus.sourceforge.net/commun/userDefinedLang/Log4Net.xml

I ty GHT język zwyczaj powinien wyglądać następująco:

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

Niestety numery będą barwione w tym samym kolorze.

Chciałbym pokolorować je tak:
Sample highlighting of numbers in the access log

itp

sugestie? Jak obsługiwać liczby, takie jak słowa kluczowe?

Odpowiedz

2

Nie można podświetlać liczb jako słów kluczowych, jako wbudowanych lexers (parserów/definicji języka) używać liczby jako tokenu, co oznacza, że ​​jedynym sposobem na rozróżnienie liczby i słowa kluczowego byłoby przeanalizuj cały blok liczbowy, a następnie porównaj z listą słów kluczowych. W takim przypadku konieczne będzie przeanalizowanie ograniczników wokół bloku liczbowego, aby upewnić się, że .200. nie podświetli się jako 200. Dlatego wszystkie twoje liczby są zaznaczone jako ten sam kolor; mianowicie kolor "numer".

Chociaż można to zrobić za pomocą niestandardowego lexera przy użyciu stałych tokenów lub dopasowania do wyrażenia regularnego, można zauważyć, że języki zdefiniowane przez użytkownika (ostatnie, które słyszałem) nie mają takiej możliwości.

jak żądanie jest w rzeczywistości dość proste, z tego co rozumiem, jest tak ogólne, jak to możliwe (zgodnie z wnioskiem w swoim komentarzu) ...

Highlight space delimited numeric values contained in a given set. 

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

Możemy użyć funkcji „Mark” podczas Okno dialogowe "Znajdź" z tym regexem, ale wszystko jest oznaczone tym samym kolorem, co w przypadku nieudanego eksperymentu.

Być może to, co będzie proste i pasuje do twoich potrzeb, to użycie pythonscript npp i Mark Style ustawień w Style Configurator, aby uzyskać pożądany rezultat?

coś takiego surowego makro stylu:

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) 

, które w użyciu, wystarczy użyć menedżera wtyczek do zainstalowania Python Script, przejdź do menu pluginu i wybierz New Script następnie wklej, zapisz, wybierz kartę dla doc chcesz przeanalizować i wykonać skrypt (ponownie z menu wtyczki).

Oczywiście można korzystać ze wszystkich 5 stylów Zaznacz do różnych warunków, można przypisać do skrótu, a można dostać więcej do skryptów „” „makro” -vs- stylu nppPython i zrobić pełnowartościowy skryptu do analizowania cokolwiek chcesz ... strzelanie z wyzwalaczem skryptu za każdym razem, gdy wybierzesz określony styl leksykalny, jest również wykonalne.

+0

Z łatwością można uczynić go znacznie bardziej wydajnym i użytecznym, ale wyraźnie pokazuje, że N ++ jest całkiem cholernie otwarty i skryptowalny, aby zera to, co "twój świąd". :) – Thell

+1

Mam nadzieję, że dostanę funkcję automatycznego podświetlania na podstawie rozszerzenia pliku. To rozwiązanie jest wystarczająco sprawiedliwe. Myślę, że będę musiał wypełnić samouczek python dla więcej funkcji. Dzięki za twój wysiłek! - Jeszcze jeden komentarz: wtyczka 'NppPython' nie istnieje tutaj (nie" PyNPP "). Użyłem "skryptu Pythona", który działa w ten sam sposób. – Smamatti

+0

Tak, mój zły na nazwę wtyczki. Edytowana odpowiedź. – Thell

Powiązane problemy