一个更好的视频码头
创始人
2024-03-02 15:04:22
0

之前,我在写 有关 embark 的内容,我的第一设备为启动远程视频流设计了一个新的 embark。embark 的作者 Omar Antolín Camarena 不仅阅读了这篇内容,还点评了一下我认为值得跟进的一些重大改进。

首先,你应该记得我们曾定义过一个检测视频 URL 的函数:

    (defun jao-video-finder ()
      "Check whether we're looking at a video URL.
    Return (video-url . ) if so."
      (when-let ((url (thing-at-point-url-at-point)))
        (when (string-match-p jao-video-url-rx url)
          (cons 'video-url url))))

当我们得到了一个非空的 url 值,即便它不是一个视频链接,但它仍然是一个确切的 URL,并且 embark 已有了一个 url 类别,所以我们可以借助默认的 URL 寻检器存储一个新的句法分析,语句如下:

    (when-let ((url (thing-at-point-url-at-point)))
      (cons (if (string-match-p jao-video-url-rx url) 'video-url 'url) url))

这里有一个潜在的缺点就是:我们重写了 embark 的寻检器,embark-target-url-at-point,所以我们可能更愿意保留后者。

实际上多亏了 embark 的 目标转换器 我们才能做成。我们可以在 embark-transformers-alist 中添加任意一个函数,应用于任何一个给定类别的目标,而 embark 会将其转换后的值应用于它的操作中。Omar 很贴切地把这个过程称为“目标的精化”;我们具体做法如下:

    (defun jao-refine-url-type (url)
      "Refine type of URL in case it is a video."
      (cons (if (string-match-p jao-video-url-rx url) 'video-url 'url) url))

    (add-to-list 'embark-transformer-alist '(url . jao-refine-url-type))

通过这种策略,我们就不再需要 jao-video-finder 了,而且从概念上来说,我们的 video-url 应该被定义为一个精化操作而并非是一个目标 [脚注 1]。Omar 的第二个提议也与这个概念相契合:想必我们都希望所有关于 url 和我们的 video-url 的操作都是可用的,不是吗? 唔,这就是为什么我们用来定义行为的 embark-define-keymap 的宏可以通过使用关键字 [脚注 2] :parent 继承其他键映射中已经定义的所有操作的原因:

    (embark-define-keymap jao-video-url-map
      "Actions on URLs pointing to remote video streams."
      :parent embark-url-map
      ("p" jao-play-video-url))

    (add-to-list 'embark-keymap-alist '(video-url . jao-video-url-map))

这种继承键映射的功能并非是 embark 的附属功能:vanilla Emacs 键映射通过标准函数 set-keymap-parent 已经搞定它了。你可以完全不用 embark-define-keymap 来定义 jao-video-url-map,工作原理是一样的。

这样,我们的代码就能够更短,特征更多:谢谢你,Omar!

脚注 1:在某些情况下,保留 jao-video-finder 是有意义的,即,如果我们想要改变检测 URL 的功能的话。例如,我在使用 emacs-w3m 的时候,经常有一个 URL 作为文本属性储存了起来(实际文本是个链接文本)。要通过那里检索 URL,就需要调用 w3m-anchor,而用 embark-target-url-at-point 就会错过它。对于这种情况,我最终编写(并使用)jao-video-finder 将其通过下文定义:

    (when-let ((url (or (w3m-anchor) (thing-at-point-url-at-point))))
      (cons (if (string-match-p jao-video-url-rx url) 'video-url 'url) url))

另一种达成同件事情的方式(再次向 Omar 致敬)便是为 w3m 的锚点放置一个特定的巡检器(且继续使用 video-url 的转换器):

    (defun jao-w3m-url-finder ()
      (when-let ((url (w3m-anchor)))
        (cons 'url url)))

    (add-to-list 'embark-target-finders #'jao-w3m-url-finder)

这种方法更加模块化,并且取决于你们的喜好,且更加巧妙。这些功能都很小巧并且两种方法之间并没有太大的差别,但是如果其中某一种继续加入更多寻检器的话,前一种方法用起来来反而会让一切变得更糟。

脚注 2:在我最开始的例子中,我在视频地图中还添加了 browse-urlbrowse-url-firefox。前一个已不再重要,因为它已经在 embark-url-map 中出现过了,如果我们想让 browse-url-firefox所有 的 URLs 可用,我们可以将其加入到 embark-url-map (谨记,embark 的键映射只是 Emacs 的键映射)。这是另一种扩展 embark 的简便方法。

(题图:MJ:emacs video geek wallpaper dark plain background Illustration)


via: https://jao.io/blog/an-even-better-video-wharf.html

作者:jao 选题:lujun9972 译者:Drwhooooo 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

不使用emacsclien...
要在不使用emacsclient的情况下构建和安装Emacs,可以...
2024-12-28 15:01:45
不清楚EmacsLisp函...
下面是一个 Emacs Lisp 函数示例,可用于比较和演示:(d...
2024-12-27 14:01:19
比较emacs和vim,它...
Emacs和vim都是强大的文本编辑器,具有各自的优点和缺点。Em...
2024-12-13 14:31:36
崩溃:"Ctrl...
在"emacs -nw"中,按下"Ctrl-g"键可以取消当前操作...
2024-11-30 18:00:56
林纳斯•托瓦兹参与了Lin...
Linux内核已经33岁了,它的创造者Linus Torvalds...
2024-10-02 16:27:47
Aquamacs载入.em...
这个问题通常是因为在.emacs文件中使用了过时的(已弃用的)函数...
2024-09-11 22:01:40

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
什么是 KDE Connect... 什么是 KDE Connect?它的主要特性是什么?它应该如何安装?本文提供了基本的使用指南。科技日...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...