2012-09-13 25 views
6

Tôi muốn viết một ngôn ngữ tùy chỉnh cho các nhật ký truy cập trong Notepad ++.Làm nổi bật các số như từ khóa bằng ngôn ngữ tùy chỉnh Notepad ++ (đối với nhật ký truy cập)

Vấn đề là số (ở đây: mã trạng thái HTTP) sẽ không được đánh dấu như từ khóa thực (tức là GET). Notepad ++ chỉ cung cấp màu nổi bật cho các số nói chung.

Làm cách nào để xử lý các số như văn bản?

log file mẫu

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 

ngôn ngữ mẫu tùy chỉnh
http://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=User_Defined_Language_Files

Tôi cũng đã cố gắng chỉnh sửa và nhập khẩu một ngôn ngữ được xác định trước như thế này:
http://notepad-plus.sourceforge.net/commun/userDefinedLang/Log4Net.xml

tôi thou ght ngôn ngữ tùy chỉnh sẽ trông giống như sau:

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

Số không may sẽ có cùng màu.

Tôi muốn tô màu chúng như thế này:
Sample highlighting of numbers in the access log

, vv

Bất kỳ lời đề nghị? Cách xử lý các số như từ khóa?

Trả lời

2

Không thể đánh dấu số làm từ khóa làm từ vựng được tích hợp (định nghĩa phân tích cú pháp/ngôn ngữ) sử dụng số làm mã thông báo, cách duy nhất để phân biệt giữa số và từ khóa của bạn phân tích cú pháp toàn bộ khối số và sau đó so sánh với danh sách từ khóa, trong trường hợp này nó cũng được yêu cầu để phân tích cú pháp phân cách xung quanh khối số để đảm bảo rằng .200. không làm nổi bật là 200. Đây là lý do tại sao tất cả các số của bạn được đánh dấu bằng cùng một màu; cụ thể là màu 'số'.

Mặc dù điều này có thể được thực hiện bằng cách sử dụng từ khóa tùy chỉnh bằng cách sử dụng mã thông báo vị trí cố định hoặc khớp regex bạn sẽ tìm thấy ngôn ngữ do người dùng xác định (lần cuối tôi nghe) không có khả năng này.

Như yêu cầu của bạn thực sự là một khá đơn giản, từ những gì tôi hiểu, là như chung càng tốt (theo yêu cầu trong bình luận của bạn) ...

Highlight space delimited numeric values contained in a given set. 

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

Chúng ta có thể sử dụng tính năng 'Mark' của Hộp thoại 'Tìm' với regex đó nhưng sau đó mọi thứ được đánh dấu cùng màu giống với thử nghiệm không thành công của bạn.

Có lẽ điều gì sẽ đơn giản và phù hợp với nhu cầu của bạn sẽ là sử dụng pythonscript npp và cài đặt Mark Style trong Style Configurator để nhận kết quả mong muốn?

cái gì đó như kiểu này thô vĩ mô:

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) 

Trong đó, để sử dụng, chỉ cần sử dụng người quản lý plugin để cài đặt Python Script, hãy vào menu plugin và chọn New Script sau đó dán, lưu, chọn tab cho doc bạn muốn phân tích cú pháp và thực thi tập lệnh (một lần nữa từ trình đơn plugin). Rõ ràng bạn có thể sử dụng tất cả 5 kiểu Mark cho các thuật ngữ khác nhau, bạn có thể gán cho một phím tắt, và bạn có thể nhận được nhiều hơn về phong cách 'scripting' -vs- 'macro' của nppPython và tạo một kịch bản đầy đủ để phân tích cú pháp bất cứ điều gì bạn muốn ... bắn có một kích hoạt script bất cứ khi nào bạn chọn một phong cách lexer cụ thể là doable quá.

+0

Có thể dễ dàng được thực hiện hiệu quả hơn và hữu ích hơn, nhưng rõ ràng để minh họa rằng N ++ là khá darned mở và scriptable để đầu bất cứ điều gì 'itch của bạn là. :) – Thell

+1

Tôi hy vọng sẽ có được một tính năng đánh dấu tự động dựa trên phần mở rộng của tệp. Giải pháp này đủ công bằng. Tôi đoán tôi sẽ phải hoàn thành một hướng dẫn python cho nhiều tính năng hơn. Cảm ơn vì nỗ lực của bạn! - Một chú thích nữa: Plugin 'NppPython' không tồn tại ở đây (không phải' PyNPP'). Tôi đã sử dụng 'tập lệnh Python', hoạt động tương tự. – Smamatti

+0

vâng, tôi không biết tên plugin. Câu trả lời đã chỉnh sửa. – Thell

Các vấn đề liên quan