about summary refs log tree commit diff
path: root/users/tazjin/emacs
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2023-08-26T23·22+0300
committertazjin <tazjin@tvl.su>2023-08-26T23·30+0000
commitc6224c9ef586cf367c2fa2ad9a5bc50e307ac084 (patch)
tree87d0aca8da93428e30491fe5a09cd73fb024cc6f /users/tazjin/emacs
parentb5979f26e8f47638520b0954ac2f1b794ca58880 (diff)
feat(tazjin/emacs): implement run-xdg-app using gio-list-apps tool r/6529
Change-Id: I43111dfc7091c416035be563ca7fc17265667b33
Reviewed-on: https://cl.tvl.fyi/c/depot/+/9158
Tested-by: BuildkiteCI
Reviewed-by: tazjin <tazjin@tvl.su>
Diffstat (limited to 'users/tazjin/emacs')
-rw-r--r--users/tazjin/emacs/config/desktop.el2
-rw-r--r--users/tazjin/emacs/config/functions.el17
-rw-r--r--users/tazjin/emacs/default.nix3
3 files changed, 20 insertions, 2 deletions
diff --git a/users/tazjin/emacs/config/desktop.el b/users/tazjin/emacs/config/desktop.el
index 810521db18..c64073f5f8 100644
--- a/users/tazjin/emacs/config/desktop.el
+++ b/users/tazjin/emacs/config/desktop.el
@@ -220,7 +220,7 @@ in-progress."
 (exwm-input-set-key (kbd "C-c j") #'exwm-jump-to-buffer)
 
 ;; Launch applications / any command with completion (dmenu style!)
-;; (exwm-input-set-key (kbd "s-d") #'counsel-linux-app) ;; TODO(tazjin): completing-read version
+(exwm-input-set-key (kbd "s-d") #'run-xdg-app)
 (exwm-input-set-key (kbd "s-x") #'run-external-command)
 (exwm-input-set-key (kbd "s-p") #'password-store-lookup)
 
diff --git a/users/tazjin/emacs/config/functions.el b/users/tazjin/emacs/config/functions.el
index a5f109f4b5..6e2cff7cae 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)
diff --git a/users/tazjin/emacs/default.nix b/users/tazjin/emacs/default.nix
index 5b62574784..09221fd09d 100644
--- a/users/tazjin/emacs/default.nix
+++ b/users/tazjin/emacs/default.nix
@@ -1,6 +1,6 @@
 # This file builds an Emacs pre-configured with the packages I need
 # and my personal Emacs configuration.
-{ lib, pkgs, ... }:
+{ depot, lib, pkgs, ... }:
 
 pkgs.makeOverridable
   ({ emacs ? pkgs.emacs-unstable }:
@@ -13,6 +13,7 @@ pkgs.makeOverridable
 
     # $PATH for binaries that need to be available to Emacs
     emacsBinPath = lib.makeBinPath [
+      depot.users.tazjin.gio-list-apps
       (currentTelega pkgs.emacsPackages)
       pkgs.libwebp # for dwebp, required by telega
     ];