diff options
| author | Yuchen Pei <hi@ypei.me> | 2022-10-14 13:21:32 +1100 | 
|---|---|---|
| committer | Yuchen Pei <hi@ypei.me> | 2022-10-14 13:21:32 +1100 | 
| commit | d8ed5b455f1d916d1539c3f8b9a1669640e5585e (patch) | |
| tree | f96c2056413adcc2db10f7ea4b2e3f40e2dce154 | |
| parent | 54ea91260151fc1f5cdca9af584f179edd8299a9 (diff) | |
adding url / file / query handlers
| -rw-r--r-- | hmm.el | 104 | 
1 files changed, 75 insertions, 29 deletions
@@ -1,9 +1,9 @@  ;; -*- lexical-binding: t; -*- -(defvar hmm-search-engines nil "hmm web search engines.") +(defvar hmm-web-search-engines nil "hmm web search engines.")  (defvar hmm-web-browsers nil "hmm web browers.")  (defvar hmm-query-handlers nil "hmm query handlers.") -(defvar hmm-favourite-commands nil) +(defvar hmm-commands '(:query nil :url nil :file nil))  (defmacro hmm-define-web-search-engine (engine browser)    (let* ((engine-name (plist-get engine :name)) @@ -16,38 +16,84 @@           (interactive ,(format "sSearch %s in %s for: " engine-name browser-name))           (,(plist-get browser :command)            (format ,(plist-get engine :format) query))) -       (hmm-add-to-favourite-commands ',function-name)))) +       (hmm-add-command '(:command ,function-name) :query)))) -(defun hmm-add-to-favourite-commands (command) -  (add-to-list 'hmm-favourite-commands command)) +(defun hmm-add-command (command handling) +  (let ((commands (plist-get hmm-commands handling))) +    (add-to-list 'commands command) +    (plist-put hmm-commands handling commands))) -(defun hmm-search-region (from to) +(defun hmm-query-region (from to)    (interactive "r")    (unless (region-active-p) (error "Region not active."))    (let* ((query (buffer-substring from to)))      (hmm-search-internal query))) -(defun hmm-search (query) +(defun hmm-thing-at-point () +  (interactive) +  "Prompt for what to do with thing at point. + +If it is a file, display a list of file handlers. +If it is a url, display a list of url handlers." +  (cond ((thing-at-point-url-at-point) +         (hmm-url (thing-at-point-url-at-point))) +        ((thing-at-point-file-at-point) +         (hmm-file (thing-at-point-file-at-point))) +        (t (hmm-query (word-at-point))))) + +(defun hmm-query (query)    (interactive "sQuery: ") -  (hmm-search-internal query)) - -(defun hmm-search-internal (query) -  (let ((selected (completing-read -                   (format "Search %s using: " query) -                   (mapcar -                    (lambda (command) -                      (format "%s (%s)" command -                              (if (documentation command) -                                  (car -                                   (split-string -                                    (documentation command) -                                    "\n")) -                                "Undocumented"))) -                    hmm-favourite-commands)))) -    (funcall (intern (car (split-string selected " ("))) query))) - -(dolist (engine hmm-web-search-engines) -  (dolist (browser hmm-web-browsers) -    (eval `(hmm-define-web-search-engine ,engine ,browser)))) - -(mapc 'hmm-add-to-favourite-commands hmm-query-handlers) +  (hmm-open-internal query :query "Search %s using: ")) + +(defun hmm-url (url) +  (interactive (list (read-string "URL: " (thing-at-point-url-at-point)))) +  (hmm-open-internal url :url "Handle url %s using: ")) + +(defun hmm-file (file) +  (interactive (list (read-string "File: " (thing-at-point-file-at-point)))) +  (hmm-open-internal file :file "Handle file %s using: ")) + +(defun hmm-open-internal (thing type prompt) +  (let ((selected +         (completing-read +          (format prompt thing) +          (mapcar +           (lambda (command) +             (format "%s (%s)" command +                     (if (documentation command) +                         (car +                          (split-string +                           (documentation command) +                           "\n")) +                       "Undocumented"))) +           (hmm-filter-commands thing type))))) +    (funcall (intern (car (split-string selected " ("))) thing))) + +(defun hmm-filter-commands (thing type) +  (mapcar +   (lambda (handler) +     (plist-get handler :command)) +   (seq-filter +    (lambda (handler) +      (string-match (or (plist-get handler :regex) ".*") thing)) +    (plist-get hmm-commands type)))) + +(defun hmm-update-commands () +  (interactive) +  (setq hmm-commands '(:query nil :url nil :file nil)) +  (dolist (engine hmm-web-search-engines) +    (dolist (browser hmm-web-browsers) +      (eval `(hmm-define-web-search-engine ,engine ,browser)))) +  (mapc (lambda (command) (hmm-add-command command :query)) +        hmm-query-handlers) +  (mapc (lambda (browser) +          (add-to-list 'hmm-url-handlers +                       (list :command (plist-get browser :command) +                             :regex "^http\\(s\\)?://.*$"))) +        hmm-web-browsers) +  (mapc (lambda (command) (hmm-add-command command :url)) +        hmm-url-handlers)) + +(hmm-update-commands) + +(provide 'hmm)  | 
