我可以让 Emacs 在编辑远程文件时保存本地副本吗?

我可以让 Emacs 在编辑远程文件时保存本地副本吗?

我知道我可以通过打开以下形式的文件路径通过 SSH 编辑远程文件/ssh:user@host:/path/to/file

但是,我现在正在 Linux VM 中开发内核模块。由于我的内核模块可能会损坏我的 VM(如果我犯了一个愚蠢的错误),所以我担心会丢失内核模块的远程源文件。

我希望 Emacs 保存我正在编辑的文件的本地副本,以确保如果我破坏了 VM*,我不会丢失我的最新工作。理想情况下,本地副本不会应用名称修改(即附加~到名称,就像 Emacs 通常对备份文件所做的那样)。

*是的,我正在使用源代码控制,但我不想对每个更改都进行提交和推送。我对内核模块黑客攻击还很陌生,所以我会进行大量小编辑,并在进行过程中对我的模块进行大量测试。不断提交和推送不成熟的更改远非理想。

有没有一种简单的方法可以让 Emacs 在编辑远程文件时保存文件的本地副本?我正在查看文档(远程文件自动保存文件备份文件单个或编号备份) 并且不知道该如何做。

答案1

我不太喜欢备份解决方案,因为它不仅仅取决于你。我所做的是在保存之前设置一个钩子,如果文件位于我想要专门处理的目录下,我会复制一份。

我在这里举一个简单的例子:

(defun my-copy-file ()
  (interactive)
  (cond ((equal "home.org" (file-name-nondirectory (buffer-file-name)))
         (write-region (point-min) (point-max)
                       (concat "~/org/" (file-name-nondirectory (buffer-file-name)))))))

(add-hook 'before-save-hook #'my-copy-file)

检查目录组件Emacs 文档。;您可以使用file-name-directory和变体。

这里你可能有一个简单的功能来将远程文件镜像到本地。但是你必须事先创建目录(尽管有一个代码存储库应该不是问题,除非它是一个新目录。)

;; /plink:[email protected]:/the/remote/path/finename.cc
(defun my-mirror-remote-file ()
  (interactive)
  ;; first search the at sign `@' in the buffer file name
  (let* ((file_name (buffer-file-name))
         (atpos (string-match "@" file_name)))
    ;; if there is an at sign in the file name, we assume it is a remote file
    (cond (atpos
       ;; we look for the second colon, which is after the host part
       ;; and we get the diretory and file name
       (let* ((hoston (substring file_name atpos))
              (colonpos (string-match ":" hoston)))
         ;; and we write the file locally (it will NOT create the dir though)
         (write-region (point-min) (point-max)
                       (concat "~" (substring hoston (+ colonpos 1)))))))))

答案2

shadowfile.el会帮你完成。不幸的是,它仍然存在于 ange-ftp 世界中。将它移植到 Tramp 中是我的待办事项清单,但我还没有完成。

答案3

我对 emacs 不太熟悉,但我能想到几种解决方案:

1) 在 NAS 文件夹中工作,该文件夹实际上是一个文件系统,不在您运行的机器上,而是一个 NFS 或 CIFS 共享。不确定考虑到您的 VM 问题,这是否能很好地工作

2)创建一个自定义宏,将文件保存在本地,然后调用 scp 命令将更改的文件推送到其他地方

3) 编辑运行虚拟机的计算机上的文件,并让其自动将所有更改推送到虚拟机。您可以在第二个终端窗口中运行如下命令

FILE=thenameofthefileIwanttoeditandsend
inotifywait -E CLOSE_WRITE $FILE && scp -p $FILE user@host:/target/folder/

以上内容适合一次性执行。你也可以创建一个无限循环:

FILE=thenameofthefileIwanttoeditandsend
while true; do inotifywait -E CLOSE_WRITE $FILE && scp -p $FILE user@host:/target/folder/; done

注意:这假设您配置无密码 ssh 密钥验证,因此 scp 不会提示输入凭据。

相关内容