5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

irbで最終行以外でも実行したい

5
Last updated at Posted at 2025-12-17

現象

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

希望する挙動

しかし zshzle の挙動に慣れていると、ここでの改行は実行してほしいです。
改行を挿入するなら 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 と同じでした。

何か調べるときに、こういう手順で調べているということも含めて書いたので、参考にしてみてください。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?