Bash viモードでjkをマッピングして挿入モードを終了します。

Bash viモードでjkをマッピングして挿入モードを終了します。

私はubuntu 16.04とbashシェルを新しくインストールしています。私は2つのことをしたい:

  1. 端末でvimと同様の操作を実行できるようにviモードを設定します。
  2. 次のように入力して挿入モードを終了します。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はzshthroughに似た機能を持っていますが。bindkeybindvizshset -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エミュレートするだけです。すべての力を持っていない場合でも同様です。vivim-o emacsemacs


zsh サポート

zshマップタイムアウトは実際にサポートされています。以下を使用してマッピングできjkます<esc>

bindkey -v  # instead of set -o vi
bindkey -e jk \\e

~/.zshrc(これはせずに進むべきです~/.bashrc

しかし、私はそうしないことをお勧めします。私はほとんどの時間に使用しますvim。上記の組み合わせを試してみましたzsh。使用中に印刷するのに時間がかかりすぎると迷惑になります。inoremap jk <esc>vimrcbindkeyzshj


バッシュサポート

bashサポートされているコンパイルなしでコンパイルされるreadline bindと思うので、bashをサポートしていないまれなシステムがあるかもしれません(注意してください)。実行する必要があるタスクをマッピングするには、次の手順を実行します。bashreadilnebindjk<esc>bash

set -o vi
bind '"jk":"\e"'

(はい、これは二重レベル参照なので必須です。)

繰り返しますが、これはタイピングをj非常に迷惑にします。しかし、私のコンピュータのソリューションよりもあまり迷惑ではありませんzsh(おそらくデフォルトのタイムアウトは短いでしょう)。


回避策(bashおよびzsh以外のシェルの場合)

キーを再マッピングする理由はEsc、キーボードからかなり離れており、入力に時間がかかるためです。これらの人々から借りることができる1つの秘訣は、とにかく役に立たない鍵であるため、再 emacsマッピングすることです。人々はそれに再マッピングしますが、我々は再マップします。CapsLockemacsCtrlEsc

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地図を見ることはできません。

参考資料と追加資料:

おすすめ記事