DiredでAlt+↑のキーバインドを作る

Alt+上矢印で上の階層に行くキーバインドが欲しくなって探したらコードはあったのでキーバインドのコードを追加するだけでできた。

設定

25.3.5 フォルダを開く時, 新しいバッファを作成しない ― dired


これを.emacsファイルに貼り付ける。init-loaderがある人は30_init-dired.elとかに貼ってください。

(defun dired-my-advertised-find-file ()
  (interactive)
  (let ((kill-target (current-buffer))
        (check-file (dired-get-filename)))
    (funcall 'dired-advertised-find-file)
    (if (file-directory-p check-file)
        (kill-buffer kill-target))))

(defun dired-my-up-directory (&optional other-window)
  "Run dired on parent directory of current directory.
Find the parent directory either in this buffer or another buffer.
Creates a buffer if necessary."
  (interactive "P")
  (let* ((dir (dired-current-directory))
         (up (file-name-directory (directory-file-name dir))))
    (or (dired-goto-file (directory-file-name dir))
        ;; Only try dired-goto-subdir if buffer has more than one dir.
        (and (cdr dired-subdir-alist)
             (dired-goto-subdir up))
        (progn
          (if other-window
              (dired-other-window up)
            (progn
              (kill-buffer (current-buffer))
              (dired up))
          (dired-goto-file dir))))))

(define-key dired-mode-map "\C-m" 'dired-my-advertised-find-file)
(define-key dired-mode-map "^" 'dired-my-up-directory)

このコードに下の一行を追加するだけでいい。追加するのは最後がいいと思う。

(define-key dired-mode-map [M-up] 'dired-my-up-directory)

こうすればM+↑で上の階層にいける。

キーバインドの設定の際に

キーバインドの設定はkbdのあるなしで、書き方がいろいろあって困る。この際ざっと調べてみようと思ったので調べてみた。


find ./ -name '*.el' | xargs grep define-key > log.txt


こんなコマンドで再帰的に調べて抽出したら、elファイルからいろいろ例がたくさん出てくる。

kbd なし

間違い
(define-key dired-mode-map "[up]" 'dired-my-up-directory) ×
(define-key dired-mode-map <up> 'dired-my-up-directory) ×
(define-key dired-mode-map "C-<up>" 'dired-my-up-directory) ×
(define-key dired-mode-map "<C-up>" 'dired-my-up-directory) ×
(define-key dired-mode-map "C-m" 'dired-my-up-directory) ×

正解
(define-key dired-mode-map "k" 'dired-my-up-directory) ○
(define-key dired-mode-map [up] 'dired-my-up-directory) ○
(define-key dired-mode-map [C-up] 'dired-my-up-directory) ○
(define-key dired-mode-map [C-M-up] 'dired-my-up-directory) ○
(define-key dired-mode-map "\C-m" 'dired-my-up-directory) ○</pre><br />

kbd あり

間違い
(define-key dired-mode-map (kbd k) 'dired-my-up-directory) ×
(define-key dired-mode-map (kbd [up]) 'dired-my-up-directory) ×

正解
(define-key dired-mode-map (kbd "h") 'dired-my-up-directory) ○
(define-key dired-mode-map (kbd "C-h") 'dired-my-up-directory) ○
(define-key dired-mode-map (kbd "\C-h") 'dired-my-up-directory) ○
(define-key dired-mode-map (kbd "<up>") 'dired-my-up-directory) ○
(define-key dired-mode-map (kbd "C-x C-e") 'dired-my-up-directory) ○
(define-key dired-mode-map (kbd "C-<up>") 'dired-my-up-directory) ○

ざっと調べてこんな感じになった。
この結果を見ると、kbdなしの場合は

kbdなし
ダブルクォートで囲む
C(Ctrl)とかM(Alt)に、バックスラッシュをつける(の中は除く)
<>は使えない
上矢印とかの特殊なキーはで囲む
Ctrl+上矢印とかする場合、[C-up]とする


kbdありの場合は

kbdあり
基本ダブルクォーテーションで囲む
バックスラッシュは気にしなくても大丈夫みたい。
<>は使える
上矢印とかの特殊なキーは<>で囲む
Ctrl+上矢印とする場合、"C-"とする


こんな感じになった。


htmlの練習にもなったのでよかったと思う。ブログでtableを使ってまとめるとかなり見栄えは良くなると思う。けれど毎回やるのは時間がかかるけどどうしたものか。yasnippetとかでかなり時間は短縮できてはいるけど。


今回書いていると、livedoorの投稿画面のエディタの挙動変わっていた。htmlエディタが改行を置換してくれなくなったのでちょっと困った。これは旧画面で書くしかないのか...。

参考サイト

25.3.5 フォルダを開く時, 新しいバッファを作成しない ― dired

Emacs で改行を検索したり置換したり

あるディレクトリ以下を再帰的に grep する方法

<table> - テーブル(表)

M. キーボードマクロ (2004/01/12)