如何在 Emacs 中打开多个不同的文件实例?也就是说,实例之间完全独立,但写入同一个文件。
实际上,我希望在一个缓冲区中引用原始文件,并在引用原始内容时在其中进行编辑。我没有发现打开临时缓冲区,将整个原始内容拉入其中并并排放置,作为一种优雅的解决方案。
也欢迎其他解决方案。
我试过使用clone-indirect-buffer
,C-x C-v但它没有达到目的。
如何在 Emacs 中打开多个不同的文件实例?也就是说,实例之间完全独立,但写入同一个文件。
实际上,我希望在一个缓冲区中引用原始文件,并在引用原始内容时在其中进行编辑。我没有发现打开临时缓冲区,将整个原始内容拉入其中并并排放置,作为一种优雅的解决方案。
也欢迎其他解决方案。
我试过使用clone-indirect-buffer
,C-x C-v但它没有达到目的。
您可以创建一个新缓冲区 ( C-xb*new*
) 并将文件的内容插入到其中C-xifilename
。
如前所述,您可能可以使用clone-buffer
,尽管您必须buffer-file-name
在调用周围进行 let-bind ,clone-buffer
否则将拒绝克隆它。另一种选择是:
M-x set-visited-file-name RET toto RET
C-x C-f thefile RET
C-x b RET
M-x set-visited-file-name RET thefile RET
最后一个set-visited-file-name
应该问你是否真的想这样做,但你可以回答你这样做,Emacs 会接受你的选择。可以说,clone-buffer
不应该拒绝这样做,所以你可能想提交一个错误报告,要求它的行为类似于做什么set-visited-file-name
。
当我阅读find-file
代码时,我看到了这个警告代码:
"The file %s is already visited normally.
You have asked to visit it literally,
meaning no coding system decoding, format conversion, or local variables.
But Emacs can only visit a file in one way at a time.
Do you want to revisit the file literally now? "
这意味着 Emacs 的代码特别试图防止多次访问同一个文件但缓冲区彼此不同步的情况。但是...您可以打开两个 Emacs 副本,在这种情况下,他们不会知道彼此访问同一个文件,因此会允许这种情况发生。
我可以理解上述不是一个很好的选择,但看起来添加这种功能需要一些时间来了解它背后的原因,首先要特别阻止它。
我试过这个:
M-:(switch-to-buffer (find-file-noselect-1 (create-file-buffer (buffer-file-name)) (buffer-file-name) t nil (buffer-file-name) 1))
似乎它会起作用,但我不确定后果 - 也许不同的主要模式可能依赖于原始 Emacs 对文件的处理及其编辑历史,因此请谨慎使用。最后一个数字1
是要显示在文件名之后的数字,如Foo.bar<1>
因此,如果您需要更多副本,则需要更改它。
clone-buffer
根据您的模式,您可能会有一些运气。它有一些限制,您可以在文档中阅读。
否则,这里有一些快速而肮脏的东西:
(defun dodgy-clone-buffer ()
"Clone the current buffer. The clone will write to the original file."
(interactive)
(switch-to-buffer-other-window
(eval `(with-current-buffer
;; Create a new buffer or clear an existing one.
(get-buffer-create ,(format "*clone: %s*" (buffer-name)))
(delete-region (point-min) (point-max))
(insert ,(buffer-string))
(setq buffer-file-name ,(buffer-file-name))
(funcall ',major-mode)
(current-buffer)))))