vimperator で Tree Style Tab を 操作 その7
タブの移動関連を強化しました。
- zJ でアクティブタブを 下に移動 を 追加( 2zJ で2つ下)
- zK でアクティブタブを 上に移動 を 追加( 2zK で2つ上)
- PUBLIC API の 確認結果を添付(タブの移動系が 非PUBLIC API まみれ)
- commandline.open の 第一引数に ":" を 移動
- zv で タブの末尾に貼り付けると 階層がずれることがある点を修正
全コードはこちら
以下差分 前回コミットし忘れていたようで前回分が含まれてます(;´д`)
diff -r 64a9aaa949ee treeStyleTab.js --- a/treeStyleTab.js Mon Jul 06 02:24:01 2009 +0900 +++ b/treeStyleTab.js Fri Jul 17 23:16:15 2009 +0900 @@ -1,4 +1,33 @@ // vim:fdm=marker:et: +// +// used API(o=public API,x=not public API){{{ +// o attachTabTo +// x collapseExpandAllSubtree +// o collapseExpandSubtree +// x getChildIndex +// o getChildTabs +// o getDescendantTabs +// o getFirstChildTab +// o getFirstTab +// o getLastChildTab +// o getLastTab +// o getNextSiblingTab +// o getParentTab +// o getPreviousSiblingTab +// o getRootTab +// o hasChildTabs +// x kACTION +// x moveTabSubTreeTo +// o partTab +// x performDrop +// o readyToOpenChildTab +// o rootTabs +// x showTabbar +// o stopToOpenChildTab}}} +// +// x _tPos +// + (function(){ if(!("TreeStyleTabService" in window)) return; var mod=liberator.modules; @@ -41,6 +70,8 @@ setup("zv" , "move child tab" , "moveChildTab"); setup("zV" , "show next tab" , "moveNextTab"); setup("zt" , "open new tab child tab" , "tabOpenChild"); + setup("zJ" , "move tab(direction:next)" , "moveTabToNext"); + setup("zK" , "move tab(direction:previous)" , "moveTabToPrebious"); //}}} (plugins.caisui||(plugins.caisui={})) @@ -88,6 +119,26 @@ return ret; },readyToOpenChildTabCore:function(aTab,aFlag){ T.readyToOpenChildTab(aTab,aFlag); + },getMoveTabSubTreeToIndex:function(aTab,aCount,reverse){ + let pTab = T.getParentTab(aTab); + let tabs = pTab ? T.getChildTabs(pTab) : T.rootTabs; + let src = T.getChildIndex(aTab,pTab) + let dest = src + aCount; + if(dest < 0) dest = 0; + else if(dest >= tabs.length) dest = tabs.length - 1; + if(src == dest) return -1; + else if(src < dest){ + dest = (function(aTab){ + let t = T.getLastChildTab(aTab); + return t ? arguments.callee.call(this,t) : aTab; + })(tabs[dest])._tPos|| -1; + }else dest = tabs[dest]._tPos; + return dest; + },moveTabSubTreeToEx:function(aTab,aCount,reverse){ + if(aCount == -1) aCount = 1; + if(reverse) aCount = -aCount; + let index=U1.getMoveTabSubTreeToIndex(aTab, aCount); + if(index >= 0) T.moveTabSubTreeTo(aTab, index); } }/*}}}*/ ,U2=/*{{{*/{ @@ -160,7 +211,12 @@ markTab = g.selectedTab; },moveChildTab:function(){ var t=g.selectedTab; - U1.performDrop(markTab, t, U1.getInsertBeforeTab(t)); + if(markTab && T.getDescendantTabs(markTab).indexOf(t)>=0){ + liberator.echoerr("error:loop"); + return; + } + T.partTab(markTab); + T.attachTabTo(markTab, t); },moveNextTab:function(){ var t=gBrowser.selectedTab; U1.performDrop(markTab,T.getParentTab(t),U1.getInsertBeforeTab(t)); @@ -173,7 +229,30 @@ U1.performDrop(t,null,U1.getInsertBeforeTab(r)); },tabOpenChild:function(aCount){ T.readyToOpenChildTab(U1.getParentTab(g.selectedTab,aCount), false); - commandline.open("",":tabopen ",liberator.modules.modes.EX); + commandline.open(":","tabopen ",liberator.modules.modes.EX); + },moveTabToNext:function(aCount){ + U1.moveTabSubTreeToEx(g.selectedTab, aCount); + },moveTabToPrebious:function(aCount){ + U1.moveTabSubTreeToEx(g.selectedTab, aCount, true); } }/*}}}*/) U2; + + //override reload map about:blank & treestyletab-group{{{ + (function(){ + let map = mappings.get(modes.NORMAL, "r"); + let f= map.action; + if(f.original) f = f.original; + + map.action = function(){ + let url = content.window.document.documentURI; + let m; + if(url == "about:blank"){ + commandline.open(":","open about:treestyletab-group?", modes.EX); + }else if(m=/^(about:treestyletab-group\?)(.*)$/.exec(url)){ + commandline.open(":",<>open {m[1]}{decodeURI(m[2])}</>.toString(), modes.EX); + }else f.apply(this,arguments); + }; + map.action.original = f; + })();//}}} })();