gofujita notes

on outline processing, writing, and human activities for nature


Org との日々 #9

5. キーバインディング

5-a. Key bindings, key bindings, key bindings

Emacs を使う人たちは、ショートカットキーをキーバインディングとよびます。

バインドは英語の bind で、結びつけるという意味の動詞。プログラミング関係では割り当てるという動詞として使われているようです。ですから key bindings はキーをある機能をもつコマンドに割り当てるという意味をもっていると、考えています。

そして、なぜショートカットと呼ばないのかというと、現在のたとえば macOS やその前の Macintosh OS のショートカットが生まれる前から Emacs とそのコミュニティが存在し、その人たちがキーバインディングということばを使っていたことが関係していると、ぼくは予想しています。

Emacs を使いはじめて最初におどろくのは、このキーバインディングの多さです。たとえば、以下のサイトをみてください。これは Emacs キーバインディングのチートシート (カンニングシート) みたいなものです。

 

GNU Emacs Reference Card

 

たくさんありますね。でも、これがすべてではなく、もっとたくさんのキーバインディングがあります。Emacs では Emacs のもつ機能を本人に質問できるので、ぼくの Emacs にいくつキーバインディングがあるのか教えてもらいました。

具体的なたずね方ですが、以下のコードを入力中のバッファー (窓のことです) のどこかにかき、その行末にカーソルを置いたままC-x C-e (control キーを押しながら x と e のキーを押す) とタイプします。

 

(length global-map)

 

すると画面いちばん下にある1行の窓、エコーエリアに数字がでます。これが、あなたの Emacs がもっているキーバインディングの数です。

ぼくの Emacs からは199個、という返事がありました。これは global-map、つまりグローバルなキーバインディングのリストに含まれる数ですから、特定の mode などだけで使えるキーバインディングが別にもあります。

これだけたくさんの選択肢があれば、マウスやトラックパッドなどのポインティングデバイスを使わず、キーボードの操作だけでかなりのことができそうですね。

自分が頻繁につかうキーバインディングをマッスルメモリーし、キー操作だけで文章やコードをかいたり、その編集をしたりする作業を進めるという使い方は、Emacs を使う醍醐味のひとつです。

 

5-b. 覚えやすいキーバインディング8つ

Emacs のキーバインディングをつかいはじめるための情報として、まず、多くの人がよく使い、覚えやすいとされるキーバインディングを紹介しましょう。これらはすべて、機能の名前のイニシャルをつかっています。

カーソルを先 (forward) へすすめたいときのキーバインディングには「f」が割り当てられています。

  • 1文字先へ移動 (foward-char): C-f
  • 1語先へ移動 (forward-word): M-f

カーソルを何かの終わり (end) に移動させる場合は「e」が割り当てられています。

  • 行の終わりへ移動 (move-end-of-line): C-e
  • センテンスの終わりへ移動 (forward-sentence): M-e

削除 (killing) する機能は「k」です。

  • カーソルから先、行内のテキストを削除 (kill-line): C-k
  • カーソルから先、センテンス内のテキストを削除 (kill-sentence): M-k

そして、カーソル直後のテキストと直前のテキストを入れ替える (transposing) 機能には「t」が割り当てられています。

  • 1文字入れ替える (transpose-chars): C-t
  • 1語入れ替える (transpose-words): M-t

C-は control キーを押しながら、そしてM-は esc を押してから離し、アルファベットキーを押す作業を示しています。そして、ここに挙げた8つのキーバインディングをマッスルメモリするだけでも、文章やコードをかくときに便利になること請け合いです。小さく人生が変わります (笑)。

 

5-c. キーバインディングを探検する

キーバインディングの一部を覚えたいとき、キーバインディング全体をざっとでも眺めておきたいと思ったとき、ぼくはまず、最初に紹介したチートシート「GNU Emacs Reference Card」を見ることにしています。

ある機能を使うキーバインドが思い出せないときにカンニングペーパーをみるような気もちで、このサイトを見直すワケです。

よくつかうものって人によってちがうことが多いですから、キーバインディングをとにかく全部みておきたいというあなたには、グローバルなキーバインディングを網羅したリストを呼び出すコマンドがあります。

 

