VimでEscapeの代わりにCapsLockを使用する方法は?

VimでEscapeの代わりにCapsLockを使用する方法は?

CapsLock私のものにマッピングしたいですEscape。どのようにCapsLock表現しますか.vimrc

私は次のようにコマンドにスペースをマップする方法を知っています。

:map <space> viw

レジストリハックをせずに私が探しているVimコマンドCapsLockにマッピングするにはどうすればよいですかEscape

ハッキングや他のソフトウェアがなければ、これが不可能な場合jj。私は現在これをやっています:ESC.vimrc

inoremap jj <esc>

しかし、ビジュアルモードでは動作しません。jjEscキーをどのようにシミュレートできますか?

答え1

CapsLockVim内では地図を作成できないようです。以下を使用してX内で再マッピングできます。setxkbmap:

setxkbmap -option caps:swapescape

コンソールから再マップするには、展開で使用しているsystemd場合はカスタムキーボードレイアウトを使用できます。/etc/vconsole.confアーチスウィキ、他の初期化システムについては参照このU&L回答

答え2

と交換する代わりにCaps LockマッピングEscapeするには、次のようにします。Escape

setxkbmap -option caps:escape

変える...:swapescape

使用

setxkbmap -option

既存のオプションを消去するには、上記の方法が機能します。

答え3

xmodmapVimの起動時に、CalllockをCapslockをEscapeにマッピングできます。 Vimを離れた後は、変更を復元できます。次の行を次の行に追加します.vimrc

au VimEnter * silent! !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
au VimLeave * silent! !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Caps_Lock'

ただし、Vimセッションが複数ある場合、問題が発生する可能性があります。そのうちの1つを閉じるとxmodmapグローバルに機能するため、すべての修正が元に戻ります。

答え4

~/.vimrcまたは、ファイルで以下を試してください~/.vim/vimrc

:autocmd BufWinEnter * !setxkbmap -option caps:swapescape
:autocmd BufWinLeave * !setxkbmap -option

~/.bashrc最初の行または代わりにエイリアスを使用できます~/.profile

alias vim="setxkbmap -option caps:swapescape && vim"

この方法の欠点は、vimを閉じない限り、CapsLockがEscapeになり、その逆も同様です。

解決策:

これを行うには、キーバインディングを使用して、必要なモード(InsertModeなど)中にのみタイムアウトを交換します。
au CursorHoldI * stopinsert
au InsertEnter * silent! let updaterestore=&updatetime | set updatetime=15000 | execute "!setxkbmap -option caps:swapescape" | redraw!
au InsertLeave * silent! let &updatetime=updaterestore | execute "!setxkbmap -option" | redraw!

InsertModeの間、CapsLockとEscapeはシステム全体で交換されますが、InsertModeのタイムアウトを15000に設定したため、15秒間アクティビティがないと自動的に反転するため、心配する必要はありません。 ;-)

-ヒマンシュ

関連情報