一人growiでvimのkeymapをやる

少し前に昼食を食べながら調べてたらdevelopper toolのconsoleでCodeMirror.Vim.map(...)をやればできることに気付いてそのままブックマークレットにしたのだが、手元で作業しながらたびたび編集していたら押すのが面倒になってきたのでもうちょっとだけ調べた。

やり方

管理画面のカスタムスクリプトに以下を書く。

window.addEventListener('load', (event) => {
  if (!window.CodeMirror || !CodeMirror.Vim) {
    console.log("[warn] no CodeMirror")
    return
  }

  CodeMirror.Vim.unmap('<Space>');
  CodeMirror.Vim.map('<Space><Space>', 'l');
  CodeMirror.Vim.map('<Space>h', '0');
  CodeMirror.Vim.map('<Space>l', '$');
  CodeMirror.Vim.mapCommand('jk', 'action', 'exitInsertMode', {}, {context: 'insert'});
  // ...好きなだけ
})

これだと全員に適用されるだろ

そんな気がする。今これをやっているgrowiは自分専用のメモなので、これで十分と判断してこれ以上やらなかった。

なんで最初に<Space>unmapしてるの?

手元ではleader<Space>を使っているので、<Space>lとかに$をマップしたかった。 すると、CodeMirrorではデフォルトで<Space>lにマップされているので、<Space>lを全体としてマップすることができない。 なので一度<Space>unmapする。すると、<Space>直後に何かが来るものをマップすることができる。

possible vim leader key work-around? - #4 by benhormann - discuss.CodeMirror

ということがここに書いてあった。

最後の長いの何?

なんか<Esc>にマップしようとしたら上手くいかなかったので直接exitInsertModeに対してマップした。そういうこともできますよというメモ。

初期はjj<Esc>をマップしていたのだけど、何度も連打していると人差し指にそこそこの負荷がかかったので今はjk<Esc>にマップしている。 連打よりも人差し指→中指の方が速いし疲れない。大抵勢い余ってjklと打っているがlは無害なので問題になっていない。

連打よりは文中に登場しそうだが、今のところDijkstra以外で困ったことはない。 Dijkstraの大ファンで毎日感謝の写経1万回をやってる人は別のものにマップした方が良いと思う。

個人用メモにgrowiってオーバースペックじゃない?

そうかも。

ラボではcrowiをオンプレで立ち上げて管理とかしてたので管理も書き方とかも慣れていたというのはある。慣れていたのはcrowiにだけど。 それにgrowiはdocker-composeでやったからcrowiで個別のサービスを管理してたときに苦労したような問題は何一つ起きなかったけど。


ユーザーごとにマッピングを変える場合はどうするべきだろう。 まあ順当に、ユーザーのホーム以下にvimrcみたいなページを用意して、そこにmap x yみたいなのを書かせて、それを取得してパースして実行という形になるだろうか。

load後に使えるappContainerにはcurrentUsernameが入っているので、ユーザーのホーム以下の決まったページへのパスはすぐにとれるはず。 内容の取得はわからないけど、普通は何かしらのAPIがあるんじゃないだろうか。 パースはちゃんとやると面倒だが、map x yだけの簡単なものなら一瞬でできそう。

できそうなんだけど、Web周りに慣れていないので時間がかかりそうだったし、自分しか使ってないので必要性がないためにやらなかった。

うーんWeb関係のことをほとんど何一つやったことがない(古の時代に人が作ったWebサイトに手打ちしたHTMLとかごく簡単なスクリプトを足したりしたくらい)のが地味に色んなところで効いてくる。 ちゃんと勉強した方がいいんだろうけどな。