web-dev-qa-db-ja.com

emacsバッファのディレクトリショートカット

だから私は この質問 シェルのディレクトリショートカットについて尋ねました。たとえば、次のように入力して、/home/Documents/fooでファイルを開くことができるようにしたいという考えです。 C-xC-f~foo/file

それで、emacsバッファでzshの「名前付きディレクトリ」をエミュレートする方法はありますか?

ちなみに、私が使用したいショートカット定義はすでに私の.zshrcにあります。それらを直接読み取るソリューションがあれば、ボーナスポイントを獲得できます。

8
Seamus

ファイル名の~を展開する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を環境変数の名前として扱い、その値を使用します。

4
Friedel