クマーなひとときv2

雑多なメモ。twitterで書ききれないもの等。

Vimperator メモ

いいタイトル思い付かなかった。

今までお世話になったVimperatorも、e10sやWebExtensions対応で、先行きが見えない。
使えなくなる可能性高いし、その前に何か書こうと思ってようやく書き始めた。
始めるのが一番エネルギー必要って聞いた事あるけど、ほんとその通りだと思う。

環境は以下の通り。なお、Firefoxはポータブル版を使用。

Vimperator: 3.15.0 (created: 2016/10/05 01:11:26)
Firefox:  Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0

あと、何故か一部のgifが正常に表示されないんだけど、原因さっぱりなので放置。

この記事について

個人的なVimperatorのメモ。 今までどんな風にVimperatorを使ってきたかを思い出しつつ、自分のrcを見ながら書く。

Vimperatorとは

Firefoxを、Vimのようにキーボードで操作可能にするアドオン。

Vimperator :: Add-ons for Firefox

かなり深い所まで弄っているのか、本当に色んな事が可能
まぁそのせいでWebExtensions対応やe10s対応が大変なんだろうけど。

最初このアドオンを知った時は笑った。Vimmer凄い。

そんな私も、サブブラウザとしてChromeの事を調べる際、
真っ先にVim系のアドオンを探す程度には染まりました。Vimperatorの罪は重い。

特徴

  • 全てキーボードで操作可能になるため、マウスを触る必要がなくなる

    マウス嫌いなので、これ重要。ただし一部例外あり。

  • Vimと同じくモードの概念がある

    Ignore ModeとEmbbed Modeでは、キーボード操作不可になる。
    それ以外ではほぼキーボードのみで操作可能。

モード 状況
Normal Mode ブラウジング中など。
Insert Mode 文字入力中など。
Visual Mode 文字選択中など。
Command Mode コマンドラインで入力中など。
Ignore Mode 一時的にVimperatorを無効化した時など。
Embbed Mode フラッシュに触れた時など。
  • プラグインで拡張可能

    ~/Vimperator/Pluginsとかにプラグインを放り込むと、拡張できる。

    色々な人がプラグインを公開している。今なら、githubvimperator-plugins 辺りを探せば色々と見付かる。

  • 設定ファイルで自由に設定可能

    vimと同じように設定ファイルを作って、自由に設定できる。設定項目も多岐に渡る。
    Vimにこの設定あるけど、Vimperatorにもないかなー」とか考えながら探すと大抵見付かる。

良く使ってた機能

改めてみると、本当に機能が多い。というわけで、自分が使ってた機能から抜粋して書く。
というか、自分のrc見ながら書く。

正直全機能使いこなすなんて無理なので、やりたい事ができた時、その実現方法を調べられれば十分と思う。:helpを読んだり、ググったり。

ただ、一歩踏み込んだ内容を知りたいと思った時、調べても余り出てこない気がする(した)。

Smart Completions

otを押すだけで、ブックマークや履歴を検索し、開く事ができる。

基本中の基本。だけど、最も重要な機能じゃないだろうか。

[f:id:tonkuma:20161218234223g:plain]

Firefox49位のころ、この機能が使えなくなって騒がれてたし、これが使えなくなると、利点が半分は消えそう。

タブ検索

bを押すとタブ一覧が出てくるのほんと好き。他のブラウザも実装して。

[f:id:tonkuma:20161218234311g:plain]

どんなに沢山タブを開いていても、直ぐ探せる。

  • 開きすぎると多分重くなるけど。

色んなコマンド

標準でも数百のコマンドが用意されてる。

全部は流石に使わないけど、以下を知ってるだけでも幸せになれる。

  • :addons: アドオン画面を開く
  • :preferences: Firefoxの設定画面を開く
  • :sbar: サイドバーを開く

ブラウザ設定変更

about:configの内容を変更できる。今だと、e10s周りの設定変更してる。

set! browser.tabs.remote.force-enable=false
set! extensions.e10sBlockedByAddons=true
set! extensions.e10sBlocksEnabling=true

ちなみに、VimFxでは上記フラグを全部逆にするよう設定してる。

Vimperator設定変更

_vimperatorrc.localというファイルを作り、色々とオプションを変更している。

ヒント周り

ヒント文字を変更したり、マッチするXPathを追加している。

set hintchars=asdfglkjhweio
set hinttags&
set hinttags+="| //div[@id or @class] | //img[@id or @class]"
set extendedhinttags&

