rcmdnk's blog
Last update

前回前々回 で色々調べてた所で readlineのキーバインドとかを全く活用してなかった事に今更ながら気付いたので まとめと改めて設定したものなど

ここでは主にBashについての設定についてです。

端末コマンドの削除

いくつかstty 1 で設定されている端末コマンドで 余計な物を削除するため(readlineでのkeymapで使ったりするため) .bashrcに以下の様にしてあります。

tty -s && stty stop undef # C-s
tty -s && stty start undef # C-q
if [[ "$OSTYPE" =~ "darwin" ]];then
  tty -s && stty discard undef # C-o
fi

C-sの設定は良くある設定で画面出力の設定を消して bashでの履歴検索に使います 2

C-oについてはMac(BSD sttyのデフォルト?)だと discardに割り当てられていて使えないのでこれを除きます。 Linuxと共通の物を使いたいのでdarwinでMacを判別。 (他のBSD系の端末は今のところ使っていないので)

C-qは便利な位置にあるキーなので いつか何かに割り当てようかと。(C-sを潰した以上使わないので)

よく使う&覚えておきたい端末コマンド/bashキーマップ

大概の場合の初期設定+上の端末コマンド削除後に使えるコマンドのうち、 取り敢えず必要なものと便利そうな物のまとめ 3 (今更感)。 (sttyとbashキーマップごちゃまぜです。)

以下でM-はエスケープシーケンス(\eで設定される項目)です。

制御、端末

キー 動作
C-c 実行中のプロセスを終了
C-z 実行中のプロセスを中断 (fg/bgで再開)
C-d ログアウト
C-l 画面クリア
C-x C-r .inputrcの再読み込み

コマンド

キー 動作
TAB 補完
C-j/C-m コマンドを実行(Return/Enter)
C-o コマンドを実行して次の行にも同じコマンドを表示
C-x C-u 取り消す(undo)
C-v 直後の入力を直接入力にする(C-a等)
C-x C-e エディタでコマンドを入力
C-x (  キーボードマクロ記録開始
C-x )  キーボードマクロ記録停止
C-x e  キーボードマクロ実行

このC-oを使うために上で端末コマンドを削除。 ただ余り使う機会はないかも。

C-x C-eで使うエディタは環境変数EDITORで指定されたものです。 .bashrc

export EDITOR=vim

としてあります。(emacsにしたかったらexport EDITOR='emacs -nwとか。) 履歴とかで表示してからでもC-x C-eをすれば 表示された状態から編集できるので長いコマンドを変更するには結構便利。

キーボードマクロは、例えば

$ <C-x (> echo test
test
$ echo test2
test2
$ <C-x )>

等とすると(<~>は表示されない部分)次にC-x eと押すと echo test;echo test2が実行出来る様になります。

エディタとキーボードマクロも今更初めて知りました。 エディタの方はたまに使います。

マクロの方は初めて使った時軽く衝撃的でしたが、 実用性はそれ程ないかもしれません…

履歴

キー 動作
C-p 1つ前のコマンドを表示
C-n 1つ後のコマンドを表示
C-< 履歴を最初のコマンドを表示
C-> 履歴を最後のコマンドを表示
C-r 履歴を古い方向へインクリメンタルサーチ
C-s 履歴を新しい方向へインクリメンタルサーチ
C-. 1つ前のコマンドの最後の引数を貼り付け

C-sはここで必要。 C-.は初めて知りましたが、C-o以上に使わないかも。

移動系

キー 動作
C-f 1文字進む
C-b 1文字戻る
M-f 1単語進む
M-b 1単語戻る
C-a 行頭へ
C-e 行末へ

必須。GNU screenのデフォルトだとC-aをescapeとして潰してしまいますが、 変更必須。

削除、貼り付け、変更

キー 動作
C-h 直前の1文字削除
C-d 直後の1文字削除
C-w 直前の1単語削除
M-d 直後の1単語削除
C-u 行頭まで削除
C-k 行末まで削除
C-y 貼り付け
M-y 削除リングの最後を消して1つ前を代わりに貼り付け(C-y/M-yした後にだけ使用可能)
M-u 次の単語を全て大文字に
M-l 次の単語を全て小文字に
M-c 次の単語の先頭を大文字に
C-t カーソル前後の文字を交換
M-t カーソル前後の単語を交換

M-yも初めて知りました。readlineにも削除履歴(kill ring)があったんですね。 C-tは元々使い道が余り無いので、GNU screenのescapeとして使ってます。 M-tの単語交換の方はたまーに使います。

キーバインド設定

Bashではreadlineを使っていて、 この設定は.inputrcに設定を書くことで変えられます。

または、以下に書くset ..."\C-g":...の設定を.bashrc

if [ -t 1 ];then
  bind 'set ...'
  bind '"\C-g" ...'
fi

bindコマンドを使って書くことも出来ます。

ここで[ -t 1 ]はこれを呼んでるセッションが インタラクティブなものかどうか(正確には標準出力が端末なのかどうか) をチェックしています。

これをしないと、外部からscpとかした際に

...bashrc: line:78: bind: warning: line editing not enabled

みたいなエラーが出てしまいます。

また、.bashrcの中から

if [ -t 1 ];then
  bind -f my_inputrc
fi

とすれば、.inputrc以外のファイルから設定を読むことも出来ます。

.inputrcでのreadline環境設定

readlineの設定は

set bell-style none
set expand-tilde off

set convert-meta off
set input-meta on
set output-meta on

の様な感じで

  • beep音/visualベルをオフに
  • ~を展開表示しない
  • 日本語を通る様に

expand-tildeの項目は新たに加えました。(いちいち展開されるのが鬱陶しいので))

