在Emacs中使用flymake和tramp远程运行pyflakes?
我正在尝试使用flymake来运行pyflakes,正如这里所建议的那样。
对于本地文件,这个方法运行得很好,稍微调整一下也能在远程文件上使用,但我遇到了一个问题,就是每次flymake/pyflakes运行时,它会“修改”缓冲区(虽然实际上似乎没有什么变化),这让它在实际使用中有点没用(比如,保存文件时会运行flymake,结果又立刻修改了缓冲区)。
这是我几乎让它工作的步骤:
- 在远程机器上安装了pyflakes。
- 调整了我的
tramp-remote-process-environment
变量,以便pyflakes能在其路径中找到。 - 使用了上面链接中的代码变体。显然,我排除了禁用远程缓冲区的检查。此外,
(when (load "flymake" t) ...)
这个结构似乎没有按我预期的那样工作,但我对此不太担心。 - 为了测试,我重新定义了
flymake-start-syntax-check-process
函数,让它使用start-file-process
(适用于tramp)而不是start-process
(不适用)。
第4步的修改在处理本地文件时似乎没有造成任何问题,但虽然现在flymake可以在远程文件上运行pyflakes(错误会如预期那样高亮显示),但每次flymake运行时,缓冲区都会被“修改”。
我猜start-file-process
在处理远程进程时,会产生一些额外的返回值/数据,而本地进程则没有。
有没有人能提供一些见解或建议?
- 在Ubuntu上使用Emacs 23.1和23.2
- Python 2.4.6
- Pyflakes 0.4.0(通过easy_install安装)
2 个回答
我在我的Flymake分支上解决了这个问题(https://github.com/illusori/emacs-flymake)。
这个解决方案可以通过Tramp在远程机器上运行语法检查,这样就不会出现你看到的缓冲区修改问题;或者你可以把flymake-run-in-place
设置为nil
,这样它就会像在普通的非Tramp缓冲区上一样,在本地机器上运行语法检查。
因为这个问题是在Flymake层面上解决的,所以这个修复适用于所有语言和语法检查,而不仅仅是pyflakes。
如果你对为什么会发生这个问题感兴趣,简单来说,当Tramp处理程序启动文件进程时,它会把连接的登录信息放到当前缓冲区的末尾,而在任何输出过滤器附加到进程之前。
通常,这会导致人们在文件末尾看到/etc/issue的内容,以及“你有邮件。”之类的信息。
在你的情况下,可能是登录信息为空或者只是一个换行符,所以你没有看到任何文本被添加,尽管它已经把缓冲区标记为被修改。
你需要告诉flymake在本地的某个地方创建它的缓冲区副本。我个人比较喜欢使用$TMP
目录,因为这样做也让我可以在没有写权限的目录中使用tramp来处理文件。
你可能想看看我修改过的flymake-python,因为它可以做到这些功能。