1

Emacsでファイルの複数の異なるインスタンスを開くにはどうすればよいですか? つまり、インスタンスは互いに完全に独立していますが、同じファイルに書き込みます。

実際には、元のコンテンツを参照しながら編集するバッファーと並んで、1 つのバッファー内の元のファイルへの参照が必要です。エレガントな解決策として、一時バッファを開き、元のコンテンツ全体をそこにヤンクして並べて表示する方法は見つかりません。

他のソリューションも同様に歓迎されます。

clone-indirect-bufferandを使用してみC-x C-vましたが、目的を果たせません。

4

4 に答える 4

2

前述のように、を使用できる可能性がありますが、呼び出しclone-bufferを let-bind する必要があります。そうしないと、複製が拒否されるためです。別のオプションは次のとおりです。buffer-file-nameclone-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します。

于 2013-05-16T17:23:18.053 に答える
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 の 2 つのコピーを開くことができます。その場合、お互いが同じファイルにアクセスしていることを認識できないため、このような状況が発生する可能性があります。

上記があまり良いオプションではないことは理解できますが、そのような機能を追加するには、そもそもそれが具体的に防止されている理由を理解するのに時間がかかるようです.

私はこれを試しました:

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>したがって、さらにコピーが必要な場合は、それを変更する必要があります。

于 2013-05-14T08:26:16.743 に答える
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)))))
于 2013-05-14T08:14:19.893 に答える