Refactor opening X applications from Emacs
I borrowed heavily from Vincent's depot.
This commit is contained in:
parent
d12b8b3dcb
commit
691583ed5c
2 changed files with 35 additions and 23 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue