Hatena::ブログ(Diary)

mooz deceives you

(about 'mooz) ; => "See http://mooz.github.com/index-ja.html"

 | 

December 07 (Mon), 2009

dired で色々なソートタイプを切り替える elisp

ワンキーで dired のソートタイプを切り替える

みなさん dired と共に良き Emacs ライフをお送りのことかと思います。

この dired では s (dired-sort-toggle-or-edit) を押すことにより「ファイルの変更日時順」と「名前順」、二種類のソートタイプを切り替えることができるのですが、正直これだけじゃ物足りません。やっぱりファイルサイズとか、拡張子別でソートがしたくなります。

以前 最近知った dired の便利な機能 - mooz deceives you で書いたとおり、 C-u s というように前置引数をつけて dired-sort-toggle-or-edit を呼ぶことで、様々なソートタイプを選択することが可能となっています。

ということで、ファイルサイズ順にソートしたければ C-u s としてから -lS と打ち込んで Enter を押せば良いわけですが、これでは面倒ですね。それほどキータイプ数も多くないように見えますが、案外面倒なんです。何より ls のオプションを覚えていなければいけないのがネックです。

そこで、このあたりの負担を軽減してくれるような elisp を書きました。この elisp により、 dired モードに次のようなキーバインドが追加されます。

s色々なソートタイプを順に切り替え
canything を利用してソートタイプを選択

ソースコードはこのエントリの最後に掲載してあります。

使用例

まず dired を普通に開きます。ここで s を押すと「サイズ順」のソートへ切り替わります。

f:id:mooz:20091206224306p:image

もう一度 s を押せば今度は「拡張子順」です。

f:id:mooz:20091206224307p:image

されに s を押せば「バージョン順」となります。

f:id:mooz:20091206224836p:image


こんな風に dired-various-sort-type へ設定したペアを順々に切り替えていくことが可能です。

はじめからどのソートがしたいか決まっている場合は c を使います。

dired で c を入力すると、次のようにして anything インタフェースでソートタイプが選択できるので、お目当てのものを選んで Enter を入力すれば、そのソートタイプが反映されます。

f:id:mooz:20091206224856p:image


そんなこんなで dired を使う機会がさらに増えそうです。

ソースコード

興味のある方は以下のコードを .emacs などの初期化ファイルへ張り付けてみてください。

(defvar dired-various-sort-type
  '(("S" . "size")
    ("X" . "extension")
    ("v" . "version")
    ("t" . "date")
    (""  . "name")))

(defun dired-various-sort-change (sort-type-alist &optional prior-pair)
  (when (eq major-mode 'dired-mode)
    (let* (case-fold-search
           get-next
           (options
            (mapconcat 'car sort-type-alist ""))
           (opt-desc-pair
            (or prior-pair
                (catch 'found
                  (dolist (pair sort-type-alist)
                    (when get-next
                      (throw 'found pair))
                    (setq get-next (string-match (car pair) dired-actual-switches)))
                  (car sort-type-alist)))))
      (setq dired-actual-switches
            (concat "-l" (dired-replace-in-string (concat "[l" options "-]")
                                                  ""
                                                  dired-actual-switches)
                    (car opt-desc-pair)))
      (setq mode-name
            (concat "Dired by " (cdr opt-desc-pair)))
      (force-mode-line-update)
      (revert-buffer))))

(defun dired-various-sort-change-or-edit (&optional arg)
  "Hehe"
  (interactive "P")
  (when dired-sort-inhibit
    (error "Cannot sort this dired buffer"))
  (if arg
      (dired-sort-other
       (read-string "ls switches (must contain -l): " dired-actual-switches))
    (dired-various-sort-change dired-various-sort-type)))

(defvar anything-c-source-dired-various-sort
  '((name . "Dired various sort type")
    (candidates . (lambda ()
                    (mapcar (lambda (x)
                              (cons (concat (cdr x) " (" (car x) ")") x))
                            dired-various-sort-type)))
    (action . (("Set sort type" . (lambda (candidate)
                                    (dired-various-sort-change dired-various-sort-type candidate)))))
    ))

(add-hook 'dired-mode-hook
          '(lambda ()
             (define-key dired-mode-map "s" 'dired-various-sort-change-or-edit)
             (define-key dired-mode-map "c"
               '(lambda ()
                  (interactive)
                  (anything '(anything-c-source-dired-various-sort))))
             ))

キーバインドやソートのタイプはお好みで。

おまけ

以下のような設定をしておくと、サイズ表示が 69913580 から 67M といったようにちょっと分かりやすくなり幸せに。

(setq dired-listing-switches "-alh")
トラックバック - http://d.hatena.ne.jp/mooz/20091207/p1
 |