Edited at

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

More than 1 year has passed since last update.

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のキーマップを見つけられなかったので知っている方は教えてください。おねがいします。