在命令行中调用浏览器打开网页时可否先让浏览器检查是否已经打开,有则跳转,否则重新打开 | 如何防止网页重复打开

在浏览器中用模糊搜索 的贴子里 ,我设想了在org-mode中分组和搜索浏览器标签页的办法,如果能解决几个难点应该是可行的, 比如这个问题我问chatGPT给出了: chrome.exe --new-window --new-tab "<URL>"firefox.exe -new-tab "<URL>"

我试了一下,没有效果, 不知道是否有办法能做到这点.

当然也不是非要用org-mode, 只要是外部程序与浏览器交互应该都会遇到这个问题

chrome的所有命令行可用选项应该都在这里了 List of Chromium Command Line Switches « Peter Beverloo ,1000多个,但可惜的是我却找不到网页 有则跳转、无则打开 的选项。

但我记得chrome以前好像不是这个样子的(或者是某个基于chrome的浏览器),点击地址栏输入网址时,如果输入的网址是已经有标签页打开的,会跳转过去。不知道从什么时候开始就不会跳过去了,只会重复的打开相同的网页,导致标签页越来越多。

firefox 有插件可以自动关掉重复的 tabs。

macOS 有这样的工具 GitHub - prasmussen/chrome-cli: Control Google Chrome from the command line

Windows 的话你可以写一个 Chrome Extension

  1. 使用 Native messaging 获取命令行发过来的消息
  2. 使用 chrome.tabs.query 获取所有 tabs
  3. 如果 tabs 包含消息中的 url 就使用 chrome.tabs.update 把这个 tab 设置为 active,否则通过 chrome.tabs.create 用这个 url 创建一个新 tab

@yuandi42 正解,稍微搜了一下,chrome 也有类似的拓展,当然也可以使用 chrome.tabs 的 API 自己写一个,不需要接收从命令行发过来的消息,只用监测新的 tab 的 url 并和现有 tabs 的 urls 做对比进行操作就可以了。

感谢回复,我简单实现了一个。

在浏览器扩展的 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);//关闭当前页面
  }
});

然后外部程序只要得到标签页对应的tabid (chrome.tabs.query) 就可在生成链接时这样写 chrome.exe tabid=940781025,只要tabid无误就可以点击链接后在不同的标签页之间切换了,域名不是tabid开头的那就是打开新页面。

感觉离实现在emacs中搜索、分组、切换标签页又前进了一步

2 个赞

我开始传参数时没有写 tabid=,直接在chrome.exe后面跟 tabid,chrome.exe 940781025 ,结果后面的数字自动转换成了 http://56.19.45.225/,才发现纯数字和ip地址间可以转换

赞,还有把 tabid 当命令行参数进行操作的方法,之前没了解过。


用 tabid 保证不了 tab 是不是重复,而且得先获取 tabid,如果一直不关的话倒没啥问题,否则用 url 的操作性会更简单一些。