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
ですか?それはキーボードの特別なキーですか?