我在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)))
Run Code Online (Sandbox Code Playgroud)
这会在(点)处插入"## {{{",除非"## {{{"在它之前,在这种情况下它会插入"##}}}".我想将第一个(let)赋值替换为确定开始和结束标记的东西
(let* ((match (assoc (intern mode-name) folding-mode-marks-alist))
(st (nth 1 match))
(en (nth 2 match)))
Run Code Online (Sandbox Code Playgroud)
[是(实习生)意味着以这种方式调用吗?]我的折叠模式标记alist的截断版看起来像
((ess-mode "##{{{" "##}}}")
(tex-mode "%{{{" "%}}}")
(python-mode "# {{{" "# }}}")
(emacs-lisp-mode ";;{{{" ";;}}}")
(TeX-mode "%{{{" "%}}}")
(LaTeX-mode "%{{{" "%}}}"))
Run Code Online (Sandbox Code Playgroud)
从各种模式返回的模式名称是{"Emacs-Lisp","ESS [S]","PDFLaTeX","Python",...}.好像我可能想要使用(downcase),(concat x"-mode")等对字符串进行部分匹配,但是想知道在emacs lisp中是否有一种惯用的方式来做这种与键的匹配一个alist,或者我只需要一个单独的代码块,通过它我可以提取密钥(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
)
Run Code Online (Sandbox Code Playgroud)
请注意,如果(assoc major-mode folding-mode-marks-alist)返回nil,这将无效,因此最好通过调用某些能够返回合理默认值的自定义函数来替换它.
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |