xhlslan
小狐狸
小狐狸
  • UID33375
  • 注册日期2010-07-10
  • 最后登录2024-04-26
  • 发帖数88
  • 经验66枚
  • 威望0点
  • 贡献值26点
  • 好评度5点
  • 社区居民
  • 忠实会员
阅读:1233回复:10

【已解决】KeyChanger.uc.js在116不能用了,求续命啊

楼主#
更多 发布于:2023-08-02 14:40
// ==UserScript==
// @name           KeyChanger.uc.js
// @author         Griever
// @namespace      http://d.hatena.ne.jp/Griever/
// @include        main
// @description    为火狐添额外的快捷键
// @license        MIT License
// @charset        UTF-8
// @version        2019.09.18.1
// @note           0.0.2 メニューを右クリックで設定ファイルを開けるようにした
// @note           0.0.2 Meta キーを装飾キーに使えるようになったかもしれない(未テスト)
// @note           0.0.2 Windows キーを装飾キーに使えるようになったかもしれない(未テスト Firefox 17 以降)
// @note           2018.1.25.2 Firefox59+ 修复
// ==/UserScript==

location.href.startsWith('chrome://browser/content/browser.x') && (function () {
    var useScraptchpad = true;  // 如果不存在编辑器,则使用代码片段速记器,否则设置编辑器路径
    //let {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
    window.KeyChanger = {
        get file() {
            var aFile = FileUtils.getFile("UChrm", ["local", "_keychanger.js"], false);
            if (!aFile.exists()) {
                saveFile(aFile, '');
                alert('_keychanger配置为空,该文件在local目录下');
            }
            delete this.file;
            return this.file = aFile;
        },
        get FILE() {
            return this.file;
        },
        isBuilding: false,
        makeKeyset: function (isAlert) {
            KeyChanger.isBuilding = true;
            var s = new Date();
            var keys = this.makeKeys();
            if (!keys) {
                isBuilding = false;
                return this.alert('KeyChanger', 'Load error.');
            }
            var keyset = document.getElementById('keychanger-keyset');
            if (keyset)
                keyset.parentNode.removeChild(keyset);
            keyset = document.createXULElement('keyset');
            keyset.setAttribute('id', 'keychanger-keyset');
            keyset.appendChild(keys);

            var df = document.createDocumentFragment();
            Array.prototype.slice(document.getElementsByTagName('keyset')).forEach(function (elem) {
                df.appendChild(elem);
            });
            var insPos = document.getElementById('mainPopupSet');
            insPos.parentNode.insertBefore(keyset, insPos);
            insPos.parentNode.insertBefore(df, insPos);
            var e = new Date() - s;
            if (isAlert) {
                this.alert('KeyChanger: Loaded', e + 'ms');
            }
            setTimeout(function () {
                KeyChanger.isBuilding = false;
            }, 100);

        },
        makeKeys: function () {
            var str = this.loadText(this.file);
            if (!str)
                return null;

            var sandbox = new Components.utils.Sandbox(new XPCNativeWrapper(window));
            var keys = Components.utils.evalInSandbox('var keys = {};\n' + str + ';\nkeys;', sandbox);
            if (!keys)
                return null;
            var dFrag = document.createDocumentFragment();

            Object.keys(keys).forEach(function (n) {
                let keyString = n.toUpperCase().split("+");
                let modifiers = "", key, keycode, k;

                for (let i = 0, l = keyString.length; i < l; i++) {
                    k = keyString;
                    switch (k) {
                        case "CTRL":
                        case "CONTROL":
                        case "ACCEL":
                            modifiers += "accel,";
                            break;
                        case "SHIFT":
                            modifiers += "shift,";
                            break;
                        case "ALT":
                        case "OPTION":
                            modifiers += "alt,";
                            break;
                        case "META":
                        case "COMMAND":
                            modifiers += "meta,";
                            break;
                        case "OS":
                        case "WIN":
                        case "WINDOWS":
                        case "HYPER":
                        case "SUPER":
                            modifiers += "os,";
                            break;
                        case "":
                            key = "+";
                            break;
                        case "BACKSPACE":
                        case "BKSP":
                        case "BS":
                            keycode = "VK_BACK";
                            break;
                        case "RET":
                        case "ENTER":
                            keycode = "VK_RETURN";
                            break;
                        case "ESC":
                            keycode = "VK_ESCAPE";
                            break;
                        case "PAGEUP":
                        case "PAGE UP":
                        case "PGUP":
                        case "PUP":
                            keycode = "VK_PAGE_UP";
                            break;
                        case "PAGEDOWN":
                        case "PAGE DOWN":
                        case "PGDN":
                        case "PDN":
                            keycode = "VK_PAGE_DOWN";
                            break;
                        case "TOP":
                            keycode = "VK_UP";
                            break;
                        case "BOTTOM":
                            keycode = "VK_DOWN";
                            break;
                        case "INS":
                            keycode = "VK_INSERT";
                            break;
                        case "DEL":
                            keycode = "VK_DELETE";
                            break;
                        default:
                            if (k.length === 1) {
                                key = k;
                            } else if (k.indexOf("VK_") === -1) {
                                keycode = "VK_" + k;
                            } else {
                                keycode = k;
                            }
                            break;
                    }
                }
                let elem = document.createXULElement('key');
                if (modifiers !== '')
                    elem.setAttribute('modifiers', modifiers.slice(0, -1));
                if (key)
                    elem.setAttribute('key', key);
                else if (keycode)
                    elem.setAttribute('keycode', keycode);

                let cmd = keys[n];
                switch (typeof cmd) {
                    case 'function':
                        elem.setAttribute('oncommand', '(' + cmd.toString() + ').call(this, event);');
                        break;
                    case 'object':
                        Object.keys(cmd).forEach(function (a) {
                            elem.setAttribute(a, cmd[a]);
                        }, this);
                        break;
                    default:
                        elem.setAttribute('oncommand', cmd);
                }
                dFrag.appendChild(elem);
            }, this);
            return dFrag;
        },
        createMenuitem: function () {
            var menuitem = document.createXULElement('menuitem');
            menuitem.setAttribute('id', 'toolsbar_KeyChanger_rebuild');
            menuitem.setAttribute('label', '自定义快捷键');
            menuitem.setAttribute('tooltiptext', '左键:重载配置\n右键:编辑配置');
            menuitem.setAttribute('oncommand', 'setTimeout(function(){ KeyChanger.makeKeyset(true); }, 10);');
            menuitem.setAttribute('onclick', 'if (event.button == 2) { event.preventDefault();KeyChanger.edit(KeyChanger.file); }');
            var insPos = document.getElementById('devToolsSeparator');
            insPos.parentNode.insertBefore(menuitem, insPos);
        },
        loadText: function (aFile) {
            var fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
            var sstream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
            fstream.init(aFile, -1, 0, 0);
            sstream.init(fstream);

            var data = sstream.read(sstream.available());
            try {
                data = decodeURIComponent(escape(data));
            } catch (e) {
            }
            sstream.close();
            fstream.close();
            return data;
        },
        alert: function (aMsg, aTitle, aCallback) {
            var callback = aCallback ? {
                observe: function (subject, topic, data) {
                    if ("alertclickcallback" != topic)
                        return;
                    aCallback.call(null);
                }
            } : null;
            var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
            alertsService.showAlertNotification(
                "chrome://global/skin/icons/information-32.png", aTitle || "addMenu",
                aMsg + "", !!callback, "", callback);
        },
        edit: function (aFile, aLineNumber) {
            if (KeyChanger.isBuilding) return;
            if (!aFile || !aFile.exists() || !aFile.isFile()) return;

            var editor;
            try {
                editor = Services.prefs.getComplexValue("view_source.editor.path", Ci.nsIFile);
            } catch (e) {
            }

            if (!editor || !editor.exists()) {
                if (useScraptchpad) {
                    this.openScriptInScratchpad(window, aFile);
                    return;
                } else {
                    alert("请先设置编辑器的路径!!!");
                    var fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker);
                    fp.init(window, "设置全局脚本编辑器", fp.modeOpen);
                    fp.appendFilter("执行文件", "*.exe");
                    if (fp.show() == fp.returnCancel || !fp.file)
                        return;
                    else {
                        editor = fp.file;
                        Services.prefs.setCharPref("view_source.editor.path", editor.path);
                    }
                }
            }

            // 调用自带的
            if(typeof(userChrome) == 'undefined') {    
                this.openScriptInScratchpad(window, aFile);
                return;
            } else {            
            var aURL = userChrome.getURLSpecFromFile(aFile);
            var aDocument = null;
            var aCallBack = null;
            var aPageDescriptor = null;
            gViewSourceUtils.openInExternalEditor({
                URL: aURL,
                lineNumber: aLineNumber
            }, aPageDescriptor, aDocument, aLineNumber, aCallBack);    
            }

        },
        openScriptInScratchpad: function (parentWindow, file) {
            let spWin = window.openDialog("chrome://devtools/content/scratchpad/index.xul", "Toolkit:Scratchpad", "chrome,resizable=yes,centerscreen,dependent");

            spWin.addEventListener("load", function spWinLoaded() {
                spWin.removeEventListener("load", spWinLoaded, false);

                let Scratchpad = spWin.Scratchpad;
                Scratchpad.setFilename(file.path);
                Scratchpad.addObserver({
                    onReady: function () {
                        Scratchpad.removeObserver(this);
                        Scratchpad.importFromFile.call(Scratchpad, file);
                    }
                });
            }, false);
        },
        exec: function (path, arg) {
            var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
            var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
            try {
                var a = (typeof arg == 'string' || arg instanceof String) ? arg.split(/\s+/) : [arg];
                file.initWithPath(path);
                process.init(file);
                process.run(false, a, a.length);
            } catch (e) {
                this.log(e);
            }
        },
        log: function () {
            Services.console.logStringMessage("[KeyChanger] " + Array.prototype.slice(arguments));
        },
    };

    window.KeyChanger.createMenuitem();
    window.KeyChanger.makeKeyset();

})();
xhlslan
小狐狸
小狐狸
  • UID33375
  • 注册日期2010-07-10
  • 最后登录2024-04-26
  • 发帖数88
  • 经验66枚
  • 威望0点
  • 贡献值26点
  • 好评度5点
  • 社区居民
  • 忠实会员
