Hatena::Groupkeysnail

きすねた(ん)

2011-03-20

KeySnail の prompt で IME を自動的に OFF

| 02:21 | KeySnail の prompt で IME を自動的に OFF - きすねた(ん) を含むブックマーク はてなブックマーク - KeySnail の prompt で IME を自動的に OFF - きすねた(ん)

かなり前からちょくちょくあった要望

以下のようなコードを .keysnail.js の PRESERVE エリアへ.Windows 7 で動作を確認.Mac もおそらく OK.Linux は NG.

style.register(<><![CDATA[
    #keysnail-prompt-textbox *|input {
        ime-mode : inactive !important;
    }
]]></>);

oct inaodu を参考にした.

ちなみにここで出てくる *| というセレクタを知らなかったのだが,Selectors Level 3 を紐解いたところ,名前空間に関するものであることがわかった.以下に引用を.

ns|E

elements with name E in namespace ns

*|E

elements with name E in any namespace, including those without a namespace

|E

elements with name E without a namespace

E

if no default namespace has been declared for selectors, this is equivalent to *|E. Otherwise it is equivalent to ns|E where ns is the default namespace.

一つ賢くなれて良かった.

2011-01-02

サジェスト付き辞書引きコマンド (Urban Dictionary, Goo 辞書)

| 00:58 | サジェスト付き辞書引きコマンド (Urban Dictionary, Goo 辞書) - きすねた(ん) を含むブックマーク はてなブックマーク - サジェスト付き辞書引きコマンド (Urban Dictionary, Goo 辞書) - きすねた(ん)

以前 こういったものを書いたが, やはり辞書引きコマンドにはサジェストが必要だろうと感じたので書き直した.

あと, Goo 辞書だけでは物足りないので Urban Dictionary も加えた. Urban Dictionary かわいいよ Urban Dictionary.

(function () {
    function googleSuggest(word) {
        const domain = "com";
        const base = "http://www.google.%s/complete/search?output=toolbar&q=%s";

        let ep  = util.format(base, domain, encodeURIComponent(word));
        let res = util.httpGet(ep);

        let matched = res.responseText.match("(<toplevel>.*</toplevel>)");

        if (!matched)
            return null;

        let xml = new XML(matched[1]);

        return [cs.suggestion.@data for each (cs in xml.CompleteSuggestion)];
    }

    function googleCompleter(args, extra) {
        let suggestions = googleSuggest(extra.query || "");

        return { collection : suggestions, origin : extra.whole.indexOf(extra.left) };
    }

    shell.add("udic", "Urban dictionary", function (args, extra) {
        const base = "http://www.urbandictionary.com/define.php?term=%s";

        util.setBoolPref("accessibility.browsewithcaret", false);
        gBrowser.loadOneTab(util.format(base, encodeURIComponent(args[0])),
                            null, null, null, extra.bang);
    }, { bang: true, completer: googleCompleter });

    shell.add("goodic", M({ja: "Goo 辞書", en: "Goo dic"}), function (args, extra) {
        const base = "http://dictionary.goo.ne.jp/search.php?MT=%s&kind=all&mode=0&IE=UTF-8";

        util.setBoolPref("accessibility.browsewithcaret", false);
        gBrowser.loadOneTab(util.format(base, encodeURIComponent(args[0])),
                            null, null, null, extra.bang);
    }, { bang: true, completer: googleCompleter });
})();

僕は以下のような感じで m に割り当てています. 便利.

key.defineKey([key.modes.VIEW, key.modes.CARET], 'm', function (ev, arg) {
    shell.input("udic " + (content.getSelection() || ""));
}, 'Lookup the meaning of the word');

追記

Urban dictionary は trim と調べれば pussy と出る, といった具合で色々とアグレッシブなため, m は Goo 辞書で M を Urban dictionary に変更した.

key.defineKey([key.modes.VIEW, key.modes.CARET], 'm', function (ev, arg) {
    shell.input("goodic " + (content.getSelection() || ""));
}, 'Lookup the meaning of the word');

