在emacs lisp中匹配关联列表中的键
我在emacs中使用折叠模式,并尝试创建一个函数,根据模式插入适当的折叠标记(开始或结束)。到目前为止我有在emacs lisp中匹配关联列表中的键,emacs,elisp,Emacs,Elisp,我在emacs中使用折叠模式,并尝试创建一个函数,根据模式插入适当的折叠标记(开始或结束)。到目前为止我有 (defun insert-folding-mode-mark () (interactive) (let ((st "##{{{") (en "##}}}") string-to-insert) (save-excursion (setq string-to-insert (let ((here (po
(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)))
((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的汽车折叠模式标记列表)
并将每个符号转换为字符串(如何?)以进行匹配
非常感谢!Emacs Lisp有一个
解构绑定
功能,在这里可能会有所帮助。此外,还利用了命名当前主模式的符号可通过变量主模式
使用的事实,您可以编写如下内容:
(destructuring-bind (st en) (cdr (assoc major-mode folding-mode-marks-alist))
; do stuff
)
请注意,如果
(assoc主模式折叠模式标记为alist),这将不起作用
返回nil
,因此最好将其替换为调用一些能够返回合理默认值的自定义函数。除了这里的主模式
比模式名
更合适之外,如果没有折叠,上面列出的函数插入折叠模式标记
将引发错误光标和缓冲区开始之间的标记。以下是一个没有该怪癖的修订:
(require 'cl)
(defun insert-folding-mode-mark ()
(interactive)
(flet ((fn (s) (save-excursion (or (search-backward s () t) 0))))
(destructuring-bind (mode st en)
(or (assoc major-mode folding-mode-marks-alist) '(nil "" ""))
(insert (if (<= (fn st) (fn en)) st en)))))
(需要“cl”)
(拆卸插入折叠模式标记()
(互动)
(flet((fn(s)(保存偏移(或(向后搜索s()t)0)))
(解构绑定(模式st en)
(或(相关主模式折叠模式标记)(无“”)
(插入(如果(您可能有兴趣知道有注释开始
和注释结束
变量,这些变量应该已经包含了基于主模式的所需信息。例如
(search-backward (concat comment-start "{{{"))
...
(insert comment-start "{{{" comment-end)
应该足够了。当然,对于lisp模式,注释开始
是“;”
所以你可能想做你正在做的事情来获得”;“
,但是对于其他模式,你可以回到注释开始
。你也可以(setq注释开始“;”)
虽然我不完全确定lisp模式有什么不同。谢谢-您的构造,特别是flet的使用,非常漂亮。但是…返回(点)该函数无法区分在第一行上有起始标记和根本没有标记,因此当缓冲区以标记:PSimply brilliant开始时会失败。我已经为nils添加了额外的测试,但使用从'or'运算符返回的最后一个值非常棒。谢谢-这是我的第一个想法,但正如您从例如,在标记上方提供的折叠模式标记alist需要1或2次重复注释开始,有时在注释开始和三个大括号之间有一个空格,等等…这就是为什么我想实际对alist的键执行搜索。不客气。另外,我想我可能会合并类似于o的内容原始功能进入我的配置来我的下一轮Emacs定制,所以感谢分享!