vimperatorからKeySnailへの移行
やろうやろうとおもっていたけど特に不便でもなかったのでやってなかったvimperatorからKeySnailへの移行を果たしました。
まじでEmacs使っている人ならKeySnailおすすめです。
とりあえずVimpと比較して嬉しかったところは、以下のとおりです。
- Emacsキーバインドがテキスト編集時にフル活用できる。
- Anythingっぽい絞り込み機能がある。
- Yankが使える。
- Pluginマネージャがよく出来ていて、更新が非常に楽!
- 現在設定されているキーバインドが一覧化できる。
移行してまだ2日ぐらいですが、おそらくもうVimpには戻れない体になっています。
というわけで移行時にやったことをめも。
KeySnailのインストール
http://wiki.github.com/mooz/keysnail/keysnail-japaneseからxpiをダウンロードしてFirefoxにドラッグドロップでインストールします。
インストールが終わったら、上部メニューの
ツール→KeySanil→設定ファイルを作成
から新規で設定ファイルを作ります。
Pluginのインストール
プラグインは以下のページにまとめられています。
http://wiki.github.com/mooz/keysnail/plugin
自分が使っているPluginは以下の通り、
Pluginの設定
以下からPluginの説明と使い方を見ることができます。
ツール→KeySnail→プラグインマネージャを開く
だからプラグインマネージャの説明からコピペしたらOKです。
あと以下のtipsページで気になるものがあれば追加します。
(私はSuggestSearchを追加しました。)
http://wiki.github.com/mooz/keysnail/tips-japanese
とりあえず設定を変更したところを載せてみる。
//{{%PRESERVE% //bookmarkを開くときは新規タブで開く //http://d.hatena.ne.jp/mooz/20091213/p1 plugins.options["bmany.default_open_type"] = "tab"; //LocalKeymapの設定 var local = {}; plugins.options["site_local_keymap.local_keymap"] = local; function fake(k, i) function () { key.feed(k, i); }; function pass(k, i) [k, fake(k, i)]; function ignore(k, i) [k, null]; local["^http://www.google.(co.jp|com)/reader/view/"] = [ ["j", null], ["k", null], ["v", null] ]; //tanythinの設定 plugins.options["tanything_opt.keymap"] = { "C-z" : "prompt-toggle-edit-mode", "SPC" : "prompt-next-page", "b" : "prompt-previous-page", "j" : "prompt-next-completion", "k" : "prompt-previous-completion", "g" : "prompt-beginning-of-candidates", "G" : "prompt-end-of-candidates", "D" : "prompt-cancel", // Tanything specific actions "O" : "localOpen", "q" : "localClose", "p" : "localLeftclose", "n" : "localRightclose", "a" : "localAllclose", "d" : "localDomainclose", "c" : "localClipUT", "C" : "localClipU", "e" : "localMovetoend" }; //}}%PRESERVE% //最初から定義されているキーマップを変更 key.setViewKey('C-f', function () { getBrowser().mTabContainer.advanceSelectedTab(1, true); }, 'ひとつ右のタブへ', false); key.setViewKey('C-b', function () { getBrowser().mTabContainer.advanceSelectedTab(-1, true); }, 'ひとつ左のタブへ', false); key.setViewKey('r', function () { BrowserReload(); }, '更新', true); key.setViewKey('h', function () { BrowserBack(); }, '戻る', false); key.setViewKey('l', function () { BrowserForward(); }, '進む', false); //スクロールの幅を変更 key.setViewKey([["C-n"], ["j"]], function (aEvent) { for (var i = 0; i < 5; i ++){ key.generateKey(aEvent.originalTarget, KeyEvent.DOM_VK_DOWN, true); } }, '一行スクロールダウン', false); key.setViewKey([["C-p"], ["k"]], function (aEvent) { for (var i = 0; i < 5; i ++){ key.generateKey(aEvent.originalTarget, KeyEvent.DOM_VK_UP, true); } }, '一行スクロールアップ', false); //.keysnail.jsの末尾 //追加 //suggestSearch key.setViewKey('s', function (ev, arg) { let engines = util.suggest.getEngines(); // If you want to use all available suggest engines, // change suggestEngines value to util.suggest.filterEngines(engines); let suggestEngines = [util.suggest.ss.getEngineByName("Google")]; let collection = engines.map( function (engine) [(engine.iconURI || {spec:""}).spec, engine.name, engine.description] ); prompt.selector( { message : "engine:", collection : collection, flags : [ICON | IGNORE, 0, 0], header : ["Name", "Description"], keymap : { "s" : "prompt-decide", "j" : "prompt-next-completion", "k" : "prompt-previous-completion" }, callback : function (i) { if (i >= 0) util.suggest.searchWithSuggest(engines[i], suggestEngines, "tab"); } }); }, "Search With Suggest", true); //tab key.setViewKey("t", function (ev, arg) { ext.exec("tanything", arg); }, "タブを一覧表示", true); //hit a hint key.setViewKey('f', function (aEvent, aArg) { ext.exec("hok-start-background-mode", aArg); }, 'リンクをバックグラウンドで開く Hit a Hint を開始', true); //フォーカス操作 key.setGlobalKey(['C-c', 'b'], function (ev, arg) { let elem = document.commandDispatcher.focusedElement; if (elem) elem.blur(); gBrowser.focus(); _content.focus(); }, 'コンテンツにフォーカス', true); //C-gを強化 hook.setHook('KeyBoardQuit', function (aEvent) { // キーシーケンス入力中なら無視 if (key.currentKeySequence.length) return; // 検索バーを閉じる command.closeFindBar(); if (util.isCaretEnabled()) { let marked = aEvent.originalTarget.ksMarked; let type = typeof marked; if (type === "number" || type === "boolean" && marked) { // マークされてるときは、マークの解除だけ command.resetMark(aEvent); } else { // それ以外はフォーカスをコンテンツへ let elem = document.commandDispatcher.focusedElement; if (elem) elem.blur(); gBrowser.focus(); _content.focus(); } } else { // テキスト編集してなければ選択の解除だけ goDoCommand("cmd_selectNone"); } // ブラウザ画面なら ESC キーイベントも投げておく if (KeySnail.windowType == "navigator:browser") key.generateKey(aEvent.originalTarget, KeyEvent.DOM_VK_ESCAPE, true); }); key.setViewKey("d", function (ev) { BrowserCloseTabOrWindow(); }, 'タブ / ウィンドウを閉じる', false); //標準のコマンドが聞かないので代替(たぶん自分の環境のせい?)http://gist.github.com/287576 key.setGlobalKey(["C-x", "k"], function (ev) { BrowserCloseTabOrWindow(); }, 'タブ / ウィンドウを閉じる', false); key.setGlobalKey(["C-c", "u"], function (ev) { undoCloseTab(); }, '閉じたタブを元に戻す', false); key.setGlobalKey(["C-x", "C-c"], function (ev) { goQuitApplication(); }, 'Firefox を終了', true); //bookmark http://d.hatena.ne.jp/mooz/20091213/p1 key.setViewKey([':', 'b'], function (ev, arg) { ext.exec("bmany-list-all-bookmarks", arg, ev); }, "bmany - ブックマークを一覧表示"); key.setViewKey([':', 'B'], function (ev, arg) { ext.exec("bmany-list-bookmarklets", arg, ev); }, "bmany - ブックマークレットを一覧表示"); key.setViewKey([':', 'k'], function (ev, arg) { ext.exec("bmany-list-bookmarks-with-keyword", arg, ev); }, "bmany - キーワード付きブックマークを一覧表示"); key.setViewKey('g', function (aEvent) { getBrowser().selectedTab = getBrowser().addTab("http://google.co.jp/reader/view/"); }, 'GoogleReaderを開く');