cdeを改良

ターミナルの zsh と Emacs を風のように駆け抜ける! / マスタカの ChangeLog メモ


オリジナルでは ファイルに関連づいていないバッファ(diredバッファ等)で、
cdeしたとき default-directoryに移動していたんですが、default-directoryと
いうのが以前開いたファイルに設定されているケースがあったので、厳密に
今いるディレクトリにしてみた。あと .zshrcにいろいろ書くのもあれだったので
関数として切り出しました。

;; .emacs等設定ファイルに追加
;; Improve at 2013年 9月 14日
(defun elscreen-get-current-directory (buf)
  (with-current-buffer buf
    (aif (buffer-file-name)
        (file-name-directory it)
      default-directory)))

(defun non-elscreen-current-directory ()
  (let* ((bufsinfo (cadr (cadr (current-frame-configuration))))
         (bufname-list (assoc-default 'buffer-list bufsinfo)))
    (loop for buf in bufname-list
          for file = (or (buffer-file-name buf)
                         (with-current-buffer buf
                           (when (eq major-mode 'dired-mode)
                             dired-directory)))
          when (buffer-file-name buf)
          return (file-name-directory it))))


.zshrcは以下のような具合

function cde () {
    EMACS_CWD=`emacsclient -e "
      (if (featurep 'elscreen)
          (elscreen-current-directory)
        (non-elscreen-current-directory))" | sed 's/^"\(.*\)"$/\1/'`

    echo "chdir to $EMACS_CWD"
    cd "$EMACS_CWD"
}