M-x describe-bindings

 

グローバル・キーバインディングすべてを整理し、解説も加えたサイトもあります。時間のあるときに眺めておくと、無限にも感じるキーバインディングたちが頭の中で少しだけ、手に負えるような気もちになります。

 

THE EMACS KEY-BINDINGS

 

そして、そして..。C-h kで特定のキーバインディングの機能をしらべることもできるのですが、これがおもしろい。

たとえばC-eについてしらべたいときはC-h k C-eとタイプすると、Spacemacs の場合は画面の下半分に新しいバッファ (赤枠の部分) が開き、このC-eの説明が現われます (赤枠はぼくがあとからつけたものです)。

キーバインディングの機能の説明は、赤枠バッファ内5行目、カーソルが置かれた行にあります。

  • 行の終わりに移動する。ただし省略記号がある場合はその前まで

最初の2行もえいやと日本語にすると:

  • C-eは、コマンドのorg-end-of-lineを実行する
  • このコマンドは、インタラクティブな Lisp 関数で「org.el」で定義されている

そして、説明の「org.el」をクリックすると、org.el ファイルのこの関数をかいてある場所へジャンプします。図の上側のバッファ (窓) は、この関数を定義しているコードの一部です。

で、あたり前なんですが、そのコードをながめたり写経したりして、先人たちがどうやってカーソルを行末へジャンプする機能を実装したのか、直接学ぶこともできますし、無謀にも (?) そのコードをかき換えることもできてしまう (恐いですね.. 笑)。

これこそが Emacs というテキストエディタ以上のテキストエディタの醍醐味の入り口なのだと、ぼくは理解しています。

 

5-d. キーバインディングを少し変える

Emacs にあらかじめ用意されたキーバインディングの雰囲気をつかんだら、自分がよくつかう操作を自分の指とキーボードに合った〈カタチ〉に変えるのも、Emacs ならではの愉しみです。

自分に合った自分だけの Emacs を目指しているあなたは、もしかすると最初から10個か20個、あるいはもっとたくさんのキーバインディングを自分用に「カスタマイズ」したくなるかもしれません。

でもぼくは、先人たちの想いをちょっとだけ尊重することにして、キーバインディングを変えるのはほんの少しだけにしています。Emacs の長い歴史の中で整備されてきたキーバインディングは、ぼくが考える以上にうまい具合にキーを割り当てていることが多いと感じていて、それをまずは学んでおきたいという気もちがあるワケです。

キーバインディングを変更する機能を備えた関数は複数あります。ここでは、ぼくがよくつかっているbind-keyというコマンドを紹介します。

このコマンドをつかう場合、たとえば、2節で紹介したある項目にフォーカス (narrowing) する機能org-narrow-to-subtreeC-nに割り当てるとき、次のようにかきます。

 

(bind-key "C-n" 'org-narrow-to-subtree)

 

最初にbind-key、つぎが割り当て先になるキーのC-n、そして割り当て元の関数org-narrow-to-subtree、という順番です。

Spacemacs の場合、これを設定ファイル configuration file である .spacemacs のどこかにかけばいいはず。では、どこにかけばいいでしょう?

前節を思い出してください。そう、どこにかけばいいか迷ったときはとりあえずuser-config にかくのでしたね。

図の赤枠の中が、キーバインディングを変えるためのコードです。かんたんに説明しておくと:

  • C-r: 文字を置換する
  • C-n: 特定の項目内にフォーカス narrowing する
  • C-p: フォーカスを外す
  • C-t: 項目内のデータをすべてコピーする
  • C-o: 指定範囲内の改行記号を削除する

前節にもかきましたが、M-m f e Rとタイプすれば Emacs を再起動せずに.spacemacsをよみ直すことができます。

さぁ、これであなたの Emacs はあなたのキーバインディングで操作できるようになります。

そして、最後にひとつ。

上のキーバインディングの5つ目、C-oで実行されるコマンドdelete-linebreaksは、このとおりにかいてもあなたの Emacs では動かないはず。なぜなら、ぼくがつくったコマンドだからです。

で、次回はいよいよ、小さな関数をつくる方法を短く紹介します。