mirror of
https://github.com/SqrtMinusOne/perspective-exwm.el.git
synced 2025-12-10 12:53:02 +03:00
77 lines
3.5 KiB
Org Mode
77 lines
3.5 KiB
Org Mode
#+TITLE: perspective-exwm
|
|
|
|
A couple of tricks and fixes to make using [[https://github.com/ch11ng/exwm][EXWM]] and [[https://github.com/nex3/perspective-el][perspective.el]] a better experience.
|
|
|
|
* Installation
|
|
While this package isn't available anywhere but here, you can install it directly from the repo, e.g.:
|
|
#+begin_src emacs-lisp
|
|
(use-package perspective-exwm
|
|
:straight (:host github :repo "SqrtMinusOne/perspective-ewxm.el"))
|
|
#+end_src
|
|
Or clone the repository, add the package to the =load-path= and load it with =require=.
|
|
|
|
The package provides a minor mode, =perspective-exwm-mode=, which is meant to be loaded before =exwm-init=. For instance, if you use =use-package=:
|
|
#+begin_src emacs-lisp
|
|
(use-package exwm
|
|
:config
|
|
...
|
|
(perspective-exwm-mode)
|
|
(exwm-init))
|
|
#+end_src
|
|
|
|
* Usage and details
|
|
- =perspective-exwm-mode=\\
|
|
The mode does a couple of things:
|
|
- advises away a bug with half-killing the current perspective when closing a floating window. +I haven't tested this as thoroughly+ I haven't run into this issue for nearly a month, so it seems to be fixed. But there's =M-x perspective-exwm-revive-perspectives= if the problem arises anyway.
|
|
- fixes a bug with running =persp-set-buffer= on an EXWM buffer that was moved between workspaces by advising =persp-buffer-in-other-p=.
|
|
- fixes a bug with =persp-set-buffer= copying all the perspectives from other workspaces to the current one.
|
|
- adjusts the name of the initial perspective in the new workspace. It tries to get the name from the =perspective-exwm-override-initial-name= variable and fallbacks to =main-<index>=.
|
|
|
|
For the last point, I have the following in my configuration:
|
|
#+begin_src emacs-lisp
|
|
(setq perspective-exwm-override-initial-name
|
|
'((0 . "misc")
|
|
(1 . "core")
|
|
(2 . "browser")
|
|
(3 . "comms")
|
|
(4 . "dev")))
|
|
#+end_src
|
|
|
|
Having distinct perspective names between frames also serves a purpose, because otherwise there are issues with multiple perspectives sharing the same scratch buffer.
|
|
- =M-x perspective-exwm-cycle-exwm-buffers-forward=, =perspective-exwm-cycle-exwm-buffers-backward=\\
|
|
Cycle EXWM buffers in the current perspective.
|
|
|
|
[[./img/cycle-buffers.png]]
|
|
|
|
The buffer highlighted in yellow is the current one, the buffer highlighted in blue is shown in another window of the perspective so it will be omitted from the cycle.
|
|
|
|
Set =perspective-exwm-get-exwm-buffer-name= to customize the displayed name, by default it's =exwm-class-name=.
|
|
|
|
- =M-x perspective-exwm-switch-perspective=\\
|
|
Select a perspective from the list of all perspectives on all workspaces.
|
|
|
|
[[./img/switch-perspective.png]]
|
|
- =M-x perspective-exwm-copy-to-workspace=\\
|
|
Copy the current perspective to another EXWM workspace.
|
|
- =M-x perspective-exwm-move-to-workspace=\\
|
|
Move the current perspective to another EXWM workspace.
|
|
- =perspective-exwm-assign-windows=\\
|
|
A handy function to move the current window to a given workspace and/or perspective. Example usage:
|
|
#+begin_src emacs-lisp
|
|
(defun my/exwm-configure-window ()
|
|
(interactive)
|
|
(pcase exwm-class-name
|
|
((or "Firefox" "Nightly")
|
|
(perspective-exwm-assign-window
|
|
:workspace-index 2
|
|
:persp-name "browser"))
|
|
("Alacritty"
|
|
(perspective-exwm-assign-window
|
|
:persp-name "term"))
|
|
((or "VK" "Slack" "Discord" "TelegramDesktop")
|
|
(perspective-exwm-assign-window
|
|
:workspace-index 3
|
|
:persp-name "comms"))))
|
|
|
|
(add-hook 'exwm-manage-finish-hook #'my/exwm-configure-window)
|
|
#+end_src
|