[英]How to test `font-lock-keywords` values for Emacs Lisp code
我提出這個問題,因為我認為問題和可能的答案可能會幫助編寫定義font-lock-keywords
Lisp代碼的Emacs用戶。 我提供了一個我覺得有幫助的答案。 我也對其他答案感興趣。
該變量的值是表達式列表,每個表達式可以指定一個或多個匹配或用於執行匹配的模式,以及一個或多個用於突出顯示匹配文本的面。 font-lock-keywords
值的可能性很多且很復雜。 (描述這個的文檔是Elisp手冊,節點Search-based Fontification
。)
在大多數情況下,列表具有多個元素,這意味着不止一個正則表達式模式。 這些可以以不同方式相互作用。 有些可以阻止他人生效,或者他們可以改變他人的影響。 例如,我的庫Dired +在Dired模式下定義了帶有31個條目(正則表達式)的font-lock-keywords
,其中許多條目是交互式的。
如何保持這一切? 你如何進行調試,當你定義它或修改它這樣的名單? 您可以注釋掉除列表項之外的所有項目,以便單獨查看其效果。 然后重復另一個。 然后可能會添加一些,也許可以按不同的順序添加。 我想,有各種各樣的可能性,但你做了什么?
(好吧,我知道大多數Elisp程序員都不會編寫超級復雜的font-lock-keywords
定義。但即使是簡單的定義,這也會變得復雜。而且如果這個過程更容易,那么用戶不會不必要地將自己限制在只有一兩個項)。
您可以使用我新發布的Font Lock Studio 。 以下內容來自自述文件:
Font Lock Studio是Font Lock關鍵字的交互式調試器 (Emacs語法高亮規則)。
Font Lock Studio允許您單步執行字體鎖定關鍵字 - 匹配器,突出顯示和錨定規則,以便您可以看到緩沖區已經完成時會發生什么。 您可以在規則上或規則內設置斷點 ,然后運行直到命中一個斷點 。 在規則內部時,使用背景顏色調色板可視化匹配。 解釋者可以用純文本英語描述規則。 與Edebug的緊密集成允許您進入作為Font Lock關鍵字一部分的Lisp表達式。
使用調試器時,會顯示一個接口緩沖區 ,它包含所有關鍵字,用於匹配數據的導航和訪問。
當Font Lock Studio啟動時,注釋和字符串會預先着色,因為它們是早期語法階段的一部分 (Font Lock Studio不支持)。
鍵入“Mx font-lock-studio RET”啟動調試器。 按?
或查看可用命令的菜單。
對於使用html-mode
的緩沖區,接口緩沖區看起來如下。 其他主要模式通常具有越來越復雜的規則。 左側的箭頭表示當前的活動位置。 源緩沖區中的相應箭頭位於當前搜索位置。
========================
=== Font Lock Studio ===
========================
--------------------------------------------------
=> "<\\([!?][_:[:alpha:]][-_.:[:alnum:]]*\\)"
(1 font-lock-keyword-face)
--------------------------------------------------
"</?\\([_[:alpha:]][-_.[:alnum:]]*\\)\\(?::\\([_:[:alpha:]]
[-_.:[:alnum:]]*\\)\\)?"
(1
(if
(match-end 2)
sgml-namespace-face font-lock-function-name-face))
(2 font-lock-function-name-face nil t)
--------------------------------------------------
"\\(?:^\\|[ \t]\\)\\([_[:alpha:]][-_.[:alnum:]]*\\)\\(?::
\\([_:[:alpha:]][-_.:[:alnum:]]*\\)\\)?=[\"']"
(1
(if
(match-end 2)
sgml-namespace-face font-lock-variable-name-face))
(2 font-lock-variable-name-face nil t)
--------------------------------------------------
"[&%][_:[:alpha:]][-_.:[:alnum:]]*;?"
(0 font-lock-variable-name-face)
--------------------------------------------------
"<\\(b\\(?:ig\\|link\\)\\|cite\\|em\\|h[1-6]\\|rev\\|s\\(?:
mall\\|trong\\)\\|t\\(?:itle\\|t\\)\\|var\\|[bisu]\\)
\\([ \t][^>]*\\)?>\\([^<]+\\)</\\1>"
(3
(cdr
(assoc-string
(match-string 1)
sgml-tag-face-alist t))
prepend)
==================================================
Public state:
Debug on error : YES
Debug on quit : YES
Explain rules : YES
Show compiled code : NO
按空格鍵以單步執行所有關鍵字。 “n”將轉到下一個關鍵字,“b”將設置斷點,“g”將運行到結尾(或下一個斷點),“q”將退出。
您可以單步進入 , 結束和退出 Font Lock關鍵字。 完全支持錨定規則。 此外,您可以運行到結束或下一個斷點。
您可以在關鍵字的一部分上設置斷點,例如匹配器(例如正則表達式),突出顯示規則或錨定突出顯示規則內部。
如果要在不停止斷點的情況下步進或運行,請在命令前加上Cu
。
請注意,在錨定規則中,您可以在整個規則或單個部件上設置斷點。 在前一種情況下,僅突出顯示外括號。
在執行關鍵字或錨定突出顯示的匹配器之后,使用源緩沖區,正則表達式中的背景顏色以及相應的突出顯示規則或規則來顯示匹配數據(無論搜索找到什么)。 如果正則表達式或突出顯示的一部分不匹配,則它不會着色,例如,當后綴regexp運算符時會發生這種情況?
用來。
請注意,內部匹配組優先於外部組。 這可能導致突出顯示規則獲得未出現在正則表達式或源緩沖區中的顏色的情況。 例如,匹配器“\\(abc \\)”將使用匹配1的顏色着色,而higlight規則“(0 a-face)”將獲得匹配0的顏色。
界面中顯示的關鍵字已經標准化。 例如,而不是
("xyz" . font-lock-type-face)
關鍵字
("xyz" (0 font-lock-type-face))
顯示。 有關詳細信息,請參閱font-lock-studio-normalize-keywords
。
解釋器回應了Font Lock關鍵字當前部分的人類可讀描述。 這有助於您理解規則中的所有nil
:s和t
:s實際上意味着什么。
使用自動解釋器時 ,Font Lock Studio會在每個命令后回復說明。
與Edebug的緊密集成允許您在接口緩沖區中的關鍵字中嵌入單步表達式,並允許您在源文件中設置調用函數以進行調試。
源緩沖區中的搜索位置通過覆蓋箭頭和更新點進行可視化。 如果源緩沖區在多個並排窗口中可見並且啟用了跟隨模式,則搜索位置將顯示在合適的窗口中以最小化滾動。
為了解決這個問題,我編寫了一個Icicles 多命令 , icicle-font-lock-keywords
。 它允許您執行以下操作:
在單獨的font-lock-keywords
條目(模式)之間循環,單獨應用它們以查看每個條目的效果。
選擇單個條目並單獨應用它們以查看相同的內容。
選擇一組條目並應用它,條目以相同的順序出現在font-lock-keywords
。 您可以為任意數量的集合執行此操作。
按照您選擇的順序累計多組條目的效果。
還原,以查看所有條目的效果,即所有font-lock-keywords
。
您可以在命令的單個調用中以任何順序執行所有這些操作。
Mo
是Facemenu和字體鎖定的前綴鍵,因此我在Icicle模式下將此命令放在鍵Mo I
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.