// ==VimperatorPlugin== // @name BookmarksToolbar-Hint // @description Feature the BookmarksToolbar-Hint // @description-ja ブックマークツールバーのヒント機能を提供 // @version 0.2c // ==/VimperatorPlugin== // // Usage: // // f -> open current tab // F -> open new tab // // Note: is `\' by default // // duaing BookmarksToolbar-Hint, numbering tooltip is appear. // the item of matched number will open when type the number // and remove pending number or backward to parent (at opening a folder) // liberator.plugins.bookmarkToolbarHints = (function(){ if (typeof plugins == 'undefined') plugins = liberator.plugins; // for 2.0 pre function createTooltip(){ var tooltip = document.createElement('tooltip'); tooltip.setAttribute('style','padding:0;margin:0;'); var label = document.createElement('label'); label.setAttribute('value',tooltipbox.childNodes.length+1); label.setAttribute('style','padding:0;margin:0 2px;'); tooltip.appendChild(label); tooltipbox.appendChild(tooltip); return tooltip; } function clearTooltips(){ while (tooltipbox.hasChildNodes()){ tooltipbox.firstChild.hidePopup(); tooltipbox.removeChild(tooltipbox.firstChild); } } function getToolbar() toolbar || (toolbar = document.getElementById('bookmarksBarContent')); function onKeyPress(event){ manager.onEvent(event); event.stopPropagation(); event.preventDefault(); } function updateSelector(){ for (let i=0; i": case "": closeMenus(current); liberator.modules.options.guioptions = this.go; break; case "": case "": if (toolbarOpen(hints[currentNum])) return; break; case "f": this.where = liberator.CURRENT_TAB; return; case "F": case "t": this.where = liberator.NEW_TAB; return; case "": case "j": case "": case "": case "k": case "": if (key == "j" || key == "" || key == ""){ currentNum = hints.length -1 == currentNum ? 0 : currentNum + 1; } else { currentNum = currentNum == 0 ? hints.length -1 : currentNum - 1; } useShift = true; updateSelector(); return; case "l": if (hints[currentNum].getAttribute("container") == "true"){ folderOpen(hints[currentNum]); } return; case "": if (key == "" && currentNum > 0){ currentNum = Math.floor(currentNum / 10); updateSelector(); return; } case "h": if (current == this.toolbar){ closeMenus(current); liberator.modules.options.guioptions = this.go; this.quit(); } else { current.hidePopup(); clearTooltips(); this.show(current.parentNode.parentNode); } return; default: if (/^[0-9]$/.test(key)){ let num = parseInt(key,10); if (!useShift && currentNum) num += currentNum * 10; if (hints.length >= num*10){ currentNum = num - 1; updateSelector(); return; } if (hints[num-1]){ if (toolbarOpen(hints[num-1])) return; } } } liberator.plugins.bookmarkToolbarHints.quit(); }, quit: function(){ currentNum = 0; useShift = false; window.removeEventListener('keypress',onKeyPress,true); liberator.modules.modes.reset(true); while (tooltipbox.hasChildNodes()){ tooltipbox.firstChild.hidePopup(); tooltipbox.removeChild(tooltipbox.firstChild); } } }; var tooltipbox = document.createElement('box'); tooltipbox.setAttribute('id','liberator-tooltip-container'); //document.getElementById('liberator-container').appendChild(tooltipbox); document.getElementById('browser').appendChild(tooltipbox); return manager; })(); liberator.modules.mappings.addUserMap([liberator.modules.modes.NORMAL], ['f'], 'Start Toolbar-HINTS (open current tab)', function(){ liberator.plugins.bookmarkToolbarHints.startup(liberator.CURRENT_TAB); }, { rhs: 'Bookmarks Toolbar-HINTS (current-tab)'} ); liberator.modules.mappings.addUserMap([liberator.modules.modes.NORMAL], ['F'], 'Start Toolbar-HINTS (open new tab)', function(){ liberator.plugins.bookmarkToolbarHints.startup(liberator.NEW_TAB); }, { rhs: 'Bookmarks Toolbar-HINTS (new-tab)' } ); f='#n80'>80 81 82 83 84 85 86 87 88 89 90 91
var PLUGIN_INFO =
<VimperatorPlugin>
<name>{NAME}</name>
<description>History search backward like UNIX shell.</description>
<description lang="ja">UNIX シェルのようなC-rで履歴検索を行うプラグイン</description>
<minVersion>2.0</minVersion>
<maxVersion>2.0</maxVersion>
<updateURL>https://github.com/vimpr/vimperator-plugins/raw/master/history-search-backward.js</updateURL>
<author mail="hotchpotch@gmail.com" homepage="http://d.hatena.ne.jp/secondlife/">Yuichi Tateno</author>
<license>MIT</license>
<version>0.2</version>
<detail><![CDATA[
UNIX シェルのようにコマンドラインで C-r でヒストリ検索を行うプラグインですmap の変更設定は以下のように行えます
>||
liberator.globalVariables.history_search_backward_map = ['<C-r>'];
||<

]]></detail>
</VimperatorPlugin>;

(function() {
    let p = function(msg) {
        Application.console.log(''+msg);
    }

    let evalWithContext = function(func, context) {
        let str;
        let fstr = func.toString();
        if (fstr.indexOf('function () {') == 0) {
            str = fstr.replace(/.*?{([\s\S]+)}.*?/m, "$1");
        } else {
            str = '(' + fstr + ')()';
        }
        return liberator.eval(str, context);
    }

    let showCompletions = function() {
        if (!options.get('wildoptions').has('auto')) {
            evalWithContext(function() {
                completions.complete(true, false);
                completions.itemList.show();
            }, commandline.input);
        }
    }

    let next = function() {
        evalWithContext(function() completions.tab(false), commandline.input);
    }

    let prev = function() {
        evalWithContext(function() completions.tab(true), commandline.input);
    }

    const commandlineWidget = document.getElementById("liberator-commandline");

    mappings.addUserMap([modes.COMMAND_LINE], 
        liberator.globalVariables.history_search_backward_map || ['<C-r>'], 
        'History incremental search backward.', 
        function() 
        {
            if (evalWithContext(function() completions.itemList.visible(), commandline.input)) {
                next();
                return;
            }

            let command = commandline.command || '';
            let completionsList = [[key, i] for ([i, key] in storage['history-command'])].
                                      filter(function([key, i]) key).reverse();

            commandline.input('bck-i-search: ', function(str) {
                try {
                    liberator.execute(str);
                } catch(e) {};
                modes.pop();
                return;
            }, {
                completer: function(context) {
                    context.title = ['CommandLine History', 'INDEX'];
                    context.completions = completionsList;
                },
                onChange: function() {
                    showCompletions();
                },
                default: command,
            });
            showCompletions();
        }
    );
})();