konbu's blog

PHP/Ruby/Python あたりが仕事で使っている言語です。プログラミング、学習や教育ネタを書いていきます。

Emacs を覚える際に体に染み込ませた方がいいデフォルトキーバインド

Emacs を使う人でそれ Emacs じゃなくて良いじゃんって感じの使い方をする人がたまに居るんだけど、これは Emacs 以外のエディタでも同様で、単に機能盛り盛りの豪華なエディタが良いなら IDE の方がオススメだよって良いたくなる。

で、自分が Emacs (や vi など他のエディタでも) で大事にしているのは、エディタを通してテキスト (プログラム等色々) を書く時の体験。

今回はその体験の内の一部、キーバインドについて書いてみる。

そもそもキーバインドってなに

という意見もあると思う。 キーバインドとは、キー (キーボードのキーの事) にバインド (束縛の事) されている機能実行を指す。

ショートカットキーみたいな物。 で、Emacs には基本的にこのキーバインドを扱ってエディタを操作するため、キーバインドを覚えないなら Emacs は単なる Lisp 実行機になってしまう。

上下左右などの移動のためのカーソル操作や kill - yank 等はわざわざ説明する内容でも無いので省く (もし矢印キーで操作してたり、範囲選択してツールバーの切り取りや OS の切り取り操作で対応しているなら Emacs のキーで覚えなおす事をオススメする)。

因みにターミナルも Emacsキーバインドがデフォルトで ON になっているので、Emacs で覚えた操作は基本的な物 (カーソル移動や search、kill - yank などは対応している) は使える。

本題

Emacs は基本的に拡張を入れたり、自分でエディタをカスタムして使う事が出来るのであまりこう使うべきというものは無いけど、流石にこれは知っておいた方が良いよねというものもそれなりに存在していたりする (機能の組み合わせなど、色々)。

ファイル全体の再インデント

プログラムを書いていると、なんでこんなにインデントが汚いんだという状況に遭遇することが良くある。 その時にいちいち、ポチポチインデントをつけていく人が居るんだけど (みてて本当に悲しくなる) そういう時は、全体選択とインデントで一括インデントが可能となる。

# 全体選択
C-x, h
# インデント
C-i

ただし、空白文字とタブ文字が混ざっている時にどちらかに寄せるという挙動はしてくれない (タブ文字を空白文字に変更したり等)。 その時に良くやるのが下記。

# 全体選択
C-x, h
# 正規表現置換
M-C-%
# タブ文字指定 (C-q, C-i で文字として入力できる) -> 空白文字
C-q, C-i -> スペース

正規表現での置換は特にエディタを使っていて本当に良く使うのでなる早で身に付けるようにした方が良い。 これが使えるだけでプログラム書く時の面倒臭さが激減する。

コメント/アンコメント

一旦書いているコードをコメントしたい時は良くあり、その際に毎回範囲コメントを書いたり、一行コメントを該当行に書き加えるのは生産性が皆無なので、やめた方が良い。 コメントアウトしたり、コメントを外したりするなら、それ用のキーバインドがある。

# コメントアウトしたい行を全て選択した上で
M-;

アンコメントする時は逆に、コメントを外したい行を選択してコメント時のキーバインドを利用する。 言語によっては範囲選択すると範囲コメントを使用するため、その場合は中途な範囲をアンコメントする事は出来ないため、一度最初にコメントした行を全てアンコメントしてから再指定、コメントアウトし直す。

ディレクトリ/ファイル操作

Dired モードも良く使うので覚えておくと細かな操作をターミナルで行なう必要が無くなり、Emacs <-> ターミナル間の移動を省けて便利。

dired-mode
dired-mode
こういった感じでディレクトリの情報が確認できるモードで、この状態で色々ファイル操作が出来る。

例えば、削除したいファイル候補は d でマークを付ける事が出来る (行の左箸に D という文字と色が行につく)。 この選択状態の際に x を入力する事で削除を実行できる (yes or no の確認を済ませると個別確認はせず実行される)。

