一个更好的视频码头
创始人
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

热门资讯

“Linux 中国” 开源社区... 这是一个艰难的决定 —— 这不是调侃,而是当你真正做出改变了你十几年生活轨迹的决定时,你就会明白这个...
硬核观察 #1263 德国铁路... #1 德国铁路公司招聘 Windows for Workgroups 3.11 管理员该职位要求了解...
人工智能教程(七):Sciki... 在本系列的 上一篇文章 中,我们用 TensorFlow 构建了第一个神经网络,然后还通过 Kera...
关闭 WSL 中正在运行的 L... 以下是使用 WSL 关闭在 Windows 内运行的 Linux 系统的不同方法。你使用 WSL 在...
MX Linux 23.2 “... 最新的 MX Linux 23.2 小版本更新带来了基本的改进和新增功能。MX Linux 推出了 ...
硬核观察 #1262 网络上最... #1 网络上最古老的软件存档库之一即将关闭美国新墨西哥州立大学(NMSU)最近宣布,即将于 2024...
如何在 RHEL 上通过绑定配... 在 Linux 中,你可以根据自己的需要创建高级网络设置,如 网络绑定 Network Bondin...
Linux Matrix 消息... Matrix 用户可以升级 Fractal 6 了!Fractal 是目前 最好的 Matrix 客...
如何通过 VLC 使用字幕 使用 VLC 媒体播放器播放和管理字幕的新手指南。我是一个超级动漫迷,如果你想观看最新的剧集,那么你...
硬核观察 #1261 X 计划... #1 X 计划在奥斯汀建立内容审核总部据报道,该部门将招聘 100 名全职员工,将主要关注 CSE ...