Thursday, April 9, 2009

redo in Emacs

こういう記事っていつまで経っても読めると嬉しい。大歓迎。続きが楽しみです。

Emacs は学習曲線がなかなか落ち着かないエディタだと思う。かなり基本的な編集機能においても、使っている日々に新しい発見があったりする。Emacs Lisp を読んだり書いたり、様々なモードを使いはじめたりしたら、それこそもう天井が見える気がしない。初めて UNIX で Emacs に触れてから #x10 年くらいを経てもなお、です。ま、学習の方法が間違っていた可能性は否定しないけど。

Editors - The Random Musings of Maulkin
classical learning curves for some common editors

この曲線はネタですけど、他のエディタはともかく、Emacs については特徴を良くあらわしてるなぁと思う。

最近気づいて、調べてみて「へ~」と思ったのは、Emacs の redo 機能(編集を「やり直す」)について。

超入門の記事にもあるように、Emacs では編集を「元に戻す」とき、C-_ をタイプしてアンドゥ undo します。

標準のキーバインディングでは C-_ だけでなく、C-/ または C-x u または M-x undo RET またはもちろんメニューから Edit → Undo でもまったく同一の undo です。

歴史的経緯か、端末の機能によらず使えるようにするためか、はたまた何か他の理由でかは知りませんが、現在はどれも同じ undo です。

入門 GNU Emacs 第3版の訳注では C-/ の使用をオススメしているように読めます。いちばんキー数が少ないですからね。

ぼくは当初 C-x u を使っていて、その後、C-_ を使うようになりました。実際のキーストロークは Ctrl + Shift + - で、意識的にタイプするには十分な「面倒さ」を備えた組み合わせだと思います。Windows の標準的なエディットコントロールで Ctrl + Z や ESC を押して編集を失ないイラッとした経験のある人には、この微妙な言い回しが分かってもらえるかと…。

繰り返し C-_ すれば、次々と編集を元に戻していきます。で、戻し過ぎて、「あ!ここまで戻すつもりじゃなかった!」となったときに肝心の redo 機能です。

redo というのは本質的には「undo で元に戻したその編集を、さらに undo する」ことなので、Emacs は特別には redo 関数を用意していません。Emacs では undo を使って redo します。ややこし…。
こう書くと面倒ですが、実際にはぜんぜんそんなことはなくって「さっきの undo はナシにして!」という意思を Emacs が汲み取ってくれます。Emacs はユーザが直前に何をしたのか?を調べて undo なのか redo なのかを判別するわけです。

C-_ で undo して「あ!」となったときには、落ち着いて C-g C-_ すれば redo になります。落ち着かずに慌てて C-g C-_ しても redo になります。

Emacs を使っていると、なにか間違ったことをしたときに C-g しちゃうクセがつきますから、すごく直感的ですよね。:)

simple.el の undo 関数まわりを読んでみると「へ~」ってなると思います。別に C-g じゃなくっても構わなかったりしますし。

追記@Mon Jul 05 10:18:54 2010

"redo emacs" を検索してこのページを開いたあなたがお探しの redo は、おそらく redo.el や undo-tree.el などでしょう。

Emacs 標準の undo に理解を深めることが目的でなければ、便利な elisp の導入をお薦めします。

1 comment:

  1. redoの考え方についてとても勉強になりました。
    ありがとうございました。

    ReplyDelete