让我们在emacs中来管理浏览器的标签页!

完全可以做到的,技术实现上并没有特别复杂的地方,先看org界面截图

需要会一点浏览器扩展开发的基础,下面是浏览器扩展的后台脚本 background.js文件中相关代码

chrome.tabs.onCreated.addListener(function(tab) {
  if(tab.pendingUrl.substr(7,6)=="tabid="){//如果域名是tabid=开头则跳转
    let tabid=parseInt( tab.pendingUrl.substr(13) );//取出要跳转的tabid
    //console.log(tabid);
    chrome.tabs.update(tabid,{ active: true });
    chrome.tabs.remove(tab.id);//关闭当前页面
  }
});
chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,tab){
  if (changeInfo.url) {//打开一个页面默认会触发三次
    chrome.tabs.query({ currentWindow: true },function(tabs){
      var urls = [];
      var urlStr="";
      for (var i = 0; i < tabs.length; i++) {
        urls.push([tabs[i].id,tabs[i].url,tabs[i].title]);
      }
      //console.log(urls);
      file_get_content("http://127.0.0.1/browser-tabs",urls);
    });
  }
});
function file_get_content(url,post){//仿php
  fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type':'application/json',
    },
    body:JSON.stringify(post),
  })//.then(res => {  //console.log(res.json());
    .then(data => {
      console.log(data);
    });
}

上面代码里请求的网址中的 browser-tabs,是个php文件,代码:

$json=file_get_contents('php://input');
if(substr($json,0,2)=="[["){#]]
  $org="#+STARTUP: nofold\n";
  foreach(json_decode($json,1) as $v){
    $org.=arr_to_org_link($v);
  }
  file_put_contents(__DIR__."/browser-tabs.org",$org);
}else{
  file_put_contents(__DIR__."/browser-tabs.org","no post");
}
function arr_to_org_link(array $v){
  $firefox="d:/program/firefox/firefox.exe";
  $chrome="\\\"C:/Program Files/Google/Chrome/Application/chrome.exe\\\"";
  $host=explode("//",$v[1],2)[1];
  $host=explode("/",$host,2)[0];
  $r='* [[elisp:(shell-command-to-string "'.$chrome.' tabid='.$v[0].'")][toggleTAB]]';
  $r.=' [[elisp:(shell-command-to-string "'.$firefox.' '.$v[1].'")][firefox open]]';
  $r.=' [[elisp:(shell-command-to-string "'.$chrome.' '.$v[1].'")]['.$host.']]';#newTAB 在chrome新标签页中打开
  return $r." \n ". $v[2]." \n";
}

代码就是这些了,遇到的主要难点就是 如何切换标签页,而不是重复打开

如果上面的代码你都能跑得起来,那么就可以打开 browser-tabs.org 这个文件用了。这里可以在加个close关闭标签页,但感觉不是很有必要就没加,切到浏览器里关闭再次确认防止误关闭。

安全提示 免责声明

这个很有必要,因为上面代码在shell中调用浏览器,url中可能会被注入了一些不安全的字符,在shell中不知道会发生的什么,自行评估安全风险

5 个赞

食言了, 在emacs里关闭浏览器标签页这个是非常实用的功能, 我把closTAB加了上去,放到toggleTAB的前面.如图

closeTAB

buffer的自动刷新不太好用, 我准备写个点击链接后延时一两秒主动刷新页面的操作。

上面的代码仅作为参考, 准备等后续实现更完善些后发到github

提个建议,ui可以参考elfeed,每行一个标题,3个按钮可以排在标题后面。

ui每个人的偏好都会不同吧,我不喜欢一行特别长的,于是就分成了两行,一行全是链接,一行全是内容文本.

在org里全是链接也不行,有时会误点击,最好有明显区别,一眼就能看出.

你这个和我以前写的一个emacs管理浏览器下的书签挺像的,我是直接读取Profile下的Bookmark文件解析生成到org buufer里,不需要插件。后来用了一会后发现这需求使用频率是真的低,最后还是用回了浏览器里的vimium

我也是觉得浏览器的书签作用不大,使用频率低,多了又不好找。不如直接用TAB,结果就是TAB数量超了(但firefox却又没有),管理书签不如管理TAB,这个应该是不会有使用频率低的问题

管理tab的话vimium有个搜索tab的键也足够用了,emacs管理这些东西一点就是两者不是集成在一起的,所以需要管理的时候需要切换界面到emacs里,这一点最让我不舒服。除非使用eaf这种将浏览器和emacs界面集成在一起的用起来才舒服很多。

如果应用都习惯开全屏,这是个问题.

应用打开都是全屏这个是移动端设计, pc端我感觉是没有这个必要, 我emacs开两个frame,位置都写死,其中一个frame一直是作为类似侧边栏的形式使用的. 现在这个做系统侧边栏的emacs frame当做了浏览器的侧边栏用.

我浏览器一直都不习惯全屏使用,遇到不全屏显示不全的网站我一般尝试ctrl±,缩小了看,也遇到过缩放都不行,不得不全屏,甚至有时全屏都不行,不得不换超宽显示器

当然有些软件比较重型的,不得不一切过去就是全屏,把其它窗口都覆盖

开始做这个时就有个预感,就是遇到那种超级长的url时会出问题,果然遇到了,org-mode遇到超级长的url时不能正常渲染成链接,如下: orgcms-url

现在浏览器对url的长度好像是没有限制的,无论多长的都可能出现,不光org-mode处理不了,还会把emacs卡死。

这个问题似乎没有什么好的解决办法,目前想出来的办法是在 localhost做一个短网址跳转的工具,把超长url转成短的回避这个问题

网页链接的话是否可以在浏览器那边直接处理

前面说的点击链接后延时2s刷新buffer,超长网页链接缩短防止org-mode里出现超长行都做了,代码重新整理 发到了github ,有兴趣折腾的坛友可以参考下

接下来感觉应该回到org-mode本质的功能,做笔记,针对网页笔记的浏览器插件好像是有不少,有的还与chatGPT相结合,感觉很强大了。但emacs用户应该还是喜欢在org-mode里做网页笔记才有感觉

4 个赞