1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

経緯

  • Vimにおいて、カーソル移動のために、Ctrl-H,J,K,L<Left>,<Down>,<Up>,<Right>にマッピングしたい。
    しかし、デフォルトの設定では BackspaceCtrl-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キーは影響を受けない。)
  • サーバ設定から キーボード を選択
    • 「キーコード」グループボックスで、「新規」ボタンをクリックし、Key Code のドロップダウンリストで INSERT、右側のShiftにチェックを入れ、Assign Stringに $EDIT_PASTE を入力し、OKボタンをクリックする。
      (これにより、Shift-INSERTでペーストできるようになる。よく使うので設定している。)
    • 「Metaキー設定」グループボックスで、「すべてセット」ボタンをクリックする。
      (これにより、AltがMetaキーとして認識されるようになる。vimのキーバインドで使用するために設定している。)
  • サーバ設定から キーボード > キーコード を選択
    • 「キーコードの変更」グループボックスで、「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 $TERMxterm が表示されることを確認する。
    • コマンド$ toe -a | grep "^xterm " で情報が表示されることを確認する。
    • コマンド$ infocmp xterm で情報が表示されることを確認する。
    • vim のキーバインドを確認する。
      ノーマルモードにて BackSpaceでカーソルを左に移動、C-hでカーソルを左に移動
      インサートモードにて BackSpaceでカーソル直前の文字を削除、C-hでカーソルを左に移動
      コマンドモードにて BackSpaceでカーソル直前の文字を削除、C-hでカーソルを左に移動
  • tmuxを起動した状況で
    • コマンド$ stty -a の表示が erase = ^?; を含む。
    • コマンド$ echo $TERMscreen-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 を指定すればよいはず。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?