1楼#
发布于:2023-08-02 14:42
这个是_keychanger.js文件


          //一键打开新标签页
keys[1] = "BrowserOpenTab();";

          //一键打开指定网址
keys[2] = function() {gBrowser.selectedTab=gBrowser.addTrustedTab("https://bbs.deepin.org/", {triggeringPrincipal: gBrowser.contentPrincipal});};
keys[3] = function() {gBrowser.selectedTab=gBrowser.addTrustedTab("https://www.pcbeta.com/", {triggeringPrincipal: gBrowser.contentPrincipal});};
keys[4] = function() {gBrowser.selectedTab=gBrowser.addTrustedTab("https://www.itsk.com/", {triggeringPrincipal: gBrowser.contentPrincipal});};
keys[5] = function() {gBrowser.selectedTab=gBrowser.addTrustedTab("https://www.firefox.net.cn/", {triggeringPrincipal: gBrowser.contentPrincipal});};

          //一键打开标签组
keys[6] = function(){var newtabs=["https://www.pconline.com.cn/",
                                  "https://bbs.kafan.cn/forum-215-1.html",
 "https://www.163.com/",
 "https://www.autohome.com.cn/",
 "https://www.douyu.com/directory/myFollow"]
;var i=0;while(i<=newtabs.length-1){gBrowser.selectedTab=gBrowser.addTrustedTab(newtabs);i=i+1;}};
keys[7] = function() {gBrowser.selectedTab=gBrowser.addTrustedTab("https://bbs.deepin.org/", {triggeringPrincipal: gBrowser.contentPrincipal});};
keys[8] = function() {gBrowser.selectedTab=gBrowser.addTrustedTab("https://www.pcbeta.com/", {triggeringPrincipal: gBrowser.contentPrincipal});};
keys[9] = function() {gBrowser.selectedTab=gBrowser.addTrustedTab("https://tellme.pw/avmoo", {triggeringPrincipal: gBrowser.contentPrincipal});};

 //启用翻译功能
