2011-05-11 76 views
8

我最近找到一种方法来管理emacs中的Firefox标签。这听起来有点疯狂。我使用树型标签(firefox addon),Moz Repl,emacs,org-mode来完成它。使用组织模式管理emacs中的Firefox标签

对于10-15个选项卡,我的计划工作正常。但20多个标签,我的Firefox随机挂起。也许JavaScript堆栈溢出或其他东西?我不知道我的代码有什么问题。我在这里发布最重要的代码。 Somesone帮我找到一些错误?

这是一个基本的Firefox浏览器代码,你可以在没有emacs和MozPepl的情况下在firefox中运行它。

我使用树样式选项卡api来获取选项卡并将每个选项卡设置为cetain级别。输出将用于带有org模式的emacs。 树样式选项卡api:http://piro.sakura.ne.jp/xul/_treestyletab.html.en#api

该代码可以运行在许多方面。我推荐“工作区插件”。复制我的代码,选择chrome上下文来运行它。 https://addons.mozilla.org/en-US/firefox/addon/workspace/

// two helper function to get title and url of tab 
function getTitle(tab) 
{ 
    var brower = gBrowser.getBrowserForTab(tab) 
    var url = brower.currentURI.spec 
    var title = brower.contentTitle 
    return title 
} 
function getUrl(tab) 
{ 
    var brower = gBrowser.getBrowserForTab(tab) 
    var url = brower.currentURI.spec 
    var title = brower.contentTitle 
    return ":PROPERTIES:\n:URL:"+url+"\n:END:\n" 
} 

var L = gBrowser.tabContainer.childNodes.length //firefox tabs length 
var str = "" //global string for output 

//parse tabs. If tab has child, parse it. It tab has no child, just output. 
for(i = 0; i < L; i++){ 
    level = "*" 
    tab = gBrowser.tabContainer.childNodes[i] 
    if ('TreeStyleTabService' in window){ 
    if(TreeStyleTabService.hasChildTabs(tab)) 
    { 
     str = [str, level, " [+] ", getTitle(tab), "\n", getUrl(tab)].join("") //output title and url. level used in org-mode 
     treeparse(TreeStyleTabService.getChildTabs(tab), "**") //if a tab has child tabs. parse it and level up 
    } 
str = [str, level, " ", getTitle(tab), "\n", getUrl(tab)].join("") 
} 

function treeparse(tablist,level) //parse a list of tabs. If tab has not a child, output. If it has childs, parse again 
{ 
    for(i=0 ; i < tablist.length;i++) { 
    tab = tablist[i] 
    if ('TreeStyleTabService' in window){ 
     if(TreeStyleTabService.hasChildTabs(tab)) 
     { 
     str = [str, level, " [+] ", getTitle(tab), "\n", getUrl(tab)].join("") 
     newlevel = level + "*" 
     treeparse(TreeStyleTabService.getChildTabs(tab),newlevel)  
     } 
     } } 
    str = [str, level, " ", getTitle(tab), "\n", getUrl(tab)].join("") 
    } 
} 

alert(str) //alert to view result. You can also write the result into a file. 

回答

2

我不知道发生了什么特别造成问题的原因,因为我无法重现它,但我看到的问题,负荷与此代码。我不记得MozRepl是如何工作的,但是这个改进的代码应该给你一个很好的组织模式友好的标签输出。我希望这可以帮助你,或者在这个线程中绊倒谁。

var bullet = "*"; // Org-mode bullet 

// two helper function to get title and url of tab 
function getTitle(tab) { 
    var brower = gBrowser.getBrowserForTab(tab); 
    var url = brower.currentURI.spec; 
    var title = brower.contentTitle; 
    return title; 
} 

function getUrl(tab) { 
    var brower = gBrowser.getBrowserForTab(tab); 
    var url = brower.currentURI.spec; 
    var title = brower.contentTitle; 
    return ":PROPERTIES:\n:URL:"+url+"\n:END:\n"; 
} 

// NOTE: we factor these string-generation functions out, 
// to make things a bit more clear 
function makeParentNodeOutput(tab, level) { 
    return (Array(level+1).join(bullet) + 
     " [+] " + 
     getTitle(tab) + 
     "\n" + 
     getUrl(tab)); 
} 

function makeLeafNodeOutput(tab, level) { 
    return (Array(level+1).join(bullet) + 
     " " + 
     getTitle(tab) + 
     "\n" + 
     getUrl(tab)); 
} 

// NOTE: we only need to handle parsing a collection of tabs 
// in once place, and we have a function for it here. 
function parseTabCollection(tabs, level) { 
    var currentTab; 
    var outputString = ""; 
    for(var i = 0; i < tabs.length; i++){ 
     currentTab = tabs[i]; 

     // For a parent node, we output the node and its children 
     if(TreeStyleTabService.hasChildTabs(currentTab)){ 
      outputString += makeParentNodeOutput(currentTab, level); 
      outputString += parseTabCollection(
       TreeStyleTabService.getChildTabs(currentTab), 
       level + 1 
      ); 
     } else { 
      outputString += makeLeafNodeOutput(currentTab, level); 
     } 
    } 
    return outputString; 
} 

if ('TreeStyleTabService' in window){ 
    //NOTE: Start with the rootTabs only. The old version started with 
    // *all* tabs, which isn't what we want 
    var orgModeOutput = parseTabCollection(TreeStyleTabService.rootTabs, 1); 
    alert(orgModeOutput); 
} 

我希望这有助于某种方式。

+0

谢谢你的代码 – textpattern 2011-11-20 01:19:18

+0

神圣的废话,这是一个了不起的想法。我也使用Tree Style Tabs和emacs org-mode,将两者结合起来会相当疯狂。 – Ibrahim 2014-02-18 06:42:47