また、ファイルの移動やリネームを行ないたい場合は、対象ファイルの行上にカーソルを置き、R を入力する事で mv コマンドと同等の事が実行できる (対象ファイルはカーソルが乗っている行を選ぶ為、移動先を入力するだけとなる)。 単一コピーは C で、単一削除は D を入力することで、リネームと同じ確認を行なわれる。

また、複数行を対象にしたい場合は m を入力する事で、複数に対しマークを付ける事が出来る (これは d でマークを付けるのと似た操作となる。またマーカーは * となる)。 マークの取り消しは u で可能となる。

あとは、使用シーンはそんなに多くないけど、t を入力する事で現在選択している行と未選択行を反転する事ができる。 1 つ以外のファイル全ての様な指定をしたい場合に除外したいファイルにマークをつけ、その後反転といった使い方になる。

また、ファイルの中身を確認したい際には C-o を入力する事でファイルを確認する事ができる (カーソルは今のまま移動しない)。逆に、ディレクトリを表示したままファイルを開いてカーソルを移動したい場合は、o を入力する事で開いた上で移動する事が出来る。

カーソル移動

最後にカーソル移動の話となる訳だけど、Emacs でカーソル移動する際は基本の上下左右と思われがちなんだけど、それは非常に非効率で、出来ればインクリメンタルサーチを使うべきとなる。

なるべく少ないキー入力で対象の編集箇所に飛ぶ訓練はした方が良く、その最たるものがインクリメンタルサーチとなる。 他にも細かなジャンプ用キーバインドがあったりするけど、最初にサーチで移動する癖を付けてしまう方が色々と楽 (応用が効きやすく、細かな指定が出来るため) となる。

# 前方
C-s
# 後方
C-r

サーチキーバインドを入力した後、検索したい文字列を入力し、C-s や C-r で前方、後方へ移動していく事ができる。 連続で実行する事で次々に移動していき、候補が無くなると、再入力でファイル内の最初のヒット文字列に移動してくれる。 途中で検索ワードを変更したり、検索をやめて移動した先からカーソル操作を続ける事でできる上、元のカーソル位置に戻って作業を行なう事も出来るため、ソースを確認して戻るなどもできる (ソースを見ながら入力したい場合などは Window 分割して同バッファ上で確認したい行に移動するなどは良く行なうのでそちらの方が良いかも)。

とにかく、生産性高くプログラムを書くには、いかに無駄な入力やカーソルの移動時間を使わない事に尽きる。そこにはマウスとキーボードの間を往復する手も要因に含まれるため、手をキーボードの上に置いたままマウスを使っているのかと思わせるくらいの操作を覚える事が重要になる (訓練するとプログラムを書くのにマウスを使う事が苦痛になる程パフォーマンスが上がってくる)。

結論

今回の話では僕が Emacs を普段から使っているため Emacs の話を書いたけど、これは vi (Vim) を使おうが、IDE を使おうが、どのエディタ環境でも変わらず、プログラマにとって必要な能力となる (キーボードショートカットを覚えて使いこなすという話)。 採用面接や試験などではプログラムをどれ程書けるのか、言語の習熟度、フレームワークの実績などを確認されるが、僕はエディタを重視して確認したりしていた。

それは、言語、フレームワークなどに習熟するのは業務でやっていればある程度できるようになるが、エディタの使い方を見るとどれくらい普段プログラムを書いていて、どの程度熱意を持っているかを測れると思っているからである。 プログラマは職人であり、エディタは長く触る事になる道具なため、その使い方を常に良くしていこうという気持ちが無いと時代についていってプログラムを書いていくのは難しいと思う。

そのためこれからプログラミングを覚えていく人はプログラムを書く事だけでなく、自分の使っているエディタでどう書くべきなのか、という所まで目を向けて書いて欲しい。