そこで、シェルのディレクトリショートカットについてこの質問をしました。/home/Documents/foo
たとえば、でファイルを開くことができるようにしたいという考えですC-x C-f ~foo/file
。
それで、emacsバッファでzshの「名前付きディレクトリ」をエミュレートする方法はありますか?
ちなみに、使用したいショートカットの定義は既に.zshrcにあります。直接読み取るソリューションがある場合は、ボーナスポイントを獲得できます。
そこで、シェルのディレクトリショートカットについてこの質問をしました。/home/Documents/foo
たとえば、でファイルを開くことができるようにしたいという考えですC-x C-f ~foo/file
。
それで、emacsバッファでzshの「名前付きディレクトリ」をエミュレートする方法はありますか?
ちなみに、使用したいショートカットの定義は既に.zshrcにあります。直接読み取るソリューションがある場合は、ボーナスポイントを獲得できます。
回答:
~
ファイル名の展開を担当するEmacsコンポーネントはexpand-file-name
です。残念ながら、それはCで書かれており、その腸の奥深くに~
あるのはユーザー名であると想定するコードです。幸い、Emacsには関数のラッパーを追加する一般的な方法があるので、組み込み関数のロジックの一部を繰り返すことを気にしない場合は、好きなことができます。
以下に、完全にテストされていないコードをいくつか示します。詳細については、Emacs Lispマニュアルの「Advising Emacs Lisp Functions」を参照してください。基本的な考え方はdefadvice
、の実際のコードの前に実行するコードを追加することですexpand-file-name
。私が必然的に行った間違いをコメントで知らせてください(それらを修正する方法を知っているかどうかにかかわらず)。
(defvar expand-file-name-custom-tilde-alist
'(("foo" . "/home/Documents/foo")))
(defadvice expand-file-name (before expand-file-name-custom-tilde
(name &optional default-directory)
activate compile)
"User-defined expansions for ~NAME in file names."
(save-match-data
(when (string-match "\\`\\(\\(.*/\\)?~\\([^:/]+\\)\\)/" name)
(let ((replacement (assoc (match-string 3 name) expand-file-name-custom-tilde-alist)))
(when replacement
(setq name (replace-match (cdr replacement) t t name 1)))))))
私は中にショートカットを解析残しておきます.zshrc
埋めるためにexpand-file-name-custom-tilde-alist
練習として(または任意のテクニックあなたが同期して別名を維持するために選択します)。
(defun my/add-to-tilde-alist (hash) (let* ((tilde:dir (split-string hash "=")) (tilde (car tilde:dir)) (dir (cadr tilde:dir))) (push (cons tilde dir) expand-file-name-custom-tilde-alist))) (mapc #'my/add-to-tilde-alist (split-string (with-output-to-string (call-process "zsh" nil standard-output nil "-ic" "hash -d")) "\n" t))
ミニバッファーでは$foo
なく単に使用~foo
してください。Emacsはfoo
環境変数の名前として扱い、その値を使用します。