私はubuntu 16.04とbashシェルを新しくインストールしています。私は2つのことをしたい:
- 端末でvimと同様の操作を実行できるようにviモードを設定します。
- 次のように入力して挿入モードを終了します。
jk
私は読んだその他の投稿どうすればいいですかzsh
?どうすればいいですかbash
?
長すぎます。
bind '"jk":vi-movement-mode'
それからファイル.bashrc
に入れてくださいset -o vi
:)
server@thinkpad:~$ tail -n 2 .bashrc
set -o vi
bind '"jk":vi-movement-mode'
詳しくは@grochmalの回答をご覧ください。
ベストアンサー1
長い話を短く
Bashはzsh
throughに似た機能を持っていますが。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
リストは参考資料を参照)。
専門
Stephen Harrisがコメントで指摘したように:
.bashrc
常に呼び出されますbash
(特に他のシェルでは呼び出されません)。.bash_profile
ログインシェルでのみ呼び出されます(つまり、bashでのみ呼び出されます)。
複数のディストリビューションには、.bash_profile
次のフレームワークが付属しています。
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
.bash_profile
存在するという事実を忘れる可能性があるため、これは素晴らしいコンテンツです。
これで、シェルセッションjkにマッピングすることは事実上不可能です。Escこれを行うとき:
inoremap jk <esc>
Vimで入力した後、Vimは次の入力がマッピングを呼び出す必要があるか(または別のキーを入力した場合はマッピングがトリガーされないことを確認するために)しばらく待つ必要があることjを知っています。k付録として、これは: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
サポートされているコンパイルなしでコンパイルされるreadline
bind
と思うので、bashをサポートしていないまれなシステムがあるかもしれません(注意してください)。実行する必要があるタスクをマッピングするには、次の手順を実行します。bash
readilne
bind
jk
<esc>
bash
set -o vi
bind '"jk":"\e"'
(はい、これは二重レベル参照なので必須です。)
繰り返しますが、これはタイピングをj
非常に迷惑にします。しかし、私のコンピュータのソリューションよりもあまり迷惑ではありませんzsh
(おそらくデフォルトのタイムアウトは短いでしょう)。
回避策(bashおよびzsh以外のシェルの場合)
キーを再マッピングする理由はEsc、キーボードからかなり離れており、入力に時間がかかるためです。これらの人々から借りることができる1つの秘訣は、とにかく役に立たない鍵であるため、再 emacs
マッピングすることです。人々はそれに再マッピングしますが、我々は再マップします。CapsLockemacs
CtrlEsc
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機能は「Escape」です。今、私たちはこれを行うことができます:
# 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
。)
追加の注:これはX11セッション内でのみ再マップされるため、CapsLockマッピングEscはターミナルエミュレータでのみ機能します。実際にtty
地図を見ることはできません。
参考資料と追加資料: