错误类型的参数:stringp,nil

31

之前我一直是将代码剪切并粘贴到我的.emacs文件中,但后来我决定在emacs中添加一些maven功能。现在,我不知道我是如何把它搞砸的,但昨晚当我运行M-x jarl-mvn-exec时,我一直得到标题中的错误。我睡了一晚上,第二天回来也没进展。

(defun jarl-get-pom ()
  (concat (locate-dominating-file 
       (buffer-file-name 
        (current-buffer))
       "pom.xml")
      "pom.xml"))

(defun jarl-visit-pom ()
  (interactive)
  (find-file (jarl-get-pom)))

(defun jarl-mvn-exec ()
  (interactive)
  (switch-to-buffer (get-buffer-create "maven"))
  (start-process-shell-command "mvn-exec" "maven" "mvn" "-f" (jarl-get-pom) "compile")
  (start-process-shell-command "mvn-exec" "maven" "mvn" "-f" (jarl-get-pom) "exec:exec"))

6
值得一提的是,错误信息“wrong type argument: stringp, nil”意味着Emacs期望一个字符串,但实际上却得到了nil - arvidj
2个回答

47

你需要提供更多信息才能确定。尝试设置

(setq debug-on-error t)

这将给你提供一个堆栈跟踪,显示哪个函数在抱怨字符串为nil。

我猜测buffer-file-name返回了nil,这就是问题所在(并非所有缓冲区都有文件名)。请查看An Introduction To Programming in Emacs Lispdebugging部分或Emacs Lisp手册的debugging部分。


我的意图是在Emacs中获取当前缓冲区文件上方的pom,但我切换到另一个缓冲区(没有文件的缓冲区)以查看我的Maven命令的结果。 - HahaHortness
好的回答。《Emacs Lisp编程入门》调试部分的链接是https://www.gnu.org/software/emacs/manual/html_node/eintr/Debugging.html#Debugging - bshanks

16

找到 init 文件中的问题的秘诀并不是什么神秘的东西:二分查找

使用 comment-region 命令将你的 init 文件一半,三分之一,四分之三,七分之八等进行注释,很快就能确定问题所在。 comment-region 命令也可取消注释: C-h f comment-region RET


在这种情况下,他只需要调试一个“单独的代码块”,而且他已经知道是哪个代码块,所以通过二分查找并不能得到太多收益(尽管一般来说对于大部分由独立指令序列组成的~/.emacs文件,二分查找能够很好地发挥作用)。 - Stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接