dired の RET を同じバッファでディレクトリを開くように変更する

tabbar.el を使うと dired バッファでディレクトリを開くと
dired バッファがタブに増えて困るので何とかした。


dired で RET はもともと dired-find-file にマップされていて、
ディレクトリを開くと新しいバッファが開きます。
一方 a で開くと dired-find-alternate-file がマップされているため
ディレクトリを開いたバッファに開いた先のディレクトリが表示されます。


dired 時に RET で開くように使っていると、
この RET と a の挙動を入れ替えたいので下のように設定したらいい感じになりました。

;; dired-find-alternate-file の有効化
(put 'dired-find-alternate-file 'disabled nil)
;; RET 標準の dired-find-file では dired バッファが複数作られるので
;; dired-find-alternate-file を代わりに使う
(define-key dired-mode-map (kbd "RET") 'dired-find-alternate-file)
(define-key dired-mode-map (kbd "a") 'dired-find-file)


ただこうするとファイルを開いた場合もバッファを上書きして
dired バッファが消滅してしまいます。
ですのでファイルなら新しいバッファで、
ディレクトリなら同じバッファで開くように切り分けます。

;; ファイルなら別バッファで、ディレクトリなら同じバッファで開く
(defun dired-open-in-accordance-with-situation ()
  (interactive)
  (let ((file (dired-get-filename)))
    (if (file-directory-p file)
        (dired-find-alternate-file)
      (dired-find-file))))


これを使うと

;; dired-find-alternate-file の有効化
(put 'dired-find-alternate-file 'disabled nil)
;; RET 標準の dired-find-file では dired バッファが複数作られるので
;; dired-find-alternate-file を代わりに使う
(define-key dired-mode-map (kbd "RET") 'dired-open-in-accordance-with-situation)
(define-key dired-mode-map (kbd "a") 'dired-find-file)

のようにできていい感じになりました。


ついでに dired の移動のキーを足して
カーソルキーだけで行き来できるようにしています。

;; ディレクトリの移動キーを追加(wdired 中は無効)
(define-key dired-mode-map (kbd "<left>") 'dired-up-directory)
(define-key dired-mode-map (kbd "<right>") 'dired-open-in-accordance-with-situation)


これで tabbar.el を使っていても
タブバーが dired のバッファ名で埋め尽くされることはなさそうです。


ちなみに、初めて dired-find-alternate-file を使うと、
「今後も使いますか?」と聞かれます。
y すると init.el などに

(put 'dired-find-alternate-file 'disabled nil)

が自動追加されるので使ったことがある人はどこかに設定されているかもしれません。