【问题标题】:Manage firefox tabs in emacs with org-mode使用 org-mode 管理 emacs 中的 firefox 选项卡
【发布时间】:2011-08-23 07:11:11
【问题描述】:

我最近找到了一种在 emacs 中管理 firefox 选项卡的方法。这听起来有点疯狂。我使用树样式选项卡(firefox 插件)、Moz Repl、emacs、org-mode 来做到这一点。

对于 10-15 个标签,我的计划可以正常工作。但是 20 多个标签,我的 firefox 随机挂起。也许javascript堆栈溢出或其他什么?我不知道我的代码有什么问题。我在这里发布了最重要的代码。有人帮我找出一些错误吗?

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

我使用树样式选项卡 API 来获取选项卡并将每个选项卡设置为一个特定级别。输出将在带有 org-mode 的 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.

【问题讨论】:

    标签: javascript firefox firefox-addon


    【解决方案1】:

    我不确定具体是什么导致了这个问题,因为我无法重现它,但我发现这段代码有很多问题。我不记得 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);
    }
    

    我希望这会有所帮助。

    【讨论】:

    • 天哪,这是一个了不起的想法。我也使用 Tree Style Tabs 和 emacs org-mode,将两者结合起来会非常疯狂。
    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2013-02-26
    • 2017-01-19
    • 1970-01-01
    相关资源
    最近更新 更多