// ========================== KeySnail Init File =========================== // // この領域は, GUI により設定ファイルを生成した際にも引き継がれます // 特殊キー, キーバインド定義, フック, ブラックリスト以外のコードは, この中に書くようにして下さい // ========================================================================= // //{{%PRESERVE% // prompt.rows = 12; // prompt.useMigemo = false; // prompt.migemoMinWordLength = 2; // prompt.displayDelayTime = 300; // command.kill.killRingMax = 15; // command.kill.textLengthMax = 8192; //userscript.addLoadPath("."); //userscript.require("verticaltab.js"); ////////////////////////////////////// //// sitelocalkeymap 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]; // ext.add("ext-name", function () {}, "ext description"); // style.register(""); // local["^http://"] = [['a', function(ev, arg){}],]; /////////////////////////////////////////// //// firefox // style.register("#bookmarksPanel > hbox,#history-panel > hbox {display: none !important;} //#urlbar-container{max-width: 500px !important;}"); util.setPrefs( { "browser.tabs.loadDivertedInBackground": true, "dom.disable_window_open_feature.location": false, "dom.max_script_run_time": 30, "browser.bookmarks.max_backups":0, "browser.urlbar.autocomplete.enabled":false, "browser.cache.memory.capacity":16384, "browser.sessionhistory.max_total_viewers":8, "browser.download.manager.closeWhenDone":true, "browser.download.useDownloadDir":false, "browser.tabs.closeWindowWithLastTab":false, "network.dns.disableIPv6":true } ); /////////////////////////////////// //検索エンジン plugins.options["search-url-list"] = [ ["bing","http://bing.com/search?q=%q"], ["yatwitter search","http://yats-data.com/yats/search?query=%q"], ["twitter search","http://search.twitter.com/search?q=%q&lang=all"], ["2ch","http://2ch-ranking.net/search.php?q=%q&imp=and&order=time"], ["I\'m feelig lucky!","http://www.google.co.jp/search?q=%q&btnI=kudos"], ["uncyclopedia","http://ja.uncyclopedia.info/wiki/%q"], ["wikipedia","http://ja.wikipedia.org/wiki/%q"], ["nicovideo.jp","http://www.nicovideo.jp/search/%q"], ["alc","http://eow.alc.co.jp/%q/UTF-8/"], ["google map","http://maps.google.co.jp/maps?hl=ja&q=%q&um=1&ie=UTF-8&sa=N&tab=wl"], ["weblio","http://www.weblio.jp/content_find?query=%q"], ["shoutcast","http://www.shoutcast.com/Internet-Radio/%q"], ["10sr.posterous.com","http://www.google.com/search?q=%q&ie=UTF-8&oe=UTF-8&hl=ja&domains=10sr.posterous.com&sitesearch=10sr.posterous.com"], ["delicious 10sr","http://delicious.com/10sr?addtag=%q&setcount=50&opennew=1"], ["open raw","%r"], ]; plugins.options["my-keysnail-bookmarks"] = [ "twitter.com", ]; //sitelocal ////////////////////////////////////////// // 2ch chaika local["^http://127.0.0.1:8823/thread/"] = [ ['k', function (ev, arg) { curl = window.content.location.href; kurl = curl.replace(/http:.*thread\/(.*\/).*/, "chaika://post/$1"); window.content.location.href = kurl; } ], ]; local["^http://w2.p2.2ch.net/p2/read.php"] = [ ['k', function (ev, arg) { var url = window.content.location.href; var pt = /host=(.*?)&bbs=(.*?)&key=(.*?)&ls=/ ; var result = url.match(pt); var k = format("chaika://post/http://%s/test/read.cgi/%s/%s/", result[1], result[2], result[3]); window.content.location.href = k; } ], ]; ///////////////////////////////////////// // feedly用マップ local["^http://www.feedly.com/"] = [ ['d', null], ['j', null], ['k', null], ['n', null], ['p', null], ['o', null], ['b', null], ['S', null], ['s', null], ['?', null], ['l', function (ev, arg) {window.content.location.href = "http://www.feedly.com/home#latest";}], ['r', null], ['x', function (ev, arg) {ev.target.dispatchEvent(key.stringToKeyEvent("g", true));}], [['t', 'p'], function (ev, arg) {ev.target.dispatchEvent(key.stringToKeyEvent("t", true));}], [['t', 'w'], function (ev, arg) {ext.exec("twitter-client-tweet", arg, ev);}], ]; ///////////////////////////////////////// //nicovideo用 local["http://(www|tw|es|de|)\.nicovideo\.jp\/watch/*"] = [ ["i", function (ev, arg) { ext.exec("nicoinfo", arg); }], ["p", function (ev, arg) { ext.exec("nicopause", arg); }], ["o", function (ev, arg) { ext.exec("nicommentvisible", arg); }], ["m", function (ev, arg) { ext.exec("nicomute", arg); }], [".", function (ev, arg) { ext.exec("nicovolumeIncrement", arg); }], [",", function (ev, arg) { ext.exec("nicovolumeDecrement", arg); }], ['f', function (ev, arg) { curl = window.content.location.href; kurl = curl.replace(/nicovideo.jp/, "nicovideofire.jp"); window.content.location.href = kurl; } ], ]; ///////////////////////////////////////// // tumblr/dashboard local["^http://www.tumblr.com/dashboard"] = [ // ["C-", function (ev, arg) {gBrowser.mTabContainer.advanceSelectedTab(-1, true); }], // ["C-", function (ev, arg) {gBrowser.mTabContainer.advanceSelectedTab(1, true); }], ["", function (ev, arg) {window.content.location.href = "http://www.tumblr.com/dashboard"; }], // ["", null], ["J", function (ev, arg) { if (window.loadURI) { loadURI("javascript:(function(){b=20;s=100;t=document.getElementById('next_page_link').href.split('/')[5];max=t.substr(0,t.length-5);min=max-s;i=Math.floor(Math.random()*(max-min)+min);u=(i " + tglang + " : " + to); }; function decodeJSON(json) { return util.safeEval("(" + json + ")"); }; function lookupword(word, target){ translate(word, target, function (src, tg, translated) { echo(src, word, tg, translated); }); }; function read (aInitialInput) { let prevText = ""; prompt.reader({ message : "word or sentence to translate:", initialinput : aInitialInput, onChange: function (arg) { let word = arg.textbox.value; if (word !== prevText) { prevText = word; lookupword(word, targetLang); } }, callback: function (s){}, }); }; ext.add("google-itranslate",function(){read(content.document.getSelection() || "");},"google itranslate"); })(); ////////////////////////////////////// // ext.add("restart-firefox-add-menu", function(){ const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; var elm = document.createElementNS(XUL_NS, "menuitem"); elm.setAttribute("label", "Restart Firefox"); elm.setAttribute("id", "menu_RestartFirefoxKs") elm.setAttribute("oncommand", function(){ ext.exec("restart-firefox");}); var menu = document.getElementById("menu_FilePopup"); // menu.insertBefore(elm, menu.getElementById("menu_FileQuitItem")); menu.appendChild(elm); }, "add restart firefox menu"); ////////////////////////////////////// // ext.add("fullscreen-page",function (ev) { getBrowser().selectedTab = getBrowser().addTab("http://home.tiscali.nl/annejan/swf/timeline.swf"); BrowserFullScreen(); }, "fullscreen page"); ////////////////////////////////////// // restart firefox // http://keysnail.g.hatena.ne.jp/Shinnya/20100723/1279878815 ext.add("restart-firefox",function (ev) { const nsIAppStartup = Components.interfaces.nsIAppStartup; // Notify all windows that an application quit has been requested. var os = Components.classes["@mozilla.org/observer-service;1"] .getService(Components.interfaces.nsIObserverService); var cancelQuit = Components.classes["@mozilla.org/supports-PRBool;1"] .createInstance(Components.interfaces.nsISupportsPRBool); os.notifyObservers(cancelQuit, "quit-application-requested", null); // Something aborted the quit process. if (cancelQuit.data) return; // Notify all windows that an application quit has been granted. os.notifyObservers(null, "quit-application-granted", null); // Enumerate all windows and call shutdown handlers var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(Components.interfaces.nsIWindowMediator); var windows = wm.getEnumerator(null); while (windows.hasMoreElements()) { var win = windows.getNext(); if (("tryToClose" in win) && !win.tryToClose()) return; } Components.classes["@mozilla.org/toolkit/app-startup;1"].getService(nsIAppStartup) .quit(nsIAppStartup.eRestart | nsIAppStartup.eAttemptQuit); }, "restart firefox"); ///////////////////////////////////////// // copy feed url ext.add("copy-url", function () { const doc = content.document; let feeds = [[e.getAttribute("title"), e.getAttribute("href")] for ([, e] in Iterator(doc.querySelectorAll(['link[type="application/rss+xml"]', 'link[type="application/atom+xml"]'])))]; var uh = window.content.location.href.replace(/(.*?\/\/[^/]*)(\/.*)?/,"$1"); for (i = 0; i < feeds.length; i++) if ( feeds[i][1].substr(0,1) == "/" ) feeds[i][1] = uh + feeds[i][1]; feeds.unshift([window.content.document.title,window.content.location.href]); prompt.selector( { message : "Select Feed", collection : feeds, callback : function (i) { if (i >= 0) command.setClipboardText(feeds[i][1]); } } ); }, "Copy url or feed url of current page"); /////////////////////////////////////// // 評価しちゃうっぽい とりあえずこんな感じで ext.add("keysnail-setting-menu",function(){ var settingmenulist = [["keysnail setting dialogue",function(){return function(){KeySnail.openPreference();};}], ["firefox addon manager",function(){return function(){BrowserOpenAddonsMgr();};}], ["reload .keysnail.js",function(){return function() {userscript.reload();};}], ["check for plugins update",function(){return function(){ext.exec("check-for-plugins-update");};}], ]; prompt.selector( { message : "open setting dialog", collection : settingmenulist, callback : function (i) { settingmenulist[i][1]()(); }, }); },"open keysnail setting menu"); ////////////////////////// //プラグイン一括アップデート ext.add("check-for-plugins-update", function () { [p for (p in plugins.context)].forEach(function (p) { try { userscript.updatePlugin(p); } catch(e) {} }); }, "Check for all plugin's update"); //////////////////////// //マルチプルタブハンドラ ext.add("multiple-tab-handler-close-selected-and-current-tabs", function () { BrowserCloseTabOrWindow(); // if (MultipleTabService) { // //BrowserCloseTabOrWindow(); // //MultipleTabService.setSelection(gBrowser.mCurrentTab, true); MultipleTabService.closeTabs(MultipleTabService.getSelectedTabs()); // } else { // BrowserCloseTabOrWindow();} }, '選択タブと現在のタブを閉じる'); ext.add("if-mth-exist", function() { if (MultipleTabService != undefined) display.echoStatusBar("true"); },'if mth exist'); //////////////////////// // instapaper ext.add("instapaper-add-this-page-and-close",function(){ var url = window.content.location.href; var title = window.content.document.title; var tab = gBrowser.selectedTab; var username = "8slashes+instapaper@gmail.com"; var password = ""; var passwordManager = (Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager)); var logins = passwordManager.findLogins({}, "http://www.instapaper.com", "", null); for (var i = 0; i < logins.length; i++) { if (logins[i].username == username) { password = logins[i].password; break; } } var comment = ""; // prompt.read("Instapaper comment:",function(cm){ // if(cm){comment = cm;} // }); display.echoStatusBar("Instapaper: adding " + url + "..."); util.httpPost("https://www.instapaper.com/api/add", {"username" : encodeURIComponent(username), "password" : password, "url" : encodeURIComponent(url), "title" : encodeURIComponent(title),}, function (xhr) { display.echoStatusBar(xhr.status); if (xhr.readyState == 4 && xhr.status == 201) { // var title = decodeURIComponent(xhr.getResponseHeader("X-Instapaper-Title")); //超文字化けする try { Components.classes['@mozilla.org/alerts-service;1']. getService(Components.interfaces.nsIAlertsService). showAlertNotification(null, "Instapaper", "Page " + title + " added successfully", false, '', null); } catch(e) { // prevents runtime error on platforms that don't implement nsIAlertsService } display.echoStatusBar("Instapaper: adding " + url + "...done."); gBrowser.removeTab(tab); } else{ display.echoStatusBar("Instapaper: Something wrong has happended!"); if (window.loadURI) { loadURI("javascript:function%20iprl5(){var%20d=document,z=d.createElement('scr'+'ipt'),b=d.body,l=d.location;try{if(!b)throw(0);d.title='(Saving...)%20'+d.title;z.setAttribute('src',l.protocol+'//www.instapaper.com/j/mt8YO6Cuosmf?u='+encodeURIComponent(l.href)+'&t='+(new%20Date().getTime()));b.appendChild(z);}catch(e){alert('Please%20wait%20until%20the%20page%20has%20loaded.');}}iprl5();void(0)"); } } }); },'instapaper add page and close tab when done without error.'); //////////////////////// //検索 ext.add("query-then-engine", function () { prompt.reader({message : "Search Word?:", callback : function (q) { if (q) { prompt.selector({ message : "search \"" + q + "\" with?", collection : plugins.options["search-url-list"], width : [20,80], callback : function (i) { getBrowser().selectedTab = getBrowser().addTab(plugins.options["search-url-list"][i][1].replace("%r",q).replace("%q",encodeURIComponent(q))); }, }); }; }, initialInput : content.document.getSelection() || "", }); }, "enter search word and then select engine"); /////////////////////// //diggler ext.add("dig-url", function () { var url = window.content.location.href; var nsurl = []; var pname = ""; var ssurl = []; var durl = []; nsurl = url.split("#"); var pname = nsurl[1]; ssurl = nsurl[0].split("/"); durl[0] = ssurl[0] + "//" + ssurl[2]; ssurl.splice(0,3); for (var i = 0; i < ssurl.length; i++){ var durlsaved = durl[0]; durl.unshift(durlsaved + "/" + ssurl[i]); }; if (pname) { var durlfull = durl[0] + "#"+ pname; durl.unshift(durlfull); }; prompt.selector({ message : "dig " + url, collection : durl, callback : function (i) { window.content.location.href = durl[i]; }, }); },"keysnail diggler "); ///////////////////////////////////// // 閉じたタブリスト ext.add("list-closed-tabs", function () { const fav = "chrome://mozapps/skin/places/defaultFavicon.png"; var ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore); var json = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON); var closedTabs = [[tab.image || fav, tab.title, tab.url] for each (tab in json.decode(ss.getClosedTabData(window)))]; if (!closedTabs.length) return void display.echoStatusBar("最近閉じたタブが見つかりませんでした", 2000); prompt.selector( { message : "select tab to undo:", collection : closedTabs, flags : [ICON | IGNORE, 0, 0], callback : function (i) { if (i >= 0) window.undoCloseTab(i); } }); }, "List closed tabs"); ext.add("echo-closed-tabs", function () { var ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore); var json = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON); // var closedTabs = [[tab.image || fav, tab.title, tab.url] for each (tab in json.decode(ss.getClosedTabData(window)))]; var lasttab = json.decode(ss.getClosedTabData(window))[0]; dump = "" for (var i in lasttab) { dump += lasttab[i] + "\n"; } confirm(dump); }, "List closed tabs"); /////////////////////////////////////// // ext.add("focus-on-content", function(){ document.getElementById("searchbar").focus(); document.commandDispatcher.advanceFocus(); document.commandDispatcher.advanceFocus(); }, "forcus on content"); ext.add("_focus-on-content", function(){ gBrowser.focus(); _content.focus(); }, "focus on content"); ext.add("hide-sidebar", function(){ var sidebarBox = document.getElementById("sidebar-box"); if (!sidebarBox.hidden) { toggleSidebar(sidebarBox.getAttribute("sidebarcommand")); } }, "hide-sidebar"); //}}%PRESERVE% // ========================================================================= // // ========================= Special key settings ========================== // key.quitKey = "ESC"; key.helpKey = "C-h"; key.escapeKey = "C-q"; key.macroStartKey = ""; key.macroEndKey = ""; key.universalArgumentKey = "C-u"; key.negativeArgument1Key = "C--"; key.negativeArgument2Key = "C-M--"; key.negativeArgument3Key = "M--"; key.suspendKey = "Not defined"; // ================================= Hooks ================================= // hook.setHook('KeySnailInitialized', function () { ext.exec("shiitake-toggle-style"); }); hook.setHook('KeyBoardQuit', function (aEvent) { command.closeFindBar(); if (util.isCaretEnabled()) { command.resetMark(aEvent); } else { goDoCommand("cmd_selectNone"); } key.generateKey(aEvent.originalTarget, KeyEvent.DOM_VK_ESCAPE, true); }); hook.addToHook('KeyBoardQuit', function (aEvent) { ext.exec("hide-sidebar"); }); hook.setHook('Unload', function () { util.getBrowserWindows().some(function (win) { if (win === window) { return false; } const ks = win.KeySnail; share.pluginUpdater = ks.getPluginUpdater(share.pluginUpdater.pluginsWithUpdate); ks.setUpPluginUpdaterDelegator(); return true; }); }); // ============================= Key bindings ============================== // key.setGlobalKey([[''], ['\\']], function (ev, arg) { ev.target.dispatchEvent(key.stringToKeyEvent("ESC", true)); }, 'escape'); key.setGlobalKey('C-', function () { gBrowser.mTabContainer.advanceSelectedTab(1, true); }, 'ひとつ右のタブへ'); key.setGlobalKey('C-', function () { gBrowser.mTabContainer.advanceSelectedTab(-1, true); }, 'ひとつ左のタブへ'); key.setGlobalKey('C-', function () { var browser = getBrowser(); if (browser.mCurrentTab.previousSibling) { browser.moveTabTo(browser.mCurrentTab, browser.mCurrentTab._tPos - 1); } else { browser.moveTabTo(browser.mCurrentTab, browser.mTabContainer.childNodes.length - 1); } }, '選択中のタブを右へ'); key.setGlobalKey('C-', function () { var browser = getBrowser(); if (browser.mCurrentTab.nextSibling) { browser.moveTabTo(browser.mCurrentTab, browser.mCurrentTab._tPos + 1); } else { browser.moveTabTo(browser.mCurrentTab, 0); } }, '選択中のタブを左へ'); key.setGlobalKey('M-:', function (ev) { command.interpreter(); }, 'JavaScript のコードを評価'); key.setGlobalKey('C-g', function (ev, arg) { return; }, 'ignore'); key.setViewKey('0', function (ev, arg) { var n = gBrowser.mCurrentTab._tPos; BrowserCloseTabOrWindow(); gBrowser.selectedTab = gBrowser.mTabs[n]; }, '閉じて次のタブ'); key.setViewKey('x', function (aEvent, aArg) { ext.select(aArg, aEvent); }, 'エクステ一覧'); key.setViewKey(['t', 'm'], function (ev, arg) { if (window.loadURI) { loadURI("javascript:window.location='http://api.tweetmeme.com/visit?url='+window.location;"); } }, 'open with tweetmeme'); key.setViewKey(['t', 'w'], function (ev, arg) { ext.exec("twitter-client-tweet", arg, ev); }, 'つぶやく', true); key.setViewKey(['t', 'p'], function (ev, arg) { ext.exec("twitter-client-tweet-this-page", arg, ev); }, 'このページのタイトルと URL を使ってつぶやく', true); key.setViewKey('u', function () { undoCloseTab(); }, '閉じたタブを元に戻す'); key.setViewKey('g', function () { goDoCommand("cmd_scrollTop"); }, 'ページ先頭へ移動'); key.setViewKey('G', function () { goDoCommand("cmd_scrollBottom"); }, 'ページ末尾へ移動'); key.setViewKey('r', function (aEvent) { BrowserReload(); }, '再読み込み'); key.setViewKey('m', function (ev, arg) { _fi.toogle(); }, 'fetchimiをトグル'); key.setViewKey('d', function (ev, arg) { if (window.loadURI) { loadURI("javascript:(function(){f='http://www.delicious.com/save?url='+encodeURIComponent(window.location.href)+'&title='+encodeURIComponent(document.title)+'¬es='+encodeURIComponent(''+(window.getSelection?window.getSelection():document.getSelection?document.getSelection():document.selection.createRange().text))+'&v=6&';a=function(){if(!window.open(f+'noui=1&jump=doclose','deliciousuiv6','location=1,links=0,scrollbars=0,toolbar=0,width=550,height=585'))location.href=f+'jump=yes'};if(/Firefox/.test(navigator.userAgent)){setTimeout(a,0)}else{a()}})()"); } }, 'deliciousでブックマーク'); key.setViewKey('p', function (ev, arg) { if (window.loadURI) { loadURI("javascript:var%20b=document.body;var%20POSTEROUS___bookmarklet_domain='http://posterous.com';if(b&&!document.xmlVersion){void(z=document.createElement('script'));void(z.type='text/javascript');void(z.src='http://posterous.com/javascripts/bookmarklet2.js');void(b.appendChild(z));}else{}"); } }, 'posterousに投稿'); key.setViewKey('SPC', function (ev, arg) { MultipleTabService.toggleSelection(gBrowser.mCurrentTab); gBrowser.mTabContainer.advanceSelectedTab(1, true); }, 'タブの選択をトグルして次のタブ'); key.setViewKey('S-SPC', function (ev, arg) { MultipleTabService.toggleSelection(gBrowser.selectedTab); gBrowser.mTabContainer.advanceSelectedTab(-1, true); }, 'タブの選択をトグルして前のタブ'); key.setViewKey('z', function (ev, arg) { ext.exec("keysnail-setting-menu", arg, ev); }, 'open keysnail setting menu', true); key.setViewKey('T', function (ev, arg) { ext.exec("google-itranslate", arg, ev); }, 'google itranslate', true); key.setViewKey('l', function (ev, arg) { var n = gBrowser.mCurrentTab._tPos; gBrowser.moveTabTo(gBrowser.mCurrentTab, gBrowser.mTabContainer.childNodes.length - 1); gBrowser.selectedTab = gBrowser.mTabs[n]; }, 'このタブを後回し'); key.setViewKey('C-SPC', function (ev, arg) { MultipleTabService.toggleSelection(gBrowser.selectedTab); }, 'タブの選択をトグル'); key.setViewKey('s', function (ev, arg) { var n = gBrowser.mCurrentTab._tPos; gBrowser.moveTabTo(gBrowser.mCurrentTab, 0); if (n != 0) { gBrowser.selectedTab = gBrowser.mTabs[n]; } }, 'このタブを保持する'); key.setViewKey('U', function (ev, arg) { ext.exec("list-closed-tabs", arg, ev); }, 'List closed tabs', true); key.setViewKey('e', function () { command.focusElement(command.elementsRetrieverTextarea, 0); }, '最初のインプットエリアへフォーカス', true); key.setViewKey('S', function (ev, arg) { if (window.loadURI) { loadURI("javascript:var%20b=document.body;var%20GR________bookmarklet_domain='https://www.google.com';if(b&&!document.xmlVersion){void(z=document.createElement('script'));void(z.src='https://www.google.com/reader/ui/link-bookmarklet.js');void(b.appendChild(z));}else{}"); } }, 'google reader share'); key.setViewKey('!', function (ev, arg) { shell.input(); }, 'Command system'); key.setViewKey('b', function (ev, arg) { BarTap.putOnTap(gBrowser.mCurrentTab, gBrowser); }, 'bartab put on tab'); key.setViewKey('R', function () { BrowserReloadSkipCache(); }, '更新(キャッシュを無視)'); key.setViewKey('', function () { BrowserBack(); }, '戻る'); key.setViewKey('S-', function () { BrowserForward(); }, '進む'); key.setViewKey('q', function (ev, arg) { ext.exec("query-then-engine", arg, ev); }, 'enter search word and then select engine', true); key.setViewKey('D', function (ev, arg) { ext.exec("dig-url", arg, ev); }, 'keysnail diggler ', true); key.setViewKey('/', function () { command.iSearchForward(); }, 'インクリメンタル検索', true); key.setViewKey('?', function (ev) { command.iSearchForwardKs(ev); }, 'Emacs ライクなインクリメンタル検索', true); key.setViewKey('a', function (ev, arg) { allTabs.open(); }, 'alltabs.open'); key.setViewKey('C', function (ev, arg) { ext.exec("copy-url", arg, ev); }, '選択タブと現在のタブを閉じる', true); key.setViewKey('I', function (ev, arg) { ext.exec("instapaper-add-this-page-and-close", arg, ev); }, 'instapaper add page', true); key.setViewKey('', function (ev) { goDoCommand("cmd_scrollPageUp"); }, '一画面分スクロールアップ'); key.setViewKey('', function (ev) { goDoCommand("cmd_scrollPageDown"); }, '一画面スクロールダウン'); key.setViewKey('C-w', function (ev) { command.copyRegion(ev); }, '選択中のテキストをコピー'); key.setViewKey([[''], ['']], function (ev, arg) { return; }, 'ignore'); key.setEditKey(['C-x', 'h'], function (ev) { command.selectAll(ev); }, '全て選択', true); key.setEditKey([['C-x', 'u'], ['C-_']], function (ev) { display.echoStatusBar("Undo!", 2000); goDoCommand("cmd_undo"); }, 'アンドゥ'); key.setEditKey(['C-x', 'r', 'd'], function (ev, arg) { command.replaceRectangle(ev.originalTarget, "", false, !arg); }, '矩形削除', true); key.setEditKey(['C-x', 'r', 't'], function (ev) { prompt.read("String rectangle: ", function (aStr, aInput) {command.replaceRectangle(aInput, aStr);}, ev.originalTarget); }, '矩形置換', true); key.setEditKey(['C-x', 'r', 'o'], function (ev) { command.openRectangle(ev.originalTarget); }, '矩形行空け', true); key.setEditKey(['C-x', 'r', 'k'], function (ev, arg) { command.kill.buffer = command.killRectangle(ev.originalTarget, !arg); }, '矩形キル', true); key.setEditKey(['C-x', 'r', 'y'], function (ev) { command.yankRectangle(ev.originalTarget, command.kill.buffer); }, '矩形ヤンク', true); key.setEditKey([['C-SPC'], ['C-@']], function (ev) { command.setMark(ev); }, 'マークをセット', true); key.setEditKey('C-o', function (ev) { command.openLine(ev); }, '行を開く (Open line)'); key.setEditKey('C-\\', function (ev) { display.echoStatusBar("Redo!", 2000); goDoCommand("cmd_redo"); }, 'リドゥ'); key.setEditKey('C-a', function (ev) { command.beginLine(ev); }, '行頭へ移動'); key.setEditKey('C-e', function (ev) { command.endLine(ev); }, '行末へ'); key.setEditKey('M-h', function (ev) { command.previousChar(ev); }, '一文字左へ移動'); key.setEditKey('M-f', function (ev) { command.forwardWord(ev); }, '一単語右へ移動'); key.setEditKey('M-b', function (ev) { command.backwardWord(ev); }, '一単語左へ移動'); key.setEditKey('M-j', function (ev) { command.nextLine(ev); }, '一行下へ'); key.setEditKey('M-k', function (ev) { command.previousLine(ev); }, '一行上へ'); key.setEditKey('C-v', function (ev) { command.pageDown(ev); }, '一画面分下へ'); key.setEditKey('M-v', function (ev) { command.pageUp(ev); }, '一画面分上へ'); key.setEditKey('M-<', function (ev) { command.moveTop(ev); }, 'テキストエリア先頭へ'); key.setEditKey('M->', function (ev) { command.moveBottom(ev); }, 'テキストエリア末尾へ'); key.setEditKey('C-d', function (ev) { goDoCommand("cmd_deleteCharForward"); }, '次の一文字削除'); key.setEditKey('C-h', function (ev) { goDoCommand("cmd_deleteCharBackward"); }, '前の一文字を削除'); key.setEditKey('M-d', function (ev) { command.deleteForwardWord(ev); }, '次の一単語を削除'); key.setEditKey([['C-'], ['M-']], function (ev) { command.deleteBackwardWord(ev); }, '前の一単語を削除'); key.setEditKey('M-u', function (ev, arg) { command.wordCommand(ev, arg, command.upcaseForwardWord, command.upcaseBackwardWord); }, '次の一単語を全て大文字に (Upper case)'); key.setEditKey('M-c', function (ev, arg) { command.wordCommand(ev, arg, command.capitalizeForwardWord, command.capitalizeBackwardWord); }, '次の一単語をキャピタライズ'); key.setEditKey('C-k', function (ev) { command.killLine(ev); }, 'カーソルから先を一行カット (Kill line)'); key.setEditKey('C-y', command.yank, '貼り付け (Yank)'); key.setEditKey('M-y', command.yankPop, '古いクリップボードの中身を順に貼り付け (Yank pop)', true); key.setEditKey('C-M-y', function (ev) { if (!command.kill.ring.length) { return; } let (ct = command.getClipboardText()) (!command.kill.ring.length || ct != command.kill.ring[0]) && command.pushKillRing(ct); prompt.selector({message: "Paste:", collection: command.kill.ring, callback: function (i) {if (i >= 0) {key.insertText(command.kill.ring[i]);}}}); }, '以前にコピーしたテキスト一覧から選択して貼り付け', true); key.setEditKey('C-w', function (ev) { goDoCommand("cmd_copy"); goDoCommand("cmd_delete"); command.resetMark(ev); }, '選択中のテキストを切り取り (Kill region)', true); key.setEditKey('M-n', function (ev) { command.walkInputElement(command.elementsRetrieverTextarea, true, true); }, '次のテキストエリアへフォーカス'); key.setEditKey('M-p', function (ev) { command.walkInputElement(command.elementsRetrieverTextarea, false, true); }, '前のテキストエリアへフォーカス'); key.setEditKey('M-w', function (ev) { command.copyRegion(ev); }, '選択中のテキストをコピー'); key.setEditKey('M-l', function (ev) { command.nextChar(ev); }, '一文字右へ移動');