(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 'video-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-define-keymapファインダーを書き換えてしまうというデメリットがあります。
これはembarkのおかげで実際に可能です。 (embark-define-keymap jao-video-url-map このプロセスを「ターゲットの絞り込み」と呼んでいます:
(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の2番目の提案は、このコンセプトに適合しています。 そのため、 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))
この継承されたキーマップ機能は実装依存ではありません: バニラEmacsキーマップは標準のset-keymap-parent関数ですでに対応しています。jao-video-url-map を embark-define-keymap なしで定義しても同じように動作します。
こうすることで、コードをより短く、より多くの機能を持たせることができます!
脚注1: 場合によってはjao-video-finderを残しておく意味があります。例えば、私がemacs-w3mを使っているとき、URLをtext属性として保存していることがよくあります(実際のテキストはリンクテキストです)。そこから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))
同じことを達成するもう一つの方法は、w3mのアンカーポイントに特定のローバーを配置することです:
(defun jao-w3m-url-finder ()(when-let ((url (w3m-anchor)))(cons 'url url)))(add-to-list 'embark-target-finders #'jao-w3m-url-finder)
この方法はよりモジュール化されており、好みにもよりますが、より賢い方法です。機能は小さく、2つの方法に大きな違いはありませんが、どちらかが検出器を増やし続けると、前者の方法はすべてを悪化させるでしょう。





