経緯
- Vimにおいて、カーソル移動のために、
Ctrl-H,J,K,L
を<Left>,<Down>,<Up>,<Right>
にマッピングしたい。
しかし、デフォルトの設定ではBackspace
はCtrl-H
(^H
) と同じコードになっており、これを実現するためには、いくつかの対処が必要となった。
現在の設定に(対症療法的に)たどり着いたので、備忘も兼ねて、記載する。 - 注意事項
以下の設定を施すと、予期せぬタイミングで BackSpaceキーを押下したときに (カーソル直前の文字が削除されず)^?
または 文字化けして□
のように表示されてしまう場合がある。その場合は、C-h
でカーソル直前の文字を削除することができるはず。あるいはDeleteキーを利用することで対処できる。
環境
- 接続元 Windows10, SSH clientとして RLogin 2.25.9 を使用
- 接続先 Ubuntu18.04, tmux2.6, vim 8.0 で確認
- 接続先 CentOS8, tmux2.7, vim 8.0 で確認
- 接続先 CentOS7, tmux1.8, vim 7.4 で確認
(1)RLoginの設定状況
- サーバ設定から スクリーン > 制御コード を選択
- エスケープシーケンス グループボックスで「67 BSキーでBS(08)を送信 BSキーでDEL(7F)を送信」のチェックを外す。
(これにより、Backspaceキーで送信されるコードが^H
から^?
に変更される。なおDeleteキーは影響を受けない。)
- エスケープシーケンス グループボックスで「67 BSキーでBS(08)を送信 BSキーでDEL(7F)を送信」のチェックを外す。
- サーバ設定から キーボード を選択
- 「キーコード」グループボックスで、「新規」ボタンをクリックし、Key Code のドロップダウンリストで
INSERT
、右側のShift
にチェックを入れ、Assign Stringに$EDIT_PASTE
を入力し、OKボタンをクリックする。
(これにより、Shift-INSERT
でペーストできるようになる。よく使うので設定している。) - 「Metaキー設定」グループボックスで、「すべてセット」ボタンをクリックする。
(これにより、AltがMetaキーとして認識されるようになる。vimのキーバインドで使用するために設定している。)
- 「キーコード」グループボックスで、「新規」ボタンをクリックし、Key Code のドロップダウンリストで
- サーバ設定から キーボード > キーコード を選択
- 「キーコードの変更」グループボックスで、「1. modifyCursorKeys」でINSERTを削除し、ドロップダウンを「2」にする。
(これにより、UP,DOWN,RIGHT,LEFT,PRIOR,NEXT,HOME,END,DELETE
キーで修飾キーが認識されるようになる。vimのキーバインドで使用するために設定している。)
(INSERTを削除する理由は、「modifyKeysがメニューのショートカットキー設定より優先する」場合にShift-INSERT
が無効になってしまうことへの対処) - 「キーコードの変更」グループボックスで、「2. modifyFunctionKeys」で、ドロップダウンを「2」にする。
(これにより、F1-F12
キーで修飾キーが認識されるようになる。vimのキーバインドで使用するために設定している。) - 「キーコードの変更」グループボックスで、「3. modifyKeypadKeys」で、ドロップダウンを「2」にする。
(これにより、PAD0-PAD9,PADMUL,PADADD,PADSEP,PADSUB,PADDEC,PADDIV
キーで修飾キーが認識されるようになる。)
(実はtmuxやvimのキーマッピングに使っていないが、念のため設定している。) - 「キーコードの変更」グループボックスで、「4. modifyOtherKeys」で、ドロップダウンを「-1」のままとする。
- 「キーコードの変更」グループボックスで、「5. modifyStringKeys」で、ドロップダウンを「-1」のままとする。
- 「キーコードの変更」グループボックスで、「modifyKeysがメニューのショートカットキー設定より優先する」にチェックを入れる。
- 「キーコードの変更」グループボックスで、「1. modifyCursorKeys」でINSERTを削除し、ドロップダウンを「2」にする。
(2)Bashの設定
- 設定ファイル
~/.bashrc
に以下を設定
なお、この^?
は、vimのインサートモードでC-V Backspace
で入力する。
あるいは、RLogin経由のデフォルトショートカットキー設定ならC-V C-S-8
で入力できる。
設定を変更したら、ログインしなおす。
if [[ -t 0 ]]; then
## erase with '^?'
## TODO replace with C-v C-S-8(^?)
stty erase ^?
fi
(3)tmuxの設定
- 設定ファイル
~/.tmux.conf
に以下を設定
default-terminalの設定が重要。tmux-256screenは、CentOS7で利用できなかった。
その他の設定は任意。
設定を変更したら、tmuxのセッションをすべて終了し、確実に設定を再読み込みさせる必要がある。
例えば、$ tmux kill-server
を実行し、tmuxのセッションをすべて強制終了できる。
### set color 256
# you can find it in ```$ toe -a```
# set-option -g default-terminal tmux-256color
set-option -g default-terminal screen-256color
### draw line with ACS
set -ag terminal-overrides ',*:U8=0'
### prefix key
unbind C-b
set -g prefix C-q
bind C-q send-prefix
### copy mode
# C-@ stands for NUL '\000' which is sent by C-@ and C-Space on SSH client
bind-key -n C-@ copy-mode
setw -g mode-keys vi
(4)vimの設定
- 設定ファイル .vimrc に以下を設定
関連する部分を抜粋。あとは任意に設定してほしい。
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""" key-maps for Cursor-move
""" for Ctrl-h,j,k,l
nnoremap <C-h> <Left>
vnoremap <C-h> <Left>
inoremap <C-h> <Left>
nnoremap <C-j> <Down>
vnoremap <C-j> <Down>
inoremap <C-j> <Down>
nnoremap <C-l> <Right>
vnoremap <C-l> <Right>
inoremap <C-l> <Right>
nnoremap <C-k> <Up>
vnoremap <C-k> <Up>
inoremap <C-k> <Up>
""" map ^? (= 127 = 0x7f) as Back(BackSpace)
nnoremap <Char-0x7f> <BS>
vnoremap <Char-0x7f> <BS>
inoremap <Char-0x7f> <BS>
cnoremap <Char-0x7f> <BS>
""" RLogin modifyKeys setting
" 1 modifyCursor 2 (should remove INSERT to enable Shift-INSERT as $PASTE)
" 2 modifyFunctions 2
execute "set <xF1>=\<Esc>[1;*P"
execute "set <xF2>=\<Esc>[1;*Q"
execute "set <xF3>=\<Esc>[1;*R"
execute "set <xF4>=\<Esc>[1;*S"
execute "set <F5>=\<Esc>[15;*~"
execute "set <F6>=\<Esc>[17;*~"
execute "set <F7>=\<eSc>[18;*~"
execute "set <F8>=\<Esc>[19;*~"
execute "set <F9>=\<Esc>[20;*~"
execute "set <F10>=\<Esc>[21;*~"
execute "set <F11>=\<Esc>[23;*~"
execute "set <F12>=\<Esc>[24;*~"
execute "set <Insert>=\<Esc>[2;*~"
execute "set <Del>=\<Esc>[3;*~"
execute "set <xHome>=\<Esc>[1;*H"
execute "set <xEnd>=\<Esc>[1;*F"
execute "set <PageUp>=\<Esc>[5;*~"
execute "set <PageDown>=\<Esc>[6;*~"
execute "set <xUp>=\<Esc>[1;*A"
execute "set <xDown>=\<Esc>[1;*B"
execute "set <xRight>=\<Esc>[1;*C"
execute "set <xLeft>=\<Esc>[1;*D"
動作確認の概要
- tmuxを起動していない状況で
- コマンド
$ stty -a
の表示がerase = ^?;
を含む。 - コマンド
$ echo $TERM
でxterm
が表示されることを確認する。 - コマンド
$ toe -a | grep "^xterm "
で情報が表示されることを確認する。 - コマンド
$ infocmp xterm
で情報が表示されることを確認する。 - vim のキーバインドを確認する。
ノーマルモードにて BackSpaceでカーソルを左に移動、C-hでカーソルを左に移動
インサートモードにて BackSpaceでカーソル直前の文字を削除、C-hでカーソルを左に移動
コマンドモードにて BackSpaceでカーソル直前の文字を削除、C-hでカーソルを左に移動
- コマンド
- tmuxを起動した状況で
- コマンド
$ stty -a
の表示がerase = ^?;
を含む。 - コマンド
$ echo $TERM
でscreen-256color
が表示されることを確認する。 - コマンド
$ toe -a | grep "^screen-256color"
で情報が表示されることを確認する。 - コマンド
$ infocmp screen-256color
で情報が表示されることを確認する。 - vim のキーバインドを確認する。
ノーマルモードにて BackSpaceでカーソルを左に移動、C-hでカーソルを左に移動
インサートモードにて BackSpaceでカーソル直前の文字を削除、C-hでカーソルを左に移動
コマンドモードにて BackSpaceでカーソル直前の文字を削除、C-hでカーソルを左に移動 - tmux のキーバインドを確認する。
コマンドモードにて BackSpaceでカーソルの直前の文字を削除、C-hでカーソルの直前の文字を削除
- コマンド
その他
- Ubuntu18.04とCent8なら、tmuxの設定で、screen-256screenをtmux-256screenにしてもよさそうである。
CentOS7ではtmux-256screen用のterminfoファイルが含まれていない?ために、tmuxを起動した状態でvimを起動するとE437: terminal capability "cm" required
と表示され、表示が崩れる。あせらずに:q
で終了する。 - tmux 3.1から、Backspaceキーで送るキーコードを選べるようになったようだ。sttyが不要になるのかな?
set -s backspace "\177"
のような形で設定できると考えられる(未確認)。
Backspaceで^H
を送りたい時、Decimal 8, Binary 1000, Octal 10, Hexadecimal 0x08 を指定すればよいはず。
Backspaceで^?
を送りたい時、Decimal 127, Binary 1111111, Octal 177, Hexadecimal 0x7F を指定すればよいはず。