Jdo*_*dog 4 regex emacs syntax-highlighting
我最近搬到了emacs,我习惯于/喜欢突出显示的数字.我从这里开始的快速黑客将以下内容放入我的.emacs:
(add-hook 'after-change-major-mode-hook
'(lambda () (font-lock-add-keywords
nil
'(("\\([0-9]+\\)"
1 font-lock-warning-face prepend)))))
Run Code Online (Sandbox Code Playgroud)
这提供了一个良好的开端,即突出显示任何数字.但是,我是一个完整的正则表达式初学者,理想情况下会喜欢以下行为:
不幸的是,这看起来非常像一个"为我做这个"的问题,我不愿意发布,但到目前为止我还没有取得任何体面的进展.
据我所知,发现[^a-zA-Z][0-9]+[^a-zA-Z]除了字母之外的任何东西(例如等号)都匹配,但所有这一切都包括突出显示中的相邻符号.我不知道如何判断它"只会突出显示数字,如果两边都没有字母".
当然,我无法想象正则表达式是复杂语法高亮显示的方式,所以欢迎在emacs创意中任何好的数字突出显示,
任何帮助非常感谢.(如果它有任何区别,这是在Python编码时使用.)
首先转到暂存缓冲区并输入一些测试文本.在那里放一些数字,一些包含数字的标识符,一些缺少部分的数字(如.e12)等等.这些将是我们的测试用例,让我们快速实验.现在运行M-x re-builder进入正则表达式构建器模式,这将允许您针对当前缓冲区的文本尝试任何正则表达式以查看它匹配的内容.这是一个非常方便的模式; 你将能够一直使用它.请注意,因为Emacs lisp要求您将正则表达式放入字符串中,所以必须将所有反斜杠加倍.你已经正确地做到了,但我不会在这里加倍.
因此,将匹配限制为不属于标识符的数字非常简单.\ b将匹配单词边界,因此在正则表达式的任一端放置一个将使其匹配整个单词
您可以通过向您开始使用的字符类添加句点来匹配浮点数,以便它成为[0-9.].不幸的是,这可以匹配它自己的所有时期; 我们真正想要的是[0-9]*\.?[0-9]+,它将匹配0或更多数字,后跟一个可选的句点,后跟一个或多个数字.
可以匹配前导符号[-+]?,这样我们就可以得到负数.
为了匹配指数,我们需要一个可选的组:\(...\)?,因为我们只是用它来突出显示,而实际上不需要分离组的内容,我们可以这样做\(?:...\),这将节省正则表达式匹配器一点时间.在组内,我们需要匹配"e"([eE]),可选符号([-+]?)和一个或多个数字([0-9]+).
把它们放在一起:[-+]?\b[0-9]*\.?[0-9]+\(?:[eE][-+]?[0-9]+\)?\b.请注意,我在第一个单词边界之前放置了可选符号,因为"+"和" - "字符创建了单词边界.
首先,失去了add-hook和lambda.这个font-lock-add-keywords电话也不需要.如果只想要这个python-mode,请将模式符号作为第一个参数传递而不是nil.
其次,有两种主要方法可以做到这一点.
在数字周围添加分组构造.font-lock-keywords表单中的数字对应于组,因此这将是'(("\\([^a-zA-Z]\\([0-9]+\\)[^a-zA-Z]\\)" 2 font-lock-warning-face prepend).但是,外部分组在这里相当无用,所以这可以简化为'(("[^a-zA-Z]\\([0-9]+\\)[^a-zA-Z]" 1 font-lock-warning-face prepend).
只需使用符号反斜杠结构的开头和结尾即可.然后regexp看起来像这样:\_<[0-9]+\_>.我们可以在这里突出显示整个比赛,因此不需要组号:'(("\\_<[0-9]+\\_>" . font-lock-warning-face prepend).作为一种变体,您可以使用单词的开头和结尾的结构,但您可能不希望突出显示下划线旁边的数字或python-mode语法类中的任何其他字符(如果有)symbol.
最后,可能没有必要prepend.在此之前,这些数字可能都没有被突出显示,如果你认为可能与其他次要模式相互作用whitespace,你最好选择append,或者完全省略这个元素.
最终结果:
(font-lock-add-keywords nil '(("\\_<[0-9]+\\_>" . font-lock-warning-face)))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1144 次 |
| 最近记录: |