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は以下の通り、

  • bmany
    • ブックマークをanythingっぽく操作できる。
  • Builtin command as Ext
    • M-xが使えるようになる
  • github プラグインヘルパー
  • HoK
    • リンクをキーボードから開ける
  • サイトローカル・キーマップ
    • GoogleReaderとかのサイトで一時的にキーマップを無効化できる。
  • Tanything
    • タブをanythingっぽく操作できる。
  • Yet Another Twitter Client KeySnail
    • TwitterClient

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を開く');