2012-04-23 15 views
5

Điều gì sẽ là cách hay để làm cho Emacs đánh dấu một biểu thức có thể bao gồm những thứ như dấu ngoặc đơn cân bằng - ví dụ: cái gì đó nhưemacs: làm nổi bật biểu thức cân bằng (ví dụ: thẻ LaTeX)

\highlightthis{some \textit{text} here 
some more text 
done now} 

highlight-regex hoạt động độc đáo cho những thứ đơn giản, nhưng tôi gặp khó khăn thực viết một regex emacs nhận ngắt dòng, và dĩ nhiên là nó phù hợp cho đến khi khung đóng cửa đầu tiên.

(như một câu hỏi thứ:. Con trỏ đến bất kỳ gói mở rộng emacs cú pháp regex sẽ được nhiều đánh giá cao - Tôi gặp thời gian khá khó khăn với nó, và tôi là khá quen thuộc với regexes trong perl)

Sửa: Đối với mục đích cụ thể của tôi (tags LaTeX nổi bật trong một bộ đệm AUCTeX), tôi đã có thể có được điều này để làm việc bằng cách tùy biến một AUCTeX cụ thể biến font-latex-user-keyword-classes, có thêm một cái gì đó như thế này để custom-set-variables trong emacs:

'(font-latex-user-keyword-classes (quote (("mycommands" (("highlightthis" "{")) (:slant italic :foreground "red") command)))) 

Một giải pháp chung chung hơn sẽ cho đến khi được tốt đẹp để có mặc dù!

Trả lời

1

Bạn có thể sử dụng các chức năng hoạt động trên biểu thức s để làm việc với khu vực bạn muốn đánh dấu và sử dụng một trong các giải pháp được đề cập trên this question để thực sự đánh dấu nó.

Dưới đây là một ví dụ:

(defun my/highlight-function() 
    (interactive) 
    (save-excursion 
    (goto-char (point-min)) 
    (search-forward "\highlightthis") 
    (let ((end (scan-sexps (point) 1))) 
     (add-text-properties (point) end '(comment t face highlight))))) 

EDIT: Dưới đây là một ví dụ sử dụng một chức năng tương tự với hệ thống phông chữ khóa chuẩn Emacs', như được giải thích trong phần search-based fontification của the-lisp emacs dẫn sử dụng:

(defun my/highlight-function (bound) 
    (if (search-forward "\highlightthis" bound 'noerror) 
     (let ((begin (match-end 0)) 
      (end (scan-sexps (point) 1))) 
     (set-match-data (list begin end)) 
     t) 
    nil)) 
(add-hook 'LaTeX-mode-hook 
      (lambda() 
      (font-lock-add-keywords nil '(my/highlight-function)))) 
+0

Ý tưởng hay, nhưng tôi chưa thể thực hiện công việc này. Đầu tiên, giải pháp từ "làm nổi bật khu vực" dường như không làm gì cho tôi - tức là. thực hiện câu lệnh (add-text-properties 1 10 ...) một mình không làm nổi bật các ký hiệu từ 1 đến 10. Thứ hai, ngay cả khi tôi làm nó hoạt động, tôi hơi lo lắng rằng phần nổi bật sẽ được ghim vào vị trí đó trong đệm. Nó cũng sẽ tốt đẹp nếu điều này có thể được thực hiện tự động, giống như cách làm nổi bật cú pháp khác ... – laxxy

+0

"Tôi hơi lo lắng rằng việc đánh dấu sẽ được ghim vào vị trí đó trong bộ đệm" Nó không phải là trường hợp: văn bản các thuộc tính được gắn liền với văn bản của chúng, chứ không phải các vị trí cụ thể trong bộ đệm. – Francesco

+0

cho bạn hai mối quan tâm khác, tôi nghĩ rằng [font chữ dựa trên tìm kiếm] (http://www.gnu.org/software/emacs/manual/html_node/elisp/Search_002dbased-Fontification.html#Search_002dbased-Fontification) phần của elisp manual sẽ giúp bạn. Bạn có thể thêm một phần tử 'function' vào biến' font-lock-keywords'. – Francesco