マイ.emacs探訪

Emacs Advent Calendar jp: 2009 : ATNDの参加記事。すいません、私なんかがトリなんです。昨日はshugoさん。最初はk1LoWさんでした。)
みなさん。メリークリスマス。こんな暇な日は自分の.emacsを見ながらニヤニヤすることにしましょう。

emacsでメモ

clmemo

emacsのメモはclmemoを愛用しています。
clmemoはプログラマお馴染みのChageLogの書式を使ってメモを取るelispです。

(autoload 'clmemo "clmemo" "ChangeLog memo mode." t)
(setq clmemo-file-name "~/memo/clmemo.txt")
(global-set-key "\C-xM" 'clmemo)

重要なメモはココに集結させています。
clmemoが便利なのは、メモを取る先が一つのテキストファイルであることです。
そのため、まーなんやかんや扱いやすいです(バックアップとか検索とか色々)。

open-junk-file

書き捨てのメモにはid:rubikitchさん作のopen-junk-fileを使っています。

emacsで検索

lgrep, rgrep

.emacsには書いてないけど、毎日使ってると思います。
lgrepは現在選択しているバッファが格納されているディレクトリ内の全ファイルを対象としたgrep
rgrepは指定したディレクトリの下のファイルを再帰的にgrep
どちらも以下のコマンドで使えます。

M-x lgrep
M-x rgrep
gitでgrep

gitを使い始めて感動したのが git grep です。あれ速いですね。
もちろんこれもemacsで使えるようにしてます。
工夫した点として.gitディレクトリがある所からgit grepするようにしています。
(git grepしたいときはアプリの全体を調べたい時だったりするので)
ささっと検索するときに超便利。

;; 現在のバッファ位置から上方の指定したファイルを見つける
(defun find-file-upward (name &optional dir)
  (setq dir (file-name-as-directory (or dir default-directory)))
  (cond
   ((string= dir (directory-file-name dir))
    nil)
   ((file-exists-p (expand-file-name name dir))
    (expand-file-name name dir))
   (t
    (find-file-upward name (expand-file-name ".." dir)))))

;; gitで管理しているディレクトリのルートから git grep する
(defun git-root-grep ()
  (interactive)
  (let (
        (git-dir (concat (find-file-upward ".git") "/../"))
        (cmd "git --no-pager grep -n ")
        (origin-default-directory default-directory)
        )
    (setq default-directory git-dir)
    (setq cmd 
          (read-string "run git root grep (like this) : " cmd))
    (compilation-start cmd 'grep-mode
                       `(lambda (name) 
                          (format "*git-root-grep@%s*" ,git-dir)))
    (setq default-directory origin-default-directory)))
grep-edit.el

grep-edit.elはgrep-modeで編集ができちゃう優れものツールです。
複数のファイルにまたがる特定の文字列を置換したい!」とか言うときに便利。
このelispはかなりの頻度で使ってます。
前述のlgrep、rgrep、git grepでも自然と使えるので超便利。
導入にはid:rubikitchさんの記事をどうぞ。

その他

iswitchでバッファの内容がチラ見できる

iswitchで切り替えてるときに選択しているバッファの内容をチラ見できます。
名前だけだとどんなファイルかわからないので、地味に便利。
http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=iswitchb-exhibit

(defadvice iswitchb-exhibit
  (after
   iswitchb-exhibit-with-display-buffer
   activate)
  "選択している buffer を window に表示してみる。"
  (when (and
         (eq iswitchb-method iswitchb-default-method)
         iswitchb-matches)
    (select-window
     (get-buffer-window (cadr (buffer-list))))
    (let ((iswitchb-method 'samewindow))
      (iswitchb-visit-buffer
       (get-buffer (car iswitchb-matches))))
    (select-window (minibuffer-window))))
uniquify

違うディレクトリの同じ名前のファイルを開くと、どっちがどっちかわからなくなりますよね。
そんなときにはuniquifyが役に立ちます。
http://nlp.kuee.kyoto-u.ac.jp/~shibata/mt/archives/000116.html

前方単語削除
;; カーソル位置の後ろが空白文字、改行の場合は空白、改行削除
;; でなければ単語削除
(defun backward-kill-word-or-backward-delete-char-untabify (arg)
  (interactive "p")
  (let ((pos (point)))
    (if (or (= (char-syntax (char-after (- pos 1))) 62)
            (= (char-syntax (char-after (- pos 1))) 32))
        (backward-delete-char-untabify arg)
      (backward-kill-word arg))))
(setq backward-delete-char-untabify-method 'hungry)
分割したバッファ間の移動

大きなディスプレイでEmacsを開くとウィンドウを4分割したりしますね。
そんなとき、C-x oで移動していては時間の無駄です。
私はC-F, C-B, C-N, C-Pでそれぞれのバッファに移動できるようにしています。
C-Fだったら左のバッファ、C-Bだったら右のバッファという具合。

(setq windmove-wrap-around t)
(define-key global-map [(C shift n)] 'windmove-down)
(define-key global-map [(C shift p)] 'windmove-up)
(define-key global-map [(C shift b)] 'windmove-left)
(define-key global-map [(C shift f)] 'windmove-right)

emacsなblog

私は新しいelispを導入するとき.emacsに以下のようにメモしています。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Emacsでテキスト翻訳する
;; http://d.hatena.ne.jp/khiker/20070503/emacs_text_translator
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'text-translator)

特に「どこから拝借したものか」という記録が重要ですね。
新しいものが出てたりするし、そもそもどういうものか忘れてしまうんですよね…。
 
では、最後にとってもお世話になっているサイトのURLを.emacsから拾って羅列します。
.emacsに登場した順に羅列)