Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在emacs lisp中匹配关联列表中的键_Emacs_Elisp - Fatal编程技术网

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

在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

我在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)))
((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定制,所以感谢分享!