Refactor MRU EXWM workspace using cycle/focus-previous!
Instead of consuming `cycle/previous-focus`, define a function `cycle/focus-previous!` that "focuses" the element at `previous-index` and returns that element. This function greatly simplified the code in window-manager.el and eliminated the unnecessary `exwm/previous-workspace` variable that was managing the state.
This commit is contained in:
parent
1399eae319
commit
71c24104eb
2 changed files with 35 additions and 22 deletions
|
@ -75,6 +75,19 @@
|
||||||
(nth i (cycle-xs cycle))
|
(nth i (cycle-xs cycle))
|
||||||
nil)))
|
nil)))
|
||||||
|
|
||||||
|
;; TODO: Consider adding "!" to the function name herein since many of them
|
||||||
|
;; mutate the collection, and the APIs are beginning to confuse me.
|
||||||
|
(defun cycle/focus-previous! (xs)
|
||||||
|
"Jump to the item in XS that was most recently focused; return the cycle.
|
||||||
|
This will error when previous-index is nil. This function mutates the
|
||||||
|
underlying struct."
|
||||||
|
(let ((i (cycle-previous-index xs)))
|
||||||
|
(if (maybe/some? i)
|
||||||
|
(progn
|
||||||
|
(cycle/jump i xs)
|
||||||
|
(cycle/current xs))
|
||||||
|
(error "Cannot focus the previous element since cycle-previous-index is nil"))))
|
||||||
|
|
||||||
(defun cycle/next (xs)
|
(defun cycle/next (xs)
|
||||||
"Return the next value in `XS' and update `current-index'."
|
"Return the next value in `XS' and update `current-index'."
|
||||||
(let* ((current-index (cycle-current-index xs))
|
(let* ((current-index (cycle-current-index xs))
|
||||||
|
@ -135,7 +148,8 @@
|
||||||
(prelude/assert (= 1 (->> xs (cycle/jump 0) cycle/current)))
|
(prelude/assert (= 1 (->> xs (cycle/jump 0) cycle/current)))
|
||||||
(prelude/assert (= 2 (->> xs (cycle/jump 1) cycle/current)))
|
(prelude/assert (= 2 (->> xs (cycle/jump 1) cycle/current)))
|
||||||
(prelude/assert (= 3 (->> xs (cycle/jump 2) cycle/current)))
|
(prelude/assert (= 3 (->> xs (cycle/jump 2) cycle/current)))
|
||||||
(prelude/assert (= 2 (cycle/previous-focus xs)))))
|
(prelude/assert (= 2 (cycle/previous-focus xs)))
|
||||||
|
(prelude/assert (= 2 (cycle/focus-previous! xs)))))
|
||||||
|
|
||||||
(provide 'cycle)
|
(provide 'cycle)
|
||||||
;;; cycle.el ends here
|
;;; cycle.el ends here
|
||||||
|
|
|
@ -249,22 +249,12 @@
|
||||||
(defun exwm/next-workspace ()
|
(defun exwm/next-workspace ()
|
||||||
"Cycle forwards to the next workspace."
|
"Cycle forwards to the next workspace."
|
||||||
(interactive)
|
(interactive)
|
||||||
(exwm-workspace-switch
|
(exwm/change-workspace (cycle/next exwm/workspaces)))
|
||||||
(exwm/named-workspace-index (cycle/next exwm/workspaces)))
|
|
||||||
(window-manager/alert
|
|
||||||
(string/concat
|
|
||||||
"Current workspace: "
|
|
||||||
(exwm/named-workspace-label (cycle/current exwm/workspaces)))))
|
|
||||||
|
|
||||||
(defun exwm/prev-workspace ()
|
(defun exwm/prev-workspace ()
|
||||||
"Cycle backwards to the previous workspace."
|
"Cycle backwards to the previous workspace."
|
||||||
(interactive)
|
(interactive)
|
||||||
(exwm-workspace-switch
|
(exwm/change-workspace (cycle/prev exwm/workspaces)))
|
||||||
(exwm/named-workspace-index (cycle/prev exwm/workspaces)))
|
|
||||||
(window-manager/alert
|
|
||||||
(string/concat
|
|
||||||
"Current workspace: "
|
|
||||||
(exwm/named-workspace-label (cycle/current exwm/workspaces)))))
|
|
||||||
|
|
||||||
;; TODO: Create friendlier API for working with EXWM.
|
;; TODO: Create friendlier API for working with EXWM.
|
||||||
|
|
||||||
|
@ -534,17 +524,26 @@ Currently using super- as the prefix for switching workspaces."
|
||||||
(kbd/for 'workspace (s-capitalize key))
|
(kbd/for 'workspace (s-capitalize key))
|
||||||
handler)))
|
handler)))
|
||||||
|
|
||||||
|
(defun exwm/change-workspace (workspace)
|
||||||
|
"Switch EXWM workspaces to the WORKSPACE struct."
|
||||||
|
(exwm-workspace-switch (exwm/named-workspace-index workspace))
|
||||||
|
(window-manager/alert
|
||||||
|
(string/format "Switched to: %s" (exwm/named-workspace-label workspace))))
|
||||||
|
|
||||||
(defun exwm/switch (label)
|
(defun exwm/switch (label)
|
||||||
"Switch to a named workspaces using LABEL."
|
"Switch to a named workspaces using LABEL."
|
||||||
(cycle/focus
|
(cycle/focus (lambda (x)
|
||||||
(lambda (x)
|
|
||||||
(equal label
|
(equal label
|
||||||
(exwm/named-workspace-label x)))
|
(exwm/named-workspace-label x)))
|
||||||
exwm/workspaces)
|
exwm/workspaces)
|
||||||
(exwm-workspace-switch
|
(exwm/change-workspace (cycle/current exwm/workspaces)))
|
||||||
(exwm/named-workspace-index (cycle/current exwm/workspaces)))
|
|
||||||
(window-manager/alert
|
;; TODO: Assign an easy-to-remember keybinding to this.
|
||||||
(string/concat "Switched to: " label)))
|
(exwm-input-set-key (kbd "C-S-f") #'exwm/toggle-previous)
|
||||||
|
(defun exwm/toggle-previous ()
|
||||||
|
"Focus the previously active EXWM workspace."
|
||||||
|
(interactive)
|
||||||
|
(exwm/change-workspace (cycle/focus-previous! exwm/workspaces)))
|
||||||
|
|
||||||
(defun exwm/ivy-switch ()
|
(defun exwm/ivy-switch ()
|
||||||
"Use ivy to switched between named workspaces."
|
"Use ivy to switched between named workspaces."
|
||||||
|
|
Loading…
Reference in a new issue