From 944960daf836f333d0d04a518848371bdabd64d2 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Sun, 20 Mar 2016 21:48:06 -0400 Subject: [PATCH] Move eyebrowse to spacemacs-layouts layer and add documentation Add toggle capability with ? for workspaces transient state Remove the variable eyebrowse-display-help --- doc/DOCUMENTATION.org | 208 ++++++- .../spacemacs-layouts/config.el | 3 + layers/+spacemacs/spacemacs-layouts/funcs.el | 540 ++++++++++++++++++ .../+spacemacs/spacemacs-layouts/packages.el | 221 +++++++ .../+window-management/eyebrowse/README.org | 70 --- layers/+window-management/eyebrowse/config.el | 19 - layers/+window-management/eyebrowse/funcs.el | 77 --- .../eyebrowse/img/eyebrowse.gif | Bin 20631 -> 0 bytes .../+window-management/eyebrowse/img/i3wm.png | Bin 57602 -> 0 bytes .../+window-management/eyebrowse/packages.el | 138 ----- .../spacemacs-layouts/README.org | 144 ----- .../spacemacs-layouts/funcs.el | 187 ------ .../spacemacs-layouts/packages-funcs.el | 268 --------- .../spacemacs-layouts/packages.el | 88 --- 14 files changed, 945 insertions(+), 1018 deletions(-) rename layers/{+window-management => +spacemacs}/spacemacs-layouts/config.el (91%) create mode 100644 layers/+spacemacs/spacemacs-layouts/funcs.el create mode 100644 layers/+spacemacs/spacemacs-layouts/packages.el delete mode 100644 layers/+window-management/eyebrowse/README.org delete mode 100644 layers/+window-management/eyebrowse/config.el delete mode 100644 layers/+window-management/eyebrowse/funcs.el delete mode 100644 layers/+window-management/eyebrowse/img/eyebrowse.gif delete mode 100644 layers/+window-management/eyebrowse/img/i3wm.png delete mode 100644 layers/+window-management/eyebrowse/packages.el delete mode 100644 layers/+window-management/spacemacs-layouts/README.org delete mode 100644 layers/+window-management/spacemacs-layouts/funcs.el delete mode 100644 layers/+window-management/spacemacs-layouts/packages-funcs.el delete mode 100644 layers/+window-management/spacemacs-layouts/packages.el diff --git a/doc/DOCUMENTATION.org b/doc/DOCUMENTATION.org index 664715d9b..ab7718a37 100644 --- a/doc/DOCUMENTATION.org +++ b/doc/DOCUMENTATION.org @@ -59,14 +59,12 @@ - [[The vim-surround case][The vim-surround case]] - [[Evil plugins][Evil plugins]] - [[Binding keys][Binding keys]] - - [[Spacemacs UI][Spacemacs UI]] - - [[Graphical UI][Graphical UI]] - - [[Color themes][Color themes]] - - [[Font][Font]] - - [[Graphical UI Toggles][Graphical UI Toggles]] + - [[GUI Elements][GUI Elements]] + - [[Color themes][Color themes]] + - [[Font][Font]] + - [[GUI Toggles][GUI Toggles]] - [[Global line numbers][Global line numbers]] - - [[Mouse usage][Mouse usage]] - - [[Mode-line][Mode-line]] + - [[Mode-line][Mode-line]] - [[Powerline font installation for terminal-mode users][Powerline font installation for terminal-mode users]] - [[Flycheck integration][Flycheck integration]] - [[Anzu integration][Anzu integration]] @@ -74,6 +72,15 @@ - [[Powerline separators][Powerline separators]] - [[Minor Modes][Minor Modes]] - [[Customizing the mode-line][Customizing the mode-line]] + - [[Layouts and workspaces][Layouts and workspaces]] + - [[Layouts][Layouts]] + - [[The default layout][The default layout]] + - [[Project layouts][Project layouts]] + - [[Custom Layouts][Custom Layouts]] + - [[Save/Load layouts into a file][Save/Load layouts into a file]] + - [[Layout key bindings][Layout key bindings]] + - [[Workspaces][Workspaces]] + - [[Workspace key bindings][Workspace key bindings]] - [[Commands][Commands]] - [[Vim key bindings][Vim key bindings]] - [[Escaping][Escaping]] @@ -167,6 +174,7 @@ - [[Deleting files][Deleting files]] - [[Editing Lisp code][Editing Lisp code]] - [[Lisp Key Bindings][Lisp Key Bindings]] + - [[Mouse usage][Mouse usage]] - [[Managing projects][Managing projects]] - [[Registers][Registers]] - [[Errors handling][Errors handling]] @@ -849,20 +857,13 @@ key-discovery tools can use (e.g., which-key). There is much more to say about bindings keys, but these are the basics. Keys can be bound in your =~/.spacemacs= file or in individual layers. -* Spacemacs UI -Spacemacs has unique UI elements to make the Emacs experience even more -enjoyable: - - dedicated startup page with a mode aimed at easily managing Spacemacs - - dedicated helm source via =helm-spacemacs-help= - - a [[https://github.com/justbur/emacs-which-key][which-key]] buffer - -** Graphical UI +* GUI Elements Spacemacs has a minimalistic and distraction free graphical UI: - custom [[https://github.com/milkypostman/powerline][powerline]] mode-line [[Flycheck integration][with color feedback]] according to current [[https://github.com/flycheck/flycheck][Flycheck]] status - Unicode symbols for minor mode lighters which appear in the mode-line - [[Errors handling][custom fringe bitmaps]] and error feedbacks for [[https://github.com/flycheck/flycheck][Flycheck]] -*** Color themes +** Color themes The official Spacemacs theme is [[https://github.com/nashamri/spacemacs-theme][spacemacs-dark]] and it is the default theme installed when you first started Spacemacs. There are two variants of the @@ -900,7 +901,7 @@ You can see samples of all included themes in this [[http://themegallery.robdor. *Hint*: If you are an =Org= user, [[https://github.com/fniessen/emacs-leuven-theme][leuven-theme]] is amazing ;-) -*** Font +** Font The default font used by Spacemacs is [[https://github.com/adobe-fonts/source-code-pro][Source Code Pro]] by Adobe. It is recommended to install it on your system. @@ -966,7 +967,7 @@ separators like on the following screenshot (default value is 1.1). [[file:img/crappy-powerline-separators.png]] -*** Graphical UI Toggles +** GUI Toggles Some graphical UI indicators can be toggled on and off (toggles start with ~t~ and ~T~): @@ -1010,14 +1011,7 @@ If it is set to =relative=, line numbers are show in a relative way: (setq-default dotspacemacs-line-numbers 'relative) #+END_SRC -*** Mouse usage -There are some added mouse features set for the line number margin (if shown): - -- single click in line number margin visually selects the entire line -- drag across line number margin visually selects the region -- double click in line number margin visually select the current code block - -*** Mode-line +** Mode-line The mode line is a heavily customized [[https://github.com/milkypostman/powerline][powerline]] with the following capabilities: - show the window number - color code for current state @@ -1175,6 +1169,160 @@ right hand side variables. Please see the Spaceline documentation for more information. +* Layouts and workspaces +Layouts are window configurations with buffer isolation, each layout can define +several workspaces (think of them as sub-layouts) sharing the same list of +buffers as their parent layout. + +** Layouts +A layout is a window configuration associated with a list of buffers. The list +of buffers can be an arbitrarily chosen set of buffers. Spacemacs provides +some facilities to create meaningful sets of buffers, for instance the buffers +related to a projectile project. + +The name of the current layout appears in the mode-line at the far left (first +element of the mode-line). + +To create a new layout type a layout number that does not exist yet. +For instance if you have two layouts currently then type ~SPC l 3~ to create a +third layout. + +*** The default layout +The =default= layout (the layout created at the startup of Emacs) is not +displayed in the mode-line but it is possible to display it by setting the +variable =dotspacemacs-display-default-layout= to =t=. + +Its name is "default" by default but it can be changed by setting the variable +=dotspacemacs-default-layout-name=. + +The =default= layout is special because it has a global scope which means that +all the opened buffers belong to it. So using only the =default= layout feels +like not using layouts at all. + +*** Project layouts +A project layout is bound to a projectile project. To create a project layout +use ~SPC p l~. + +The name of the layout is the name of the project root directory. + +*** Custom Layouts +Custom layouts can be defined using the macro ~spacemacs|define-custom-layout~, +they are accessible via ~SPC l o~. + +By convention the name of a custom layout should start with =@=. + +Example of custom layout definition for =ERC= buffers: + +#+BEGIN_SRC emacs-lisp + (spacemacs|define-custom-layout "@ERC" + :binding "E" + :body + (progn + ;; hook to add all ERC buffers to the layout + (defun spacemacs-layouts/add-erc-buffer-to-persp () + (persp-add-buffer (current-buffer) + (persp-get-by-name + erc-spacemacs-layout-name))) + (add-hook 'erc-mode-hook #'spacemacs-layouts/add-erc-buffer-to-persp) + ;; Start ERC + (call-interactively 'erc))) +#+END_SRC + +Then use ~SPC l o E~ to start ERC inside its own layout. Any new ERC buffer +will be part of the custom layout. + +Some custom layouts that ship with Spacemacs: + +| Name | Key Binding | Description | +|------------+-------------+---------------------------------------------------------------------------------| +| @Spacemacs | ~e~ | Custom perspective containing all buffers of =~/.emacs.d= | +| @ERC | ~E~ | Custom perspective containing all ERC buffers (needs the erc layer enabled) | +| @RCIRC | ~i~ | Custom perspective containing all RCIRC buffers (needs the rcirc layer enabled) | +| @Org | ~o~ | Custom perspective containing all the =org-agenda= buffers | + +*** Save/Load layouts into a file +With ~SPC l s~ and ~SPC l L~ you can save and load layouts to/from a file. + +*Note:* By default, Spacemacs will automatically save the layouts under the name +=persp-auto-save=. + +Setting the variable =dotspacemacs-auto-resume-layouts= to =t= will +automatically resume the last saved layouts. + +*** Layout key bindings + +| Key Binding | Description | +|-------------------+------------------------------------------------------------| +| ~SPC l~ | activate the transient- state | +| ~?~ | toggle the documentation | +| ~[1..9, 0]~ | switch to nth layout | +| ~[C-1..C-9, C-0]~ | switch to nth layout and keep the transient-state active | +| ~~ | switch to the latest layout | +| ~a~ | add a buffer to the current layout | +| ~A~ | add all the buffers from another layout in the current one | +| ~b~ | select a buffer in the current layout | +| ~d~ | delete the current layout and keep its buffers | +| ~D~ | delete the other layouts and keep their buffers | +| ~h~ | go to default layout | +| ~C-h~ | previous layout in list | +| ~l~ | select/create a layout with helm | +| ~L~ | load layouts from file | +| ~C-l~ | next layout in list | +| ~n~ | next layout in list | +| ~N~ | previous layout in list | +| ~o~ | open a custom layout | +| ~p~ | previous layout in list | +| ~r~ | remove current buffer from layout | +| ~R~ | rename current layout | +| ~s~ | save layouts | +| ~t~ | display a buffer without adding it to the current layout | +| ~w~ | workspaces transient-state (needs eyebrowse layer enabled) | +| ~x~ | kill current layout with its buffers | +| ~X~ | kill other layouts with their buffers | + +** Workspaces +Workspaces are like sub-layouts, they allow to define multiple layouts into a +given layout, those layouts share the same buffer as the parent layout. + +The currently active workspace number is displayed before the window number, +for instance "➊|➍" or "1|4" means the fourth window of the first workspace. + +At startup, the workspace number 1 is active. Switching to a workspace will +create it if it does not exist. For instance at startup you can press +~SPC l w 2~ to create the workspace 2. + +The key bindings are registered in a transient-state. The docstring of the +transient-state displays the existing workspaces and the currently active +workspace has square brackets. Pressing a workspace number will activate it (or +create a new one) and exit the transient-state. It is possible to just preview a +workspace with ~Ctrl-~. Pressing ~TAB~ will activate the previously +selected workspace. It is also possible to give a label to the current workspace +by pressing ~r~. + +*** Workspace key bindings +Global key bindings: + +| Key Binding | Description | +|-------------+--------------------------------------| +| ~gt~ | go to next workspace | +| ~gT~ | got to previous workspace | +| ~SPC b W~ | go to workspace and window by buffer | + +Transient state key bindings: + +| Key Binding | Description | +|-------------------+-------------------------------------------------------------| +| ~SPC l w~ | activate the transient-state | +| ~?~ | toggle the documentation | +| ~[1..9, 0]~ | switch to nth workspace | +| ~[C-1..C-9, C-0]~ | switch to nth workspace and keep the transient-state active | +| ~TAB~ | switch to last active workspace | +| ~d~ | close current workspace | +| ~n~ or ~l~ | switch to next workspace | +| ~N~ or ~p~ or ~h~ | switch to previous workspace | +| ~R~ | set a tag to the current workspace | +| ~w~ | switched to tagged workspace | + * Commands ** Vim key bindings Spacemacs is based on =Vim= modal user interface to navigate and edit text. If @@ -1229,7 +1377,6 @@ state= to press quickly ~jj~ and inadvertently escape to =normal state=. The emacs command key ~SPC~ (executed after the leader key) can be changed with the variable =dotspacemacs-emacs-command-key= of your =~/.spacemacs=. - *** Leader key On top of =Vim= modes (modes are called states in Spacemacs) there is a special key called the leader key which once pressed gives a whole new keyboard @@ -2625,6 +2772,13 @@ These commands automatically switch to =lisp state=. | ~SPC m t b~ | execute buffer tests | | ~SPC m t q~ | ask for test function to execute | +*** Mouse usage +There are some added mouse features set for the line number margin (if shown): + +- single click in line number margin visually selects the entire line +- drag across line number margin visually selects the region +- double click in line number margin visually select the current code block + ** Managing projects Projects in Spacemacs are managed with [[https://github.com/bbatsov/projectile][projectile]]. In =projectile= projects are defined implicitly, for instance the root of a project is found when a diff --git a/layers/+window-management/spacemacs-layouts/config.el b/layers/+spacemacs/spacemacs-layouts/config.el similarity index 91% rename from layers/+window-management/spacemacs-layouts/config.el rename to layers/+spacemacs/spacemacs-layouts/config.el index 21d5a657a..ab4b4cf26 100644 --- a/layers/+window-management/spacemacs-layouts/config.el +++ b/layers/+spacemacs/spacemacs-layouts/config.el @@ -24,6 +24,9 @@ (defvar spacemacs--layouts-ts-full-hint-toggle 0 "Display a short doc when nil, full doc otherwise.") +(defvar spacemacs--workspaces-ts-full-hint-toggle 0 + "Display a short doc when nil, full doc otherwise.") + (defvar spacemacs--last-selected-layout dotspacemacs-default-layout-name "Previously selected layout.") diff --git a/layers/+spacemacs/spacemacs-layouts/funcs.el b/layers/+spacemacs/spacemacs-layouts/funcs.el new file mode 100644 index 000000000..fb55dbe68 --- /dev/null +++ b/layers/+spacemacs/spacemacs-layouts/funcs.el @@ -0,0 +1,540 @@ +;;; funcs.el --- Spacemacs Layouts Layer functions File +;; +;; Copyright (c) 2012-2016 Sylvain Benner & Contributors +;; +;; Author: Sylvain Benner +;; URL: https://github.com/syl20bnr/spacemacs +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 + + +;; General Persp functions + +(defun spacemacs//current-layout-name () + "Get name of the current perspective." + (safe-persp-name (get-frame-persp))) + +(defun spacemacs//layout-autosave () + "Perspectives mode autosave. +Autosaves perspectives layouts every `persp-autosave-interal' seconds. +Cancels autosave on exiting perspectives mode." + (if (and persp-mode layouts-enable-autosave) + (progn + (message "Perspectives mode autosaving enabled.") + (setq spacemacs--layouts-autosave-timer + (run-with-timer + layouts-autosave-delay + layouts-autosave-delay + (lambda () + (message "Saving perspectives to file.") + (persp-save-state-to-file))))) + (when spacemacs--layouts-autosave-timer + (cancel-timer spacemacs--layouts-autosave-timer) + (setq spacemacs--layouts-autosave-timer nil)))) + +(defun spacemacs/jump-to-last-layout () + "Open the previously selected layout, if it exists." + (interactive) + (unless (eq 'non-existent + (gethash spacemacs--last-selected-layout + *persp-hash* 'non-existent)) + (persp-switch spacemacs--last-selected-layout))) + +(defun spacemacs/alternate-buffer-in-persp () + "Switch back and forth between current and last buffer in the +current perspective." + (interactive) + (with-persp-buffer-list () + (switch-to-buffer (other-buffer (current-buffer) t)))) + +(defun spacemacs-layouts/non-restricted-buffer-list () + (interactive) + (remove-hook 'ido-make-buffer-list-hook #'persp-restrict-ido-buffers) + (helm-mini) + (add-hook 'ido-make-buffer-list-hook #'persp-restrict-ido-buffers)) + + +;; Persp transient-state + +(defun spacemacs//layouts-ts-toggle-hint () + "Toggle the full hint docstring for the layouts transient-state." + (interactive) + (setq spacemacs--layouts-ts-full-hint-toggle + (logxor spacemacs--layouts-ts-full-hint-toggle 1))) + +(defun spacemacs//layout-format-name (name pos) + "Format the layout name given by NAME for display in mode-line." + (let* ((layout-name (if (file-directory-p name) + (file-name-nondirectory (directory-file-name name)) + name)) + (string-name (format "%s" layout-name)) + (current (equal name (spacemacs//current-layout-name))) + (caption (concat (number-to-string (if (eq 9 pos) 0 (1+ pos))) + ":" string-name))) + (if current + (propertize (concat "[" caption "]") 'face 'warning) + caption))) + +(defun spacemacs//layouts-ts-hint () + "Return a one liner string containing all the layout names." + (let* ((persp-list (or (persp-names-current-frame-fast-ordered) + (list persp-nil-name))) + (formatted-persp-list + (concat " " + (mapconcat (lambda (persp) + (spacemacs//layout-format-name + persp (position persp persp-list))) + persp-list " | ")))) + (concat + formatted-persp-list + (if (equal 1 spacemacs--layouts-ts-full-hint-toggle) + spacemacs--layouts-ts-full-hint + (concat " ([" + (propertize "?" 'face 'hydra-face-red) + "] help)"))))) + +(defun spacemacs/layout-switch-by-pos (pos) + "Switch to perspective of position POS." + (let ((persp-to-switch + (nth pos (persp-names-current-frame-fast-ordered)))) + (if persp-to-switch + (persp-switch persp-to-switch) + (when (y-or-n-p + (concat "Perspective in this position doesn't exist.\n" + "Do you want to create one? ")) + (let ((persp-reset-windows-on-nil-window-conf t)) + (persp-switch nil) + (spacemacs/home-delete-other-windows)))))) + +;; Define all `spacemacs/persp-switch-to-X' functions +(dolist (i (number-sequence 9 0 -1)) + (eval `(defun ,(intern (format "spacemacs/persp-switch-to-%s" i)) nil + ,(format "Switch to layout %s." i) + (interactive) + (spacemacs/layout-switch-by-pos ,(if (eq 0 i) 9 (1- i)))))) + +(defun spacemacs/layout-goto-default () + "Go to `dotspacemacs-default-layout-name` layout" + (interactive) + (when dotspacemacs-default-layout-name + (persp-switch dotspacemacs-default-layout-name))) + +(defun spacemacs/layouts-ts-rename () + "Rename a layout and get back to the perspectives transient-state." + (interactive) + (call-interactively 'persp-rename) + (spacemacs/layouts-transient-state/body)) + +(defun spacemacs/layouts-ts-close () + "Kill current perspective" + (interactive) + (persp-kill-without-buffers (spacemacs//current-layout-name))) + +(defun spacemacs/layouts-ts-close-other () + (interactive) + (call-interactively 'spacemacs/helm-persp-close) + (spacemacs/layouts-transient-state/body)) + +(defun spacemacs/layouts-ts-kill () + "Kill current perspective" + (interactive) + (persp-kill (spacemacs//current-layout-name))) + +(defun spacemacs/layouts-ts-kill-other () + (interactive) + (call-interactively 'spacemacs/helm-persp-kill) + (spacemacs/layouts-transient-state/body)) + + +;; Custom Persp transient-state + +(defun spacemacs//custom-layout-func-name (name) + "Return the name of the custom-perspective function for NAME." + (intern (concat "spacemacs/custom-perspective-" name))) + +(defmacro spacemacs|define-custom-layout (name &rest props) + "Define a custom-perspective called NAME. + +FUNC is a FUNCTION defined using NAME and the result of +`spacemacs//custom-layout-func-name', it takes care of +creating the perspective NAME and executing the expressions given +in the :body property to this macro. + +NAME is a STRING. + +Available PROPS: + +`:binding STRING' + Key to be bound to the function FUNC + +`:body EXPRESSIONS' + One or several EXPRESSIONS that are going to be evaluated after + we change into the perspective NAME." + (declare (indent 1)) + (let* ((name (if (symbolp name) + (symbol-value name) + name)) + (func (spacemacs//custom-layout-func-name name)) + (binding-prop (car (spacemacs/mplist-get props :binding))) + (binding (if (symbolp binding-prop) + (symbol-value binding-prop) + binding-prop)) + (body (spacemacs/mplist-get props :body)) + (already-defined? (cdr (assoc binding + spacemacs--custom-layout-alist)))) + `(progn + (defun ,func () + ,(format "Open custom perspective %s" name) + (interactive) + (let ((initialize (not (gethash ,name *persp-hash*)))) + (persp-switch ,name) + (when initialize + (delete-other-windows) + ,@body))) + ;; Check for Clashes + (if ,already-defined? + (unless (equal ,already-defined? ,name) + (spacemacs-buffer/warning "Replacing existing binding \"%s\" for %s with %s" + ,binding ,already-defined? ,name) + (push '(,binding . ,name) spacemacs--custom-layout-alist)) + (push '(,binding . ,name) spacemacs--custom-layout-alist))))) + +(defun spacemacs/select-custom-layout () + "Update the custom-perspectives transient-state and then activate it." + (interactive) + (spacemacs//update-custom-layouts) + (spacemacs/custom-layouts-transient-state/body)) + +(defun spacemacs//custom-layouts-ms-documentation () + "Return the docstring for the custom perspectives transient-state." + (if spacemacs--custom-layout-alist + (mapconcat (lambda (custom-persp) + (format "[%s] %s" + (car custom-persp) (cdr custom-persp))) + spacemacs--custom-layout-alist " ") + (spacemacs-buffer/warning (format "`spacemacs--custom-layout-alist' variable is empty" )))) + +(defun spacemacs//update-custom-layouts () + "Ensure the custom-perspectives transient-state is updated. +Takes each element in the list `spacemacs--custom-layout-alist' +format so they are supported by the +`spacemacs/custom-layouts-transient-state' macro." + (let (bindings) + (dolist (custom-persp spacemacs--custom-layout-alist bindings) + (let* ((binding (car custom-persp)) + (name (cdr custom-persp)) + (func-name (spacemacs//custom-layout-func-name name))) + (push (list binding func-name :exit t) bindings))) + (eval `(spacemacs|define-transient-state custom-layouts + :doc (concat (spacemacs//custom-layouts-ms-documentation)) + :bindings + ,@bindings)))) + + +;; Helm integration + +(defun spacemacs/persp-helm-mini () + "As `helm-mini' but restricts visible buffers by perspective." + (interactive) + (with-persp-buffer-list () + (helm-mini))) + +(defun spacemacs//helm-perspectives-source () + (helm-build-in-buffer-source + (concat "Current Perspective: " (spacemacs//current-layout-name)) + :data (persp-names) + :fuzzy-match t + :action + '(("Switch to perspective" . persp-switch) + ("Close perspective(s)" . (lambda (candidate) + (mapcar + 'persp-kill-without-buffers + (helm-marked-candidates)))) + ("Kill perspective(s)" . (lambda (candidate) + (mapcar 'persp-kill + (helm-marked-candidates))))))) +(defun spacemacs/helm-perspectives () + "Control Panel for perspectives. Has many actions. +If match is found +f1: (default) Select perspective +f2: Close Perspective(s) <- mark with C-SPC to close more than one-window +f3: Kill Perspective(s) + +If match is not found + Creates perspective + +Closing doesn't kill buffers inside the perspective while killing +perspectives does." + (interactive) + (helm + :buffer "*Helm Perspectives*" + :sources + `(,(spacemacs//helm-perspectives-source) + ,(helm-build-dummy-source "Create new perspective" + :requires-pattern t + :action + '(("Create new perspective" . + (lambda (name) + (let ((persp-reset-windows-on-nil-window-conf t)) + (persp-switch name) + (unless (member name (persp-names-current-frame-fast-ordered)) + (spacemacs/home)))))))))) + +;; ability to use helm find files but also adds to current perspective +(defun spacemacs/helm-persp-close () + "Kills perspectives without killing the buffers" + (interactive) + (helm + :buffer "*Helm Kill Perspectives (without killing buffers)*" + :sources + (helm-build-in-buffer-source + (concat "Current Perspective: " (spacemacs//current-layout-name)) + :data (persp-names) + :fuzzy-match t + :action + '(("Close perspective(s)" . (lambda (candidate) + (mapcar + 'persp-kill-without-buffers + (helm-marked-candidates)))))))) + +(defun spacemacs/helm-persp-kill () + "Kills perspectives with all their buffers" + (interactive) + (helm + :buffer "*Helm Kill Perspectives with all their buffers*" + :sources (helm-build-in-buffer-source + (s-concat "Current Perspective: " + (spacemacs//current-layout-name)) + :data (persp-names) + :fuzzy-match t + :action + '(("Kill perspective(s)" . + (lambda (candidate) + (mapcar 'persp-kill + (helm-marked-candidates)))))))) + +(defun spacemacs/helm-persp-switch-project (arg) + (interactive "P") + (helm + :sources + (helm-build-in-buffer-source "*Helm Switch Project Layout*" + :data (lambda () + (if (projectile-project-p) + (cons (abbreviate-file-name (projectile-project-root)) + (projectile-relevant-known-projects)) + projectile-known-projects)) + :fuzzy-match helm-projectile-fuzzy-match + :mode-line helm-read-file-name-mode-line-string + :action '(("Switch to Project Perspective" . + (lambda (project) + (let ((persp-reset-windows-on-nil-window-conf t)) + (persp-switch project) + (let ((projectile-completion-system 'helm)) + (projectile-switch-project-by-name project))))))) + :buffer "*Helm Projectile Layouts*")) + + +;; Ivy integration + +(defun spacemacs/ivy-persp-switch-project (arg) + (interactive "P") + (ivy-read "Switch to Project Perspective: " + (if (projectile-project-p) + (cons (abbreviate-file-name (projectile-project-root)) + (projectile-relevant-known-projects)) + projectile-known-projects) + :action (lambda (project) + (let ((persp-reset-windows-on-nil-window-conf t)) + (persp-switch project) + (let ((projectile-completion-system 'ivy)) + (projectile-switch-project-by-name project)))))) + + +;; Eyebrowse + +;; Eyebrowse uses window-state objects (as returned by `window-state-get') to +;; store window configurations, so here are some utility functions to help us +;; analyse window-states. +;; it might make more sense to move these functions to a more general place + +(defun spacemacs/window-state-window-p (object) + "Return t if OBJECT is a window, as represented in window-state objects. +Note: this function doesn't test for real window objects, but for +representations of a window in a window-state object as returned by +`window-state-get'." + (and (listp object) + (memq (car object) '(leaf vc hc)))) + +(defun spacemacs/window-state-get-buffer (window) + "Get WINDOW's buffer. +WINDOW is the representation of a window in a window-state object. +The returned value is the representation of a buffer in a window-state +object." + (cdr (assq 'buffer window))) + +(defun spacemacs/window-state-get-buffer-name (window) + "Get WINDOW's buffer's name. +WINDOW is the representation of a window in a window-state object." + (car (spacemacs/window-state-get-buffer window))) + +(defun spacemacs/window-state-walk-windows-1 (window fn) + "Helper function for `spacemacs/window-state-walk-windows'." + ;; WINDOW is a misleading name. WINDOW is a list that can represent a window, + ;; or a concatenation of several windows. window-state objects are weird. + (let ((child-windows + (-filter #'spacemacs/window-state-window-p window)) + (bare-window + ;; if WINDOW contains more than one window, take only the first window + (--take-while (not (spacemacs/window-state-window-p it)) + window))) + (--each child-windows + (spacemacs/window-state-walk-windows-1 it fn)) + (push (funcall fn bare-window) result))) + +(defun spacemacs/window-state-walk-windows (state fn) + "Execute FN once for each window in STATE and make a list of the results. +FN is a function to execute. +STATE is a window-state object." + (let (result) + (spacemacs/window-state-walk-windows-1 (cdr state) fn) + result)) + +(defun spacemacs/window-state-all-windows (state) + "Get all windows contained in STATE. +STATE is a window-state object. +The returned windows are not actual window objects. They are windows as +represented in window-state objects." + (spacemacs/window-state-walk-windows state #'identity)) + +(defun spacemacs/window-state-get-buffer-names (state) + "Get names of all buffers saved in STATE. +STATE is a window-state object as returned by `window-state-get'." + (delq nil (spacemacs/window-state-walk-windows state #'spacemacs/window-state-get-buffer-name))) + +(defun spacemacs/window-state-get-buffers (state) + "Get all buffers saved in STATE. +STATE is a window-state object as returned by `window-state-get'." + ;; delq nil - removes buffers stored in STATE that don't exist anymore + (delq nil (mapcar #'get-buffer (spacemacs/window-state-get-buffer-names state)))) + +(defun spacemacs/find-workspace (buffer) + "Find Eyebrowse workspace containing BUFFER. + If several workspaces contain BUFFER, return the first one. Workspaces are + ordered by slot number. + If no workspace contains + BUFFER, return nil." + ;; the second element of a workspace is its window-state object + (--find (memq buffer (spacemacs/window-state-get-buffers (cadr it))) + (eyebrowse--get 'window-configs))) + +(defun spacemacs/display-in-workspace (buffer alist) + "Display BUFFER's workspace. + Return BUFFER's window, if exists, otherwise nil. + If BUFFER is already visible in current workspace, just return its window + without switching workspaces." + (or (get-buffer-window buffer) + (-when-let (workspace (spacemacs/find-workspace buffer)) + (eyebrowse-switch-to-window-config (car workspace)) + (get-buffer-window buffer)))) + +(defun spacemacs/goto-buffer-workspace (buffer) + "Switch to BUFFER's window in BUFFER's workspace. + If BUFFER isn't displayed in any workspace, display it in the current + workspace, preferably in the current window." + (interactive "B") + (pop-to-buffer buffer '((;; reuse buffer window from some workspace + spacemacs/display-in-workspace + ;; fallback to display in current window + display-buffer-same-window) + (inhibit-same-window . nil)))) + + +;; Eyebrowse transient state + +(defun spacemacs//workspaces-ts-toggle-hint () + "Toggle the full hint docstring for the workspaces transient-state." + (interactive) + (setq spacemacs--workspaces-ts-full-hint-toggle + (logxor spacemacs--workspaces-ts-full-hint-toggle 1))) + +(defun spacemacs/workspaces-ts-rename () + "Rename a workspace and get back to transient-state." + (interactive) + (eyebrowse-rename-window-config (eyebrowse--get 'current-slot) nil) + (spacemacs/workspaces-transient-state/body)) + +(defun spacemacs//workspace-format-name (workspace) + "Return a porpertized string given a WORKSPACE name." + (let* ((current (eq (eyebrowse--get 'current-slot) (car workspace))) + (name (nth 2 workspace)) + (number (car workspace)) + (caption (if (< 0 (length name)) + (concat (int-to-string number) ":" name) + (int-to-string number)))) + (if current + (propertize (concat "[" caption "]") 'face 'warning) + caption))) + +(defun spacemacs//workspaces-ts-hint () + "Return a one liner string containing all the workspaces names." + (concat + " " + (mapconcat 'spacemacs//workspace-format-name + (eyebrowse--get 'window-configs) " | ") + (if (equal 1 spacemacs--workspaces-ts-full-hint-toggle) + spacemacs--workspaces-ts-full-hint + (concat " ([" + (propertize "?" 'face 'hydra-face-red) + "] help)")))) + + +;; Eyebrowse and Persp integration + +(defun spacemacs/load-eyebrowse-for-perspective (&optional frame) + "Load an eyebrowse workspace according to a perspective's parameters. + FRAME's perspective is the perspective that is considered, defaulting to + the current frame's perspective. + If the perspective doesn't have a workspace, create one." + (let* ((persp (get-frame-persp frame)) + (window-configs (persp-parameter 'eyebrowse-window-configs persp)) + (current-slot (persp-parameter 'eyebrowse-current-slot persp)) + (last-slot (persp-parameter 'eyebrowse-last-slot persp))) + (if window-configs + (progn + (eyebrowse--set 'window-configs window-configs frame) + (eyebrowse--set 'current-slot current-slot frame) + (eyebrowse--set 'last-slot last-slot frame) + (eyebrowse--load-window-config current-slot)) + (eyebrowse--set 'window-configs nil frame) + (eyebrowse-init frame) + (spacemacs/save-eyebrowse-for-perspective frame)))) + +(defun spacemacs/update-eyebrowse-for-perspective (_new-persp-name) + "Update and save current frame's eyebrowse workspace to its perspective. +Parameter _NEW-PERSP-NAME is ignored, and exists only for compatibility with +`persp-before-switch-functions'." + (let* ((current-slot (eyebrowse--get 'current-slot)) + (current-tag (nth 2 (assoc current-slot (eyebrowse--get 'window-configs))))) + (eyebrowse--update-window-config-element + (eyebrowse--current-window-config current-slot current-tag))) + (spacemacs/save-eyebrowse-for-perspective)) + +(defun spacemacs/save-eyebrowse-for-perspective (&optional frame) + "Save FRAME's eyebrowse workspace to FRAME's perspective. +FRAME defaults to the current frame." + (let ((persp (get-frame-persp frame))) + (set-persp-parameter + 'eyebrowse-window-configs (eyebrowse--get 'window-configs frame) persp) + (set-persp-parameter + 'eyebrowse-current-slot (eyebrowse--get 'current-slot frame) persp) + (set-persp-parameter + 'eyebrowse-last-slot (eyebrowse--get 'last-slot frame) persp))) + +(defun spacemacs/layout-workspaces-transient-state () + "Launches the workspaces transient state, if defined." + (interactive) + (if (fboundp 'spacemacs/workspaces-transient-state/body) + (call-interactively 'spacemacs/workspaces-transient-state/body) + (message "You need the eyebrowse layer to use this feature."))) diff --git a/layers/+spacemacs/spacemacs-layouts/packages.el b/layers/+spacemacs/spacemacs-layouts/packages.el new file mode 100644 index 000000000..8a7c7ce54 --- /dev/null +++ b/layers/+spacemacs/spacemacs-layouts/packages.el @@ -0,0 +1,221 @@ +;;; packages.el --- Spacemacs Layouts Layer packages File for Spacemacs +;; +;; Copyright (c) 2012-2016 Sylvain Benner & Contributors +;; +;; Author: Sylvain Benner +;; URL: https://github.com/syl20bnr/spacemacs +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 + +(setq spacemacs-layouts-packages + '(eyebrowse + helm + ;; temporary switch on a fork to fix + ;; https://github.com/syl20bnr/spacemacs/issues/4120 + (persp-mode :location (recipe :fetcher github + :repo "syl20bnr/persp-mode.el" + :branch "fix-emacsclient-crash")) + spaceline + swiper)) + + + +(defun spacemacs-layouts/init-eyebrowse () + (use-package eyebrowse + :init + (progn + (setq eyebrowse-new-workspace #'spacemacs/home-delete-other-windows + eyebrowse-wrap-around t) + ;; always activate eyebrowse + (eyebrowse-mode) + ;; transient state + (spacemacs|transient-state-format-hint workspaces + spacemacs--workspaces-ts-full-hint + "\n\n + Go to^^^^^^ Remove/Rename...^^ + --^-^--^^^^----------------------- --^-^--------------------------- + [_0_,_9_]^^ nth/new workspace [_d_] close current workspace + [_C-0_,_C-9_]^^ nth/new workspace [_R_] rename current workspace + [_n_/_C-l_]^^ next workspace + [_N_/_p_/_C-h_] prev workspace + [__]^^^^ last workspace\n") + + (spacemacs|define-transient-state workspaces + :title "Workspaces Transient State" + :hint-is-doc t + :dynamic-hint (spacemacs//workspaces-ts-hint) + :bindings + ("?" spacemacs//workspaces-ts-toggle-hint) + ("0" eyebrowse-switch-to-window-config-0 :exit t) + ("1" eyebrowse-switch-to-window-config-1 :exit t) + ("2" eyebrowse-switch-to-window-config-2 :exit t) + ("3" eyebrowse-switch-to-window-config-3 :exit t) + ("4" eyebrowse-switch-to-window-config-4 :exit t) + ("5" eyebrowse-switch-to-window-config-5 :exit t) + ("6" eyebrowse-switch-to-window-config-6 :exit t) + ("7" eyebrowse-switch-to-window-config-7 :exit t) + ("8" eyebrowse-switch-to-window-config-8 :exit t) + ("9" eyebrowse-switch-to-window-config-9 :exit t) + ("C-0" eyebrowse-switch-to-window-config-0) + ("C-1" eyebrowse-switch-to-window-config-1) + ("C-2" eyebrowse-switch-to-window-config-2) + ("C-3" eyebrowse-switch-to-window-config-3) + ("C-4" eyebrowse-switch-to-window-config-4) + ("C-5" eyebrowse-switch-to-window-config-5) + ("C-6" eyebrowse-switch-to-window-config-6) + ("C-7" eyebrowse-switch-to-window-config-7) + ("C-8" eyebrowse-switch-to-window-config-8) + ("C-9" eyebrowse-switch-to-window-config-9) + ("" eyebrowse-last-window-config) + ("C-h" eyebrowse-prev-window-config) + ("C-i" eyebrowse-last-window-config) + ("C-l" eyebrowse-next-window-config) + ("d" eyebrowse-close-window-config) + ("h" eyebrowse-prev-window-config) + ("l" eyebrowse-next-window-config) + ("n" eyebrowse-next-window-config) + ("N" eyebrowse-prev-window-config) + ("p" eyebrowse-prev-window-config) + ("R" spacemacs/workspaces-ts-rename :exit t) + ("w" eyebrowse-switch-to-window-config :exit t)) + (spacemacs/set-leader-keys + "bW" 'spacemacs/goto-buffer-workspace + "lw" 'spacemacs/workspaces-transient-state/body) + ;; hooks + (add-hook 'persp-before-switch-functions + #'spacemacs/update-eyebrowse-for-perspective) + (add-hook 'eyebrowse-post-window-switch-hook + #'spacemacs/save-eyebrowse-for-perspective) + (add-hook 'persp-activated-hook + #'spacemacs/load-eyebrowse-for-perspective) + ;; vim-style tab switching + (define-key evil-motion-state-map "gt" 'eyebrowse-next-window-config) + (define-key evil-motion-state-map "gT" 'eyebrowse-prev-window-config)))) + + + +(defun spacemacs-layouts/post-init-helm () + (spacemacs/set-leader-keys + "pl" 'spacemacs/helm-persp-switch-project)) + + + +(defun spacemacs-layouts/init-persp-mode () + (use-package persp-mode + :diminish persp-mode + :init + (progn + (setq persp-auto-resume-time (if (or dotspacemacs-auto-resume-layouts + spacemacs-force-resume-layouts) + 1 -1) + persp-nil-name dotspacemacs-default-layout-name + persp-reset-windows-on-nil-window-conf nil + persp-set-last-persp-for-new-frames nil + persp-save-dir spacemacs-layouts-directory) + ;; always activate persp-mode + (persp-mode) + ;; layouts transient state + (spacemacs|transient-state-format-hint layouts + spacemacs--layouts-ts-full-hint + "\n\n + Go to^^^^^^ Add/Remove/Rename...^^ +--^-^--^^^^----------------------- --^-^--------------------------- + [_b_]^^^^ buffer in layout [_a_] add buffer + [_h_]^^^^ default layout [_A_] add all from layout + [_o_]^^^^ custom layout [_r_] remove current buffer + [_l_]^^^^ layout w/helm/ivy [_d_] close current layout + [_L_]^^^^ layouts in file [_D_] close other layout + [_0_,_9_]^^ nth/new layout [_x_] kill current w/buffers + [_C-0_,_C-9_]^^ nth/new layout [_X_] kill other w/buffers + [_n_/_C-l_]^^ next layout [_R_] rename current layout + [_N_/_p_/_C-h_] prev layout + [__]^^^^ last layout +--^^^^^^^^---------------------------------------------------------- + [_s_/_S_] save all layouts/save by names + [_t_]^^ show a buffer without adding it to current layout + [_w_]^^ workspaces micro-state (requires eyebrowse layer) + [_?_]^^ toggle help\n") + + (spacemacs|define-transient-state layouts + :title "Layouts Transient State" + :hint-is-doc t + :dynamic-hint (spacemacs//layouts-ts-hint) + :bindings + ;; need to exit in case number doesn't exist + ("?" spacemacs//layouts-ts-toggle-hint) + ("1" spacemacs/persp-switch-to-1 :exit t) + ("2" spacemacs/persp-switch-to-2 :exit t) + ("3" spacemacs/persp-switch-to-3 :exit t) + ("4" spacemacs/persp-switch-to-4 :exit t) + ("5" spacemacs/persp-switch-to-5 :exit t) + ("6" spacemacs/persp-switch-to-6 :exit t) + ("7" spacemacs/persp-switch-to-7 :exit t) + ("8" spacemacs/persp-switch-to-8 :exit t) + ("9" spacemacs/persp-switch-to-9 :exit t) + ("0" spacemacs/persp-switch-to-0 :exit t) + ("C-1" spacemacs/persp-switch-to-1) + ("C-2" spacemacs/persp-switch-to-2) + ("C-3" spacemacs/persp-switch-to-3) + ("C-4" spacemacs/persp-switch-to-4) + ("C-5" spacemacs/persp-switch-to-5) + ("C-6" spacemacs/persp-switch-to-6) + ("C-7" spacemacs/persp-switch-to-7) + ("C-8" spacemacs/persp-switch-to-8) + ("C-9" spacemacs/persp-switch-to-9) + ("C-0" spacemacs/persp-switch-to-0) + ("" spacemacs/jump-to-last-layout) + ("" nil :exit t) + ("C-h" persp-prev) + ("C-l" persp-next) + ("a" persp-add-buffer :exit t) + ("A" persp-import-buffers :exit t) + ("b" spacemacs/persp-helm-mini :exit t) + ("d" spacemacs/layouts-ts-close) + ("D" spacemacs/layouts-ts-close-other :exit t) + ("h" spacemacs/layout-goto-default :exit t) + ("l" spacemacs/helm-perspectives :exit t) + ("L" persp-load-state-from-file :exit t) + ("n" persp-next) + ("N" persp-prev) + ("o" spacemacs/select-custom-layout :exit t) + ("p" persp-prev) + ("r" persp-remove-buffer :exit t) + ("R" spacemacs/layouts-ts-rename :exit t) + ("s" persp-save-state-to-file :exit t) + ("S" persp-save-to-file-by-names :exit t) + ("t" persp-temporarily-display-buffer :exit t) + ("w" spacemacs/layout-workspaces-transient-state :exit t) + ("x" spacemacs/layouts-ts-kill) + ("X" spacemacs/layouts-ts-kill-other :exit t)) + (spacemacs/set-leader-keys "l" 'spacemacs/layouts-transient-state/body) + ;; custom layouts + (spacemacs|define-custom-layout "@Spacemacs" + :binding "e" + :body + (spacemacs/find-dotfile))) + :config + (progn + (defadvice persp-activate (before spacemacs//save-toggle-layout activate) + (setq spacemacs--last-selected-layout persp-last-persp-name)) + (add-hook 'persp-mode-hook 'spacemacs//layout-autosave) + (spacemacs/declare-prefix "b" "persp-buffers") + (spacemacs/declare-prefix "B" "global-buffers") + ;; Override SPC TAB to only change buffers in perspective + (spacemacs/set-leader-keys + "TAB" 'spacemacs/alternate-buffer-in-persp + "ba" 'persp-add-buffer + "br" 'persp-remove-buffer + "Bb" 'spacemacs-layouts/non-restricted-buffer-list)))) + + + +(defun spacemacs-layouts/post-init-spaceline () + (setq spaceline-display-default-perspective + dotspacemacs-display-default-layout)) + + + +(defun spacemacs-layouts/post-init-swiper () + (spacemacs/set-leader-keys "pl" 'spacemacs/ivy-persp-switch-project)) diff --git a/layers/+window-management/eyebrowse/README.org b/layers/+window-management/eyebrowse/README.org deleted file mode 100644 index d03ba1d30..000000000 --- a/layers/+window-management/eyebrowse/README.org +++ /dev/null @@ -1,70 +0,0 @@ -#+TITLE: Eyebrowse layer -#+HTML_HEAD_EXTRA: - -[[file:img/eyebrowse.gif]] [[file:img/i3wm.png]] - -* Table of Contents :TOC_4_org:noexport: - - [[Description][Description]] - - [[Install][Install]] - - [[Layer][Layer]] - - [[Removing additional help][Removing additional help]] - - [[Key bindings][Key bindings]] - - [[Transient State][Transient State]] - -* Description -This layer adds [[https://i3wm.org/][i3wm]] like workspaces thanks to the [[https://github.com/wasamasa/eyebrowse][eyebrowse]] package. - -Once the layer is activated a new number is added to the left side of the -mode-line. This number corresponds to the currently active workspace number. - -At startup, the workspace number 1 is active. Switching to a workspace will -create it if it does not exist. For instance at startup you can press -~SPC l w 2~ to create the workspace 2. - -The key bindings are registered in a transient-state displayed in the minibuffer. -The docstring of the transient-state displays the existing workspaces and the -currently active workspace has square brackets. Since this is a transient-state it -is possible to just preview a workspace, for instance press ~SPC l w 2~ to see -what's on the workspace 2 then press ~TAB~ to go back to the previously -activated workspace. - -It is also possible to give a label to a the current workspace by pressing -~r~ in the transient-state. - -* Install -** Layer -To use this configuration layer, add it to your =~/.spacemacs=. You will need to -add =eyebrowse= to the existing =dotspacemacs-configuration-layers= list in this -file. - -** Removing additional help -Once you know the key bindings to navigate between the workspaces you -may want to disable the exhaustive help in the workspace transient-state. -Set the variable =eyebrowse-display-help= to =nil= - -#+BEGIN_SRC emacs-lisp - (setq-default dotspacemacs-configuration-layers - '((eyebrowse :variables eyebrowse-display-help nil))) -#+END_SRC - -* Key bindings - -| Key Binding | Description | -|-------------+--------------------------------------| -| ~gt~ | go to next workspace | -| ~gT~ | got to previous workspace | -| ~SPC b W~ | go to workspace and window by buffer | - -*** Transient State - -| Key Binding | Description | -|-------------------+-------------------------------------------------------------| -| ~SPC l w~ | activate the transient state | -| ~[1..9, 0]~ | switch to nth workspace | -| ~[C-1..C-9, C-0]~ | switch to nth workspace and keep the transient state active | -| ~TAB~ | switch to last active workspace | -| ~d~ | close current workspace | -| ~n~ or ~l~ | switch to next workspace | -| ~N~ or ~p~ or ~h~ | switch to previous workspace | -| ~R~ | set a tag to the current workspace | -| ~w~ | switched to tagged workspace | diff --git a/layers/+window-management/eyebrowse/config.el b/layers/+window-management/eyebrowse/config.el deleted file mode 100644 index dfb2ff4cb..000000000 --- a/layers/+window-management/eyebrowse/config.el +++ /dev/null @@ -1,19 +0,0 @@ -;;; config.el --- Eyebrowse Layer configuration File for Spacemacs -;; -;; Copyright (c) 2012-2016 Sylvain Benner & Contributors -;; -;; Author: Sylvain Benner -;; URL: https://github.com/syl20bnr/spacemacs -;; -;; This file is not part of GNU Emacs. -;; -;;; License: GPLv3 - -;; Variables - -(defvar eyebrowse-display-help t - "If non-nil additional help is displayed when selecting a workspace.") - -;; Prefix commands - -(spacemacs/declare-prefix "W" "workspaces") diff --git a/layers/+window-management/eyebrowse/funcs.el b/layers/+window-management/eyebrowse/funcs.el deleted file mode 100644 index dbd026b4e..000000000 --- a/layers/+window-management/eyebrowse/funcs.el +++ /dev/null @@ -1,77 +0,0 @@ -;;; funcs.el --- Eyebrowse Layer functions File -;; -;; Copyright (c) 2012-2016 Sylvain Benner & Contributors -;; -;; Author: Sylvain Benner -;; URL: https://github.com/syl20bnr/spacemacs -;; -;; This file is not part of GNU Emacs. -;; -;;; License: GPLv3 - -(require 'dash) - -;; Eyebrowse uses window-state objects (as returned by `window-state-get') to -;; store window configurations, so here are some utility functions to help us -;; analyse window-states. -;; it might make more sense to move these functions to a more general place - -(defun spacemacs/window-state-window-p (object) - "Return t if OBJECT is a window, as represented in window-state objects. -Note: this function doesn't test for real window objects, but for -representations of a window in a window-state object as returned by -`window-state-get'." - (and (listp object) - (memq (car object) '(leaf vc hc)))) - -(defun spacemacs/window-state-get-buffer (window) - "Get WINDOW's buffer. -WINDOW is the representation of a window in a window-state object. -The returned value is the representation of a buffer in a window-state -object." - (cdr (assq 'buffer window))) - -(defun spacemacs/window-state-get-buffer-name (window) - "Get WINDOW's buffer's name. -WINDOW is the representation of a window in a window-state object." - (car (spacemacs/window-state-get-buffer window))) - -(defun spacemacs/window-state-walk-windows-1 (window fn) - "Helper function for `spacemacs/window-state-walk-windows'." - ;; WINDOW is a misleading name. WINDOW is a list that can represent a window, - ;; or a concatenation of several windows. window-state objects are weird. - (let ((child-windows - (-filter #'spacemacs/window-state-window-p window)) - (bare-window - ;; if WINDOW contains more than one window, take only the first window - (--take-while (not (spacemacs/window-state-window-p it)) - window))) - (--each child-windows - (spacemacs/window-state-walk-windows-1 it fn)) - (push (funcall fn bare-window) result))) - -(defun spacemacs/window-state-walk-windows (state fn) - "Execute FN once for each window in STATE and make a list of the results. -FN is a function to execute. -STATE is a window-state object." - (let (result) - (spacemacs/window-state-walk-windows-1 (cdr state) fn) - result)) - -(defun spacemacs/window-state-all-windows (state) - "Get all windows contained in STATE. -STATE is a window-state object. -The returned windows are not actual window objects. They are windows as -represented in window-state objects." - (spacemacs/window-state-walk-windows state #'identity)) - -(defun spacemacs/window-state-get-buffer-names (state) - "Get names of all buffers saved in STATE. -STATE is a window-state object as returned by `window-state-get'." - (delq nil (spacemacs/window-state-walk-windows state #'spacemacs/window-state-get-buffer-name))) - -(defun spacemacs/window-state-get-buffers (state) - "Get all buffers saved in STATE. -STATE is a window-state object as returned by `window-state-get'." - ;; delq nil - removes buffers stored in STATE that don't exist anymore - (delq nil (mapcar #'get-buffer (spacemacs/window-state-get-buffer-names state)))) diff --git a/layers/+window-management/eyebrowse/img/eyebrowse.gif b/layers/+window-management/eyebrowse/img/eyebrowse.gif deleted file mode 100644 index b64593bad11be60a1d9555f0af5e136938f86088..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20631 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 z 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 diff --git a/layers/+window-management/eyebrowse/img/i3wm.png b/layers/+window-management/eyebrowse/img/i3wm.png deleted file mode 100644 index 5fde97aaaac9010138004112b34c39500f5b1962..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57602 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

!>pi=)p3 zi?tT1D^WV}qchiAqg#m_GQSPmYJbrZ*sXn2Rk=(r2ArZ)I1Q zFM^3@d%SV~_BXIHy?H$O{K>3L+U9Z7XhYAM@{tBM%3@TX+K%oUdP26is?$m^VIzGF z4ZTJGRokl>S(!wmj7we%z2Y>z6*ZtVockr-{^sHJ8QCm#K zfD#OHj&aD=UyPxS10{KjyM0^^u>^V zv=9xZL+|&UqSkW^lg^#`B=0R(9T*?`+}HIiSvQK*uO3^hbCAR~^r6>gTR+w=>y$<7 zfE8_(p)onx0v}lD0dqiTdXUsPB##H}&*?ehOAnvb{Y4a*SoxF!2(y6O@DOgHF=!^V zaaAR2gCN_MOgCwp(8vg%K$GaH;0{>QEQ828XC|*oI4;k65Xvpqs}3L5jCXGQ)`MRe zAN%|_#{>7=H14?ZYF`WRQzrZx!!w!{KlkX9xXUKnK5Oz9xr${^<605hNjMEfOt0#=YX+7oqNJeL?vtL2p1Yy9?{6DgWN1Z zp$jdK&)lnK$(95Uux%nKaFeG$eZN?%F;DWf$ReITzMw;|=8Y4)0rC3}>N(R}#;fkS z)o;(Mxk=h@vE}M&L9Z->Nz9BPc3;rzTyN74qA_{?Z@>46agFf%wI%o6Rt+9IfCM|{ za}y}O;)kmkq<=remEHbfH)O*toF`=Tage0b1IW0g)3Q3zf0D~r9&@`LGHrEaqYypd zz?9gJOv!}w+?M2^C|J;;Ss`7i$bju)Bmv+mqF0$<=#1c9Z&KxfGwUW%&yo7&f+%X$ zA-Y!K^$_=g_&2p>JD^#G>!g$VIK?0S#iQfg#@F?W;kp$pRi`iLgMM--exUfUf{r^{ ze3ht!$Xh|~60tQZ8`_gx^!V&Oqu3$xZMJXtC2#QC$$d)w<@F6Pbger+qUCvQNgAnWOO-ps+V zy%VA_=!Vci1C@qMZz$v;uKL*oLs;U@E);nRA5M zo~&dW7%3bj(4{&_VDngZks4~2@NHq4sxw_cvlF1JgiWeMEs(*2T{egoJTUMje{|3; zIzwMs<&T~#pblz<;rCQ|A&-k%QH`qz5^eGDZf_^JCQ{vZxHN#kJ(!~9+j4vzq}9d& zr0t-;AA-HTq+L*;KBo@@9zT9u@bkXT@HLrq6VTSfbru5$3|r~zY9tw^CryP$3mn+$ zwOG?5C*|~|sO3ul4JNq6Z|4ydNe+G$cnHb+mwu8YBlO7&O)6TMPU;N^Irp!=XN>#q zxy>t+-w?1^g4GhKy|^Tu9T)@?U;h8r`?WHuumAVo|M)l}TMryK=oJFNOb^^FVYTt( zM2p17*f?l_%a(qKOPfjVCj|@r;YrF)Bm@E}GZ7L@CKtc@i<^6l0gH8REQz?rCnJYs zClrdx%mrDLi$qy~6RL!TgR?LbvdIA~fmBnUp;ceV>lJG&Z##rVF65MJNcf!6Cdn2Z zuW+$^+fkUQ*j^DFY^&7itkK+K6O|6-S}o%638wBqWKK4yck>~&eD;RVC=o0d^brAm zL3~pI@|-@}e)F+|;~G8leD>t|@r0g1@p}JJeYR=uzI_@uRywVg`j#Tx8v9s8xOh(6 z=Rv0)-Pq_cU!jTZWk2o|GSl{HIZ+{x3w`_sUP3@8ITDkN%CciqlL*@v`j^*<4$H2S z3Z~!GcYpuNd)BftX|nkH2qtboy!HNju}a&@kGoIw0)*oQJ3W~(31Pc^JMCe-)uV>P z>;*=R^lv3GSt3v;`clvYoIvba>>mV^83lBQ`0ReljVSp93Pn?aB*u`!;Y6K;t}dsL zn#Z>>sx%FGaPTqUNNFtPq^2n*qw!XBm%%*@~7VIEv^&*^n7tRc3tt z=tLYACt`t72j;7o!Urq-aa!_poNY&B&0_4J`&x+S9t6?zx_wLj#yhSZ_rL6xvG%r` zbb~_=gm1jfFM}RGd1gHF_*3H(U;6g=o}Noxt!aL9L$4U^$rs5JP`Y6+$+E5NpjFoG z{=|SJHKCG?QoG25$63My32iRYE!h-U;`MAz-ylPi&AMRy{dBOk^uvb^JD5J8*L!|N zAKH7(J-7e8u1s%JFfo+eif5d>G7;5EbitZebQ-LGmJcQY`a&Jx)kT5fHhIQK08H0S z?qrc`DDjgGwu>lZX!U0W$kK8okC8U?v~O&=M#7*uiAgC=q8_#I_cBek{_ilam=8l`L@iy+HA%)g^&NvLyFF0~>Yrq(V4`oCg!y89h&*{H zhX;D?LlS&yINvD5cHe?E;rin!>Pw!LMJvluQkov?+kpVTA6D^ZCIWmP~bS!T)bY!%@_))|`K zsxjr{lcZb&&D*(L56MQJ?^p)Xs*{nUf$^OuFyF09AxES(J3 zq#Z#9SgmSq4{e~_$!&B6dKH{4C`!cou07-VXP+6jA3Uk&NDicT>N%1gy3sAw*)2L9 zj#NS1`8b(tR^{G=$9Tb^DST|kfZ2FUVo=PHbL*J4Y(lrLC`rBXtP<91DUs21&Fqj z)0dARX!Mo%;F=}qmbpgVFiw1L9^Vjj=grrRBl?WcpMT|XKeOTXyDh{V`U_jqu@mo9 zz#tn{dDm67o!B}h?C%4%1cXYaXx53m3-DC`hNANkAE{;z<{OGvz`m4sxe~-b$ zw(hov#T4!Wp%z$I z{2Ylu+JB-0saK@z3yEv1a2EC$v>4nLOXpVEgWy3IHyv-*@Yonmf~8ToMbjkj#wGw~ zzQ}4?$v{V?*xI#{Z9`hV6)p&DLfIT#J8GN`*&IwN%@!DS`!`@_N6or^Mx-F}i4g@JVur$*un2zmR9}j(*V3PgqxDw<(P`g>J zSVhUZUl65Q{!ps_DY*`;fJ>Z-0JJOsDZ6AHl;-3yLYzQ;hDOO_zH98&%D@))ldMeF z9@0np|9)4d+Z9Z=U!#@j3tx8^?$KmOSN6)}m6SGMtNXzP-z;!{RG)y4OPLZP9SBOF zs*)tI<*3HE^8FXj=^^{=`=&s8M^+>uJvdPABB&)vbOexP zw_U#Llh^(AU`P*cPmCXW#m(b^SKjUyEs>agw+a%o!Iyj}@s>jdsqHY>C$52SyXo3- zWdE-5>92fS+dOWI#|FN0A^KypEOH&#bhu@-Zib$XN|2wm`us zgY#jm>xPvgZ@nPn&m!RO10K~Jg-|dHL=W)ZwlzL{IxX+qBMu(K#c{9|xJHo6TR98+bANV5*G4Dx6;nU+=9lU9p~KVlPb5Q6 zAm#Rw->d*&Fs`RW-%cqj)71yo$EP28eC$zs)|qKdM!)K)G4KRKe>QvNbDsr3y;m^Q zxSy;K-aZUioMt^yFw62y8f++8z2!?gaAvkyV?6l9M|CZ8aJ2ql9{z^)?(tn&NV*MXP`&&O{Sjh~bAL2X#M?x7eA6ojsDCam2&CuO z+G#~%dQ=ir2_D>V$7FEhIxoS^FoO#MU;$hy&K0)_jtMjsET{3yyL4Lz!kt0Km6(+v z5ioGh>P+emXp1in0)~15hVrtW-l2zJmtzahii3-vRgm0#Y`@-=KB&27En@*1<}}-K7dFgOLtesb#G=iS)T{ zy)n>}fjPujylyLzPzj#&1#&s4tDx%=+n^?EpHt77cmraLLx;li!4H3W{HoBez4wmX z8kZ7_W`aT?^6Yu7?S*r<4Rd8w-_3jDYwod)@73!>zX#@NUlBXrGO?6jPnw^ zPx)gf`Kj?qg}5V%r{s;8>oUt0!Jd3SDe)y zxZ95G8wd0%5!)K5z&c@gvo&m)3!j@j05hogm1a0o&}M(cJxp)Fi=0GdUqfnKavAY-op$qc8XjNIhesvUuH6?u#qsW7x9I zeUx|e4p#YJeB?9Zmqhd0dvDjTe`sZHQ(+{aYH(XW;1^8TBsp%A`kb$v{(<}M8Na0O z;rLDc4CggkEli;PVsYSiGUgjNf!K0>#hGC8xG853ugMU9!Fvv0Vt z8k5*iy70oM2)-0uOTmE4C!4q+ky-SK4D3N@Bn{zksshz*I*QPwO%GF*L$8YHwg!=B z)+jJTf(S+qy4u}sUR4%pl4=-lCv$UPyEDLFhAg;OidLbM$>Qt|CJpGD@4L$b_-{Y< z#i5^Q9edRVZk#iGG@C%eL~oOeAK7+t5S9%DWE_DS30rM54k9`HWp+-UwusMiVL%uM zuxh`Gyv)n(Z{`+1_cC59lPL9}0@Hr*!=D+yqT>B8*UEG@UpnKUHmw-V8z&Xn6{XlJ zQrSWv@S^M6U;hf<==qob*I$mCuhFwR?Bpxv91Pg(o)b@k$%+JWfJg>Qn1hM7>Ob$; z(E;$`t7<15uf`%Fy`UQp^K&HK{w^XTp@qRo5SQ6&11LB~R@n}ULHvR4{b=FIfIDc2 zZqhU`R3bAIJ-v#Y9AG1q=7i2LgCp3q!mR`fsQPos7w!|M3OE*ZPUzCv0P3=V`6xh@ z7s)edIu!?EHr%f%>ApK}9Q*b04EF7-Ni(9h8KmhNX_dgW*h0}p*#i3GRz1|cM&Ek$ z&{y=?DLDl1<#D^#Yf0G)ho6bLy^-LygP0B#ir!jE;j*8nesq7p2ut#*FFZ&_fi<3h zbV3EAWK}--BM?aV5c|WC^0Nj(_$pq#C42Y@j&<6utkJ1S%V4 zD&%ivx?B)dpszAXP4r;gMP@JVq{+4e3Z5sA>(~DDJ#feL)&kc!o#5FPSB>0~(@psV zCOz3jn`*g&q1^*L8`BiuAz2==*@KnSNP)$I9fl z#?fpU5XuINgSO?i-Iva@0BBHTKi|W?N1rMCDg6xRqfb0L9(huqWIn3ju+ke0Ynt>n zHJQ415byR1?$@e#H;l<~;3%&@s*xf8^|J#+fPc;e~jBhNCe!2DZOPcnBZWU;2P z70l{40)#gq-uS9J$1lA772{dGf^40wv~6x5Es*p0 z%qmt*O(#fiH4X~+AkaY$A1~VG4j|UI63W<2Fbc1`X8ELT{R&2XMe-rNn|J8Iq46(1 z@)zT?UwU-xN~FYvy^H7&h)P~@G)u9<+gSvs8dYHV7EEQl*KNj7 z>Fxs>+YVjPyCo`5e-H)dLgOu45Q`2q`1Bjvl_os|lY|sLk2R{F1?6=fu%FO#rk5Pu zKW@G8TKPmz8bW~0KN0|3aWcJiv#4y0>#x!MPWjs>zx4PxdXNX<>MtTe4Y7Y)Jf}L8 z8PsRVB3Rs>lH1f!5<^cs_0+iMkRQliB9Mv^hGoZ0jl-B0uH2oBsd5_MNh$}UK?Du~ zv%&jiDqqx7{^#X%eDmpXeJ$1r9jA2xdR7;Uyzk7lAug2dMB0g7&lsvo@zgkM@LvU- zD*PKp$ITsPMx7XF%IZ{TT>-Fj5EW&F+BZwL3}li>lFbtKm{z1~^-Zq4q2Ox(Ax$A2 zd5)wlkKb%4wo7EOPe{+4)f(Fzfw$;Wyw^z2XCC>sU!3F>Bln4Ha33kxD0nQ~Kg)I^ zybn~U+P_B;WF5UH4AJNx|eQP{_I-dapmtbNG3@NiiC-GsgN6peytzg2Afb2JCbocR` zKD+kZ^UsWX4!)>BB5;sZ(ohIMDYFhXlo5on{#jidK=t{YO$E?X`u=UUaraz*z`y43 zx;t+eue|M=am%p-Lsu8VpB&HX=Nb8_L_48Qxz!k5z0_K_S0n6@5oHVJ$x;A@%_}RG zHd(a=GErYq5LuiVU{adf?~a$9Ncz%aPmNo3L4AXM(Yr6G=@tKciCV-LiqNp7B#YZ} zN^?-!h_o|(vZ5&lz;0x-y08o;Tz*mzwnrTI_1DPpkL&6!*s77wHq1*KBvR9Fqsa5q-=tz zv>HV4V_o>dg0lfrY8fs@3fnmgMD79)t^HKC$c6o3yj^-8!FLLr)XMvB{^W1QfB(+4 zanG$c_*O5hNMtMMe=cs#OJAWpX{n-NHqUlLn>KJQtSB81yyAADH^*;%>`Nxo2S=yG zw$Gom)fjNiVw;7Hx?Yu$SrEx~nlj+37!A3#3|K%g&(Pz%+ z*9!Fo{n(`-b8tgc1LVG#+AF*HSgb8nCettIs|QY<(R-EJS=k@d4(uo88tMKWu92ou z6{*YrA8~IQ^V@OX_sv~-_e=8LOH$kZ zK+$&v0u+7G0_~fiZ3?t-YD=>0w3Zv!OJqluwab>ZkrFqNqDXPy?&aP0em>vd%sJ=( z+=UNi13l04KWEO&Z=d9`>8QzP)DOu6ECNpKK@Sh+e@*lVvWS{CaJY>0U)p z9uF?o8p&;EXGXk|_QEIx=mqShXKav-4Jn=V5>6!j$Wa(&ca1Lc`Md^kf-dSe>2|qr z)2>Cmt5ly!+2pps9^n&G!JR~{)C3_dkM z0HXg8sBZFnKlqR9BvgR}Cv=N?l0!QPB~uRumYDn%j66Fwf&6i`HOP)lq;CP#`iu+|~sNK7g)v0zK&s_2vK=lq|r>E92(@isK$xeGIOakhf) zI10~0HSo;j8yHmIdfnc3_d|~}cH)IN7kj3AQ11(sQ=zE5`=Ra1h^z4?mt9FEP+<#P z++ZYzN($L1fYK}Aq=hbI}?*eIw=+IaX|}QA_N4Y z;D=3uV{9duI>CrK(gPoY#B@4IC9GUJliB!%Z$H{z#RSAncJnN~mpF>cB@&5Fx-uyZ z47A4%zKM0ugO9c2rGgpOMp62WC}tL7i}xRlc&znjiVgX8Y%0LUkAxA0`Mv!4HzosRhY|DWsnI4$3=AOp61JJzxq>eJCh(g`bY?xeC!1P7;|Kic7B6X}Y{(-RoIAXM zLDM)P@)v@grtuxf{7%b+A;0XHY3~(jX~#1fl8bf%b&}rYj--da!-4ZmyKifUdFk?N zk37d#%;W*Dr6=!FhOA_)9(_K@^f}#O_wYMOWq8^Kfp}$|cor!5yhg#I)m#2*j#R}~ z=H*BP5I9raKE-Et&Q}Y5=+#%ZpZ$rqGlSy8tWnEUU0MZ73UyS*%wbzCYx6@d9&GnN zb*SyKiFU@v!izK6Jsdb?GmVQ}j$)@n7;n}(5$36cKn_F2SSfQ08XA$?RVV7`Nf0&w zaU|`*v_js`u{HhH_nv82Z$90wp<-~>PVI}ec*+qG)_mF}MHzO`$`wwbq-$8Jz|FPVJ9Va~S` z7VSf;61`WK`h1 zj%Wj`yhrAmt;yFJxLYnM;AyS}tqG3eK%uaP!&5Nu)@+09cxVp~AvbQ>(f-^2{S)mQ z-~0wU2KiM7k3pws_Q<5X>?z`V8hY^jjc$m$7QOY3o7yk%(DpdrfjY%9nX|m&;e+qI z50$*pe7!>J-5QN!f%3QZFe>&TV4*Ju?PdvZ0Ak;=qYfMQD4U0-y7EI+D;b}C<#VA< z)R4dK$L=R(Ht>LU+qRwTslKcI>rZ{7-OI-PKD6}^pL4=%Px8Cy(amGJJ)Boxe}Gl` z+uIQ)zWh4hesrR$94j4Vxy)-2`W9xcoH&^=|nS)!F^WJ z%(~c7ke)m3WXud1BhBP`f)S>O)58O1f$xSQX0%Pct$=;!6b|;tc57pI+p&@Sum1c0 zr9JT2Gg%2S3PzDB+LJM7u`V5o8q3N@XYzx`XK<#Q+t0t}b$q(!7!y55aHNxQGP{<} z_W8)n{78XGONEYIpW#r}xZP5bArf*D4o$h*!mG1!nkR`|3&x_=A?I{s#23ek$FY$% z)0tfT(4EQMfv%tn{I5Ux)%M7f&&HX08Si{9G>g3ayYR5uwuRxlzf@v3vFXh7?BH~Q z>FYCjEK|J$pE*UgD5Dzupbf7l!M%1!7DKGHM|8mHVg@kz;IgH&Tuz`MCX~hp|AiGaX|u}3<$3G2Kqr* zCrY~Kku(J`b1YcM7A*G;NH>bBpGeun@}Z45)SlftiQn3O^E3Ch2OfR8mdAw7pgRN@ z%-3=4s-$A+;5w5n(_3!8k>x~p(lX&pCyr)0(P^IJon;o)4|wH4d2g9gfY8rz!dUo< zC1RX%tW~Qiwq;C5OmX5`4rP86UR?-lw?LUx_lXlsN3?aa6;I_u1+elqn~)Ikqd&f*ct3n;QL zooS?{WdgiA(rV!r75BhODP95~Ttb~AL7$Se609yjeb zc+PY`&a{OJVic|tsqPl~W!o%L*^$NrDph zmZ^A$KS^TcFA8CU5J=Q2|JA!mn$_q_+;u+H66K}5$ivj7GZF4%rn_jFevX#OZl0}^j^u)2U+ai7rMFOB)9{pU z=Uvt*r$)k1ZlwR3kU)9n()*4>_C_DmbO7SS=LD?n_?uV(S-=k9(a zOUfLFR(Y+wy`=N3*lLsmdbH@eo!PtF`B<%8JFFB3jLK=5$_^pTq%uOXUE`)7 zkHS?2vYy}7riXC1OQT{7_0A18gdEj}3Zv|yAFV7?j07yw)H|siA5!}J@pC=9-Z%;h? zV!m`&x+u|t_(kX;;uLFG1G~NNQwNVRgXcq8m8stfEzu_0v(QsiH~%1Re0a_5DoNVF zR{ z5K_kq)MZ`gH7%3QWCl8By6d(Z(lQ;VWwLeBney67@8&URibH7?+YAf21;<~Ep*Rsq z`xuY@i7@>#4h3B3Sn$eo>I$yQz3i@^X3F{Gne!BGek_td!SwSfmV}-0eKZ{E1ijCP zo_LmNX$pT4S(iDMK#FdQq$6FkcSk$QEL|!MO_V>h8TzWK;n9i?8>ny8jUs_58z82& zkw|*$QM5S1S|Szm7(j;C=TLIdVjJ2v3d_?+PPK;~ds=k)=Lk&&yT~!88IqQB^_$xL z)Y{J;Jr$Z6$fu?UVxnXCA_R*H2`0|YRgj&BsVlhQ+;IwW00>vGmvSNr6|qnk7`B-a zLS|?5oSoW2YqWXuwziX&X%ibUI0509DevciGf6NCO_A)vyv!wPdMbTWNa9Rq+MC%< z_~+k4%fzm)Cr+~StFw7_^`>qftMsYyqhpstS%yPt?`2Ds!iJ2d169Tmxyx&r@keJT zE2U2nILXR_Rlo-zEnY=nwIxOC;jVCs68uVpt=nM!*7X|E}%rlYjZ0_Uwx<<++NqN<7Xb4Y(tw$MqQL zx<}ce!^hfZzxmzlpY5k6(_M=6;)%@_;7N|e_LL$$#e`KQ72cFyw3MmZ(~ILPa>+Z+ z-q*3@FO?YHByiFl6<23+3_w@U*(skh?POB}S37*{GvB6VstJgaqhwlUVsTo>S$ibo zN~+Oy^Q#WFOuz8%JLu*)n@7vUOr9;%csWp5Yi{e@^zIO2OgyB}C0_jq@RLJY76LlV zNxXq~9LrH~nqwz*95*N7p(pWYps%}@e9%dGslsas+U&G=D$07+m%6|FS-$7^kQ|j63YJ~ezCtt7@TcJEBqI+O5~FG^g3Xs_ugl6C6} z*Q2yfI@Ph>?Q6od_4-p@_1~hc{)Ujs%u}{g?uEU$@K1 z9y3Lm=>xg0q28H>_No9ey1a3t$i9&Wkgjm>+qF8B&zZKe(*5I~yRTX%3eKudUB5Ma zSEX2Uhfq~mOZO@??k{nwy^%%1PL0Qz^3b+-^H>|{iWKd2mI6m7C6;rl+#bsryIlTg zK~CC|;3y|3CyqBx(4z2MlYGWmgay}axm@)d?KI2~uaQQUBt%lr30pr+dAHObmAjO4EFER?nO2o`-$Xq;+v;5*|4rlwE`_CP)ed za4xHGt&%m(#tpo9=e$2kZrW7+RW~nmHpQ`4b3iww zr#K5?C9R%|mwMLW)t>@gh%@9H(1lab#lTEn6b1nTTpUt8KqOD}dqr@b=StCq`yFKL zG17nYv-h@NK!(@dd|k#il9_66=-E|^h$g(;5m4mnauglcF`mYmUe$gc{NH4EBEQtW zeLD}$9XD(xUuiMxy&VVrzG?|eU(Z^aGB7KRmDE4WgMvhuq~&%{Qzz57 z7M?b&35A-hscxP!+9GvjWIi407n!D*IS|$7+k|vX-!$+j+w?0=fyVhPYDr!ap+q#% znQX0dqy;0r6Tp!;X3OL@QJfSazY*a6EDn_~4RB>-6+-o;1~R~^8d@4w*6tTZmDG0g zp3X-;dp~RMj^j*swd;J10s+Q@T7YxtplW7U@Uvfkuzm6ykMZvP?$p|5?q<4n={p0X z{E8J;s%gK%Bax=7J(3`g(p0TiNZHV%>==}sq*;(Fao)%)S0F~XVmSARi#bsl8GD3n z5z$1xO?!^daOQKDgj3rg4~vP~F?jqo8=U+cq+kE)SEU7!*I&t*Vt|svtoCPR_Ikd8 z@pG8%|NP8-8SMM&m;2LEM>3XkY^OPW(-v739Ql-^Y%8Js3lXBm=P&WvQ+t*DiGmnm z9HOU$b{3|VX@WbYQK&N>#&{-YMr|^_bY&T;QttN&uAVyWWn?B1f&-7K@&nL+2yenB zeq&h4OP*3xZo`>uwUohPCSExbf!ujnIf7c&f~c4prj!yRh`|^JG}g*1O1kkLj%1-Z zuxn@gw|t}Z%Y0bt18;o|?;PF0qQt8*C9FU?=;O@rJ;*rWGxt2!9%pjlRXmV8YgY~$ ze(WkQjiF>-%JM}&Gg=Wj43~&KB92~}p-i@#7K)rL6oBc>aBK`#{gS;0j8!y7B{19#VL*R_8Ly@V-|4QdGE){TPc$Pl}yt z=$2!cp=B_$*rRkaV1^r04pwtM>Kp?lO{$7_j`754#u0W;j-f;J2rlV};uplvQrVnA z-!mJS(YwNN2rb2*-Pb+@&YNzfWy&)j`6&m;;!FIM9I=x+1UcxZVf4mZu4^BL&TrsM zQrx+-k8i>R+xcY-a0^fT!BpL`JxHnCq)*y#sMv@*)3sAMm^KjsILA-H#Zp$d;hv;0 zsIpY}e(i9`Jwt@>5N07)nP!%A0tpSDZQ{0_UQr8e5keBVx-*eA(aCsa^_mKV^i(#n zQCcKZfzF}O-C!dM%!236ZQ{gB9=fU*6~j&~IE;gCwP0EUQ1PJ|O-)ZESF9Zx<^cc7vl$s9 z7ZJAB{wPibM~1jlsVx*zL8ZRYx^oxObNlO`eV~1az?&%Swji3lcnVwe6Iky_0zvhp zt(YKy?wfACuKfypY?=4~U-s_SqS1wWUWbdiPWV`&M$02xVXW*@b|5%fs8llH2NSNO zgmvJSf;aGL}n zr5|TA64vlf2*=yRhA)+FE6(!{oXNzGviJ8dq0(KqIc9PXj9`X`v}+!< z*+PRe(K5N9^TWjaI^$WQm`$v)f;=`yZhHvTnp?26qsLS!5N821I(kDT5EeSqERsZ& z+klT9@?qq3_lRX+GW3^j=m6~u@=g1<^9ZE&R+r-|J67R+ZQSQo$xrn#4=e|Yl+vVu zd%3uTGgYMue78eYf=X33xllgiSL7HG<2vIeW&vA*5^G$)M8GgFRs%fV-xZp+n6=v_ zY<|KM))ASetGQPqVl{&ZwdAjd3 z<3JOPe8sC@Ij>LKZH>!u>E-sXI&5ekVRo%rrfV^leH{5b< z`-c#80>W8DCm^cNP;&apLp<49ytl|YhNWJ8m8Imdg;G0$9<9CLIGHN^*lME`}64nikAI2Bf?48R2?x+FK&JakfAk_&vq;UU$7}Py66I-q>!x>6$D7sTNhK!Y~`CJofYp?XxU?{M>h* zVs)TB4(sl|y7OJqpV=Vo#!)5uHHZJ|8I z_-Qzl4|Dxf4*$ZWn>4K&Jr7&5>-aLCJquqJO|qctJwOO$WOQY`TT92rDq>6IPbo+j z(pFW!Dv5Qj3%hyAFzqgFh|i7`p-Q?aF3l-!x&g^d*HlrtAdD;Z3ZJ7H@2(x>_}hV?P@)iI{1#z z9XDUY#*O>h9XEWpeT>Ntr`|0fV?Jz?uQc#ypFRCwdFNQwY;9{aQmeJ;0wZ|3m*R(x zCoNWoPE>fDQ;-D%Ch=gJuZ#zrCbu#oi-ZFjT&?8uNKkqKeJQ@^k!ZgME-Cdo5;2$1np zpvh%%W_ym9%U%JuqV|Q;XOEn0yXYpy zaqI=Dm$v3Fb!c?CyfZ0h)B@LI%J0b4Wz(1*{gUtnr;8?DPC3(xyM@D|mg`W2QA@=a zr!F5tpq#uY`038kU$#5<)WO5;r{BUW0&J|ZXXiGWYu>fN&}CpUEQLd!)Mw!OVPu9N z?LBY3z5S;jd<)Z?Cs}@Ugm-jk=6&HUHN4%%`eiiQCGHXx?Xny6ll7G}!5NwCsQ6@# zdMZz$SAsXdMMhBy&osk6w9SLtJUe4K3rmSyPPAj^ZYFDXrXu(zU#4&g)#zS?e&}?1 z#pq?vv2DzxBXl{jnHAFOUVTmb(EDE3&Ya={0ld0?p536_CAYSmt~_y{_GptzP@OtU z0=7mTL;uoKdk_bYx>lFk7wu98MKDOqVZNQ9yLo_3U9R81H}@w0pofzSN0}Xd`lS=u zEHXogl3sz3$Go#*h=8!snUX-T>q4IP(pzv{m`V+?S&s_@y{OZyfig2Lc~oLrm9;Q0 zL%W>XR)PryW?MFpaWAsn@ekj8W&4?TzmZ7`_F%@?F#r!UElus z-}<4p^*rM%Hl%O7@D^vnLGyuSc*&3d9Gcg|+NzEbsH=ryc_en61}Fg5;8nPcES#cU zK%Oh#%9)}Q&SGonLf4J_cCa>YCw;w-fAPWWo##xJwJ92Q5jrgit@9`w1Ke#lu4$QY zreA*V>#*C2cGQ;xxt`9-aUMfZ&{N@bLsdc4nfw)V$Dh@WE!_|mc`1siWJX!+MbjBP zG^t66$^#wgwKrVFf@R+4a;mK#b7;g|;u={>7@z-Gp}K6%%}`Qt<6QYLfbOA8%9l!h z=x}LglA{l*rQRKBDb_OFg&R?qDD)8%7{R7Y>8KaGOfb?b9WMsf<0NeDL~FzElr0O* z{?EMYbv%P&8l9HJTB8bn!3w|pjajXcxfYN+Zoant=Rf<7ws*_AAc;TgE?J!HBVzW4OIgrkjd|5b?f-0-Iv$kbY+3F3H*ukCzgpl_`_sA%CrT#N zX-T4o!6(B@?xK1EhrH$beeIw9%n!$z+&T<`d4troXm%@-p*XGA9KG7P2m_)@k8bzH z{iFqkGL@fQy;NUnYPn9{q~n0PRrzi;IvF;z67cS z6uS`~gkSDD3PJ2yW2QTAKG1&oeRtwKI+Lr$eFekM%D9-cS2{WqyhZ^lN77k_IMpIY z`yQvvHP~MWH(zsQaf>|AU639kj_U>VOz7~6>i0}t z^Y>2}Gws=Wo~B=CVgiEJ$=9@X-l=tB{oc@XTxWH4g@qtWI1;O*kY6~FaX7{}Drs#Y zABe(Zm*lQBXKnR0#!OB?*v0dmrhkJoeUr@(ZJDwbOg5u{3}!v93P$l9VL?Wrn7}6^ zs#mp4ci>FF%qtka6nMmziECaCq!q6&aXq6`d1qyiTxIwPGe?HDuCWv4esl zoLKpB9}}jzGEHj65r|TW2#dG2Se6l9mNz7`I=6452t#0VkNqo>Tyw!*`DK zb{J=lO=PGh4xla)SG!oech7XF>JCwe%(1)|cX{7II$Y6_mWRvpZ=z-TXMgMM?P^wA zyu<{=hTe6_=8Dv0;SIrzn@W-3)(Ih_8+W;Snl&mcfD%-XWdZiSj&iyhS6JVf z*=D-V#4i&NwoKd7D(OtW{pCm6*BLXpo^U+l32hm@%(0YV1yr3;rSiEu6WzQIzxPhM z!pAdaazhm-YuuuGI8*Edo^UD)uL@L33S4sIVhkkJlX8L0S!XhH< zDO#qR`RK7N6I)NW7ud6WgVW;qx$BN&CAxPyGp&@z(qe;-LMhjfZFFJA_-HAY;bcyz zNpGYsohVQRmrT~7XmxOw&D5-R^L$->J6*h8{QmDRe>cwL_P;C6lp3@%dZiaLaLSBw zrrU4a&(!#x*oY6s(ak$c3*z!6KPIO$VI+P7Nt;-hsR&Rk398a_*O;Jm!Rnk0OJ?k`i2!!DJyR7 z<|((aJ>GDfiAyO=N=kbvJ_gszg1_Q46R89)a~g*1Ai13d3H{+^m!cvLC@N6DjqSOE z^v{DQEfWj5UoJ)Ig7~E~ndsE$&3wS?pM3C#+STl{{^Cn7WrnJ1T%E~6Qj-rWwh84W z_hs0`x=$u7GhzrHh=FsV6AkjCYh>nCjp{BtH8s8|EfZ7YyubB3e__ky9@q73t|YL4 zOr<3xU(pGB&pLN!x`7D@S|**z=S=5%%cPz1iBl^b@GO%4d1N(y@)E0%x9QRWQ*Ytg zeLvd{;g~!ErU1!dl5wLXTTb>o60p0e@Ox4gR?8hMkg)A7~Sdfy#oY(7QGd zKk?i|euy8GuF4AfWpAtrt92R7b*7A&aHgx6fO!58&g6s0j0K#bsYjql)N$8PuaJ70OE zeJxYtb2m?7I%79|XuqNpc|Yg-YRj~d2i!-G)dTK)WIHYRXq76L%T}c~lBejUGQ;6q zKWW$SG>;%0BmEd3r1SkFpB-N6xTyUw)?8u9k$wYlk3Rh(oAK1=FWpeZt&+JIF&>YurgTwNk~793=-KQZ9GQEmJ`aXZnvn__lWC z6&t9{4);N|JC!mHux0AwrZH|qy6H$QJKsf*p^G<>EwKe;#?*nf2D>iCl|F?%@KUQ| z3kS(r0f8Od9(k+XygX;ZnP{0lF*(!R%`2KyY4P@z9TUyd(tyJ27ZC1&$BvK{g< zzRKu_r~PKG&;Eq^*Fm5^SOvK4cPV}RV4%ww4N%7iefZl17~wK>g~gsQX(R;99(Uxbrn zk?zhg;EXqJE(nR4PQzKsm<8O)UYyooARm6Ii=v-G6UD66ZuTX+@7d$+D|{Z){UhW) z9X+_vdrG=|07<8(=4N_z^W1R#pE72;nwIHc@8+GR8bM)uv^nzn+!}t@uC1)cEZ@ll!@M-j*@tX+EmvSSMZKj4QFP29R~s>DC}JEm3UA z$GE}Uvf*rd?;CGsfvQEb;NrMb!GXq_qin)?WPGU@o4bta$!8C?2cA02XMwiiL^_fc zi<1q7Gn`R67jq^n@YuWajWcy+bUKfP?;&*8&+Cw>!1@_J!#Ru@HPeU-dZ%%5y$6Gt z>M~{-j+}t0oPQY;=r|bRn%&#mC%*KZ_8s=j+m2(^(XBU=euW`3wImpN*)rXD&EEEp z|K{7;UiK+DNXvA-Pxqe9aw2M7yD239u@Cobkk2gEMaFRm93B9l$9TEt6=@=H0||tA9c_?<%@^hj`B9 zgUBqAp-=BKrgULwKdS~sk63%?yH4i8$!US$z0NZJDyeG6ve%eEh+|RFY-C*FDu}IY zjqC)3s~>hVX8PT)J=VVVz!Pc3SDgtSy}&IPuPa#HT0zNE?4~W=cKdbhX1)b``dYd)FIoCec=Yfwu^T&gD)EU22lyc>D5qo?-g} zmip5gxpj0tC6nz39H|ZUv9V5-e`Cv;;%9*|0hr-TUZF8;2eeWKyMo+#lp@rVU7;vH zV2zs;mFe=R`-MJ947f=PqYM(^v4)Iea}V7v3ZRkQ5nmJc%MN=m%t7|D{hxm4i|xyI zKb%^o3P{&&tpG*tWzJo|Ay^l-TBa-8KmNd5+OEy6&Ff<(#s_xu>U+6W!wyGGTQOwN z=>DK5hjgn}B#HGCNxDb-yJh89@^?mS(~Rbv83pCzm7BY35d1M zB;8khAoeI9;yM=DwS8-Q-SvC31`@*n;LxG#7X~6(=~Qdv=9EsIA7;bK_uqA6HqCc` z3xEoG1vgPIdm6f^<3o=>*B)b$>P~jDvP)-Nes+svKUyUy77mtPaVBiSeK`|p$&AVk zt>t~SXo7Jwh@{VGwg~`}q`_E*^A8f@&^l!5aNs9S4;MeVnrqQ1;X|W4gkcpb8eTiS z!LO&0fC221*mbGe)=d>RP)PPLpgzBGYx^I5?=RaQfB8PbHR!JQiIg)YD#Ih+bS#2X z+}gm%`>4xv2*v?U$Np2gc~{Y!^x4UIW~#DNskJH@E{oU<8`Si4bt8O!lD!V(vEZ$( z#<3hvRkXx(yn-3DM*%C{x{!iufB)bm?`+zig|6;3zAY;t_VkwNs}Ek-GIimHIP1So z1zlOF_PBpF-QlgQ%oe}b@wE2mf8?h2-~7)XYcJA$am%nX8yMtU+oju3&O0*7g5@r%_kQ7% z?fTo_Fxz+`gKT;>En>s6crRkLcWg6sim?Px#(tv%Qik3ACs94gun_+bEt6xqx8HFC z&4{yR07FliBS&l|&Gj8s0-zjIpXXW471_x&pDqnu^He8;URoj?iB`wwPRH4Y-0|m6 zy!94rxG^sk4r`P!>yx3N)K^YyB*S>{ZoZ}a?Wd2h^}t>h|5*`J(UMPAHrmh~pOUxS z+HmSj=fqdeq!FL>StNQ-d@xj1XNoB{W={b0f+j# zcbsbf>d%>c*mqz1J3qm@Mpx7`2*rtE>NK#|f0cmzONDHyb^B{>Z2#SV@yqRh{k<=? zmrieF@?#hE5rv1bo3&nT`GwSEo@}q6TXFFDr`j35oTr`^+Y66kF!=N=3z%`SaY|M> zs_EUVz;qes2r`Nm9vCy+?Ro3Z!cw$;?;DRtmbcyRTDDbZ@_yN6^Zv32q72ps)zSCF zvh0U@ZIE4u2)iJ)zG>@9d)Mn7Z@=`eTiUf(?aul-HIatrS0n>GwUN9wGvjxJ7x+H= zt;gC9dM~a?Obd-8jh>JW5gwdl+odzfUPmLRhVuYqlnM}Eyi&fqw0YHh=T+==aOHJz zBnz?Kj1=Z%poM;cm^||ys>H_uxE60SkHfBv$^6-UODMF&^H!St5)4M*%DH^~ILMKs zc$hiT5kYvYg~jUOsPC-sY=_$I$M)aQK5_R`ZR_^?cp>nvr`_`*jn96JOR)~NK z)dTC`JcA@}yhQ-lBHqtf@Y~NEVXud)m=vfXf!EO*m3aXspqe9Z4Lci}IVTj$-g~@P zp4D_T^C^bZgvkw+?aG_esUgm?NYlZg1vVM0Gsveq!sIZrc4i;vmpVnzbNl zW85X5q8ILjrB9s7FJJ>FZ2S)eq!ExXR&tqzR#qh>^ASCAZ*14nI(+O4-wDnKf9$TT z@A3t-$Rw|1R01!5O6DtLwIQCfISMf+m}R=@z^?XTUd8@D{`ed1h38MUJ$v|GE>Gq+ zGxh8P(t2LO1OP3Q%Zx5)Ri($zqOll&d6#e|g{#6nIILc0yAlsge+Q4Aq~&JQ6k5ePY8KA-ft>2L(tGL1 zQ9jnawf!VrIv2D$!63RKhi3vE{ber0uA=&o{wUkBeg59>v$%OXt&txrpqF3^ZCOrv z9`=Eu7QsPcDh1#$tTUZ;$YB)Qg}MFq(wR2&Hvz(1c%?4m3n)=Bi(sw*#aPDk3#{CL z36yaO^>gqCP5>voLAyu+A68yxe#J}bRX{G_tr$8vKl{8{?!mNXeZ-eRC9T5sSMO~f z#hL!#^LM9a@omV-P{p(h_A-|)*XUwYEvCh^nXAUn@N(eQ?N|SUx3ryX7izyg0iZ@XH*f{jh<67=6u=)FnvLwfP*Gyy4cE{H&n*&kE93(vO_g`%E|q{Hut>E(w{j-)43%`fZc*bR zU-SRjcih(Y@|N@LMCyH^?rZt3+)si=is<0j=)vcX@gCDo#);)f`2a&NH&)ykA6c1) z7+2{;htkDpb%~24t?1W%K-HS`L4jbzx1{x-E;Wv-jX0ae5s(T2)#GyC=?q-k#)*uO zbwAS?*wXBP;~GA5TtfY}ScA)bTD24u3kfy9@8Z}e#+h!wnSS$254At~;yvkRIBqE% z)CWhSy^>?CjNWUf6Fg^n4YPT_@>6%Ut!!H5D;Un?S!kv=ZGCc2K`O&v$aSgO$e2~w z0nufiM4tjvmKu{-PF1)Qpu(}@@$mrzZu-1FwB5wG?uzZZ+Lde%{fGBF(f-mE5Y*gL zcU(%{PJ>piYSIgr+ze|CTLV9%`ry+qZ+4FF|xGMC{TTMAb=U zbHHJS0?qmw>%Bdtf$D`^y>aTQ}ym;yEFZb|LO2xh=JM^^>}W)V4X zW=ez17%J5LAlk1|C}$c*Vhby~RKAXF%XAga^u>qTAAIg^oQbW2sUZi6DhQ?h#B99* ziR8bW$@OMB)31KuuC|>|-?*Vlt$?UaRq8ntg-QD0ExC>f6_b`3Gs9HYnLZocu<pb-1F#j?a_m5cf~tD1%uvHB0eiRN4MA4Q$E1zhqp4xk%^*Zo|~bs;Fxus<@n+~ z-)m1EIoo!zs$)ztqymW(NgO+LnVpauEz@Y5DyeK0{lJKmkWdwH(MTHj-GSm)J%7|< zXj0b|$C=WAT7vbP33i#-;Ub*;IfPq+RAkPa%#=ag;2fqG+tazM9A>bN)PH#($%}vX zjVUCr;&bpH=k3vd_r-6en>Sh}NxV{Lnsf|*@u4ulbrM@82jF?1sqAzG z6CzjA&HLoHo^D@xuwD+#qF^P}z80kZ!^`Gy(l_wd>DKnWXAZT`Jn&50&GyiCr7UE& z#7-{YN$puy(!c%2z3qK(ehpYyL7Q;Iu8X`LqF?S>PBfI_RS8<7N8JRJRSa$b>Z1r> ze)Iu;#z(e1(L-yNE-}h*Cgb=^nv4l9d5o~;EI4QNawBvGB5E>~*-_9XIU+{^sh# zfAy8^<7^W02cNHQ-n?qO8!LrvCU?2eEQ5TPI&^1x)z$4E{f##^_HkuE&1(g5CR!#Q zJ_g=y4!;#TYZ;FGNhX+a97Dz)w?s+icAU!ao*JBmjR#<_bZnX2Ol2z%EVuAs=xwZi zxRU2$e|-P5?F;ulo{Gn9u*xxIT)(NnVRM(^xV6kXJTF@P+WkVtN%V^-x=b7PKqkj^?&tlde9-RPCR$h~8ESDV&WwEN zz9Fk+gi^v^Rb<0CO08*B-fayWHGweo*DF8yN-Eai+~vshcgbhrG}Xc(f!q*bJgm7) zvKKh6~^t<1bZr+(}s8OWbDHKV*jm0>dc`6i6KJk(t6~|2#(Pbn7!A1yoUl4LHCsnq$b4 z!a{%8=}P8R^A!cZz9yWrdB6SV-%U;PH{baNx;JbG%tS!hq?|Q$L-Eq5!E1s*mWbbF zv7p?_YX$%4C*Rb5?cd+SY~B%ecI9~&yzJ`9L;c)qd?VjQ3eRrSiRLiK6d{M@QOu+> zp?3Z=)Qq!qqIA`yUl|a6+w}jP|j@V9uW}ksob)H=k>N@5kD;JQ#e7ww| zek=Blj_PcD%a`E4|IESmM|Xd}UCE;ldmxVg>hVKOdE2stO~(E5beu$GM$mRBPJ;}? znPL`FY)r%}URuz}2l9m{Oep-?LmAURE0?umK=_0UhNX0*VtLh78`^I%o2NDY z){kA-GD*{nd&LJhV#Q`$hco@d_rI}y?2F%Jd~hV|&)l&zeRXR(zdV8Q{Bj+UBEMp` z13}Een-F)i4kJ&6Ehpltc>+Qz|6WZ^?`}T#zi_JE`~35~xaZ8H zrZdlhBRBls?|vL4wLWoqHNuBTv_@_wxs^V_fB3FD+N<`la)B8=RSaKglmLo#*<;pA zFyxgFA*a`m)1~`&U;S=7MTK-V&TMOxos`f?y~0o|`Jyy#Q2E46!*HgeSr$vLNkL2j2Pm zT(cdrGLl|oBzWm#rIs9E77oISi5e<5b+=2yl&lwrtfE#snJpW0^8D~0gv*_r{}ww>CW)--RjQUOUm z;|D|7IW;uWJ9$vQGwlekoo}Z5`uE>?dls=evnj7~9$?q$L=kkHCSl>vpJUz6GfVd^ z*3(_fIM`=K*+7#i@5zaGxAM^Tzy9#guz&Tobn~)*cJ_hjuVKWAWZvyJOt z^FR99b}N%FKDhRn@_!aD@#{KuHHr^iI%XUndi;528J}qT_EeWnC-PZRCK!6&hxTwF z3Uk>&Hz^@9PD}~VJ{kx;HubbvCs9R)w7_sDDChp8b=_IELBvong0nx+s$ zEUe&(*ooynVWW(%tKp=DkKvhyK(infF4&GAXc1>xBb>+)->(%n=yXbhxg>|I{aXC1 z?yz>+#f;RKc$a@S?-<>}jyUQ6+KP1=k#+K}A;Ekdy38?iXqjefx1SpGt*^VSJ@E8V zzOZn%ZKd$ZC~&z}VN^!r^Wd<8#w>)&&15O@`LAAvfl96`XHqK)eNCQ0I&9#37bxjq zq!3EC9?n`Yoej5AuUxt<=Za<$ z^W_5wuC9{Mi4Gn)-u|yIJkURD2y;d1#Td3-3 z^_cXW3|qYlXKN*$axUXa4TcO%W*mI+`F7QjhgkhBO2Gs5hTgLmi!tx(HOnH z_0yPSu75ZgjEo_7?r`8>-t$BmFUQ>zATm%+T@j@Puk*PLp< z@#$};W!i&+nZGL4Vo=NHdHVa>hN4fLiAsI>V^;Ul@MTZg2r~|O3|reOn`UidE3Pa# z;WYFG(8F!B&QmdPLs!qAAANI*oA-)%*m~WLjqPWDl~I94^JjxWDGwAsG#wxZ)5_MHo;eVpiQ>}InoNNC?!o;X^fwA z2U#i9Uqu=(eC~t_U?v`BfJ*E@0i6*h+`%n1H`>;w7u2qF12$rOKbLYH@2fZg@u|PO zKNfL(RVFGHI>gAxido+|mW{Np$*4{d$Ulr4XG;_sr?6i5oDxnzN@ zZfvw)k>~QKqhkowifUuygJ?#6j= zB3hwMzD7=3&G=S+MP67W??b{0)x7PwOIY1ava`3c9LU&!nm+#px635n)J2TtVpKsa zylBvkRreKd+-h0}>&Zz^Sce#}A!KY7Y&Z`?2CCESWi4=lEdds=9lsO8T{}cU7jeQU zSmGDo!AqzhXgHmMmMIS-`|}1jq`!s-k**s5_kUg=B3|oE(*8l5Nr8qHAdxR<+{T#c z!$0wce4ojw@od_^;!IWhX9f(1GQ<9=$LN~Obf6lYl&&fc`52mu+JbWoTMp!llxLXD zJIme`CwWEu`9lZWJ8s%dOZ3`y<<2Xzt7#b=-G2}#Qb@(K;?rn3HqfQp-0uJ0v+a)= z7wu;ihWTboH6;Lnj>E<5?{Gl zas^THr1xCTTc?TQG%}yGQ4C6)0;mGo5d}}Qz;j$d8r9>x>H!=hs_w=aP8UxY0J#o1 zR$#$fD^sKztS1W8F1EpOrka4*j5E0k!YBK2CcZiJ>90NzmZE)N zh_p=CU)6qzmTBYJlXUak1A;}aI+J@C_->9Z6NON{BvGfubwSVIu*)*E1nK1|g`wib zfN&5C+jEaizNZJE49McPS<03rPfV1!0n8C*A(j27?!31B)LZHe*LpKq4&u#PujH4> zFLNZHCarjfiVbcaV+qnHzVdLsTDXnL4=0T({~Q^IKrSH^12=z-tW0DmFGpf*TL{uLaWVbCk8)t!vIP9Wewc@YoCwgoyx7w$B#hMzro zti5pXATJ1>Z2!@Zyt=*X^*2VU?6&}+RLTn{3YTKGF6pYG8hY}!Ei-Y?va0(NU;a)z zwP9<%Sm?rJSFmq!a)CVLgeo*26U<8?b_MOt8R>@Q5$EAcXD$c48Q^ zp(9KOtNVVgxJn%1B_D+kxxkkZYRt5;&-my}SF{6r_qLCG?!oqFv`lsdSDgtf^vuwR z!;mY2T=Hf(L`moFM841TOMF_=mdRHz(#<2@nm;?1TA-(~=O8SduA!I8o}O6o1M-sB zuEUJ1!vY;%!-;UDv_d#In>U{26^N5OAA0)v7u#$0ZfQTq^!6R@h{{;$tSzXAHeTaI z6}=w0x;@n=M>&zNX8gZ@@eq5{HCCzDRJUW>e07i4%FV+#QFQA0)4c(TP^wlbp`L79 zO7yq~cXZFhF;$pBGA=+2-13)%;Bo?VvDQw>D}w|rs}6F+XZ8b(&?jE2FJ?q6P)X8| zgrP7U)=(-s(T#K_%P-VMjBhfK2<2JuF2Y7tGB|>TK(5pw zLFJSt+UNA{kC#MRrq({n*Uy#t$A9Rxai-;LUH~Qj3XXtli%3!e+A`h7a-v^;-|O2) z`GWWnS|&C};;30W#Zjizf2nQ7?m`NtL00Y)`SPdO3NQ-2U7_Rzq9w0z3SUgLMRGip z2?bh9pAQ*+|7-WRA7cMHmkYTuWaT2Xq_KY|d6dEy=fIV_+KpH5YWIBasdk(i zek)y;kzW=9;goxDp7gAgm}#OpfO?v^_~3L@GSs6?zxJ08-L%mc5_O<@hv)=fj6ceR z!l6uU|1>Y;-SwJlBS%(nOH4W;!|8%!#36gn%Oyzk81d#^!nJC_D(6$*_-^~+_YS6) zu!(W(7A6?7jxNu$#^ge`Pbvhp_2@=GwqdoRt=m^jB$H?I0~LCB7``f)PA4S6wDBM; z6(=|jzW8k0bLcyHjUPK0T?!W)vA74x3g5$vV600EIuA~x;3XL|}cgo<%!T?8`!%5H_C?C@v0-Mq{)AorWI zmBFFxX1eIKv47utZrRt~&dYc^w{2#3VOlHcTPyW$TtCn37$XI76n-)|PkRAWm=IP9 zZzU2wAy!Y*|aiOk&DGPySI7vFnF`^cZ&$3t5N*uum%jtMJ#o^IzR?TkaIBQKv6DPSX$ekS>} zL}hCM(i(DA_L`NWHF80!yPh)sIl-jDVK%|PZpWtfH|}~>b7TCi6l_;!Xy>BgwT`Oj z=KB$U@#|Ux0EMvSL})^#pc8%Z+uv`0`oOc*60zRT*Wt^F=ws^`Du{L|_?@*e28m5$ zWrYztq+AedS&2n@tK9DkhBPZ~Dwfbe4tEI}^m+;F^oU0U?HXPLJyQ3IkY8tR0>N3( zP%Kds47&n~aKY<^Axaj(h(6tyV0xGWgn`ZkX!S+8PR;;q2~eB}3s-$uWrfCoB`sTm z85g>0*p~uDL@;3&_!6trlyPa3a|Mm$-)V6&71X(C?&HgWXL;8Ky|lwt3cb(1Tt-CGsbgCJ9oN;? zXvmB#>2^;d7$G_>P+B1!$L?Is$~ndDj;F^?oZ##38{3cFd7!=S=KXCCU;1!L+X)2= zd-9|dt#If^@rl#L1ITxgqsFS0mTjHU<8$A7wEf9_&$fMg_vG20pY?PNov)2s!Bq<@ zj%CNZ?))ha)uNEp!x@68xEU0qR2dONlcjYw4H(r*DsYySDr=TBdq&s_fRwM;K^Fa< zSP%B8@)9asyfG}HL9ojZK?*4axgaM4#~DB^gOfNIK~t9fzj*XaDS=Cgs+CMuhHez( z5YH&}jWSVuH4MT^8YKjt7yuk~kp_WI#|$7!xkxLRN-sFgB@S>FQnn+e|C^nN*lxVB zA8q?h7E3zTc< zJbIQBZT2GoS<1z;B3q1TWZA@_v{UYt0Q!)(hsl5DA1p_$vmMtAKxpDth z?H{q#*YADl0rs(ezFp1InC*-i&YfYru!VPq7%%vW$XE|p>%|aAWjV?LP|VhcpDPrO z^PK9~iIcqQ(Ao`GUeVtC`Wy1j&|X>~9ZtT=&SCYe)$zyn$dj<7bz`e%WlkQMPXhIW)!)N76{B#~M0RGu1%s=tRACpE{0kmfnUg->ORt3W zDj9_+9AP_hgrD)kC$L=(rR6^ag3@t~f~aIhV7d>HE5*AI>&t-$_Uvpw z|Ko3JU%Bu5?KAg3*`8t}${p+{zMUNZt(=OOvCraunHGTco=WlLxk~wited8sfaj<0 zeyn}vG4@+vCH|(qMcB&3g2qjAYunJvN|&^pLi!Mt^e8Xfr(*1INhCbVD8bk$r6j0T zUJ9;k&pGhIRyi5G<;T%41~Z~I1N}u93-)N0B6JZmIf7{f<2kEDj^K({891&zaTV4( z|5LERv4&W@iXOVd7|;tR*u-Gr1Mc8Msxl=F7;B8&C!^P;ef-7t+|ifXGp8Lq^C-E`cEy3nKgV&7;kIwt*mm=~@ygog@8$!0 zST)U;{AhiY>$GE_ym&W+(32Kk*DACQHm7{dFbQk_gBr`*U<;Xt#50vKiqmH<}NX(f^p z@Dg-^7r}Ecn-almSSWZ%$)jjWZ&EmMT^uD)4w;6p5!^;TBMg@eBQU3lS3DpjAEC=Cf^t^>#L0jjfa9LlYJPS-2DE#le!+{c(YDs9|Fk8yL!>%{Pq5UUB=aOS9B zmA^bb;JKI5e(j;B+NbV&nrB1X+TLA#uLWAqZ0LytInm{eUNnP!<=aAzu0~gNScj|S zl*E)3;VVC@>=u$mC|Mi1sthQri&uCPYT>*{ok)Mc6)Cz;KFG6C^%_8RxO&b#lrwHh&C zZOkgG0DOhVWW$&tr^>_7Dg6x!mxquG`iQhR!0mQhL|!IXyex?szD_P9tp?$ckKDDy|F7tAwk6w{3KjTbJ8- z;(&+@H6)2>fk^8^dgV)9<0$bQX-I%yV7L$-t(pk(q{lu0qjH~ zLS!t)(P+U(0+YNNC^ubNm94~>&xfFSwEbxpqZuAC29UBUg- z3rE|Z@P&xS51(mQ@xGUzmDy-_&V3froumCuZ6ghS=x0coC7U9L>=joa>asSzO6vp# zpfIKM>R3slCX!akz!i37bCsV0Dj5vN8M%rkx<`gO5MdHZB&uL3@LMf_M1ds>8J1$g zNI)u~63MJ+IL5?~9l~F3=x|Uk$Fy$?`6|VR# zjD>6=@8Q+(&)olXJDKs28ZudGc=Sa3;(brFyPrD3w~BVOy}lZrZX8`XY*p_P`7qfEsheFI+{xc#aL-Nd z);L#qnva@wE+>;+JAopLjKD4PaJ9Qu3=4*HMBp@dBuW}kD4;1Tl@v!Rq33fcG8u`4 z8Y@{#NXA*Ks*QDu6=7hSxD>!rOgh#~&cJk5;HbQ`%2*cI#6-Xl<=#RYv8&+sdoEF= zK&4P)qRjA^7|L7-UV3FX$pPi0RSHc~bPdblqQCJ1B5&l&eW461lru37Vj^M#6A)Tg zl5FkP_VM%kOfG?W$L-e^Pvz4VvK{n+`$3Mm!2clF>%~FPwMWD+9imHYjsvmM!lHiv z<1ggF@u5?!oM&p=898_R+3cjkMyI#u@z6A*2VQ^2HnvHgXe0vGe@sep)V(3?TzONm z1#j3gqih&g`wpBQwV*)KDx7Jsa%ElR5m)mlc|Xon6d68*ll1GD#zpt)*v2>&;+T99{%9{l`E2#W*&_S=rd9Usi zbatPwE*mHym_FzPC`u9!4O_~3WeVO95Kh~UzU^f22rfO24wDQCPdSu)LnetBD}M_^ z##D&!%U-rhLi=joK3b-K!$$PaKk;aL|2yB*wr$$Y`#$QfE}e$_e!yeW`v=5-#b{mb zD4^KX8spW67Y-k5fBDce?Hfdd4pZVSi-^e&t2-1=4etENRKpim-Sm+@->i1T@<@z?ML| zP}Iym)gQ-*4}7@D7zIGh8yDbNOJ`}nEm!DB69C5(xmV~;F>HHxi$u+tL<^VQLasUi zW>21pCqMbmUA&pkDB#1Sp$FY^NOh90MEK=KU5OkuSHi*=RcRe86-)Uz)P)XDjJj*;M6UeEbvb#KEW9-~WYQWB|@biSvLJJelyTacc2@rRTqHXNpW~ zg@~>tYm%_TrrwQnBm27_eTq-JJll@49?`G=r4{O9A!p^rGA6rnHZif8*28ul{Zcou z(Lq;YwG+UrvGZNb7;|zDf#nRWXL27`43^8H>#2~;}^v~f{SvVE_fkLkWQi zj<~{yi-1+}gpVApqojL|R%&B=!!=j6|LkA>R`a#~pLom7>;t};72d8^kfxy3U504x z|NlB&;6$+pI+_WwSk&TGcs}oftPel^V*BC)Pqjx6oyvDx_w8mZ#X%08a7xpiFgC1UyU+PSB@oI@u~{Av=|f+1afs(IoZo!GPK8#EJRTu z1kT8}L2a`%ijJTao(h)Y6yU3kWXeUi{X`*EcO2`47E2lzAVFakd z_JR#i(bqvp>xPd5nL+^^@k@CNZ15saP9 zO(+0wD^$AK5_LVHmX%JR+%XT`Pe%I<}F9@gN8iL1PFLOqzwM)&eO0&oZXk zq&CTbm!YV(qTb3) zKsa6c5M0`8(IyOZNg3;Kmw{ZMkfR~EN?G$HUYcEYkz9YDTMN1n{-q!h9#>(iu!8|u z3@^9^KAvEFFr!gMH+ayJY3TPVBchooFX`A~(Qljzwz80Hn*4I{KB89~XXwMz#K20g zcjG46lT@=TIHa?OF5MY|l}y5Dw61TQp?J#J8JZd&K|f9^erKACGJqfX!0XPhGdXEP ziOTq3O!vC3>{?zI_&x*kfB8q>Y=8T$H??=Z{$@U4TyLZ1B|&A3)}>SIJ@J(3U-5{n zMO)ixfpH|y`;D`WK2&uj`S+iDseOx2Tz=yT9cWYA!xtcS(*n7O(fqA+@rrYB zB^rEm)s`-Ou~yfawovfSQG@TLyLXZe7eDc}$0(rBxA(vK)$NX(4`gdz-yd>?cCk`I z4<+-`uelj%xtUK!N0EN*DW%gAf1p&Hq-{ZT9%teX^Lg(=(CeCi0PL#J;!ObL9NP6OjJnAwZb>n&bMp`C-5<6nJN@fMWr}g+LnZT6) zgerFzbR+`IM)JfdZjaz{$|f?FwT|a?P)Obj9$>MgWBPoQBT>5Y7l$E~0yPSxc*I#C zgc2KuHSy5(BR%;`qPPL#>L)dvc&Gv~!_MqWvIt6KHNUe0M3k^rR5m3gzn3b+pcjq_ z6(?;t!c&>b6pA#c=Gl@4OCdKfufrS8?>fBI6%R#UD$ykZ%w0TTl{9Gb9`rSKpP(^d z0kZ&Z-lC)M*+_U_gJV5*&bDZ3%#(+BxB>=Q4x2cA0AzIX5h?+#tTHo?2wZuZ~K#*DT+ zI8Q$6)tC7A94&=HyXIeudklGVGsTS9akWs*YF4aPoe^fpiP9o@z|Ax|ltNqtwNk5m zbjS`^Qpawc*eE+u3}Tuz>0UeW`F*4z6xZr9l>~91I71RraHTW~YS9t7gc`GP<#A<- zPzqB{Rm!SBN=GdaSQs_VJ@L6$k-@8vNqQ8pC4=dqqK8XfS{+AH=gv^e@7}_T zcBk6i&m3>}Jb7=s{lL!l_S>$@Yvyho=@;>`>rdpU0=Md1(bUuGp}sLF(dva9KDhRp zu<{W0E!C%Jd7ftcbMF%e+xHJ1Ye)FB(KcG1{a0O;U3^> z@R%-iib7y5sPZ-yCh0bYII+E?CoS?6|2R^D9bO7%IJA{_(!FkQ7!oW8^6o85ID#;6 z>Ynr{3ZQb4D2Zx?#V1}98swKxP6B7EluaIu13}xKJIlC&g1Mj8$z4vrcj#pM))yXb z2X<_3uYc8^b|Y`K-g4d5>?Fh{iNJ4V1%X$m*5xaGuWOIcS19>JHr|Nk`PJz&^ivCNbqk?519cK zRIlM#RLemqXr+azb^=l`LLny#D9FPJ;$WeuE`y$!(k$8RBiky)NWdhs0GJ#xB6&A7 zAWb-AOPsjMM1_;b#*6NtoRa0C4*?ItQumivF^mYUnjSvq_F8nS{JO#(rp)*3VxI*b zbbjfv!)*gw_HN(uSliFHhiZJHqZkELlIzq>!&U?ApGoT^r}2g~6$H>}rK{oO1q6I*)x-XC_nI zbhY58W+^!4z2T^8D0iwl9hz-AEGW6}wa%1Kfr1rzi8O#NjF-=hvw*9@HKd7n_Td+z%kHi99o(%v@O7VZR~jh4aoP|m)(Vx_LB!LT8kajq_0 znI;w@t{>he%KRwXkEAI+fo`BhVo@smbeD$_CzuhKAd93ZDxafYa~W|0^yHPxYNWbd z{vdsTq`=@vDSO0*KLY24x6!p(6v%1CLkeNaYPCAl#M%Fwk`nkzYvLU5 zq^lBnI!~#@6XY3`!XYgFaAM`ER!Q!*$ac5D!G7+1%AE*_6VHRYw5Zv9Qix| z89M>*K6G3*vZQD;;ceT`w_Vat!SXFxUM~mWIKQK(Y#Gs71oX4Q$;Xq~_+;mH#$j;~ zS`=HCv?@-1=sdQF{D_;vbmIn`c1tFuGC~0jl1t@9*#ds%4{7Q*4)eg6q5Fuh>kQ|8 z-L1yiO-_%bBQ9x|AQ!{xz_Xx5e3kS7>erI9OH16vLV^w=rrT&t8rmWaq!Ke3p#mc5 zB)zLATorgyq$iP{Y1u2l%pWjbA#1wM5dIiC;EI#NCXdmAg&g-Ki)BkeDMIB;;#hdB z6;0zO{T@YxwCYI5ubu(}Tl9hga}`%FX=nn&_Q)I#j#<2vQ3_2kkrNSyC;%DDMZLUA zPg)(WXd9;{6zs^$Rd@mGzxZ;W!mF*jjqO57H<=VzS_=hASbIRn7OQ}=DAqW|a@e9# zA|j_;qXl6d!#I?YNA`12M}Dy>*L2@>rYTN>{6cFEN0^c%)CqR|if8c+n$nt_L+%$l zmM|kdrqV9SjEY@_gVr#D$(_y2%_!|Pr`64R&Qh6WRUcU?|B%7lEs&WblMONxq`*>0 zEa-M;h)=-{UAsxv-XYVe7xB5vCN2Mg83K4O-^6nr{J4*B@*pz84xA!Gd?J!G zG3j>_yfNd8%{J)#G2wj=$bO*%5d~-cOgh^MynWwzXyYqVIOrp(h{_nEPxND5catTb7Bp}->SMQ}DR=Q;#J-HE+a91r2up5@suq+t`Q4&* zP}x3f3~ zLD~h34Zu8H5vg)wpm&*J-bF@d+dzV23#qRnqJvIZ2(Ymp9&!&)0DBcvmwQbX6BF3A zsdMo7W>M5;#4419*Q*b)T6YA*7b}7NYDBaPrbk;x$H|Zw$QLoe#I*{Y77m62ly1g8 zwR(>2C48ulo@KQ*x8Sk*3pA zmuT9lUvf;+_C6hK&fMChD$ihxijJ9n=fyrlv=dTy9M%q9l_0V0qqj3OkIZTW&drS# zJP_Id>OVDQl<*rfb@`JEW^C$wEns!_4J=045A`!itl3d6ZFS z`Z8q!b}>@S?9W@TCL!GCG%T*$)rIFeZS#>3rT`lQ4~{Bj{Np-JJG-Is?nhaO!d|t`Oz^8z?Ar^N4z;&>?ki^!-bsZisOa?!ppz&1u4rzqvMZr`N11Y z?ZCagm~x{%IdI{Tr!!WGd;5(mcf;vPg3z+tyDZvzkHjE)BFQ(%j1QUO(Z#4lM%G0@ zZivP12WPnr@z_w=Y__?SjqgiG?4P&rZP24S^Dgb>uZq@P^4fMNeqj-A&qSDCe!N0F~F|na>*NolOsBB@#44U*MQm1;lx2q_!JpA zvC@J+F(P+@D@E>K8MFgIGuS+e1=AfoIwP1q%U~{wlQS4vmwoMwLoR7F)vEA-DsL2x zq4`szC6Vw)PHKyUhkMEeEn+w2l7_b~x^fsBU$nmMACaMcY;yoI|n^A)}TD3giN)cF-_d*_cdw@eK6X#dZg)G&qEd!<3+pk8urg zWPuzV?TS-Mv$0+BLM}ONxc4yxayx;eV`AM;4p}wA)>pKtE+;jb+ooi)7n7M=U*ynR zLqn~-vp`eZ`n4k&AzhX;M>)}>_~K#$M?X@$xtLD8_0O2-zovMMqGO|5`vXE$;=m3c zEUM+e?JL*$;WV*Mke zkYtART1mPyf0K+(K4=-t1QR?Zn`a5_8|FzUI(B;;dSIdxMo$EdA3G-M$naNa7MnLG8fb$rZ96~r)I-3e>8n+orFbGsl2A5TT;{Y(#ryV@42=K3 zA-MgJDJH&jtm)VjmiCkkG=tnVUPO-Z#~Y^~{U`Q)r9>T93!YdL$z@hPc=4UR`~|dr zQdpnCk^^7;N?-X@29txQ>XLISPU&l6bSrWe z6E6-A# z6sh8en8-f9kP%b<3c%QU{7?^?os#i>kcd;%II9d_@P&@@b!T36ByU^kYo6E7a3@B`lcAQ{YwD z*vL~mdE|zdNdl&WRUKlc)9Qr5Fco65rT@lt(}5h$+SCkRwF8^K^uxATMA_*Z+whMH zL1tNV07CiNtw~W)GRfF49FwzxBXrV^sd4C&Gfg%b!o!KcR~2Ktd2%ty2dWEp#}C_n zgs8raB5~3!?3))t!E<~$md$nhRNeLfnU9$#npuyz!NXMa2=sw3PDJ%PZZIK^2sf6^ z|GliPY`R!GY(ubph!~CjquFLlVi?Es1LSU{i%8TfN8B;Y5k68 zw2+QQUpUGm{YTCm^rS2WIgLzsZH!Mx(a`DGmNV9o`#OOAfuI_5PMx`(Kdk)U-@eJ0 z4=(aUzf8h27=c)4f{@^7EzNFp-s*s908E_P-gKBmf3U+D;mBJWPVDpXNe8rCxXUEM zbMSn)v@whgF)16aiR1EzJ-UsZI#gXqejw9$3{qe13u~Z0o7>oB?}u9_2i!_!XM2cY z<3W)+nf@wYjd;fw;P_5YzDxA+XTJR!YxIG$&%ad4N9kEeT{uiM{<7Z|%bAc&q8SSRs3XJt6b33ewpmfBz^;HIMu6Q%2AbTgT1Cqb%>L%xX@yJ6@=57bYwr(FM9 z&te3vjU-ctOL+(7SHJ$v%lH5M$IB1@`tIeszyCG=Y4yiw^Xw}&E+(;wv%@reaK#gt ztmeiQ1a|`{@|UGUC~58@WDHnXk>$jQcj{;(IBh&3r9b8g4ltC=w8+iBc1o)a1P{fH zT;Hw3@-R~`Ahm4KGZUXSVpKQEPVi^Yv{y--%eAGQrNJ^F6I4@ArP8dH2{!P;B*nx7pc4$%Eg+MMb7&&xw@w*2UwFVqUug%^!5wB35_Kj`b3?iB&`YNEm|Net zjzYhSWx^15wuzapvI0^sJ6a~YMDVf>0MMblyI1>cM~X_DuiX<1S)gP;)^*bK`K^d zm>T?^RE8ELxA@r>tJO5Nuk}q@(e&z>WxF9r^6scd>)A*JYzwz#`tDqQ4oW1 z^eTc0Sz#NLb8wBhrQ7G^i#X_YHHH-Hk}p>N>5qSS`S9Vx%l`nMy4150000< KMNUMnLSTY%89Ltp diff --git a/layers/+window-management/eyebrowse/packages.el b/layers/+window-management/eyebrowse/packages.el deleted file mode 100644 index 1c833cb6c..000000000 --- a/layers/+window-management/eyebrowse/packages.el +++ /dev/null @@ -1,138 +0,0 @@ -;;; packages.el --- Eyebrowse Layer packages File for Spacemacs -;; -;; Copyright (c) 2012-2016 Sylvain Benner & Contributors -;; -;; Author: Sylvain Benner -;; URL: https://github.com/syl20bnr/spacemacs -;; -;; This file is not part of GNU Emacs. -;; -;;; License: GPLv3 - -(setq eyebrowse-packages '(eyebrowse)) - -(defun eyebrowse/init-eyebrowse () - (use-package eyebrowse - :init - (progn - (setq eyebrowse-new-workspace #'spacemacs/home-delete-other-windows - eyebrowse-wrap-around t) - (eyebrowse-mode) - - ;; vim-style tab switching - (define-key evil-motion-state-map "gt" 'eyebrowse-next-window-config) - (define-key evil-motion-state-map "gT" 'eyebrowse-prev-window-config) - - (spacemacs/set-leader-keys "bW" 'spacemacs/goto-buffer-workspace) - - (defun spacemacs/find-workspace (buffer) - "Find Eyebrowse workspace containing BUFFER. -If several workspaces contain BUFFER, return the first one. Workspaces are -ordered by slot number. -If no workspace contains -BUFFER, return nil." - ;; the second element of a workspace is its window-state object - (--find (memq buffer (spacemacs/window-state-get-buffers (cadr it))) - (eyebrowse--get 'window-configs))) - - (defun spacemacs/display-in-workspace (buffer alist) - "Display BUFFER's workspace. -Return BUFFER's window, if exists, otherwise nil. -If BUFFER is already visible in current workspace, just return its window -without switching workspaces." - (or (get-buffer-window buffer) - (-when-let (workspace (spacemacs/find-workspace buffer)) - (eyebrowse-switch-to-window-config (car workspace)) - (get-buffer-window buffer)))) - - (defun spacemacs/goto-buffer-workspace (buffer) - "Switch to BUFFER's window in BUFFER's workspace. -If BUFFER isn't displayed in any workspace, display it in the current -workspace, preferably in the current window." - (interactive "B") - (pop-to-buffer buffer '((;; reuse buffer window from some workspace - spacemacs/display-in-workspace - ;; fallback to display in current window - display-buffer-same-window) - (inhibit-same-window . nil)))) - - (defun spacemacs/workspaces-ts-rename () - "Rename a workspace and get back to transient-state." - (interactive) - (eyebrowse-rename-window-config (eyebrowse--get 'current-slot) nil) - (spacemacs/workspaces-transient-state/body)) - - (spacemacs|transient-state-format-hint workspaces - spacemacs--workspaces-ts-full-hint - "\n\n - Go to^^^^^^ Remove/Rename...^^ ---^-^--^^^^----------------------- --^-^--------------------------- - [_0_,_9_]^^ nth/new workspace [_d_] close current workspace - [_C-0_,_C-9_]^^ nth/new workspace [_R_] rename current workspace - [_n_/_C-l_]^^ next workspace - [_N_/_p_/_C-h_] prev workspace - [__]^^^^ last workspace\n") - - (spacemacs|define-transient-state workspaces - :title "Workspaces Transient State" - :hint-is-doc t - :dynamic-hint (spacemacs//workspaces-ts-hint) - :bindings - ("0" eyebrowse-switch-to-window-config-0 :exit t) - ("1" eyebrowse-switch-to-window-config-1 :exit t) - ("2" eyebrowse-switch-to-window-config-2 :exit t) - ("3" eyebrowse-switch-to-window-config-3 :exit t) - ("4" eyebrowse-switch-to-window-config-4 :exit t) - ("5" eyebrowse-switch-to-window-config-5 :exit t) - ("6" eyebrowse-switch-to-window-config-6 :exit t) - ("7" eyebrowse-switch-to-window-config-7 :exit t) - ("8" eyebrowse-switch-to-window-config-8 :exit t) - ("9" eyebrowse-switch-to-window-config-9 :exit t) - ("C-0" eyebrowse-switch-to-window-config-0) - ("C-1" eyebrowse-switch-to-window-config-1) - ("C-2" eyebrowse-switch-to-window-config-2) - ("C-3" eyebrowse-switch-to-window-config-3) - ("C-4" eyebrowse-switch-to-window-config-4) - ("C-5" eyebrowse-switch-to-window-config-5) - ("C-6" eyebrowse-switch-to-window-config-6) - ("C-7" eyebrowse-switch-to-window-config-7) - ("C-8" eyebrowse-switch-to-window-config-8) - ("C-9" eyebrowse-switch-to-window-config-9) - ("" eyebrowse-last-window-config) - ("C-h" eyebrowse-prev-window-config) - ("C-i" eyebrowse-last-window-config) - ("C-l" eyebrowse-next-window-config) - ("d" eyebrowse-close-window-config) - ("h" eyebrowse-prev-window-config) - ("l" eyebrowse-next-window-config) - ("n" eyebrowse-next-window-config) - ("N" eyebrowse-prev-window-config) - ("p" eyebrowse-prev-window-config) - ("R" spacemacs/workspaces-ts-rename :exit t) - ("w" eyebrowse-switch-to-window-config :exit t)) - - (defun spacemacs//workspace-format-name (workspace) - "Return a porpertized string given a WORKSPACE name." - (let* ((current (eq (eyebrowse--get 'current-slot) (car workspace))) - (name (nth 2 workspace)) - (number (car workspace)) - (caption (if (< 0 (length name)) - (concat (int-to-string number) ":" name) - (int-to-string number)))) - (if current - (propertize (concat "[" caption "]") 'face 'warning) - caption))) - - (defun spacemacs//workspaces-ts-hint () - "Return a one liner string containing all the workspace names." - (concat - " " - (mapconcat 'spacemacs//workspace-format-name - (eyebrowse--get 'window-configs) " | ") - (when eyebrowse-display-help spacemacs--workspaces-ts-full-hint))) - - ;; The layouts layer defines this keybinding inside a transient-state - ;; thus this is only needed if that layer is not used - (unless (configuration-layer/layer-usedp 'spacemacs-layouts) - (spacemacs/set-leader-keys - "lw" 'spacemacs/workspaces-transient-state/body))))) diff --git a/layers/+window-management/spacemacs-layouts/README.org b/layers/+window-management/spacemacs-layouts/README.org deleted file mode 100644 index 25864557a..000000000 --- a/layers/+window-management/spacemacs-layouts/README.org +++ /dev/null @@ -1,144 +0,0 @@ -#+TITLE: Spacemacs Layouts layer -#+HTML_HEAD_EXTRA: - -* Table of Contents :TOC_4_org:noexport: - - [[Description][Description]] - - [[Install][Install]] - - [[Layer][Layer]] - - [[Features][Features]] - - [[Transient-states][Transient-states]] - - [[Layouts Transient State][Layouts Transient State]] - - [[Project Layouts][Project Layouts]] - - [[Custom Layouts Transient State][Custom Layouts Transient State]] - - [[Usage][Usage]] - - [[Save/Load layouts into a file][Save/Load layouts into a file]] - - [[Custom Layout Macro][Custom Layout Macro]] - - [[Predefined custom layouts][Predefined custom layouts]] - - [[Org-agenda custom layout][Org-agenda custom layout]] - - [[RCIRC/ERC custom layout][RCIRC/ERC custom layout]] - -* Description -This contribution layer adds layouts support to Spacemacs thanks to =persp-mode=. -Layouts are window configurations that have buffer isolation between each other. - -* Install -** Layer -This layer is automatically included if you use the =spacemacs= distribution. - -If you use =spacemacs-base= distribution then to use this configuration layer, -add it to your =~/.spacemacs=. You will need to add =spacemacs-layout= to the -existing =dotspacemacs-configuration-layers= list in this file. - -* Features - -** Transient-states -*** Layouts Transient State -The layouts transient-state is initiated with ~SPC l~. - -| Key Binding | Description | -|-------------------+------------------------------------------------------------| -| ~?~ | toggle the documentation | -| ~[1..9, 0]~ | switch to nth layout | -| ~[C-1..C-9, C-0]~ | switch to nth layout and keep the transient state active | -| ~~ | switch to the latest layout | -| ~a~ | add a buffer to the current layout | -| ~A~ | add all the buffers from another layout in the current one | -| ~b~ | select a buffer in the current layout | -| ~d~ | delete the current layout and keep its buffers | -| ~D~ | delete the other layouts and keep their buffers | -| ~h~ | go to default layout | -| ~C-h~ | previous layout in list | -| ~l~ | select/create a layout with helm | -| ~L~ | load layouts from file | -| ~C-l~ | next layout in list | -| ~n~ | next layout in list | -| ~N~ | previous layout in list | -| ~o~ | open a custom layout | -| ~p~ | previous layout in list | -| ~r~ | remove current buffer from layout | -| ~R~ | rename current layout | -| ~s~ | save layouts | -| ~t~ | display a buffer without adding it to the current layout | -| ~w~ | workspaces transient-state (needs eyebrowse layer enabled) | -| ~x~ | kill current layout with its buffers | -| ~X~ | kill other layouts with their buffers | - -*** Project Layouts -To create a layout for a specific project use ~SPC p l~. - -*** Custom Layouts Transient State -The layouts transient-state is initiated with ~SPC l o~. - -Example of default custom layouts that are configured in the corresponding -layers: -| Key Binding | Description | -|-------------+-------------------------------------------------------------------------------------------| -| ~e~ | Emacs custom perspective | -| ~E~ | ERC custom perspective (needs the erc layer enabled - configurable, check ERC docs) | -| ~i~ | RCIRC custom perspective (needs the rcirc layer enabled - configurable, check RCIRC docs) | -| ~o~ | Org custom perspective | - -**Note:** You can add more custom perspectives by using the -~spacemacs|define-custom-layout~ macro explained further below. - -* Usage -At the beginning there is only one layout called =Default= which contains -all the buffers. - -If you keep working within this layout then Emacs behaves as if layouts -don't exist so you are never forced to use them even if they are available. - -They are two types of layouts: -- regular layouts which you can create dynamically or which can be bound to - a projectile project (press ~SPC l~ to access them) -- custom layouts which are defined with the macro - =spacemacs|define-custome-layout= and always active (press ~SPC l o~ to - access them). - -** Save/Load layouts into a file -With ~SPC l s~ and ~SPC l L~ you can save and load perspectives to a file. This -is available without configuration, support is great for emacs 24.4, but -depends on =workgroups.el= for Emacs <= 24.3. - -** Custom Layout Macro -If you want to add a new custom layouts (for example if you want to have -IRC on its own perspective or maybe calendar or gnus) you have to use -the macro =spacemacs|define-custom-layout= as follows: - -#+BEGIN_SRC emacs-lisp - (spacemacs|define-custom-layout "" - :binding "" - :body - (...) - ;; (stuff to be done in the persp activating) - ;; (a major mode like twittering-mode or whatever) - (...)) -#+END_SRC - -Other example: - -#+BEGIN_SRC emacs-lisp - (spacemacs|define-custom-layout "c++" - :binding "+" - :body - (find-file "~/path/to/first/file.cpp") - (split-window-right) - (find-file "~/path/to/second/file.cpp") - ;; (... do more stuff but be careful not to destroy the universe ...) - ) -#+END_SRC - -Then you can access this persp with ~SPC l o +~, where ~+~ is the binding. - -** Predefined custom layouts -*** Org-agenda custom layout -Here we define a custom layout that adds items to your org-agenda. If you -do not know what that is check the [[https://www.gnu.org/software/emacs/manual/html_node/org/Agenda-commands.html][docs]]. - -The cool part is that you can have many org files with todos in the agenda and -with one simple command you can gather all the todos from all the agenda files -you have and show them in a single buffer. (in evil the command starts with ~;a~) - -*** RCIRC/ERC custom layout -Now you can also open IRC in a new layout to keep all the chat buffers in -one layout isolated from your work buffers. diff --git a/layers/+window-management/spacemacs-layouts/funcs.el b/layers/+window-management/spacemacs-layouts/funcs.el deleted file mode 100644 index 59436e5f6..000000000 --- a/layers/+window-management/spacemacs-layouts/funcs.el +++ /dev/null @@ -1,187 +0,0 @@ -;;; funcs.el --- Spacemacs Layouts Layer functions File -;; -;; Copyright (c) 2012-2016 Sylvain Benner & Contributors -;; -;; Author: Sylvain Benner -;; URL: https://github.com/syl20bnr/spacemacs -;; -;; This file is not part of GNU Emacs. -;; -;;; License: GPLv3 - -(defun spacemacs//current-layout-name () - "Get name of the current perspective." - (safe-persp-name (get-frame-persp))) - -;; Helm related functions -------------------------------------------------- - -(defun spacemacs/persp-helm-mini () - "As `helm-mini' but restricts visible buffers by perspective." - (interactive) - (with-persp-buffer-list () - (helm-mini))) - -(defun spacemacs//helm-perspectives-source () - (helm-build-in-buffer-source - (concat "Current Perspective: " (spacemacs//current-layout-name)) - :data (persp-names) - :fuzzy-match t - :action - '(("Switch to perspective" . persp-switch) - ("Close perspective(s)" . (lambda (candidate) - (mapcar - 'persp-kill-without-buffers - (helm-marked-candidates)))) - ("Kill perspective(s)" . (lambda (candidate) - (mapcar 'persp-kill - (helm-marked-candidates))))))) -(defun spacemacs/helm-perspectives () - "Control Panel for perspectives. Has many actions. -If match is found -f1: (default) Select perspective -f2: Close Perspective(s) <- mark with C-SPC to close more than one-window -f3: Kill Perspective(s) - -If match is not found - Creates perspective - -Closing doesn't kill buffers inside the perspective while killing -perspectives does." - (interactive) - (helm - :buffer "*Helm Perspectives*" - :sources - `(,(spacemacs//helm-perspectives-source) - ,(helm-build-dummy-source "Create new perspective" - :requires-pattern t - :action - '(("Create new perspective" . - (lambda (name) - (let ((persp-reset-windows-on-nil-window-conf t)) - (persp-switch name) - (unless (member name (persp-names-current-frame-fast-ordered)) - (spacemacs/home)))))))))) - -;; ability to use helm find files but also adds to current perspective -(defun spacemacs/helm-persp-close () - "Kills perspectives without killing the buffers" - (interactive) - (helm - :buffer "*Helm Kill Perspectives (without killing buffers)*" - :sources - (helm-build-in-buffer-source - (concat "Current Perspective: " (spacemacs//current-layout-name)) - :data (persp-names) - :fuzzy-match t - :action - '(("Close perspective(s)" . (lambda (candidate) - (mapcar - 'persp-kill-without-buffers - (helm-marked-candidates)))))))) - -(defun spacemacs/helm-persp-kill () - "Kills perspectives with all their buffers" - (interactive) - (helm - :buffer "*Helm Kill Perspectives with all their buffers*" - :sources (helm-build-in-buffer-source - (s-concat "Current Perspective: " - (spacemacs//current-layout-name)) - :data (persp-names) - :fuzzy-match t - :action - '(("Kill perspective(s)" . - (lambda (candidate) - (mapcar 'persp-kill - (helm-marked-candidates)))))))) - -;; Helm Projectile related functions --------------------------------------- - -(defun spacemacs/helm-persp-switch-project (arg) - (interactive "P") - (helm - :sources - (helm-build-in-buffer-source "*Helm Switch Project Layout*" - :data (lambda () - (if (projectile-project-p) - (cons (abbreviate-file-name (projectile-project-root)) - (projectile-relevant-known-projects)) - projectile-known-projects)) - :fuzzy-match helm-projectile-fuzzy-match - :mode-line helm-read-file-name-mode-line-string - :action '(("Switch to Project Perspective" . - (lambda (project) - (let ((persp-reset-windows-on-nil-window-conf t)) - (persp-switch project) - (let ((projectile-completion-system 'helm)) - (projectile-switch-project-by-name project))))))) - :buffer "*Helm Projectile Layouts*")) - -;; Autosave ---------------------------------------------------------------- - -(defun spacemacs//layout-autosave () - "Perspectives mode autosave. -Autosaves perspectives layouts every `persp-autosave-interal' seconds. -Cancels autosave on exiting perspectives mode." - (if (and persp-mode layouts-enable-autosave) - (progn - (message "Perspectives mode autosaving enabled.") - (setq spacemacs--layouts-autosave-timer - (run-with-timer - layouts-autosave-delay - layouts-autosave-delay - (lambda () - (message "Saving perspectives to file.") - (persp-save-state-to-file))))) - (when spacemacs--layouts-autosave-timer - (cancel-timer spacemacs--layouts-autosave-timer) - (setq spacemacs--layouts-autosave-timer nil)))) - -;; Eyebrowse - allow perspective-local workspaces -------------------------- - -(defun spacemacs/load-eyebrowse-for-perspective (&optional frame) - "Load an eyebrowse workspace according to a perspective's parameters. -FRAME's perspective is the perspective that is considered, defaulting to -the current frame's perspective. -If the perspective doesn't have a workspace, create one." - (let* ((persp (get-frame-persp frame)) - (window-configs (persp-parameter 'eyebrowse-window-configs persp)) - (current-slot (persp-parameter 'eyebrowse-current-slot persp)) - (last-slot (persp-parameter 'eyebrowse-last-slot persp))) - (if window-configs - (progn - (eyebrowse--set 'window-configs window-configs frame) - (eyebrowse--set 'current-slot current-slot frame) - (eyebrowse--set 'last-slot last-slot frame) - (eyebrowse--load-window-config current-slot)) - (eyebrowse--set 'window-configs nil frame) - (eyebrowse-init frame) - (spacemacs/save-eyebrowse-for-perspective frame)))) - -(defun spacemacs/update-eyebrowse-for-perspective (_new-persp-name) - "Update and save current frame's eyebrowse workspace to its perspective. -Parameter _NEW-PERSP-NAME is ignored, and exists only for compatibility with -`persp-before-switch-functions'." - (let* ((current-slot (eyebrowse--get 'current-slot)) - (current-tag (nth 2 (assoc current-slot (eyebrowse--get 'window-configs))))) - (eyebrowse--update-window-config-element - (eyebrowse--current-window-config current-slot current-tag))) - (spacemacs/save-eyebrowse-for-perspective)) - -(defun spacemacs/save-eyebrowse-for-perspective (&optional frame) - "Save FRAME's eyebrowse workspace to FRAME's perspective. -FRAME defaults to the current frame." - (let ((persp (get-frame-persp frame))) - (set-persp-parameter - 'eyebrowse-window-configs (eyebrowse--get 'window-configs frame) persp) - (set-persp-parameter - 'eyebrowse-current-slot (eyebrowse--get 'current-slot frame) persp) - (set-persp-parameter - 'eyebrowse-last-slot (eyebrowse--get 'last-slot frame) persp))) - -(defun spacemacs/layout-workspaces-transient-state () - "Launches the workspaces transient state, if defined." - (interactive) - (if (fboundp 'spacemacs/workspaces-transient-state/body) - (call-interactively 'spacemacs/workspaces-transient-state/body) - (message "You need the eyebrowse layer to use this feature."))) diff --git a/layers/+window-management/spacemacs-layouts/packages-funcs.el b/layers/+window-management/spacemacs-layouts/packages-funcs.el deleted file mode 100644 index 1e5d252b7..000000000 --- a/layers/+window-management/spacemacs-layouts/packages-funcs.el +++ /dev/null @@ -1,268 +0,0 @@ -(defun spacemacs/jump-to-last-layout () - "Open the previously selected layout, if it exists." - (interactive) - (unless (eq 'non-existent - (gethash spacemacs--last-selected-layout - *persp-hash* 'non-existent)) - (persp-switch spacemacs--last-selected-layout))) - -;; Perspectives transient-state ------------------------------------------- - -(defun spacemacs//layouts-ts-toggle-hint () - "Toggle the full hint docstring for the layouts transient-state." - (interactive) - (setq spacemacs--layouts-ts-full-hint-toggle - (logxor spacemacs--layouts-ts-full-hint-toggle 1))) - -(defun spacemacs//layout-format-name (name pos) - "Format the layout name given by NAME for display in mode-line." - (let* ((layout-name (if (file-directory-p name) - (file-name-nondirectory (directory-file-name name)) - name)) - (string-name (format "%s" layout-name)) - (current (equal name (spacemacs//current-layout-name))) - (caption (concat (number-to-string (if (eq 9 pos) 0 (1+ pos))) - ":" string-name))) - (if current - (propertize (concat "[" caption "]") 'face 'warning) - caption))) - -(defun spacemacs//layouts-ts-hint () - "Return a one liner string containing all the layout names." - (let* ((persp-list (or (persp-names-current-frame-fast-ordered) - (list persp-nil-name))) - (formatted-persp-list - (concat " " - (mapconcat (lambda (persp) - (spacemacs//layout-format-name - persp (position persp persp-list))) - persp-list " | ")))) - (concat - formatted-persp-list - (if (equal 1 spacemacs--layouts-ts-full-hint-toggle) - spacemacs--layouts-ts-full-hint - (concat " ([" - (propertize "?" 'face 'hydra-face-red) - "] help)"))))) - -(spacemacs|transient-state-format-hint layouts - spacemacs--layouts-ts-full-hint - "\n\n - Go to^^^^^^ Add/Remove/Rename...^^ ---^-^--^^^^----------------------- --^-^--------------------------- - [_b_]^^^^ buffer in layout [_a_] add buffer - [_h_]^^^^ default layout [_A_] add all from layout - [_o_]^^^^ custom layout [_r_] remove current buffer - [_l_]^^^^ layout w/helm/ivy [_d_] close current layout - [_L_]^^^^ layouts in file [_D_] close other layout - [_0_,_9_]^^ nth/new layout [_x_] kill current w/buffers - [_C-0_,_C-9_]^^ nth/new layout [_X_] kill other w/buffers - [_n_/_C-l_]^^ next layout [_R_] rename current layout - [_N_/_p_/_C-h_] prev layout - [__]^^^^ last layout ---^^^^^^^^---------------------------------------------------------- - [_s_/_S_] save all layouts/save by names - [_t_]^^ show a buffer without adding it to current layout - [_w_]^^ workspaces micro-state (requires eyebrowse layer) - [_?_]^^ toggle help\n") - -(spacemacs|define-transient-state layouts - :title "Layouts Transient State" - :hint-is-doc t - :dynamic-hint (spacemacs//layouts-ts-hint) - :bindings - ;; need to exit in case number doesn't exist - ("?" spacemacs//layouts-ts-toggle-hint) - ("1" spacemacs/persp-switch-to-1 :exit t) - ("2" spacemacs/persp-switch-to-2 :exit t) - ("3" spacemacs/persp-switch-to-3 :exit t) - ("4" spacemacs/persp-switch-to-4 :exit t) - ("5" spacemacs/persp-switch-to-5 :exit t) - ("6" spacemacs/persp-switch-to-6 :exit t) - ("7" spacemacs/persp-switch-to-7 :exit t) - ("8" spacemacs/persp-switch-to-8 :exit t) - ("9" spacemacs/persp-switch-to-9 :exit t) - ("0" spacemacs/persp-switch-to-0 :exit t) - ("C-1" spacemacs/persp-switch-to-1) - ("C-2" spacemacs/persp-switch-to-2) - ("C-3" spacemacs/persp-switch-to-3) - ("C-4" spacemacs/persp-switch-to-4) - ("C-5" spacemacs/persp-switch-to-5) - ("C-6" spacemacs/persp-switch-to-6) - ("C-7" spacemacs/persp-switch-to-7) - ("C-8" spacemacs/persp-switch-to-8) - ("C-9" spacemacs/persp-switch-to-9) - ("C-0" spacemacs/persp-switch-to-0) - ("" spacemacs/jump-to-last-layout) - ("" nil :exit t) - ("C-h" persp-prev) - ("C-l" persp-next) - ("a" persp-add-buffer :exit t) - ("A" persp-import-buffers :exit t) - ("b" spacemacs/persp-helm-mini :exit t) - ("d" spacemacs/layouts-ts-close) - ("D" spacemacs/layouts-ts-close-other :exit t) - ("h" spacemacs/layout-goto-default :exit t) - ("l" spacemacs/helm-perspectives :exit t) - ("L" persp-load-state-from-file :exit t) - ("n" persp-next) - ("N" persp-prev) - ("o" spacemacs/select-custom-layout :exit t) - ("p" persp-prev) - ("r" persp-remove-buffer :exit t) - ("R" spacemacs/layouts-ts-rename :exit t) - ("s" persp-save-state-to-file :exit t) - ("S" persp-save-to-file-by-names :exit t) - ("t" persp-temporarily-display-buffer :exit t) - ("w" spacemacs/layout-workspaces-transient-state :exit t) - ("x" spacemacs/layouts-ts-kill) - ("X" spacemacs/layouts-ts-kill-other :exit t)) - -(defun spacemacs/layout-switch-by-pos (pos) - "Switch to perspective of position POS." - (let ((persp-to-switch - (nth pos (persp-names-current-frame-fast-ordered)))) - (if persp-to-switch - (persp-switch persp-to-switch) - (when (y-or-n-p - (concat "Perspective in this position doesn't exist.\n" - "Do you want to create one? ")) - (let ((persp-reset-windows-on-nil-window-conf t)) - (persp-switch nil) - (spacemacs/home-delete-other-windows)))))) - -;; Define all `spacemacs/persp-switch-to-X' functions -(dolist (i (number-sequence 9 0 -1)) - (eval `(defun ,(intern (format "spacemacs/persp-switch-to-%s" i)) nil - ,(format "Switch to layout %s." i) - (interactive) - (spacemacs/layout-switch-by-pos ,(if (eq 0 i) 9 (1- i)))))) - -(defun spacemacs/layout-goto-default () - "Go to `dotspacemacs-default-layout-name` layout" - (interactive) - (when dotspacemacs-default-layout-name - (persp-switch dotspacemacs-default-layout-name))) - -(defun spacemacs/layouts-ts-rename () - "Rename a layout and get back to the perspectives transient-state." - (interactive) - (call-interactively 'persp-rename) - (spacemacs/layouts-transient-state/body)) - -(defun spacemacs/layouts-ts-close () - "Kill current perspective" - (interactive) - (persp-kill-without-buffers (spacemacs//current-layout-name))) - -(defun spacemacs/layouts-ts-close-other () - (interactive) - (call-interactively 'spacemacs/helm-persp-close) - (spacemacs/layouts-transient-state/body)) - -(defun spacemacs/layouts-ts-kill () - "Kill current perspective" - (interactive) - (persp-kill (spacemacs//current-layout-name))) - -(defun spacemacs/layouts-ts-kill-other () - (interactive) - (call-interactively 'spacemacs/helm-persp-kill) - (spacemacs/layouts-transient-state/body)) - -;; Custom perspectives transient-state ------------------------------------- - -(defun spacemacs//custom-layout-func-name (name) - "Return the name of the custom-perspective function for NAME." - (intern (concat "spacemacs/custom-perspective-" name))) - -(defmacro spacemacs|define-custom-layout (name &rest props) - "Define a custom-perspective called NAME. - -FUNC is a FUNCTION defined using NAME and the result of -`spacemacs//custom-layout-func-name', it takes care of -creating the perspective NAME and executing the expressions given -in the :body property to this macro. - -NAME is a STRING. - -Available PROPS: - -`:binding STRING' - Key to be bound to the function FUNC - -`:body EXPRESSIONS' - One or several EXPRESSIONS that are going to be evaluated after - we change into the perspective NAME." - (declare (indent 1)) - (let* ((name (if (symbolp name) - (symbol-value name) - name)) - (func (spacemacs//custom-layout-func-name name)) - (binding-prop (car (spacemacs/mplist-get props :binding))) - (binding (if (symbolp binding-prop) - (symbol-value binding-prop) - binding-prop)) - (body (spacemacs/mplist-get props :body)) - (already-defined? (cdr (assoc binding - spacemacs--custom-layout-alist)))) - `(progn - (defun ,func () - ,(format "Open custom perspective %s" name) - (interactive) - (let ((initialize (not (gethash ,name *persp-hash*)))) - (persp-switch ,name) - (when initialize - (delete-other-windows) - ,@body))) - ;; Check for Clashes - (if ,already-defined? - (unless (equal ,already-defined? ,name) - (spacemacs-buffer/warning "Replacing existing binding \"%s\" for %s with %s" - ,binding ,already-defined? ,name) - (push '(,binding . ,name) spacemacs--custom-layout-alist)) - (push '(,binding . ,name) spacemacs--custom-layout-alist))))) - -(defun spacemacs/select-custom-layout () - "Update the custom-perspectives transient-state and then activate it." - (interactive) - (spacemacs//update-custom-layouts) - (spacemacs/custom-layouts-transient-state/body)) - -(defun spacemacs//custom-layouts-ms-documentation () - "Return the docstring for the custom perspectives transient-state." - (if spacemacs--custom-layout-alist - (mapconcat (lambda (custom-persp) - (format "[%s] %s" - (car custom-persp) (cdr custom-persp))) - spacemacs--custom-layout-alist " ") - (spacemacs-buffer/warning (format "`spacemacs--custom-layout-alist' variable is empty" )))) - -(defun spacemacs//update-custom-layouts () - "Ensure the custom-perspectives transient-state is updated. -Takes each element in the list `spacemacs--custom-layout-alist' -format so they are supported by the -`spacemacs/custom-layouts-transient-state' macro." - (let (bindings) - (dolist (custom-persp spacemacs--custom-layout-alist bindings) - (let* ((binding (car custom-persp)) - (name (cdr custom-persp)) - (func-name (spacemacs//custom-layout-func-name name))) - (push (list binding func-name :exit t) bindings))) - (eval `(spacemacs|define-transient-state custom-layouts - :doc (concat (spacemacs//custom-layouts-ms-documentation)) - :bindings - ,@bindings)))) - -(defun spacemacs/alternate-buffer-in-persp () - "Switch back and forth between current and last buffer in the -current perspective." - (interactive) - (with-persp-buffer-list () - (switch-to-buffer (other-buffer (current-buffer) t)))) - -(defun spacemacs-layouts/non-restricted-buffer-list () - (interactive) - (remove-hook 'ido-make-buffer-list-hook #'persp-restrict-ido-buffers) - (helm-mini) - (add-hook 'ido-make-buffer-list-hook #'persp-restrict-ido-buffers)) diff --git a/layers/+window-management/spacemacs-layouts/packages.el b/layers/+window-management/spacemacs-layouts/packages.el deleted file mode 100644 index 858fed437..000000000 --- a/layers/+window-management/spacemacs-layouts/packages.el +++ /dev/null @@ -1,88 +0,0 @@ -;;; packages.el --- Spacemacs Layouts Layer packages File for Spacemacs -;; -;; Copyright (c) 2012-2016 Sylvain Benner & Contributors -;; -;; Author: Sylvain Benner -;; URL: https://github.com/syl20bnr/spacemacs -;; -;; This file is not part of GNU Emacs. -;; -;;; License: GPLv3 -(setq spacemacs-layouts-packages - '(;; temporary switch on a fork to fix - ;; https://github.com/syl20bnr/spacemacs/issues/4120 - (persp-mode :location (recipe :fetcher github - :repo "syl20bnr/persp-mode.el" - :branch "fix-emacsclient-crash")) - spaceline - eyebrowse - helm - swiper)) - -(defun spacemacs-layouts/init-persp-mode () - (use-package persp-mode - :diminish persp-mode - :init - (progn - (setq persp-auto-resume-time (if (or dotspacemacs-auto-resume-layouts - spacemacs-force-resume-layouts) - 1 -1) - persp-nil-name dotspacemacs-default-layout-name - persp-reset-windows-on-nil-window-conf nil - persp-set-last-persp-for-new-frames nil - persp-save-dir spacemacs-layouts-directory) - - ;; always activate persp-mode - (persp-mode) - - (spacemacs/set-leader-keys "l" 'spacemacs/layouts-transient-state/body) - - (spacemacs|define-custom-layout "@Spacemacs" - :binding "e" - :body - (spacemacs/find-dotfile))) - :config - (progn - (defadvice persp-activate (before spacemacs//save-toggle-layout activate) - (setq spacemacs--last-selected-layout persp-last-persp-name)) - (add-hook 'persp-mode-hook 'spacemacs//layout-autosave) - - (spacemacs/declare-prefix "b" "persp-buffers") - (spacemacs/declare-prefix "B" "global-buffers") - - ;; Override SPC TAB to only change buffers in perspective - (spacemacs/set-leader-keys - "TAB" 'spacemacs/alternate-buffer-in-persp - "ba" 'persp-add-buffer - "br" 'persp-remove-buffer - "Bb" 'spacemacs-layouts/non-restricted-buffer-list)))) - -(defun spacemacs-layouts/post-init-spaceline () - (setq spaceline-display-default-perspective - dotspacemacs-display-default-layout)) - -(defun spacemacs-layouts/post-init-eyebrowse () - (add-hook 'persp-before-switch-functions #'spacemacs/update-eyebrowse-for-perspective) - (add-hook 'eyebrowse-post-window-switch-hook #'spacemacs/save-eyebrowse-for-perspective) - (add-hook 'persp-activated-hook #'spacemacs/load-eyebrowse-for-perspective)) - -(defun spacemacs-layouts/post-init-helm () - (spacemacs/set-leader-keys - "pl" 'spacemacs/helm-persp-switch-project)) - -(defun spacemacs-layouts/post-init-swiper () - (defun spacemacs/ivy-persp-switch-project (arg) - (interactive "P") - (ivy-read "Switch to Project Perspective: " - (if (projectile-project-p) - (cons (abbreviate-file-name (projectile-project-root)) - (projectile-relevant-known-projects)) - projectile-known-projects) - :action (lambda (project) - (let ((persp-reset-windows-on-nil-window-conf t)) - (persp-switch project) - (let ((projectile-completion-system 'ivy)) - (projectile-switch-project-by-name project)))))) - - (spacemacs/set-leader-keys - "pl" 'spacemacs/ivy-persp-switch-project))