【问题标题】:Highlight numbers like keywords in a Notepad++ custom language (for access logs)以 Notepad++ 自定义语言突出显示数字(例如关键字)(用于访问日志)
【发布时间】:2012-09-06 09:20:12
【问题描述】:

我想为 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>

不幸的是,数字将被涂成相同的颜色。

我想给它们上色:

等等

有什么建议吗?关键字之类的数字如何处理?

【问题讨论】:

    标签: syntax-highlighting notepad++ http-status-codes


    【解决方案1】:

    无法将 数字 突出显示为关键字,因为内置词法分析器(解析器/语言定义)使用数字作为标记,这意味着区分数字和您的数字的唯一方法关键字将解析整个数字块,然后与关键字列表进行比较,在这种情况下,还需要解析数字块周围的分隔符以确保.200. 不会突出显示为200。这就是为什么您的数字都以相同颜色突出显示的原因;即“数字”颜色。

    虽然这可以使用自定义词法分析器使用固定位置标记或正则表达式匹配来完成,但您会发现用户定义的语言(我听说的最后一种语言)没有此功能。

    据我了解,您的要求实际上相当简单,尽可能笼统(如您的评论中所要求的那样)...

    Highlight space delimited numeric values contained in a given set.
    
        [[:space:]](200|301|404)[[:space:]]
    

    我们可以将“查找”对话框的“标记”功能与该正则表达式一起使用,但随后所有内容都被标记为与您失败的实验相同的颜色。

    也许最简单且适合您需要的方法是使用 npp pythonscript 和 Style Configurator 中的 Mark Style 设置来获得所需的结果?

    类似于这种粗略的宏样式:

    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 种标记样式用于不同的术语,您可以指定一个快捷方式,并且您可以更深入地了解 nppPython 的“脚本”-vs-“宏”样式,并制作一个完整的脚本来解析任何内容您想要...只要您选择特定的词法分析器样式,就可以使用脚本触发器进行拍摄。

    【讨论】:

    • 可以很容易地变得更加高效和有用,但它明确说明 N++ 非常开放且可编写脚本来抓取your itch 的任何内容。 :)
    • 我希望获得基于文件扩展名的自动突出显示功能。这个解决方案很公平。我想我必须完成一个 python 教程才能获得更多功能。谢谢你的努力! - 还有一条评论:这里不存在插件NppPython(不是PyNPP)。我使用了Python script,它的工作方式相同。
    • 是的,我的插件名称不好。编辑答案。
    猜你喜欢
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多