背景
Obsidianというメモアプリがすばらしい。
- デフォルト機能で、Vimキーバインドにもできる
- サードパーティプラグイン「Obsidian Vimrc Support」をつかって、キーマップをカスタマイズもできる
ところが、個人的な好みで、挿入モードで<C-d>
は右一文字削除
にしたいのだが、これだけがうまく設定できなくて困っていた。
Vimrc Supportプラグインの作者に相談すると「CodeMirrorのバグだとおもうから、バグレポートするといいとおもうよ」とのことだけど(いちおうレポートはしたけど)、バグフィクスを待ってるのもやだ。
対応
サードパーティプラグインのmain.js
に一行追加する(場所はVAULT_ROOT/.obsidian/plugins/obsidian-vimrc-support/main.js
)
(前略)
// Make sure that we load it just once per CodeMirror instance.
// This is supposed to work because the Vim state is kept at the keymap level, hopefully
// there will not be bugs caused by operations that are kept at the object level instead
CodeMirror.Vim.unmap('<C-d>', 'insert'); // ←ココ
//
CodeMirror.Vim.loadedVimrc = true;
(後略)
けっしてきれいな対応ではない(プラグインがアップデートするたびに、追記しなければならない)けれど、いまのところ確実に動く。
- どこかほかに書くとよいのだとおもうが……だれかヘルプ……
やったけどうまくいかなかったこと
.obsidian.vimrc
に下記を書くのではうまく行かなかった。
imap <C-d> <Del>
→ <Del>
はnormalモードのx
にマッピングされているから
unmap <C-d>
→ normalモードでのScrollDown
は消えるが、insertモードのindentRight
は残る。CodeMirror
でのバグだとおもわれる
Obsidianで:imap <C-d> <C-d>
とやってうまくいくこともあったが、console
を見ていると、キーマップが解釈できずにスタックを使い果たし、困ってデフォルト動作をするようになっているように見えた。再現性も低いし、Obsidianに負担もかけているようなので、この方法は却下。
リソース(リンク)
jk
を<Esc>
にというイシューを手がかりにしてすすめた
https://github.com/codemirror/CodeMirror/issues/6386
CodeMirror
のキーマップ定義ファイル
https://codemirror.net/keymap/vim.js
CodeMirror
のイシューにも上げてみた
https://github.com/codemirror/CodeMirror/issues/6535
CodeMirror
のオンラインデモ
https://codemirror.net/demo/vim.html
CodeMirror
のマニュアル
https://codemirror.net/doc/manual.html
環境
Obsidian Vimrc Support version 0.2.1
Obsidian v0.10.1
macOS BigSur バージョン 11.0.1
MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
後日談
もう少しちゃんとコードを書いて、プラグインにマージしていただいた。
⇒ Obsidianの問題の解決を少し前に進めた