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;
 })();