diff options
author | Yuchen Pei <hi@ypei.me> | 2022-10-11 13:58:25 +1100 |
---|---|---|
committer | Yuchen Pei <hi@ypei.me> | 2022-10-11 13:58:25 +1100 |
commit | 54ea91260151fc1f5cdca9af584f179edd8299a9 (patch) | |
tree | 4965b9789299a83a7563f9bc7870f6a4330ef6bc |
initial commit
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | hmm.el | 53 |
2 files changed, 54 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e4e5f6c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*~
\ No newline at end of file @@ -0,0 +1,53 @@ +;; -*- lexical-binding: t; -*- + +(defvar hmm-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) + +(defmacro hmm-define-web-search-engine (engine browser) + (let* ((engine-name (plist-get engine :name)) + (browser-name (plist-get browser :name)) + (function-name (intern + (format "hmm-search-%s-%s" engine-name browser-name)))) + `(progn + (defun ,function-name (query) + ,(format "Search %s in %s." engine-name browser-name) + (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)))) + +(defun hmm-add-to-favourite-commands (command) + (add-to-list 'hmm-favourite-commands command)) + +(defun hmm-search-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) + (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) |