2008-11-26 11 views
7

Tôi đang cố gắng thêm một đánh dấu đặc biệt vào các chuỗi tài liệu Python trong các emacs (chế độ python).Regexps in Elisp để bao gồm các dòng mới

Hiện nay tôi có thể trích xuất một dòng duy nhất với:

(font-lock-add-keywords 
'python-mode 
'(("\\(\"\\{3\\}\\.+\"\\{3\\}\\)" 
    1 font-lock-doc-face prepend))) 

này hoạt động bây giờ:

"""Foo""" 

Nhưng càng sớm có một dòng mới như:

""" 
Foo 

""" 

Nó không hoạt động nữa. Điều này là hợp lý, vì . không bao gồm dòng mới (\n). Tôi có nên sử dụng một lớp nhân vật không?

Tôi làm cách nào để sửa cụm từ thông dụng này để bao gồm mọi thứ giữa """ """?

Cảm ơn trước!

Trả lời

2
"\\(\"\\{3\\}\\(.*\n?\\)*?\"\\{3\\}\\)" 

"*?" xây dựng là phiên bản không tham lam của "*".

+0

Vì một số lý do lạ, các emacs của tôi bị treo khi sử dụng regexp này. Treo tại 'Đang tải vc ... xong' – wunki

0

Một dòng mới trong regexps emacs được nhập bởi C-q C-j vì vậy chỉ cần gắn một nhóm chứa. và C-q C-j vào regexp của bạn. Khi tôi sử dụng công cụ regexp để xây dựng chúng, tôi không được trích dẫn đầy đủ như của bạn, nhưng tôi hy vọng những thay đổi này là hiển nhiên.

\("\{3\}\(.\| C-QC-j \)+"\{3\}\)

Xin lỗi tôi không thể định dạng nó tốt hơn, stackoverflow không đồng ý với tôi.

Cũng có thể nó sẽ hiển thị dưới dạng một dòng mới trong các emacs.

+0

Điều này không chính xác. Đối với chuỗi ký tự trong elisp, bạn sử dụng '\ n'. Khi nhập một tương tác regex, chẳng hạn như với một regex isearch, chỉ sau đó sẽ '\ n' không phải là một dòng mới, và' C-q C-j' là cần thiết để thay thế. – derekv

0

này hoạt động một nửa:

(font-lock-add-keywords 
    'python-mode 
     '(("\\(\"\\{3\\}\\(.\\|\n\\)*?\"\\{3\\}\\)" 
     1 font-lock-warning-face prepend))) 

Nhưng khi thêm RET là đánh dấu biến mất.

Đề xuất regexp "\\(\"\\{3\\}\\(.*\n?\\)*?\"\\{3\\}\\)" làm cho các emac của tôi bị treo khi mở tệp .py.

Có lẽ đó là thời gian để ghé thăm emacs mailinglist ..

+0

\ n không phải là dòng mới trong emacs –

+0

@ JoelBorggrén-Franck là sai, '\ n' trong một chuỗi Lisp đại diện cho một dòng mới. – tripleee

0

Cách tốt nhất và đơn giản nhất là cái này:

font-lock-add-keywords 
'python-mode 
'(("\\(\"\\{3\\}\\[^|]*?\"\\{3\\}\\)" 
    1 font-lock-doc-face prepend))) 

Bạn có thể sử dụng bất kỳ ký tự đó là chắc chắn không phải là giữa """ và '' "thay vì |.

+0

Nhưng không có gì đảm bảo rằng chuỗi không chứa mọi ký tự ASCII có thể. Đó là lý do tại sao dấu phân tách bao gồm ba ký tự giống hệt nhau.Tôi cho rằng bạn có thể làm việc xung quanh nó với một cái gì đó như '\\ ([^ \"] + \\ (\ "[^ \"] \\ | \ "\" [^ \ "] \\) \\? \\) * ' – tripleee