VimperatorからVivaldi + cVimに乗り換えた

少し前にVimperatorからVivaldi+cVimに乗り換えて、とりあえず満足している(そして戻る場所もなくなってしまった)ので設定とかの覚書を。

## cVimとは

ブラウザ操作をvimっぽくアレできるChrome extension。

- [cVim - Chromeウェブストア](https://chrome.google.com/webstore/detail/cvim/ihlenndgcmojhcghmfjfneahoeklbjjh)

Vimperatorの代替になりそうなものは色々と試したけれど、これが一番Vimperatorっぽかった印象。

※2020-06-27追記 

cVimは長らくメンテナンスされておらず、ついにChromeウェブストアからのダウンロードもできなくなってしまった。cVimをforkしたプロジェクトとしてvb4cが存在している。現在のところChromeウェブストアからのダウンロードはできず、手動でインストールする必要があるが、cVimに存在していたいくつかの不具合は修正されている。

- [GitHub - dcchambers/vb4c: vb4c - vim bindings for chrome.](https://github.com/dcchambers/vb4c)

※2022-03-09追記

vb4cも既にメンテナンスされていない。現在はSurfingkeysを使用している。

- [cVimからSurfingkeysに乗り換えた - もうカツ丼はいいよな](https://rion778.hatenablog.com/entry/2022/03/08/221353)

追記終

## Vimp代替として求めていたもの

Vimっぽい操作以外に最低限これだけ欲しかった。

- 外部ファイルで設定ができること
- qmark
- 特定サイトでの設定変更
- copy.js的な機能

ChromeじゃなくてVivaldiにしたのはデフォルトでタブを縦に並べられるという程度の理由。

### 設定ファイルの管理

cVimはgist上から設定を読み込めるので楽。ローカルにファイルを置いて読み込むこともできるっぽいけど以前試した時に上手く行かなかったのと、他の端末で設定使いまわす場合を考えるとgistからの読み込みの方が楽だったのでそれ以降試してもいない。

- 設定ファイル: [cvimrc.vim](https://gist.github.com/nozma/c0417ffae4aeff5ff76ba6538e51f76a)

gistの方編集してから実際に読み込めるようになるまでちょっと時間がかかる気はする。

### qmark

設定ファイルを編集しないと追加できないというのは若干面倒。

```vim
let qmark l = ["https://feedly.com/i/latest"]
let qmark m = ["https://mail.google.com/mail/u/0/"]
let qmark M = ["https://moneyforward.com/"]
let qmark t = ["https://twitter.com/"]
let qmark T = ["https://www.tumblr.com/dashboard"]
let qmark B = ["https://bookmeter.com/home"]
let qmark b = ["http://b.hatena.ne.jp/Rion778/hotentry"]
let qmark d = ["http://rion778.hatenablog.com/"]
let qmark g = ["https://gist.github.com"]
let qmark G = ["https://github.com/nozma"]
let qmark c = ["https://gist.github.com/nozma/c0417ffae4aeff5ff76ba6538e51f76a/edit"]
```

### 特定サイトでの設定変更

Vimperatorよりも「どうして設定できない(orできる)のか分からない」ということが無い気がする。

```vim
site 'http://reader.aol.com/*' {
  set numerichints
  unmap j k J K v V
}
site 'https://mail.google.com/*' {
  set numerichints
  unmap j k J K ? x I u n p e v
}
site 'https://paiza.io/*' {
  set numerichints
  iunmap <C-n> <C-p> <C-a> <C-e> <C-f> <C-b> <C-k> <C-y> <C-z> <C-v>
}
site 'https://feedly.com/*' {
  set numerichints
  unmap gm gg ga gl " g*は効かない。Insertモード有効にすると効く。
  unmap j J k K n p v V o m M x s f c
}
```

### copy.js的なコマンド

cf. [vimperatorの代替としてcVim入れてみた - Qiita](https://qiita.com/Jey/items/2bee3597bfc24fc8a1f8)

```vim
" copy.js like command
" yank '%url%'
copyUrl() -> {{
  RUNTIME('getRootUrl', function(url) {
    let ret = url;
    Clipboard.copy(ret);
    Status.setMessage(ret, 2);
  });
}}
map <Leader>u :call copyUrl<CR>

" yank '%title% - %url%'
copyTitleUrl() -> {{
  RUNTIME('getRootUrl', function(url) {
    let ret = document.title + " - " + url;
    Clipboard.copy(ret);
    Status.setMessage(ret, 2);
  });
}}
map <Leader>c :call copyTitleUrl<CR>

" markdown style
copyTitleUrlM() -> {{
  RUNTIME('getRootUrl', function(url) {
    let ret = "[" + document.title + "](" + url + ")";
    Clipboard.copy(ret);
    Status.setMessage(ret, 2);
  });
}}
map <Leader>m :call copyTitleUrlM<CR>

" chatwork style
copyTitleUrlC() -> {{
  RUNTIME('getRootUrl', function(url) {
    let ret = "[info][title]" + document.title + "[/title]" + url + "[/info]";
    Clipboard.copy(ret);
    Status.setMessage(ret, 2);
  });
}}
map <Leader>C :call copyTitleUrlC<CR>
```