入門GNU Emacsを読む

吉岡さんがこんなエントリをあげていて、ちょうど入門GNU Emacsを一通り読もうかと思っていたところなので、帰宅してから読みはじめた。

Emacsをまともに使いはじめたのは大学2年の冬だから、まだ2年たってないのかな?twitter用のメジャーモードがMeadowにとりこまれたり(放置気味)、fortress用のメジャーモードがSunのレポジトリにとりこまれたり(放置気味)と、elispプログラマとして入門レベルは超えたと思っているけれど、Emacsってまだまだ知らないことがいっぱいあるのよね。Emacsの基本を勉強しなおそう市民連合にはいることにする。

読書ログ。新しく発見したこと、目にとまったことをメモ書き程度に。

本にボールペンで書き込みしちゃったのでもう転売できないなぁw

はじめに (〜9:29)

さらりと。筆者pong好きアピールしすぎわろた。

1章 Emacs 入門(〜9:44)

ここもさらりと。

Emacsを使い始めて1日か2日もすると、いちいち「C-pは前の行という意味だ」などと考える必要はなくなり、自分の指が勝手に動くようになります。

嘘つけwwww

1.7.1 間違ったファイルを開いたら

C-x C-v (find-alternate-file) これは使えるかも。

2章 テキストの編集(〜10:21)

基本的なテキスト編集のおはなし。overwrite-modeは便利っぽいけどInsertキー遠いなぁ。クリップボードの話は、X環境無視っぽいので使えない。単語のupcaseとかそのあたりは使えるっちゃ使えるけど、デフォルトのキーバインドのセンスがあまり良くないように感じる。俺はupcase-backward-sexpというコマンドを作ってCを書くときに多用してる。

(defun upcase-backward-sexp ()
  (interactive)
  (let (start end)
    (setq end (point))
    (save-excursion
      (backward-sexp)
      (setq start (point)))
    (upcase-region start end)))

カーソル移動は文章単位ってプログラム書いてるとほとんどつかわないよね。単語単位の移動は便利かもしんないけど、C-fおしっぱなしを惰性でつかってる。もうちょっとサクっと移動できる方法を考えたいな。

.emacsにエラーがあったときの起動時のエラーメッセージが、M-pで再表示できるとあるけど、うちの設定だとM-pにはコマンドが割り当てられてないし、どのコマンドか書いてないのでようわからん。*Messages*バッファに移動すりゃいいだけですね。

3章 検索と置換(〜10:54)

単語検索と、インクリメンタルサーチ中の再帰編集は知らなかった。再帰編集は使えそうだ。C-r で再帰編集モードにはいって、C-M-cで抜ける。

インクリメンタルサーチ中のキーバインドは query-replace-map で変更できる。一覧が載ってるけど、全部覚える必要はなさそうだ。

C-x ESC ESC (repeat-complex-command) はかなり便利っぽい。Ispellはどーでもいーや。

休憩 (〜11:57)

4章 バッファとウィンドウおよびフレームの使用 (〜12:28)

バッファ関係はほぼ知ってることばかり。バッファリストは全然つかわないなぁ。Shellモードはバッファ名を変えれば複数シェルを起動できるというのが新発見。shell-mode-hookでどんどんrenameしていくように設定するといいかも。

(defun my-rename-buffer-with-pwd ()
  (let ((cur-buffername (buffer-name))
	(new-buffername (concat "*shell (" (pwd) ")*")))
    (unless (equal cur-buffername new-buffername)
      (rename-buffer new-buffername t))))

(defadvice comint-send-input (after rename-if-cd)
  (if (eq major-mode 'shell-mode)
      (my-rename-buffer-with-pwd)))
(ad-activate 'comint-send-input)

(add-hook 'shell-mode-hook
	  '(lambda ()
	     (my-rename-buffer-with-pwd)))

こんな感じ? *shell* を開いた時に、*shell (Directory /path/to/pwd)* という名前にバッファを自動でrenameしてくれる + cdしたときにディレクトリ名を自動で更新してくれる。これでしばらく試してみるか。

フレームは initial-frame-alistとdefault-frame-alistは知らなかった。これは設定しないと。

今日はここまで。