Oh! Can Not Diary

おきゃんなダイアリー

diredを攻めよう(Emacs Advent Calendar jp: 2010)

こんばんは。これはEmacs Advent Calendar jp: 2010 : ATNDの16日目の記事です。
昨日はid:nekopさんのEmacsでJavaを書く - nekopの日記でした。明日は深町さんです。

id:tomoyaさんにお願いされたネタはちょっと間に合わなかったので…これだけでもEmacsを使う価値はあると言っても過言ではないくらいわたしの大好きなdiredについてのTipsをちょこっと書いてみようと思います。

wdired × dired

文字通り、wdiredとdiredは攻受の関係にあります。wdiredの攻めっぷりはいまや紹介するまでもないくらい有名なのですが、外せないので一応簡単に。

置換と組合わせ

wdiredを使うとdiredでのリネームが簡単になります。置換もできるようになるので、拡張子の変更なども一瞬です。またcua-modeによる連番機能も組み合わせると便利です。
参考: Emacs で wdired と moccur-edit を使っていない人は(ry - Higepon’s blog - Mona OS and Mosh
参考: cua-mode - ぺっくブログミラー@peccul

hoge.el → ../hoge.el

こういう書き方もできます。

日付編集は無理!!

会社の人に紹介したら聞かれました…さすがにwdiredでも時空は越えられません。

マークをつけたファイルをまとめて開く

diredではカーソル位置のファイル、またはマークをつけたファイル等に対してコマンドを実行します。ただデフォルトではマークをつけたファイルをまとめて開くコマンドが用意されていません。なぜだ!ということで、以下の設定をしておきます。キーバインドは"F"(ふつうに開く)と"V"(viewモードで開く)に割り当てています。

;; diredでマークをつけたファイルを開く
(eval-after-load "dired"
  '(progn
     (define-key dired-mode-map (kbd "F") 'my-dired-find-marked-files)
     (defun my-dired-find-marked-files (&optional arg)
       "Open each of the marked files, or the file under the point, or when prefix arg, the next N files "
       (interactive "P")
       (let* ((fn-list (dired-get-marked-files nil arg)))
         (mapc 'find-file fn-list)))))

;; diredでマークをつけたファイルをviewモードで開く
(eval-after-load "dired"
  '(progn
     (define-key dired-mode-map (kbd "V") 'my-dired-view-marked-files)
     (defun my-dired-view-marked-files (&optional arg)
       "Open each of the marked files, or the file under the point, or when prefix arg, the next N files "
       (interactive "P")
       (let* ((fn-list (dired-get-marked-files nil arg)))
         (mapc 'view-file fn-list)))))

viewモードでまとめて開けば、q,q,q...として抜けられるので、設定ファイルをちょっと確認したい時に便利です。ちなみにviewモードで開いて閉じるとバッファが残りません。

参考:API Only - Stack Exchange

dired-x

dired-xはEmacs標準でついてくるelispです。.emacsに以下の行を追加します。

;; dired-x
(require 'dired-x)

C-x C-jでカレントバッファのディレクトリに移動できたり(SKK使いの人はキーバインドを変更する必要があるかもしれませんが)、*.で.elと入力すれば拡張子が.elファイルにマークをつけられたりします。

問題は、dired-xでもマークをつけたファイルを開くコマンドが用意されているということです。ただdired-xで定義されている方はウインドウを上下に分割してしまいます。2つくらいならいいのですが、3つ4つとなるとうっとうしい。それともうひとつ、"V"には、dired-do-run-mailというコマンドが割り当てられています。
これを解決するためフックを使って、"C-f"で分割して開くように、mailの方は使わないので無効にします。

;; dired-x
(require 'dired-x)
(add-hook 'dired-load-hook
          (lambda ()
            (dired-mode-map (kbd "V") 'my-dired-view-marking-files)
	    (dired-mode-map (kbd "C-f") 'dired-do-find-marked-files)))

まとめ

以上、diredのTipsでした。しょぼい記事ですみません。。
まぁdiredは基本機能だけでもとても奥が深いので、普段あまり使わないという人はまずdired-modeで bとか mしてみるといいと思います。そしてあの手この手で攻めてあげてください。
ではでは。