Vim上で「Ctrl-h」をLeftにする

### 経緯
- 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の設定状況
- サーバ設定から スクリーン &gt; 制御コード を選択  
  - エスケープシーケンス グループボックスで「67 BSキーでBS(08)を送信 BSキーでDEL(7F)を送信」のチェックを外す。  
    （これにより、Backspaceキーで送信されるコードが```^H```から```^?```に変更される。なおDeleteキーは影響を受けない。）
- サーバ設定から キーボード を選択  
  - 「キーコード」グループボックスで、「新規」ボタンをクリックし、Key Code のドロップダウンリストで ```INSERT```、右側の```Shift```にチェックを入れ、Assign Stringに ```$EDIT_PASTE``` を入力し、OKボタンをクリックする。  
    （これにより、```Shift-INSERT```でペーストできるようになる。よく使うので設定している。）
   - 「Metaキー設定」グループボックスで、「すべてセット」ボタンをクリックする。  
    （これにより、AltがMetaキーとして認識されるようになる。vimのキーバインドで使用するために設定している。）
- サーバ設定から キーボード &gt; キーコード を選択  
  - 「キーコードの変更」グループボックスで、「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がメニューのショートカットキー設定より優先する」にチェックを入れる。  

### (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 を指定すればよいはず。