key.defineKey([key.modes.VIEW, key.modes.CARET], 'M', function (ev, arg) {
    shell.input("udic " + (content.getSelection() || ""));
}, 'Lookup the meaning of the word');

KevrelKevrel2011/10/06 12:34Short, sweet, to the point, FREE-exactly as ionfrmation should be!

2010-11-30

Google の検索結果から eFreedom を消す (失敗編)

| 17:39 | Google の検索結果から eFreedom を消す (失敗編) - きすねた(ん) を含むブックマーク はてなブックマーク - Google の検索結果から eFreedom を消す (失敗編) - きすねた(ん)

CSS でやりたかった.

style.register(<><![CDATA[
    @-moz-document
    url-prefix("http://www.google.com/search?"),
    url-prefix("http://www.google.co.jp/search?") {
        a.l[href^="http://ja.efreedom.com"] {
                display : none !important;
            }
        }
]]></>, style.XHTML);

セレクタが欲しいです……

GreaseMonkey

結局グリモンでやってしまった.

no title

2010-11-28

ツリー型タブ導入にあたってタブ移動コマンドを見直す

| 22:28 | ツリー型タブ導入にあたってタブ移動コマンドを見直す - きすねた(ん) を含むブックマーク はてなブックマーク - ツリー型タブ導入にあたってタブ移動コマンドを見直す - きすねた(ん)

ツリー型タブを導入してタブを縦置きにしてみたところ, これまで慣れ親しんできた h, l で左右のタブに移動というキーバインドがセマンティクス的に微妙な感じとなってしまった.

とりあえず, 以下のように設定を行ってしばらく様子を見てみることにする.

key.setViewKey([['l'], ['C-j']], function () {
    gBrowser.mTabContainer.advanceSelectedTab(1, true);
}, 'ひとつ右のタブへ');

key.setViewKey([['h'], ['C-k']], function () {
    gBrowser.mTabContainer.advanceSelectedTab(-1, true);
}, 'ひとつ左のタブへ');

key.setGlobalKey('C-M-j', function () {
    gBrowser.mTabContainer.advanceSelectedTab(1, true);
}, 'ひとつ右のタブへ');

key.setGlobalKey('C-M-k', function () {
    gBrowser.mTabContainer.advanceSelectedTab(-1, true);
}, 'ひとつ左のタブへ');

奇跡的に C-j と C-k が view-mode で空いていたのです.

2010-11-25

Google Instant Preview を消す

| 22:53 | Google Instant Preview を消す - きすねた(ん) を含むブックマーク はてなブックマーク - Google Instant Preview を消す - きすねた(ん)

以下を PRESERVE エリアへ.

style.register(<><![CDATA[
    @-moz-document
    url-prefix("http://www.google.com/search?"),
    url-prefix("http://www.google.co.jp/search?") {
        #vspb, .vspib { display : none !important; }
    }
]]></>, style.XHTML);

選択範囲に含まれるリンクのアドレスをコピー

| 17:28 | 選択範囲に含まれるリンクのアドレスをコピー - きすねた(ん) を含むブックマーク はてなブックマーク - 選択範囲に含まれるリンクのアドレスをコピー - きすねた(ん)

必要に迫られて書いた.

ext.add("copy-selected-links", function () {
    function getRanges(selection) {
        let ranges = [];

        for (let i = 0, rc = selection.rangeCount; i < rc; ++i)
            ranges.push(selection.getRangeAt(i));

        return ranges;
    }

    function getLinks(range) {
        let container = range.commonAncestorContainer;

        return Array.slice(container.querySelectorAll("a[href]"));
    }

    function unique(array) {
        let hash = {__proto__:null};
        
        for (let [, v] in Iterator(array))
            hash[v] = true;

        return [v for ([v] in Iterator(hash))];
    }

    let selection = content.getSelection();
    let links = getRanges(selection)
        .map(getLinks)
        .reduce(function (l, c) l.concat(c))
        .map(function (a) a.href);

    command.setClipboardText(unique(links).join("\n"));
});

a.href とすると絶対パスが返ってきて, a.getAttribute("href") とすると相対パスが返ってくるような雰囲気だった.