2012-09-13 18 views
6

Quiero escribir un lenguaje personalizado para registros de acceso en Notepad ++.Resaltar números como palabras clave en un lenguaje personalizado de Notepad ++ (para registros de acceso)

El problema es que los números (aquí: códigos de estado HTTP) no se resaltarán como palabras clave reales (es decir, GET). Notepad ++ solo proporciona un color de resaltado para los números en general.

¿Cómo manejo los números como texto?

archivo de registro Muestra

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 

idiomas personalizados Muestra
http://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=User_Defined_Language_Files

También probé la edición e importación de un idioma predefinido como esto:
http://notepad-plus.sourceforge.net/commun/userDefinedLang/Log4Net.xml

que tú El idioma personalizado debería verse así:

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

Lamentablemente, los números se colorearán en el mismo color.

me gustaría colorearlos así:
Sample highlighting of numbers in the access log

etc.

¿Alguna sugerencia? ¿Cómo manejar los números como palabras clave?

Respuesta

2

No es posible destacar números como palabras clave como la incorporada en lexers (analizadores/definiciones de la lengua) utiliza un valor numérico como un significado simbólico que la única manera de diferenciar entre un numérico y su palabra clave sería analizar todo el bloque numérico y luego compararlo con la lista de palabras clave, en cuyo caso se requiere también analizar los delimitadores alrededor del bloque numérico para asegurar que .200. no se resalte como 200. Esta es la razón por la que todos los números se resaltan como del mismo color; es decir, el color 'número'.

Si bien esto podría hacerse utilizando un lexer personalizado utilizando tokens de posición fija o correspondencias de expresiones regulares, encontrará que los idiomas definidos por el usuario (lo último que escuché) no tienen esta capacidad.

Como su petición es en realidad una maniobra sencilla, por lo que entiendo, siendo lo más general posible (como se solicita en su comentario) ...

Highlight space delimited numeric values contained in a given set. 

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

Podemos utilizar la función de 'Marca' de la El cuadro de diálogo 'Buscar' con esa expresión regular, pero luego todo está marcado del mismo color que con su experimento fallido.

Tal vez lo que sería simple y se adaptaría a sus necesidades sería utilizar un npp pythonscript y las configuraciones Mark Style en el Style Configurator para obtener el resultado deseado?

algo parecido a este estilo macro crudo:

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) 

Lo cual, de usar, sólo tiene que utilizar el administrador de plugins para instalar Python Script, vaya al menú plugin y seleccione New Script continuación, pegar, guardar, seleccione la ficha de la doc que desea analizar, y ejecutar el script (una vez más desde el menú del complemento).

Obviamente, podría usar los 5 estilos de Marca para diferentes términos, podría asignarlo a un atajo, y podría obtener más en el estilo 'scripting' -vs- 'macro' de nppPython y hacer un script completo para analizar lo que sea que quieras ... disparar con un guion disparador cada vez que seleccionas un estilo de lexer particular también es factible.

+0

Se podría hacer fácilmente mucho más eficiente y útil, pero es explícito para ilustrar que N ++ es muy fácil de abrir y de secuencias de comandos para rayar lo que sea 'su picazón'. :) – Thell

+1

Esperaba obtener una función de resaltado automático basada en la extensión del archivo. Esta solución es justa. Creo que tendré que completar un tutorial de Python para más funciones. ¡Gracias por tu esfuerzo! - Un comentario más: el plugin 'NppPython' no existe aquí (no' PyNPP'). Utilicé 'Python script', que funciona de la misma manera. – Smamatti

+0

sí, mi mal en el nombre del complemento. Respuesta editada – Thell

Cuestiones relacionadas