在wolfram-mode
中常常会用到\[...]
的格式表示常量,比如\[Pi]
,\[transpose]
但是emacs在匹配括号时会认为\[
是一个被转义的符号,这个问题在 Unmatched [ … ] · Issue #4 · kawabata/wolfram-mode 中也有描述,但是由于这个库年久失修无人问津,我想自己动手解决,所以跑去把源代码翻了出来求教各位高手,不知到有没有什么好办法?
主要代码:
[details=wolfram-mode-20140118.757.el]括号匹配、转义符的syntax-table
:
(defvar wolfram-mode-syntax-table
(let ((syntax-table (make-syntax-table)))
;; ...
;; comments and parens
(modify-syntax-entry ?( "()1n" syntax-table)
(modify-syntax-entry ?) ")(4n" syntax-table)
(modify-syntax-entry ?* "_ 23n" syntax-table)
;; pure parens
(modify-syntax-entry ?[ "(]" syntax-table)
(modify-syntax-entry ?] ")[" syntax-table)
(modify-syntax-entry ?{ "(}" syntax-table)
(modify-syntax-entry ?} "){" syntax-table)
;;想达到如下的效果,但是syntax里面好像并不支持多字符匹配
;;(modify-syntax-entry ?\\[ "(]" syntax-table)
;;(modify-syntax-entry ?] ")\\[" syntax-table)
;; ...
;; quotes
;;想到过把反斜线转义去掉,但是在smartparent中仍然认为\[和]不匹配
(modify-syntax-entry ?\\ "\\" syntax-table)
(modify-syntax-entry ?\" "\"" syntax-table)
;; ...
syntax-table)
"Syntax table used in `wolfram-mode'.")
font-lock
关键字:
(defvar wolfram-font-lock-keywords
'(
;; ...
;; 这里已经声明了\[..]是一个数学常量
("\\\\[[A-Za-z][A-Za-z0-9]*\]" . font-lock-constant-face )
;; ...
))
wolfram-smie-rules
函数:(好像是根据括号匹配对下一行进行缩进,因为\[
和]
不匹配,所以会对齐到上一行的末尾)
(defun wolfram-smie-rules (kind token)
"Wolfram Language SMIE indentation function for KIND and TOKEN."
(pcase (cons kind token)
(`(:before . "[")
(save-excursion
(smie-default-backward-token)
`(column . ,(current-column))))
(`(:after . ":=") `(column . ,wolfram-indent))
(`(:after . ,(or "]" "}" ")")) '(column . 0))
(`(:after . ,(or "[" "{" "("))
(save-excursion
(beginning-of-line)
(skip-chars-forward " \t")
`(column . ,(+ wolfram-indent (current-column)))))
(`(,_ . ";") (smie-rule-separator kind))
(`(,_ . ",") (smie-rule-separator kind))
(`(:elem . ,_) 0)
(t nil)))
```[/details]
因为刚刚接触elisp,所以源代码不是很懂,挑了些感觉有用的地方,如果哪位高手能够帮助,我将非常感谢!
----------
已找到答案[Emacs major-mode for Mathematica based on cc-mode](http://stackoverflow.com/questions/15331277/emacs-major-mode-for-mathematica-based-on-cc-mode)
具体如下:
1. 在代码中加入`syntax-propertize-function`:
(defvar wolfram-syntax-propertize-function
(syntax-propertize-rules
("\\\\[[A-Z][A-Za-z]*]" (0 "_"))))
2. `wolfram-mode-variables ()`中加入如下代码:
(setq-local syntax-propertize-function
wolfram-syntax-propertize-function)
不足之处在于`\[`和`]`不能使用`evil-jump-item`命令相互跳转
也感谢@xuchunyang 和 @twlz0ne 的帮助!