vimperator で Tree Style Tab を 操作 その4
さらに 機能追加です。
- zu を アクティブタブを 1階層上に移動 に 変更
- zU を アクティブタブを ルート階層に移動 に変更
- z$ 同階層 末尾タブに移動 を 追加
- z' 次に開くタブを 同一階層末尾 を 追加
- zx アクティブタブを移動対象タブに指定 を 追加
- zv アクティブタブの子に移動対象タブを移動 を 追加
- zV アクティブタブの次に移動対象タブを移動 を 追加
A +-B +-C +-D E
のような構成で、 Aで zx、 C で zv みたいなことをするとツリー情報が壊れます。
上記例は、チェックしているので大丈夫だと思いますが、抜けがあった場合発生する可能性があります。
起きた場合は、強制終了して新しいセッションを開始するしかなくなります。
例によって全文は caisuiの日記
diff -r 9e7a35dfddac treeTabStyle.js --- a/treeTabStyle.js Thu May 14 23:23:22 2009 +0900 +++ b/treeTabStyle.js Fri May 15 00:07:04 2009 +0900 @@ -18,20 +18,25 @@ setup("zk" , "tree style tab prev tab" , "prevTab"); setup("zd" , "remove tree tab" , "removeTabSubTree"); setup("zD" , "remove tree tab from top tree" , "removeTabTreeAll"); - setup("zu" , "tree style tab parent tab" , "parentTab"); setup("zh" , "tree style tab parent tab" , "parentTab"); setup("zH" , "tree style tab root tab" , "rootTab"); setup("zl" , "tree style tab first child tab" , "firstChildTab"); - setup("zU" , "tree style tab top tab" , "topTab"); + setup("zu" , "move up" , "moveUp"); + setup("zU" , "move root" , "moveRoot"); setup("d" , "override remove tab" , "removeTab"); setup("zc" , "collapse subtree" , "collapseSubtree"); setup("zC" , "collapse all subtree" , "collapseAllSubtree"); setup("zo" , "expand subtree" , "expandSubtree"); setup("z^" , "goto first tab" , "firstTab"); + setup("z$" , "goto last tab" , "lastTab"); setup("z@" , "ready to open child tab once" , "readyToOpenChildTabOnce"); + setup("z'" , "ready to open child tab once" , "readyToOpenTabOnce"); setup("z[" , "ready to open child tab" , "readyToOpenChildTab"); setup("z]" , "stop to open child tab" , "stopToOpenChildTab"); setup("zg" , "show tabbar" , "showTabbar"); + setup("zx" , "mark tab" , "setMarkTab"); + setup("zv" , "move child tab" , "moveChildTab"); + setup("zV" , "show next tab" , "moveNextTab"); if(!liberator.plugins.caisui) liberator.plugins.caisui={}; @@ -115,17 +120,64 @@ gBrowser.selectedTab = (t2=TreeStyleTabService.getParentTab(t1)) ? TreeStyleTabService.getFirstChildTab(t2) : TreeStyleTabService.getFirstTab(gBrowser); + },lastTab:function(){ + let t1,t2; + t1=gBrowser.selectedTab; + gBrowser.selectedTab = (t2=TreeStyleTabService.getParentTab(t1)) + ? TreeStyleTabService.getLastChildTab(t2) + : TreeStyleTabService.getRootTab(TreeStyleTabService.getLastTab(gBrowser)); },readyToOpenChildTabCore:function(aTab,aFlag){ TreeStyleTabService.readyToOpenChildTab(aTab,aFlag); },readyToOpenChildTabOnce:function(){ caisui.TreeStyleTab.readyToOpenChildTabCore(gBrowser.selectedTab); + },readyToOpenTabOnce:function(){ + caisui.TreeStyleTab.readyToOpenChildTabCore(TreeStyleTab.getParentTab(gBrowser.selectedTab)||gBrowser.selectedTab); },readyToOpenChildTab:function(){ caisui.TreeStyleTab.readyToOpenChildTabCore(gBrowser.selectedTab,true); },stopToOpenChildTab:function(){ TreeStyleTabService.stopToOpenChildTab(gBrowser.selectedTab); },showTabbar:function(){ gBrowser.treeStyleTab.showTabbar(); + },setMarkTab:function(){ + markTab = gBrowser.selectedTab; + },moveChildTab:function(){ + var t=gBrowser.selectedTab; + caisui.TreeStyleTab.performDrop(markTab,t + , caisui.TreeStyleTab.getInsertBeforeTab(t)); + },moveNextTab:function(){ + var t=gBrowser.selectedTab; + caisui.TreeStyleTab.performDrop(markTab,TreeStyleTabService.getParentTab(t) + , caisui.TreeStyleTab.getInsertBeforeTab(t)); + },performDrop:function(aTab,pTab,iTab){ + if(!aTab) return; + else if(pTab && TreeStyleTabService.getChildTabs(aTab,[]).indexOf(pTab)>=0){ + liberator.echoerr("error:loop"); + return; + } + gBrowser.treeStyleTab.performDrop({ + action: (pTab ? TreeStyleTabService.kACTION_ATTACH:TreeStyleTabService.kACTION_PART)|TreeStyleTabService.kACTION_MOVE + ,parent: pTab + ,source: aTab + ,insertBefore: iTab + ,canDrop:true + //,position: 0 //? + //,target: null//? + },aTab); + },getInsertBeforeTab:function(aTab){ + var ret=null; + for(let t = aTab;t;t=TreeStyleTabService.getParentTab(t)){ + if(ret=TreeStyleTabService.getNextSiblingTab(t)) break; + } + return ret; + },moveUp:function(){ + var t=gBrowser.selectedTab,p=TreeStyleTabService.getParentTab(t); + if(!p) return; + caisui.TreeStyleTab.performDrop(t,TreeStyleTabService.getParentTab(p),caisui.TreeStyleTab.getInsertBeforeTab(p)); + },moveRoot:function(){ + var t=gBrowser.selectedTab,r=TreeStyleTabService.getRootTab(t); + caisui.TreeStyleTab.performDrop(t,null,caisui.TreeStyleTab.getInsertBeforeTab(r)); } }; + let markTab=null; caisui = liberator.plugins.caisui; })();