■ Emacs 全般で利用できる設定 (MinGW版 Emacs は対象外。一部、Cygwin版 Emacs 特有の設定を含む。)


【お知らせ】


<2017/11/05 追記>
常にシンボリックリンクを辿る設定にすれば良い場合は、次の設定をお試しください。
(setq-default find-file-visit-truename t)

【本題】


dired で fキー や oキー を使ってファイル(ディレクトリを含む)を開く際に universal-argument(C-u)を付けてからキーを押すと、そのファイルを実体のパス(シンボリックリンクを含まないパス)で開くようにするための設定です。
(defun ad-dired-get-file-for-visit (return-value)
  (if current-prefix-arg
      (file-truename return-value)
    return-value))

(advice-add 'dired-get-file-for-visit :filter-return #'ad-dired-get-file-for-visit)

Cygwin版 Emacs(gnupack の場合、12.00 以降)を利用している場合は、上記の代わりに次の設定をお勧めします。こちらは上記の機能に加え、Windows 本来のパス(Cygwin のマウントポイントを反映しないパス)で開く機能を追加しています。"." ディレクトリ名に対して実行することで、カレントディレクトリに適用することもできます。
Windowsパス と UNCパス を使えるようにするための設定」を行っていることが前提となりますので、併せて設定してください。
(defun ad-dired-get-file-for-visit (return-value)
  (if current-prefix-arg
      (let ((true-file-name (file-truename return-value))
            (expand-file-name (expand-file-name return-value)))
        (if (string= true-file-name expand-file-name)
            (if (and (not (file-remote-p return-value))
                     (fboundp 'cygwin-convert-file-name-from-windows))
                (let* ((windows-file-name (cygwin-convert-file-name-to-windows return-value))
                       (cygwin-file-name (directory-file-name
                                          (cygwin-convert-file-name-from-windows windows-file-name))))
                  (if (string= cygwin-file-name expand-file-name)
                      (expand-file-name windows-file-name)
                    cygwin-file-name))
              return-value)
          true-file-name))
    return-value))

(advice-add 'dired-get-file-for-visit :filter-return #'ad-dired-get-file-for-visit)

上記の機能は新しいバッファを作成しますので、次のキーバインドの設定で簡単にバッファを削除しておけるようにすると便利です。
;; kill-bufferを実行する
(global-set-key (kbd "M-k") (lambda ()
                              (interactive)
                              (kill-buffer (buffer-name))))

なお、Cygwin では、CYGWIN環境変数 を winsymlinks:lnk に設定して ln -s コマンドでシンボリックリンクを作ると、Windows のショートカットとしても利用可能なシンボリックリンクを作成します。このようにして作成したシンボリックリンクは、Cygwin版 Emacs(gnupack の場合、12.00 以降)の dired からも利用可能です。お勧めの機能です。(gnupack-13.02、gnupack-13.03 では、CYGWIN環境変数 に winsymlinks:native が設定されています。startup_config.ini で設定を変更できます。gnupack-13.04 では、CYGWIN環境変数 の設定が winsymlinks:lnk に変更となりました。)
  if set to just winsymlinks or winsymlinks:lnk, Cygwin creates symlinks as Windows shortcuts with a special header and the R/O attribute set.

また、dired で other window にシンボリックリンクを作成する方法を次のページの最後の方(「(おまけ)」の部分)で紹介しています。併せてご利用ください。


<変更履歴>
  • 2015/06/20 このページを作成した。
  • 2015/07/11 Cygwin版 Emacs 用の設定で、「Cygwin のマウントポイントを反映したパス」と「Cygwin のマウントポイントを反映しないパス」を相互に行き来する機能を追加した。
  • 2015/09/09 advice を Emacs-24.4 以降の書式に見直した。
  • 2017/10/06 実体のパスの取得方法を変更した。(file-truename 関数を使うようにした。)


最終更新:2019年11月01日 12:39