在Emacs中使用flymake和tramp远程运行pyflakes?

17 投票
2 回答
1894 浏览
提问于 2025-04-16 00:36

我正在尝试使用flymake来运行pyflakes,正如这里所建议的那样。

对于本地文件,这个方法运行得很好,稍微调整一下也能在远程文件上使用,但我遇到了一个问题,就是每次flymake/pyflakes运行时,它会“修改”缓冲区(虽然实际上似乎没有什么变化),这让它在实际使用中有点没用(比如,保存文件时会运行flymake,结果又立刻修改了缓冲区)。

这是我几乎让它工作的步骤:

  1. 在远程机器上安装了pyflakes。
  2. 调整了我的tramp-remote-process-environment变量,以便pyflakes能在其路径中找到。
  3. 使用了上面链接中的代码变体。显然,我排除了禁用远程缓冲区的检查。此外,(when (load "flymake" t) ...)这个结构似乎没有按我预期的那样工作,但我对此不太担心。
  4. 为了测试,我重新定义了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 个回答

6

我在我的Flymake分支上解决了这个问题(https://github.com/illusori/emacs-flymake)。

这个解决方案可以通过Tramp在远程机器上运行语法检查,这样就不会出现你看到的缓冲区修改问题;或者你可以把flymake-run-in-place设置为nil,这样它就会像在普通的非Tramp缓冲区上一样,在本地机器上运行语法检查。

因为这个问题是在Flymake层面上解决的,所以这个修复适用于所有语言和语法检查,而不仅仅是pyflakes。

如果你对为什么会发生这个问题感兴趣,简单来说,当Tramp处理程序启动文件进程时,它会把连接的登录信息放到当前缓冲区的末尾,而在任何输出过滤器附加到进程之前。

通常,这会导致人们在文件末尾看到/etc/issue的内容,以及“你有邮件。”之类的信息。

在你的情况下,可能是登录信息为空或者只是一个换行符,所以你没有看到任何文本被添加,尽管它已经把缓冲区标记为被修改。

9

你需要告诉flymake在本地的某个地方创建它的缓冲区副本。我个人比较喜欢使用$TMP目录,因为这样做让我可以在没有写权限的目录中使用tramp来处理文件。

你可能想看看我修改过的flymake-python,因为它可以做到这些功能。

撰写回答