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)))
我想杀死访问给定目录中文件的所有缓冲区,保留所有其他缓冲区。但是,我的函数在到达 #<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)))