diff --git a/lisp/+link-hint.el b/lisp/+link-hint.el index a6999b7..205e915 100644 --- a/lisp/+link-hint.el +++ b/lisp/+link-hint.el @@ -2,6 +2,7 @@ ;;; Code: +(require 'cl-lib) (require 'link-hint) (defgroup +link-hint nil @@ -25,6 +26,67 @@ (defvar +link-hint-map (make-sparse-keymap) "Keymap for `link-hint' functionality.") +(cl-defmacro +link-hint-define-keyword (keyword handler docstring + &optional (types 'link-hint-types) + &rest rest + &key multiple &allow-other-keys) + "Set up a `link-hint' KEYWORD, with optional TYPES. +If TYPES is not present, use `link-hint-types'. + +KEYWORD defines the link-hint type. It will be used to create a +function for opening links of the form \"link-hint-openKEYWORD\". + +HANDLER is the function to open a link with. + +DOCSTRING is the macro's documentation. + +Keyword arguments are passed to `link-hint-define-type' prefixed +with the KEYWORD." + (declare (indent 2) + (doc-string 3)) + (let ((types (symbol-value types)) + (func-sym (intern (format "+link-hint-open%s" keyword))) + (mult-sym (intern (format "%s-multiple" keyword))) + (expr)) + ;; Define the type + (push `(dolist (type ',types) + (link-hint-define-type type + ,keyword ,handler + ,@(mapcar (lambda (el) + (if (eq el :multiple) + mult-sym + el)) + rest))) + expr) + ;; Define an opener + (push `(defun ,func-sym () + ,(format "%s\n\nDefined by `+link-hint-define'." docstring) + (interactive) + (avy-with link-hint-open-link + (link-hint--one ,keyword))) + expr) + ;; Handle `:multiple' + (when multiple + (push `(defun ,(intern (format "+link-hint-open-multiple%s" keyword)) () + ,(format "Open multiple links with `%s'.\n\nDefined by `+link-hint-define'." + func-sym) + (avy-with link-hint-open-multiple-links + (link-hint--multiple ,keyword))) + expr) + (push `(defun ,(intern (format "+link-hint-open-all%s" keyword)) () + ,(format "Open all visible links with `%s'.\n\nDefined by `+link-hint-define'." + func-sym) + (avy-with link-hint-open-all-links + (link-hint--all ,keyword))) + expr)) + ;; Return the built expression + `(progn ,@(nreverse expr)))) + +(+link-hint-define-keyword :secondary browse-url-secondary-browser-function + "Open a link in the secondary browser." + +link-hint-open-secondary-types + :multiple t) + (defun +link-hint-open-secondary-setup (&optional types) "Define the `:open-secondary' link-hint type for TYPES. If TYPES is nil, define it for `+link-hint-open-secondary-types'."