ビジュアルモードで選択した要素の最後にキャレットを移動する

ブラウザで長い文章を読むとき、読んでるパラグラフなどを選択しながら読む癖があって、vimperator だと c v hjkl でやるわけだが、ずっと選択しっぱなしがイヤなので、ほどほどのところで Esc して選択解除したりする。するとキャレットが選択要素の最初になって、どこまで読んだかわからなくなりキーッとなって、これが相当なストレスであった。

で、なにげに caret-hint.js を読んでたら、こんな感じでやればいいのかとヒントを得た(まさに caret-hint !)ので、次のとおり書いてみた。というか、ほとんど caret-hint.js のパクリだけど。これで c v hjkl で選択していって、適当なところで n すると選択範囲の最後にキャレットが移動して、捗るわー。

mappings.addUserMap(
  [modes.VISUAL],
  ['n'],
  'Move selection tail',
  function () {
    let win = new XPCNativeWrapper(window.content.window);
    let s = win.getSelection();

    if (s.rangeCount <= 0)
       return false;

    let f = [s.focusNode, s.focusOffset];
    s.collapse.apply(s, f);
  }
);

さらに、次を定義すると m したら最後にキャレットが移動した後ビジュアルモードを終えるようになり、n と使い分けるとなかなかいい感じ。

vmap m n<ESC><CR>