这两天正在学习 python,今天学到测试部分,就想在 emacs 里写个测试用例试一下。结果写完测试用例在终端里执行没问题,到 emacs 里执行却发现报错,错误也很奇怪,显示的是

file-remote-p: Wrong type argument: stringp, nil

以前碰到这种问题几乎除了上 google 搜,几乎是没什么办法,今天也是开始 google,结果搜索了一晚上也没个结果,用出错信息搜索出的结果貌似都跟这个没什么关系,很是发愁。

实在是没什么办法了,突然想到论坛上大佬们写的插件别人用着出问题时,大佬们通常都让抓个报错信息参考下。也就想试一试,反正也是没其它办法,死马当活马医呗。

执行 M-x toggle-debug-on-err,然后再操作一次,果然出错,然后输出一堆错误信息,貌似是从发起指令开始,一直到出错位置,所有的调用信息都有,慢慢从后往前看。竟然真的发现一点端倪,发现 file-remote-p 接收到 nil 参数是因为之前调用的函数里给传的是 project-root 变量,而 project-root 变量在这里是 nil,再继续看,发现如果 project-root 是从 projectile-project-root 赋值来的,而 projectile-project-root 怎么来呢?

不懂问 google,继续搜索,终于在一篇介绍 projectile 的文章里发现,在项目根目录里建一个空的.projectile 文件,即可让 projectile 认为当前目录为项目根目录,马上着手 touch 一个。再执行,成功!

我去,原来这么简单。导致出现问题的原因 python-pytest 包调用了 projectile 包,而 projectile 包的所有操作都是基于有 project-root 的前提下,所以设定当前项目根目录是非常必要的。解决手段虽然简单,可也让自己多了解了一点 projectile 的相关知识,也是一大收获啊。至此对 emacs 的兴趣又加深了几分。