この記事は、上智大学エレクトロニクス研究部Advent Calendar第16日目の記事です。
はじめに
この記事はキーバインドがイマイチな libedit
をカスタマイズする方法について解説します。
そもそも libedit
とは何なのかわからないという方は同じくラインエディタである readline
についての解説記事 を参照してください。
libedit
のキーバインドがイマイチな話
標準の設定のままだと、以下の問題が発生します。
^ + R でインクリメンタルサーチができない
割と使うインクリメンタルサーチ、しかし、 libedit
ではショートカットキーが設定されていないため標準のままだとインクリメンタルサーチが使えません。キーバインドを設定するだけで使えるなら標準状態でサポートしてもいいはずなのに不思議ですね。
^ + U が行の文字をすべて削除になっている
これが地味に困ります。途中までカーソルをあわせてそれよりも前の文字を消したかっただけのはずなのに、すべての文字が消されてしまいます。
⌥ opt + ← が使えない
カーソル移動を早くしたいとき、このショートカットキーは割と便利です。しかし、標準設定ではサポートされていないので、 [D
や [C
と出力されるだけです。これも別の機能の被っているわけではないのに標準で設定されていません。
どんなとき困るのか
libedit
がどんなところで使われているかという話をします。 MySQLクライアントの mysql
コマンド、 XCode Command Toolsに同梱されている python3
コマンドなどがあります。python3は別のインストール方法があるので回避できますが、MySQLは使用頻度が高いため回避しにくいです。特にSQLでは複雑なコマンドを打つ機会が多く、昔のコマンドを使いまわしたいのにインクリメンタルサーチができないというのは痛いです。
~/.editrc
の中身
上記の問題をすべて解決するにはキーバインドの設定を変える必要があります。ホームディレクトリ直下に .editrc
というファイルを作り、以下の内容を書き込めば設定完了です!
bind "^A" ed-move-to-beg
bind "^B" ed-prev-char
bind "^C" ed-tty-sigint
bind "^D" em-delete-or-list
bind "^E" ed-move-to-end
bind "^F" ed-next-char
bind "^I" rl_complete
bind "^K" ed-kill-line
bind "^L" ed-clear-screen
bind "^N" ed-search-next-history
bind "^O" ed-tty-flush-output
bind "^P" ed-search-prev-history
bind "^R" em-inc-search-prev
bind "^S" em-inc-search-next
bind "^T" ed-transpose-chars
bind "^U" vi-kill-line-prev
bind "^W" ed-delete-prev-word
bind "^X" ed-sequence-lead-in
bind "^Y" em-yank
bind "\e[1;5C" em-next-word
bind "\e[5C" em-next-word
bind "\e\e[C" em-next-word
bind "\e[1;5D" ed-prev-word
bind "\e[5D" ed-prev-word
bind "\e\e[D" ed-prev-word
おまけ
おまけに readline
をカスタマイズする ~/.inputrc
を晒しておきます。⌥ opt + ← や ⌥ opt + → で単語飛ばしでカーソル移動ができます。
"\e[1;5C": forward-word
"\e[1;5D": backward-word
"\e[5C": forward-word
"\e[5D": backward-word
"\e\e[C": forward-word
"\e\e[D": backward-word