//keys['F1'] = function() {gBrowser.loadURI("javascript:{d=document;b=d.body;o=d.createElement('scri'+'pt');o.setAttribute('src','https://translate.google.cn/translate_a/element.js?cb=googleTranslateElementInit');o.setAttribute('type','text/javascript');b.appendChild(o);v=b.insertBefore(d.createElement('div'),b.firstChild);v.id='google_translate_element';v.style.display='none';p=d.createElement('scri'+'pt');p.text='function%20googleTranslateElementInit(){new%20google.translate.TranslateElement({pageLanguage:%22%22},%22google_translate_element%22);}';p.setAttribute('type','text/javascript');b.appendChild(p);}void%200", {triggeringPrincipal: gBrowser.contentPrincipal});}; //启用翻译功能

          //复制当前标签页
keys['F2'] = "duplicateTabIn(gBrowser.selectedTab, 'tab')";

          //查看页面信息
//keys['F3'] = "gContextMenu.viewInfo();";

          //关闭当前标签声音
keys['F4'] = "gBrowser.selectedTab.toggleMuteAudio()";

          //查看页面信息
keys['a'] = function(ev) {BrowserPageInfo();};

          //关闭当前页
keys['f'] = "gBrowser.removeCurrentTab();";

          //复制当前页的URL
keys['c'] = function() { var gClipboardHelper = Components.classes['@mozilla.org/widget/clipboardhelper;1'].getService(Components.interfaces.nsIClipboardHelper);gClipboardHelper.copyString(gBrowser.currentURI.spec); };

          //重启浏览器
keys['d'] = "Services.startup.quit(Services.startup.eAttemptQuit | Services.startup.eRestart);";

          //新建标签页并光标定位到地址栏
keys['y'] = function() { document.getElementById("cmd_newNavigatorTab").doCommand();};

          //刷新当前页
keys['t'] = function(ev) {gBrowser.selectedBrowser.reload()};

          //跳过缓存刷新标签页
keys['alt+t'] = function(ev) {BrowserReloadSkipCache()};

          //激活左边标签页
keys['q'] = function(ev) {gBrowser.tabContainer.advanceSelectedTab(-1, true)};

          //激活右边标签页
