1

ある場所にファイルがあります:

location_a/doc.tex
location_a/doc.cls
...

シンボリックリンクを介して別のディレクトリでそれらに取り組みたい:

work_directory/doc.tex -> location_a/doc.tex
work_directory/doc.cls -> location_a/doc.cls
work_directory/doc.pdf
work_directory/doc.log
...

ただし、emacs doc.tex作業ディレクトリで実行して編集を行うと、emacsはにバックアップファイルを作成しますlocation_a/doc.tex~。ただし、バックアップファイルを作業ディレクトリに保存したいのですが。で作成された新しいファイルは必要ありませんlocation_a

どうすればemacsにそれをさせることができますか?

4

2 に答える 2

3

これは、などのバックアップファイル名構築機構を呼び出すbackup-bufferに、バッファファイル名のリンクを追跡することを要求するため、見た目よりも注意が必要です。その結果、Emacsでは、かなり複雑なコードであるを再定義する以外に、この動作をカスタマイズする方法がありません。make-backup-file-name-functionbackup-buffer

私が思いついた妥協案は、評価中backup-bufferに一時的に無効にする「アドバイス」をインストールすることです。これにより、バックアップファイルをシンボリックリンクが存在するディレクトリに配置できます。ただし、Emacsは元のシンボリックリンクの名前を変更してバックアップを作成し、!を指すシンボリックリンクのままにします。幸い、これはに設定することで簡単に防ぐことができます。file-chase-linksbackup-bufferwork_directory/doc.tex~location_a/doc.texbackup-by-copyingt

これがコードです。警告の言葉:それが機能することを確認しようとしましたが、必要なバックアップメカニズムへの上記の干渉のような望ましくない副作用がないことを保証することはできませんbackup-by-copying。ただし、問題なく動作する場合もあります。使用するときは注意してください。

(require 'cl)  ; for flet
(defadvice backup-buffer (around disable-chase-links)
  (flet ((file-chase-links (file) file))
    ad-do-it))
(ad-activate 'backup-buffer)
于 2012-09-04T21:34:54.493 に答える
1

楽しみのために、ディレクトリ変数に基づく、根本的に異なるアプローチについて説明しましょう。

つまり、以下を含むwork-directory/名前のファイルを配置します。.dir-locals.el

((nil . ((eval . (set (make-local-variable 'backup-directory-alist)
                      (list (cons "."
                                  (file-relative-name
                                   (file-name-directory (buffer-file-name))
                                   (file-name-directory (file-truename
                                                         (buffer-file-name)))))))))))

これが行うことはbackup-directory-alistwork-directory/. そのローカル バージョンは、バックアップ ファイルが 内に保持されていることを確認しますwork-directory

そのためには、次の 2 つのことが必要です。

  • '(("." . "path/to/work-directory/"))ローカル値のようなものを持つ
  • このパスが相対であることを確認してくださいlocation_a/

2 番目のポイントの理由は、他の場所で述べたように、backup-bufferシンボリック リンクが解決されると、実際のファイルの場所が の開始点になるためです。また、バックアップ ファイルの形状を変更せずに絶対パスを単純に配置することはできません (バックアップ ディレクトリの絶対パスの場合、バックアップ ファイル名は完全なパスをエンコードするため、衝突は発生しません)。

ノート:

  • 特定のローカル変数が に記録されていることを確認する必要がありますsafe-local-variable-values。これは一般的なフォームなので、1 回限りの作業です (最初に尋ねられたときに「!」を押すだけです)。
  • これは nil に設定されていることを前提find-file-visit-truenameとしていますが、そうでない場合はその質問をしないと思います:)

このアプローチの長所:

  • アドバイスは必要ありません(これは常に良いことです)
  • Emacsがディレクトリ変数をサポートしていると仮定しますが、適度に移植可能です
  • 必要な場所にのみ配置できる柔軟性を維持できます

アプローチの短所:

  • .dir-locals.elまあ、明らかに、いくつかの場所でそれをコピーする必要があるかもしれません

また、ワンショットのアプローチが必要な場合は、次のようにもっと簡単にすることができます。

((nil . ((backup-directory-alist (("." . "../path/to/work-directory"))))))

実際に相対名を自分で計算する場所は、一度限りです。

于 2012-09-08T11:30:56.873 に答える