GUIの設定

タブ以外を消している。スクロールバーも消している。表示領域広くしたいからね。

set gui=noaddons,nomenu,nobookmarks,nonavigation,tabs
set scrollbars=false

メニューは結構使うけど、それはemコマンドでやってる。 入れ子になってるメニューを除けば、大体は操作可能。

f:id:tonkuma:20161218220928g:plain

アドオン追加すると良くTools配下にコマンド増えるので、それ操作する時とか使ってる。

  • AnkPixivToolとか。

次へ/前へリンクの追加

]][[で次へ/前へのリンクを探してくれるが、その探す文字列を追加している。

set nextpattern& nextpattern+='次(へ|の|ぺ)','^続き','^.次へ','>','>','次の\d+件'
set previouspattern& previouspattern+='前(へ|の|ぺ)','^戻る','^.前へ','<','<','前の\d+件'

コマンドラインIMEをoff

どこかからコピペした記憶。

style -name commandline-ime chrome://* #liberator-commandline-command input {ime-mode: inactive;}

VimFxでも似たような事してます。

マッピング

自分の好きな用にキー配置を変更できる。

:map <lhs> <rhs>

<lhs>に割り当てたいキーを、<rhs>に割り当てたい機能や関数やキーを書く。

Normal Mode

スクロール系。

マッピング 機能
nnoremap j <C-d> 半ページ下にスクロール
nnoremap d <C-d> 半ページ下にスクロール
nnoremap k <C-u> 半ページ上にスクロール
nnoremap e <C-d> 半ページ上にスクロール
nnoremap s <C-e> 下スクロール
nnoremap w <C-y> 上スクロール

左手のみで操作すること多いので、その辺増やしたり。
あと、hl等の横スクロールは全て捨ててる。念の為に0$だけ残してる程度。

タブ周り。

マッピング 機能
nnoremap <C-[> <ESC> キャンセル
nnoremap h gT 前のタブに移動
nnoremap l gt 次のタブに移動
nmap << :tabmove! -1<CR> タブを左に移動
nmap << :tabmove! +1<CR> タブを右に移動
nmap gp :set apptab!<CR> タブを固定
nmap gd :tabdetach<CR> タブを別ウィンドウへ移動

:tabdetachはVimFxにも欲しい。

バッファ周り

マッピング 機能
nmap # :buffer#<CR> 直前のタブを開く
nmap B :bmarks<Space> ブックマークを検索

その他色々。

マッピング 機能
map <silent> ! :set invusermode<CR> スタイルシート無効化
nmap <S-i> :pageinfo<CR> ページ情報の表示
nnoremap [panorama] <Nop> タブグループアドオン用
nmap ,l [panorama] タブグループアドオン用
nmap [panorama]a :panorama add タブグループ追加
nmap [panorama]l :panorama list<CR> タブグループ一覧
nmap [panorama]g :panorama pulltab 他のタブを現在のタブグループに移動
nmap [panorama]p :panorama pushtab 今見ているタブを別のタブグループに移動
nmap [panorama]r :panorama remove タブグループの削除
nmap [panorama]s :panorama switch タブグループの移動

他にもあるけど、結構今のバージョンで動かなくなってるの多かった。仕方ないね。

Insert Mode/Command Mode

文字入力中に、vimっぽく操作するために。
Command Modeはcmapで設定。

imap <C-a> <Home>
imap <C-b> <Left>
imap <C-d> <DEL>
imap <C-e> <End>
imap <C-f> <Right>
imap <C-h> <BS>

サイト固有の設定

動画サイトのプレイヤーを操作できるstella.js向けに、youtubeニコニコ動画のみで有効な設定を追加したり。

"for youtube
nmap -urls www\\.youtube\\.com/watch p :stplay<CR>
"for nicovideo
nmap -urls www\\.nicovideo\\.jp/watch p :stplay<CR>

stella.jsお世話になったけど、今も動くのかな。

サイト毎に無視するキーの設定

マッピングとは少し違うけどまぁいいか。

指定されたURLでは、Vimperatorのキー入力を無視する設定。
全部無視されるので、-exceptで、無視したくないキーを指定している。

ignorekeys add 'www\.nicovideo\.jp\/(mylist|watch)\/' -except 'h,J,<C-p>,l,K,<C-n>,j,<C-d>,k,<C-u>,<C-o>,a,o,O,s,u,f,F,t,T,g,G,b,y,;,:,#'

これ逆パターン(無視するキーを指定)があればなぁ…確かissue上がってた気がするけど。

略称名の指定

vimのabbrと一緒。主にtwitter用に、Command Modeで使えるように設定してる。

マッピング 機能
cabbr -j .title buffer.title .titleを、今見ているページのタイトルに変換
cabbr -j .url buffer.URL .urlを、今見ているページのURLに変換
cabbr -j .tau buffer.title + ' ' + buffer.URL 上記二つの合成

クイックブックマーク

正式名称、他にありそうだけど。

特定のページはすぐに移動したいので、qmarkコマンドで設定してる。

qmark t http://twicli.neocat.jp/twicli.html
qmark y http://baseball.yahoo.co.jp/npb/

例えばgnyと打つと、新しいタブでyahooスポーツを開く。

f:id:tonkuma:20161218221102g:plain

自作コマンド

仕事用にチェックボックスを操作するコマンドを作ったり、
URLを置き換える簡単なコマンド作ったり。この辺もe10sだと動かなそう。

command! change :js gBrowser.loadURI(buffer.URI.replace('-hosyu1', '-hosyu2'))
nmap gh :change<CR>

各種プラグインの設定

確認したら、プラグイン26個入れてた。そのうち普段から使うのは半分もないと思う。

caret-hint.js

Visual Modeのキャレットをヒントで選択できるようにする。

let g:caret_hint_key = 'h'
let g:caret_hint_tail_key = 'l'
let g:caret_hint_select_tail_key = 'L'

標準だと少し使いづらいけど、これ入れると任意の場所にキャレット移動できて便利。

mouse_gestures.js

マウスジェスチャを実装する。片手で操作してるとどうしてもカバーしきれない機能とかは、これで定義。

f:id:tonkuma:20161218221156g:plain

multi_requester.js

色々なサイトへの問い合わせ、および、結果の取得を、コマンドライン上で実行する。
凄い便利。主に翻訳系で大活躍。

f:id:tonkuma:20161218221306g:plain

英辞郎google翻訳への問い合わせに使ってました。

copy.js

任意のフォーマットでコピーできるようにする。
Twitterに貼るためだったり、markdown形式でURLコピーしたり。

余りにも便利なので、VimFxでも 同じ機能を作った程。 標準で欲しいレベル。

javascript <<EOM
liberator.globalVariables.copy_templates = [
  { label: 'titleAndURL',    value: '%TITLE%\n%URL%' },
  { label: 'title',          value: '%TITLE%' },
  { label: 'markdown',       value: '[%TITLE%](%URL%)'}
];
EOM

twittperator.js

VimperatorでTwitterする。これも便利。けどtwicliも好き。

f:id:tonkuma:20161218221450g:plain

CSSの設定のせいか、現在のタブが全面表示されてるけど無視の方向で。

hint-yank-paste.js

文字列を直接コピーする。わざわざVisual Modeにならずに済む。

標準だとマッピング被ってるので、テキストのコピーだけ有効にしてた。

js <<EOM
  liberator.globalVariables.hints_copy_maps = ['c', null, null, null];
EOM
let g:hints_copy_maps = "C <nop> <nop> <nop>";

toggler.js

任意の設定値をトグルする。地味に役立つ。

js <<EOM
liberator.globalVariables.toggler = {
  gui_navi: ["set gui=nonavigation","set gui=navigation"],
  gui_tab: ["set gui=notabs","set gui=tabs"], 
};
EOM

タブやURLバーの表示/非表示を切り替えられるよう設定してる。

最後に

どう書くか思い付かなかったので、自分の設定の一部をだらだらと書いた。
Vimperator機能多すぎィ!

けれども、vimが好きな人にとって、本当に素晴らしいアドオンと思う。
既にVimFxに移行してしまったけど、Vimperatorの事は忘れない*1

もし、vimが好きな人で、Vimperatorって何?という人がいたら、一度使ってみるといい。
きっと世界が変わる。

幸い、現在の安定板(Firefox50.1)では、まだVimperatorは動作するし、 Vimperatorの素晴らしさを体験するには、今が最後のチャンスかもしれない。

なお、VimFxの記事は、シアトリズム逆転裁判6で消えました。年内には書く予定。という名の未定。

*1:まだ生きてるけど、風前の灯っぽいのでこう書く