我目前正在使用以下代码在 emacs 中连接 flymake 和 Pyflakes:
(defun flymake-create-temp-in-system-tempdir (filename prefix)
(make-temp-file (or prefix "flymake")))
然后我将此函数传递给flymake-init-create-temp-buffer-copy
. (取自http://hustoknow.blogspot.com/2010/09/emacs-and-pyflakes-using-tmp-directory.html)。
这段代码直到昨天都运行良好。当我访问某些 Python 文件时,我收到以下错误:
switched OFF Flymake mode for buffer admin.py due to fatal status
CFGERR, warning Configuration error has occured while running
(pyflakes ../../../../../../../tmp/flymake28459SVv)
为什么flymake将看似错误的文件名传递给pyflakes?我希望它通过类似“/tmp/efe234234”的内容,并且我没有修改任何 tmp 目录设置。
我不记得最近为 Ubuntu 更新了 emacs,也想不出任何可能导致这混乱的东西(.emacs 文件是版本化的)。
我能想到的唯一问题是,这是一个高度嵌套的目录,符号链接到我的 ~/Dropbox 目录中的一个目录,但这不会发生在以类似方式链接的其他符号上。
我该如何解决这个问题?
更新
我已经进行了一些调试,现在我看到它没有将正确的路径作为参数传递。它需要在路径中再插入一个父目录才能使其正常工作,这让我认为它由于符号链接而变得混乱。
这是一个示例 shell 会话来说明我的意思。我正在从正确的相对目录执行此操作:
$ pyflakes ../../../../../tmp/flymake13382xHi
../../../../../tmp/flymake13382xHi: No such file or directory
那是 flymake 试图运行的命令。如果我改变它:
$ pyflakes ../../../../../../tmp/flymake13382xHi
我没有得到任何输出(如预期的那样)。注意路径中额外的“..”。
如何让 flymake 通过绝对路径而不是这些疯狂的相对路径?
更新 2
我已经得到了一切工作。基本上有这个功能:
(defun flymake-pyflakes-init ()
; Make sure it's not a remote buffer or flymake would not work
(when (not (subsetp (list (current-buffer)) (tramp-list-remote-buffers)))
(let* ((temp-file (flymake-init-create-temp-buffer-copy
'flymake-create-temp-in-system-tempdir))
(local-file (file-relative-name
temp-file
(file-name-directory buffer-file-name))))
(list "pyflakes" (list temp-file)))))
在最后一部分中,我不得不将参数更改为list
from local-file
to,temp-file
因为这local-file
是我不想要的疯狂相对路径。为什么该片段的作者local-file
首先使用该片段?
谢谢,瑞安