TL; DR
bashはと同様の機能を持っているzsh「S bindkeyを通してbind、それはいくつか持っていないviようなモードをzsh。set -o viあなたができる後:
bind '"jk":vi-movement-mode'
同等これはzshさんは、bindkey -M <all vi modes> jk vi-movement-mode
vi-movement-mode関数は、から来ているinputrc(参照/etc/inputrc、それらのリストについては)。
全文
スティーブンハリスがコメントで指摘しているように:
いくつかのディストリビューションに.bash_profileは、次のようなスケルトンが付属しています。
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
.bash_profile存在することを簡単に忘れることができるので、これは良いコンテンツです。
さて、シェルセッションでマッピングjkするEscことは、実際には不可能です。あなたがするとき:
inoremap jk <esc>
Vimでは、と入力した後j、k次に入力するかどうかを確認するために少し待つ必要があることをVimが認識し、マッピングを呼び出す必要があります(または別のキーを入力してマッピングをトリガーしないでください)。補足として、これは:set timeoutlen=<miliseconds>Vimで制御されます(を参照:h timeoutlen)。
いくつかのシェルまたはX11にはそのようなタイムアウト制御がなく、複数の文字マッピングを許可していません。単一のキーのマッピングのみが許可されています(ただし、以下のサポートノートを参照してください)。
set -o vi
読み取りません。シェルで使用できる.vimrcいくつかのvi(偶数ではないvim)キーの組み合わせを模倣するだけです。同じことが言える-o emacs、それはの完全な力が付属していませんemacs。
zshサポート
zsh実際にマップのタイムアウトをサポートしています。そして、あなたがマップするために、以下を使用することができますjkします<esc>:
bindkey -v # instead of set -o vi
bindkey -e jk \\e
(それは行か~/.zshrcない必要があります~/.bashrc)
しかし、私はこれに反対することを勧めます。ほとんどの時間を使用vimしzshています。私はinoremap jk <esc>私の中で、上記vimrcのbindkey組み合わせを使用してみました。 それを使用するときzshに印刷jするのに時間がかかり過ぎて、それは私をとても悩ませました。
bashサポート
bashサポートしていますreadline bind。私はそれbashなしでコンパイルできると私は信じていreadilneます。そのため、bashがサポートされていないbind(注意が必要な)まれなシステムがあるかもしれません。にマッピングjkするに<esc>は、bash次のことを行う必要があります。
set -o vi
bind '"jk":"\e"'
(はい、それは二重レベルの引用です、それは必要です)
繰り返しになりますが、これはタイピングをjかなり面倒にします。しかし、どういうわけかzsh私のマシン上のソリューションよりも煩わしさがありません(おそらくデフォルトのタイムアウトが短いです)。
回避策(非bashおよび非zshシェルの場合)
Escキーを再マッピングする理由は、キーがキーボードからかなり離れているため、入力に時間がかかるためです。emacsみんなから借りることができるトリックCapsLockは、とにかく役に立たないキーなので、再マッピングすることです。 emacsみんなそれをリマップしますがCtrl、私たちはそれをリマップしEscます。
xev -event keyboardのキーコードを確認するために使用してみましょうCapsLock:
KeyPress event, serial 25, synthetic NO, window 0x1c00001,
root 0x496, subw 0x0, time 8609026, (764,557), root:(765,576),
state 0x0, keycode 66 (keysym 0xffe5, Caps_Lock), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
そしての機能をチェックするにはEsc:
KeyPress event, serial 25, synthetic NO, window 0x1c00001,
root 0x496, subw 0x0, time 9488531, (571,525), root:(572,544),
state 0x0, keycode 9 (keysym 0xff1b, Escape), same_screen YES,
XLookupString gives 1 bytes: (1b) "
XmbLookupString gives 1 bytes: (1b) "
XFilterEvent returns: False
CapsLockキーコード66が非常に優れており、Escの機能は「エスケープ」と呼ばれます。今私たちはできる:
# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"
上記はこの順序で行う必要があります。これで、ヒットCapsLockするたびにEscキーのように機能します。
トリッキーな部分は、これを設定する場所です。次~/.Xmodmapの内容のファイル:
remove lock = Caps_Lock
keycode 66 = Escape
ほとんどのディストリビューション(実際にはディスプレイマネージャーですが、単純化のためにディストリビューションと呼んでいます)で尊重されるはずですが、いくつかの~/X*ファイルを尊重しないものを見ました。そのようなディストリビューションでは、次のようなことを試してみてください:
if [ "x" != "x$DISPLAY" ]; then
xmodmap -e "remove lock = Caps_Lock"
xmodmap -e "keycode 66 = Escape"
fi
あなたの.bashrc。
(理論的にはそれがより適切に配置されます~/.xinitrcが、ディスプレイマネージャーが尊重しない.Xmodmap場合は、絶対に尊重しません~/.xnintrc。)
エクストラ注:これはのみ再マップCapsLockにEscX11セッションでは、そのためのマップは唯一の端末エミュレータで動作します。実際ttyの地図は表示されません。
参考文献と補足資料:
jkですか?それはキーボードの特別なキーですか?