keys['e'] = function(ev) {gBrowser.tabContainer.advanceSelectedTab(+1, true)};

          //打开profile
keys['j'] = function(ev) {Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile).launch();};

          //打开chrome
keys['k'] = function(ev) {Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("UChrm", Components.interfaces.nsIFile).reveal();};

          //转到页首
//keys['j'] = function(ev) {goDoCommand('cmd_scrollTop')};

          //转到页尾
//keys['k'] = function(ev) {goDoCommand('cmd_scrollBottom')};

          //谷歌站内搜索
keys['g'] = "var s = prompt('谷歌站内搜索:', '');if (s.length > 0) gBrowser.addTrustedTab('https://www.google.com/search?q=site:' + encodeURIComponent( gBrowser.currentURI.host) + ' ' + encodeURIComponent(s));";//Google站内搜索

          //百度站内搜索
keys['b'] = "var s = prompt('百度站内搜索:', '');if (s.length > 0) gBrowser.addTrustedTab('https://www.baidu.com/s?wd=site:' + encodeURIComponent( gBrowser.currentURI.host) + ' ' + encodeURIComponent(s));";//Baidu站内搜索

          //切换窗口大小
keys['h'] = function () { if (window.windowState === 1) {restore();} else if (window.windowState === 2) {restore();} else if (window.windowState === 3) {maximize();}
else if (window.windowState === 4) {restore();} else {} };

          //稍后阅读标记/去除标记
keys['m'] = 'document.getElementById("pageAction-urlbar-_cd7e22de-2e34-40f0-aeff-cec824cbccac_").click();'

          //打开设置选项
keys['o'] = "openPreferences();";

          //隐私窗口
keys['p'] = "OpenBrowserWindow({private: true});";

          //恢复关闭的标签
keys['r'] = "undoCloseTab();";

          //聚焦到搜索栏
//keys['s'] = "BrowserSearch.webSearch();";

          //降低页面亮度
keys['n'] = function() {
              gBrowser.loadURI("javascript:(function(){var%20night=function(w){(function(d){var%20css='html{opacity:0.7!important;background:black!important;}body{background:white!important;}';var%20s=d.getElementsByTagName('style');for(var%20i=0,si;si=s;i++){if(si.innerHTML==css){si.parentNode.removeChild(si);return}};var%20heads=d.getElementsByTagName('head');if(heads.length){var%20node=d.createElement('style');node.type='text/css';node.appendChild(d.createTextNode(css));heads[0].appendChild(node)}})(w.document);%20for(var%20i=0,f;f=w.frames;i++){try{arguments.callee(f)}catch(e){}}};night(window)})();", {triggeringPrincipal: gBrowser.contentPrincipal});
              };

          //前进
keys['x'] = "gBrowser.webNavigation.canGoForward && gBrowser.webNavigation.goForward();";

          //后退
keys['z'] = "gBrowser.webNavigation.canGoBack && gBrowser.webNavigation.goBack();";

          //打开剪切板地址
keys['v'] = function() {gBrowser.selectedTab = gBrowser.addTrustedTab(readFromClipboard());};

          //开关书签工具栏
keys['s'] = function(event) {var bar = document.getElementById("PersonalToolbar"); setToolbarVisibility(bar, bar.collapsed);};
york144122
小狐狸
小狐狸
  • UID29172
  • 注册日期2009-06-15
  • 最后登录2023-08-04
  • 发帖数32
  • 经验18枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
2楼#
发布于:2023-08-04 18:10
get file() {
}

这个方法里 FileUtils 不能用了,换成

        const ds = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties);
        const file = ds.get("UChrm", Components.interfaces.nsIFile);
        file.append("_keychanger.js"); // 这里改成你的配置文件的路径即可。
xhlslan
小狐狸
小狐狸
  • UID33375
  • 注册日期2010-07-10
  • 最后登录2024-04-26
  • 发帖数88
  • 经验66枚
  • 威望0点
  • 贡献值26点
  • 好评度5点
  • 社区居民
  • 忠实会员
3楼#
发布于:2023-08-05 20:12
york144122:get file() {
}

这个方法里 FileUtils 不能用了,换成

        const ds = Components.classes["@mozilla.org/file/directory_service;1"]....
回到原帖
谢谢大佬,能再详细一下就好了,我弄到现在也没有搞好
xhlslan
小狐狸
小狐狸
  • UID33375
  • 注册日期2010-07-10
  • 最后登录2024-04-26
  • 发帖数88
  • 经验66枚
  • 威望0点
  • 贡献值26点
  • 好评度5点
  • 社区居民
  • 忠实会员
