Previous ToC Next

2. エディタで楽をしよう、ということ。(2009/6/8-6/17)

vi とか他のエディタは良く知らないので、以下は emacs の話。それも基本的な ものに限る。これは、私があまりいろんなことを知っているわけではないから である。

2.1. 消去と挿入

複数の行からなるエリアを消すのに、バックスペースや DEL キーを延々押 し続けるのはよろしくない。

という程度は知っているべき。このどちらの場合にも、Ctrl-y で復活できる、 というのも知っているべき。また、 Ctrl-y の直後に ESC-y で、以前に消し た(あるいは ESC-w で取り込んだ)ものに置き換えることができる、というの も知っているべき。

2.2. 繰り返しとマクロ

エディタにおいても、繰り返し操作が発生することはある。プログラムはそも そもなるべくそういうことがないように書いてあるべきだが、例えば設定ファ イルで

   10.10.0.1 grape001
   10.10.0.2 grape002
   10.10.0.3 grape003
   ....
と延々と続くファイルがあり、これを

   10.10.0.1 grape001  grape001.cfca.nao.ac.jp
   ....
と FQDN もいれたくなったとしよう。まあ、これだと正規表現を使った置換で 一発でできるが、以下のような編集操作を繰り返すのでもできる。

  該当行に移動
  先頭に移動
  インクリメンタルサーチで gra... 辺りまで移動
  gの位置の前まで戻る
  ctrl-k で行の後ろまでをヤンク、直後に ctrl-y で復活
  スペースの後もう一度 ctrl-y, その後 .cfca.nao.ac.jp をタイプ
  次の行の先頭に移動
コマンド列としては以下のようになる

   "\C-sgra\C-b\C-b\C-b\C-k\C-y \C-y.cfca.nao.ac.jp\C-n\C-a"
これを何度も繰り返すのは阿呆だが、一度これを実行してから繰り返し実行す るのは 「一連のキー操作をそのまま記録する」というキーボードマクロの機能 で容易に行うことができる。これには、 Ctrl-X ( でキーボードマクロ定義モー ドにはいり、その後に上のコマンド入力をしたあとに Ctrl-X ) でマクロ定義 を終了する。そうすると、Ctrl-X e で同じコマンド列を再実行できる。さらに、 ESC n Ctrl-X e (ここで n は数字。例えば 30回なら ESC 30 Ctrl-X e ) で、 指定した回数実行できる。これで、定義ファイルが1000行とかあってもマクロ で全部一度に変更できる。

ここでも、問題は編集操作自体にかかる時間自体ではない。繰り返し操作を人間 が行うと必ず間違えるので、計算機に繰り返しを任せることでそのような間違 いを防げることがより重要である。

なお、ここでさらに重要なことは、楽をするために必要なのは知識ではなく、 楽をしよう、そのためのは楽をする方法を調べよう、という意志である、とい うことである。

上の 1000行ある(かどうか知らないけど)設定ファイルを編集する時に、

    マクロとかよい方法があるかもしれないけど、今は急いでいるから。タイ
    プしたって数分で終わるんだから、マクロとか勉強するよりこっちが速い。
というような理屈で、手作業で 1000 行編集するような方法を正当化し、実際 にやってしまう人、というのが世の中には結構いる。このような思考パターン には以下のような問題がある。

つまり、「急いだ」ために実際には自分の仕事の効率を何桁も下げているわけ である。本来優秀な人であっても、こういう瑣末なことで生産性を何桁も下げ ていては研究も進まない、ということになってしまう。

2.3. パラグラフ整形、インデント

Emacs でテキストファイルを書く時に、パラグラフ整形、というのがある、と いうのは、結構知らない人がいるんだろうか? ESC-q (コマンド名は fill-paragraph) で、現在カーソルがあるパラグラフを、設定された 1行あたりの文字数 (必要なら ESC 数字 Ctrl-X f で変更可能)になるよ うに整形する。

例えば

   Emacs でテキストファイルを書く時に、パラグラフ整形、というのが ある、というのは、結構知らない人がいるんだろうか?
   ESC-q (コマンド名はfill-paragraph) で、現在カーソルがあるパラ
   グラフを、設定された1行あたりの文字数 (必要なら ESC 数字 Ctrl-X f で変更可能)になるように整形する。

   Emacs でテキストファイルを書く時に、パラグラフ整形、というのが
   ある、というのは、結構知らない人がいるんだろうか?ESC-q (コマン
   ド名はfill-paragraph) で、現在カーソルがあるパラグラフを、設定
   された1行あたりの文字数 (必要なら ESC 数字 Ctrl-X f で変更可能)に
   なるように整形する。
となる。エディタで文章を編集する時にはこっちのほうが読みやすいと 思う。また、 auto-fill-mode を設定しておけば(あるいは、普通の文書 用のメジャーモードをそうしておけば)、書いている時にも勝手に改行し てくれる。

プログラムを書く時にも同様の機能があり、言語と、それ用の設定を理 解して書いている時の自動インデントとか、領域の再インデントとかを する。コマンドは

    Ctrl-i (TAB): 現在の行をインデント
    Ctrl-META-\: indent-region, マークからカーソルまでをインデント
あたりが私が知っているものである。なお、もちろん、これは、Emacs がこうしたいと思うインデントになるので、それが自分のしたいものに なるようにするためには、例えば c-indent-level とかいった変数を設 定する必要がある。私の .emacs (Vine だと .emacs.my.el のような気 が)に20年以上前に書いた設定はこんな感じである。

  (setq text-mode-hook 'turn-on-auto-fill)
  (setq mail-mode-hook '(lambda () (auto-fill-mode 1)))
  (setq default-major-mode 'text-mode)
  
  ;; regulate indentation for new cc-mode.el
  (defun my-c-mode-common-hook ()
    (setq c-indent-level 4)
    (setq c-basic-offset 4)
    (c-set-offset 'case-label 4)
    (c-set-offset 'statement-case-intro 4)
    (c-set-offset 'statement-block-intro 4)
    (setq c-continued-statement-offset 4)
    (setq c-brace-offset 0)
    (setq c-argdecl-indent 4)
    (setq c-label-offset 0)
    )
  (add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
hook で設定する必要があるのか、初期設定だけでよいのか不明だが、 hook でしておいていけないことはないであろう。なんかいらない設定も いくつもあるような気もするし、現在(Emacs 20以降)だともっと簡単に 書ける気もする。
Previous ToC Next