about summary refs log tree commit diff
path: root/users/tazjin/emacs/config/functions.el
diff options
context:
space:
mode:
Diffstat (limited to 'users/tazjin/emacs/config/functions.el')
-rw-r--r--users/tazjin/emacs/config/functions.el17
1 files changed, 17 insertions, 0 deletions
diff --git a/users/tazjin/emacs/config/functions.el b/users/tazjin/emacs/config/functions.el
index a5f109f4b5a6..6e2cff7caec9 100644
--- a/users/tazjin/emacs/config/functions.el
+++ b/users/tazjin/emacs/config/functions.el
@@ -332,4 +332,21 @@ names, instead of only their names (which might change)."
                        (get-buffer name))))
     (switch-to-buffer (or selected name) nil 't)))
 
+(defun run-xdg-app ()
+  "Use `//users/tazjin/gio-list-apps' to retrieve a list of
+installed (and visible) XDG apps, and let users launch them."
+  (interactive)
+  (let* ((apps-json (s-lines (s-trim (shell-command-to-string "gio-list-apps"))))
+         (apps (seq-map (lambda (app)
+                          (let ((parsed (json-parse-string app :object-type 'alist)))
+                            (cons (cdr (assoc 'name parsed))
+                                  (cdr (assoc 'commandline parsed)))))
+                        apps-json))
+
+         ;; Display the command that will be run as an annotation
+         (completion-extra-properties
+          '(:annotation-function (lambda (app) (format " [%s]" (cdr (assoc app apps)))))))
+
+    (run-external-command--handler (cdr (assoc (completing-read "App: " apps nil t) apps)))))
+
 (provide 'functions)