4楼#
发布于:2023-09-02 13:13
在奶酪定制版找来的
// ==UserScript==
// @name           KeyChanger.uc.js
// @author         Griever
// @namespace      http://d.hatena.ne.jp/Griever/
// @include        main
// @description    快捷键配置脚本
// @description:en Additional shortcuts for Firefox
// @license        MIT License
// @charset        UTF-8
// @version        2022.11.27
// @note           2022.11.27 修复 gBrowser
// @note           2022.06.03 新增 getSelctionText(),修增 saveFile 不存在
// @note           0.0.2 メニューを右クリックで設定ファイルを開けるようにした
// @note           0.0.2 Meta キーを装飾キーに使えるようになったかもしれない(未テスト)
// @note           0.0.2 Windows キーを装飾キーに使えるようになったかもしれない(未テスト Firefox 17 以降)
// @note           2018.1.25.2 Firefox59+ 修复
// ==/UserScript==

location.href.startsWith("chrome://browser/content/browser.x") && (function () {
    var useScraptchpad = true;  // If the editor does not exist, use the code snippet shorthand, otherwise set the editor path
    //let {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;

    const INTERNAL_MAP = {
        tab: {
            close: {
                current: function () {
                    gBrowser.removeTab(gBrowser.selectedTab);
                },
                all: function () {
                    gBrowser.removeTabs(gBrowser.tabs);
                },
                other: function () {
                    gBrowser.removeAllTabsBut(gBrowser.selectedTab);
                }
            },
            pin: {
                current: function () {
                    gBrowser.pinTab(gBrowser.selectedTab);
                },
                all: function (event) {
                    gBrowser.tabs.forEach(t => gBrowser.pinTab(t));
                },
            },
            unpin: {
                current: function () {
                    gBrowser.unpinTab(gBrowser.selectedTab);
                },
                all: function (event) {
                    gBrowser.tabs.forEach(t => gBrowser.unpinTab(t));
                },
            },
            "toggle-pin": {
                current: function () {
                    if (gBrowser.selectedTab.pinned)
                        gBrowser.unpinTab(gBrowser.selectedTab);
                    else
                        gBrowser.pinTab(gBrowser.selectedTab);
                },
                all: function (event) {
                },
            },
            prev: function () {
                gBrowser.tabContainer.advanceSelectedTab(-1, true);
            },
            next: function () {
                gBrowser.tabContainer.advanceSelectedTab(1, true);
            },
            duplicate: function () {
                duplicateTabIn(gBrowser.selectedTab, 'tab');
            }
        }
    }

    window.KeyChanger = {
        get appVersion() {
            return Services.appinfo.version.split(".")[0];
        },
        get FILE() {
            delete this.FILE;
            try {
                path = this.prefs.getStringPref("FILE_PATH")
            } catch (e) {
                path = 'local\\_keychanger.js';
            }
            aFile = Services.dirsvc.get("UChrm", Ci.nsIFile);
            aFile.appendRelativePath(path);
            if (!aFile.exists()) {
                saveFile(aFile, '');
                alert('_keychanger.js 配置为空');
            }
            return this.FILE = aFile;
        },
        get prefs() {
            delete this.prefs;
            return this.prefs = Services.prefs.getBranch("keyChanger.")
        },
        isBuilding: false,
        _selectedText: "",
        KEYSETID: "keychanger-keyset",
        addEventListener: function () {
            (gBrowser.mPanelContainer || gBrowser.tabpanels).addEventListener("mouseup", this, false);
        },
        handleEvent: function (event) {
            switch (event.type) {
                case 'mouseup':
                    try {
                        gBrowser.selectedBrowser.finder.getInitialSelection().then((r) => {
                            this.setSelectedText(r.selectedText);
                        })
                    } catch (e) { }
                    break;
            }
        },
        getSelectedText: function () {
            return this._selectedText || "";
        },
        setSelectedText: function (text) {
            this._selectedText = text;
        },
        makeKeyset: function (isAlert) {
            this.isBuilding = true;
            var s = new Date();
            var keys = this.makeKeys();
            if (!keys) {
                this.isBuilding = false;
                return this.alert('KeyChanger', 'Load error.');
            }
            $R(document.getElementById(this.KEYSETID)); // 删除 KeySet
            let keyset = $C(document, "keyset", {
                id: this.KEYSETID
            })
            keyset.appendChild(keys);

            var df = document.createDocumentFragment();
            Array.prototype.slice.call(document.getElementsByTagName('keyset')).forEach(function (elem) {
                df.appendChild(elem);
            });
            var insPos = document.getElementById('mainPopupSet');
            insPos.parentNode.insertBefore(keyset, insPos);
            insPos.parentNode.insertBefore(df, insPos);
            var e = new Date() - s;
            if (isAlert) {
                this.alert('KeyChanger: Loaded', e + 'ms');
            }
            setTimeout(function () {
                KeyChanger.isBuilding = false;
            }, 100);

        },
        makeKeys: function () {
            var str = loadText(this.FILE);
            if (!str)
                return null;

            var sandbox = new Components.utils.Sandbox(new XPCNativeWrapper(window));
            var keys = Components.utils.evalInSandbox('var keys = {};\n' + str + ';\nkeys;', sandbox);
            if (!keys)
                return null;
            var dFrag = document.createDocumentFragment();

            Object.keys(keys).forEach(function (n) {
                let keyString = n.toUpperCase().split("+");
                let modifiers = "", key, keycode, k;

                for (let i = 0, l = keyString.length; i < l; i++) {
                    k = keyString;
                    switch (k) {
                        case "CTRL":
                        case "CONTROL":
                        case "ACCEL":
                            modifiers += "accel,";
                            break;
                        case "SHIFT":
                            modifiers += "shift,";
                            break;
                        case "ALT":
                        case "OPTION":
                            modifiers += "alt,";
                            break;
                        case "META":
                        case "COMMAND":
                            modifiers += "meta,";
                            break;
                        case "OS":
                        case "WIN":
                        case "WINDOWS":
                        case "HYPER":
                        case "SUPER":
                            modifiers += "os,";
                            break;
                        case "":
                            key = "+";
                            break;
                        case "BACKSPACE":
                        case "BKSP":
                        case "BS":
                            keycode = "VK_BACK";
                            break;
                        case "RET":
                        case "ENTER":
                            keycode = "VK_RETURN";
                            break;
                        case "ESC":
                            keycode = "VK_ESCAPE";
                            break;
                        case "PAGEUP":
                        case "PAGE UP":
                        case "PGUP":
                        case "PUP":
                            keycode = "VK_PAGE_UP";
                            break;
                        case "PAGEDOWN":
                        case "PAGE DOWN":
                        case "PGDN":
                        case "PDN":
                            keycode = "VK_PAGE_DOWN";
                            break;
                        case "TOP":
                            keycode = "VK_UP";
                            break;
                        case "BOTTOM":
                            keycode = "VK_DOWN";
                            break;
                        case "INS":
                            keycode = "VK_INSERT";
                            break;
                        case "DEL":
                            keycode = "VK_DELETE";
                            break;
                        default:
                            if (k.length === 1) {
                                key = k;
                            } else if (k.indexOf("VK_") === -1) {
                                keycode = "VK_" + k;
                            } else {
                                keycode = k;
                            }
                            break;
                    }
                }
                let elem = document.createXULElement('key');
                if (modifiers !== '')
                    elem.setAttribute('modifiers', modifiers.slice(0, -1));
                if (key)
                    elem.setAttribute('key', key);
                else if (keycode)
                    elem.setAttribute('keycode', keycode);

                let cmd = keys[n];
                switch (typeof cmd) {
                    case 'function':
                        elem.setAttribute('oncommand', '(' + cmd.toString() + ').call(this, event);');
                        break;
                    case 'object':
                        Object.keys(cmd).forEach(function (a) {
                            if (a === 'oncommand' && cmd[a] === "internal")
                                cmd[a] = "KeyChanger.internalCommand(event);";
                            elem.setAttribute(a, cmd[a]);
                        }, this);
                        break;
                    default:
                        elem.setAttribute('oncommand', cmd);
                }
                dFrag.appendChild(elem);
            }, this);
            return dFrag;
        },
        createMenuitem: function () {
            var menuitem = document.createXULElement('menuitem');
            menuitem.setAttribute('id', 'toolsbar_KeyChanger_rebuild');
            menuitem.setAttribute('label', 'KeyChanger');
            menuitem.setAttribute('tooltiptext', '左键:重载配置\n右键:编辑配置');
            menuitem.setAttribute('oncommand', 'setTimeout(function(){ KeyChanger.makeKeyset(true); }, 10);');
            menuitem.setAttribute('onclick', 'if (event.button == 2) { event.preventDefault();KeyChanger.edit(KeyChanger.FILE); }');
            var insPos = document.getElementById('devToolsSeparator');
            insPos.parentNode.insertBefore(menuitem, insPos);
        },
        internalCommand: function (event) {
            let params = event.target.getAttribute('params');
            let cmd = this.internalParamsParse(params);
            if (typeof cmd === "function") {
                cmd.call(this, event);
            } else {
                this.log("Internal command is not complete or too long", params, cmd);
            }
        },
        internalParamsParse: function (params) {
            let args = params.split(',');
            let cmd = INTERNAL_MAP;
            for (let i = 0; i < args.length; i++) {
                if (cmd.hasOwnProperty(args)) {
                    cmd = cmd[args];
                } else {
                    return "";
                }
            }
            return cmd;
        },
        openCommand: function (url, where, postData) {
            var uri;
            try {
                uri = Services.io.newURI(url, null, null);
            } catch (e) {
                return this.log("URL 有问题: %s".replace("%s", url));
            }
            if (uri.scheme === "javascript") {
                try {
                    loadURI(url);
                } catch (e) {
                    gBrowser.loadURI(url, { triggeringPrincipal: gBrowser.contentPrincipal });
                }
            } else if (where) {
                try {
                    openUILinkIn(uri.spec, where, false, postData || null);
                } catch (e) {
                    let aAllowThirdPartyFixup = {
                        postData: postData || null,
                        triggeringPrincipal: where === 'current' ?
                            gBrowser.selectedBrowser.contentPrincipal : (
                                /^(f|ht)tps?:/.test(uri.spec) ?
                                    Services.scriptSecurityManager.createNullPrincipal({}) :
                                    Services.scriptSecurityManager.getSystemPrincipal()
                            )
                    }
                    openUILinkIn(uri.spec, where, aAllowThirdPartyFixup);
                }
            } else {
                let aAllowThirdPartyFixup = {
                    inBackground: false,
                    postData: postData || null,
                    triggeringPrincipal: Services.scriptSecurityManager.createNullPrincipal({})
                }
                openUILinkIn(uri.spec, 'tab', aAllowThirdPartyFixup);
            }
        },
        edit: function (aFile, aLineNumber) {
            if (KeyChanger.isBuilding) return;
            if (!aFile || !aFile.exists() || !aFile.isFile()) return;

            var editor;
            try {
                editor = Services.prefs.getComplexValue("view_source.editor.path", Ci.nsIFile);
            } catch (e) { }

            if (!editor || !editor.exists()) {
                if (useScraptchpad && this.appVersion <= 72) {
                    this.openScriptInScratchpad(window, aFile);
                    return;
                } else {
                    function setPath() {
                        var fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker);
                        fp.init(window, "设置全局脚本编辑器", fp.modeOpen);
                        fp.appendFilter("执行文件", "*.exe");

                        if (typeof fp.show !== 'undefined') {
                            if (fp.show() == fp.returnCancel || !fp.file)
                                return;
                            else {
                                editor = fp.file;
                                Services.prefs.setCharPref("view_source.editor.path", editor.path);
                            }
                        } else {
                            fp.open(res => {
                                if (res != Ci.nsIFilePicker.returnOK) return;
                                editor = fp.file;
                                Services.prefs.setCharPref("view_source.editor.path", editor.path);
                            });
                        }
                    }
                    KeyChanger.alert("请先设置编辑器的路径!!!", "提示", setPath);

                }
            }

            var aURL = "";
            aURL = this.getURLSpecFromFile(aFile);

            var aDocument = null;
            var aCallBack = null;
            var aPageDescriptor = null;
            gViewSourceUtils.openInExternalEditor({
                URL: aURL,
                lineNumber: aLineNumber
            }, aPageDescriptor, aDocument, aLineNumber, aCallBack);

        },
        openScriptInScratchpad: function (parentWindow, file) {
            let spWin = window.openDialog("chrome://devtools/content/scratchpad/index.xul", "Toolkit:Scratchpad", "chrome,dialog,centerscreen,dependent");
            spWin.top.moveTo(0, 0);
            spWin.top.resizeTo(screen.availWidth, screen.availHeight);
            spWin.addEventListener("load", function spWinLoaded() {
                spWin.removeEventListener("load", spWinLoaded, false);

                let Scratchpad = spWin.Scratchpad;
                Scratchpad.setFilename(file.path);
                Scratchpad.addObserver({
                    onReady: function () {
                        Scratchpad.removeObserver(this);
                        Scratchpad.importFromFile.call(Scratchpad, file);
                    }
                });
            }, false);
        },
        exec: function (path, arg) {
            var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
            var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
            try {
                var a = (typeof arg == 'string' || arg instanceof String) ? arg.split(/\s+/) : [arg];
                file.initWithPath(path);
                process.init(file);
                process.run(false, a, a.length);
            } catch (e) {
                this.log(e);
            }
        },
        getURLSpecFromFile(aFile) {
            var aURL;
            if (this.appVersion < 92) {
                aURL = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getURLSpecFromFile(aFile);
            } else {
                aURL = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getURLSpecFromActualFile(aFile);
            }
            return aURL;
        },
        alert: function (aMsg, aTitle, aCallback) {
            var callback = aCallback ? {
                observe: function (subject, topic, data) {
                    if ("alertclickcallback" != topic)
                        return;
                    aCallback.call(null);
                }
            } : null;
            var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
            alertsService.showAlertNotification(
                "chrome://global/skin/icons/information-32.png", aTitle || "addMenu",
                aMsg + "", !!callback, "", callback);
        },
        log: function () {
            Services.console.logStringMessage("[KeyChanger] " + Array.prototype.slice.call(arguments));
        },
        init: function () {
            this.createMenuitem();
            this.makeKeyset();
            this.addEventListener();
        }
    };

    function saveFile(fileOrName, data) {
        var file;
        if (typeof fileOrName == "string") {
            file = Services.dirsvc.get('UChrm', Ci.nsIFile);
            file.appendRelativePath(fileOrName);
        } else {
            file = fileOrName;
        }

        var suConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
        suConverter.charset = 'UTF-8';
        data = suConverter.ConvertFromUnicode(data);

        var foStream = Cc['@mozilla.org/network/file-output-stream;1'].createInstance(Ci.nsIFileOutputStream);
        foStream.init(file, 0x02 | 0x08 | 0x20, 0664, 0);
        foStream.write(data, data.length);
        foStream.close();
    }

    function loadText(aFile) {
        var fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
        var sstream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
        fstream.init(aFile, -1, 0, 0);
        sstream.init(fstream);

        var data = sstream.read(sstream.available());
        try {
            data = decodeURIComponent(escape(data));
        } catch (e) {
        }
        sstream.close();
        fstream.close();
        return data;
    }

    function $C(aDoc, tag, attrs, skipAttrs) {
        attrs = attrs || {};
        skipAttrs = skipAttrs || [];
        var el = (aDoc || document).createXULElement(tag);
        return $A(el, attrs, skipAttrs);
    }

    function $A(el, obj, skipAttrs) {
        skipAttrs = skipAttrs || [];
        if (obj) Object.keys(obj).forEach(function (key) {
            if (!skipAttrs.includes(key)) {
                if (typeof obj[key] === 'function') {
                    el.setAttribute(key, "(" + obj[key].toString() + ").call(this, event);");
                } else {
                    el.setAttribute(key, obj[key]);
                }
            }
        });
        return el;
    }

    function $R(el) {
        if (!el || !el.parentNode) return;
        el.parentNode.removeChild(el);
    }

    if (gBrowserInit.delayedStartupFinished) window.KeyChanger.init();
    else {
        let delayedListener = (subject, topic) => {
            if (topic == "browser-delayed-startup-finished" && subject == window) {
                Services.obs.removeObserver(delayedListener, topic);
                window.KeyChanger.init();
            }
        };
        Services.obs.addObserver(delayedListener, "browser-delayed-startup-finished");
    }
})();
kidzgy
火狐狸
火狐狸
  • UID35190
  • 注册日期2011-02-03
  • 最后登录2024-03-28
  • 发帖数248
  • 经验196枚
  • 威望0点
  • 贡献值122点
  • 好评度17点
