【问题标题】:Open the same file with emacs from two user accounts从两个用户帐户使用 emacs 打开同一个文件
【发布时间】:2026-02-02 02:45:01
【问题描述】:

我的 Mac 上有两个用户帐户。 我想用 emacs 在两个帐户上打开相同的文本文件。 我可以将文件放在两个用户都具有读写权限的目录中。

当我向一个进程添加文本时,我希望它自动显示在另一个缓冲区中,反之亦然。

我尝试过结合使用 auto-save-mode 和 auto-revert-mode 来尝试自动保存自动还原,但这似乎不太正确。

是否有一些正常的方法可以用 emacs 做到这一点?

【问题讨论】:

  • 您是否暗示您有两个用户在一台计算机(例如服务器)上同时登录,并且您希望两个用户能够同时查看同一个文件并在其中更新每个站的实时?您能否详细说明您的双重登录是如何设置的。

标签: emacs


【解决方案1】:

我认为您应该了解协作编辑。在 emacs wiki 上有一个关于它的页面 link

【讨论】:

    【解决方案2】:

    不是一个完整的答案。只是一些想法。尽管如此,这是作为答案制定的,因为我想用 elisp 代码对其进行补充,并可能在以后对其进行改进。这对于 cmets 是不可能的。

    我假设您实际上是在两个帐户中使用两个 emacsen。此外,我认为auto-revert-buffer 的问题在于时间,即auto-revert-buffer 可以用于轮询而不是按需。

    如果您想按需更新,您必须将两个 emacsen 都设置为服务器,并让它们能够进行双向通信。

    您可以通过emacsclient 使用-e 选项而不是ssh 来执行类似的操作。

    如果您在专用网络中,您也可以让 emacs 服务器直接通信。 我对emacsclient 和默认服务器设置作为套接字没有运气,因为emacsclient 检查套接字的所有权。 (注:首先我使用emacsclient进行测试,之后验证了两个emacsen之间也可以通信。)

    但下面的代码显示了 emacs 服务器通过 tcp/ip 通信的可能性。

    两个 emacsen 都应该将它们的服务器文件放在同一个目录中。自然,您需要以不同的方式命名服务器。然后就可以通过命令server-eval-at进行通信了。

    请注意,这些内容与安全相关,只能在安全的专用网络上使用。

    下面的 elisp 代码不像一个包,而更像是一个有用命令的集合。 不过,在一台服务器上,您可以按原样使用这些命令。另一方面,您需要进行一些小的修改。例如:更改server-name

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; Communication over tcp:
    
    (setq server-use-tcp t)
    
    (setq server-auth-dir "/tmp/eserv/")
    
    (if (file-directory-p server-auth-dir)
        (progn
          (unless (file-accessible-directory-p server-auth-dir)
        (error "Cannot access server-auth-dir"))
          (unless (file-writable-p  server-auth-dir)
        (error "Cannot write to server-auth-dir"))
          )
    
      (mkdir server-auth-dir t)
    
      (unless (shell-command (concat "chgrp users \"" server-auth-dir "\""))
        (error "Cannot change group of server file directory to users."))
    
      (chmod server-auth-dir (file-modes-symbolic-to-number "g+xr" (file-modes server-auth-dir))))
    
    ;; 
    (defadvice server-ensure-safe-dir (around unsafe activate)
      "We are on a private network and do not fear intrusion.
    Furthermore, the directory is already set up.
    This is a SECURITY HOLE if you do not know what you are doing!"
      (let ((dir (ad-get-arg 0)))
      (unless (file-exists-p dir)
        (error "File %s does not exist." dir))
      (unless (file-directory-p dir)
        (error "File %s is not a directory." dir))))
    
    (server-force-delete)
    (server-start)
    
    (defvar server-file nil
      "Full name of server file.")
    (setq server-file (concat server-auth-dir server-name))
    
    (unless (shell-command (concat "chgrp users \"" server-file "\""))
      (error "Cannot change group of server file to users."))
    
    (chmod server-file (file-modes-symbolic-to-number "g+r" (file-modes server-file)))
    

    后来,我发现两个 emacsen 也可以通过 socket 进行通信。只需绕过安全性并软链接 auth 目录中的服务器套接字。

    所以,你可以选择。

    【讨论】: