2011-03-20

Emacs 22 から Emacs 23 への変更点

GNU Emacs 23.1 は 2009年7月にリリースされましたが、2011年3月 GNU Emacs 23.3 がリリースされたのを機に、重い腰を上げ 22 から移行することにしました。

今さら感がありますが、 22.3 から 23.3 への移行の個人的なメモです。
追加・変更されたメジャーモードについては量が多いので省略しました。

詳しくは C-h n で表示される NEWS に全て書いてあります。


リージョン (選択範囲) 関連

transient-mark-mode
マイナーモード。デフォルトで t になった。
shift-select-mode
マイナーモード。デフォルトで t 。シフト押しながらカーソル移動で範囲選択。
set-mark-default-inactive
変数。デフォルトで nil。 t ならば C-@ 2回で範囲をハイライト。 Emacs 22 では t の挙動がデフォルトだったが、 23 ではその挙動を変える変数として用意された。
select-active-regions
変数。デフォルトで nil 。 t ならば範囲選択するだけでキルリングにコピー。
use-empty-active-region
変数。デフォルトで nil 。 t ならば範囲に対して実行するコマンドが、空の範囲に対しても実行されるようになる。
use-region-p
関数。範囲指定済みなら t を返す。空の範囲の場合は use-empty-active-region の値に依存。
region-active-p
関数。範囲指定済みなら t を返す。
(interactive "^")
interactive で ^ を指定できるようになった。 shift-select-mode が non-nil の場合、関数 handle-shift-selection を呼ぶ。
^ が使われている C-M-f (forward-sexp) を例にすると、以下の4パターンで範囲の変化の仕方に違いが出る。
  • 範囲を選択してから C-M-f (範囲を拡大する)
  • 範囲を選択してから shift + C-M-f (範囲の開始位置を変更)
  • shift + カーソルで範囲を選択してから C-M-f (範囲を無効にする)
  • shift + カーソルで範囲を選択してから shift + C-M-f (範囲を拡大する)
C-@ C-@
2回で、 Mark, Deactivate mark の繰り返し
範囲選択してからTAB
indent-region

ヘルプ関連

help-window-select
変数。デフォルトで 'other。 'always (t) ならば *Help* 表示時に常にウィンドウを選択する。
help-downcase-arguments
変数。デフォルトで nil。 t ならば *Help* の引数を以前と同じ小文字表記にする。
help-go-forward
コマンド。 [back] で戻った時に [forward] で進む。
This variable is potentially risky when used as a file local variable.
ファイルローカル変数として危険かどうかを表示するようになった。
ファイルローカル変数とはファイルの1行目の -*- 変数: 値 -*- や、最後の Local Variables: 等のこと。
This variable was introduced, or its default value was changed, in version 23.1 of Emacs.
変数が追加・変更された Emacs のバージョンを表示するようになった。
これは defcustom で :version プロパティを追加した変数のみ有効。
例:
(defcustom select-active-regions nil
  "If non-nil, an active region automatically sets the primary selection."
  :type 'boolean
  :group 'killing
  :version "23.1")
