Support prelude/start-process
If you refer to the previous commit where I change shell-command usages to start-process function calls, you'll see the rationale for why I prefer start-process. This commit introduces a more ergonomic API for start-process that fits most of my current use-cases of it. This cleans up the code. I have introduced a bug in the way that I'm tokenizing the COMMAND value. I've tracked that with a TODO. For now it only affects the `xmodmap -e '<command-string>'` calls, which isn't too disruptive.
This commit is contained in:
parent
c078f04526
commit
5785a5d126
8 changed files with 93 additions and 62 deletions
|
@ -13,6 +13,12 @@
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Dependencies
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(require 'prelude)
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; Constants
|
;; Constants
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -31,17 +37,18 @@
|
||||||
(defun display/enable-4k ()
|
(defun display/enable-4k ()
|
||||||
"Attempt to connect to my 4K monitor."
|
"Attempt to connect to my 4K monitor."
|
||||||
(interactive)
|
(interactive)
|
||||||
(shell-command
|
(prelude/start-process
|
||||||
(string/format "xrandr --output %s --dpi 144 --auto --right-of %s"
|
:name "display"
|
||||||
display/4k
|
:command (string/format "xrandr --output %s --dpi 144 --auto --right-of %s"
|
||||||
display/primary)))
|
display/4k
|
||||||
|
display/primary)))
|
||||||
|
|
||||||
(defun display/disable-4k ()
|
(defun display/disable-4k ()
|
||||||
"Disconnect from the 4K monitor."
|
"Disconnect from the 4K monitor."
|
||||||
(interactive)
|
(interactive)
|
||||||
(shell-command
|
(prelude/start-process
|
||||||
(string/format "xrandr --output %s --off"
|
:name "display/disable-4k"
|
||||||
display/4k)))
|
:command (string/format "xrandr --output %s --off" display/4k)))
|
||||||
|
|
||||||
(provide 'display)
|
(provide 'display)
|
||||||
;;; display.el ends here
|
;;; display.el ends here
|
||||||
|
|
|
@ -51,8 +51,9 @@
|
||||||
(rate keyboard/repeat-rate)
|
(rate keyboard/repeat-rate)
|
||||||
(delay keyboard/repeat-delay))
|
(delay keyboard/repeat-delay))
|
||||||
"Use xset to set the key-repeat RATE and DELAY."
|
"Use xset to set the key-repeat RATE and DELAY."
|
||||||
(shell-command
|
(prelude/start-process
|
||||||
(string/format "xset r rate %s %s" delay rate)))
|
:name "keyboard/set-key-repeat"
|
||||||
|
:command (string/format "xset r rate %s %s" delay rate)))
|
||||||
|
|
||||||
;; NOTE: Settings like this are machine-dependent. For instance I only need to
|
;; NOTE: Settings like this are machine-dependent. For instance I only need to
|
||||||
;; do this on my laptop and other devices where I don't have access to my split
|
;; do this on my laptop and other devices where I don't have access to my split
|
||||||
|
@ -64,8 +65,12 @@
|
||||||
(defun keyboard/swap-caps-lock-and-escape ()
|
(defun keyboard/swap-caps-lock-and-escape ()
|
||||||
"Swaps the caps lock and escape keys using xmodmap."
|
"Swaps the caps lock and escape keys using xmodmap."
|
||||||
(interactive)
|
(interactive)
|
||||||
(shell-command "xmodmap -e 'remove Lock = Caps_Lock'")
|
(prelude/start-process
|
||||||
(shell-command "xmodmap -e 'keysym Caps_Lock = Escape'"))
|
:name "keyboard/swap-caps-lock-and-escape"
|
||||||
|
:command "xmodmap -e 'remove Lock = Caps_Lock'")
|
||||||
|
(prelude/start-process
|
||||||
|
:name "keyboard/swap-caps-lock-and-escape"
|
||||||
|
:command "xmodmap -e 'keysym Caps_Lock = Escape'"))
|
||||||
|
|
||||||
(defun keyboard/inc-repeat-rate ()
|
(defun keyboard/inc-repeat-rate ()
|
||||||
"Increment `keyboard/repeat-rate'."
|
"Increment `keyboard/repeat-rate'."
|
||||||
|
|
|
@ -6,20 +6,36 @@
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Dependencies
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(require 'prelude)
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Library
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
(defun playback/prev ()
|
(defun playback/prev ()
|
||||||
"Move to the previous song."
|
"Move to the previous song."
|
||||||
(interactive)
|
(interactive)
|
||||||
(shell-command "playerctl previous"))
|
(prelude/start-process
|
||||||
|
:name "playback/prev"
|
||||||
|
:command "playerctl previous"))
|
||||||
|
|
||||||
(defun playback/next ()
|
(defun playback/next ()
|
||||||
"Move to the next song."
|
"Move to the next song."
|
||||||
(interactive)
|
(interactive)
|
||||||
(shell-command "playerctl next"))
|
(prelude/start-process
|
||||||
|
:name "playback/next"
|
||||||
|
:command "playerctl next"))
|
||||||
|
|
||||||
(defun playback/play-pause ()
|
(defun playback/play-pause ()
|
||||||
"Play or pause the current song."
|
"Play or pause the current song."
|
||||||
(interactive)
|
(interactive)
|
||||||
(shell-command "playerctl play-pause"))
|
(prelude/start-process
|
||||||
|
:name "playback/play-pause"
|
||||||
|
:command "playerctl play-pause"))
|
||||||
|
|
||||||
(provide 'playback)
|
(provide 'playback)
|
||||||
;;; playback.el ends here
|
;;; playback.el ends here
|
||||||
|
|
|
@ -20,7 +20,6 @@
|
||||||
(require 'dash)
|
(require 'dash)
|
||||||
(require 'f)
|
(require 'f)
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; Libraries
|
;; Libraries
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -111,6 +110,22 @@ difficult to troubleshoot bugs in your init files."
|
||||||
"Read input from user with PROMPT."
|
"Read input from user with PROMPT."
|
||||||
(read-string prompt))
|
(read-string prompt))
|
||||||
|
|
||||||
|
;; TODO: Fix the bug with tokenizing here, since it will split any whitespace
|
||||||
|
;; character, (even though it shouldn't in the case of quoted string in shell).
|
||||||
|
;; e.g. - "xmodmap -e 'one two three'" => '("xmodmap" "-e" "'one two three'")
|
||||||
|
(cl-defun prelude/start-process (&key name command)
|
||||||
|
"Pass command string, COMMAND, and the function name, NAME.
|
||||||
|
This is a wrapper around `start-process' that has an API that resembles
|
||||||
|
`shell-command'."
|
||||||
|
(let* ((tokens (string/split " " command))
|
||||||
|
(program-name (list/head tokens))
|
||||||
|
(program-args (list/tail tokens)))
|
||||||
|
(apply #'start-process
|
||||||
|
`(,(string/format "*%s<%s>*" program-name name)
|
||||||
|
,nil
|
||||||
|
,program-name
|
||||||
|
,@program-args))))
|
||||||
|
|
||||||
(defun prelude/executable-exists? (name)
|
(defun prelude/executable-exists? (name)
|
||||||
"Return t if CLI tool NAME exists according to `exec-path'."
|
"Return t if CLI tool NAME exists according to `exec-path'."
|
||||||
(let ((file (locate-file name exec-path)))
|
(let ((file (locate-file name exec-path)))
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
;; Dependencies
|
;; Dependencies
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(require 'prelude)
|
||||||
(require 'string)
|
(require 'string)
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -33,49 +34,35 @@
|
||||||
(defun pulse-audio/toggle-mute ()
|
(defun pulse-audio/toggle-mute ()
|
||||||
"Mute the default sink."
|
"Mute the default sink."
|
||||||
(interactive)
|
(interactive)
|
||||||
(start-process
|
(prelude/start-process
|
||||||
"*pactl<pulse-audio/toggle-mute>*"
|
:name "pulse-audio/toggle-mute"
|
||||||
nil
|
:command "pactl set-sink-mute @DEFAULT_SINK@ toggle")
|
||||||
"pactl"
|
|
||||||
"set-sink-mute"
|
|
||||||
"@DEFAULT_SINK@"
|
|
||||||
"toggle")
|
|
||||||
(pulse-audio/message "Mute toggled."))
|
(pulse-audio/message "Mute toggled."))
|
||||||
|
|
||||||
(defun pulse-audio/toggle-microphone ()
|
(defun pulse-audio/toggle-microphone ()
|
||||||
"Mute the default sink."
|
"Mute the default sink."
|
||||||
(interactive)
|
(interactive)
|
||||||
(start-process
|
(prelude/start-process
|
||||||
"*pactl<pulse-audio/toggle-mute>*"
|
:name "pulse-audio/toggle-microphone"
|
||||||
nil
|
:command "pactl set-source-mute @DEFAULT_SOURCE@ toggle")
|
||||||
"pactl"
|
|
||||||
"set-source-mute"
|
|
||||||
"@DEFAULT_SOURCE@"
|
|
||||||
"toggle")
|
|
||||||
(pulse-audio/message "Microphone toggled."))
|
(pulse-audio/message "Microphone toggled."))
|
||||||
|
|
||||||
(defun pulse-audio/decrease-volume ()
|
(defun pulse-audio/decrease-volume ()
|
||||||
"Low the volume output of the default sink."
|
"Low the volume output of the default sink."
|
||||||
(interactive)
|
(interactive)
|
||||||
(start-process
|
(prelude/start-process
|
||||||
"*pactl<pulse-audio/toggle-mute>*"
|
:name "pulse-audio/decrease-volume"
|
||||||
nil
|
:command (string/format "pactl set-sink-volume @DEFAULT_SINK@ -%s%%"
|
||||||
"pactl"
|
pulse-audio/step-size))
|
||||||
"set-sink-volume"
|
|
||||||
"@DEFAULT_SINK@"
|
|
||||||
(string/format "-%s%%" pulse-audio/step-size))
|
|
||||||
(pulse-audio/message "Volume decreased."))
|
(pulse-audio/message "Volume decreased."))
|
||||||
|
|
||||||
(defun pulse-audio/increase-volume ()
|
(defun pulse-audio/increase-volume ()
|
||||||
"Raise the volume output of the default sink."
|
"Raise the volume output of the default sink."
|
||||||
(interactive)
|
(interactive)
|
||||||
(start-process
|
(prelude/start-process
|
||||||
"*pactl<pulse-audio/toggle-mute>*"
|
:name "pulse-audio/increase-volume"
|
||||||
nil
|
:command (string/format "pactl set-sink-volume @DEFAULT_SINK@ +%s%%"
|
||||||
"pactl"
|
pulse-audio/step-size))
|
||||||
"set-sink-volume"
|
|
||||||
"@DEFAULT_SINK@"
|
|
||||||
(string/format "+%s%%" pulse-audio/step-size))
|
|
||||||
(pulse-audio/message "Volume increased."))
|
(pulse-audio/message "Volume increased."))
|
||||||
|
|
||||||
(when pulse-audio/install-kbds?
|
(when pulse-audio/install-kbds?
|
||||||
|
|
|
@ -8,6 +8,12 @@
|
||||||
|
|
||||||
;; TODO: Define some isomorphisms. E.g. int->string, string->int.
|
;; TODO: Define some isomorphisms. E.g. int->string, string->int.
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Dependencies
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(require 'prelude)
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; Constants
|
;; Constants
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -25,23 +31,17 @@
|
||||||
(defun screen-brightness/increase ()
|
(defun screen-brightness/increase ()
|
||||||
"Increase the screen brightness."
|
"Increase the screen brightness."
|
||||||
(interactive)
|
(interactive)
|
||||||
(start-process
|
(prelude/start-process
|
||||||
"*xbacklight<screen-brightness/increase>*"
|
:name "screen-brightness/increase"
|
||||||
nil
|
:command (string/format "xbacklight -inc %s" screen-brightness/step-size))
|
||||||
"xbacklight"
|
|
||||||
"-inc"
|
|
||||||
(int-to-string screen-brightness/step-size))
|
|
||||||
(message "[screen-brightness.el] Increased screen brightness."))
|
(message "[screen-brightness.el] Increased screen brightness."))
|
||||||
|
|
||||||
(defun screen-brightness/decrease ()
|
(defun screen-brightness/decrease ()
|
||||||
"Decrease the screen brightness."
|
"Decrease the screen brightness."
|
||||||
(interactive)
|
(interactive)
|
||||||
(start-process
|
(prelude/start-process
|
||||||
"*xbacklight<screen-brightness/decrease>*"
|
:name "screen-brightness/decrease"
|
||||||
nil
|
:command (string/format "xbacklight -dec %s" screen-brightness/step-size))
|
||||||
"xbacklight"
|
|
||||||
"-dec"
|
|
||||||
(int-to-string screen-brightness/step-size))
|
|
||||||
(message "[screen-brightness.el] Decreased screen brightness."))
|
(message "[screen-brightness.el] Decreased screen brightness."))
|
||||||
|
|
||||||
(when screen-brightness/install-kbds?
|
(when screen-brightness/install-kbds?
|
||||||
|
|
|
@ -22,11 +22,14 @@
|
||||||
(defconst string/test? t
|
(defconst string/test? t
|
||||||
"When t, run the tests.")
|
"When t, run the tests.")
|
||||||
|
|
||||||
;; Strings
|
|
||||||
(defun string/hookify (x)
|
(defun string/hookify (x)
|
||||||
"Append \"-hook\" to X."
|
"Append \"-hook\" to X."
|
||||||
(s-append "-hook" x))
|
(s-append "-hook" x))
|
||||||
|
|
||||||
|
(defun string/split (y x)
|
||||||
|
"Map string X into a list of strings that were separated by Y."
|
||||||
|
(s-split y x))
|
||||||
|
|
||||||
(defun string/ensure-hookified (x)
|
(defun string/ensure-hookified (x)
|
||||||
"Ensure that X has \"-hook\" appended to it."
|
"Ensure that X has \"-hook\" appended to it."
|
||||||
(if (s-ends-with? "-hook" x)
|
(if (s-ends-with? "-hook" x)
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
;; Dependencies
|
;; Dependencies
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(require 'prelude)
|
||||||
(require 'fs)
|
(require 'fs)
|
||||||
(require 'cycle)
|
(require 'cycle)
|
||||||
(require 'string)
|
(require 'string)
|
||||||
|
@ -34,12 +35,9 @@
|
||||||
"Set computer wallpaper to image at `PATH' using `feh` under-the-hood.
|
"Set computer wallpaper to image at `PATH' using `feh` under-the-hood.
|
||||||
`PATH' can be absolute or relative since `f-expand' is called in the function
|
`PATH' can be absolute or relative since `f-expand' is called in the function
|
||||||
body to ensure feh can resolve the path."
|
body to ensure feh can resolve the path."
|
||||||
(start-process "*feh<wallpaper/set>*"
|
(prelude/start-process
|
||||||
nil
|
:name "wallpaper/set"
|
||||||
"feh"
|
:command (string/format "feh --bg-scale --no-feh-bg %s" (f-expand path))))
|
||||||
"--bg-scale"
|
|
||||||
"--no-feh-bg"
|
|
||||||
(f-expand path)))
|
|
||||||
|
|
||||||
(defun wallpaper/whitelist-set (wallpaper)
|
(defun wallpaper/whitelist-set (wallpaper)
|
||||||
"Focuses the WALLPAPER in the `wallpaper/whitelist' cycle."
|
"Focuses the WALLPAPER in the `wallpaper/whitelist' cycle."
|
||||||
|
|
Loading…
Reference in a new issue