我在 emacs 中使用折叠模式,并试图创建一个函数来根据模式插入适当的折叠标记(开始或结束)。到目前为止我有
(defun insert-folding-mode-mark ()
(interactive)
(let ((st "##{{{")
(en "##}}}")
string-to-insert)
(save-excursion
(setq string-to-insert
(let ((here (point))
sp ep)
(setq sp (search-backward st))
(goto-char here)
(setq ep (search-backward en))
(if (< sp ep) st en))))
(insert string-to-insert)))
这会在(点)插入“##{{{”,除非“##{{{”在它之前,在这种情况下它会插入“##}}}”。 我想用一些确定开始和结束标记的东西替换第一个(让)分配
(let* ((match (assoc (intern mode-name) folding-mode-marks-alist))
(st (nth 1 match))
(en (nth 2 match)))
[(intern) 是否应该以这种方式被调用?] 我的 folding-mode-marks-alist 的截断版本看起来像
((ess-mode "##{{{" "##}}}")
(tex-mode "%{{{" "%}}}")
(python-mode "# {{{" "# }}}")
(emacs-lisp-mode ";;{{{" ";;}}}")
(TeX-mode "%{{{" "%}}}")
(LaTeX-mode "%{{{" "%}}}"))
而从各种模式返回的模式名称是 {"Emacs-Lisp", "ESS[S]", "PDFLaTeX", "Python", ...}。似乎我可能想使用 (downcase)、(concat x "-mode") 等对字符串进行部分匹配,但想知道 emacs lisp 中是否有一种惯用的方法来进行这种与键的匹配一个列表的,或者我只需要有一个单独的代码块,通过它我用 (mapcar 'car folding-mode-marks-alist)
提取键并将每个符号转换为字符串(如何?)做匹配?
非常感谢!
最佳答案
Emacs Lisp 有一个destructuring-bind
工具,在这里可能会有帮助。还利用命名当前主要模式的符号可通过变量 major-mode
获得这一事实,您可以编写如下内容:
(destructuring-bind (st en) (cdr (assoc major-mode folding-mode-marks-alist))
; do stuff
)
请注意,如果 (assoc major-mode folding-mode-marks-alist)
返回 nil
,这将不起作用,因此最好将其替换为调用一些能够返回合理默认值的自定义函数。
关于emacs - 在 emacs lisp 中匹配关联列表中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2394978/