Refactor opening X applications from Emacs

I borrowed heavily from Vincent's depot.
This commit is contained in:
William Carroll 2020-04-02 18:34:49 +01:00
parent d12b8b3dcb
commit 691583ed5c
2 changed files with 35 additions and 23 deletions

View file

@ -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

View file

@ -197,7 +197,7 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(:key "M-:" :fn eval-expression)
(:key "M-SPC" :fn window-manager/apps)
(:key "M-SPC" :fn ivy-helpers/run-external-command)
(:key "M-x" :fn counsel-M-x)
(:key "<M-tab>" :fn exwm/next-workspace)
(:key "<M-S-iso-lefttab>" :fn exwm/prev-workspace)
@ -379,28 +379,6 @@ Ivy is used to capture the user's input."
(alist/get (ivy-read "System: " (alist/keys name->cmd))
name->cmd))))))
(cl-defun exwm/open (command &key
(process-name command)
(buffer-name command))
"Open COMMAND, which should be an X11 window."
(start-process-shell-command process-name buffer-name command))
(cl-defun window-manager/execute-from-counsel (&key prompt list)
"Display a counsel menu of `LIST' with `PROMPT' and pipe the output through
`start-process-shell-command'."
(let ((x (ivy-read prompt list)))
(exwm/open
x
:buffer-name (string/format "*exwm/open*<%s>" x)
:process-name x)))
(defun window-manager/apps ()
"Open commonly used applications from counsel."
(interactive)
(window-manager/execute-from-counsel
:prompt "Application: "
:list window-manager/applications))
(defun exwm/label->index (label workspaces)
"Return the index of the workspace in WORKSPACES named LABEL."
(let ((workspace (->> workspaces