diff options
Diffstat (limited to 'configs/shared/.emacs.d/wpc/window-manager.el')
-rw-r--r-- | configs/shared/.emacs.d/wpc/window-manager.el | 647 |
1 files changed, 0 insertions, 647 deletions
diff --git a/configs/shared/.emacs.d/wpc/window-manager.el b/configs/shared/.emacs.d/wpc/window-manager.el deleted file mode 100644 index cf7f1efeb799..000000000000 --- a/configs/shared/.emacs.d/wpc/window-manager.el +++ /dev/null @@ -1,647 +0,0 @@ -;;; window-manager.el --- Functions augmenting my usage of EXWM. -*- lexical-binding: t -*- -;; Author: William Carroll <wpcarro@gmail.com> - -;;; Commentary: -;; I switched to EXWM from i3, and I haven't looked back. One day I may write a -;; poem declaring my love for Emacs and EXWM. For now, I haven't the time. - -;; Wish list: -;; - TODO: Support different startup commands and layouts depending on laptop or -;; desktop. -;; - TODO: Support a Music named-workspace. - -;;; Code: - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Dependencies -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(require 'alert) -(require 'prelude) -(require 'string) -(require 'cycle) -(require 'set) -(require 'kbd) -(require 'ivy-helpers) -(require 'display) -(require 'dotfiles) -(require 'org-helpers) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Library -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; TODO: Move this function to another module. -(defun pkill (name) - "Call the pkill executable using NAME as its argument." - (interactive "sProcess name: ") - (call-process "pkill" nil nil nil name)) - -;; TODO: Associate `window-purpose' window-layouts with each of these named -;; workspaces. - -;; TODO: Associate KBDs for each of these named-layouts. - -;; TODO: Decide between window-manager, exwm, or some other namespace. - -;; TODO: Support (cycle/from-list '(current previous)) to toggle back and forth -;; between most recent workspace. - -;; TODO: Support ad hoc cycle for loading a few workspaces that can be cycled -;; between. (cycle/from-list '("Project" "Workspace")) - -;; TODO: Consider supporting a workspace for Racket, Clojure, Common Lisp, -;; Haskell, Elixir, and a few other languages. These could behave very similarly -;; to repl.it, which I've wanted to have locally for awhile now. - -;; TODO: Support MRU cache of workspaces for easily switching back-and-forth -;; between workspaces. - -(cl-defstruct exwm/named-workspace - label - index - kbd) - -(defconst exwm/install-workspace-kbds? t - "When t, install the keybindings to switch between named-workspaces.") - -;; TODO: Consume `cache/touch' after changing workspaces. Use this to enable -;; cycling through workspaces. - -(defconst exwm/named-workspaces - (list (make-exwm/named-workspace - :label "Web surfing" - :index 0 - :kbd "c") - (make-exwm/named-workspace - :label "Project" - :index 1 - :kbd "p") - (make-exwm/named-workspace - :label "Dotfiles" - :index 2 - :kbd "d") - (make-exwm/named-workspace - :label "Scratch" - :index 3 - :kbd "s") - (make-exwm/named-workspace - :label "Terminal" - :index 4 - :kbd "t") - (make-exwm/named-workspace - :label "Todos" - :index 5 - :kbd "o") - (make-exwm/named-workspace - :label "Chatter" - :index 6 - :kbd "h") - (make-exwm/named-workspace - :label "IRC" - :index 7 - :kbd "i") - (make-exwm/named-workspace - :label "Work" - :index 8 - :kbd "w")) - "List of `exwm/named-workspace' structs.") - -;; Assert that no two workspaces share KBDs. -(prelude/assert (= (list/length exwm/named-workspaces) - (->> exwm/named-workspaces - (list/map #'exwm/named-workspace-kbd) - set/from-list - set/count))) - -(defun window-manager/alert (x) - "Message X with a structured format." - (alert (string/concat "[exwm] " x))) - -;; Use Emacs as my primary window manager. -(use-package exwm - :config - (require 'exwm-config) - - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; Multiple Displays - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (require 'exwm-randr) - (exwm-randr-enable) - ;; TODO: Consider generating this plist. - ;; TODO: Replace integer index values with their named workspace equivalents. - (setq exwm-randr-workspace-monitor-plist - (list 0 display/4k-monitor - 1 display/laptop-monitor)) - - (evil-set-initial-state 'exwm-mode 'emacs) - (ido-mode 1) - (exwm-config-ido) - (setq exwm-workspace-number - (list/length exwm/named-workspaces)) - ;; EXWM supports "line-mode" and "char-mode". - ;; - ;; Note: It appears that calling `exwm-input-set-key' works if it's called - ;; during startup. Once a session has started, it seems like this function is - ;; significantly less useful. Is this a bug? - ;; - ;; Glossary: - ;; - char-mode: All keystrokes except `exwm' global ones are passed to the - ;; application. - ;; - line-mode: - ;; - ;; `exwm-input-global-keys' = {line,char}-mode; can also call `exwm-input-set-key' - ;; `exwm-mode-map' = line-mode - ;; `???' = char-mode. Is there a mode-map for this? - ;; - ;; TODO: What is `exwm-input-prefix-keys'? - ;; TODO: Once I get `exwm-input-global-keys' functions, drop support for - ;; `wpc/kbds'. - (let ((kbds `( - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; Window sizing - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - (:key "C-M-=" :fn balance-windows) - ;; TODO: Make sure these don't interfere with LISP KBDs. - (:key "C-M-j" :fn shrink-window) - (:key "C-M-k" :fn enlarge-window) - (:key "C-M-h" :fn shrink-window-horizontally) - (:key "C-M-l" :fn enlarge-window-horizontally) - - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; Window traversing - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - (:key "M-h" :fn windmove-left) - (:key "M-j" :fn windmove-down) - (:key "M-k" :fn windmove-up) - (:key "M-l" :fn windmove-right) - - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; Window splitting - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - (:key "M-\\" :fn evil-window-vsplit) - (:key "M--" :fn evil-window-split) - - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; Window deletion - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - (:key "M-q" :fn delete-window) - - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; Miscellaneous - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - (:key "M-:" :fn eval-expression) - (:key "M-SPC" :fn window-manager/apps) - (:key "M-x" :fn counsel-M-x) - (:key "<M-tab>" :fn exwm/next-workspace) - (:key "<M-S-iso-lefttab>" :fn exwm/prev-workspace) - (:key "<M-iso-lefttab>" :fn exwm/prev-workspace) - ;; <M-escape> doesn't work in X11 windows. - (:key "<M-escape>" :fn exwm/ivy-switch) - (:key "C-M-\\" :fn ivy-pass) - - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; REPLs - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - (:key ,(kbd/raw 'x11 "r") :fn exwm/ivy-find-or-create-repl) - - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; Workspaces - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - ;; NOTE: Here I need to generate lowercase and uppercase - ;; variants of each because my Ergodox is sending capitalized - ;; variants of the keycodes to EXWM. - (:key ,(kbd/raw 'workspace "l") :fn window-manager/logout) - (:key ,(kbd/raw 'workspace "L") :fn window-manager/logout) - (:key ,(kbd/raw 'workspace "i") :fn exwm/toggle-mode) - (:key ,(kbd/raw 'workspace "I") :fn exwm/toggle-mode)))) - (setq exwm-input-global-keys - (->> kbds - (-map (lambda (plist) - `(,(kbd (plist-get plist :key)) . ,(plist-get plist :fn))))))) - (setq exwm-input-simulation-keys - ;; TODO: Consider supporting M-d and other readline style KBDs. - '(([?\C-b] . [left]) - ([?\M-b] . [C-left]) - ([?\C-f] . [right]) - ([?\M-f] . [C-right]) - ([?\C-p] . [up]) - ([?\C-n] . [down]) - ([?\C-a] . [home]) - ([?\C-e] . [end]) - ([?\C-d] . [delete]) - ;; TODO: Assess whether or not this is a good idea. - ;; TODO: Ensure C-c copies. - ([?\C-c] . [C-c]))) - (exwm-enable)) - -;; TODO: Package workspace management in another module. - -;; Here is the code required to allow EXWM to cycle workspaces. -(defconst exwm/workspaces - (->> exwm/named-workspaces - cycle/from-list) - "Cycle of the my EXWM workspaces.") - -(prelude/assert - (= exwm-workspace-number - (list/length exwm/named-workspaces))) - -(defun exwm/next-workspace () - "Cycle forwards to the next workspace." - (interactive) - (exwm/change-workspace (cycle/next exwm/workspaces))) - -(defun exwm/prev-workspace () - "Cycle backwards to the previous workspace." - (interactive) - (exwm/change-workspace (cycle/prev exwm/workspaces))) - -;; TODO: Create friendlier API for working with EXWM. - -;; Here is the code required to toggle EXWM's modes. -(defun exwm/line-mode () - "Switch exwm to line-mode." - (call-interactively #'exwm-input-grab-keyboard) - (window-manager/alert "Switched to line-mode")) - -(defun exwm/char-mode () - "Switch exwm to char-mode." - (call-interactively #'exwm-input-release-keyboard) - (window-manager/alert "Switched to char-mode")) - -(defconst exwm/modes - (cycle/from-list (list #'exwm/char-mode - #'exwm/line-mode)) - "Functions to switch exwm modes.") - -(defun exwm/toggle-mode () - "Switch between line- and char- mode." - (interactive) - (with-current-buffer (window-buffer) - (when (eq major-mode 'exwm-mode) - (funcall (cycle/next exwm/modes))))) - -;; Ensure exwm apps open in char-mode. -(add-hook - 'exwm-manage-finish-hook - #'exwm/char-mode) - -;; Interface to the Linux password manager -;; TODO: Consider writing a better client for this. -(use-package ivy-pass) - -;; TODO: Prefer a more idiomatic Emacs way like `with-output-to-temp-buffer'. - -;; TODO: Create a mode similar to `help-mode' that also kills the buffer when -;; "q" is pressed since this is sensitive information that we probably don't -;; want persisting. - -;; TODO: Have this interactively show all of the listings in ~/.password-store -;; in an ivy list. -(defun password-store/show (key) - "Show the contents of KEY from the password-store in a buffer." - (interactive) - (let ((b (buffer/find-or-create (string/format "*password-store<%s>*" key)))) - (with-current-buffer b - (insert (password-store-get key)) - (help-mode)) - (buffer/show b))) - -;; TODO: I'm having difficulties with the Nix-built terminator. The one at -;; /usr/bin/terminator (i.e. built w/o Nix) works just fine. Using this, -;; however, cheapens my Nix setup. -(defconst exwm/preferred-terminal "terminator" - "My preferred terminal.") - -;; TODO: How do I handle this dependency? -(defconst exwm/preferred-browser "google-chrome" - "My preferred web browser.") - -(defun exwm/browser-open (&optional url) - "Opens the URL in `exwm/preferred-browser'." - (exwm/open - (string/format "%s %s" exwm/preferred-browser url) - :buffer-name (string/format "*%s*<%s>" exwm/preferred-browser url) - :process-name url)) - -;; TODO: Consider storing local state of all processes started with this command -;; for some nice ways to cycle through existing terminals, etc. -(defun exwm/terminal-open (cmd) - "Call CMD using `exwm/preferred-terminal'." - (exwm/open (string/format - "%s --command '%s'" - exwm/preferred-terminal - cmd) - :buffer-name (string/format "*%s*<%s>" exwm/preferred-terminal cmd) - :process-name cmd)) - -;; TODO: Create a KBD that calls the `C-x b<Enter>' I call often. -;; TODO: Consider auto-generating KBDs for spawning these using the first -;; character in their name. Also assert that none of the generated keybindings -;; will clash with one another. -(defconst exwm/repls - '(("python" . (lambda () (exwm/terminal-open "python3"))) - ("zsh" . (lambda () (exwm/terminal-open "zsh"))) - ("fish" . (lambda () (exwm/terminal-open "fish"))) - ("nix" . (lambda () (exwm/terminal-open "nix repl"))) - ("racket" . racket-repl) - ;; NOTE: `ielm' as-is is a find-or-create operation. - ("elisp" . ielm)) - "Mapping of REPL labels to the commands needed to initialize those REPLs.") - -;; NOTE: Some of these commands split the window already. Some of these -;; commands find-or-create already. -;; -;; Find-or-create: -;; +---+---+ -;; | Y | N | -;; +---+---+ -;; python | | x | -;; zsh | | x | -;; racket | x | | -;; elisp | x | | -;; +---+---+ -;; -;; Split: -;; +---+---+ -;; | Y | N | -;; +---+---+ -;; python | | x | -;; zsh | | x | -;; racket | x | | -;; elisp | | x | -;; +---+---+ - -;; - Split: -;; - racket -(defun exwm/ivy-find-or-create-repl () - "Select a type of REPL using `ivy' and then find-or-create it." - (interactive) - (ivy-helpers/kv "REPLs: " - exwm/repls - (lambda (_ v) - (funcall v)))) - -;; KBDs to quickly open X11 applications. -(general-define-key - ;; TODO: Eventually switch this to a find-or-create operation. In general, I - ;; shouldn't need multiple instances of `python3` REPLs. - ;; TODO: Consider coupling these KBDs with the `exwm/ivy-find-or-create-repl' - ;; functionality defined above. - (kbd/raw 'x11 "n") (lambda () - (interactive) - (exwm/terminal-open "nix repl")) - (kbd/raw 'x11 "p") (lambda () - (interactive) - (exwm/terminal-open "python3")) - (kbd/raw 'x11 "t") (lambda () - (interactive) - (exwm/open exwm/preferred-terminal)) - (kbd/raw 'x11 "c") (lambda () - (interactive) - (exwm/open exwm/preferred-browser))) - -;; TODO: Support searching all "launchable" applications like OSX's Spotlight. -;; TODO: Model this as key-value pairs. -(defconst window-manager/applications - (list "google-chrome --new-window --app=https://chat.google.com" - "google-chrome --new-window --app=https://calendar.google.com" - "google-chrome --new-window --app=https://gmail.com" - "telegram-desktop" - "google-chrome --new-window --app=https://teknql.slack.com" - "google-chrome --new-window --app=https://web.whatsapp.com" - "google-chrome --new-window --app=https://irccloud.com" - exwm/preferred-browser - exwm/preferred-terminal) - "Applications that I commonly use. -These are the types of items that would usually appear in dmenu.") - -;; TODO: Consider replacing the `ivy-read' call with something like `hydra' that -;; can provide a small mode for accepting user-input. -;; TODO: Put this somewhere more diliberate. - -;; TODO: Configure the environment variables for xsecurelock so that the font is -;; smaller, different, and the glinux wallpaper doesn't show. -;; - XSECURELOCK_FONT="InputMono-Black 10" -;; - XSECURE_SAVER="" -;; - XSECURE_LOGO_IMAGE="" -;; Maybe just create a ~/.xsecurelockrc -;; TODO: Is there a shell-command API that accepts an alist and serializes it -;; into variables to pass to the shell command? -(defconst window-manager/xsecurelock - "/usr/share/goobuntu-desktop-files/xsecurelock.sh" - "Path to the proper xsecurelock executable. -The other path to xsecurelock is /usr/bin/xsecurelock, which works fine, but it -is not optimized for Goobuntu devices. Goobuntu attempts to check a user's -password using the network. When there is no network connection available, the -login attempts fail with an \"unknown error\", which isn't very helpful. To -avoid this, prefer the goobuntu wrapper around xsecurelock when on a goobuntu -device. This all relates to PAM (i.e. pluggable authentication modules).") - -(defun window-manager/logout () - "Prompt the user for options for logging out, shutting down, etc. - -The following options are supported: -- Lock -- Logout -- Suspend -- Hibernate -- Reboot -- Shutdown - -Ivy is used to capture the user's input." - (interactive) - (let* ((name->cmd `(("Lock" . ,window-manager/xsecurelock) - ("Logout" . "sudo systemctl stop lightdm") - ("Suspend" . ,(string/concat - window-manager/xsecurelock - " && systemctl suspend")) - ("Hibernate" . ,(string/concat - window-manager/xsecurelock - " && systemctl hibernate")) - ("Reboot" . "systemctl reboot") - ("Shutdown" . "systemctl poweroff")))) - (funcall - (lambda () - (shell-command - (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 - (list/find - (lambda (x) - (equal label - (exwm/named-workspace-label x))))))) - (if (prelude/set? workspace) - (exwm/named-workspace-index workspace) - (error (string/concat "No workspace found for label: " label))))) - -(defun exwm/register-kbd (workspace) - "Registers a keybinding for WORKSPACE struct. -Currently using super- as the prefix for switching workspaces." - (let ((handler (lambda () - (interactive) - (exwm/switch (exwm/named-workspace-label workspace)))) - (key (exwm/named-workspace-kbd workspace))) - (exwm-input-set-key - (kbd/for 'workspace key) - handler) - ;; Note: We need to capitalize the KBD here because of the signals that my - ;; Ergodox is sending Emacs on my desktop. - (exwm-input-set-key - (kbd/for 'workspace (s-capitalize key)) - 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) - "Switch to a named workspaces using LABEL." - (cycle/focus (lambda (x) - (equal label - (exwm/named-workspace-label x))) - exwm/workspaces) - (exwm/change-workspace (cycle/current exwm/workspaces))) - -;; TODO: Assign an easy-to-remember keybinding to this. -(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 () - "Use ivy to switched between named workspaces." - (interactive) - (ivy-read - "Workspace: " - (->> exwm/named-workspaces - (list/map #'exwm/named-workspace-label)) - :action #'exwm/switch)) - -(when exwm/install-workspace-kbds? - (progn - (->> exwm/named-workspaces - (list/map #'exwm/register-kbd)) - (window-manager/alert "Registered workspace KBDs!"))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Startup Applications in `exwm/named-workspaces' -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(add-hook - 'exwm-init-hook - (lambda () - ;; TODO: Refactor this into a bigger solution where the named-workspaces are - ;; coupled to their startup commands. Expedience wins this time. - (progn - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; Chrome - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (progn - (exwm/switch "Web surfing") - ;; make sure this blocks. - ;; TODO: Support shell-cmd.el that has `shell-cmd/{sync,async}'. - ;; (call-process-shell-command "google-chrome") - ) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; Project - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (progn - (exwm/switch "Project") - (find-file constants/current-project)) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; Scratch - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (progn - (exwm/switch "Scratch") - (switch-to-buffer "*scratch*")) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; Terminal - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (progn - (exwm/switch "Terminal") - ;; TODO: Why does "gnome-terminal" work but not "terminator"? - ;; (call-process-shell-command "gnome-terminal") - ) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; Todos - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (progn - (exwm/switch "Todos") - (org-helpers/find-file "today-expected.org") - (wpc/evil-window-vsplit-right) - (org-helpers/find-file "today-actual.org")) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; Dotfiles - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (progn - (exwm/switch "Dotfiles") - (dotfiles/find-emacs-file "init.el") - (wpc/evil-window-vsplit-right) - (dotfiles/find-emacs-file "wpc/window-manager.el")) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; Chatter - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (progn - (exwm/switch "Chatter") - ;; TODO: Support the following chat applications: - ;; - Slack teknql - ;; - irccloud.net - ;; - web.whatsapp.com - ;; - Telegram - ;; NOTE: Perhaps all of these should be borderless. - ;; (call-process-shell-command "terminator") - ) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; Work - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (progn - (exwm/switch "Work") - ;; TODO: Support opening the following in chrome: - ;; - calendar - ;; - gmail - ;; - chat (in a horizontal split) - ) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; Reset to default - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (exwm/switch "Dotfiles")))) - -(provide 'window-manager) -;;; window-manager.el ends here |