我知道我可以通过打开以下形式的文件路径通过 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 不会提示输入凭据。