我正试图从python.el(当前官方的gnu模式)中为Boo派生一个新的emacs模式,但我在更改缩进时遇到了问题。有人对如何最好地处理这件事有什么建议吗?我不需要彻底改变任何东西,只需要添加一些新的块形式和东西。
例如,由于这是针对Boo的,try/except语法使用"确保"而不是"最终"。我可以在python.el中通过更改python-rx组件的块起始定义来很容易地更改这一点。然而,我似乎无法在派生模式中覆盖它,因为宏python rx正在使用python rx组件,我想一旦在python.el加载时定义了这两个东西(因为我是从它派生的),我就不能再在加载后或钩子中覆盖它了?因为我已经在内存中和python.el加载后的钩子中以及在after-load语句中更改了它,但它们都不起作用。而直接改变python.el效果很好。
以下是python.el中有问题的代码:
(eval-when-compile
(defconst python-rx-constituents
`((block-start . ,(rx symbol-start
(or "def" "class" "if" "elif" "else" "try"
"except" "finally" "for" "while" "with"
)
symbol-end))
(decorator . ,(rx line-start (* space) ?@ (any letter ?_)
(* (any word ?_))))
(defun . ,(rx symbol-start (or "def" "class") symbol-end))
(if-name-main . ,(rx line-start "if" (+ space) "__name__"
(+ space) "==" (+ space)
(any ?' ?") "__main__" (any ?' ?")
(* space) ?:))
(symbol-name . ,(rx (any letter ?_) (* (any word ?_))))
(open-paren . ,(rx (or "{" "[" "(")))
(close-paren . ,(rx (or "}" "]" ")")))
(simple-operator . ,(rx (any ?+ ?- ?/ ?& ?^ ?~ ?| ?* ?< ?> ?= ?%)))
;; FIXME: rx should support (not simple-operator).
(not-simple-operator . ,(rx
(not
(any ?+ ?- ?/ ?& ?^ ?~ ?| ?* ?< ?> ?= ?%))))
;; FIXME: Use regexp-opt.
(operator . ,(rx (or "+" "-" "/" "&" "^" "~" "|" "*" "<" ">"
"=" "%" "**" "//" "<<" ">>" "<=" "!="
"==" ">=" "is" "not")))
;; FIXME: Use regexp-opt.
(assignment-operator . ,(rx (or "=" "+=" "-=" "*=" "/=" "//=" "%=" "**="
">>=" "<<=" "&=" "^=" "|=")))
(string-delimiter . ,(rx (and
;; Match even number of backslashes.
(or (not (any ?\ ?' ?")) point
;; Quotes might be preceded by a escaped quote.
(and (or (not (any ?\)) point) ?\
(* ?\ ?\) (any ?' ?")))
(* ?\ ?\)
;; Match single or triple quotes of any kind.
(group (or """ """"" "'" "'''"))))))
"Additional Python specific sexps for `python-rx'")
(defmacro python-rx (&rest regexps)
"Python mode specialized rx macro.
This variant of `rx' supports common python named REGEXPS."
(let ((rx-constituents (append python-rx-constituents rx-constituents)))
(cond ((null regexps)
(error "No regexp"))
((cdr regexps)
(rx-to-string `(and ,@regexps) t))
(t
(rx-to-string (car regexps) t))))))
我想更改python-rx的组成部分,使块启动包含"确保"而不是"最终"。
如前所述,这里不适合使用派生模式:不能反向更改宏。此外,不建议重新定义它:加载/评估的顺序将决定哪一个有效——在更大的范围内,这意味着陷入混乱。
复制文件,存储为boo.el,将前缀替换为"boo-",重新加载并编辑需要更改的内容。
IMO表达的担忧是不合理的,因为允许复制、更改和重新发布更改后的代码是GPL的核心。
复制文件确实是个坏主意,因为跟踪python.el的进化会很痛苦。派生也不是一个好主意,因为Boo并不是Python的扩展或变体,所以你可能想重用它的一些缩进机制和一些代码来理解重要的缩进,但仅此而已。
你可能想联系python.el的作者(抄送emacs-devel),看看python.el是否可以进行调整,让你的生活更轻松。例如,可以将公共代码提取到可以在两者之间共享的辅助文件中。理想情况下,该文件可能适用于cassescript模式,也可能适用于Haskell模式。