現象
irb でたとえばこういう状況で、この行と書いたコメントの1の後ろにカーソルがあるときに改行すると実行されずに改行されてしまいます。
irb(main):001* def foo
irb(main):002* 1 # この行
irb(main):003> end
具体的にはこういう状態になり、3行目にカーソルが移動します。
irb(main):001* def foo
irb(main):002* 1
irb(main):003* # この行
irb(main):004> end
希望する挙動
しかし zsh の zle の挙動に慣れていると、ここでの改行は実行してほしいです。
改行を挿入するなら M-^M (Esc の後 Enter)でできるので、単独の Enter で改行される必要性は感じません。
実際の挙動
そこでキーバインドを調べるため、 lib/reline/key_actor/emacs.rb をみてみると、関係する行は以下のように :ed_newline や :key_newline になっていました。
# 10 ^J
:ed_newline,
# 13 ^M
:ed_newline,
# 138 M-^J
:key_newline,
# 141 M-^M
:key_newline,
実際の挙動は lib/reline/line_editor.rb で定義されていて、ざっと見た感じでは希望する挙動はなさそうでした。
変更してみた挙動
そこで、普通に入力して最終行での ^M の挙動は変えたくなかったので、途中の行でも ^J で実行できるようにしました。
具体的には ~/.config/readline/inputrc に以下の内容を設定しました。
$if Ruby
"\C-j": ed_force_submit
$endif
設定内容の詳細
ed_newline のすぐ下にあった ed_force_submit がカーソルがどこにあっても実行だけしてくれそうだったので、採用しました。
irb などの reline を使ったもの以外の Bash などには影響したくなかったので、 $if Ruby と $endif でくくりました。
この条件の書き方は test/reline/test_config.rb を参考にしました。
ホームディレクトリ直下のファイルを増やしたくなかったので、~/.inputrc の代わりに ~/.config/readline/inputrc というファイル名を使いました。これは lib/reline/config.rb で確認しましたが、空ではない ~/.inputrc があればそちらが優先されるようです。
最後に
reline の調査は現在の master で確認しましたが、調査したファイルについては最新リリースの v0.6.3 と同じでした。
何か調べるときに、こういう手順で調べているということも含めて書いたので、参考にしてみてください。