2013-03-13 19 views
34

/home/.bashrcにあるシンボリックリンクは、実際の.bashrcファイルを指しています。/some/other/path/.bashrcはgitリポジトリの下にあります。私は、実際のファイルを編集したいので、私は通常、yを入力Emacsとシンボリックリンク

Symbolic link to Git-controlled source file; follow link? (y or n) 

:私はEmacsで/home/.bashrcを開いた場合

は、それが私を求められます。しかし、後で、私がbuffer-file-nameの場合、を返し、/home/.bashrcを返しません)。

私はEmacsにを覚えておいてください。は、このファイルにアクセスする方法がシンボリックリンクを介していることを覚えています。

つまり、シンボリックリンクをEmacsに透過的にしたいと思います。理由の一部は、現在のファイルのパスに依存するいくつかのEmacsマクロがあり、/some/other/pathにあり、/home/にないファイルで作業していると考えられるためです。

どうすればいいですか?

答えて

38

それは

Symbolic link to Git-controlled source file; follow link? (y or n) 

タイプnで求められます。シンボリックリンクをたどり、シンボリックリンクが指し示すファイルを直接開くのではなく、必要に応じてシンボリックリンク自体を使用します。

警告:これにより、emacsのバージョン管理機能が宛先のリポジトリを検出し、対話することができなくなります(存在する場合)。

デフォルトの動作を変更する場合は、vc-follow-symlinksカスタマイズ変数のドキュメントをご覧ください。 (C-h v vc-follow-symlinks

+1

「いいえ」と答えてリンクを介してファイルを編集すると、git statusはファイルが変更されたことを正しく示し、正しいdiffを表示します。これは "バージョン管理システムをバイパスする"ものですか? – raychi

+2

これはEmacsのVCサポートが利用できないことを意味します:状態やバージョン、利用可能なアクション/ショートカットなどの特定の情報 –

30

ただ、完全性について、疑問について

Symbolic link to Git-controlled source file; follow link? (y or n)

を持っているが、必ずしもOPが望んでいるものを望んでいない人のために、これは私のEmacsのバージョンのようC-h v vc-follow-symlinksからのドキュメントは(あります - 詳細については、自分のEmacsを参照してください):

vc-follow-symlinksは、vc-hooks.elで定義される変数です。 その値はask

ドキュメント: バージョン管理下のファイルへのシンボリックリンクを訪問した場合の対処方法。 リンクを介してそのようなファイルを編集すると、バージョンコントロールシステム がバイパスされます。これは危険で、おそらくあなたが望むものではありません。

この変数がtの場合、VCはリンクをたどり、実際のファイル を訪問し、エコー領域でそれを伝えます。それが `ask 'の場合、VCは の確認をリンクに従うべきかどうか確認します。 nilの場合、リンクは になり、警告が表示されます。

この変数はカスタマイズできます。

結末があなたの.emacsセットのいずれか

(setq vc-follow-symlinks t) 

常にシンボリックリンクをたどる(直接「実際の」ファイルを編集)するために、または

にすることができ、それぞれの時間を求めるメッセージが表示されるのを避けるために、つまり
(setq vc-follow-symlinks nil) 

symlink自体にあるかのようにファイルを編集する(これは正常に動作するようですが、シンボリックリンクなどは削除されませんが、ファイル上でバージョンコントロール関連のものを使用することはできません)。 )。私は前者を好む(OPと違って)。

4

質問しないでホットキーを使用して特定のファイルのみにアクセスしたい場合は、ファイル内のすべてのシンボリックリンクを解決するfile-truename関数を使用することができます。他のすべてのデフォルト。

(global-set-key (kbd "<f7>") (lambda() (interactive) 
    (find-file (file-truename user-init-file)))) 
+0

なぜ 'let'-bind' find-file-visit-truename'をバインドしないのですか? –

+0

''((find-file-visit-truename t))(find-file user-init-file)を ''(let?まあ3つの理由。まず、elispの動的スコープ規則を使用します(私はその機能が気に入らないので、できるならそれを避けたい)。 ''(find-file(file-truename user-init-file)) ''は少なくともletバインドと同じくらい簡単です。最後に、私は '' find-file-sisit-truename''について知りませんでした。 – Arne

+0

これらはすべて完全に合理的な理由です。しかし、私はあなたがダイナミックスコープを避けなければならないとは思わない。このようなユースケースは、動的スコープが有効である理由です。ちなみに、たとえレキシカルスコープを有効にしても、宣言された変数は引き続き動的スコープになります。そのため、ダイナミックスコープの利点を最大限生かすことができます。 –

3

あなたが知っているか、単に完全にvcだけでなく、シンボリックリンクをたどるについては、この迷惑なメッセージを無効に

(setq vc-handled-backends nil) 

が行う、Emacsのvcパッケージを気にしない場合。

次に、ファイルがシンボリックリンクをたどるかどうかに応じて、find-file-visit-truenameをカスタマイズすることをお勧めします。

関連する問題