Firefox — 如何在 Vim 中打开链接(指向任何基于文本的文件)?

Firefox — 如何在 Vim 中打开链接(指向任何基于文本的文件)?

我经常会看到网页上有文件链接,我想直接在 gVim 中打开这些文件(在 Windows 上使用 Firefox 浏览时)。Chrome 专用的答案 — 也很好。

为了让它正常工作,我摆弄了 Firefox 的Tools > Options > Applications设置(它根据 MIME 类型选择要做什么)。但毫无效果。对于大多数这些文件(例如 Python 源文件),单击它们会弹出“打开 filename.py”对话框,其中包含“打开方式”、“保存文件”和其他选项。在“打开方式”下,我可以从下拉列表中选择“其他...”,然后会出现“选择帮助应用程序”对话框。现在,“Vi 改进版 - 文本编辑器”出现在我的列表中,但问题是选择它会打开vim.exe一个 shell 窗口,而我想看到的是gVim.exe。在“选择辅助应用程序”中,我可以选择“浏览...”并导航到 Vim 的目录,选择“gvim.exe”,然后它就可以工作了。但对于下一个文件,它不记得这个设置,我必须重新做一遍。

我怎样才能让它粘在那里,或者使用另一种方式轻松地在 gVim 中打开文件?

通过阅读 Firefox 错误报告,我发现“选择帮助应用程序”对话框是根据给定文件的 MIME 类型填充的,除非用户更改了某些设置,否则该对话框是从 Windows 注册表中获取的。但我希望能够打开任何文件,因此对于我可能想要打开的每个扩展来说,在 Windows 中设置默认值并不是一个好的解决方案。

答案1

首先,Firefox 中的“选择辅助应用程序”设置基于系统设置,因此没有简单的方法来配置。

从可用性角度来看,更好的解决方案是使用名为“打开方式”的 Firefox 扩展https://addons.mozilla.org/en-US/firefox/addon/open-with/

它说它是用于网络浏览器的,但事实证明它可以是任何程序——它只是以 URL 作为第一个参数来调用程序。

接下来我编写了一个 Python 脚本:

import sys, os, re, tempfile, urllib, urlparse, time

handler, url = sys.argv[1:3]
match = re.match(r".*(\.[A-Za-z_]+)$", urlparse.urlparse(url).path)
tmpfile, tmpfile_path = tempfile.mkstemp(suffix=match.group(1) if match else '')
os.close(tmpfile)
print "Downloading to temp file ..."
urllib.urlretrieve(url, tmpfile_path)
#Normally it would try to clean up the file we urlretrieved after this Python
#process ends. Thank BDFL there are no access restrictions on private variables.
urllib._urlopener._URLopener__tempfiles = []

os.execlp(handler, handler, '%s' % tmpfile_path)

#We don't attempt to delete the temporary file because:
# 1. Firefox also doesn't in such cases.
# 2. It's problematic in some instances, such as when the subprocess (this
#     script used to call the handler in a subprocess) finds another copy
#     of itself running, hands the file over to it and exits. Meanwhile, we
#     would be over here deleting the file while the subprocess'es brother
#     hadn't tried to open it yet.

它能做什么:

  1. 在用户的临时目录(在这种情况下与 Firefox 存储文件的位置相同)中创建一个唯一的文件名。

  2. 确保临时文件的扩展名是合理的,即使 URL 包含查询字符串和哈希锚点(urlretrieve(..)没有第二个参数会处理前者,但不处理后者)。这很有用,因为它告诉 Vim 如何语法突出显示文件。

  3. 将文件从 URL 下载到当前用户的Temp目录。

  4. gvim.exe使用(或您选择的编辑器 — — 见下文)打开文件。

如何使用此解决方案:

  1. 将上述 Python 脚本保存为open_with.py您保存此类脚本的地方。

  2. 安装打开用上述链接中的 Firefox 扩展,然后重新启动 Firefox。

  3. 前往Tools > Add-ons > Extensions > Open With > Options。那里:

    (a). (除非你打算使用打开用为了达到其预期目的,“隐藏”列表中的所有浏览器。)

    (b).“添加……” python.exe

    (c). 将其“参数...”设置为脚本的路径,后跟编辑器的可执行文件名或路径。对我来说,这将是
    C:\E\infrastructure\open_with.py gvim.exe

    (d)“重命名...”为“gVim”。

  4. 确保它gvim.exe位于 PATH 变量中。我建议EditPATH Autohotkey 脚本,可以使用 AHK 工具编译为 EXE(将其放入Quick Launch文件夹中以方便使用 - 编辑 PATH 只需三次单击,而不必再次经过控制面板内存测试。)否则,您必须gvim.exe在步骤 3(c)中提供完整路径。

  5. 就是这样。现在在 Firefox 中找到一个文件链接,右键单击它,然后选择“使用 gVim 打开链接”。

上下文菜单的屏幕截图

(猜猜我是怎么得到正确的图标的:)

奖励:如果你在打开用扩展的选项,您也可以右键单击 Firefox 选项卡并在 Vim 中打开(大多数)网页 - 例如,类似于“查看源代码”,但使用 Vim。

请注意,此解决方案同样适用于 Emacs、Notepad++ 和许多其他不仅限于文本编辑器的软件。例如,我刚刚尝试使用 GIMP,它打开了一个 PNG 文件。(为此,请将gvim.exe上面的内容替换为 GIMP 的路径。注意:要以这种方式打开任意图像(而不仅仅是链接),您可以看图,然后右键单击其选项卡。)


历史记录:最初我打算编写一个 BAT 脚本,但是在该测试用例失败后就变得站不住脚了:http://evgeni.org/w/api.php?format=xml&action=query&titles=AutoHotkey_shortcuts&prop=revisions&rvprop=content
这是因为cmd.exe包含该字符的参数存在问题=。此外,这不仅仅是gvim.exe使用 URL 作为命令行参数进行调用的问题(尽管 Vim 确实接受 URL),因为它无法处理这个测试用例 — 只会打开一个空白的 Vim 实例。而为了解析 URL,我不得不求助于 Powershell,这在一定程度上限制了解决方案的可移植性。最后,我决定将 Python 安装作为先决条件并不算过分。

相关内容