2010年9月4日土曜日

Emacs仕事術(4) ファイラーを使う


このエントリーをはてなブックマークに追加


Emacsには標準で dired というファイラーが付属している。起動方法は C-x d でディレクトリを指定する。

この dired はUNIX系OSで使うには便利だが、Windowsの場合いろいろ不備があるので、エクスプローラーで作業した方が効率良い場合もあるので、用途によって使い分ける。

特に、wdiredを使った、ディレクトリの一括操作とgrep&findは便利すぎるので使い方を覚えておくと良い。
;; ---------------------------------------------
;; dired 関連
;; ---------------------------------------------

; http://uenox.ld.infoseek.co.jp/elisp/uenox-dired.el
;  Dired に以下の3つの機能が追加されます。(キーマップはこのファイルの
;  最後の方を書き換えることで変更できます。)
;   * C-j 
;     現在の行のファイルをWindowsに関連付けられたアプリケーションを使っ
;     て開きます。(わざわざエクスプローラーを開かなくて良くなります。)
;   * w
;     現在の行のファイル名をUNIX形式にてコピーします。
;   * W
;     現在の行のファイル名をDOS形式にてコピーします。
(load "uenox-dired")


; ディレクトリに対して再帰的なコピー/削除を行う
(setq dired-recursive-copies 'always)
(setq dired-recursive-deletes 'always)


; lisp のみで find-dired を実行する
;  http://groups.google.com/group/gnu.emacs.sources/msg/80bf4b334396c098?pli=1
;   よりソースをコピーして、findr.el として保存する。
;  http://www.bookshelf.jp/elc/find-dired-lisp.el
;   M-x find-dired-lisp        ファイル名に対して検索実行
;   M-x find-grep-dired-lisp   ファイル内容に対して検索実行
(autoload 'find-dired-lisp
  "find-dired-lisp" "findr" t nil)
(autoload 'find-grep-dired-lisp
  "find-dired-lisp" "findr" t nil)

; ディレクトリを先に表示する
(setq ls-lisp-dirs-first t)

; ファイルの一括操作
;  http://www.emacswiki.org/elisp/wdired.el
;    dired で r を押して編集開始。
;      C-s で確定、C-c C-k で破棄
;      l:ファイル名を小文字にする
;      c:ファイル名の一文字を大文字にする
;      u:ファイル名を大文字にする
(require 'wdired)
(define-key dired-mode-map "r" 'wdired-change-to-wdired-mode)

; マークつきのファイルを印刷(白黒)
(defun dired-ps-print-files ()
  (interactive)
  (let ((files-to-print (dired-get-marked-files)))
    (while (setq file (car files-to-print))
      (setq files-to-print (cdr files-to-print))
      (find-file file)
      (ps-print-buffer)
      (kill-buffer nil))))

; マークつきのファイルを印刷(カラー)
(defun dired-ps-print-files-with-face ()
  (interactive)
  (let ((files-to-print (dired-get-marked-files)))
    (while (setq file (car files-to-print))
      (setq files-to-print (cdr files-to-print))
      (find-file file)
      (ps-print-buffer-with-faces)
      (kill-buffer nil))))

; SPC キーでマークをトグルする
(define-key dired-mode-map " " 'dired-toggle-mark)
(defun dired-toggle-mark (arg)
  "Toggle the current (or next ARG) files."
  ;; S.Namba Sat Aug 10 12:20:36 1996
  (interactive "P")
  (let ((dired-marker-char
         (if (save-excursion (beginning-of-line)
                             (looking-at " "))
             dired-marker-char ?\040)))
    (dired-mark arg)
    (dired-previous-line 1)))

; マークしたファイルを C-t C-z で zip 圧縮
; 日本語ファイルは化けるので補助的に使用すること
; 参考 http://d.hatena.ne.jp/khiker/20070207/emacs_dired
(defun dired-marked-files-zipping (arg)
  "zipping files that marked on dired"
  (interactive "P")
  (let ((files (dired-get-marked-files t current-prefix-arg))
        (output-filename (let ((string (read-string "OUTPUT FILENAME: ")))
                           ;; 拡張子を入力してなかったら, それを付加する.
                           (if (or (string-match "\\(\\.zip\\)$" string)
                                   (string= "" string))
                               string
                             (concat string ".zip")))))
    (or (if (string= "" output-filename)
            ;; 出力ファイル名が入力されていなかったらエラーとする.
            (progn
              (message "ERROR: Output filename is empty.")
              t))
        (if (string-match "/" output-filename)
            ;; UNIX では, ファイル名に / は使えない.
            (progn
              (message "ERROR: The / cannot be used for the filename with UNIX.")
              t))
        (if (member output-filename (directory-files default-directory))
            ;; 出力ファイル名と同じ名前のファイルが, 既にあった場合, 上書きするか問い合わせる.
            (not (y-or-n-p (concat "file " output-filename " exists. overwrite the file ?"))))
        (if arg
            ;; 実際に圧縮をする.
            (dired-do-shell-command (concat "zip -r " output-filename " *") nil files)
          (dired-do-shell-command (concat "zip -r " output-filename " *") nil files)))))
(define-key dired-mode-map "\C-c\C-z" 'dired-marked-files-zipping)


; windows ショートカットを有効にする
; http://www.emacswiki.org/emacs/w32-symlinks.el
; ntemacs だと使えないぽい
;(setq w32-symlinks-handle-shortcuts t)
;(require 'w32-symlinks)


GNU Emacs Pocket Reference[洋書]

GNU Emacs Pocket Reference[洋書]

価格:1,260円(税込、送料別)