【发布时间】:2011-07-03 02:59:29
【问题描述】:
这是我的问题: 我使用 Emacs 并获得了很多一直无用的缓冲区,例如 *Messages* 或 *Completions*。
我想绑定 \C-y 以关闭所有以 * 开头的缓冲区,除了 *shell*(和 *shell* )缓冲区。
为此,我想在我的 .emacs 文件中添加一些 Emacs-Lisp:
(defun string-prefix s1 s2
(if (> (string-length s1) (string-length s2)) nil
(string=? s1 (substring s2 0 (string-length s1))) ))
(defun curry2
(lambda (f)
(lambda (x)
(lambda (y)
(f x y) ))))
(defun filter
(lambda (f l)
(if (null? l) '()
(let ((rest (cdr l)))
(if (f (car l)) (cons (car l) rest)
rest) ))))
(defun kill-useless (arg)
(interactive "p")
(map 'kill-buffer
(filter
(not ((curry2 string-prefix) "*shell*"))
(list-buffers)
) ))
(global-set-key "\C-y" 'kill-useless)
我已经使用 Scheme 测试了 string-prefix 和 curry2,filter 看起来很简单。
遗憾的是我无法让kill-useless 正常工作。
上面写着filter: Invalid function: (curry2 string-prefix)。
现在,问题是我在 Emacs-Lisp 上有点烂,除了 Scheme,我真的不使用任何 Lisp,而在 Scheme (MIT) 中,这是可行的:
(filter ((curry2 string-prefix?) "*shell") '("*shell*" "*sh22" "eel"))
;Value 5: ("*shell*")
我想要:
- 修复我的代码的方法
- 有关如何以不同方式执行此操作的建议
谢谢!
【问题讨论】:
-
*Message*缓冲区是一个有用的缓冲区:每次 Emacs 告诉你某事时,它都会放在那里,因此你可以例如将其复制并粘贴到 google 以在 google 上找到解决方案。还要注意,当您可能会使用某种模式(如 magit)时,它们会以有用的方式使用此类缓冲区。 -
是的,我最终也保留了那个缓冲区。感谢您的提示!