Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

posted at

libeditで頑張る〜GNUのreadlineっぽくキーバインドを設定する〜

この記事は、上智大学エレクトロニクス研究部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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?