5楼#
发布于:2023-09-11 14:08
keys['Shift+F1'] = function () {
    var document = event.target.ownerDocument;
    if (!document.getElementById('menu_browserToolbox')) {
        let { require } = Cu.import("resource://devtools/shared/loader/Loader.jsm", {});
        require("devtools/client/framework/devtools-browser");
    };
    document.getElementById('menu_browserToolbox').click();
};



这个是shift+F1打开浏览器工具箱,到117失效了,求修复。
xhlslan
小狐狸
小狐狸
  • UID33375
  • 注册日期2010-07-10
  • 最后登录2024-04-26
  • 发帖数88
  • 经验66枚
  • 威望0点
  • 贡献值26点
  • 好评度5点
  • 社区居民
  • 忠实会员
6楼#
发布于:2023-09-11 22:15
kidzgy:keys['Shift+F1'] = function () {
    var document = event.target.ownerDocument;
    if (!document.getElementById('menu...
回到原帖
浏览器工具箱不是自带有吗shift+ctrl+alt+i
逗妇乳
小狐狸
小狐狸
  • UID50148
  • 注册日期2015-06-01
  • 最后登录2024-04-20
  • 发帖数86
  • 经验92枚
  • 威望0点
  • 贡献值32点
  • 好评度7点
7楼#
发布于:2023-09-12 11:20
编辑掉,回复错了
逗妇乳
小狐狸
小狐狸
  • UID50148
  • 注册日期2015-06-01
  • 最后登录2024-04-20
  • 发帖数86
  • 经验92枚
  • 威望0点
  • 贡献值32点
  • 好评度7点
8楼#
发布于:2023-09-12 11:21
kidzgy:keys['Shift+F1'] = function () {
    var document = event.target.ownerDocument;
    if (!document.getElementById('menu...
回到原帖
118b7 实测没问题啊
kidzgy
火狐狸
火狐狸
  • UID35190
  • 注册日期2011-02-03
  • 最后登录2024-03-28
  • 发帖数248
  • 经验196枚
  • 威望0点
  • 贡献值122点
  • 好评度17点
9楼#
发布于:2023-09-13 17:18
xhlslan:浏览器工具箱不是自带有吗shift+ctrl+alt+i回到原帖
这种快捷键,太麻烦了,本身按键多就算了,特么还要两只手
kidzgy
火狐狸
火狐狸
  • UID35190
  • 注册日期2011-02-03
  • 最后登录2024-03-28
  • 发帖数248
  • 经验196枚
  • 威望0点
  • 贡献值122点
  • 好评度17点
10楼#
发布于:2023-09-13 21:50
逗妇乳:118b7 实测没问题啊回到原帖
我知道为什么没有生效了,我是聚焦到网页空白处了,如果我聚焦到浏览器其他位置,再按热键就可以弹出来了
游客

返回顶部