elisp:处理错误类型参数异常

elisp: Handling wrong-type-argument exception

我想杀死访问给定目录中文件的所有缓冲区,保留所有其他缓冲区。但是,我的函数在到达 #<buffer *Minibuf-1*> 时崩溃了;迷你缓冲区没有访问文件。

(defun my-kill-all-visiting-buffers (dir)
  "Kill all buffers visiting DIR."
  (interactive)
  (mapcar
   (lambda (buf)
     (and (string-match-p
           (regexp-quote dir)
           (file-name-directory (buffer-file-name buf)))
         (kill-buffer buf)))
   (buffer-list)))

在Python-land,我会请求原谅并将其包裹在try-except中。在 lisp 的土地上我将如何处理这个问题?

您可以使用 elisp 具有的 condition-case 之类的东西来处理异常。或者你可以做这样的事情(也避免 regexp-quotery):

    (defun my-kill-all-visiting-buffers (dir)
  "Kill all buffers visiting DIR or any subdirectory of DIR"
  (interactive "Ddirectory: ")
  (mapc
   (lambda (buf)
     (let ((bfn (buffer-file-name buf)))
       (when (and (not (null bfn))
                  (file-in-directory-p bfn dir))
         (kill-buffer buf))))
   (buffer-list)))

可能有更好的方法。


备注

(not (null x))x 相同,但我有意使用它,所以当我阅读它时,我知道我正在检查 x 不是概念上无效的值,而不是它只是假的。

这避免了正则表达式操作(最初 string= 现在 string-prefix-p),因为,众所周知:

Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.

相反,它使用 file-in-directory-p 来准确询问它想要回答的问题:file 是否在目录或 dir 的任何子目录中? (感谢 Stefan,我不知道。)

以上所有内容在 Emacs 26.2 中都是合法的:我不再跟踪 elisp 中的哪些内容发生了更改和到达。

Elisp 在使用上与 Lisp 的许多其他方言并没有那么接近,除了表面上的不同:elisp 中使用的技术可能适用于也可能不适用于家族中的其他语言,但通常不会。

我发现没必要捕获 所有 可能的错误。处理缓冲区与文件不相关的情况就足够了。

使用regexp-quote用于处理关闭子目录中的文件。

(defun my-kill-all-visiting-buffers (dir)
  "Kill all buffers visiting DIR."
  (interactive)
  (mapcar
   (lambda (buf)
     (let ((bfn (buffer-file-name buf)))
       (and (not (null bfn))
            (string-match-p (regexp-quote dir) (file-name-directory bfn))
            (kill-buffer buf))))
   (buffer-list)))