aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuchen Pei <hi@ypei.me>2022-10-11 13:58:25 +1100
committerYuchen Pei <hi@ypei.me>2022-10-11 13:58:25 +1100
commit54ea91260151fc1f5cdca9af584f179edd8299a9 (patch)
tree4965b9789299a83a7563f9bc7870f6a4330ef6bc
initial commit
-rw-r--r--.gitignore1
-rw-r--r--hmm.el53
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
diff --git a/hmm.el b/hmm.el
new file mode 100644
index 0000000..10e0e42
--- /dev/null
+++ b/hmm.el
@@ -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)