;; 現在読み込み済の (intern された) シンボルで、 defcustom が :version
;; プロパティを付加したものを列挙する。下の例では 23 から始まるものだけを抽出。
(let (symbols version)
  (mapatoms
   (lambda (x)
     (setq version (get x 'custom-version))
     (when (and version
                (string-match "^23" version))
       (setq symbols (cons x symbols)))))
  (insert (mapconcat 'symbol-name (sort symbols 'string<) "\n")))

Dired 関連

M-s f C-s
dired-isearch-filenames
M-s f C-M-s
dired-isearch-filenames-regexp
M-s a C-s
dired-do-isearch. buffer-menu や ibuffer でも似た挙動。
M-s a C-M-s
dired-do-isearch-regexp. buffer-menu や ibuffer でも似た挙動。
C-x C-q
wdired
その他
Dired からシェルコマンドを実行 (!, &) する時に、候補 (guess) を M-n で選ぶようになった。

追加されたマイナーモード

goto-address-mode
デフォルトでオフ。バッファの URL をボタン化する。
minibuffer-depth-indicate-mode
デフォルトでオフ。 minibuffer の深度を表示する。 enable-recursive-minibuffers が non-nil の場合のみ有効。
visual-line-mode, global-visual-line-mode
デフォルトでオフ。 C-a, C-e が見た目の行で実行される。オンにした時、フリンジの矢印を消さずに元のままにする場合は、変数 visual-line-fringe-indicators の値を '(left-curly-arrow right-curly-arrow) にする。
whitespace-mode, global-whitespace-mode
デフォルトでオフ。タブやスペースの視覚化等。以前のものを一新したらしい。

コマンド

M-s o
occur
M-s w
isearch-forward-word
M-s h f
hi-lock-find-patterns
M-s h l
highlight-lines-matching-regexp
M-s h p
highlight-phrase
M-s h r
highlight-regexp
M-s h u
unhighlight-regexp
M-s h w
hi-lock-write-interactive-patterns
isearch 中に M-s o
occur に切り替える。
minibuffer で isearch
履歴を検索する (minibuf-isearch.el みたいなもの)。
completion-at-point (M-TAB)
カーソル位置の単語を補完。
C-l, M-r
連打で middle, top, bottom と変化するようになった。 変数 recenter-positions で順番を指定。
async-shell-command (M-&)
非同期(バックグラウンド)でシェルコマンドを実行。 M-! で末尾に & を付加したものと同じ。
zrgrep
再帰的に gzip ファイルの中身を grep。
emacs-uptime
Emacsの稼働時間を返す。
emacs-init-time
Emacsの起動にかかった時間を返す。
display-time-world
世界の時刻を表示。
butterfly
バタフライ効果でHDDにビットを立てる。 http://xkcd.com/378/

変数 (ユーザーオプション)

line-move-visual
デフォルトで t。C-n, C-p が見た目の行で実行される。
word-wrap
デフォルトで nil。t ならば単語単位で折り返しをする。スペース区切りなので日本語ではあまり効果がない。
initial-buffer-choice
デフォルトで nil。Emacs 起動時のバッファを指定。
user-emacs-directory
デフォルトは ~/.emacs.d/
yank-pop-change-selection
デフォルトで nil。 t ならば yank-pop した時に他アプリのコピーバッファを同期させる。
save-interprogram-paste-before-kill
デフォルトで nil。 t ならば yank だけでなく kill した時にも他アプリのコピーバッファを kill-ring に保存する。
kill-do-not-save-duplicates
デフォルトで nil。 t ならば同じ文字列を連続でコピーした場合、重複を保存しない。
tab-always-indent
デフォルトで t。 complete を指定できるようになった。
completions-format
デフォルトで nil。 vertical ならば *Completions* の並び方が縦に。

Elisp 関連

内部コード
utf-8-emacs に変更。
display-buffer
コマンド。 split-window-preferred-function を使うようになった。
split-window-preferred-function
変数。デフォルトで split-window-sensibly 。
split-height-threshold
変数。デフォルトで 80。nil またはフレームの高さがこの値より小さい場合、 split-window-sensibly は上下分割しない。
split-width-threshold
変数。デフォルトで 160。nil またはフレームの幅がこの値より小さい場合、 split-window-sensibly は左右分割しない。
read-shell-command
関数。ミニバッファで外部プログラムを読み取る。補完が効く。 M-!, M-&, M-| や、Dired の !, & 等で補完が効くようになったのも、この関数のおかげ。
process-lines
関数。外部プログラムを実行し、出力の一行ずつをリストにして返す。
initial-environment
変数。環境変数の初期値。
check-coding-systems-region
関数。文字列または範囲の文字コードをチェック。