TabFS是一种浏览器扩展,可将浏览器选项卡安装为计算机上的文件系统。
开箱即用,它支持macOS和Linux上的Chrome和(在较小程度上为1)Firefox。 2
标签文件夹中的文件直接反映(并可以控制)浏览器中该标签的状态。 (待办事项:随着我的添加而更新)
这给了您无穷的力量,因为现在您可以在计算机上应用所有已经知道如何处理文件的现有工具-终端命令,脚本语言等-并使用它们来控制浏览器并与之通信。
现在,您不需要每次执行任何操作时都从头开始编写浏览器扩展程序。您可以编写一个脚本来与您的浏览器进行交互,例如Python和bash的混合物,并且可以将其另存为可以在任何时候运行的单个普通文件,与编写计算机其他任何部分的脚本没有什么不同。
(假设您的当前目录是gitrepo的fs子目录,并且您正在运行扩展名)
$ cat mnt / tabs / by-id / * / title.txtGitHubExtensionsTabFS / install.sh at master·osnr / TabFSAlternative Extension Distribution Options-Google ChromeWeb商店托管和更新-Google ChromeHome / Twitter ...
我在这里在Emacs中使用Dired,但是您可以使用任何感觉舒适的文件管理工具。
(这个任务删除了所有标题中包含一些字符串的选项卡,虽然有点困难,但这不是那么不现实,对吧?)
(现在...如果没有TabFS,您将如何做到这一点?老实说,我的想法不在我头上了。例如,您甚至如何获得tabs的标题?如何告诉浏览器关闭它们?)
(我查找了API,如果您已经在浏览器扩展中,请在扩展中的后台脚本中查找,并且您的扩展具有制表符权限-这已经需要您执行2个单独的文件,并在浏览器和文本编辑器之间进行跳跃以进行设置!-您可以执行以下操作:chrome.tabs.query({},tabs => chrome.tabs.remove(tabs.filter(tab =&gt ; tab.title.includes(' Stack Overflow'))。map(tab => tab.id))))
(这并不可怕,但是要检查所有的前期开销以进行设置。并不是所有可发现的操作。如果以后要重用它,或者将其插入计算机上更大的工具管道中,或者提供它是一个可视化的界面吗?一旦您需要与任何东西进行通信(可能设置一个WebSocket,设置处理程序和一个状态机),复杂性就会急剧增加)
(但老实说,我什至不会想到这是我一开始就可以做的事情)
假设您正在使用Chrome扩展程序(此扩展程序除外)。每当您更改其代码时,都很难重新加载该扩展程序(以及可能受影响的网页)。有一个Stack Overflow帖子,提供了自动执行此操作的方法,但是它们都是很容易破解的。您还需要另一个扩展,或者需要对正在进行的扩展添加怪异的权限,而不仅仅是从编辑器或外壳程序中获取可以触发以刷新该扩展的命令。
通过TabFS,您可以在普通的shellscript中完成所有这些操作。您根本不必编写任何浏览器端代码。
该脚本关闭扩展名(此标题为“ PlaygroundizeDevTools协议”),然后重新打开,然后重新加载打开了相关页面的所有选项卡(在这种情况下,我决定了它39; s标签的标题以" Chrome Dev"开头):
我将此脚本映射到Ctrl-。在我的文本编辑器中,现在每次要重新加载扩展代码时,我都点击了。
在标签文件夹中编辑page.html。我想起初它可能只是stompouterHTML,最终可以做一些更复杂的事情
(这里也有一个持久的存储故事也很酷。我喜欢这样的想法,即实际上可以在子树中的任意位置放置任意文件,因为这样您就可以免费使用git和emacsautosave以及其他东西了……嗯)
现在,您可以选择window.scrollY,并随时查看页面上的滚动位置。
可以在网页周围制作一个临时仪表板:一堆在屏幕周围漂浮的终端窗口,每个终端窗口成一个循环,并使用cat监视另一个变量。
将JSON文件foo.json拖到选项卡的imports子文件夹中,并显示为JS中的对象imports.foo。 (在JS中修改imports.foo,然后读取imports / foo.json,然后您又读回更改?)
导入绘图库或以任何相同的方式?将plotlib.js拖动到imports / plotlib.js中,然后调用imports.plotlib()来调用该JS文件
作为一种交互式编程环境,浏览器具有巨大的潜力,在这种环境中,图形与大多数编程语言中的控制台I / O一样自然地出现。我认为阻碍开发的原因是缺乏将...拖动文件并使用体面的工具进行管理的能力。许多基于Web的' IDE'必须从头开始重新创建文件管理等,这就像将Universe与计算机的其余部分分开,并且在一个与另一个之间进行迁移是一个真正的痛苦(如果您想使用某些Python库来整理一些数据,然后例如,基于Web的可视化,或者您想对其内部的文件进行版本控制,或者制作快照,以便于尝试某些东西,等等。
(这里的持久存储故事是什么?localStorage?这很有趣,因为我几乎希望每个标签都减少商品的使用量,减少可丢弃性,因为现在这是我将网站拖到和它可能具有某种持久状态,例如,如果我正在编程和编辑内容并保存在选项卡文件夹中,则该选项卡突然变得很重要;与大多数浏览器选项卡不同,希望该选项卡能够在普通文件中生存下来今天)
免责声明:此扩展程序是一个实验。我认为它很酷,有用且具有挑衅性,我通常会保留它,但是我对功能或特别是安全性没有任何要求。应用程序可能会冻结,浏览器可能会冻结,Web页面可能有一些方法可以使用该扩展名逃避并损害您的计算机……从某种意义上说,此扩展的全部目的是在浏览器和软件之间创建巨大的通信新表面积在计算机的其余部分上。
(我认为,对于Opera或任何其他基于Chromium的浏览器,您可以使其正常运行,但是您需要在ininstall.sh中更改本机消息传递路径。不确定Safari。也许也可以使用Edge?如果您还需要Windows编译)
记下Chrome分配的扩展程序ID。我的是jimpolemfaeckpjijgapgkmolankohgj。我们将在以后使用。
您将需要作为临时扩展安装,因此只能在当前的FF会话中使用。 (待办事项:这是可修复的吗?签名的东西吗?)
首先,请确保您具有FUSE和FUSE标头。例如,在Linux上,sudo apt安装libfuse-dev或等效版本。在macOS上,获取FUSE formacOS。
现在,将本机消息传递主机安装到浏览器中,以便扩展名可以启动并与文件系统对话:
打开后台页面检查器,以查看其中的文件系统操作流。(在Chrome浏览器中,单击Chrome扩展程序页面中扩展名条目中的“检查视图”旁边的“背景页面”。 ;在Firefox中,单击" Inspect")
该控制台对于调试任何可能发生的错误也非常有用。 (如果在TabFS上运行命令时在外壳上遇到通用I / Oerror,则可能意味着发生了异常,您可以在此处检查。)
(我的OS和应用程序非常闲谈。即使我感觉我实际上并没有做任何事情,它们也进行了大量操作。我的感觉是,macOS通常比Linux更聊天。)
fs /:本机FUSE文件系统,用C tabfs.c编写:与FUSE对话,实现fs操作,与扩展对话。不必更改此文件;它本质上只是一个将所有内容转发到浏览器扩展的存根。
extension /:浏览器扩展,用JS background.js编写:最有趣的文件。定义所有合成文件以及它们在后台调用的浏览器操作。 4
macOS / Linux认为此路径是FUSE文件系统的一部分,因此将open()传递到FUSE内核模块,
然后tabfs_open将请求改写为JSON字符串,然后通过stdout(' nativemessaging')将其转发给我们的浏览器扩展,
我们在extension / background.js中的浏览器扩展会收到传入消息;它会触发/tabs/by-id/*/title.txt的路由,该路由会调用浏览器扩展API browser.tabs.get获取有关标签ID 6377的数据,包括其标题,
因此,当cat稍后再执行read()时,标题可以通过JSON本地消息发送回tabfs.c,最后返回FUSE,内核和cat。
添加更多合成文件!查看DOM节点,快照当前页面的HTML,将对象拼写为活动对象。看看您的代码在做什么。使更多文件可写
更多持久性的东西。正如我之前说的,如果您可以在子树中放置任意文件,这也很酷,因此.git,Mac Extendedattrs,编辑器临时文件等都可以工作。使它能够表现得像“真实”文件系统。就像我之前说过的那样,事实是有些奇怪,标签是如此的一次性使用;它们的生命周期与我的实际文件系统的大部分不同。如何微调呢?
为什么不能预览打开的图像? GUI程序经常由于某种原因而与文件系统发生冲突。 CLI更可靠
多线程。关键约束是我将-s传递给tabfs.c中的fuse_main,这使所有内容都是单线程的。但是我不清楚它可以提高多少性能?也许很多,但不确定。也许取决于工作量?
扩展本身(以及fs和扩展之间的stdin / stdout comm)仍将是单线程的,但是由于大多数内容都是异步的,因此您可以交错请求。就像需要半秒钟的屏幕截图请求一样,您可以在等待浏览器返回给您的同时进行其他操作(?)
另一个问题是,如果任何个人请求仍然挂起,则应用程序往往会挂起;他们不希望文件系统这么慢(对他们来说公平的是,他们确实没有办法)。其中的一些问题对于任何FUSE文件系统来说都是不可避免的,即使您认为这些问题经过了合理的测试和设计,如sshfs一样?
其他性能方面的功能-记住我们何时已经接触到东西,引用计数,最大程度地减少浏览器往返次数。不确定这些影响
寻找对Firefox / Windows / Safari / etc等的支持。Windows的最佳FUSEequiv?您是否可以桥接到所有已经必须具有增强功能的远程调试API?或只是用JS猴子补丁实现?
Processs as Files(1984),Julia Evans / proc comic设计了原始的/ proc文件系统。太酷了!在如何将文件的现有接口重新应用到Unixprocesses的新域方面非常出色。但是我现在在乎Unix进程多少呢?这些天,我关心的大多数程序都是Web页面,而不是Unix进程。所以我想采用/ proc的方法-将您关心的内容公开为文件系统。 -并将其应用于现代工具:浏览器内部。 '浏览器标签作为文件'
有两个'操作系统'在我的计算机,浏览器和Unix以及Unix上,到目前为止,作为计算环境(它的概念由外壳,进程,文件组成),其访问性,可编程性和内聚性更高,尽管可以说对我的日常而言它不那么重要生活。浏览器如何具有Unix的更多属性?
扩展浏览器扩展太困难了。甚至进行扩展是一个不好的框架; ituggests进行扩展是一个整体,一个整体项目。例如,为什么我不能花一分钟时间问浏览器一个问题或告诉它自动执行某些操作?亮度
这些浏览器控件API的许多现有用法都处于自动化环境中:作为某些管道的一部分,在机器人浏览器上测试代码。我对交互式的最终用户上下文更感兴趣。增强了我使用日常浏览器的方式。这就是为什么这是扩展。它并不需要浏览器在您总是忘记打开的某些奇怪的远程调试模式下运行。它一直在运行
发生任何问题时,系统调用跟踪(dtruss orstrace)超级有用。 (需要在macOS上禁用SIP。)组合dtruss(应用程序端)&控制台日志记录fs请求/响应(文件系统端)提供了对端到端基本上所有问题的大量了解
我学会了尝试任何这种顺序。首先,无论是简单的shell命令还是纯C调用--shell命令都更符合人体工程学,C调用具有其实际调用的syscall的最清晰模型。只有这样,您才移至文本编辑器或Mac Finder,这是一个很好的选择,并且一次在文件系统上抛出了很多东西(这样可能会出错)
对于扩展API中的许多内容,浏览器可以将更新通知给您,但没有明显的方法来查询完整的currentstate。因此从一开始我们就需要坐在很多地方,并累积传入事件以了解例如上次更新标签页或当前在该标签页上运行的脚本列表
文件系统为'打开输入空间'除了该特定文件系统关心的内容之外,还有什么可以说的。 (这让我想起了Screenotate -屏幕快照为您提供了一个开放的字段,您可以在其中进行OCR不一定识别或关注的东西。对于Dynamicland的真实世界;您可以随意书写笔记,即使计算机没有笔记也可以;看不到他们)
现在,您拥有了整个工具集,可以控制和自动化您的浏览器。这是一个已经建立起来的现有资本,那里有很多人,很多应用软件和许多编程语言……已经知道使用文件的操作
这个项目很不错,因为我立即获得了我关注的数据集。 Ifound自己真正地使用它很快-清除了我的标签,以帮助我在浏览器中开发其他内容,以便可以从编辑器中触发一些动作,...
SQLite虚拟表具有与FUSE合成文件系统tome相同的功能,除了代替文件操作,SQL和SQL。是他们背负的众所周知的界面/知识库/生态系统。 osquery似乎特别酷
计划9。我对Acme texteditor中的可扩展性有很多想法,其中编辑器提供了一个合成文件系统,而不是插件API。
https://luciopaiva.com/witchcraft/对于如何设置用户脚本具有正确的想法。只是制作文件-不要制作自己怪异的UI来添加和删除它们。 (猜测这是一种政治上或受众上的折衷方案,某些用户可能对管理文件感到满意,但您可能会疏远其他人。嗯)
rmdir一个非空目录-当我在考虑即使TABID是文件夹时是否也应该能够通过by-id / TABID rm。我觉得像Plan 9之类的新操作系统应该将其文件I / O API推广到足以避免此类问题的程度。喜欢在设计磁盘的同时还要考虑一些综合文件系统,非常慢的远程文件系统等的具体情况
由于缺少chrome.debugger API的扩展名,您可以找到一种方法将其连接到Firefox和其他浏览器中的远程调试协议,并获得目前仅适用于Chrome的第二级功能。
[返回]
它可能可以在支持WebExtensions API的其他浏览器(如Safari和Opera)以及在Windows上使用Dokan或WinFUSE / WSL的东西(?)上运行,但是我没有想到。
[返回]
也许其中一些比其他人感觉更重要,更充实,更紧急。我真正想做并达到的目标与满足某些教学法的目标(简单解释,堆叠在前面的示例之上,...)
[返回]
令我沮丧的是,我无法向您显示此源文件的目录。因为它确实具有结构!因此我觉得用于查看该文件的UI应该进行定制,以突出显示和利用该结构。 (我想知道还有什么其他类似的情况,其中一个文件的临时UI会有用。例如,如果您的业务逻辑错综复杂,或者是模拟器或解释器的Giantopcode switch语句。)
我想将您链接到特定的路由并在此进行讨论,并且还包含某种包含在内的内容(没有制作很多微小的单独文件的令人恐惧的混乱)。我想使用排版和空格将该文件中的路由分开设置,并将它们与实用程序功能& default实现&联网。
[返回]