打开文件的多个实例 -

时间:2013-05-14 07:23:39

标签: emacs

如何在Emacs中打开多个不同的文件实例?也就是说,实例完全相互独立,但写入同一文件。

我实际上希望在一个缓冲区中引用原始文件并与我将在编辑原始内容时编辑的缓冲区并排。我没有找到打开临时缓冲区,将整个原始内容放入其中并将其并排放置,作为一种优雅的解决方案。

欢迎其他解决方案。

我尝试过使用clone-indirect-buffer C-x C-v ,但它没有达到目的。

4 个答案:

答案 0 :(得分:3)

您可以创建一个新缓冲区( Cx b *new*)并使用 Cx 将文件内容插入其中 filename

答案 1 :(得分:2)

在我阅读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,在这种情况下,他们不会知道彼此访问同一个文件,因此会发生这种情况。

我可以理解上面的内容不是一个很好的选择,但看起来添加这种功能需要一些时间来理解它首先被明确预防的原因。

我试过这个:

米 - : (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>所示,如果您需要更多副本,则需要更改它。

答案 2 :(得分:2)

如上所述,您可能可以使用clone-buffer,但是您必须在buffer-file-name周围调用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的行为类似。

答案 3 :(得分: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)))))