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

17
我正在尝试使用flymake运行pyflakes,如这里所建议的那样。对于本地文件,这很好用,并且通过一些调整几乎可以处理远程文件,但是当flymake/pyflakes运行时会“修改”缓冲区(尽管似乎实际上没有任何更改),这使得它在实践中有点无用(例如,保存文件会运行flymake,然后flymake会立即再次修改缓冲区)。
以下是我做的事情:
1. 在远程主机上安装了pyflakes。 2. 自定义了我的`tramp-remote-process-environment`变量,以便在其PATH中找到pyflakes。 3. 使用了来自上面链接的代码变体。显然,我排除了禁用远程缓冲区的检查。此外,`(when (load "flymake" t) ...)`结构似乎不像我预期的那样工作,但我不太担心这个问题。 4. 重新定义了`flymake-start-syntax-check-process`函数(出于测试目的——如果这可以正常工作,则建议应该没有问题),使其使用`start-file-process`(适用于tramp)而不是`start-process`(不适用于tramp)。
第4步的更改似乎不会在处理本地文件时引起任何问题,但是虽然现在这使flymake能够为远程文件运行远程pyflakes(错误会如预期的那样被突出显示),但在这种情况下,每当flymake运行时缓冲区就会被“修改”。
我猜想,对于远程进程,`start-file-process`会产生一些额外的返回值/数据,而本地进程则没有。是否有人有任何见解/建议?
  • Ubuntu上的Emacs 23.1和23.2
  • Python 2.4.6
  • Pyflakes 0.4.0(通过easy_install安装)

只是一个提醒:在2014年,您可以使用elpa安装的标准flymake(我有版本0.4.16)包括flymake-run-in-place变量-只需将其自定义为nil,flymake将把文件存储在$TMP。 - gromgull
2个回答

9
你需要告诉flymake将它的缓冲区某个地方的副本存储在本地,我更喜欢使用$TMP目录,因为这也允许我在没有写权限的目录中使用tramp文件。
你可能想检查一下我的flymake-python分支,因为它可以完成所有这些操作。

1
听起来很有前途,但我现在不方便测试。Kingpin,请问是否有可接受的解决方案? - phils
你好,@Ross Patterson。我正在使用您修改过的flymake版本。它在没有.py扩展名的文件上存在问题(但是可以通过python-mode加载)。我通过一些帮助解决了这个问题,并且在本地Python文件上运行得非常好(包括有/没有.py扩展名);(https://dev59.com/wmzXa4cB1Zd3GeqPVZ37)然而,在通过ssh进行tramp时,它无法正常工作。本地缓冲区显示minibuffer上的flymake:0/2,而tramp缓冲区仅显示flymake。虽然打开了minor mode,但没有发生任何突出显示。您有任何想法吗?谢谢。 - Muhammet Can

6

我已经在 Flymake 的 fork 版本中修复了这个问题 (https://github.com/illusori/emacs-flymake)。

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

由于此修复针对 Flymake 级别,因此适用于所有语言和语法检查,而不仅限于 pyflakes。

如果您想了解发生这种情况的详细信息,基本上是当 start-file-process 的 Tramp 处理程序开始时,它会在任何输出过滤器连接到进程之前将连接的登录消息转储到当前缓冲区的末尾。

通常,这会表现为人们看到 /etc/issue 的内容与 "You have mail." 等一起出现在文件的末尾。

在您的情况下,可能是登录消息为空或只有一个新行,因此您没有看到任何文本被添加,即使它设置缓冲区为已修改状态。


谢谢您提供的信息。看起来您已经做了出色的一系列改进。 - phils

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