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

elisp:处理错误的类型参数异常,lisp,elisp,Lisp,Elisp,我想杀死所有访问给定目录中文件的缓冲区,保留所有其他缓冲区。然而,当我的函数到达#时,它就爆炸了;微型缓冲区未访问文件 (取消清除我的所有访问缓冲区(目录) “杀死所有访问目录的缓冲区。” (互动) (地图车 (λ(buf) (和(string-match-p) (regexp报价目录) (文件名目录(缓冲区文件名buf))) (杀死缓冲区buf))) (缓冲区列表) 在pythonland中,我会请求原谅,并将其包装成一个try except。在lisp的土地上,我该如何处理这个问题?您可以

我想杀死所有访问给定目录中文件的缓冲区,保留所有其他缓冲区。然而,当我的函数到达
#
时,它就爆炸了;微型缓冲区未访问文件

(取消清除我的所有访问缓冲区(目录)
“杀死所有访问目录的缓冲区。”
(互动)
(地图车
(λ(buf)
(和(string-match-p)
(regexp报价目录)
(文件名目录(缓冲区文件名buf)))
(杀死缓冲区buf)))
(缓冲区列表)

在pythonland中,我会请求原谅,并将其包装成一个
try except
。在lisp的土地上,我该如何处理这个问题?

您可以使用elisp拥有的类似
条件case
的东西来处理异常。或者您可以这样做(也可以避免使用regexp引号):

可能有更好的方法


笔记
(not(null x))
x
相同,但我故意使用它,因此当我阅读它时,我知道我正在检查
x
是否不是概念上无效的值,而不仅仅是错误的值

这避免了regexp操作(最初是
string=
现在是
string-prefix-p
),因为:

有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有两个问题

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

以上所有内容在Emacs26.2中都是合法的:我不知道elisp中的哪些内容在什么时候发生了变化


Elisp与许多其他正在使用的Lisp方言并不太接近,只是表面上看:Elisp中使用的技巧可能适用于也可能不适用于家族中的其他语言,但通常不适用。

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

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

(取消清除我的所有访问缓冲区(目录)
“杀死所有访问目录的缓冲区。”
(互动)
(地图车
(λ(buf)
(let((bfn(缓冲区文件名buf)))
(和(非(空bfn))
(string-match-p(regexp quote dir)(文件名目录bfn))
(杀死缓冲区buf)))
(缓冲区列表)

我想你应该使用
string-prefix-p
而不是
string=
来防止
bfn
dir
@Stefan的子目录中:我假设他们想要的是目录中的缓冲区:显然,他们想要的缓冲区取决于他们自己!当然,但是原始代码遇到了使用
regexp quote
+
string-match-p
的麻烦,大概是因为
string=
不是他们想要的;-)@你说得对。我对regexp有反应。我现在改了!(还请注意,最初使用的
string-match-p
是危险的,因为
(string-match-p(rexep quote)/tmp“/home/x/foo/tmp”)
是正确的。谢谢。顺便说一句,关于“更改和到达时间”,在Emacs-27中,
*帮助*
变量和函数的缓冲区包括猜测(基于快速阅读etc/新闻)介绍它的时间;-)
    (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)))