キーバインド設定

.inputrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# grep
"\C-g": ""
# grep -r "" ./
"\C-g\C-r": "grep -r ./\eb\C-f \"\"\C-b"
"\C-gr": "grep -r ./\eb\C-f \"\"\C-b"
"\er": "grep -r ./\eb\C-f \"\"\C-b"
# grep "" *
"\C-g\C-g": "grep *\C-b\C-b \"\"\C-b"
"\C-gg": "grep *\C-b\C-b \"\"\C-b"
"\eg": "grep *\C-b\C-b \"\"\C-b"
# find ./|grep 
"\C-g\C-f": "find ./|grep "
"\C-gf": "find ./|grep "

# Quote/Bracket
"\e\"": "\eb\"\ef\""
"\e\'": "\eb\'\ef\'"
"\e\`": "\eb\`\ef\`"
"\e\]": "\eb\[\ef\]"
"\e\}": "\eb\{\ef\}"
"\e\)": "\eb\(\ef\)"

# Variable ${}
"\C-q": ""
"\C-q4": "${}\C-b"
"\C-q$": "${}\C-b"
"\eq": "${}\C-b"

# less
"\el":"\C-e | less\C-m"

# ls
"\es":"\C-e\C-uls\C-m"

# cd
#"\eu":"\C-e\C-ucd ../\C-mls\C-m"
"\eu":"\C-e\C-ucd ../\C-m"

# du
"\e\C-d": "for a in *;do du -s $a;done\C-m"

# /dev/null
"\e;": ">/dev/null\C-m"
"\e:": ">/dev/null 2>&1 \C-m"
  • M-gなどでgrepのテンプレート
  • カーソル下、または前の単語をM-'でクォートしたり括弧で囲ったり
  • M-q${}記入して括弧内へ
  • M-llessに出力して実行
  • M-sls
  • M-uで1つ上のディレクトリへ移動
  • M-dでカレントディレクトリの各項目の大きさを調査
  • M-;/M-:で標準出力、またはエラー出力も表示させない様にして実行

など。差し当たり普段使わないキーに対する割り当てなので、 慣れなかったらやめれば良いだけなので、取り敢えず。

ちなみにキーバインドをするとき、 絶対にやってはいけないこと にあるようにC-mに割り当てをするとReturn(Enter) の変更とも解釈されるのでするべきではありません。(C-jはOK。) これはC-mReturnが同じコード(CR:キャリッジ・リターン)なのに対して C-jは”改行”でReturnとコードが違うため 4 5 同様に、C-hC-iもそれぞれBackspace、TABと解釈されるので駄目。

Alt/Cmdを頻繁に使う様にしてみようとしていたら、 ちょっといっその事Alt/CmdとCtrl(CapsLockの所)自体を交換した方が良いんじゃないかと思い始めた今日このごろ。 (どうせ自分以外の環境で作業しなきゃいけないときはCtrlとか遠いところに あって普段通りに使えないので自分の所だけで慣れていても問題ないかな、と。)

set editing-mode vi

上での設定は通常コマンドラインで初期設定となっている emacsモードです。 普段エディタとしてはvimを使っているので何度か viモードにして試してますが、いまいち使いこなせないままです。 (インサートモード時の設定を一通りemacsモードと同じ様にすれば それ程ストレス無く使えるかもですが。)

Sponsored Links
  1. sttyはshort for Set TeleTYpeの略らしい(Stty)

  2. 黒い画面を使い初めてしばらくして、 C-r/C-s で履歴を検索出来る、と言う事を初めて知った時に画面が止まってしまう罠。 C-qが再開コマンドですがそれが分かるようなら 罠に陥らないわけで。

  3. bashのキーバインド(キーボードショートカット) まとめ - readlineとbind、ついでにstty編, bash - コマンド (プログラム) の説明 - Linux コマンド集 一覧表, コマンドライン編集

  4. Wikipedia:ASCII

  5. C-mだとm(01101101)の下位5ビットだけ(00001101)が送られ、 これがRetrun(CR)に等しい。Ref:Wikipedia:コントロールキー

Sponsored Links

« メタキー/ESCについて: iTermでそれらのキーを送る設定も Macでのキーバインド設定 »

}