読者です 読者をやめる 読者になる 読者になる

EmacsのC-mを便利にしてキーバインド先を増やすハック

追記: 名前を変更してel-getで落とせる形式に切り分けてgithubで公開しました EmcasのC-mを便利にするsmart-newline.elを公開した - ainameの日記

magnars/expand-region.el というとても便利な拡張があるんですが、Emacsをターミナル内で使う派($ emacs -nw) & 英字配列派の自分は、他の人みたいにC-@っていうキーバインドを割り当てることが出来ず、M-sっていう微妙な割り当てをしていたのだけど、どうしてもコントロールキー+何かに割り当てたいと思っていろいろ考えた結果、C-oに割り当てることが出来た。

ただ、C-o自体は元々open-lineというコマンドが割り当てられていて、それ自体は元々使ってた機能なので消したくはない。そこで、C-m(RET)をC-oの機能と統合してC-oキーバインドを空けることにした。

で、実装したの↓これだけ。

gist7294696

設定すると、こんな感じの挙動になる。

  1. カーソルがもし行末にあれば今までと同じ改行
  2. カーソルが行末以外で、現在位置から行末位置までに空白や改行文字等が無ければインデント付き改行
  3. カーソルが何か文字列の存在する行の途中だったらインデント付き改行
  4. それ以外の場合は空白行が挿入されてカーソルがインデントされた位置に移動する

自分の場合、C-oを使ってたケースのほとんどが、既に書かれているコードの間にコードを差し込む様な場合だった。例えば以下の様なケース。

↓のコードの時にendの先頭にカーソルがある状態でreturnキー or C-mを押すと

 def hoge_method
|end
↑カーソルこの位置の状態でC-m(RET)を押す

↓のようにインデントされた状態でdefとendの間に新規の空行を差し込むことが出来る。 (open-lineとindentのコマンドの組み合わせ)

def hoge_method
  |←この位置にカーソルが来る
end

ちょっとした工夫だけど、今までC-oとC-m(RET)2つのキーでやって来たことが意外とすんなり1つのキーで収まってびっくりした。ちなみにこの設定のおかげでC-jも自分の用途では要らなくなった。便利。

この挙動を示すのにScreenCast作ろうとしたんだけど入力しているキーを表示するためのKeyCastrってアプリがMavericksだと動かなくて諦めました。おすすめツールあれば教えて下さい。