Emacs协作缓冲区以错误的模式打开

4
我正在使用Emacs和Rudel与远程程序员合作。 Rudel有一个已发布缓冲区的概念。 当我的合作伙伴发布缓冲区时,我可以订阅它,然后我们都可以同时编辑它。
我的问题是,当他发布一个扩展名为*.py的Python文件并且我订阅它时,我的缓冲区不会自动设置为python-mode(而是处于基本模式)。 我该如何使缓冲区以正确的语言模式打开?

有点跑题,但你是怎么设置好的?有什么好的教程吗?(我从来没有成功地使rudel正常工作) - unhammer
我记不清楚了,但 Rudel 的设置并不简单,而且我从未完全让它正常工作。即使它能够工作,我的和我的合作者的缓冲区也经常在工作一小时后失去同步。我放弃使用 Rudel。现在,我更喜欢使用 tmux 或 GNU Screen 来共享运行 Emacs 的文本终端。缺点是这种方法只允许一个人输入。在我看来,这样更好,因为它迫使你进行更多的协作。 - hekevintran
这是我现在使用的,是 tmux 和 emacs multi-tty。但是我们可以同时打字(使用这种方法 http://www.emacswiki.org/emacs/tmux_for_collaborative_editing ),但我认为 isearch 等功能会有点混乱... - unhammer
2个回答

3

我不太了解Rudel,无法给出100%的解决方案,但你想要做的事情应该是这样的:

(add-hook 'rudel-document-attach-hook 'my-rudel-set-mode-appropriately)
(defun my-rudel-set-mode-appropriately (document buffer)
  "try to set the mode appropriately"
  (set-buffer buffer)
  (let ((buffer-file-name ...get-name-from-document...))
    (set-auto-mode)))

只需要将代码中的...get-name-from-document...部分替换为一个能够求出你想要的文件名的表达式,例如,如果缓冲区被命名为myfile.py,那么你可以将其改为(buffer-name)。但是,如果缓冲区有奇怪的名称,也许你需要从文档对象中提取名称(Rudel内部使用文档对象来表示你要共享的内容)。所以,如果(buffer-name)不起作用,你可以尝试(rudel-suggested-buffer-name document)
即尝试上面的代码,但使用以下其中一行:
  (let ((buffer-file-name (buffer-name)))

并且

  (let ((buffer-file-name (rudel-suggested-buffer-name document)))

set-auto-mode 命令将使用 buffer-file-name 的值,通过 Emacs 通用机制 来确定主模式。


你能澄清一下你所说的“(rudel-suggested-buffer-name document)”是什么意思吗?我对于“...get-name-from-document...”部分感到困惑。 - hekevintran
@hekevintran,我扩展了答案,请告诉我是否有帮助。 - Trey Jackson

0

我对rudel的工作原理一无所知。不过,你尝试过在文本文件中明确设置模式吗?试着在文件的第一行添加类似这样的内容:

# -*- mode: python; fill-column: 75; comment-column: 50; -*-

在文件的开头放置这样一行代码将会导致emacs忽略文件的扩展名并以给定模式打开。

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