Vim
Jupyter

< Ctrl-h > delete カスタム (jupyter-vim-binding)

Jupyter上でVim操作を扱えるプラグインである jupyter-vim-binding。使われている方も多いと思われます。
しかし、普段VimでInsertモードの状態で一つ前の文字を消したい(Backspace)ときに標準ではJupyter上で機能しません。
(※現在は納入モード中に入力した文字なら<Ctrl-h>で削除できますが、一度挿入モードを抜けるとそれまでに入力していた文字は<Ctrl-h>で消せなくなっています。)
自分はブラウザの機能が動作します。(履歴の表示など)

この症状を解決するためにキーのカスタムをしましたので以下に載せて置きます。

準備

なお、~/.jupyter/custom/のディレクトリが存在しない方は新たに作成してください。

$ mkdir -p ~/.jupyter/custom

コード

そして、~/.jupyter/custom/custom.jsに新たに以下のコードを書きます。

// ~/.jupyter/custom/custom.js

require(
  [
    'nbextensions/vim_binding/vim_binding',
  ],
  function() {
    /***** start *****/
    // 挿入モードで<Ctrl-h>でBackspaceを実行
    CodeMirror.Vim.defineAction('[i]<C-h>', function(cm) {
      // カーソルの位置を{行, 文字数}で返す
      var head = cm.getCursor();
      CodeMirror.Vim.handleKey(cm, '<Esc>');      // Inesrt Modeから出る

      // 現在のカーソルがある行の文字数
      var last = cm.getLine(head.line).length;

      CodeMirror.Vim.handleKey(cm, 'x');          // 最後の行を削除する
      if (head.ch === last){                  // カーソルが最後の文字か
        CodeMirror.Vim.handleKey(cm, 'a');        // 後ろに挿入
      } else {
        CodeMirror.Vim.handleKey(cm, 'i');        // 前に挿入
      }
    });
    CodeMirror.Vim.mapCommand("<C-h>", "action", "[i]<C-h>", {}, { "context": "insert" });
    // ref
    //   https://github.com/lambdalisue/jupyter-vim-binding/wiki/Customization
    /***** end *****/
  }
);

ただ、上のコードでは<Ctrl-h>を実行するたびに一度Escによって挿入モードから出ているので、もし<Ctrl-h>で連続して消してUndo("u")する場合は一文字ずつもどされる。

※ Backspaceのキーマップを見つけられなかったので知っている方は教えてください。おねがいします。