pog*_*p77 12 regex emacs aquamacs emacs-faces
我正在尝试将其他代码编辑器中的功能添加到我的Emacs配置中,其中#if 0 ... #endif块中的C/C++代码会自动设置为注释面/字体.根据我的测试,cpp-highlight-mode可以实现我想要的功能,但需要用户操作.似乎绑定字体锁功能是使行为自动化的正确选项.
我已成功地遵循GNU文档中的示例来更改单行正则表达式的表面.例如:
(add-hook 'c-mode-common-hook
(lambda ()
(font-lock-add-keywords nil
'(("\\<\\(FIXME\\|TODO\\|HACK\\|fixme\\|todo\\|hack\\)" 1
font-lock-warning-face t)))))
Run Code Online (Sandbox Code Playgroud)
可以在文件中的任何位置突出显示调试相关的关键字.但是,我在将#if 0 ...#endif作为多行正则表达式进行匹配时遇到问题.我在这篇文章中找到了一些有用的信息(如何编写区域,如"<?php foo; bar;?>"),这表明Emacs必须专门告知允许多行匹配.但是这段代码:
(add-hook 'c-mode-common-hook
(lambda ()
'(progn
(setq font-lock-multiline t)
(font-lock-add-keywords nil
'(("#if 0\\(.\\|\n\\)*?#endif" 1
font-lock-comment-face t))))))
Run Code Online (Sandbox Code Playgroud)
仍然不适合我.也许我的正则表达式是错误的(尽管它似乎使用Mx重构器),我搞砸了我的语法,或者我完全遵循错误的方法.我在OS X 10.6.5上使用Aquamacs 2.1(基于GNU Emacs 23.2.50.1),如果这有所不同.
任何援助将不胜感激!
sco*_*zer 15
即使你让多行regexp工作,你仍然会遇到嵌套问题,#ifdef/#endif
因为它会在第一次停止字体锁定#endif
.此代码有效,但我不确定大文件是否会明显减慢:
(defun my-c-mode-font-lock-if0 (limit)
(save-restriction
(widen)
(save-excursion
(goto-char (point-min))
(let ((depth 0) str start start-depth)
(while (re-search-forward "^\\s-*#\\s-*\\(if\\|else\\|endif\\)" limit 'move)
(setq str (match-string 1))
(if (string= str "if")
(progn
(setq depth (1+ depth))
(when (and (null start) (looking-at "\\s-+0"))
(setq start (match-end 0)
start-depth depth)))
(when (and start (= depth start-depth))
(c-put-font-lock-face start (match-beginning 0) 'font-lock-comment-face)
(setq start nil))
(when (string= str "endif")
(setq depth (1- depth)))))
(when (and start (> depth 0))
(c-put-font-lock-face start (point) 'font-lock-comment-face)))))
nil)
(defun my-c-mode-common-hook ()
(font-lock-add-keywords
nil
'((my-c-mode-font-lock-if0 (0 font-lock-comment-face prepend))) 'add-to-end))
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
Run Code Online (Sandbox Code Playgroud)
编辑:
考虑到#else
编辑#2: 处理if/else/endif的任意嵌套的Niftier代码
归档时间: |
|
查看次数: |
2193 次 |
最近记录: |