だから私は この質問 シェルのディレクトリショートカットについて尋ねました。たとえば、次のように入力して、/home/Documents/foo
でファイルを開くことができるようにしたいという考えです。 C-xC-f~foo/file
。
それで、emacsバッファでzshの「名前付きディレクトリ」をエミュレートする方法はありますか?
ちなみに、私が使用したいショートカット定義はすでに私の.zshrcにあります。それらを直接読み取るソリューションがあれば、ボーナスポイントを獲得できます。
ファイル名の~
を展開するEmacsコンポーネントはexpand-file-name
です。残念ながら、これはCで記述されており、その腸の奥深くには、~
の後に続くものがユーザー名であると想定するコードがあります。幸い、Emacsには関数のラッパーを追加する一般的な方法があるため、組み込み関数のロジックの一部を繰り返してもかまわない場合は、必要なことを実行できます。
完全にテストされていないコードをいくつか紹介します。詳細については、EmacsLISPマニュアルの「AdvisingEmacsLISPFunctions」を参照してください。基本的な考え方は、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
のショートカットを解析したままにしておきます。
ミニバッファで$foo
の代わりに~foo
を使用するだけです。 Emacsはfoo
を環境変数の名前として扱い、その値を使用します。