Linux中國

一個更好的視頻碼頭

之前,我在寫 有關 embark 的內容,我的第一設備為啟動遠程視頻流設計了一個新的 embarkembark 的作者 Omar Antolín Camarena 不僅閱讀了這篇內容,還點評了一下我認為值得跟進的一些重大改進。

首先,你應該記得我們曾定義過一個檢測視頻 URL 的函數:

    (defun jao-video-finder ()
      "Check whether we're looking at a video URL.
    Return (video-url . <URL>) if so."
      (when-let ((url (thing-at-point-url-at-point)))
        (when (string-match-p jao-video-url-rx url)
          (cons &apos;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) &apos;video-url &apos;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) &apos;video-url &apos;url) url))

    (add-to-list &apos;embark-transformer-alist &apos;(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 &apos;embark-keymap-alist &apos;(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) &apos;video-url &apos;url) url))

另一種達成同件事情的方式(再次向 Omar 致敬)便是為 w3m 的錨點放置一個特定的巡檢器(且繼續使用 video-url 的轉換器):

    (defun jao-w3m-url-finder ()
      (when-let ((url (w3m-anchor)))
        (cons &apos;url url)))

    (add-to-list &apos;embark-target-finders #&apos;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中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國