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


8

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

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

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


おそらくこれはUNIX SEの質問ではないので、SUで運を試してみる必要がありますか?
シェイマス

この質問はunix固有ではありません(zshの部分までです:Windows用、または少なくともCygwin用のzshポートがあります)。SUにあるはずです。しかし、まあ、それは今ここにあるので、私はここで答えました。
Gilles「SO-邪悪なことをやめよ」

回答:


8

~ファイル名の展開を担当する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))
ミハエル

4

ミニバッファーでは$fooなく単に使用~fooしてください。Emacsはfoo環境変数の名前として扱い、その値を使用します。


なんてキラーな隠し機能!(注釈:それらを使用できるように変数をエクスポートします)
AdrieanKhisbe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.