about summary refs log tree commit diff
path: root/emacs/.emacs.d/wpc/ivy-helpers.el
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-04-02T17·34+0100
committerWilliam Carroll <wpcarro@gmail.com>2020-04-02T17·34+0100
commit691583ed5c8a722fec40c719599e9b2f458e7bdb (patch)
treeb79a888f80951212b23676e12f451d408231236c /emacs/.emacs.d/wpc/ivy-helpers.el
parentd12b8b3dcb97aa6365eca061a260b74b41bfd452 (diff)
Refactor opening X applications from Emacs
I borrowed heavily from Vincent's depot.
Diffstat (limited to 'emacs/.emacs.d/wpc/ivy-helpers.el')
-rw-r--r--emacs/.emacs.d/wpc/ivy-helpers.el34
1 files changed, 34 insertions, 0 deletions
diff --git a/emacs/.emacs.d/wpc/ivy-helpers.el b/emacs/.emacs.d/wpc/ivy-helpers.el
index c71a907a20c1..75b22fa4bb79 100644
--- a/emacs/.emacs.d/wpc/ivy-helpers.el
+++ b/emacs/.emacs.d/wpc/ivy-helpers.el
@@ -26,6 +26,40 @@ with the key and value from KV."
    :action (lambda (entry)
              (funcall f (car entry) (cdr entry)))))
 
+(defun ivy-helpers/do-run-external-command (cmd)
+  "Execute the specified CMD and notify the user when it finishes."
+  (message "Starting %s..." cmd)
+  (set-process-sentinel
+   (start-process-shell-command cmd nil cmd)
+   (lambda (process event)
+     (when (string= event "finished\n")
+       (message "%s process finished." process)))))
+
+(defun ivy-helpers/list-external-commands ()
+  "Creates a list of all external commands available on $PATH while filtering
+NixOS wrappers."
+  (cl-loop
+   for dir in (split-string (getenv "PATH") path-separator)
+   when (and (file-exists-p dir) (file-accessible-directory-p dir))
+   for lsdir = (cl-loop for i in (directory-files dir t)
+                        for bn = (file-name-nondirectory i)
+                        when (and (not (s-contains? "-wrapped" i))
+                                  (not (member bn completions))
+                                  (not (file-directory-p i))
+                                  (file-executable-p i))
+                        collect bn)
+   append lsdir into completions
+   finally return (sort completions 'string-lessp)))
+
+(defun ivy-helpers/run-external-command ()
+  "Prompts the user with a list of all installed applications and
+lets them select one to launch."
+  (interactive)
+  (let ((external-commands-list (list-external-commands)))
+    (ivy-read "Command:" external-commands-list
+              :require-match t
+              :action #'ivy-helpers/do-run-external-command)))
+
 ;;; Code:
 (provide 'ivy-helpers)
 ;;; ivy-helpers.el ends here