dired上でvimっぽい感じでカーソル移動がしたくなった

J,Kでサブディレクトリにカーソル移動するのが便利。lがdiredのredrawと被っているのだけれどとりあえずディレクトリ上以外のときにはredrawすることにした(良い方針ではないかも)。

(defun my:dired-setup ()
  (define-many-keys dired-mode-map
    `(
      ("[" . dired-up-directory) ;; ^
      ("]" . my:dired-do-redisplay-or-down-directory)
      ("h" . dired-up-directory) ;; ^
      ("l" . my:dired-do-redisplay-or-down-directory)
      ("j" . dired-next-line)
      ("k" . dired-previous-line)
      ("J" . dired-next-dirline) ;; >
      ("K" . dired-prev-dirline) ;; <
      ))
  )

(defun my:dired-do-redisplay-or-down-directory ()
  (interactive)
  (let ((fpath (dired-get-file-for-visit)))
    (cond ((file-directory-p fpath) (call-interactively 'dired-find-file))
          (t (call-interactively 'dired-do-redisplay)))
    )
  )
(add-hook 'dired-mode-hook 'my:dired-setup)

ここで define-many-keys は手軽にキーバインドを設定するためのヘルパー関数。

(defun define-many-keys (key-map key-table)
  (loop for (key . cmd) in key-table
        do (define-key key-map (read-kbd-macro key) cmd)))