emacs - 在 emacs lisp 中匹配关联列表中的键

标签 emacs elisp

我在 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/

相关文章:

Emacs shell命令与tramp模式等效

python - 如何获取 Texinfo Info 格式的 Python 文档?

javascript - js.erb 和 css.erb 文件上良好的代码突出显示、语法分析和代码辅助编辑器

Emacs:键绑定(bind)到匿名函数的性能

emacs - 如何转换为美元和美分——四舍五入,并使用逗号分隔符

emacs - 将带参数的函数添加到钩子(Hook)

emacs - 在 Emacs 中运行 latex

Emacs - 为光标闪烁设置不同的时间间隔

emacs - 有没有办法编写一个始终保持向上兼容的 .emacs?

emacs - 关于 Emacs 自定义系统的困惑