From cfdfcfab402849b4cfd23c3485d0808d43bcfeb7 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Wed, 16 Mar 2016 21:30:03 -0400 Subject: [PATCH 01/40] Revert hybrid mode to use an evil hybrid state To follow with the refactor of the holy-mode which uses the emacs state of evil mode, the hybrid mode now uses the evil hybrid state. We have now a clean symmetry between all the editing styles where each of them has an associated state: - vim = insert state - emacs = emacs state - hybrid = hybrid state This gives consistent properties to all editing styles and most importantly allows to have true isolation of key binding maps. It has the huge benefit to be easier to explain since now everything can leverage the evil API regarding key bindings. Note: Regular Emacs key binding functions can still be used for emacs and hybrid states so there is no regression with the previous implementation, we just gain better isolation at the cost of a few duplicated lines of code which will be easy to update as needed if evil upstream code changes (this code has been commented with a link to the upstream code). --- .../spacemacs-base/keybindings.el | 7 -- .../spacemacs-editing-styles/config.el | 15 +++ .../local/hybrid-mode/hybrid-mode.el | 113 ++++++++++-------- 3 files changed, 75 insertions(+), 60 deletions(-) create mode 100644 layers/+spacemacs/spacemacs-editing-styles/config.el diff --git a/layers/+distribution/spacemacs-base/keybindings.el b/layers/+distribution/spacemacs-base/keybindings.el index eff0f34918473..8d1eada78278c 100644 --- a/layers/+distribution/spacemacs-base/keybindings.el +++ b/layers/+distribution/spacemacs-base/keybindings.el @@ -360,13 +360,6 @@ (evil-define-key 'insert comint-mode-map [up] 'comint-previous-input) (evil-define-key 'insert comint-mode-map [down] 'comint-next-input)) -;; ivy/helm keys -------------------------------------------------------------- - -(defvar spacemacs-editing-style-hook nil - "Hook run whenever an editing style is toggled. -Each function in the hook is run with a single argument which is the current -editing style.") - ;; --------------------------------------------------------------------------- ;; Transient-states ;; --------------------------------------------------------------------------- diff --git a/layers/+spacemacs/spacemacs-editing-styles/config.el b/layers/+spacemacs/spacemacs-editing-styles/config.el new file mode 100644 index 0000000000000..60394f6012c96 --- /dev/null +++ b/layers/+spacemacs/spacemacs-editing-styles/config.el @@ -0,0 +1,15 @@ +;;; config.el --- editing-style 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 + +(defvar spacemacs-editing-style-hook nil + "Hook run whenever an editing style is toggled. +Each function in the hook is run with a single argument which is the current +editing style.") diff --git a/layers/+spacemacs/spacemacs-editing-styles/local/hybrid-mode/hybrid-mode.el b/layers/+spacemacs/spacemacs-editing-styles/local/hybrid-mode/hybrid-mode.el index 9dd2719f696fe..c782b5f0d8080 100644 --- a/layers/+spacemacs/spacemacs-editing-styles/local/hybrid-mode/hybrid-mode.el +++ b/layers/+spacemacs/spacemacs-editing-styles/local/hybrid-mode/hybrid-mode.el @@ -40,65 +40,72 @@ to start in hybrid state (emacs bindings) by default." :group 'spacemacs :type 'symbol) -(defvar hybrid-mode-insert-cursor evil-hybrid-state-cursor) -(defvar hybrid-mode-insert-cursor-backup evil-insert-state-cursor) -(defvar hybrid-mode-insert-state-entry-hook) -(defvar hybrid-mode-insert-state-exit-hook) - -(defun hybrid-mode-insert-state-entry-hook () - "Run hooks in `hybrid-mode-insert-state-entry-hook'." - (run-hooks 'hybrid-mode-insert-state-entry-hook)) - -(defun hybrid-mode-insert-state-exit-hook () - "Run hooks in `hybrid-mode-insert-state-exit-hook'." - (run-hooks 'hybrid-mode-insert-state-exit-hook)) +(defadvice evil-insert-state (around hybrid-insert-to-hybrid-state disable) + "Forces Hybrid state." + (evil-hybrid-state)) ;;;###autoload (define-minor-mode hybrid-mode - "Global minor mode to allow emacs bindings in `evil-insert-state'." + "Global minor mode to replace insert state by hybrid state." :global t :lighter " hybrid" :group 'spacemacs (if hybrid-mode - (progn - (setq hybrid-mode-default-state-backup evil-default-state - evil-default-state hybrid-mode-default-state - evil-insert-state-cursor hybrid-mode-insert-cursor) - (put 'spacemacs-insert-face 'face-alias 'spacemacs-hybrid-face) - ;; using this function to set the variable triggers the defcustom :set - ;; property which actually does the work of removing the bindings. - (customize-set-variable 'evil-disable-insert-state-bindings t) - (add-hook 'evil-insert-state-entry-hook 'hybrid-mode-insert-state-entry-hook) - (add-hook 'evil-insert-state-exit-hook 'hybrid-mode-insert-state-exit-hook)) - (setq evil-default-state hybrid-mode-default-state-backup - evil-insert-state-cursor hybrid-mode-insert-cursor-backup) - (put 'spacemacs-insert-face 'face-alias nil) - (customize-set-variable 'evil-disable-insert-state-bindings nil) - (remove-hook 'evil-insert-state-entry-hook 'hybrid-mode-insert-state-entry-hook) - (remove-hook 'evil-insert-state-exit-hook 'hybrid-mode-insert-state-exit-hook))) - -;;; Temporary to support old method of defining bindings. Should be removed -;;; eventually. -(when (fboundp 'advice-add) - (defun hybrid-mode-evil-define-key (old-func &rest args) - (if (equal (car args) ''hybrid) - (let ((map (nth 1 args)) - (key (nth 2 args)) - (def (nth 3 args)) - (bindings (nthcdr 4 args))) - (message "warning: evil-define-key no longer supports \ -hybrid as a state please convert to (define-key map key def)") - (while key - (when (keymapp (symbol-value map)) - (define-key (symbol-value map) key def) - (setq key (pop bindings) - def (pop bindings))))) - (apply old-func args))) - (advice-add 'evil-define-key :around #'hybrid-mode-evil-define-key)) - -(defvar evil-hybrid-state-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent evil-insert-state-map map) - map)) + (enable-hybrid-editing-style) + (enable-hybrid-editing-style))) + +(defun enable-hybrid-editing-style () + "Enable the hybrid editing style." + (setq hybrid-mode-default-state-backup evil-default-state + evil-default-state hybrid-mode-default-state) + ;; key bindings hooks for dynamic switching of editing styles + (run-hook-with-args 'spacemacs-editing-style-hook 'hybrid) + (ad-enable-advice 'evil-insert-state + 'around 'hybrid-insert-to-hybrid-state) + (ad-activate 'evil-insert-state)) + +(defun disable-hybrid-editing-style () + "Disable the hybrid editing style (reverting to 'vim style)." + (setq evil-default-state hybrid-mode-default-state-backup) + ;; restore key bindings + (run-hook-with-args 'spacemacs-editing-style-hook 'vim) + (ad-disable-advice 'evil-insert-state + 'around 'hybrid-insert-to-hybrid-state) + (ad-activate 'evil-insert-state)) + +;; This code is from evil insert state definition, any change upstream +;; should be reflected here +;; see https://bitbucket.org/lyro/evil/src/a25b848c90c7942fe89d9ec283c6bb44fb7b3cf4/evil-states.el?fileviewer=file-view-default#evil-states.el-74 +(evil-define-state hybrid + "Hybrid state for hybrid mode." + :tag " " + :cursor (bar . 2) + :message "-- HYBRID --" + :entry-hook (evil-start-track-last-insertion) + :exit-hook (evil-cleanup-insert-state evil-stop-track-last-insertion) + :input-method t + (cond + ((evil-hybrid-state-p) + (add-hook 'pre-command-hook #'evil-insert-repeat-hook) + (unless (eq evil-want-fine-undo t) + (evil-start-undo-step t))) + (t + (remove-hook 'pre-command-hook #'evil-insert-repeat-hook) + (setq evil-insert-repeat-info evil-repeat-info) + (evil-set-marker ?^ nil t) + (unless (eq evil-want-fine-undo t) + (evil-end-undo-step t (eq evil-want-fine-undo 'fine))) + (when evil-move-cursor-back + (when (or (evil-normal-state-p evil-next-state) + (evil-motion-state-p evil-next-state)) + (evil-move-cursor-back)))))) + +(define-key evil-hybrid-state-map [escape] 'evil-normal-state) + +;; Override stock evil function `evil-insert-state-p' +(defun evil-insert-state-p (&optional state) + "Whether the current state is insert." + (and evil-local-mode + (memq (or state evil-state) '(insert hybrid)))) (provide 'hybrid-mode) From c2296f71f834c68bb5610b60ec86b691fdec8953 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Wed, 16 Mar 2016 21:59:44 -0400 Subject: [PATCH 02/40] Put back holy and hybrid in spacemacs base layer They are not optional Also fixes some bugs like toggling hybrid mode from holy mode and toggling off the hybrid mode. --- .../evil-evilified-state.el | 0 .../local/holy-mode/holy-mode.el | 0 .../local/hybrid-mode/hybrid-mode.el | 2 +- .../+distribution/spacemacs-base/packages.el | 39 ++++++++++++++++- layers/+distribution/spacemacs/config.el | 1 - .../spacemacs-editing-styles/config.el | 15 ------- .../spacemacs-editing-styles/packages.el | 43 ------------------- 7 files changed, 39 insertions(+), 61 deletions(-) rename layers/{+spacemacs/spacemacs-editing-styles => +distribution/spacemacs-base}/local/evil-evilified-state/evil-evilified-state.el (100%) rename layers/{+spacemacs/spacemacs-editing-styles => +distribution/spacemacs-base}/local/holy-mode/holy-mode.el (100%) rename layers/{+spacemacs/spacemacs-editing-styles => +distribution/spacemacs-base}/local/hybrid-mode/hybrid-mode.el (99%) delete mode 100644 layers/+spacemacs/spacemacs-editing-styles/config.el delete mode 100644 layers/+spacemacs/spacemacs-editing-styles/packages.el diff --git a/layers/+spacemacs/spacemacs-editing-styles/local/evil-evilified-state/evil-evilified-state.el b/layers/+distribution/spacemacs-base/local/evil-evilified-state/evil-evilified-state.el similarity index 100% rename from layers/+spacemacs/spacemacs-editing-styles/local/evil-evilified-state/evil-evilified-state.el rename to layers/+distribution/spacemacs-base/local/evil-evilified-state/evil-evilified-state.el diff --git a/layers/+spacemacs/spacemacs-editing-styles/local/holy-mode/holy-mode.el b/layers/+distribution/spacemacs-base/local/holy-mode/holy-mode.el similarity index 100% rename from layers/+spacemacs/spacemacs-editing-styles/local/holy-mode/holy-mode.el rename to layers/+distribution/spacemacs-base/local/holy-mode/holy-mode.el diff --git a/layers/+spacemacs/spacemacs-editing-styles/local/hybrid-mode/hybrid-mode.el b/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el similarity index 99% rename from layers/+spacemacs/spacemacs-editing-styles/local/hybrid-mode/hybrid-mode.el rename to layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el index c782b5f0d8080..d2fb1cc81f494 100644 --- a/layers/+spacemacs/spacemacs-editing-styles/local/hybrid-mode/hybrid-mode.el +++ b/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el @@ -52,7 +52,7 @@ to start in hybrid state (emacs bindings) by default." :group 'spacemacs (if hybrid-mode (enable-hybrid-editing-style) - (enable-hybrid-editing-style))) + (disable-hybrid-editing-style))) (defun enable-hybrid-editing-style () "Enable the hybrid editing style." diff --git a/layers/+distribution/spacemacs-base/packages.el b/layers/+distribution/spacemacs-base/packages.el index e112520de9c77..1c247aaa33869 100644 --- a/layers/+distribution/spacemacs-base/packages.el +++ b/layers/+distribution/spacemacs-base/packages.el @@ -21,7 +21,7 @@ evil evil-ediff evil-escape - ;; evil-leader + (evil-evilified-state :location local :step pre :protected t) evil-surround evil-visualstar exec-path-from-shell @@ -416,6 +416,11 @@ below. Anything else exits." :init (evil-escape-mode) :config (spacemacs|hide-lighter evil-escape-mode))) +(defun spacemacs-base/init-evil-evilified-state () + (use-package evil-evilified-state) + (define-key evil-evilified-state-map (kbd dotspacemacs-leader-key) + spacemacs-default-map)) + (defun spacemacs-base/init-evil-surround () (use-package evil-surround :init @@ -481,6 +486,38 @@ below. Anything else exits." (spacemacs|hide-lighter hs-minor-mode))) (add-hook 'prog-mode-hook 'spacemacs//enable-hs-minor-mode)) +(defun spacemacs-base/init-holy-mode () + (use-package holy-mode + :commands holy-mode + :init + (progn + (when (eq 'emacs dotspacemacs-editing-style) + (holy-mode)) + (spacemacs|add-toggle holy-mode + :status holy-mode + :on (progn (when (bound-and-true-p hybrid-mode) + (hybrid-mode -1)) + (holy-mode)) + :off (holy-mode -1) + :documentation "Globally toggle holy mode." + :evil-leader "tEe") + (spacemacs|diminish holy-mode " Ⓔe" " Ee")))) + +(defun spacemacs-base/init-hybrid-mode () + (use-package hybrid-mode + :config + (progn + (when (eq 'hybrid dotspacemacs-editing-style) (hybrid-mode)) + (spacemacs|add-toggle hybrid-mode + :status hybrid-mode + :on (progn (when (bound-and-true-p holy-mode) + (holy-mode -1)) + (hybrid-mode)) + :off (hybrid-mode -1) + :documentation "Globally toggle hybrid mode." + :evil-leader "tEh") + (spacemacs|diminish hybrid-mode " Ⓔh" " Eh")))) + (defun spacemacs-base/init-hydra () (use-package hydra :init diff --git a/layers/+distribution/spacemacs/config.el b/layers/+distribution/spacemacs/config.el index 9dabd9b0bf07d..9b891613a9420 100644 --- a/layers/+distribution/spacemacs/config.el +++ b/layers/+distribution/spacemacs/config.el @@ -14,7 +14,6 @@ (configuration-layer/declare-layers '(spacemacs-base spacemacs-layouts spacemacs-editing - spacemacs-editing-styles spacemacs-editing-visual spacemacs-evil spacemacs-language diff --git a/layers/+spacemacs/spacemacs-editing-styles/config.el b/layers/+spacemacs/spacemacs-editing-styles/config.el deleted file mode 100644 index 60394f6012c96..0000000000000 --- a/layers/+spacemacs/spacemacs-editing-styles/config.el +++ /dev/null @@ -1,15 +0,0 @@ -;;; config.el --- editing-style 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 - -(defvar spacemacs-editing-style-hook nil - "Hook run whenever an editing style is toggled. -Each function in the hook is run with a single argument which is the current -editing style.") diff --git a/layers/+spacemacs/spacemacs-editing-styles/packages.el b/layers/+spacemacs/spacemacs-editing-styles/packages.el deleted file mode 100644 index b2e446b6e3648..0000000000000 --- a/layers/+spacemacs/spacemacs-editing-styles/packages.el +++ /dev/null @@ -1,43 +0,0 @@ -(setq spacemacs-editing-styles-packages - '( - evil - (evil-evilified-state :location local :step pre :protected t) - (holy-mode :location local :step pre) - (hybrid-mode :location local :step pre) - )) - -(defun spacemacs-editing-styles/init-evil-evilified-state () - (use-package evil-evilified-state) - (define-key evil-evilified-state-map (kbd dotspacemacs-leader-key) - spacemacs-default-map)) - -(defun spacemacs-editing-styles/init-holy-mode () - (use-package holy-mode - :commands holy-mode - :init - (progn - (when (eq 'emacs dotspacemacs-editing-style) - (holy-mode)) - (spacemacs|add-toggle holy-mode - :status holy-mode - :on (holy-mode) - :off (holy-mode -1) - :documentation "Globally toggle holy mode." - :evil-leader "tEe") - (spacemacs|diminish holy-mode " Ⓔe" " Ee")))) - -(defun spacemacs-editing-styles/init-hybrid-mode ()) -(defun spacemacs-editing-styles/post-init-evil () - (use-package hybrid-mode - :config - (progn - (when (eq 'hybrid dotspacemacs-editing-style) (hybrid-mode)) - (spacemacs|add-toggle hybrid-mode - :status hybrid-mode - :on (progn (when (bound-and-true-p holy-mode) - (holy-mode -1)) - (hybrid-mode)) - :off (hybrid-mode -1) - :documentation "Globally toggle hybrid mode." - :evil-leader "tEh") - (spacemacs|diminish hybrid-mode " Ⓔh" " Eh")))) From 2d61e5304ec5aa09f9ab2496d5bb82c80b1d5c55 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Wed, 16 Mar 2016 22:43:50 -0400 Subject: [PATCH 03/40] core: add support for :variables keyword in dotspacemacs-editing-style Add variable `hybrid-mode-enable-hjkl-bindings` to enable hjkl navigation in hybrid mode. example: dotspacemacs-editing-style '(hybrid :variables hybrid-mode-enable-hjkl-bindings t hybrid-mode-default-state 'normal) --- core/core-dotspacemacs.el | 36 +++++++++++++++++-- core/core-spacemacs.el | 2 ++ layers/+completion/spacemacs-helm/packages.el | 4 ++- layers/+completion/spacemacs-ivy/packages.el | 4 ++- .../local/hybrid-mode/hybrid-mode.el | 12 +++++-- 5 files changed, 52 insertions(+), 6 deletions(-) diff --git a/core/core-dotspacemacs.el b/core/core-dotspacemacs.el index a95c3a4e13066..933964729a6c2 100644 --- a/core/core-dotspacemacs.el +++ b/core/core-dotspacemacs.el @@ -309,6 +309,30 @@ are caught and signalled to user in spacemacs buffer." (error-message-string err)) t)))))) +(defun dotspacemacs//read-editing-style-config (config) + "Read editing style CONFIG: apply variables and return the editing style. +CONFIG can be the symbol of an editing style or a list where the car is +the symbol of an editing style and the cdr is a list of keyword arguments like +`:variables'." + (cond + ((symbolp config) config) + ((listp config) + (let ((variables (spacemacs/mplist-get config :variables))) + (while variables + (let ((var (pop variables))) + (if (consp variables) + (condition-case-unless-debug err + (set-default var (eval (pop variables))) + ('error + (spacemacs-buffer/append + (format (concat "\nAn error occurred while reading the " + "editing style variable %s " + "(error: %s). Be sure to quote the value " + "if needed.\n") var err)))) + (spacemacs-buffer/warning "Missing value for variable %s !" + var))))) + (car config)))) + (defun dotspacemacs/sync-configuration-layers (&optional arg) "Synchronize declared layers in dotfile with spacemacs. @@ -326,6 +350,11 @@ Called with `C-u C-u' skips `dotspacemacs/user-config' _and_ preleminary tests." (load-file buffer-file-name) (dotspacemacs|call-func dotspacemacs/init "Calling dotfile init...") + (dotspacemacs|call-func dotspacemacs/user-init + "Calling dotfile user init...") + (setq dotspacemacs-editing-style + (dotspacemacs//read-editing-style-config + dotspacemacs-editing-style)) (configuration-layer/sync) (if (member arg '((4) (16))) (message (concat "Done (`dotspacemacs/user-config' " @@ -539,8 +568,11 @@ error recovery." (dotspacemacs||let-init-test (dotspacemacs/init) (spacemacs//test-var - (lambda (x) (member x '(vim emacs hybrid))) - 'dotspacemacs-editing-style "is \'vim, \'emacs or \'hybrid") + (lambda (x) (or (member x '(vim emacs hybrid)) + (and (listp x) + (spacemacs/mplist-get x :variables)))) + 'dotspacemacs-editing-style + "is \'vim, \'emacs or \'hybrid or and list with `:variable' keyword") (spacemacs//test-var (lambda (x) (member x '(original cache nil))) 'dotspacemacs-auto-save-file-location (concat "is one of \'original, " diff --git a/core/core-spacemacs.el b/core/core-spacemacs.el index 081dd9b5a8b89..f3c67efdefc33 100644 --- a/core/core-spacemacs.el +++ b/core/core-spacemacs.el @@ -76,6 +76,8 @@ (require 'core-configuration-layer) (dotspacemacs|call-func dotspacemacs/init "Calling dotfile init...") (dotspacemacs|call-func dotspacemacs/user-init "Calling dotfile user init...") + (setq dotspacemacs-editing-style (dotspacemacs//read-editing-style-config + dotspacemacs-editing-style)) (configuration-layer/initialize) ;; default theme (let ((default-theme (car dotspacemacs-themes))) diff --git a/layers/+completion/spacemacs-helm/packages.el b/layers/+completion/spacemacs-helm/packages.el index 9e227c8b4d2a3..ff37b812a98da 100644 --- a/layers/+completion/spacemacs-helm/packages.el +++ b/layers/+completion/spacemacs-helm/packages.el @@ -392,7 +392,9 @@ Removes the automatic guessing of the initial value based on thing at point. " (defun spacemacs//helm-hjkl-navigation (style) "Set navigation on 'hjkl' for the given editing STYLE." (cond - ((eq 'vim style) + ((or (eq 'vim style) + (and (eq 'hybrid style) + hybrid-mode-enable-hjkl-bindings)) (define-key helm-map (kbd "C-j") 'helm-next-line) (define-key helm-map (kbd "C-k") 'helm-previous-line) (define-key helm-map (kbd "C-h") 'helm-next-source) diff --git a/layers/+completion/spacemacs-ivy/packages.el b/layers/+completion/spacemacs-ivy/packages.el index 50e5830959952..3ebce1f5a0d51 100644 --- a/layers/+completion/spacemacs-ivy/packages.el +++ b/layers/+completion/spacemacs-ivy/packages.el @@ -379,7 +379,9 @@ Helm hack." (defun spacemacs//ivy-hjkl-navigation (style) "Set navigation on 'hjkl' for the given editing STYLE." (cond - ((eq 'vim style) + ((or (eq 'vim style) + (and (eq 'hybrid style) + hybrid-mode-enable-hjkl-bindings)) (define-key ivy-minibuffer-map (kbd "C-j") 'ivy-next-line) (define-key ivy-minibuffer-map (kbd "C-k") 'ivy-previous-line) (define-key ivy-minibuffer-map (kbd "C-h") (kbd "DEL")) diff --git a/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el b/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el index d2fb1cc81f494..d69556abf08ff 100644 --- a/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el +++ b/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el @@ -31,8 +31,7 @@ (require 'evil) -(defvar hybrid-mode-default-state-backup evil-default-state - "Backup of `evil-default-state'.") +(defvar hybrid-mode-enable-hjkl-bindings) (defcustom hybrid-mode-default-state 'normal "Value of `evil-default-state' for hybrid-mode. Set to hybrid @@ -40,6 +39,15 @@ to start in hybrid state (emacs bindings) by default." :group 'spacemacs :type 'symbol) +(defcustom hybrid-mode-enable-hjkl-bindings nil + "If non nil then packages configuration should define the +key bindings for hjkl navigation." + :group 'spacemacs + :type 'boolean) + +(defvar hybrid-mode-default-state-backup evil-default-state + "Backup of `evil-default-state'.") + (defadvice evil-insert-state (around hybrid-insert-to-hybrid-state disable) "Forces Hybrid state." (evil-hybrid-state)) From ca5b8be90b3de41f35b24770857d50f90f6c5544 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Wed, 16 Mar 2016 23:34:20 -0400 Subject: [PATCH 04/40] New hybrid mode variable hybrid-mode-enable-evilified-state When non nil then evilified buffer use evilified state, otherwise they use the emacs state (may put the hybrid state if users get confused). --- .../local/holy-mode/holy-mode.el | 20 +++---- .../local/hybrid-mode/hybrid-mode.el | 56 +++++++++++++++++-- 2 files changed, 59 insertions(+), 17 deletions(-) diff --git a/layers/+distribution/spacemacs-base/local/holy-mode/holy-mode.el b/layers/+distribution/spacemacs-base/local/holy-mode/holy-mode.el index a9f6af27cec4a..c5ece18bafd8e 100644 --- a/layers/+distribution/spacemacs-base/local/holy-mode/holy-mode.el +++ b/layers/+distribution/spacemacs-base/local/holy-mode/holy-mode.el @@ -72,7 +72,7 @@ The `insert state' is replaced by the `emacs state'." ;; key bindings hooks for dynamic switching of editing styles (run-hook-with-args 'spacemacs-editing-style-hook 'emacs) ;; initiate `emacs state' and enter the church - (holy-mode//update-states-for-current-buffers)) + (holy-mode//update-states-for-current-buffers 'emacs)) (defun amen () "May the force be with you my son (or not)." @@ -88,19 +88,17 @@ The `insert state' is replaced by the `emacs state'." ;; restore key bindings (run-hook-with-args 'spacemacs-editing-style-hook 'vim) ;; restore the states - (holy-mode//update-states-for-current-buffers t)) + (holy-mode//update-states-for-current-buffers 'vim)) -(defun holy-mode//update-states-for-current-buffers (&optional arg) - "Update the active state in all current buffers. -ARG non nil means that the editing style is `vim'." +(defun holy-mode//update-states-for-current-buffers (style) + "Update the active state in all current buffers given current STYLE." (dolist (buffer (buffer-list)) (with-current-buffer buffer - ;; switch to holy-mode - (when (not arg) - (evil-emacs-state)) - ;; disable holy-mode - (when (and arg (eq 'emacs evil-state)) + (cond + ((eq 'emacs style) (evil-emacs-state)) + ((and (eq 'vim style) + (eq 'emacs evil-state)) (cond ((memq major-mode evil-evilified-state-modes) (evil-evilified-state)) ((memq major-mode evil-motion-state-modes) (evil-motion-state)) - (t (evil-normal-state))))))) + (t (evil-normal-state)))))))) diff --git a/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el b/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el index d69556abf08ff..a0ca11973e8d4 100644 --- a/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el +++ b/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el @@ -45,6 +45,11 @@ key bindings for hjkl navigation." :group 'spacemacs :type 'boolean) +(defcustom hybrid-mode-enable-evilified-state nil + "If non nil then evilified states is enabled in buffer supporting it." + :group 'spacemacs + :type 'boolean) + (defvar hybrid-mode-default-state-backup evil-default-state "Backup of `evil-default-state'.") @@ -52,6 +57,16 @@ key bindings for hjkl navigation." "Forces Hybrid state." (evil-hybrid-state)) +(defadvice evil-evilified-state (around hybrid-evilified-to-hybrid-state disable) + "Forces Hybrid state." + (if (equal -1 (ad-get-arg 0)) + ad-do-it + (if hybrid-mode-enable-evilified-state + ad-do-it + ;; seems better to set the emacs state instead of hybrid for evilified + ;; buffers + (evil-emacs-state)))) + ;;;###autoload (define-minor-mode hybrid-mode "Global minor mode to replace insert state by hybrid state." @@ -66,20 +81,32 @@ key bindings for hjkl navigation." "Enable the hybrid editing style." (setq hybrid-mode-default-state-backup evil-default-state evil-default-state hybrid-mode-default-state) - ;; key bindings hooks for dynamic switching of editing styles - (run-hook-with-args 'spacemacs-editing-style-hook 'hybrid) + ;; replace evil states by `hybrid state' (ad-enable-advice 'evil-insert-state 'around 'hybrid-insert-to-hybrid-state) - (ad-activate 'evil-insert-state)) + (ad-enable-advice 'evil-evilified-state + 'around 'hybrid-evilified-to-hybrid-state) + (ad-activate 'evil-insert-state) + (ad-activate 'evil-evilified-state) + ;; key bindings hooks for dynamic switching of editing styles + (run-hook-with-args 'spacemacs-editing-style-hook 'hybrid) + ;; initiate `hybrid state' + (hybrid-mode//update-states-for-current-buffers 'hybrid)) (defun disable-hybrid-editing-style () "Disable the hybrid editing style (reverting to 'vim style)." (setq evil-default-state hybrid-mode-default-state-backup) - ;; restore key bindings - (run-hook-with-args 'spacemacs-editing-style-hook 'vim) + ;; restore evil states (ad-disable-advice 'evil-insert-state 'around 'hybrid-insert-to-hybrid-state) - (ad-activate 'evil-insert-state)) + (ad-disable-advice 'evil-evilified-state + 'around 'hybrid-evilified-to-hybrid-state) + (ad-activate 'evil-insert-state) + (ad-activate 'evil-evilified-state) + ;; restore key bindings + (run-hook-with-args 'spacemacs-editing-style-hook 'vim) + ;; restore the states + (hybrid-mode//update-states-for-current-buffers 'vim)) ;; This code is from evil insert state definition, any change upstream ;; should be reflected here @@ -116,4 +143,21 @@ key bindings for hjkl navigation." (and evil-local-mode (memq (or state evil-state) '(insert hybrid)))) +(defun hybrid-mode//update-states-for-current-buffers (style) + "Update the active state in all current buffers given current STYLE." + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (cond + ((eq 'hybrid style) + (if (memq major-mode evil-evilified-state-modes) + (evil-evilified-state) + (funcall (intern (format "evil-%S-state" + hybrid-mode-default-state))))) + ((and (eq 'vim style) + (memq evil-state '(hybrid emacs))) + (cond + ((memq major-mode evil-evilified-state-modes) (evil-evilified-state)) + ((memq major-mode evil-motion-state-modes) (evil-motion-state)) + (t (evil-normal-state)))))))) + (provide 'hybrid-mode) From 50ff429f817705a9fa2c4a70e4ee92045e9ab3c2 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Wed, 16 Mar 2016 23:40:09 -0400 Subject: [PATCH 05/40] Set hybrid-mode-default-state default value to hybrid --- .../spacemacs-base/local/hybrid-mode/hybrid-mode.el | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el b/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el index a0ca11973e8d4..a6586e963cfa1 100644 --- a/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el +++ b/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el @@ -33,15 +33,13 @@ (defvar hybrid-mode-enable-hjkl-bindings) -(defcustom hybrid-mode-default-state 'normal - "Value of `evil-default-state' for hybrid-mode. Set to hybrid -to start in hybrid state (emacs bindings) by default." +(defcustom hybrid-mode-default-state 'hybrid + "Value of `evil-default-state' for hybrid-mode." :group 'spacemacs :type 'symbol) (defcustom hybrid-mode-enable-hjkl-bindings nil - "If non nil then packages configuration should define the -key bindings for hjkl navigation." + "If non nil then packages configuration should enable hjkl navigation." :group 'spacemacs :type 'boolean) From 6d5f55f09e65f46c93d35f812954f9c22d3e2066 Mon Sep 17 00:00:00 2001 From: Eivind Fonn Date: Thu, 17 Mar 2016 09:14:53 +0100 Subject: [PATCH 06/40] Fix evil-inner-buffer text object --- layers/+distribution/spacemacs-base/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/+distribution/spacemacs-base/packages.el b/layers/+distribution/spacemacs-base/packages.el index 1c247aaa33869..64298fceb03a4 100644 --- a/layers/+distribution/spacemacs-base/packages.el +++ b/layers/+distribution/spacemacs-base/packages.el @@ -391,7 +391,7 @@ below. Anything else exits." ;; define text-object for entire buffer (evil-define-text-object evil-inner-buffer (count &optional beg end type) - (evil-select-paren "\\`" "\\'" beg end type count nil)) + (list (point-min) (point-max))) (define-key evil-inner-text-objects-map "g" 'evil-inner-buffer) ;; support smart 1parens-strict-mode From b69757102169c7b2cc6905fc5b13ebefe1ef81cf Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Thu, 17 Mar 2016 17:43:10 -0400 Subject: [PATCH 07/40] Revert default value of hybrid-mode-default-state to normal --- .../spacemacs-base/local/hybrid-mode/hybrid-mode.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el b/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el index a6586e963cfa1..646cc3d3193d9 100644 --- a/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el +++ b/layers/+distribution/spacemacs-base/local/hybrid-mode/hybrid-mode.el @@ -33,7 +33,7 @@ (defvar hybrid-mode-enable-hjkl-bindings) -(defcustom hybrid-mode-default-state 'hybrid +(defcustom hybrid-mode-default-state 'normal "Value of `evil-default-state' for hybrid-mode." :group 'spacemacs :type 'symbol) From 5585a40db1684480492279bac41dfb4a655089f9 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Thu, 17 Mar 2016 20:38:04 -0400 Subject: [PATCH 08/40] doc: update editing style documentation --- core/core-dotspacemacs.el | 9 ++- core/templates/.spacemacs.template | 10 ++- doc/DOCUMENTATION.org | 113 ++++++++++++++++++++--------- 3 files changed, 88 insertions(+), 44 deletions(-) diff --git a/core/core-dotspacemacs.el b/core/core-dotspacemacs.el index 933964729a6c2..cde1810ba27b2 100644 --- a/core/core-dotspacemacs.el +++ b/core/core-dotspacemacs.el @@ -75,10 +75,11 @@ packages then consider to create a layer, you can also put the configuration in `dotspacemacs/user-config'.") (defvar dotspacemacs-editing-style 'vim - "One of `vim', `emacs' or `hybrid'. Evil is always enabled but if the -variable is `emacs' then the `holy-mode' is enabled at startup. `hybrid' -uses emacs key bindings for vim's insert mode, but otherwise leaves evil -unchanged.") + "One of `vim', `emacs' or `hybrid'. +`hybrid' is like `vim' except that `insert state' is replaced by the +`hybrid state' with `emacs' key bindings. The value can also be a list + with `:variables' keyword (similar to layers). Check the editing styles + section of the documentation for details on available variables.") (defvar dotspacemacs-startup-banner 'official "Specify the startup banner. Default value is `official', it displays diff --git a/core/templates/.spacemacs.template b/core/templates/.spacemacs.template index 50238676c5ae7..75da4439bcf38 100644 --- a/core/templates/.spacemacs.template +++ b/core/templates/.spacemacs.template @@ -73,10 +73,12 @@ values." ;; If non nil then spacemacs will check for updates at startup ;; when the current branch is not `develop'. (default t) dotspacemacs-check-for-update t - ;; One of `vim', `emacs' or `hybrid'. Evil is always enabled but if the - ;; variable is `emacs' then the `holy-mode' is enabled at startup. `hybrid' - ;; uses emacs key bindings for vim's insert mode, but otherwise leaves evil - ;; unchanged. (default 'vim) + ;; One of `vim', `emacs' or `hybrid'. + ;; `hybrid' is like `vim' except that `insert state' is replaced by the + ;; `hybrid state' with `emacs' key bindings. The value can also be a list + ;; with `:variables' keyword (similar to layers). Check the editing styles + ;; section of the documentation for details on available variables. + ;; (default 'vim) dotspacemacs-editing-style 'vim ;; If non nil output loading progress in `*Messages*' buffer. (default nil) dotspacemacs-verbose-loading nil diff --git a/doc/DOCUMENTATION.org b/doc/DOCUMENTATION.org index ea6a83ae88919..481f5c40c272a 100644 --- a/doc/DOCUMENTATION.org +++ b/doc/DOCUMENTATION.org @@ -601,9 +601,9 @@ as follows. #+END_SRC These functions use a macro like =kbd= to translate the key sequences for you. -The second function, =spacemacs/set-leader-keys-for-major-mode=, binds the key only in the -specified mode. The second key binding would not be in effect in =org-mode= for -example. +The second function, =spacemacs/set-leader-keys-for-major-mode=, binds the key +only in the specified mode. The second key binding would not be in effect in +=org-mode= for example. Finally, one should be aware of prefix keys. Essentially, all keymaps can be nested. Nested keymaps are used extensively in spacemacs, and in vanilla Emacs @@ -629,41 +629,82 @@ automatically saved by Emacs are stored at the end of your =~/.spacemacs= file. * Main principles ** Editing Styles + Spacemacs comes with several editing styles which can be switched dynamically +providing an easier way to do pair programming, for instance between a Vim user +and an Emacs user. + +Three styles are available: +- Vim, +- Emacs, +- Hybrid (a mix between Vim and Emacs). + *** Vim Spacemacs behaves like in Vim using [[https://gitorious.org/evil/pages/Home][Evil]] mode package to emulate Vim key bindings. This is the default style of Spacemacs, it can be set explicitly by setting the =dotspacemacs-editing-style= variable to =vim= in the dotfile. +To bind keys in Vim editing style (=insert state=): + +#+BEGIN_SRC emacs-lisp +(define-key evil-insert-state-map (kbd "C-]") 'forward-char) +#+END_SRC + *** Emacs Spacemacs behaves like in raw Emacs using the Holy mode which configures Evil to -make the emacs state the default state everywhere. +make the =emacs state= the default state everywhere. Set the =dotspacemacs-editing-style= variable to =emacs= in the dotfile. -In Emacs style the leader is available on ~M-m~. It is possible to dynamically -switch between evil and holy mode using ~SPC t E h~ and ~M-m t E h~. +In Emacs style the leader is available on ~M-m~. It is possible to toggle it on +and off with ~SPC t E e~ and ~M-m t E e~. When off the =vim= style is enabled. + +To bind keys in Emacs editing style (=emacs state=): + +#+BEGIN_SRC emacs-lisp +(define-key evil-emacs-state-map (kbd "C-]") 'forward-char) +#+END_SRC *** Hybrid -The hybrid editing style is like the Vim style except that insert state -has all the Emacs key bindings available like in emacs state. The insert state -in hybrid mode is called the hybrid state and you have to map your key bindings -in =evil-hybrid-state-map= keymap instead of =evil-insert-state-map=. +The hybrid editing style is like the Vim style except that =insert state= is +replaced by a new state called =hybrid state=. In =hybrid state= all the Emacs +key bindings are available, this is like replacing the =insert state= with the +=emacs state= but provides an isolated key map =evil-hybrid-state-map=. + +To bind keys in Hybrid editing style (=hybrid state=): + +#+BEGIN_SRC emacs-lisp +(define-key evil-hybrid-state-map (kbd "C-]") 'forward-char) +#+END_SRC -Hybrid mode can be enabled by setting =dotspacemacs-editing-style= to =hybrid=. -To switch between evil and hybrid mode use ~SPC t E y~ and ~M-m t E y~. +This style can be tweaked to be more like Emacs or more like Vim depending +on the user preferences. The following variable are available to change the +style configuration: + +| Variable | Description | +|--------------------------------------+------------------------------------------------------------------------------------------------------------------| +| =hybrid-mode-default-state= | The default state when opening a new buffer, default is =normal=. Set it to =emacs= for a more emacsy style. | +| =hybrid-mode-enable-hjkl-bindings= | If non nil then packages will configure =h j k l= key bindings for navigation. | +| =hybrid-mode-enable-evilified-state= | If non nil buffer are =evilified= when supported, if nil then =emacs= state is enabled in those buffers instead. | + +Default configuration is: + +#+BEGIN_SRC emacs-lisp +(setq-default dotspacemacs-editing-style '(hybrid :variables + hybrid-mode-enable-evilified-state nil + hybrid-mode-enable-hjkl-bindings nil + hybrid-mode-default-state 'normal) +#+END_SRC -The default state in hybrid mode can be changed by setting the variable -=hybrid-mode-default-state= to a state value, the default is =normal=, set it -to =hybrid= to start in hybrid insert state instead of normal state. +To toggle the hybrid style on and off use ~SPC t E h~ and ~M-m t E h~. When +off the =vim= style is enabled. ** Evilified modes -Some buffers (such as Magit, for using git from within Emacs), are not for -editing text, and provide their own keybindings for certain operations. These -often conflict with Vim bindings. To make such buffers behave Vim-like in a -consistent manner, they use a special state called /evilified/ state. In -evilified state, a handful of keys work as in Evil, namely =/=, =:=, =h=, =j=, -=k=, =l=, =n=, =N=, =v=, =V=, =gg=, =G=, =C-f=, =C-b=, =C-d=, =C-e=, =C-u=, -=C-y= and =C-z=. -All other keys work as intended by the underlying mode. +Some buffers are not for editing text and provide their own keybindings for +certain operations. These often conflict with Vim bindings. To make such buffers +behave more like Vim in a consistent manner, they use a special state called +/evilified/ state. In evilified state, a handful of keys work as in Evil, namely +=/=, =:=, =h=, =j=, =k=, =l=, =n=, =N=, =v=, =V=, =gg=, =G=, =C-f=, =C-b=, +=C-d=, =C-e=, =C-u=, =C-y= and =C-z=. All other keys work as intended by the +underlying mode. Shadowed keys are moved according to the pattern: =a= → =A= → =C-a= → =C-A= @@ -680,19 +721,19 @@ So anything bound to =g= originally will be found on =C-G=, since =g=, =G= and ** States Spacemacs has 10 states: -| State | Color | Description | -|--------------+-------------+------------------------------------------------------------------------------------------------------------| -| normal | orange | like the =normal mode of Vim=, used to execute and combine commands | -| insert | green | like the =insert mode of Vim=, used to actually insert text | -| visual | gray | like the =visual mode of Vim=, used to make text selection | -| motion | purple | exclusive to =Evil=, used to navigate read only buffers | -| emacs | blue | exclusive to =Evil=, using this state is like using a regular Emacs without Vim | -| replace | chocolate | exclusive to =Evil=, overwrites the character under point instead of inserting a new one | -| hybrid | blue | exclusive to Spacemacs, this is like the insert state except that all the emacs key bindings are available | -| evilified | light brown | exclusive to Spacemacs, this is an =emacs state= modified to bring Vim navigation, selection and search. | -| lisp | pink | exclusive to Spacemacs, used to navigate Lisp code and modify it (more [[Editing Lisp code][info]]) | -| iedit | red | exclusive to Spacemacs, used to navigate between multiple regions of text using =iedit= (more [[Replacing text with iedit][info]]) | -| iedit-insert | red | exclusive to Spacemacs, used to replace multiple regions of text using =iedit= (more [[Replacing text with iedit][info]]) | +| State | Default Color | Description | +|--------------+---------------+------------------------------------------------------------------------------------------------------------| +| normal | orange | like the =normal mode of Vim=, used to execute and combine commands | +| insert | green | like the =insert mode of Vim=, used to actually insert text | +| visual | gray | like the =visual mode of Vim=, used to make text selection | +| motion | purple | exclusive to =Evil=, used to navigate read only buffers | +| emacs | blue | exclusive to =Evil=, using this state is like using a regular Emacs without Vim | +| replace | chocolate | exclusive to =Evil=, overwrites the character under point instead of inserting a new one | +| hybrid | blue | exclusive to Spacemacs, this is like the insert state except that all the emacs key bindings are available | +| evilified | light brown | exclusive to Spacemacs, this is an =emacs state= modified to bring Vim navigation, selection and search. | +| lisp | pink | exclusive to Spacemacs, used to navigate Lisp code and modify it (more [[Editing Lisp code][info]]) | +| iedit | red | exclusive to Spacemacs, used to navigate between multiple regions of text using =iedit= (more [[Replacing text with iedit][info]]) | +| iedit-insert | red | exclusive to Spacemacs, used to replace multiple regions of text using =iedit= (more [[Replacing text with iedit][info]]) | Note: Technically speaking there is also the =operator= evil state. From 4f07ff2030aeb3607f78448ed3483462e8e1dd15 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Thu, 17 Mar 2016 22:03:19 -0400 Subject: [PATCH 09/40] First pass to update DOCUMENTATION.org --- doc/DOCUMENTATION.org | 713 ++++++++++++++++++++++-------------------- 1 file changed, 366 insertions(+), 347 deletions(-) diff --git a/doc/DOCUMENTATION.org b/doc/DOCUMENTATION.org index 481f5c40c272a..664715d9b47b1 100644 --- a/doc/DOCUMENTATION.org +++ b/doc/DOCUMENTATION.org @@ -12,20 +12,20 @@ - [[Who can benefit from this?][Who can benefit from this?]] - [[Update and Rollback][Update and Rollback]] - [[Update Spacemacs repository][Update Spacemacs repository]] - - [[Automatic Updates][Automatic Updates]] + - [[Automatic Updates][Automatic Updates]] - [[Updating from the Spacemacs Buffer][Updating from the Spacemacs Buffer]] - [[Updating Manually with git][Updating Manually with git]] - [[Update packages][Update packages]] - [[Configuration layers][Configuration layers]] - [[Purpose][Purpose]] - [[Structure][Structure]] - - [[Packages][Packages]] - - [[Within a layer][Within a layer]] + - [[Configure packages][Configure packages]] + - [[With a layer][With a layer]] - [[Declaration][Declaration]] - [[Initialization][Initialization]] - [[Exclusion][Exclusion]] - [[Without a layer][Without a layer]] - - [[Packages synchronization (Vundle like feature)][Packages synchronization (Vundle like feature)]] + - [[Packages synchronization][Packages synchronization]] - [[Types of configuration layers][Types of configuration layers]] - [[Submitting a configuration layer upstream][Submitting a configuration layer upstream]] - [[Example: Themes Megapack example][Example: Themes Megapack example]] @@ -35,30 +35,30 @@ - [[Using a personal branch][Using a personal branch]] - [[Tips for writing layers][Tips for writing layers]] - [[Dotfile Configuration][Dotfile Configuration]] - - [[Installation][Installation]] - - [[Alternative setup][Alternative setup]] + - [[Dotfile Installation][Dotfile Installation]] + - [[Alternative dotdirectory][Alternative dotdirectory]] - [[Synchronization of dotfile changes][Synchronization of dotfile changes]] - - [[Testing][Testing]] - - [[Content][Content]] + - [[Testing the dotfile][Testing the dotfile]] + - [[Dotfile Contents][Dotfile Contents]] - [[Using configuration layers][Using configuration layers]] - [[Setting configuration layers variables][Setting configuration layers variables]] - [[Excluding packages][Excluding packages]] - - [[Hooks][Hooks]] - - [[Binding keys][Binding keys]] + - [[Configuration functions][Configuration functions]] - [[Custom variables][Custom variables]] - - [[Main principles][Main principles]] + - [[Concepts][Concepts]] - [[Editing Styles][Editing Styles]] - [[Vim][Vim]] - [[Emacs][Emacs]] - [[Hybrid][Hybrid]] - - [[Evilified modes][Evilified modes]] - [[States][States]] + - [[Evilified modes][Evilified modes]] - [[Evil leader][Evil leader]] - [[Universal argument][Universal argument]] - [[Transient-states][Transient-states]] - [[Differences between Vim, Evil and Spacemacs][Differences between Vim, Evil and Spacemacs]] - [[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]] @@ -262,12 +262,16 @@ project. - Emacs users wanting a simple but deep configuration system that greatly *lower the risk of .emacs bankruptcy*. +- *Pair-programming* users thanks to out of the box support for dynamic + switching of editing style. A Vim user and an Emacs user can use the same + Spacemacs comfortably. + * Update and Rollback ** Update Spacemacs repository There are several methods of updating the core files and layer information for Spacemacs. It is recommended to update the packages first, see the next section. -*** Automatic Updates +*** Automatic Updates Spacemacs will automatically check for a new version every startup. When it detects that a new version is available a arrow will appear in the modeline. Click it to update Spacemacs. You must restart Emacs after updating. @@ -275,7 +279,8 @@ Click it to update Spacemacs. You must restart Emacs after updating. Update Button: [[file:img/powerline-update.png]] -*Note*: If you use the =develop= branch of Spacemacs, you must update using git. +*Note*: If you use the =develop= branch of Spacemacs, automatic update is +disabled, you have to update manually using git. *** Updating from the Spacemacs Buffer Use the button labeled "Update Spacemacs" in the Spacemacs buffer. You will be @@ -284,13 +289,16 @@ prompted for the version you would like to use. *Note*: If you use the =develop= branch of Spacemacs, you cannot use this method. *** Updating Manually with git - To update manually close Emacs and update the git repository: #+BEGIN_SRC sh -$ git pull --rebase +$ git pull origin master #+END_SRC +*Note*: The master branch is considered to be immutable in the sense that you +must not modify it by adding your own commit. If you do so you will break the +automatic update of Spacemacs on the master branch. To fork Spacemacs code you +have to use a custom branch that you manage manually. ** Update packages To update the Emacs packages used by Spacemacs press RET (enter) or click on the @@ -299,20 +307,21 @@ Emacs. If you prefer, you can use the command =configuration-layer/update-packages= instead of the button. If anything goes wrong you should be able to rollback the update by pressing -~RET~ or clicking on the =[Rollback Package Update]= link next to the =[Update -Packages]= link and choose a rollback slot (sorted by date). This button uses -the command =configuration-layer/rollback=. +~RET~ or clicking on the =[Rollback Package Update]= link in the startup page +and choose a rollback slot (sorted by date). This button uses the command +=configuration-layer/rollback=. * Configuration layers -*Note*: This is a very simple overview of how layers work. A more extensive -introduction to writing configuration layers can be found [[file:LAYERS.org][here]]. +This section is an overview of layers. A more extensive introduction to writing +configuration layers can be found [[file:LAYERS.org][here]]. ** Purpose Layers help collect related packages together to provide features. For example, the =python= layer provides auto-completion, syntax checking, and repl support for python files. This approach helps keep configuration organized and reduces overhead for the user by keeping them from having to think about what packages -to install +to install. To install all the =python= features the user has just to add the +=python= layer to their dotfile. ** Structure Configuration is organized in layers. Each layer has the following structure: @@ -327,29 +336,31 @@ Configuration is organized in layers. Each layer has the following structure: |__ funcs.el |__ keybindings.el |__ packages.el + |__ packages-funcs.el [] = directory #+END_EXAMPLE Where: -| File | Usage | -|----------------+----------------------------------------------------------------------| -| config.el | Emacs built-in configuration or mandatory configuration | -| funcs.el | Various functions and macros (often used in keybindings.el) | -| keybindings.el | Emacs built-in key bindings or mandatory key bindings | -| packages.el | The list of packages to install and the functions to initialize them | - -=Packages= are =ELPA= packages which can be installed from an =ELPA= compliant -repository, local packages in a layer's =local= folder, or packages that can be -installed from an online source using [[https://github.com/quelpa/quelpa][quelpa]]. - -** Packages -*** Within a layer +| File | Usage | +|-------------------+----------------------------------------------------------------------------------------| +| config.el | Layer configuration (not related to packages contained in this layer) | +| funcs.el | Various functions and macros (not related to packages contained in this layer) | +| keybindings.el | Emacs built-in key bindings or mandatory key bindings | +| packages.el | The list of packages to install and the configuration functions (init, post-init, ...) | +| packages-funcs.el | Additional functions used in the packages.el | + +=Packages= can be: +- =ELPA= packages installed from an =ELPA= compliant repository +- local packages in a layer's =local= folder +- installed from an online source using [[https://github.com/quelpa/quelpa][quelpa]]. + +** Configure packages +*** With a layer **** Declaration -=Packages= are declared in variables and =-packages= where == is -the layer name. They are processed in alphabetical order so sometimes you'll -have to use some =eval-after-load= black magic. +=Packages= are declared in a variable called =-packages= where == +is the name of the layer. Example: @@ -357,12 +368,20 @@ Example: (setq -packages '(package1 package2 ...) #+END_SRC -For details on installing local packages using quelpa or in the layer's =local= -folder, see [[file:LAYERS.org::packages.el][LAYERS]]. +All packages from all layers are processed in alphabetical order so sometimes +you'll have to use some =with-eval-after-load= black magic to configure them +properly. For instance if package =A= depends on =B= then you can configure +=A= with: + +#+BEGIN_SRC emacs-lisp +(with-eval-after-load 'B ...) +#+END_SRC + +For details on installing packages using quelpa or local packages see [[file:LAYERS.org::packages.el][LAYERS]]. **** Initialization To initialize an extension or a package =xxx=, define a function with this -format in or =packages.el=: +format in =packages.el=: #+BEGIN_SRC emacs-lisp (defun /init-xxx () ...body ) @@ -386,15 +405,15 @@ Example: *** Without a layer Sometimes a layer can be an unnecessary overhead, this is the case if you just -want to install a package without any configuration associated to it. A good -example is some niche language where you are only interested syntax +want to install a package with very few configuration associated to it. A good +example is some niche language where you are only interested in syntax highlighting. You can install such packages by adding them to the variable =dotspacemacs-additional-packages= in your dotfile. -If you want to add some configuration for them then consider to create a layer, -or just put the configuration in the =dotspacemacs/user-config= function. +If you want to add some configuration for them then put the configuration in +the =dotspacemacs/user-config= function or consider to create a layer. Example to install =llvm-mode= and =dts-mode=: @@ -402,27 +421,26 @@ Example to install =llvm-mode= and =dts-mode=: (setq dotspacemacs-additional-packages '(llvm-mode dts-mode) #+END_SRC -** Packages synchronization (Vundle like feature) -Spacemacs features a synchronization engine for the ELPA packages. It means -that Spacemacs will auto-install the new packages in =-packages= lists -/and/ auto-delete orphan packages in your =elpa= directory. - -It effectively makes Spacemacs behave like [[https://github.com/gmarik/Vundle.vim][Vundle]]. +** Packages synchronization +Spacemacs will only install the packages that are explicitly used by the user. +A package is considered to be used if its layer is used (i.e. listed in +=dotspacemacs-configuration-layers=). +Any packages that are not used is considered to be orphan and is deleted at +the next startup of Emacs. ** Types of configuration layers -There are three types of configuration layers: - - core (this is the Spacemacs layer) +There are two types of configuration layers: + - distributed layers (in the =layers= directory, those layers are contributions shared + by the community and merged upstream) - private (in the =private= directory, they are ignored by Git) - - contrib (in the =layers= directory, those layers are contributions shared - by the community and merged upstream). ** Submitting a configuration layer upstream -If you decide to provide a =contrib= configuration layer, please check the -contribution guidelines in [[file:../CONTRIBUTING.org][CONTRIBUTING]]. +If you decide to provide a configuration layer, please check the contribution +guidelines first in [[file:../CONTRIBUTING.org][CONTRIBUTING]]. ** Example: Themes Megapack example -This is a simple =contrib= configuration layer listing a bunch of themes, you -can find it [[../layers/themes-megapack][here]]. +This is a simple configuration layer listing a bunch of themes which you can +find [[../layers/themes-megapack][here]]. To install it, just add =themes-megapack= to your =~/.spacemacs= like so: @@ -430,8 +448,8 @@ To install it, just add =themes-megapack= to your =~/.spacemacs= like so: (setq-default dotspacemacs-configuration-layers '(themes-megapack)) #+END_SRC -You have now installed around 100 themes you are free to try with ~SPC T h~ -(helm-themes). +Adding this layer will install around 100 themes, to uninstall them remove the +layer from the =dotspacemacs-configuration-layers= and press ~SPC f e R~. ** Managing private configuration layers Spacemacs configuration system is flexible enough to let you manage your @@ -467,60 +485,56 @@ best make them fit with the Spacemacs philosophy and loading strategy. * Dotfile Configuration User configuration can be stored in your =~/.spacemacs= file. -** Installation -The very first time Spacemacs starts up, it will prompt you to choose your -editing style. Once you choose a style, the =.spacemacs= file will be created -from a template. - -*** Alternative setup -Since v0.104 you have the option of using =~/.spacemacs.d/init.el= for your -dotfile instead of =~/.spacemacs=. If you want to use this option, simply move -=~/.spacemacs= to =~/.spacemacs.d/init.el=. =~/.spacemacs= will always take -priority over =~/.spacemacs.d/init.el=, so =~/.spacemacs= must be missing for -=~/.spacemacs.d/init.el= to be used by spacemacs. +** Dotfile Installation +The very first time Spacemacs starts up, it will ask you several questions +and then install the =.spacemacs= in your =HOME= directory. -If you use this option, everything that applies to =~/.spacemacs= in this guide -will now apply to =~/.spacemacs.d/init.el=. +** Alternative dotdirectory +A dotdirectory =~/.spacemacs.d/= can be used instead of a dotfile. +If you want to use this option, move =~/.spacemacs= to =~/.spacemacs.d/init.el=. It is also possible to override the location of =~/.spacemacs.d/= using the environment variable =SPACEMACSDIR=. Of course you can also use symlinks to change the location of this directory. +*Note:* =~/.spacemacs= will always take priority over =~/.spacemacs.d/init.el=, +so =~/.spacemacs= must not exist for =~/.spacemacs.d/init.el= to be used by +Spacemacs. + ** Synchronization of dotfile changes To apply the modifications made in =~/.spacemacs= press ~SPC f e R~. It will re-execute the Spacemacs initialization process. -*Note*: A synchronization re-executes the functions =dotspacemacs/init= and -=dotspacemacs/user-config=. Depending on the content of this functions you may -encounter some unwanted side effects. For instance if you use a toggle in -=dotspacemac/user-config= to enable some behavior, this behavior will be turned -off whenever the dotfile is re-synchronized. To avoid these side-effects it is -recommended to either use =setq= expressions instead of toggle functions, or to -use the =on= or =off= versions instead (i.e. instead of -=spacemacs/toggle-=, use =spacemacs/toggle--on= or -=spacemacs/toggle--off=). It is possible to /skip/ the execution of -=dotspacemacs/user-config= with the universal argument (~SPC u SPC f e R~). - -** Testing +*Note*: A synchronization re-executes the functions =dotspacemacs/init=, +=dotspacemacs/user-init= and =dotspacemacs/user-config=. +Depending on the content of this functions you may encounter some unwanted side +effects. For instance if you use a toggle in =dotspacemac/user-config= to enable +some behavior, this behavior will be turned off whenever the dotfile is +re-synchronized. To avoid these side-effects it is recommended to either use +=setq= expressions instead of toggle functions, or to use the =on= or =off= +versions instead (i.e. instead of =spacemacs/toggle-=, use +=spacemacs/toggle--on= or =spacemacs/toggle--off=). + +It is possible to /skip/ the execution of =dotspacemacs/user-config= with the +universal argument (~SPC u SPC f e R~). + +** Testing the dotfile You can use the command =SPC SPC dotspacemacs/test-dotfile= to check if your =~/.spacemacs= looks correct. This will check, among other things, whether the declared layers can be found and that the variables have sensible values. These tests are also run automatically when you synchronize with ~SPC f e R~. -** Content +** Dotfile Contents *** Using configuration layers To use a configuration layer, add it to the =dotspacemacs-configuration-layers= variable of your =~/.spacemacs=. -For instance to add the configuration layer of [[Thank you][RMS]]: +For instance [[Thank you][RMS]] can add his private configuration layer like this: #+BEGIN_SRC emacs-lisp (setq-default dotspacemacs-configuration-layers '(rms)) #+END_SRC -If this layer does not exist you can still try another one in [[file:../layers][the =layers= -directory]]. - Configuration layers are expected to be stored in =~/.emacs.d/private= or =~/.emacs.d/layers=. But you are free to keep them somewhere else by declaring additional paths where Spacemacs can look for configuration layers. This is @@ -533,7 +547,7 @@ done by setting the list =dotspacemacs-configuration-layer-path= in your *** Setting configuration layers variables Some configuration layers have configuration variables to enable specific -support. For instance the [[../layers/%2Bsource-control/git][git layer]] has several configuration variables, they +feature. For instance the [[../layers/%2Bsource-control/git][git layer]] has several configuration variables, they can be set directly in the =dotspacemacs-configuration-layers= like this: #+BEGIN_SRC emacs-lisp @@ -557,77 +571,30 @@ For instance to disable the =rainbow-delimiters= package: #+END_SRC When you exclude a package, Spacemacs will automatically delete it for you the -next time you launch Emacs. All the orphan dependencies are as well delete +next time you launch Emacs. All the orphan dependencies are as well deleted automatically. -*** Hooks -Three special functions of the =~/.spacemacs= file can be used to perform -configuration at the beginning and end of Spacemacs loading process. - - - =dotspacemacs/init= is triggered at the very beginning of Spacemacs - loading. You can configure Spacemacs variables here. - - =dotspacemacs/user-init= is also triggered at the very beginning of Spacemacs - loading. User initialization occurs here. - - =dotspacemacs/user-config= is triggered at the very end of Spacemacs - loading. Most user configuration should go here. - -*** Binding keys -Key sequences are bound to commands in Emacs in various keymaps. The most basic -map is the global-map. Setting a key binding the global-map uses the function -=global-set-key= as follows (to the command =forward-char= in this case). - -#+BEGIN_SRC emacs-lisp -(global-set-key (kbd "C-]") 'forward-char) -#+END_SRC - -The =kbd= macro accepts a string describing a key sequence. The global-map is -often shadowed by other maps. For example, evil-mode defines keymaps that target -states (or modes in vim terminology). Here is an example that creates the same -binding as above but only in insert state (=define-key= is a built-in function. -Evil-mode has its own functions for defining keys). - -#+BEGIN_SRC emacs-lisp -(define-key evil-insert-state-map (kbd "C-]") 'forward-char) -#+END_SRC - -Perhaps most importantly for spacemacs is the use of the evil-leader package, -which binds keys to the evil-leader keymap. This is where most of the spacemacs -bindings live. There are two related commands from this package which are used -as follows. - -#+BEGIN_SRC emacs-lisp -(spacemacs/set-leader-keys "C-]" 'forward-char) -(spacemacs/set-leader-keys-for-major-mode 'emacs-lisp-mode "C-]" 'forward-char) -#+END_SRC - -These functions use a macro like =kbd= to translate the key sequences for you. -The second function, =spacemacs/set-leader-keys-for-major-mode=, binds the key -only in the specified mode. The second key binding would not be in effect in -=org-mode= for example. - -Finally, one should be aware of prefix keys. Essentially, all keymaps can be -nested. Nested keymaps are used extensively in spacemacs, and in vanilla Emacs -for that matter. For example, ~SPC a~ points to key bindings for "applications", -like ~SPC ac~ for =calc-dispatch=. Nesting bindings is easy. - -#+BEGIN_SRC emacs-lisp -(spacemacs/declare-prefix "]" "bracket-prefix") -(spacemacs/set-leader-keys "]]" 'double-bracket-command) -#+END_SRC - -The first line declares ~SPC ]~ to be a prefix and the second binds the key -sequence ~SPC ]]~ to the corresponding command. The first line is actually -unnecessary to create the prefix, but it will give your new prefix a name that -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. +*** Configuration functions +Three special functions in the =~/.spacemacs= file can be used to perform +configuration at the beginning and end of Spacemacs loading process: + +- =dotspacemacs/init= is called at the very startup of Spacemacs initialization + before layers configuration. You should not put any user code in there + besides modifying the Spacemacs variable values. +- =dotspacemacs/user-init= is called immediately after =dotspacemacs/init=, + before layer configuration executes. This function is mostly useful for + variables that need to be set before packages are loaded. +- =dotspacemacs/user-config= is called at the very end of Spacemacs + initialization after layers configuration. This is the place where most of + your configurations should be done. Unless it is explicitly specified that a + variable should be set before a package is loaded, you should place you code + here. *** Custom variables Custom variables configuration from =M-x customize-group= which are automatically saved by Emacs are stored at the end of your =~/.spacemacs= file. -* Main principles +* Concepts ** Editing Styles Spacemacs comes with several editing styles which can be switched dynamically providing an easier way to do pair programming, for instance between a Vim user @@ -679,11 +646,12 @@ This style can be tweaked to be more like Emacs or more like Vim depending on the user preferences. The following variable are available to change the style configuration: -| Variable | Description | -|--------------------------------------+------------------------------------------------------------------------------------------------------------------| -| =hybrid-mode-default-state= | The default state when opening a new buffer, default is =normal=. Set it to =emacs= for a more emacsy style. | -| =hybrid-mode-enable-hjkl-bindings= | If non nil then packages will configure =h j k l= key bindings for navigation. | -| =hybrid-mode-enable-evilified-state= | If non nil buffer are =evilified= when supported, if nil then =emacs= state is enabled in those buffers instead. | +- =hybrid-mode-default-state= The default state when opening a new buffer, + default is =normal=. Set it to =emacs= for a more emacsy style. +- =hybrid-mode-enable-hjkl-bindings= If non nil then packages will configure + =h j k l= key bindings for navigation. +- =hybrid-mode-enable-evilified-state= If non nil buffer are =evilified= when + supported, if nil then =emacs= state is enabled in those buffers instead. Default configuration is: @@ -697,6 +665,25 @@ Default configuration is: To toggle the hybrid style on and off use ~SPC t E h~ and ~M-m t E h~. When off the =vim= style is enabled. +** States +Spacemacs has 10 states: + +| State | Default Color | Description | +|--------------+---------------+------------------------------------------------------------------------------------------------------------| +| normal | orange | like the =normal mode of Vim=, used to execute and combine commands | +| insert | green | like the =insert mode of Vim=, used to actually insert text | +| visual | gray | like the =visual mode of Vim=, used to make text selection | +| motion | purple | exclusive to =Evil=, used to navigate read only buffers | +| emacs | blue | exclusive to =Evil=, using this state is like using a regular Emacs without Vim | +| replace | chocolate | exclusive to =Evil=, overwrites the character under point instead of inserting a new one | +| hybrid | blue | exclusive to Spacemacs, this is like the insert state except that all the emacs key bindings are available | +| evilified | light brown | exclusive to Spacemacs, this is an =emacs state= modified to bring Vim navigation, selection and search. | +| lisp | pink | exclusive to Spacemacs, used to navigate Lisp code and modify it (more [[Editing Lisp code][info]]) | +| iedit | red | exclusive to Spacemacs, used to navigate between multiple regions of text using =iedit= (more [[Replacing text with iedit][info]]) | +| iedit-insert | red | exclusive to Spacemacs, used to replace multiple regions of text using =iedit= (more [[Replacing text with iedit][info]]) | + +Note: Technically speaking there is also the =operator= evil state. + ** Evilified modes Some buffers are not for editing text and provide their own keybindings for certain operations. These often conflict with Vim bindings. To make such buffers @@ -718,35 +705,16 @@ In addition to this, =C-g=, being an important escape key in Emacs, is skipped. So anything bound to =g= originally will be found on =C-G=, since =g=, =G= and =C-g= are all reserved. -** States -Spacemacs has 10 states: - -| State | Default Color | Description | -|--------------+---------------+------------------------------------------------------------------------------------------------------------| -| normal | orange | like the =normal mode of Vim=, used to execute and combine commands | -| insert | green | like the =insert mode of Vim=, used to actually insert text | -| visual | gray | like the =visual mode of Vim=, used to make text selection | -| motion | purple | exclusive to =Evil=, used to navigate read only buffers | -| emacs | blue | exclusive to =Evil=, using this state is like using a regular Emacs without Vim | -| replace | chocolate | exclusive to =Evil=, overwrites the character under point instead of inserting a new one | -| hybrid | blue | exclusive to Spacemacs, this is like the insert state except that all the emacs key bindings are available | -| evilified | light brown | exclusive to Spacemacs, this is an =emacs state= modified to bring Vim navigation, selection and search. | -| lisp | pink | exclusive to Spacemacs, used to navigate Lisp code and modify it (more [[Editing Lisp code][info]]) | -| iedit | red | exclusive to Spacemacs, used to navigate between multiple regions of text using =iedit= (more [[Replacing text with iedit][info]]) | -| iedit-insert | red | exclusive to Spacemacs, used to replace multiple regions of text using =iedit= (more [[Replacing text with iedit][info]]) | - -Note: Technically speaking there is also the =operator= evil state. - ** Evil leader -Spacemacs heavily uses the [[https://github.com/cofi/evil-leader][evil-leader]] mode which brings the Vim leader key to -the Emacs world. +Spacemacs uses a leader key to bind almost all its key bindings. This leader key is commonly set to ~​,​~ by Vim users, in Spacemacs the leader -key is set on ~SPC~ (space bar, hence the name =spacemacs=). This key is the +key is set on ~SPC~ (the space bar, hence the name =spacemacs=). This key is the most accessible key on a keyboard and it is pressed with the thumb which is a -good choice to lower the risk of [[http://en.wikipedia.org/wiki/Repetitive_strain_injury][RSI]]. +good choice to lower the risk of [[http://en.wikipedia.org/wiki/Repetitive_strain_injury][RSI]]. It can be customized to any other key +using the variable =dotspacemacs-leader-key= and =dotspacemacs-emacs-leader-key=. -So with Spacemacs there is no need to remap your keyboard modifiers to attempt +With Spacemacs there is no need to remap your keyboard modifiers to attempt to reduce the risk of RSI, every command can be executed very easily while you are in =normal= mode by pressing the ~SPC~ leader key, here are a few examples: @@ -770,13 +738,13 @@ Spacemacs defines a wide variety of =transient-states= (temporary overlay maps) where it makes sense. This prevents one from doing repetitive and tedious presses on the ~SPC~ key. -When a =transient-state= is active, a documentation is displayed in the minibuffer. -Additional information may as well be displayed in the minibuffer. +When a =transient-state= is active, a documentation is displayed in the +minibuffer. Additional information may as well be displayed in the minibuffer. Auto-highlight-symbol transient-state: [[file:img/spacemacs-ahs-transient-state.png]] - [[Text][Text scale transient-state]]: + [[file:img/spacemacs-scale-transient-state.png]] * Differences between Vim, Evil and Spacemacs @@ -784,9 +752,6 @@ Auto-highlight-symbol transient-state: opposite direction in =Vim=, but in Spacemacs it is the major mode specific leader key by default (which can be set on another key binding in the dotfile). -- The ~Y~ key does not yank the whole line. It yanks from the current point to - the end of the line. This is more consistent with the behavior of ~C~ and ~D~ - and is also recommended by the vim documentation. Send a PR to add the differences you found in this section. @@ -795,13 +760,14 @@ There is one obvious visible difference though. It is not between =Evil= and =Vim= but between Spacemacs and [[https://github.com/tpope/vim-surround][vim-surround]]: the =surround= command is on ~S~ in =vim-surround= whereas it is on ~s~ in Spacemacs. -This is something that can surprise some Vim users so let me explain why this is -the case: +This is something that can surprise some Vim users so here are some motivations +behind this change: - ~s~ and ~c~ do the same thing in =visual state=, - ~s~ is only useful to delete /one/ character and add more than one character which is a /very/ narrow use case - ~c~ accept motions and can do everything ~s~ can do in =normal state= - - this is also true for ~r~ but ~r~ is more useful because it stays in =normal state= + (note that this is also true for ~r~ but ~r~ is more useful because it + stays in =normal state=) - =surround= command is just a more powerful command than ~s~. If you are not convinced, then here is the snippet to revert back to the default @@ -818,18 +784,71 @@ Spacemacs ships with the following evil plugins: | Mode | Description | |-------------------------------+----------------------------------------------------------| -| [[https://github.com/cofi/evil-leader][evil-leader]] | vim leader that bring a new layer of keys in normal mode | -| [[https://github.com/cofi/evil-indent-textobject][evil-indent-textobject]] | add text object based on indentation level | -| [[https://github.com/bling/evil-visualstar][evil-visualstar]] | search for current selection with ~*~ | +| [[https://github.com/wcsmith/evil-args][evil-args]] | motions and text objects for arguments | | [[https://github.com/Dewdrops/evil-exchange][evil-exchange]] | port of [[https://github.com/tommcdo/vim-exchange][vim-exchange]] | -| [[https://github.com/timcharper/evil-surround][evil-surround]] | port of [[https://github.com/tpope/vim-surround][vim-surround]] | +| [[https://github.com/cofi/evil-indent-textobject][evil-indent-textobject]] | add text object based on indentation level | | [[https://github.com/redguardtoo/evil-matchit][evil-matchit]] | port of [[http://www.vim.org/scripts/script.php?script_id=39][matchit.vim]] | | [[https://github.com/redguardtoo/evil-nerd-commenter][evil-nerd-commenter]] | port of [[https://github.com/scrooloose/nerdcommenter][nerdcommenter]] | -| [[https://github.com/juanjux/evil-search-highlight-persist][evil-search-highlight-persist]] | emulation of hlsearch behavior | | [[https://github.com/cofi/evil-numbers][evil-numbers]] | like ~C-a~ and ~C-x~ in vim | -| [[https://github.com/wcsmith/evil-args][evil-args]] | motions and text objects for arguments | +| [[https://github.com/juanjux/evil-search-highlight-persist][evil-search-highlight-persist]] | emulation of hlsearch behavior | +| [[https://github.com/timcharper/evil-surround][evil-surround]] | port of [[https://github.com/tpope/vim-surround][vim-surround]] | +| [[https://github.com/bling/evil-visualstar][evil-visualstar]] | search for current selection with ~*~ | | [[https://github.com/jaypei/emacs-neotree][NeoTree]] | mimic [[https://github.com/scrooloose/nerdtree][NERD Tree]] | +* Binding keys +Key sequences are bound to commands in Emacs in various keymaps. The most basic +map is the =global-map=. Setting a key binding in the =global-map= is achieved +with the function =global-set-key=. Example to bind a key to the command +=forward-char=: + +#+BEGIN_SRC emacs-lisp +(global-set-key (kbd "C-]") 'forward-char) +#+END_SRC + +The =kbd= macro accepts a string describing a key sequence. The =global-map= is +often shadowed by other maps. For example, =evil-mode= defines keymaps that +target states (or modes in vim terminology). Here is an example that creates the +same binding as above but only in =insert state= (=define-key= is a built-in +function. =Evil-mode= has its own functions for defining keys). + +#+BEGIN_SRC emacs-lisp +(define-key evil-insert-state-map (kbd "C-]") 'forward-char) +#+END_SRC + +Perhaps most importantly for Spacemacs is the use of the bind-map package to +bind keys behind a leader key. +This is where most of the Spacemacs bindings live. Binding keys behind the +leader key is achieved with the functions =spacemacs/set-leader-keys= and +=spacemacs/set-leader-keys-for-major-mode=, example: + +#+BEGIN_SRC emacs-lisp +(spacemacs/set-leader-keys "C-]" 'forward-char) +(spacemacs/set-leader-keys-for-major-mode 'emacs-lisp-mode "C-]" 'forward-char) +#+END_SRC + +These functions use a macro like =kbd= to translate the key sequences for you. +The second function, =spacemacs/set-leader-keys-for-major-mode=, binds the key +only in the specified mode. The second key binding is active only when the +major mode is =emacs-lisp=. + +Finally, one should be aware of prefix keys. Essentially, all keymaps can be +nested. Nested keymaps are used extensively in spacemacs, and in vanilla Emacs +for that matter. For example, ~SPC a~ points to key bindings for "applications", +like ~SPC a c~ for =calc-dispatch=. Nesting bindings is easy. + +#+BEGIN_SRC emacs-lisp +(spacemacs/declare-prefix "]" "bracket-prefix") +(spacemacs/set-leader-keys "]]" 'double-bracket-command) +#+END_SRC + +The first line declares ~SPC ]~ to be a prefix and the second binds the key +sequence ~SPC ]]~ to the corresponding command. The first line is actually +unnecessary to create the prefix, but it will give your new prefix a name that +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: @@ -963,14 +982,14 @@ and ~T~): | ~SPC t n~ | toggle line numbers | | ~SPC t v~ | toggle smooth scrolling | -| Key Binding | Description | -|-------------+--------------------------------------------------------------| -| ~SPC T ~~ | display =~= in the fringe on empty lines | -| ~SPC T F~ | toggle frame fullscreen | -| ~SPC T f~ | toggle display of the fringe | -| ~SPC T m~ | toggle menu bar | -| ~SPC T M~ | toggle frame maximize | -| ~SPC T t~ | toggle tool bar | +| Key Binding | Description | +|-------------+------------------------------------------------------------------| +| ~SPC T ~~ | display =~= in the fringe on empty lines | +| ~SPC T F~ | toggle frame fullscreen | +| ~SPC T f~ | toggle display of the fringe | +| ~SPC T m~ | toggle menu bar | +| ~SPC T M~ | toggle frame maximize | +| ~SPC T t~ | toggle tool bar | | ~SPC T T~ | toggle frame transparency and enter transparency transient-state | *Note*: These toggles are all available via the =helm-spacemacs-help= interface @@ -1262,31 +1281,31 @@ plugin. Initiate the transient-state with ~M-SPC~ or ~s-M-SPC~ while in a =Helm= buffer. -| Key Binding | Description | -|----------------------+--------------------------------------------------| +| Key Binding | Description | +|----------------------+------------------------------------------------------| | ~M-SPC~ or ~s-M-SPC~ | initiate the transient-state | | ~q~ | quit transient-state | | ~TAB~ | switch to actions page and leave the transient-state | -| ~1~ | execute action 0 | -| ~2~ | execute action 1 | -| ~3~ | execute action 2 | -| ~4~ | execute action 3 | -| ~5~ | execute action 4 | -| ~6~ | execute action 5 | -| ~7~ | execute action 6 | -| ~8~ | execute action 7 | -| ~9~ | execute action 8 | -| ~0~ | execute action 9 | -| ~a~ | switch to actions page | -| ~g~ | go to first candidate | -| ~G~ | go to last candidate | -| ~h~ | go to previous source | -| ~j~ | select next candidate | -| ~k~ | select previous candidate | -| ~l~ | go to next source | -| ~t~ | mark current candidate | -| ~T~ | mark all candidates | -| ~v~ | execute persistent action | +| ~1~ | execute action 0 | +| ~2~ | execute action 1 | +| ~3~ | execute action 2 | +| ~4~ | execute action 3 | +| ~5~ | execute action 4 | +| ~6~ | execute action 5 | +| ~7~ | execute action 6 | +| ~8~ | execute action 7 | +| ~9~ | execute action 8 | +| ~0~ | execute action 9 | +| ~a~ | switch to actions page | +| ~g~ | go to first candidate | +| ~G~ | go to last candidate | +| ~h~ | go to previous source | +| ~j~ | select next candidate | +| ~k~ | select previous candidate | +| ~l~ | go to next source | +| ~t~ | mark current candidate | +| ~T~ | mark all candidates | +| ~v~ | execute persistent action | ** Discovering *** Key bindings @@ -1683,11 +1702,11 @@ the opened buffer and kill them. | Key Binding | Description | |---------------+-----------------------------------------------| -| ~SPC b .~ | initiate transient-state | +| ~SPC b .~ | initiate transient-state | | ~K~ | kill current buffer | | ~n~ | go to next buffer (avoid special buffers) | | ~N~ | go to previous buffer (avoid special buffers) | -| Any other key | leave the transient-state | +| Any other key | leave the transient-state | **** Special Buffers Unlike vim, emacs creates many buffers that most people do not need to see. Some @@ -1781,24 +1800,24 @@ Spacemacs defines a [[Transient-states][transient-state]] for =ido=. Initiate the transient-state with ~M-SPC~ or ~s-M-SPC~ while in an =ido= buffer. -| Key Binding | Description | -|----------------------+-------------------------------------| -| ~M-SPC~ or ~s-M-SPC~ | initiate or leave the transient-state | -| ~?~ | display help | -| ~e~ | open dired | -| ~h~ | delete backward or parent directory | -| ~j~ | next match | -| ~J~ | sub directory | -| ~k~ | previous match | -| ~K~ | parent directory | -| ~l~ | select match | -| ~n~ | next directory in history | -| ~o~ | open in other window | -| ~p~ | previous directory in history | -| ~q~ | quit transient-state | -| ~s~ | open in a new horizontal split | -| ~t~ | open in other frame | -| ~v~ | open in a new vertical split | +| Key Binding | Description | +|----------------------+---------------------------------------| +| ~M-SPC~ or ~s-M-SPC~ | initiate or leave the transient-state | +| ~?~ | display help | +| ~e~ | open dired | +| ~h~ | delete backward or parent directory | +| ~j~ | next match | +| ~J~ | sub directory | +| ~k~ | previous match | +| ~K~ | parent directory | +| ~l~ | select match | +| ~n~ | next directory in history | +| ~o~ | open in other window | +| ~p~ | previous directory in history | +| ~q~ | quit transient-state | +| ~s~ | open in a new horizontal split | +| ~t~ | open in other frame | +| ~v~ | open in a new vertical split | *** NeoTree file tree Spacemacs provides a quick and simple way to navigate in an unknown project @@ -2221,57 +2240,57 @@ adding a major-mode to the variable =spacemacs-indent-sensitive-modes= in your *** Text manipulation commands Text related commands (start with ~x~): - | Key Binding | Description | - |-------------+---------------------------------------------------------------| - | ~SPC x a &~ | align region at & | - | ~SPC x a (~ | align region at ( | - | ~SPC x a )~ | align region at ) | - | ~SPC x a ​,​~ | align region at , | - | ~SPC x a .~ | align region at . (for numeric tables) | - | ~SPC x a :~ | align region at : | - | ~SPC x a ;~ | align region at ; | - | ~SPC x a =~ | align region at = | - | ~SPC x a a~ | align region (or guessed section) using default rules | - | ~SPC x a c~ | align current intendation region using default rules | - | ~SPC x a r~ | align region using user-specified regexp | - | ~SPC x a m~ | align region at arithmetic operators (+-*/) | - | ~SPC x a ¦~ | align region at ¦ | - | ~SPC x c~ | count the number of chars/words/lines in the selection region | - | ~SPC x d w~ | delete trailing whitespaces | - | ~SPC x g l~ | set languages used by translate commands | - | ~SPC x g t~ | translate current word using Google Translate | - | ~SPC x g T~ | reverse source and target languages | - | ~SPC x j c~ | set the justification to center | - | ~SPC x j f~ | set the justification to full | - | ~SPC x j l~ | set the justification to left | - | ~SPC x j n~ | set the justification to none | - | ~SPC x j r~ | set the justification to right | - | ~SPC x J~ | move down a line of text (enter transient-state) | - | ~SPC x K~ | move up a line of text (enter transient-state) | - | ~SPC x l s~ | sort lines | - | ~SPC x l u~ | uniquify lines | - | ~SPC x o~ | use avy to select a link in the frame and open it | - | ~SPC x O~ | use avy to select multiple links in the frame and open them | - | ~SPC x t c~ | swap (transpose) the current character with the previous one | - | ~SPC x t w~ | swap (transpose) the current word with the previous one | - | ~SPC x t l~ | swap (transpose) the current line with the previous one | - | ~SPC x u~ | set the selected text to lower case | - | ~SPC x U~ | set the selected text to upper case | - | ~SPC x w c~ | count the number of occurrences per word in the select region | - | ~SPC x w d~ | show dictionary entry of word from wordnik.com | +| Key Binding | Description | +|-------------+---------------------------------------------------------------| +| ~SPC x a &~ | align region at & | +| ~SPC x a (~ | align region at ( | +| ~SPC x a )~ | align region at ) | +| ~SPC x a ​,​~ | align region at , | +| ~SPC x a .~ | align region at . (for numeric tables) | +| ~SPC x a :~ | align region at : | +| ~SPC x a ;~ | align region at ; | +| ~SPC x a =~ | align region at = | +| ~SPC x a a~ | align region (or guessed section) using default rules | +| ~SPC x a c~ | align current intendation region using default rules | +| ~SPC x a r~ | align region using user-specified regexp | +| ~SPC x a m~ | align region at arithmetic operators (+-*/) | +| ~SPC x a ¦~ | align region at ¦ | +| ~SPC x c~ | count the number of chars/words/lines in the selection region | +| ~SPC x d w~ | delete trailing whitespaces | +| ~SPC x g l~ | set languages used by translate commands | +| ~SPC x g t~ | translate current word using Google Translate | +| ~SPC x g T~ | reverse source and target languages | +| ~SPC x j c~ | set the justification to center | +| ~SPC x j f~ | set the justification to full | +| ~SPC x j l~ | set the justification to left | +| ~SPC x j n~ | set the justification to none | +| ~SPC x j r~ | set the justification to right | +| ~SPC x J~ | move down a line of text (enter transient-state) | +| ~SPC x K~ | move up a line of text (enter transient-state) | +| ~SPC x l s~ | sort lines | +| ~SPC x l u~ | uniquify lines | +| ~SPC x o~ | use avy to select a link in the frame and open it | +| ~SPC x O~ | use avy to select multiple links in the frame and open them | +| ~SPC x t c~ | swap (transpose) the current character with the previous one | +| ~SPC x t w~ | swap (transpose) the current word with the previous one | +| ~SPC x t l~ | swap (transpose) the current line with the previous one | +| ~SPC x u~ | set the selected text to lower case | +| ~SPC x U~ | set the selected text to upper case | +| ~SPC x w c~ | count the number of occurrences per word in the select region | +| ~SPC x w d~ | show dictionary entry of word from wordnik.com | *** Text insertion commands Text insertion commands (start with ~i~): - | Key binding | Description | - |-------------+-----------------------------------------------------------------------| - | ~SPC i l l~ | insert lorem-ipsum list | - | ~SPC i l p~ | insert lorem-ipsum paragraph | - | ~SPC i l s~ | insert lorem-ipsum sentence | - | ~SPC i u~ | Search for Unicode characters and insert them into the active buffer. | - | ~SPC i U 1~ | insert UUIDv1 (use universal argument to insert with CID format) | - | ~SPC i U 4~ | insert UUIDv4 (use universal argument to insert with CID format) | - | ~SPC i U U~ | insert UUIDv4 (use universal argument to insert with CID format) | +| Key binding | Description | +|-------------+-----------------------------------------------------------------------| +| ~SPC i l l~ | insert lorem-ipsum list | +| ~SPC i l p~ | insert lorem-ipsum paragraph | +| ~SPC i l s~ | insert lorem-ipsum sentence | +| ~SPC i u~ | Search for Unicode characters and insert them into the active buffer. | +| ~SPC i U 1~ | insert UUIDv1 (use universal argument to insert with CID format) | +| ~SPC i U 4~ | insert UUIDv4 (use universal argument to insert with CID format) | +| ~SPC i U U~ | insert UUIDv4 (use universal argument to insert with CID format) | *** Smartparens Strict mode [[https://github.com/Fuco1/smartparens][Smartparens]] comes with a strict mode which prevents deletion of parenthesis if @@ -2493,17 +2512,17 @@ It is possible to batch rename files in a directory using =wdired= from an *** Commenting Comments are handled by [[https://github.com/redguardtoo/evil-nerd-commenter][evil-nerd-commenter]], it's bound to the following keys. - | Key Binding | Description | - |-------------+---------------------------| - | ~SPC ;~ | comment operator | - | ~SPC c l~ | comment lines | - | ~SPC c L~ | invert comment lines | - | ~SPC c p~ | comment paragraphs | - | ~SPC c P~ | invert comment paragraphs | - | ~SPC c t~ | comment to line | - | ~SPC c T~ | invert comment to line | - | ~SPC c y~ | comment and yank | - | ~SPC c Y~ | invert comment and yank | +| Key Binding | Description | +|-------------+---------------------------| +| ~SPC ;~ | comment operator | +| ~SPC c l~ | comment lines | +| ~SPC c L~ | invert comment lines | +| ~SPC c p~ | comment paragraphs | +| ~SPC c P~ | invert comment paragraphs | +| ~SPC c t~ | comment to line | +| ~SPC c T~ | invert comment to line | +| ~SPC c y~ | comment and yank | +| ~SPC c Y~ | invert comment and yank | *Tips:* To comment efficiently a block of line use the combo ~SPC ; SPC y~ @@ -2617,36 +2636,36 @@ To search in a project see [[Searching in a project][project searching]]. =projectile= commands start with p: - | Key Binding | Description | - |-------------+---------------------------------------------------------| - | ~SPC p '​~ | open a shell in project's root (with the =shell= layer) | - | ~SPC p !~ | run shell command in project's root | - | ~SPC p &~ | run async shell command in project's root | - | ~SPC p a~ | toggle between implementation and test | - | ~SPC p b~ | switch to project buffer | - | ~SPC p c~ | compile project using =projectile= | - | ~SPC p d~ | find directory | - | ~SPC p D~ | open project root in =dired= | - | ~SPC p f~ | find file | - | ~SPC p F~ | find file based on path around point | - | ~SPC p G~ | regenerate the project's =etags= / =gtags= | - | ~SPC p h~ | find file using =helm= | - | ~SPC p I~ | invalidate the projectile cache | - | ~SPC p k~ | kill all project buffers | - | ~SPC p o~ | run =multi-occur= | - | ~SPC p p~ | switch project | - | ~SPC p r~ | open a recent file | - | ~SPC p R~ | replace a string | - | ~SPC p s~ | see [[Searching in a project][search in project]] | - | ~SPC p t~ | open =NeoTree= in =projectile= root | - | ~SPC p T~ | find test files | - | ~SPC p v~ | open project root in =vc-dir= or =magit= | - | ~SPC p y~ | find tags | - | ~SPC /~ | search in project with the best search tool available | - | ~SPC s a p~ | run =ag= | - | ~SPC s g p~ | run =grep= | - | ~SPC s k p~ | run =ack= | - | ~SPC s t p~ | run =pt= | +| Key Binding | Description | +|-------------+---------------------------------------------------------| +| ~SPC p '​~ | open a shell in project's root (with the =shell= layer) | +| ~SPC p !~ | run shell command in project's root | +| ~SPC p &~ | run async shell command in project's root | +| ~SPC p a~ | toggle between implementation and test | +| ~SPC p b~ | switch to project buffer | +| ~SPC p c~ | compile project using =projectile= | +| ~SPC p d~ | find directory | +| ~SPC p D~ | open project root in =dired= | +| ~SPC p f~ | find file | +| ~SPC p F~ | find file based on path around point | +| ~SPC p G~ | regenerate the project's =etags= / =gtags= | +| ~SPC p h~ | find file using =helm= | +| ~SPC p I~ | invalidate the projectile cache | +| ~SPC p k~ | kill all project buffers | +| ~SPC p o~ | run =multi-occur= | +| ~SPC p p~ | switch project | +| ~SPC p r~ | open a recent file | +| ~SPC p R~ | replace a string | +| ~SPC p s~ | see [[Searching in a project][search in project]] | +| ~SPC p t~ | open =NeoTree= in =projectile= root | +| ~SPC p T~ | find test files | +| ~SPC p v~ | open project root in =vc-dir= or =magit= | +| ~SPC p y~ | find tags | +| ~SPC /~ | search in project with the best search tool available | +| ~SPC s a p~ | run =ag= | +| ~SPC s g p~ | run =grep= | +| ~SPC s k p~ | run =ack= | +| ~SPC s t p~ | run =pt= | *Note for Windows Users*: To enable fast indexing the GNU ~find~ or Cygwin ~find~ must be in your ~PATH~. @@ -2667,15 +2686,15 @@ only performed at save time by default. Errors management commands (start with ~e~): - | Key Binding | Description | - |-------------+-----------------------------------------------------------------------| - | ~SPC t s~ | toggle flycheck | - | ~SPC e c~ | clear all errors | - | ~SPC e h~ | describe a flycheck checker | - | ~SPC e l~ | toggle the display of the =flycheck= list of errors/warnings | - | ~SPC e n~ | go to the next error | - | ~SPC e p~ | go to the previous error | - | ~SPC e v~ | verify flycheck setup (useful to debug 3rd party tools configuration) | +| Key Binding | Description | +|-------------+-----------------------------------------------------------------------| +| ~SPC t s~ | toggle flycheck | +| ~SPC e c~ | clear all errors | +| ~SPC e h~ | describe a flycheck checker | +| ~SPC e l~ | toggle the display of the =flycheck= list of errors/warnings | +| ~SPC e n~ | go to the next error | +| ~SPC e p~ | go to the previous error | +| ~SPC e v~ | verify flycheck setup (useful to debug 3rd party tools configuration) | Custom fringe bitmaps: From bc31eb48784f8af731b53c4f258244517b76a32f Mon Sep 17 00:00:00 2001 From: Sylvain Benner Date: Fri, 18 Mar 2016 17:03:30 -0400 Subject: [PATCH 10/40] FAQ windows: Add GDIPP as an alternative for MacType --- doc/FAQ.org | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/FAQ.org b/doc/FAQ.org index 3cf1619b20fc7..4f7b85bab1607 100644 --- a/doc/FAQ.org +++ b/doc/FAQ.org @@ -448,8 +448,9 @@ arguments of the =ag= program. * Windows ** Why do the fonts look crappy on Windows? -You can install [[https://code.google.com/p/mactype/][MacType]] on Windows to get very nice looking fonts. It is also -recommended to disable smooth scrolling on Windows. +You can install [[https://code.google.com/archive/p/gdipp/][GDIPP]] (simplest) or [[https://code.google.com/p/mactype/][MacType]] (more complete) on Windows to get +very nice looking fonts. It is also recommended to disable smooth scrolling on +Windows. ** Why is there no Spacemacs logo in the startup buffer? A GUI build of emacs supporting image display is required. You can follow the From c3bb8a609e04b41d2a19d15e60a6543811f9a031 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Sat, 19 Mar 2016 18:24:59 -0400 Subject: [PATCH 11/40] core: add overriding rules for :toggle :toggle is ignored if not used in the owner of a package, it can be overridden by new owners or by the dotfile. --- core/core-configuration-layer.el | 26 ++++-- tests/core/core-configuration-layer-utest.el | 91 ++++++++++++++++++++ 2 files changed, 108 insertions(+), 9 deletions(-) diff --git a/core/core-configuration-layer.el b/core/core-configuration-layer.el index 8a29527fa6b94..71b27a28fc50b 100644 --- a/core/core-configuration-layer.el +++ b/core/core-configuration-layer.el @@ -369,17 +369,18 @@ layer directory." "Make `cfgl-layer' objects from the passed layer SYMBOLS." (delq nil (mapcar 'configuration-layer/make-layer symbols))) -(defun configuration-layer/make-package (pkg &optional obj) +(defun configuration-layer/make-package (pkg &optional obj togglep) "Return a `cfgl-package' object based on PKG. If OBJ is non nil then copy PKG properties into OBJ, otherwise create a new object. -Properties that can be copied are `:location', `:step' and `:excluded'." +Properties that can be copied are `:location', `:step' and `:excluded'. +If TOGGLEP is non nil then `:toggle' parameter is ignored." (let* ((name-sym (if (listp pkg) (car pkg) pkg)) (name-str (symbol-name name-sym)) (location (when (listp pkg) (plist-get (cdr pkg) :location))) (step (when (listp pkg) (plist-get (cdr pkg) :step))) (excluded (when (listp pkg) (plist-get (cdr pkg) :excluded))) - (toggle (when (listp pkg) (plist-get (cdr pkg) :toggle))) + (toggle (when (and togglep (listp pkg)) (plist-get (cdr pkg) :toggle))) (protected (when (listp pkg) (plist-get (cdr pkg) :protected))) (copyp (not (null obj))) (obj (if obj obj (cfgl-package name-str :name name-sym)))) @@ -602,14 +603,15 @@ Properties that can be copied are `:location', `:step' and `:excluded'." name pkg-name))) (post-init-func (intern (format "%S/post-init-%S" name pkg-name))) + (ownerp (fboundp init-func)) (obj (object-assoc pkg-name :name result))) (cl-pushnew pkg-name (oref layer :packages)) (if obj - (setq obj (configuration-layer/make-package pkg obj)) - (setq obj (configuration-layer/make-package pkg)) + (setq obj (configuration-layer/make-package pkg obj ownerp)) + (setq obj (configuration-layer/make-package pkg nil ownerp)) (push obj result)) (oset obj :lazy-install lazy-install) - (when (fboundp init-func) + (when ownerp ;; last owner wins over the previous one, ;; still warn about mutliple owners (when (oref obj :owner) @@ -617,8 +619,14 @@ Properties that can be copied are `:location', `:step' and `:excluded'." (format (concat "More than one init function found for " "package %S. Previous owner was %S, " "replacing it with layer %S.") - pkg (oref obj :owner) name))) + pkg-name (oref obj :owner) name))) (oset obj :owner name)) + (when (and (not ownerp) + (listp pkg) + (spacemacs/mplist-get pkg :toggle)) + (spacemacs-buffer/warning + (format (concat "Ignoring :toggle for package %s because " + "layer %S does not own it.") pkg-name name))) (when (fboundp pre-init-func) (push name (oref obj :pre-layers))) (when (fboundp post-init-func) @@ -629,8 +637,8 @@ Properties that can be copied are `:location', `:step' and `:excluded'." (let* ((pkg-name (if (listp pkg) (car pkg) pkg)) (obj (object-assoc pkg-name :name result))) (if obj - (setq obj (configuration-layer/make-package pkg obj)) - (setq obj (configuration-layer/make-package pkg)) + (setq obj (configuration-layer/make-package pkg obj t)) + (setq obj (configuration-layer/make-package pkg nil t)) (push obj result) (oset obj :owner 'dotfile)))) (dolist (xpkg dotspacemacs-excluded-packages) diff --git a/tests/core/core-configuration-layer-utest.el b/tests/core/core-configuration-layer-utest.el index 18b562aa805cb..4615b691dfab2 100644 --- a/tests/core/core-configuration-layer-utest.el +++ b/tests/core/core-configuration-layer-utest.el @@ -33,6 +33,8 @@ ;; class cfgl-package ;; --------------------------------------------------------------------------- +;; method: cfgl-package-enabledp + (ert-deftest test-cfgl-package-enabledp--default-toggle-eval-non-nil () (let ((pkg (cfgl-package "testpkg" :name 'testpkg))) (should (cfgl-package-enabledp pkg)))) @@ -537,6 +539,95 @@ (should (equal (list (cfgl-package "pkg1" :name 'pkg1 :owner 'layer18 :excluded t)) (configuration-layer/get-packages layers)))))) +(ert-deftest test-get-packages--owner-layer-can-define-toggle () + (let* ((layer19 (cfgl-layer "layer19" :name 'layer19 :dir "/path")) + (layers (list layer19)) + (layer19-packages '((pkg1 :toggle (foo-toggle)))) + (mocker-mock-default-record-cls 'mocker-stub-record)) + (defun layer19/init-pkg1 nil) + (mocker-let + ((file-exists-p (f) ((:output t :occur 1))) + (configuration-layer/layer-usedp (l) ((:output t :occur 1)))) + (should (equal (list (cfgl-package "pkg1" + :name 'pkg1 + :owner 'layer19 + :toggle '(foo-toggle))) + (configuration-layer/get-packages layers)))))) + +(ert-deftest test-get-packages--not-owner-layer-cannot-define-toggle () + (let* ((layer20 (cfgl-layer "layer20" :name 'layer20 :dir "/path")) + (layer21 (cfgl-layer "layer21" :name 'layer21 :dir "/path")) + (layers (list layer20 layer21)) + (layer20-packages '((pkg1))) + (layer21-packages '((pkg1 :toggle (foo-toggle)))) + (mocker-mock-default-record-cls 'mocker-stub-record)) + (defun layer20/init-pkg1 nil) + (defun layer21/post-init-pkg1 nil) + (mocker-let + ((file-exists-p (f) ((:output t :occur 2))) + (spacemacs-buffer/warning (msg &rest args) ((:output nil :occur 1))) + (configuration-layer/layer-usedp (l) ((:output t :occur 2)))) + (should (equal (list (cfgl-package "pkg1" + :name 'pkg1 + :owner 'layer20 + :post-layers '(layer21) + :toggle t)) + (configuration-layer/get-packages layers)))))) + +(ert-deftest test-get-packages--new-owner-layer-can-override-toggle () + (let* ((layer22 (cfgl-layer "layer22" :name 'layer22 :dir "/path")) + (layer23 (cfgl-layer "layer23" :name 'layer23 :dir "/path")) + (layers (list layer22 layer23)) + (layer22-packages '((pkg1 :toggle (foo-toggle)))) + (layer23-packages '((pkg1 :toggle (bar-toggle)))) + (mocker-mock-default-record-cls 'mocker-stub-record)) + (defun layer22/init-pkg1 nil) + (defun layer23/init-pkg1 nil) + (mocker-let + ((file-exists-p (f) ((:output t :occur 2))) + (spacemacs-buffer/warning (msg &rest args) ((:output nil :occur 1))) + (configuration-layer/layer-usedp (l) ((:output t :occur 2)))) + (should (equal (list (cfgl-package "pkg1" + :name 'pkg1 + :owner 'layer23 + :toggle '(bar-toggle))) + (configuration-layer/get-packages layers)))))) + +(ert-deftest test-get-packages--dotfile-additional-pkg-can-override-toggle () + (let* ((layer22 (cfgl-layer "layer22" :name 'layer22 :dir "/path")) + (layer23 (cfgl-layer "layer23" :name 'layer23 :dir "/path")) + (layers (list layer22 layer23)) + (layer22-packages '((pkg1 :toggle (foo-toggle)))) + (layer23-packages '((pkg1 :toggle (bar-toggle)))) + (mocker-mock-default-record-cls 'mocker-stub-record)) + (defun layer22/init-pkg1 nil) + (defun layer23/init-pkg1 nil) + (mocker-let + ((file-exists-p (f) ((:output t :occur 2))) + (spacemacs-buffer/warning (msg &rest args) ((:output nil :occur 1))) + (configuration-layer/layer-usedp (l) ((:output t :occur 2)))) + (should (equal (list (cfgl-package "pkg1" + :name 'pkg1 + :owner 'layer23 + :toggle '(bar-toggle))) + (configuration-layer/get-packages layers)))))) + +(ert-deftest test-get-packages--dotfile-additional-pkg-can-override-toggle () + (let* ((layer24 (cfgl-layer "layer24" :name 'layer24 :dir "/path")) + (layers (list layer24)) + (layer24-packages '((pkg1 :toggle (foo-toggle)))) + (dotspacemacs-additional-packages '((pkg1 :toggle (bar-toggle)))) + (mocker-mock-default-record-cls 'mocker-stub-record)) + (defun layer24/init-pkg1 nil) + (mocker-let + ((file-exists-p (f) ((:output t :occur 1))) + (configuration-layer/layer-usedp (l) ((:output t :occur 1)))) + (should (equal (list (cfgl-package "pkg1" + :name 'pkg1 + :owner 'layer24 + :toggle '(bar-toggle))) + (configuration-layer/get-packages layers t)))))) + ;; --------------------------------------------------------------------------- ;; configuration-layer//configure-package ;; --------------------------------------------------------------------------- From c9bcb65fa14682577eaff33191b04f42bc0d77d4 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Sat, 19 Mar 2016 21:52:50 -0400 Subject: [PATCH 12/40] README.md: change links to spacemacs.org --- README.md | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index c8b28e4a97a46..d5a0f627aa79c 100644 --- a/README.md +++ b/README.md @@ -3,21 +3,21 @@ ***

Spacemacs

-philosophy +philosophy | -goals +goals | -for whom? +for whom? | -screenshots +screenshots | -documentation +documentation | contribute | -achievements +achievements | -FAQ +FAQ

***

@@ -134,8 +134,9 @@ XEmacs is an old fork of Emacs. The X in its name is unrelated to X11. Both Emacs and XEmacs have graphical support. **Note:** Ubuntu LTS 12.04 and 14.04 repositories have only Emacs 24.3 -available. You are advised to [build from source](https://www.gnu.org/software/emacs/manual/html_node/efaq/Installing-Emacs.html) Emacs 24.4 or greater, as most packages require -this version. The same may be true for other distributions as well. +available. You are advised to [build from source][build_source] Emacs 24.4 or +greater, as most packages require this version. The same may be true for other +distributions as well. ### OS X @@ -372,13 +373,13 @@ Thank you! [Twitter]: http://i.imgur.com/tXSoThF.png [CONTRIBUTING.org]: CONTRIBUTING.org -[CONVENTIONS.org]: doc/CONVENTIONS.org -[DOCUMENTATION.org]: doc/DOCUMENTATION.org -[QUICK_START.org]: doc/QUICK_START.org -[FAQ.org]: doc/FAQ.org -[VIMUSERS.org]: doc/VIMUSERS.org -[dotfile]: doc/DOCUMENTATION.org#dotfile-configuration -[troubleshoot]: doc/DOCUMENTATION.org#troubleshoot +[CONVENTIONS.org]: http://spacemacs.org/doc/CONVENTIONS.org +[DOCUMENTATION.org]: http://spacemacs.org/doc/DOCUMENTATION.org +[QUICK_START.org]: http://spacemacs.org/doc/QUICK_START.org +[FAQ.org]: http://spacemacs.org/doc/FAQ.org +[VIMUSERS.org]: http://spacemacs.org/doc/VIMUSERS.org +[dotfile]: http://spacemacs.org/doc/DOCUMENTATION.org#dotfile-configuration +[troubleshoot]: http://spacemacs.org/doc/DOCUMENTATION.org#troubleshoot [osx layer]: layers/osx/README.org [Gitter Chat]: https://gitter.im/syl20bnr/spacemacs [Gitter Chat IRC server]: https://irc.gitter.im/ @@ -395,4 +396,5 @@ Thank you! [Stack Exchange]: http://emacs.stackexchange.com/questions/tagged/spacemacs [Reddit]: https://www.reddit.com/r/spacemacs [quote01]: https://gitter.im/syl20bnr/spacemacs?at=568e627a0cdaaa62045a7df6 +[build_source]: https://www.gnu.org/software/emacs/manual/html_node/efaq/Installing-Emacs.html [Bountysource]: https://salt.bountysource.com/teams/spacemacs From 744cd0f9b7bb5cd1447ce75ab84514cd08edb0ff Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Sat, 19 Mar 2016 22:01:09 -0400 Subject: [PATCH 13/40] README.md: fix links to spacemacs.org Links to documentation sections can easily break since they are indexed by their order (i.e. #orgheadline8) --- README.md | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index d5a0f627aa79c..9d530650a36c7 100644 --- a/README.md +++ b/README.md @@ -3,21 +3,19 @@ ***

Spacemacs

-philosophy +philosophy | -goals +for whom? | -for whom? +screenshots | -screenshots -| -documentation +documentation | contribute | -achievements +achievements | -FAQ +FAQ

***

@@ -228,8 +226,7 @@ For efficient searches we recommend to install `pt` ([the platinum searcher][]). 4. Restart Emacs to complete the installation. -If the mode-line turns red then be sure to visit the -[troubleshooting][troubleshoot] guide and consult the [FAQ][FAQ.org]. +If the mode-line turns red then be sure to consult the [FAQ][FAQ.org]. ## Installation alongside another configuration @@ -373,14 +370,13 @@ Thank you! [Twitter]: http://i.imgur.com/tXSoThF.png [CONTRIBUTING.org]: CONTRIBUTING.org -[CONVENTIONS.org]: http://spacemacs.org/doc/CONVENTIONS.org -[DOCUMENTATION.org]: http://spacemacs.org/doc/DOCUMENTATION.org -[QUICK_START.org]: http://spacemacs.org/doc/QUICK_START.org -[FAQ.org]: http://spacemacs.org/doc/FAQ.org -[VIMUSERS.org]: http://spacemacs.org/doc/VIMUSERS.org -[dotfile]: http://spacemacs.org/doc/DOCUMENTATION.org#dotfile-configuration -[troubleshoot]: http://spacemacs.org/doc/DOCUMENTATION.org#troubleshoot -[osx layer]: layers/osx/README.org +[CONVENTIONS.org]: http://spacemacs.org/doc/CONVENTIONS +[DOCUMENTATION.org]: http://spacemacs.org/doc/DOCUMENTATION +[QUICK_START.org]: http://spacemacs.org/doc/QUICK_START +[FAQ.org]: http://spacemacs.org/doc/FAQ +[VIMUSERS.org]: http://spacemacs.org/doc/VIMUSERS +[dotfile]: http://spacemacs.org/doc/DOCUMENTATION#orgheadline45 +[osx layer]: http://spacemacs.org/layers/osx/README [Gitter Chat]: https://gitter.im/syl20bnr/spacemacs [Gitter Chat IRC server]: https://irc.gitter.im/ [emacs-mac-port]: https://github.com/railwaycat/homebrew-emacsmacport From 944960daf836f333d0d04a518848371bdabd64d2 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Sun, 20 Mar 2016 21:48:06 -0400 Subject: [PATCH 14/40] 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 664715d9b47b1..ab7718a37730c 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 21d5a657a0b0d..ab4b4cf265f12 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 0000000000000..fb55dbe68d995 --- /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 0000000000000..8a7c7ce54400a --- /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 d03ba1d304e2b..0000000000000 --- 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 dfb2ff4cbd910..0000000000000 --- 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 dbd026b4ec44c..0000000000000 --- 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 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 KMNUMnLSTY%89Ltp diff --git a/layers/+window-management/eyebrowse/packages.el b/layers/+window-management/eyebrowse/packages.el deleted file mode 100644 index 1c833cb6c8147..0000000000000 --- 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 25864557a808f..0000000000000 --- 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 59436e5f6002c..0000000000000 --- 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 1e5d252b77d67..0000000000000 --- 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 858fed4379c41..0000000000000 --- 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)) From eaddd19e71e2862519cee1b7f9d135a9c339b079 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Sun, 20 Mar 2016 22:00:45 -0400 Subject: [PATCH 15/40] Update layouts and workspaces documentation --- doc/DOCUMENTATION.org | 48 +++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/doc/DOCUMENTATION.org b/doc/DOCUMENTATION.org index ab7718a37730c..a37ae1cefd3fa 100644 --- a/doc/DOCUMENTATION.org +++ b/doc/DOCUMENTATION.org @@ -1250,10 +1250,18 @@ Setting the variable =dotspacemacs-auto-resume-layouts= to =t= will automatically resume the last saved layouts. *** Layout key bindings +The key bindings are registered in a transient-state. The docstring of the +transient-state displays the existing layouts and the currently active +layout has square brackets. Pressing a layout number will activate it (or +create a new one) and exit the transient-state. It is possible to just preview a +layout with ~Ctrl-~. Pressing ~TAB~ will activate the previously +selected layout. + +Press ~?~ to toggle the full help. | Key Binding | Description | |-------------------+------------------------------------------------------------| -| ~SPC l~ | activate the transient- state | +| ~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 | @@ -1281,34 +1289,30 @@ automatically resume the last saved layouts. | ~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. +Workspaces are 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. +Any new layout comes with a default workspace which is the workspace 1. +Switching to a workspace that does not exist in the current layout will create a +new one. For instance at startup you can press ~SPC l w 2~ to create the +workspace 2 in the =default= layout. + +When created a workspace is anonymous, you can give them a name with +~SPC l w R~. + +*** Workspace key bindings 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~. +selected workspace. -*** 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: +Press ~?~ to toggle the full help. | Key Binding | Description | |-------------------+-------------------------------------------------------------| @@ -1323,6 +1327,14 @@ Transient state key bindings: | ~R~ | set a tag to the current workspace | | ~w~ | switched to tagged workspace | +There are also some handy globally available key bindings related to workspaces: + +| Key Binding | Description | +|-------------+--------------------------------------| +| ~gt~ | go to next workspace | +| ~gT~ | got to previous workspace | +| ~SPC b W~ | go to workspace and window by buffer | + * Commands ** Vim key bindings Spacemacs is based on =Vim= modal user interface to navigate and edit text. If From f801ceebe771d7e7bb5e7e9f08e2bca65bbd68a3 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Sun, 20 Mar 2016 22:08:49 -0400 Subject: [PATCH 16/40] Doc: transient-state => transient state --- doc/DOCUMENTATION.org | 168 +++++++++++++++++++++--------------------- 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/doc/DOCUMENTATION.org b/doc/DOCUMENTATION.org index a37ae1cefd3fa..d5d64ac2b6e24 100644 --- a/doc/DOCUMENTATION.org +++ b/doc/DOCUMENTATION.org @@ -91,7 +91,7 @@ - [[Helm][Helm]] - [[C-z and Tab switch][C-z and Tab switch]] - [[Helm focus][Helm focus]] - - [[Helm transient-state][Helm transient-state]] + - [[Helm transient state][Helm transient state]] - [[Discovering][Discovering]] - [[Key bindings][Key bindings]] - [[Which-key][Which-key]] @@ -112,17 +112,17 @@ - [[Joining and splitting][Joining and splitting]] - [[Window manipulation][Window manipulation]] - [[Window manipulation key bindings][Window manipulation key bindings]] - - [[Window manipulation transient-state][Window manipulation transient-state]] + - [[Window manipulation transient state][Window manipulation transient state]] - [[Golden ratio][Golden ratio]] - [[Buffers and Files][Buffers and Files]] - [[Buffers manipulation key bindings][Buffers manipulation key bindings]] - - [[Buffers manipulation transient-state][Buffers manipulation transient-state]] + - [[Buffers manipulation transient state][Buffers manipulation transient state]] - [[Special Buffers][Special Buffers]] - [[Files manipulations key bindings][Files manipulations key bindings]] - [[Emacs and Spacemacs files][Emacs and Spacemacs files]] - [[Browsing files with Helm][Browsing files with Helm]] - [[Ido][Ido]] - - [[Ido transient-state][Ido transient-state]] + - [[Ido transient state][Ido transient state]] - [[NeoTree file tree][NeoTree file tree]] - [[NeoTree navigation][NeoTree navigation]] - [[Opening files with NeoTree][Opening files with NeoTree]] @@ -742,16 +742,16 @@ to ~SPC u~. pressing ~RETURN~. For instance: ~SPC SPC org-reload C-u RET~ ** Transient-states -Spacemacs defines a wide variety of =transient-states= (temporary overlay maps) +Spacemacs defines a wide variety of =transient states= (temporary overlay maps) where it makes sense. This prevents one from doing repetitive and tedious presses on the ~SPC~ key. -When a =transient-state= is active, a documentation is displayed in the +When a =transient state= is active, a documentation is displayed in the minibuffer. Additional information may as well be displayed in the minibuffer. -Auto-highlight-symbol transient-state: +Auto-highlight-symbol transient state: [[file:img/spacemacs-ahs-transient-state.png]] -[[Text][Text scale transient-state]]: +[[Text][Text scale transient state]]: [[file:img/spacemacs-scale-transient-state.png]] @@ -991,7 +991,7 @@ and ~T~): | ~SPC T m~ | toggle menu bar | | ~SPC T M~ | toggle frame maximize | | ~SPC T t~ | toggle tool bar | -| ~SPC T T~ | toggle frame transparency and enter transparency transient-state | +| ~SPC T T~ | toggle frame transparency and enter transparency transient state | *Note*: These toggles are all available via the =helm-spacemacs-help= interface (press ~SPC h SPC~ to display the =helm-spacemacs-help= buffer). @@ -1250,10 +1250,10 @@ Setting the variable =dotspacemacs-auto-resume-layouts= to =t= will automatically resume the last saved layouts. *** Layout key bindings -The key bindings are registered in a transient-state. The docstring of the -transient-state displays the existing layouts and the currently active +The key bindings are registered in a transient state. The docstring of the +transient state displays the existing layouts and the currently active layout has square brackets. Pressing a layout number will activate it (or -create a new one) and exit the transient-state. It is possible to just preview a +create a new one) and exit the transient state. It is possible to just preview a layout with ~Ctrl-~. Pressing ~TAB~ will activate the previously selected layout. @@ -1264,7 +1264,7 @@ Press ~?~ to toggle the full help. | ~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 | +| ~[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 | @@ -1284,7 +1284,7 @@ Press ~?~ to toggle the full help. | ~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) | +| ~w~ | workspaces transient state (needs eyebrowse layer enabled) | | ~x~ | kill current layout with its buffers | | ~X~ | kill other layouts with their buffers | @@ -1305,10 +1305,10 @@ When created a workspace is anonymous, you can give them a name with ~SPC l w R~. *** Workspace key bindings -The key bindings are registered in a transient-state. The docstring of the -transient-state displays the existing workspaces and the currently active +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 +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. @@ -1316,10 +1316,10 @@ Press ~?~ to toggle the full help. | Key Binding | Description | |-------------------+-------------------------------------------------------------| -| ~SPC l w~ | activate the transient-state | +| ~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 | +| ~[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 | @@ -1434,17 +1434,17 @@ makes sense to swap them. It's also recommended [[http://tuhdo.github.io/helm-in If you find yourself unable to return focus to Helm (after a careless mouse-click for example), use ~SPC w b~ to return focus to the minibuffer. -*** Helm transient-state -Spacemacs defines a [[Transient-states][transient-state]] for =Helm= to make it work like [[https://github.com/Shougo/unite.vim][Vim's Unite]] +*** Helm transient state +Spacemacs defines a [[Transient-states][transient state]] for =Helm= to make it work like [[https://github.com/Shougo/unite.vim][Vim's Unite]] plugin. -Initiate the transient-state with ~M-SPC~ or ~s-M-SPC~ while in a =Helm= buffer. +Initiate the transient state with ~M-SPC~ or ~s-M-SPC~ while in a =Helm= buffer. | Key Binding | Description | |----------------------+------------------------------------------------------| -| ~M-SPC~ or ~s-M-SPC~ | initiate the transient-state | -| ~q~ | quit transient-state | -| ~TAB~ | switch to actions page and leave the transient-state | +| ~M-SPC~ or ~s-M-SPC~ | initiate the transient state | +| ~q~ | quit transient state | +| ~TAB~ | switch to actions page and leave the transient state | | ~1~ | execute action 0 | | ~2~ | execute action 1 | | ~3~ | execute action 2 | @@ -1593,7 +1593,7 @@ Spacemacs. *** Toggles =helm-spacemacs-help= is also a central place to discover the available toggles. -To display only the toggles source press ~C-l~ (or in [[Helm transient-state][Helm transient-state]] you can +To display only the toggles source press ~C-l~ (or in [[Helm transient state][Helm transient state]] you can press just ~l~). The following helm actions are available on packages: @@ -1770,14 +1770,14 @@ Windows manipulation commands (start with ~w~): | ~SPC w w~ | cycle and focus between windows | | ~SPC w SPC~ | select window using [[https://github.com/abo-abo/ace-window][ace-window]] | -**** Window manipulation transient-state -A convenient window manipulation transient-state allows to perform most of the -actions listed above. The transient-state allows additional actions as well like +**** Window manipulation transient state +A convenient window manipulation transient state allows to perform most of the +actions listed above. The transient state allows additional actions as well like window resizing. | Key Binding | Description | |---------------+---------------------------------------------------------------| -| ~SPC w .~ | initiate transient-state | +| ~SPC w .~ | initiate transient state | | ~?~ | display the full documentation in minibuffer | | ~0~ | go to window number 0 | | ~1~ | go to window number 1 | @@ -1815,7 +1815,7 @@ window resizing. | ~v~ | vertical split | | ~V~ | horizontal split and focus new window | | ~w~ | focus other window | -| Any other key | leave the transient-state | +| Any other key | leave the transient state | **** Golden ratio If you resize windows like crazy you may want to give a try to [[https://github.com/roman/golden-ratio.el][golden-ratio]]. @@ -1855,17 +1855,17 @@ Buffer manipulation commands (start with ~b~): | ~SPC b Y~ | copy whole buffer to clipboard (useful when copying to a browser) | | ~z f~ | Make current function or comments visible in buffer as much as possible | -**** Buffers manipulation transient-state -A convenient buffer manipulation transient-state allows to quickly cycles through +**** Buffers manipulation transient state +A convenient buffer manipulation transient state allows to quickly cycles through the opened buffer and kill them. | Key Binding | Description | |---------------+-----------------------------------------------| -| ~SPC b .~ | initiate transient-state | +| ~SPC b .~ | initiate transient state | | ~K~ | kill current buffer | | ~n~ | go to next buffer (avoid special buffers) | | ~N~ | go to previous buffer (avoid special buffers) | -| Any other key | leave the transient-state | +| Any other key | leave the transient state | **** Special Buffers Unlike vim, emacs creates many buffers that most people do not need to see. Some @@ -1954,14 +1954,14 @@ Basic =ido= operations can be done with ~Ctrl~ key: | ~C-S-k~ or ~C-S-p~ | previous history element | | ~C-S-l~ | go to next directory | -*** Ido transient-state -Spacemacs defines a [[Transient-states][transient-state]] for =ido=. +*** Ido transient state +Spacemacs defines a [[Transient-states][transient state]] for =ido=. -Initiate the transient-state with ~M-SPC~ or ~s-M-SPC~ while in an =ido= buffer. +Initiate the transient state with ~M-SPC~ or ~s-M-SPC~ while in an =ido= buffer. | Key Binding | Description | |----------------------+---------------------------------------| -| ~M-SPC~ or ~s-M-SPC~ | initiate or leave the transient-state | +| ~M-SPC~ or ~s-M-SPC~ | initiate or leave the transient state | | ~?~ | display help | | ~e~ | open dired | | ~h~ | delete backward or parent directory | @@ -1973,7 +1973,7 @@ Initiate the transient-state with ~M-SPC~ or ~s-M-SPC~ while in an =ido= buffer. | ~n~ | next directory in history | | ~o~ | open in other window | | ~p~ | previous directory in history | -| ~q~ | quit transient-state | +| ~q~ | quit transient state | | ~s~ | open in a new horizontal split | | ~t~ | open in other frame | | ~v~ | open in a new vertical split | @@ -2286,7 +2286,7 @@ by pressing ~SPC s c~ or executing the ex command =:noh=. *** Highlight current symbol Spacemacs supports highlighting of the current symbol on demand (provided by -[[https://github.com/emacsmirror/auto-highlight-symbol][auto-highlight-symbol]] mode) and adds a transient-state to easily navigate and rename +[[https://github.com/emacsmirror/auto-highlight-symbol][auto-highlight-symbol]] mode) and adds a transient state to easily navigate and rename this symbol. It is also possible to change the range of the navigation on the fly to: @@ -2300,14 +2300,14 @@ Navigation between the highlighted symbols can be done with the commands: | Key Binding | Description | |-------------+------------------------------------------------------------------------------------| -| ~/~ | initiate navigation transient-state on current symbol and jump forwards | -| ~#~ | initiate navigation transient-state on current symbol and jump backwards | +| ~/~ | initiate navigation transient state on current symbol and jump forwards | +| ~#~ | initiate navigation transient state on current symbol and jump backwards | | ~SPC s e~ | edit all occurrences of the current symbol(/) | | ~SPC s h~ | highlight the current symbol and all its occurrence within the current range | | ~SPC s H~ | go to the last searched occurrence of the last highlighted symbol | | ~SPC t h a~ | toggle automatic highlight of symbol under point after =ahs-idle-interval= seconds | -In 'Spacemacs' highlight symbol transient-state: +In 'Spacemacs' highlight symbol transient state: | Key Binding | Description | |---------------+---------------------------------------------------------------| @@ -2318,12 +2318,12 @@ In 'Spacemacs' highlight symbol transient-state: | ~D~ | go to previous definition occurrence | | ~r~ | change range (=function=, =display area=, =whole buffer=) | | ~R~ | go to home occurrence (reset position to starting occurrence) | -| Any other key | leave the navigation transient-state | +| Any other key | leave the navigation transient state | (*) using [[https://github.com/tsdh/iedit][iedit]] or the default implementation of =auto-highlight-symbol= -The transient-state text in minibuffer display the following information: +The transient state text in minibuffer display the following information: #+BEGIN_EXAMPLE [6/11]* press (n/N) to navigate, (e) to edit, (r) to change range or (R) @@ -2346,7 +2346,7 @@ selection. It is pretty useful combined with the [[Region selection][expand-region]] bindings. *Note*: If the current state is not the =visual state= then pressing ~*~ uses -auto-highlight-symbol and its transient-state. +auto-highlight-symbol and its transient state. *** Listing symbols by semantic Use =helm-semantic-or-imenu= command from =Helm= to quickly navigate between the @@ -2371,10 +2371,10 @@ modifications to the buffer. ** Editing *** Paste text **** Paste Transient-state -The paste transient-state can be enabled by settings the variable +The paste transient state can be enabled by settings the variable =dotspacemacs-enable-paste-transient-state= to =t=. By default it is disabled. -When the transient-state is enabled, pressing ~p~ again will replace the pasted text +When the transient state is enabled, pressing ~p~ again will replace the pasted text with the previous yanked (copied) text on the kill ring. For example if you copy =foo= and =bar= then press ~p~ the text =bar= will @@ -2382,11 +2382,11 @@ be pasted, pressing ~p~ again will replace =bar= with =foo=. | Key Binding | Description | |---------------+-------------------------------------------------------------------------------| -| ~p~ or ~P~ | paste the text before or after point and initiate the =paste= transient-state | -| ~p~ | in transient-state: replace paste text with the previously copied one | -| ~P~ | in transient-state: replace paste text with the next copied one | -| ~.~ | paste the same text and leave the transient-state | -| Any other key | leave the transient-state | +| ~p~ or ~P~ | paste the text before or after point and initiate the =paste= transient state | +| ~p~ | in transient state: replace paste text with the previously copied one | +| ~P~ | in transient state: replace paste text with the next copied one | +| ~.~ | paste the same text and leave the transient state | +| Any other key | leave the transient state | **** Auto-indent pasted text By default any pasted text will be auto-indented. To paste text un-indented use @@ -2424,8 +2424,8 @@ Text related commands (start with ~x~): | ~SPC x j l~ | set the justification to left | | ~SPC x j n~ | set the justification to none | | ~SPC x j r~ | set the justification to right | -| ~SPC x J~ | move down a line of text (enter transient-state) | -| ~SPC x K~ | move up a line of text (enter transient-state) | +| ~SPC x J~ | move down a line of text (enter transient state) | +| ~SPC x K~ | move up a line of text (enter transient state) | | ~SPC x l s~ | sort lines | | ~SPC x l u~ | uniquify lines | | ~SPC x o~ | use avy to select a link in the frame and open it | @@ -2469,17 +2469,17 @@ It is possible to enable it easily for /all programming modes/ with the variable **** Text The font size of the current buffer can be adjusted with the commands: -| Key Binding | Description | -|---------------+----------------------------------------------------------------------------| -| ~SPC z x +~ | scale up the font and initiate the font scaling transient-state | -| ~SPC z x =~ | scale up the font and initiate the font scaling transient-state | -| ~SPC z x -~ | scale down the font and initiate the font scaling transient-state | -| ~SPC z x 0~ | reset the font size (no scaling) and initiate the font scaling transient-state | -| ~+~ | increase the font size | -| ~=~ | increase the font size | -| ~-~ | decrease the font size | -| ~0~ | reset the font size | -| Any other key | leave the font scaling transient-state | +| Key Binding | Description | +|---------------+--------------------------------------------------------------------------------| +| ~SPC z x +~ | scale up the font and initiate the font scaling transient state | +| ~SPC z x =~ | scale up the font and initiate the font scaling transient state | +| ~SPC z x -~ | scale down the font and initiate the font scaling transient state | +| ~SPC z x 0~ | reset the font size (no scaling) and initiate the font scaling transient state | +| ~+~ | increase the font size | +| ~=~ | increase the font size | +| ~-~ | decrease the font size | +| ~0~ | reset the font size | +| Any other key | leave the font scaling transient state | Note that /only/ the text of the current buffer is scaled, the other buffers, the mode-line and the minibuffer are not affected. To zoom the whole content of @@ -2488,33 +2488,33 @@ a frame use the =zoom frame= bindings (see next section). **** Frame You can zoom in and out the whole content of the frame with the commands: -| Key Binding | Description | -|---------------+-------------------------------------------------------------------------| -| ~SPC z f +~ | zoom in the frame content and initiate the frame scaling transient-state | -| ~SPC z f =~ | zoom in the frame content and initiate the frame scaling transient-state | -| ~SPC z f -~ | zoom out the frame content and initiate the frame scaling transient-state | -| ~SPC z f 0~ | reset the frame content size and initiate the frame scaling transient-state | -| ~+~ | zoom in | -| ~=~ | zoom in | -| ~-~ | zoom out | -| ~0~ | reset zoom | -| Any other key | leave the zoom frame transient-state | +| Key Binding | Description | +|---------------+-----------------------------------------------------------------------------| +| ~SPC z f +~ | zoom in the frame content and initiate the frame scaling transient state | +| ~SPC z f =~ | zoom in the frame content and initiate the frame scaling transient state | +| ~SPC z f -~ | zoom out the frame content and initiate the frame scaling transient state | +| ~SPC z f 0~ | reset the frame content size and initiate the frame scaling transient state | +| ~+~ | zoom in | +| ~=~ | zoom in | +| ~-~ | zoom out | +| ~0~ | reset zoom | +| Any other key | leave the zoom frame transient state | *** Increase/Decrease numbers Spacemacs uses [[https://github.com/cofi/evil-numbers][evil-numbers]] to easily increase or increase numbers. -| Key Binding | Description | -|-------------+-----------------------------------------------------------------| -| ~SPC n +~ | increase the number under point by one and initiate transient-state | -| ~SPC n -~ | decrease the number under point by one and initiate transient-state | +| Key Binding | Description | +|-------------+---------------------------------------------------------------------| +| ~SPC n +~ | increase the number under point by one and initiate transient state | +| ~SPC n -~ | decrease the number under point by one and initiate transient state | -In transient-state: +In transient state: | Key Binding | Description | |---------------+----------------------------------------| | ~+~ | increase the number under point by one | | ~-~ | decrease the number under point by one | -| Any other key | leave the transient-state | +| Any other key | leave the transient state | *Tips:* you can increase or decrease a value by more that once by using a prefix argument (ie. ~10 SPC n +~ will add 10 to the number under point). From 3a9e8c1723728f5033139cb1bd41d8b28c820c4c Mon Sep 17 00:00:00 2001 From: Bart Brouns Date: Thu, 11 Feb 2016 20:14:46 +0100 Subject: [PATCH 17/40] add faust-layer, remove faust from extra-langs My first spacemacs layer, total elisp newb. Does what it says in the README, with one bug: I have auto-completion-enable-snippets-in-popup t in my .spacemacs In faust files, only yas-keys that have a similar word in an open buffer show up in the company menu. Example: with no open buffers ne doesn't show a company menu, if a file has the word nent in it, I get a menu with ne -> nentry (the snippet) and nent. having ne$AnyTwoCharacters in the file also works, but just ne or nen doesn't. --- layers/+lang/extra-langs/README.org | 1 - layers/+lang/extra-langs/packages.el | 4 -- layers/+lang/faust/README.org | 23 ++++++++ layers/+lang/faust/config.el | 14 +++++ layers/+lang/faust/img/faust.png | Bin 0 -> 11060 bytes layers/+lang/faust/packages.el | 78 +++++++++++++++++++++++++++ 6 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 layers/+lang/faust/README.org create mode 100644 layers/+lang/faust/config.el create mode 100644 layers/+lang/faust/img/faust.png create mode 100644 layers/+lang/faust/packages.el diff --git a/layers/+lang/extra-langs/README.org b/layers/+lang/extra-langs/README.org index 8dd347503d333..15e48cd146075 100644 --- a/layers/+lang/extra-langs/README.org +++ b/layers/+lang/extra-langs/README.org @@ -10,7 +10,6 @@ Adds many more language modes for less common languages, some more niche than ot These include: - Arduino -- Faust - Julia - MATLAB - QML diff --git a/layers/+lang/extra-langs/packages.el b/layers/+lang/extra-langs/packages.el index 30da135bebad6..208236e4469bf 100644 --- a/layers/+lang/extra-langs/packages.el +++ b/layers/+lang/extra-langs/packages.el @@ -2,7 +2,6 @@ '( arduino-mode julia-mode - faust-mode matlab-mode qml-mode scad-mode @@ -14,9 +13,6 @@ (defun extra-langs/init-arduino-mode () (use-package arduino-mode :defer t)) -(defun extra-langs/init-faust-mode () - (use-package faust-mode :defer t :mode "\\.\\(dsp\\|lib\\)\\'")) - (defun extra-langs/init-scad-mode () (use-package scad-mode :defer t)) diff --git a/layers/+lang/faust/README.org b/layers/+lang/faust/README.org new file mode 100644 index 0000000000000..fcfb3e7121c2e --- /dev/null +++ b/layers/+lang/faust/README.org @@ -0,0 +1,23 @@ +#+TITLE: faust layer +#+HTML_HEAD_EXTRA: + +#+CAPTION: logo + +# The maximum height of the logo should be 200 pixels. +[[img/faust.png]] + +* Table of Contents :TOC_4_org:noexport: + - [[Decsription][Description]] + - [[Install][Install]] + +* Description +This simple layer adds support for the [[http://faust.grame.fr/][faust language]]. +It adds =faust-mode= as well as integrating it with =auto-completion=. + + +* Install +To use this contribution add it to your =~/.spacemacs= + +#+begin_src emacs-lisp + (setq-default dotspacemacs-configuration-layers '(faust)) +#+end_src diff --git a/layers/+lang/faust/config.el b/layers/+lang/faust/config.el new file mode 100644 index 0000000000000..494fa61b044c7 --- /dev/null +++ b/layers/+lang/faust/config.el @@ -0,0 +1,14 @@ +;;; config.el --- faust Layer configuration File for Spacemacs +;; +;; Copyright (c) 2012-2016 Sylvain Benner & Contributors +;; +;; Author: Bart Brouns +;; URL: https://github.com/syl20bnr/spacemacs +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 + +;; Variables + +(spacemacs|defvar-company-backends faust-mode) diff --git a/layers/+lang/faust/img/faust.png b/layers/+lang/faust/img/faust.png new file mode 100644 index 0000000000000000000000000000000000000000..c722ddcf04236c7f663a561cabf39b68e4b22acf GIT binary patch literal 11060 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 +;; URL: https://github.com/syl20bnr/spacemacs +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 + +;;; Code: + +(defconst faust-packages + '(company + dumb-jump + faust-mode + yasnippet)) + +(defun faust/init-faust-mode () + (use-package faust-mode + :defer t + :mode "\\.\\(dsp\\|lib\\)\\'") + (spacemacs/set-leader-keys-for-major-mode 'faust-mode + ;; Compile + "f" 'faust/faust-to-firefox + "j" 'faust/faust-to-jack + "q" 'faust/faust-to-jack-qt)) + +(defun faust/init-dumb-jump () + ;; Load omnisharp-mode with csharp-mode, this should start the omnisharp server automatically + (add-hook 'faust-mode-hook 'dumb-jump-mode) + (use-package dumb-jump) + :defer t + (spacemacs/set-leader-keys-for-major-mode 'faust-mode + ;; Navigation + "g" 'dumb-jump-go + "b" 'dumb-jump-back)) + +(when (configuration-layer/layer-usedp 'auto-completion) + (defun faust/post-init-company () + (spacemacs|add-company-hook faust-mode) + (spacemacs/add-to-hooks + 'spacemacs/load-yasnippet + '(faust-mode-hook)))) + +(defun faust/faust-to-firefox () + "compile a block-diagram and show it in the browser" + (interactive) + (set-process-sentinel + (start-process-shell-command "faust2svg" "faust-compile" + (concat "faust2svg " buffer-file-name)) + 'faust/faust2svg-sentinel)) + +(defun faust/faust2svg-sentinel (process event) + "show block-diagram in browser" + (browse-url-of-file (concat (file-name-sans-extension buffer-file-name) "-svg/process.svg"))) + +(defun faust/faust-to-jack () + "compile a jack-gtk program and run it" + (interactive) + (set-process-sentinel + (start-process-shell-command "faust2jack" "faust-compile" + (concat "faust2jack " buffer-file-name)) + 'faust/faust-run-sentinel)) + +(defun faust/faust-to-jack-qt () + "compile a jack-qt program and run it" + (interactive) + (set-process-sentinel + (start-process-shell-command "faust2jaqt" "faust-compile" + (concat "faust2jaqt " buffer-file-name)) + 'faust/faust-run-sentinel)) + +(defun faust/faust-run-sentinel (process event) + "run the program" + (start-process-shell-command "faust-run" nil (file-name-sans-extension (buffer-file-name))) + (switch-to-buffer-other-window "faust-compile")) From f48b25196852f4cc77a1649739a435aeea460f37 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Mon, 21 Mar 2016 20:02:56 -0400 Subject: [PATCH 18/40] Delete `SPC j b` and move `SPC j u` to `SPC j b` By convention, jump back should be on `b`, not `u` Since `SPC j u` is free, move as well `SPC j U` to `SPC j u`. `SPC j b` for bookmark jump is already available under `SPC f b` --- CHANGELOG.next | 5 ++--- doc/DOCUMENTATION.org | 7 +++---- layers/+distribution/spacemacs-base/keybindings.el | 1 - layers/+spacemacs/spacemacs-editing/packages.el | 4 ++-- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.next b/CHANGELOG.next index 2091a63f6d29e..d456294c18c25 100644 --- a/CHANGELOG.next +++ b/CHANGELOG.next @@ -110,7 +110,7 @@ This file containes the change log for the next major version of Spacemacs. location in the line) - ~SPC j $~ to go to the end of line (and set a mark at the previous location in the line) - - ~SPC j b~ to jump to a bookmark + - ~SPC j b~ to undo a jump (go back to previous location) - ~SPC j d~ to jump to a listing of the current directory - ~SPC j D~ to jump to a listing of the current directory (other window) - ~SPC j f~ to jump to the definition of the function around point @@ -123,8 +123,7 @@ This file containes the change log for the next major version of Spacemacs. - ~SPC j n~ to split the current line at point, insert a new line and auto-indent - ~SPC j s~ to split a quoted string or s-expression in place - ~SPC j S~ to split a quoted string or s-expression, insert a new line and auto-indent - - ~SPC j u~ to undo a jump (go back to previous location) - - ~SPC j U~ to jump to a URL in the current buffer + - ~SPC j u~ to jump to a URL in the current buffer - ~SPC j v~ to jump to the definition/declaration of the variable around point - ~SPC j w~ to jump to a word in the current buffer (works as an evil motion) (thanks to justbur) diff --git a/doc/DOCUMENTATION.org b/doc/DOCUMENTATION.org index d5d64ac2b6e24..65801ceca31ea 100644 --- a/doc/DOCUMENTATION.org +++ b/doc/DOCUMENTATION.org @@ -1641,10 +1641,10 @@ selecting an avy candidate. | Key Binding | Description | |-------------+----------------------------------------------------| +| ~SPC j b~ | go back to the previous location (before the jump) | | ~SPC j j~ | initiate avy jump char | | ~SPC j w~ | initiate avy jump word | | ~SPC j l~ | initiate avy jump line | -| ~SPC j u~ | go back to the previous location (before the jump) | **** ace-link mode Similar to =avy=, [[https://github.com/abo-abo/ace-link][ace-link]] allows one to jump to any link in @@ -1693,7 +1693,7 @@ The ~SPC j~ prefix is for jumping, joining and splitting. |-------------+-----------------------------------------------------------------------------------| | ~SPC j 0~ | go to the beginning of line (and set a mark at the previous location in the line) | | ~SPC j $~ | go to the end of line (and set a mark at the previous location in the line) | -| ~SPC j b~ | jump to a bookmark | +| ~SPC j b~ | undo a jump (go back to previous location) | | ~SPC j d~ | jump to a listing of the current directory | | ~SPC j D~ | jump to a listing of the current directory (other window) | | ~SPC j f~ | jump to the definition of the function around point | @@ -1703,8 +1703,7 @@ The ~SPC j~ prefix is for jumping, joining and splitting. | ~SPC j J~ | jump to a suite of two characters in the buffer (works as an evil motion) | | ~SPC j k~ | jump to next line and indent it using auto-indent rules | | ~SPC j l~ | jump to a line with avy (works as an evil motion) | -| ~SPC j u~ | undo a jump (go back to previous location) | -| ~SPC j U~ | jump to a URL in the current buffer | +| ~SPC j u~ | jump to a URL in the current buffer | | ~SPC j v~ | jump to the definition/declaration of the variable around point | | ~SPC j w~ | jump to a word in the current buffer (works as an evil motion) | diff --git a/layers/+distribution/spacemacs-base/keybindings.el b/layers/+distribution/spacemacs-base/keybindings.el index 8d1eada78278c..beda2ddeebf4b 100644 --- a/layers/+distribution/spacemacs-base/keybindings.el +++ b/layers/+distribution/spacemacs-base/keybindings.el @@ -135,7 +135,6 @@ (spacemacs/set-leader-keys "j0" 'spacemacs/push-mark-and-goto-beginning-of-line "j$" 'spacemacs/push-mark-and-goto-end-of-line - "jb" 'bookmark-jump "jd" 'dired-jump "jD" 'dired-jump-other-window "jf" 'find-function-at-point diff --git a/layers/+spacemacs/spacemacs-editing/packages.el b/layers/+spacemacs/spacemacs-editing/packages.el index 83c49c4fec223..768936f7386b4 100644 --- a/layers/+spacemacs/spacemacs-editing/packages.el +++ b/layers/+spacemacs/spacemacs-editing/packages.el @@ -58,11 +58,11 @@ (setq avy-all-windows 'all-frames) (setq avy-background t) (spacemacs/set-leader-keys + "jb" 'avy-pop-mark "jj" 'evil-avy-goto-char "jJ" 'evil-avy-goto-char-2 "jl" 'evil-avy-goto-line - "ju" 'avy-pop-mark - "jU" 'spacemacs/avy-goto-url + "ju" 'spacemacs/avy-goto-url "jw" 'evil-avy-goto-word-or-subword-1 "xo" 'spacemacs/avy-open-url)) :config From 9bd6078cc5195144c248ecb8534d64fe7aade7d5 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Mon, 21 Mar 2016 20:04:38 -0400 Subject: [PATCH 19/40] Update README.org template for layers --- core/templates/README.org.template | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/core/templates/README.org.template b/core/templates/README.org.template index e209a327ee4ec..637fac06a702f 100644 --- a/core/templates/README.org.template +++ b/core/templates/README.org.template @@ -1,8 +1,6 @@ #+TITLE: %LAYER_NAME% layer #+HTML_HEAD_EXTRA: -#+CAPTION: logo - # The maximum height of the logo should be 200 pixels. [[img/%LAYER_NAME%.png]] @@ -16,11 +14,9 @@ This layer does wonderful things: - thing01 * Install -To use this contribution add it to your =~/.spacemacs= - -#+begin_src emacs-lisp - (setq-default dotspacemacs-configuration-layers '(%LAYER_NAME%)) -#+end_src +To use this configuration layer, add it to your =~/.spacemacs=. You will need to +add =%LAYER_NAME%= to the existing =dotspacemacs-configuration-layers= list in this +file. * Key bindings From 8e6fd865775888afcc42914b07fd2e25405f62f0 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Mon, 21 Mar 2016 20:33:35 -0400 Subject: [PATCH 20/40] faust: refactor layer Add a funcs.el. Fix `use-package` usage. Modify key bindings to meet conventions. Prefix function with `spacemacs/` --- layers/+lang/faust/README.org | 25 ++++++----- layers/+lang/faust/funcs.el | 45 ++++++++++++++++++++ layers/+lang/faust/packages.el | 78 ++++++++++------------------------ 3 files changed, 82 insertions(+), 66 deletions(-) create mode 100644 layers/+lang/faust/funcs.el diff --git a/layers/+lang/faust/README.org b/layers/+lang/faust/README.org index fcfb3e7121c2e..c4ef7c52fbf10 100644 --- a/layers/+lang/faust/README.org +++ b/layers/+lang/faust/README.org @@ -1,23 +1,28 @@ #+TITLE: faust layer #+HTML_HEAD_EXTRA: -#+CAPTION: logo - -# The maximum height of the logo should be 200 pixels. [[img/faust.png]] * Table of Contents :TOC_4_org:noexport: - - [[Decsription][Description]] + - [[Description][Description]] - [[Install][Install]] + - [[Key bindings][Key bindings]] * Description This simple layer adds support for the [[http://faust.grame.fr/][faust language]]. -It adds =faust-mode= as well as integrating it with =auto-completion=. - +It adds =faust-mode= as well as integrating it with =auto-completion= layer. * Install -To use this contribution add it to your =~/.spacemacs= +To use this configuration layer, add it to your =~/.spacemacs=. You will need to +add =faust= to the existing =dotspacemacs-configuration-layers= list in this +file. + +* Key bindings -#+begin_src emacs-lisp - (setq-default dotspacemacs-configuration-layers '(faust)) -#+end_src +| Key Binding | Description | +|-------------+---------------------------------------| +| ~SPC m c f~ | Compile to SVG and open in Firefox | +| ~SPC m c g~ | Compile a jack-gtk program and run it | +| ~SPC m c q~ | Compile a jack-qt program and run it | +| ~SPC m g b~ | Jump back to previous location | +| ~SPC m g g~ | Jump to definition around point | diff --git a/layers/+lang/faust/funcs.el b/layers/+lang/faust/funcs.el new file mode 100644 index 0000000000000..2accd4f6d8140 --- /dev/null +++ b/layers/+lang/faust/funcs.el @@ -0,0 +1,45 @@ +;;; funcs.el -- Faust Layer functions 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 + +(defun spacemacs/faust-to-firefox () + "Compile a block-diagram and show it in the browser." + (interactive) + (set-process-sentinel + (start-process-shell-command "faust2svg" "faust-compile" + (concat "faust2svg " buffer-file-name)) + 'spacemacs//faust2svg-sentinel)) + +(defun spacemacs/faust-to-jack-gtk () + "Compile a jack-gtk program and run it." + (interactive) + (set-process-sentinel + (start-process-shell-command "faust2jack" "faust-compile" + (concat "faust2jack " buffer-file-name)) + 'spacemacs//faust-run-sentinel)) + +(defun spacemacs/faust-to-jack-qt () + "Compile a jack-qt program and run it." + (interactive) + (set-process-sentinel + (start-process-shell-command "faust2jaqt" "faust-compile" + (concat "faust2jaqt " buffer-file-name)) + 'spacemacs//faust-run-sentinel)) + +(defun spacemacs//faust2svg-sentinel (process event) + "Show block-diagram in browser" + (browse-url-of-file (concat (file-name-sans-extension buffer-file-name) + "-svg/process.svg"))) + +(defun spacemacs//faust-run-sentinel (process event) + "Run the program" + (start-process-shell-command "faust-run" nil + (file-name-sans-extension (buffer-file-name))) + (switch-to-buffer-other-window "faust-compile")) diff --git a/layers/+lang/faust/packages.el b/layers/+lang/faust/packages.el index 613f025c6b4c4..6d192024d0afc 100644 --- a/layers/+lang/faust/packages.el +++ b/layers/+lang/faust/packages.el @@ -17,62 +17,28 @@ faust-mode yasnippet)) -(defun faust/init-faust-mode () - (use-package faust-mode - :defer t - :mode "\\.\\(dsp\\|lib\\)\\'") - (spacemacs/set-leader-keys-for-major-mode 'faust-mode - ;; Compile - "f" 'faust/faust-to-firefox - "j" 'faust/faust-to-jack - "q" 'faust/faust-to-jack-qt)) +(defun faust/post-init-company () + (spacemacs|add-company-hook faust-mode)) +;; Consider to move this package somewhere else if we use it for other languages. (defun faust/init-dumb-jump () - ;; Load omnisharp-mode with csharp-mode, this should start the omnisharp server automatically - (add-hook 'faust-mode-hook 'dumb-jump-mode) - (use-package dumb-jump) - :defer t - (spacemacs/set-leader-keys-for-major-mode 'faust-mode - ;; Navigation - "g" 'dumb-jump-go - "b" 'dumb-jump-back)) - -(when (configuration-layer/layer-usedp 'auto-completion) - (defun faust/post-init-company () - (spacemacs|add-company-hook faust-mode) - (spacemacs/add-to-hooks - 'spacemacs/load-yasnippet - '(faust-mode-hook)))) - -(defun faust/faust-to-firefox () - "compile a block-diagram and show it in the browser" - (interactive) - (set-process-sentinel - (start-process-shell-command "faust2svg" "faust-compile" - (concat "faust2svg " buffer-file-name)) - 'faust/faust2svg-sentinel)) - -(defun faust/faust2svg-sentinel (process event) - "show block-diagram in browser" - (browse-url-of-file (concat (file-name-sans-extension buffer-file-name) "-svg/process.svg"))) - -(defun faust/faust-to-jack () - "compile a jack-gtk program and run it" - (interactive) - (set-process-sentinel - (start-process-shell-command "faust2jack" "faust-compile" - (concat "faust2jack " buffer-file-name)) - 'faust/faust-run-sentinel)) - -(defun faust/faust-to-jack-qt () - "compile a jack-qt program and run it" - (interactive) - (set-process-sentinel - (start-process-shell-command "faust2jaqt" "faust-compile" - (concat "faust2jaqt " buffer-file-name)) - 'faust/faust-run-sentinel)) + (use-package dumb-jump + :defer t + :init + (progn + (add-hook 'faust-mode-hook 'dumb-jump-mode) + (spacemacs/set-leader-keys-for-major-mode 'faust-mode + "gb" 'dumb-jump-back + "gg" 'dumb-jump-go)))) -(defun faust/faust-run-sentinel (process event) - "run the program" - (start-process-shell-command "faust-run" nil (file-name-sans-extension (buffer-file-name))) - (switch-to-buffer-other-window "faust-compile")) +(defun faust/init-faust-mode () + (use-package faust-mode + :defer t + :mode "\\.\\(dsp\\|lib\\)\\'" + :init (spacemacs/set-leader-keys-for-major-mode 'faust-mode + "cf" 'spacemacs/faust-to-firefox + "cg" 'spacemacs/faust-to-jack-gtk + "cq" 'spacemacs/faust-to-jack-qt))) + +(defun faust/post-init-yasnippet () + (add-hook 'faust-mode-hook 'spacemacs/load-yasnippet)) From 2433c6bae606cc8307bb1bce7bc47d35a1d679b5 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Mon, 21 Mar 2016 20:40:18 -0400 Subject: [PATCH 21/40] Add contribution note about not useful layers --- CONTRIBUTING.org | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CONTRIBUTING.org b/CONTRIBUTING.org index 56a23efb81349..c0a0929fbe0ee 100644 --- a/CONTRIBUTING.org +++ b/CONTRIBUTING.org @@ -154,6 +154,10 @@ Contributed configuration layers are stored in the =layers/= folder. The =layers/= folder also contains categories prefixed with =+= to put your layers in. For example a layer for a language would go in the =layers/+lang/= folder. +Layer with no associated configuration will be rejected. For instance a layer +with just a package and a hook can be easily replace by the usage of the +variable =dotspacemacs-additional-packages=. + *** File header The file header for =elisp= files should look like the following template: From 70193ec47131a190cccbaa1f1f1dbe14c810d753 Mon Sep 17 00:00:00 2001 From: Daniel Luna Date: Fri, 26 Feb 2016 08:52:25 -0300 Subject: [PATCH 22/40] Adding column-enforce-mode layer --- layers/column-enforce-mode/README.org | 19 +++++++++ .../img/bi80-assembled.jpg | Bin 0 -> 17832 bytes layers/column-enforce-mode/packages.el | 40 ++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 layers/column-enforce-mode/README.org create mode 100644 layers/column-enforce-mode/img/bi80-assembled.jpg create mode 100644 layers/column-enforce-mode/packages.el diff --git a/layers/column-enforce-mode/README.org b/layers/column-enforce-mode/README.org new file mode 100644 index 0000000000000..7aae82f35cdbd --- /dev/null +++ b/layers/column-enforce-mode/README.org @@ -0,0 +1,19 @@ +#+TITLE: column-enforce-mode layer +#+HTML_HEAD_EXTRA: + +[[./img/bi80-assembled.jpg]] + +* Table of Contents :TOC_4_org:noexport: + - [[Description][Description]] + - [[Install][Install]] + +* Description +This layer adds the column-enforce-mode package. + +* Install +To use this contribution add it to your =~/.spacemacs= + +#+begin_src emacs-lisp + (setq-default dotspacemacs-configuration-layers '(column-enforce-mode)) +#+end_src + diff --git a/layers/column-enforce-mode/img/bi80-assembled.jpg b/layers/column-enforce-mode/img/bi80-assembled.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f06af9ec80b7117d49db27e280a8310e07a173d9 GIT binary patch literal 17832 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 FzX0Z)`3?X8 literal 0 HcmV?d00001 diff --git a/layers/column-enforce-mode/packages.el b/layers/column-enforce-mode/packages.el new file mode 100644 index 0000000000000..82b4d91e47e30 --- /dev/null +++ b/layers/column-enforce-mode/packages.el @@ -0,0 +1,40 @@ +;;; packages.el --- column-enforce-mode layer packages file for Spacemacs. +;; +;; Copyright (c) 2012-2016 Sylvain Benner & Contributors +;; +;; Author: Daniel Luna +;; URL: https://github.com/syl20bnr/spacemacs +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 + +;;; Commentary: + +;; See the Spacemacs documentation and FAQs for instructions on how to implement +;; a new layer: +;; +;; SPC h SPC layers RET +;; +;; +;; Briefly, each package to be installed or configured by this layer should be +;; added to `column-enforce-mode-packages'. Then, for each package PACKAGE: +;; +;; - If PACKAGE is not referenced by any other Spacemacs layer, define a +;; function `column-enforce-mode/init-PACKAGE' to load and initialize the package. + +;; - Otherwise, PACKAGE is already referenced by another Spacemacs layer, so +;; define the functions `column-enforce-mode/pre-init-PACKAGE' and/or +;; `column-enforce-mode/post-init-PACKAGE' to customize the package as it is loaded. + +;;; Code: + +(defconst column-enforce-mode-packages + '(column-enforce-mode)) + +(defun column-enforce-mode/init-column-enforce-mode () + (use-package column-enforce-mode + :defer t + :init (add-hook 'prog-mode-hook 'column-enforce-mode))) + +;;; packages.el ends here From 828ae8113db890beffe2fc6c486e9d5941ea6714 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Mon, 21 Mar 2016 21:18:36 -0400 Subject: [PATCH 23/40] Replace enforce-column layer by a toggle on SPC t 8 --- doc/DOCUMENTATION.org | 53 +++++++++--------- .../spacemacs-editing-visual/packages.el | 23 ++++++++ layers/column-enforce-mode/README.org | 19 ------- .../img/bi80-assembled.jpg | Bin 17832 -> 0 bytes layers/column-enforce-mode/packages.el | 40 ------------- 5 files changed, 51 insertions(+), 84 deletions(-) delete mode 100644 layers/column-enforce-mode/README.org delete mode 100644 layers/column-enforce-mode/img/bi80-assembled.jpg delete mode 100644 layers/column-enforce-mode/packages.el diff --git a/doc/DOCUMENTATION.org b/doc/DOCUMENTATION.org index 65801ceca31ea..b74ac4a9c8cde 100644 --- a/doc/DOCUMENTATION.org +++ b/doc/DOCUMENTATION.org @@ -973,6 +973,7 @@ and ~T~): | Key Binding | Description | |-------------+-------------------------------------------------------------------| +| ~SPC t 8~ | highlight any character past the 80th column | | ~SPC t f~ | display the fill column (by default the fill column is set to 80) | | ~SPC t h h~ | toggle highlight of the current line | | ~SPC t h i~ | toggle highlight indentation levels | @@ -1134,31 +1135,33 @@ toggle them. Some toggle have two flavors: local and global. The global version of the toggle can be reached using the =control= key. -| Key Binding | Unicode | ASCII | Mode | -|-------------+---------+-------+---------------------------------------------| -| ~SPC t -~ | =⊝= | - | [[http://emacswiki.org/emacs/centered-cursor-mode.el][centered-cursor]] mode | -| ~SPC t C--~ | =⊝= | | global centered cursor | -| ~SPC t a~ | =ⓐ= | a | auto-completion | -| ~SPC t c~ | =ⓒ= | c | camel case motion with subword mode | -| =none= | =ⓔ= | e | [[https://github.com/edwtjo/evil-org-mode][evil-org]] mode | -| ~SPC t E e~ | =Ⓔe= | Ee | emacs editing style (holy mode) | -| ~SPC t E h~ | =Ⓔh= | Eh | hybrid editing style (hybrid mode) | -| ~SPC t f~ | | | fill-column-indicator mode | -| ~SPC t F~ | =Ⓕ= | F | auto-fill mode | -| ~SPC t g~ | =ⓖ= | g | [[https://github.com/roman/golden-ratio.el][golden-ratio]] mode | -| ~SPC t h i~ | =ⓗi= | hi | toggle highlight indentation levels | -| ~SPC t h c~ | =ⓗc= | hc | toggle highlight indentation current column | -| ~SPC t i~ | =ⓘ= | i | indentation guide | -| ~SPC t C-i~ | =ⓘ= | i | global indentation guide | -| ~SPC t I~ | =Ⓘ= | I | aggressive indent mode | -| ~SPC t K~ | =Ⓚ= | K | which-key mode | -| ~SPC t p~ | =ⓟ= | p | [[https://github.com/Fuco1/smartparens][smartparens]] mode | -| ~SPC t C-p~ | =ⓟ= | | global smartparens | -| ~SPC t s~ | =ⓢ= | s | syntax checking (flycheck) | -| ~SPC t S~ | =Ⓢ= | S | enabled in [[../layers/spell-checking][spell checking layer]] (flyspell) | -| ~SPC t w~ | =ⓦ= | w | whitespace mode | -| ~SPC t C-w~ | =Ⓦ= | W | global whitespace | -| ~SPC t y~ | =ⓨ= | y | [[https://github.com/capitaomorte/yasnippet][yasnippet]] mode | +| Key Binding | Unicode | ASCII | Mode | +|-------------+---------+-------+------------------------------------------------------| +| ~SPC t -~ | =⊝= | - | [[http://emacswiki.org/emacs/centered-cursor-mode.el][centered-cursor]] mode | +| ~SPC t 8~ | =⑧= | 8 | toggle highlight of characters for long lines | +| ~SPC t C-8~ | =⑧= | 8 | global toggle highlight of characters for long lines | +| ~SPC t C--~ | =⊝= | | global centered cursor | +| ~SPC t a~ | =ⓐ= | a | auto-completion | +| ~SPC t c~ | =ⓒ= | c | camel case motion with subword mode | +| =none= | =ⓔ= | e | [[https://github.com/edwtjo/evil-org-mode][evil-org]] mode | +| ~SPC t E e~ | =Ⓔe= | Ee | emacs editing style (holy mode) | +| ~SPC t E h~ | =Ⓔh= | Eh | hybrid editing style (hybrid mode) | +| ~SPC t f~ | | | fill-column-indicator mode | +| ~SPC t F~ | =Ⓕ= | F | auto-fill mode | +| ~SPC t g~ | =ⓖ= | g | [[https://github.com/roman/golden-ratio.el][golden-ratio]] mode | +| ~SPC t h i~ | =ⓗi= | hi | toggle highlight indentation levels | +| ~SPC t h c~ | =ⓗc= | hc | toggle highlight indentation current column | +| ~SPC t i~ | =ⓘ= | i | indentation guide | +| ~SPC t C-i~ | =ⓘ= | i | global indentation guide | +| ~SPC t I~ | =Ⓘ= | I | aggressive indent mode | +| ~SPC t K~ | =Ⓚ= | K | which-key mode | +| ~SPC t p~ | =ⓟ= | p | [[https://github.com/Fuco1/smartparens][smartparens]] mode | +| ~SPC t C-p~ | =ⓟ= | | global smartparens | +| ~SPC t s~ | =ⓢ= | s | syntax checking (flycheck) | +| ~SPC t S~ | =Ⓢ= | S | enabled in [[../layers/spell-checking][spell checking layer]] (flyspell) | +| ~SPC t w~ | =ⓦ= | w | whitespace mode | +| ~SPC t C-w~ | =Ⓦ= | W | global whitespace | +| ~SPC t y~ | =ⓨ= | y | [[https://github.com/capitaomorte/yasnippet][yasnippet]] mode | **** Customizing the mode-line Spacemacs uses [[https://github.com/TheBB/spaceline][Spaceline]] to provide its mode-line. It consists of a number of diff --git a/layers/+spacemacs/spacemacs-editing-visual/packages.el b/layers/+spacemacs/spacemacs-editing-visual/packages.el index 739bacd1de75a..5404e3f5e6b06 100644 --- a/layers/+spacemacs/spacemacs-editing-visual/packages.el +++ b/layers/+spacemacs/spacemacs-editing-visual/packages.el @@ -14,6 +14,7 @@ ;; default adaptive-wrap auto-highlight-symbol + column-enforce-mode highlight-indentation highlight-numbers highlight-parentheses @@ -268,6 +269,28 @@ (spacemacs/symbol-highlight-transient-state/body) (spacemacs/integrate-evil-search nil))))) +(defun spacemacs-editing-visual/init-column-enforce-mode () + (use-package column-enforce-mode + :defer t + :init + (progn + ;; TODO Ideally find a way to define the minimum length for long lines + ;; We may add support for the universal prefix argument in toggles to + ;; be able to do this. + (spacemacs|add-toggle long-lines + :status column-enforce-mode + :on (column-enforce-mode) + :off (column-enforce-mode -1) + :documentation "Highlight the characters past the 80th column." + :evil-leader "t8") + (spacemacs|add-toggle long-lines-globally + :status column-enforce-mode + :on (global-column-enforce-mode) + :off (global-column-enforce-mode -1) + :documentation "Globally Highlight the characters past the 80th column." + :evil-leader "t C-8")) + :config (spacemacs|diminish column-enforce-mode "⑧" "8"))) + (defun spacemacs-editing-visual/init-highlight-indentation () (use-package highlight-indentation :defer t diff --git a/layers/column-enforce-mode/README.org b/layers/column-enforce-mode/README.org deleted file mode 100644 index 7aae82f35cdbd..0000000000000 --- a/layers/column-enforce-mode/README.org +++ /dev/null @@ -1,19 +0,0 @@ -#+TITLE: column-enforce-mode layer -#+HTML_HEAD_EXTRA: - -[[./img/bi80-assembled.jpg]] - -* Table of Contents :TOC_4_org:noexport: - - [[Description][Description]] - - [[Install][Install]] - -* Description -This layer adds the column-enforce-mode package. - -* Install -To use this contribution add it to your =~/.spacemacs= - -#+begin_src emacs-lisp - (setq-default dotspacemacs-configuration-layers '(column-enforce-mode)) -#+end_src - diff --git a/layers/column-enforce-mode/img/bi80-assembled.jpg b/layers/column-enforce-mode/img/bi80-assembled.jpg deleted file mode 100644 index f06af9ec80b7117d49db27e280a8310e07a173d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17832 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 FzX0Z)`3?X8 diff --git a/layers/column-enforce-mode/packages.el b/layers/column-enforce-mode/packages.el deleted file mode 100644 index 82b4d91e47e30..0000000000000 --- a/layers/column-enforce-mode/packages.el +++ /dev/null @@ -1,40 +0,0 @@ -;;; packages.el --- column-enforce-mode layer packages file for Spacemacs. -;; -;; Copyright (c) 2012-2016 Sylvain Benner & Contributors -;; -;; Author: Daniel Luna -;; URL: https://github.com/syl20bnr/spacemacs -;; -;; This file is not part of GNU Emacs. -;; -;;; License: GPLv3 - -;;; Commentary: - -;; See the Spacemacs documentation and FAQs for instructions on how to implement -;; a new layer: -;; -;; SPC h SPC layers RET -;; -;; -;; Briefly, each package to be installed or configured by this layer should be -;; added to `column-enforce-mode-packages'. Then, for each package PACKAGE: -;; -;; - If PACKAGE is not referenced by any other Spacemacs layer, define a -;; function `column-enforce-mode/init-PACKAGE' to load and initialize the package. - -;; - Otherwise, PACKAGE is already referenced by another Spacemacs layer, so -;; define the functions `column-enforce-mode/pre-init-PACKAGE' and/or -;; `column-enforce-mode/post-init-PACKAGE' to customize the package as it is loaded. - -;;; Code: - -(defconst column-enforce-mode-packages - '(column-enforce-mode)) - -(defun column-enforce-mode/init-column-enforce-mode () - (use-package column-enforce-mode - :defer t - :init (add-hook 'prog-mode-hook 'column-enforce-mode))) - -;;; packages.el ends here From 82efa16dab91fcecb5996b91ed582e7ef5bc2855 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Tue, 22 Mar 2016 09:38:37 -0400 Subject: [PATCH 24/40] Fix long-lines toggle and rename it Fix global version of the toggle Rename it to highlight-long-lines --- layers/+spacemacs/spacemacs-editing-visual/packages.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/layers/+spacemacs/spacemacs-editing-visual/packages.el b/layers/+spacemacs/spacemacs-editing-visual/packages.el index 5404e3f5e6b06..9a198aeca62e3 100644 --- a/layers/+spacemacs/spacemacs-editing-visual/packages.el +++ b/layers/+spacemacs/spacemacs-editing-visual/packages.el @@ -271,20 +271,20 @@ (defun spacemacs-editing-visual/init-column-enforce-mode () (use-package column-enforce-mode - :defer t + :commands (column-enforce-mode global-column-enforce-mode) :init (progn ;; TODO Ideally find a way to define the minimum length for long lines ;; We may add support for the universal prefix argument in toggles to ;; be able to do this. - (spacemacs|add-toggle long-lines + (spacemacs|add-toggle highlight-long-lines :status column-enforce-mode :on (column-enforce-mode) :off (column-enforce-mode -1) :documentation "Highlight the characters past the 80th column." :evil-leader "t8") - (spacemacs|add-toggle long-lines-globally - :status column-enforce-mode + (spacemacs|add-toggle highlight-long-lines-globally + :status global-column-enforce-mode :on (global-column-enforce-mode) :off (global-column-enforce-mode -1) :documentation "Globally Highlight the characters past the 80th column." From 13fe9f3cc9a6250852d4756d68aaa63820cae946 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Wed, 23 Mar 2016 10:17:46 -0400 Subject: [PATCH 25/40] resclient: add ob-http / org: add support for org-babel languages Add layer variables `restclient-use-org` to use `ob-http` instead of `resctlient` Add support for easy addition of org-babel languages by appending to `org-babel-load-languages` alist in org post-config use-package hook. --- layers/org/packages.el | 45 +++++++++++++++++++++++++---------- layers/restclient/README.org | 31 +++++++++++++++++------- layers/restclient/config.el | 13 ++++++++++ layers/restclient/funcs.el | 15 ++++++++++++ layers/restclient/packages.el | 44 ++++++++++++++++++---------------- 5 files changed, 107 insertions(+), 41 deletions(-) create mode 100644 layers/restclient/config.el create mode 100644 layers/restclient/funcs.el diff --git a/layers/org/packages.el b/layers/org/packages.el index 28d67af502496..288008850b1fe 100644 --- a/layers/org/packages.el +++ b/layers/org/packages.el @@ -20,7 +20,8 @@ gnuplot htmlize mu4e - ;; org and org-agenda are installed by `org-plus-contrib' + ;; ob, org and org-agenda are installed by `org-plus-contrib' + (ob :location built-in) (org :location built-in) (org-agenda :location built-in) (org-plus-contrib :step pre) @@ -83,6 +84,17 @@ ;; dummy init function to force installation of `org-plus-contrib' (defun org/init-org-plus-contrib ()) +(defun org/init-ob () + (use-package ob + :defer t + :init + (progn + (defun spacemacs//org-babel-do-load-languages () + "Load all the languages declared in `org-babel-load-languages'." + (org-babel-do-load-languages 'org-babel-load-languages + org-babel-load-languages)) + (add-hook 'org-mode-hook 'spacemacs//org-babel-do-load-languages)))) + (defun org/init-org () (use-package org :mode ("\\.org$" . org-mode) @@ -287,29 +299,38 @@ Will work on both org-mode and any mode that accepts plain html." ;; `dotspacemacs-major-mode-emacs-leader-key' to `C-c' and the key binding ;; C-c ' is shadowed by `spacemacs/default-pop-shell', effectively making ;; the Emacs user unable to exit src block editing. - (define-key org-src-mode-map (kbd (concat dotspacemacs-major-mode-emacs-leader-key " '")) 'org-edit-src-exit) + (define-key org-src-mode-map + (kbd (concat dotspacemacs-major-mode-emacs-leader-key " '")) + 'org-edit-src-exit) - (spacemacs/set-leader-keys - "Cc" 'org-capture) + (spacemacs/set-leader-keys "Cc" 'org-capture) ;; Evilify the calendar tool on C-c . (unless (eq 'emacs dotspacemacs-editing-style) (define-key org-read-date-minibuffer-local-map (kbd "M-h") - (lambda () (interactive) (org-eval-in-calendar '(calendar-backward-day 1)))) + (lambda () (interactive) + (org-eval-in-calendar '(calendar-backward-day 1)))) (define-key org-read-date-minibuffer-local-map (kbd "M-l") - (lambda () (interactive) (org-eval-in-calendar '(calendar-forward-day 1)))) + (lambda () (interactive) + (org-eval-in-calendar '(calendar-forward-day 1)))) (define-key org-read-date-minibuffer-local-map (kbd "M-k") - (lambda () (interactive) (org-eval-in-calendar '(calendar-backward-week 1)))) + (lambda () (interactive) + (org-eval-in-calendar '(calendar-backward-week 1)))) (define-key org-read-date-minibuffer-local-map (kbd "M-j") - (lambda () (interactive) (org-eval-in-calendar '(calendar-forward-week 1)))) + (lambda () (interactive) + (org-eval-in-calendar '(calendar-forward-week 1)))) (define-key org-read-date-minibuffer-local-map (kbd "M-H") - (lambda () (interactive) (org-eval-in-calendar '(calendar-backward-month 1)))) + (lambda () (interactive) + (org-eval-in-calendar '(calendar-backward-month 1)))) (define-key org-read-date-minibuffer-local-map (kbd "M-L") - (lambda () (interactive) (org-eval-in-calendar '(calendar-forward-month 1)))) + (lambda () (interactive) + (org-eval-in-calendar '(calendar-forward-month 1)))) (define-key org-read-date-minibuffer-local-map (kbd "M-K") - (lambda () (interactive) (org-eval-in-calendar '(calendar-backward-year 1)))) + (lambda () (interactive) + (org-eval-in-calendar '(calendar-backward-year 1)))) (define-key org-read-date-minibuffer-local-map (kbd "M-J") - (lambda () (interactive) (org-eval-in-calendar '(calendar-forward-year 1)))))))) + (lambda () (interactive) + (org-eval-in-calendar '(calendar-forward-year 1)))))))) (defun org/init-org-agenda () (use-package org-agenda diff --git a/layers/restclient/README.org b/layers/restclient/README.org index 9ba3653086a06..411cd0c9b1c0b 100644 --- a/layers/restclient/README.org +++ b/layers/restclient/README.org @@ -2,23 +2,32 @@ #+HTML_HEAD_EXTRA: * Table of Contents :TOC_4_org:noexport: - - [[What is this?][What is this?]] + - [[Description][Description]] - [[Install][Install]] - - [[Keybindings][Keybindings]] + - [[Configuration][Configuration]] + - [[Restclient][Restclient]] + - [[Keybindings][Keybindings]] + - [[ob-http][ob-http]] -* What is this? -This is a package that lets you have a REPL-like interface -for http requests. Full documentation and examples can be found in the -package's [[https://github.com/pashky/restclient.el][GitHub Page]]. - -Also there is an [[http://emacsrocks.com/e15.html][Emacs Rocks!]] episode of it. +* Description +This is a package that lets you have a REPL-like interface for http requests +using a [[http://pashky/restclient.el][restclient]] buffer or an =org= buffer. * Install To use this configuration layer, add it to your =~/.spacemacs=. You will need to add =restclient= to the existing =dotspacemacs-configuration-layers= list in this file. -* Keybindings +* Configuration +By default the layer enables [[http://pashky/restclient.el][restclient]]. It is possible to use =org= via [[http://github.com/zweifisch/ob-http][ob-http]] +by setting the layer variable =restclient-use-org= to =t=. + +* Restclient +Any file with an =.http= extension is opened in a =restclient= buffer. +Full documentation and examples can be found in the package's [[https://github.com/pashky/restclient.el][GitHub Page]]. +Also there is an [[http://emacsrocks.com/e15.html][Emacs Rocks!]] episode of it. + +** Keybindings | Key Binding | Description | |-------------+-------------------------------------------------------------| @@ -28,3 +37,7 @@ file. | ~SPC m R~ | Send and switch window (do not attempt to pretty-print) | | ~SPC m y~ | Copy query under the cursor as a curl command | +* ob-http +Any file with an =.http= extension is opened in an =org= buffer with org babel +configured to use =ob-http=. +Full documentation and examples can be found in the package's [[http://github.com/zweifisch/ob-http][GitHub Page]]. diff --git a/layers/restclient/config.el b/layers/restclient/config.el new file mode 100644 index 0000000000000..68b469ec6c51b --- /dev/null +++ b/layers/restclient/config.el @@ -0,0 +1,13 @@ +;;; config.el --- restclient 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 + +(defvar restclient-use-org nil + "If non-nil use `ob-http' instead of `restclient'.") diff --git a/layers/restclient/funcs.el b/layers/restclient/funcs.el new file mode 100644 index 0000000000000..7384e80fa0eb9 --- /dev/null +++ b/layers/restclient/funcs.el @@ -0,0 +1,15 @@ +;;; funcs.el --- restclient 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 restclient-http-send-current-raw-stay-in-window () + (interactive) + (restclient-http-send-current t t)) diff --git a/layers/restclient/packages.el b/layers/restclient/packages.el index 5f583ae9f9c74..67080f56dce2b 100644 --- a/layers/restclient/packages.el +++ b/layers/restclient/packages.el @@ -1,26 +1,30 @@ +;;; packages.el --- restclient Layer Packages 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 (setq restclient-packages - '( - restclient - ) - ) + '((ob-http :toggle restclient-use-org) + (restclient :toggle (null restclient-use-org)))) + +(defun restclient/init-ob-http () + (use-package ob-http + :mode ("\\.http\\'" . org-mode) + :init (spacemacs|use-package-add-hook org + :post-config (add-to-list 'org-babel-load-languages '(http . t))))) (defun restclient/init-restclient () (use-package restclient :mode ("\\.http\\'" . restclient-mode) :defer t - :init - (progn - - (defun restclient-http-send-current-raw-stay-in-window () - (interactive) - (restclient-http-send-current t t)) - - (spacemacs/set-leader-keys-for-major-mode 'restclient-mode - "s" 'restclient-http-send-current-stay-in-window - "S" 'restclient-http-send-current - "r" 'restclient-http-send-current-raw-stay-in-window - "R" 'restclient-http-send-current-raw - "y" 'restclient-copy-curl-command - )) - ) - ) + :init (spacemacs/set-leader-keys-for-major-mode 'restclient-mode + "s" 'restclient-http-send-current-stay-in-window + "S" 'restclient-http-send-current + "r" 'restclient-http-send-current-raw-stay-in-window + "R" 'restclient-http-send-current-raw + "y" 'restclient-copy-curl-command))) From 8266b5f98d3a07d4f6210c541cd59567ee8b6516 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Wed, 23 Mar 2016 10:28:43 -0400 Subject: [PATCH 26/40] plantuml: update config for org babel and delete packages-config.el --- layers/+lang/plantuml/packages-config.el | 20 -------------------- layers/+lang/plantuml/packages.el | 18 ++++++------------ 2 files changed, 6 insertions(+), 32 deletions(-) delete mode 100644 layers/+lang/plantuml/packages-config.el diff --git a/layers/+lang/plantuml/packages-config.el b/layers/+lang/plantuml/packages-config.el deleted file mode 100644 index 90a54cfb95241..0000000000000 --- a/layers/+lang/plantuml/packages-config.el +++ /dev/null @@ -1,20 +0,0 @@ -;;; packages-config.el --- plantuml layer packages file for Spacemacs. -;; -;; Copyright (c) 2012-2016 Sylvain Benner & Contributors -;; -;; Author: Robert O'Connor -;; URL: https://github.com/robbyoconnor -;; -;; This file is not part of GNU Emacs. -;; -;;; License: GPLv3 - -;;; Commentary: - -;;; Code: - -(defconst plantuml-packages - '(org - puml-mode)) - -;;; packages-config.el ends here diff --git a/layers/+lang/plantuml/packages.el b/layers/+lang/plantuml/packages.el index 463b2f3430cd2..47cd4de3357e9 100644 --- a/layers/+lang/plantuml/packages.el +++ b/layers/+lang/plantuml/packages.el @@ -9,25 +9,19 @@ ;; ;;; License: GPLv3 -;;; Commentary: +(defconst plantuml-packages + '(org + puml-mode)) -;;; Code: +(defun plantuml/post-init-org () + (spacemacs|use-package-add-hook org + :post-config (add-to-list 'org-babel-load-languages '(plantuml . t)))) (defun plantuml/init-puml-mode () (use-package puml-mode :defer t :mode ("\\.pum$" . puml-mode) - :config (spacemacs/set-leader-keys-for-major-mode 'puml-mode "cc" 'puml-preview "co" 'puml-set-output-type))) -(defun plantuml/post-init-org () - (spacemacs|use-package-add-hook org - :post-config - (when (boundp 'org-plantuml-jar-path) - (org-babel-do-load-languages - 'org-babel-load-languages - '((plantuml . t)))))) - -;;; packages.el ends here From 0248e384a2f6a210b9a8de6292ebb0e6a18072e4 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Wed, 23 Mar 2016 17:11:55 -0400 Subject: [PATCH 27/40] restclient: install both ob-http and restclient The variable `restclient-use-org` now just set the auto mode alist it does not select which package to install. --- layers/restclient/packages.el | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/layers/restclient/packages.el b/layers/restclient/packages.el index 67080f56dce2b..efac26ea13224 100644 --- a/layers/restclient/packages.el +++ b/layers/restclient/packages.el @@ -9,22 +9,28 @@ ;; ;;; License: GPLv3 (setq restclient-packages - '((ob-http :toggle restclient-use-org) - (restclient :toggle (null restclient-use-org)))) + '(ob-http + restclient)) (defun restclient/init-ob-http () (use-package ob-http - :mode ("\\.http\\'" . org-mode) - :init (spacemacs|use-package-add-hook org - :post-config (add-to-list 'org-babel-load-languages '(http . t))))) + :init + (progn + (when restclient-use-org + (add-to-list 'auto-mode-alist '("\\.http\\'" . org-mode))) + (spacemacs|use-package-add-hook org + :post-config (add-to-list 'org-babel-load-languages '(http . t)))))) (defun restclient/init-restclient () (use-package restclient - :mode ("\\.http\\'" . restclient-mode) :defer t - :init (spacemacs/set-leader-keys-for-major-mode 'restclient-mode - "s" 'restclient-http-send-current-stay-in-window - "S" 'restclient-http-send-current - "r" 'restclient-http-send-current-raw-stay-in-window - "R" 'restclient-http-send-current-raw - "y" 'restclient-copy-curl-command))) + :init + (progn + (unless restclient-use-org + (add-to-list 'auto-mode-alist '("\\.http\\'" . restclient-mode))) + (spacemacs/set-leader-keys-for-major-mode 'restclient-mode + "s" 'restclient-http-send-current-stay-in-window + "S" 'restclient-http-send-current + "r" 'restclient-http-send-current-raw-stay-in-window + "R" 'restclient-http-send-current-raw + "y" 'restclient-copy-curl-command)))) From 04dc6a79c8ad716c7e10b787c6049bce5bddbfd2 Mon Sep 17 00:00:00 2001 From: Diego Berrocal Date: Mon, 31 Aug 2015 09:54:35 -0500 Subject: [PATCH 28/40] Add Twitter layer --- layers/+fun/twitter/README.org | 43 ++++++++++++++++++++++++++++ layers/+fun/twitter/img/twitter.png | Bin 0 -> 17932 bytes layers/+fun/twitter/packages.el | 36 +++++++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 layers/+fun/twitter/README.org create mode 100644 layers/+fun/twitter/img/twitter.png create mode 100644 layers/+fun/twitter/packages.el diff --git a/layers/+fun/twitter/README.org b/layers/+fun/twitter/README.org new file mode 100644 index 0000000000000..02579927879a0 --- /dev/null +++ b/layers/+fun/twitter/README.org @@ -0,0 +1,43 @@ +#+TITLE: Twitter contribution layer for Spacemacs +[[file:img/twitter.png]] +* Table of Contents :TOC_4_org:noexport: + - [[Description][Description]] + - [[Features][Features]] + - [[Install][Install]] + - [[Layer][Layer]] + - [[Key Bindings][Key Bindings]] + +* Description +This layer adds Twitter support to Spacemacs via the package =twittering-mode=, +do not hesitate to check the original package README [[https://github.com/hayamiz/twittering-mode][here]]. + +* Features +- Activities on Twitter + - Viewing various timelines + - Home timeline + - Replies + - User's timeline + - Public timeline + - Favorites timeline + - Retweets timeline + - Merged timeline + - Timeline without tweets satisfying a condition + - Posting tweets + - Direct message + - ReTweet + - Hash tag + - Signature + - Following and removing users + - Marking tweets as favorites +- HTTP Proxy support +- Secure connection via HTTPS (cURL, GNU Wget, OpenSSL or GnuTLS is required) + +* Install +** Layer +#+begin_src emacs-lisp + (setq-default dotspacemacs-configuration-layers '(twitter)) +#+end_src + +* Key Bindings + +Check out the original package doc [[https://github.com/hayamiz/twittering-mode/blob/master/README.markdown#usage][here]] as the key bindings =feel= evil enough :). diff --git a/layers/+fun/twitter/img/twitter.png b/layers/+fun/twitter/img/twitter.png new file mode 100644 index 0000000000000000000000000000000000000000..6f4efb251da7c8b5c54a518db9e86ed5a9736b4a GIT binary patch literal 17932 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 TQXMQ7xe{*9o=)`+!O8yu&{l6& literal 0 HcmV?d00001 diff --git a/layers/+fun/twitter/packages.el b/layers/+fun/twitter/packages.el new file mode 100644 index 0000000000000..08b17cfe14d62 --- /dev/null +++ b/layers/+fun/twitter/packages.el @@ -0,0 +1,36 @@ +;;; packages.el --- twitter Layer packages File for Spacemacs +;; +;; Copyright (c) 2012-2014 Sylvain Benner +;; Copyright (c) 2014-2015 Sylvain Benner & Contributors +;; +;; Author: Sylvain Benner +;; URL: https://github.com/syl20bnr/spacemacs +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 + +;; List of all packages to install and/or initialize. Built-in packages +;; which require an initialization must be listed explicitly in the list. +(setq twitter-packages + '(twittering-mode)) + +(defun twitter/init-twittering-mode () + (use-package twittering-mode + :commands twit + :init + (evil-leader/set-key + "at" 'twit) + (when (configuration-layer/package-usedp 'flyspell) + (add-hook 'twittering-edit-mode-hook (lambda () (flyspell-mode 1)))) + (push 'twittering-edit-mode evil-insert-state-modes) + :config + (setq twitter-images-directory + (expand-file-name + (concat spacemacs-cache-directory "twitter-images"))) + (unless (file-exists-p twitter-images-directory) + (make-directory twitter-images-directory)) + (setq twittering-icon-mode t) + (setq twittering-url-show-status nil) + (setq twittering-use-master-password t) + (setq twittering-use-icon-storage 1))) From 9d0558992cf1d7921f480223aeb3f8efdc5939e0 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Wed, 23 Mar 2016 21:39:43 -0400 Subject: [PATCH 29/40] layers directory: create new categories +chat +checkers +emacs +intl +os +pair-programming +tags +theme +web-services --- core/core-documentation.el | 6 ++++-- layers/{+irc => +chat}/erc/README.org | 0 layers/{+irc => +chat}/erc/config.el | 0 .../{+irc => +chat}/erc/local/erc-sasl/erc-sasl.el | 0 layers/{+irc => +chat}/erc/local/erc-tex/erc-tex.el | 0 layers/{+irc => +chat}/erc/local/erc-yank/README.md | 0 .../{+irc => +chat}/erc/local/erc-yank/erc-yank.el | 0 layers/{+irc => +chat}/erc/packages.el | 0 layers/{ => +chat}/jabber/README.org | 0 layers/{ => +chat}/jabber/img/attribution.md | 0 layers/{ => +chat}/jabber/img/jabber-logo.gif | Bin layers/{ => +chat}/jabber/packages.el | 0 layers/{+irc => +chat}/rcirc/README.org | 0 layers/{+irc => +chat}/rcirc/config.el | 0 layers/{+irc => +chat}/rcirc/funcs.el | 0 layers/{+irc => +chat}/rcirc/img/irc.png | Bin .../rcirc/local/helm-rcirc/README.md | 0 .../rcirc/local/helm-rcirc/helm-rcirc.el | 0 .../rcirc/local/rcirc-late-fix/rcirc-late-fix.el | 0 .../rcirc/local/rcirc-reconnect/rcirc-reconnect.el | 0 layers/{+irc => +chat}/rcirc/packages.el | 0 layers/{ => +checkers}/spell-checking/README.org | 0 layers/{ => +checkers}/spell-checking/config.el | 0 layers/{ => +checkers}/spell-checking/funcs.el | 0 layers/{ => +checkers}/spell-checking/packages.el | 0 layers/{ => +checkers}/syntax-checking/README.org | 0 layers/{ => +checkers}/syntax-checking/config.el | 0 layers/{ => +checkers}/syntax-checking/funcs.el | 0 .../syntax-checking/img/flycheck.png | Bin layers/{ => +checkers}/syntax-checking/packages.el | 0 layers/{ => +completion}/auto-completion/README.org | 0 layers/{ => +completion}/auto-completion/config.el | 0 layers/{ => +completion}/auto-completion/funcs.el | 0 .../{ => +completion}/auto-completion/packages.el | 0 .../snippets/emacs-lisp-mode/.yas-parents | 0 .../snippets/emacs-lisp-mode/.yas-setup.el | 0 .../snippets/emacs-lisp-mode/micro-state | 0 .../snippets/emacs-lisp-mode/new-package | 0 layers/{ => +emacs}/better-defaults/README.org | 0 layers/{ => +emacs}/better-defaults/funcs.el | 0 layers/{ => +emacs}/better-defaults/img/emacs.png | Bin layers/{ => +emacs}/better-defaults/keybindings.el | 0 layers/{ => +emacs}/ibuffer/README.org | 0 layers/{ => +emacs}/ibuffer/config.el | 0 layers/{ => +emacs}/ibuffer/funcs.el | 0 layers/{ => +emacs}/ibuffer/packages.el | 0 layers/{ => +emacs}/org/README.org | 0 layers/{ => +emacs}/org/config.el | 0 layers/{ => +emacs}/org/img/org.png | Bin layers/{ => +emacs}/org/local/evil-org/evil-org.el | 0 layers/{ => +emacs}/org/local/ox-gfm/ox-gfm.el | 0 layers/{ => +emacs}/org/org-async-init.el | 0 layers/{ => +emacs}/org/packages.el | 0 layers/{ => +emacs}/semantic/README.org | 0 layers/{ => +emacs}/semantic/packages.el | 0 layers/{ => +emacs}/smex/README.org | 0 layers/{ => +emacs}/smex/img/smex.png | Bin layers/{ => +emacs}/smex/packages.el | 0 layers/{ => +emacs}/typography/README.org | 0 layers/{ => +emacs}/typography/config.el | 0 layers/{ => +emacs}/typography/packages.el | 0 layers/{ => +intl}/chinese/README.org | 0 layers/{ => +intl}/chinese/config.el | 0 layers/{ => +intl}/chinese/img/China.png | Bin layers/{ => +intl}/chinese/img/Chinese.png | Bin layers/{ => +intl}/chinese/packages.el | 0 layers/{ => +os}/nixos/README.org | 0 layers/{ => +os}/nixos/config.el | 0 layers/{ => +os}/nixos/img/nixos.jpg | Bin layers/{ => +os}/nixos/packages.el | 0 layers/{ => +os}/osx/README.org | 0 layers/{ => +os}/osx/config.el | 0 layers/{ => +os}/osx/img/apple.png | Bin layers/{ => +os}/osx/img/osx.png | Bin layers/{ => +os}/osx/keybindings.el | 0 layers/{ => +os}/osx/packages.el | 0 layers/{ => +pair-programming}/floobits/README.org | 0 .../floobits/img/floobits.png | Bin layers/{ => +pair-programming}/floobits/packages.el | 0 layers/{ => +tags}/cscope/README.org | 0 layers/{ => +tags}/cscope/img/cscope.jpg | Bin layers/{ => +tags}/cscope/packages.el | 0 layers/{ => +tags}/gtags/README.org | 0 layers/{ => +tags}/gtags/funcs.el | 0 layers/{ => +tags}/gtags/packages.el | 0 layers/{ => +themes}/colors/README.org | 0 layers/{ => +themes}/colors/config.el | 0 layers/{ => +themes}/colors/img/rainbow-mode.png | Bin layers/{ => +themes}/colors/img/rainbow_dash.png | Bin .../colors/img/theme-tweaks-python.png | Bin .../{ => +themes}/colors/local/nyan-mode/README.org | 0 .../colors/local/nyan-mode/img/nyan-frame-1.xpm | 0 .../colors/local/nyan-mode/img/nyan-frame-2.xpm | 0 .../colors/local/nyan-mode/img/nyan-frame-3.xpm | 0 .../colors/local/nyan-mode/img/nyan-frame-4.xpm | 0 .../colors/local/nyan-mode/img/nyan-frame-5.xpm | 0 .../colors/local/nyan-mode/img/nyan-frame-6.xpm | 0 .../colors/local/nyan-mode/img/nyan-start.xpm | 0 .../colors/local/nyan-mode/img/nyan.xpm | 0 .../colors/local/nyan-mode/img/outerspace.xpm | 0 .../colors/local/nyan-mode/img/rainbow-start.xpm | 0 .../colors/local/nyan-mode/img/rainbow.xpm | 0 .../colors/local/nyan-mode/mus/nyanlooped.mp3 | Bin .../colors/local/nyan-mode/nyan-mode.el | 0 layers/{ => +themes}/colors/packages.el | 0 layers/{ => +themes}/themes-megapack/README.org | 0 layers/{ => +themes}/themes-megapack/packages.el | 0 layers/{ => +themes}/theming/README.org | 0 layers/{ => +themes}/theming/config.el | 0 layers/{ => +themes}/theming/funcs.el | 0 layers/{ => +tools}/chrome/README.org | 0 layers/{ => +tools}/chrome/img/chrome.png | Bin layers/{ => +tools}/chrome/packages.el | 0 layers/{ => +tools}/deft/README.org | 0 layers/{ => +tools}/deft/packages.el | 0 layers/{ => +tools}/finance/README.org | 0 layers/{ => +tools}/finance/config.el | 0 layers/{ => +tools}/finance/img/ledger.png | Bin layers/{ => +tools}/finance/packages.el | 0 layers/{ => +tools}/geolocation/README.org | 0 layers/{ => +tools}/geolocation/config.el | 0 layers/{ => +tools}/geolocation/extensions.el | 0 .../extensions/theme-changer/theme-changer.el | 0 .../geolocation/img/emacs-location-helper.jpg | Bin .../{ => +tools}/geolocation/img/emacs-sunshine.jpg | Bin layers/{ => +tools}/geolocation/packages.el | 0 layers/{ => +tools}/prodigy/README.org | 0 layers/{ => +tools}/prodigy/img/prodigy.png | Bin layers/{ => +tools}/prodigy/packages.el | 0 layers/{ => +tools}/restclient/README.org | 0 layers/{ => +tools}/restclient/config.el | 0 layers/{ => +tools}/restclient/funcs.el | 0 layers/{ => +tools}/restclient/packages.el | 0 layers/{ => +tools}/shell/README.org | 0 layers/{ => +tools}/shell/config.el | 0 layers/{ => +tools}/shell/funcs.el | 0 layers/{ => +tools}/shell/img/shell.png | Bin layers/{ => +tools}/shell/packages.el | 0 layers/{ => +tools}/speed-reading/README.org | 0 layers/{ => +tools}/speed-reading/packages.el | 0 layers/{+tools => +web-services}/elfeed/README.org | 0 layers/{+tools => +web-services}/elfeed/config.el | 0 .../{+tools => +web-services}/elfeed/img/elfeed.png | Bin .../elfeed/packages-config.el | 0 layers/{+tools => +web-services}/elfeed/packages.el | 0 .../{+tools => +web-services}/evernote/README.org | 0 layers/{+tools => +web-services}/evernote/config.el | 0 .../evernote/img/evernote.png | Bin .../evernote/img/geeknote.png | Bin .../{+tools => +web-services}/evernote/packages.el | 0 layers/{ => +web-services}/search-engine/README.org | 0 .../search-engine/img/searchengine.jpg | Bin .../{ => +web-services}/search-engine/packages.el | 0 layers/{ => +web-services}/spotify/README.org | 0 layers/{ => +web-services}/spotify/config.el | 0 layers/{ => +web-services}/spotify/img/spotify.png | Bin layers/{ => +web-services}/spotify/packages.el | 0 layers/{+fun => +web-services}/twitter/README.org | 0 .../{+fun => +web-services}/twitter/img/twitter.png | Bin layers/{+fun => +web-services}/twitter/packages.el | 0 .../{+tools => +web-services}/wakatime/README.org | 0 .../wakatime/img/wakatime.png | Bin .../{+tools => +web-services}/wakatime/packages.el | 0 163 files changed, 4 insertions(+), 2 deletions(-) rename layers/{+irc => +chat}/erc/README.org (100%) rename layers/{+irc => +chat}/erc/config.el (100%) rename layers/{+irc => +chat}/erc/local/erc-sasl/erc-sasl.el (100%) rename layers/{+irc => +chat}/erc/local/erc-tex/erc-tex.el (100%) rename layers/{+irc => +chat}/erc/local/erc-yank/README.md (100%) rename layers/{+irc => +chat}/erc/local/erc-yank/erc-yank.el (100%) rename layers/{+irc => +chat}/erc/packages.el (100%) rename layers/{ => +chat}/jabber/README.org (100%) rename layers/{ => +chat}/jabber/img/attribution.md (100%) rename layers/{ => +chat}/jabber/img/jabber-logo.gif (100%) rename layers/{ => +chat}/jabber/packages.el (100%) rename layers/{+irc => +chat}/rcirc/README.org (100%) rename layers/{+irc => +chat}/rcirc/config.el (100%) rename layers/{+irc => +chat}/rcirc/funcs.el (100%) rename layers/{+irc => +chat}/rcirc/img/irc.png (100%) rename layers/{+irc => +chat}/rcirc/local/helm-rcirc/README.md (100%) rename layers/{+irc => +chat}/rcirc/local/helm-rcirc/helm-rcirc.el (100%) rename layers/{+irc => +chat}/rcirc/local/rcirc-late-fix/rcirc-late-fix.el (100%) rename layers/{+irc => +chat}/rcirc/local/rcirc-reconnect/rcirc-reconnect.el (100%) rename layers/{+irc => +chat}/rcirc/packages.el (100%) rename layers/{ => +checkers}/spell-checking/README.org (100%) rename layers/{ => +checkers}/spell-checking/config.el (100%) rename layers/{ => +checkers}/spell-checking/funcs.el (100%) rename layers/{ => +checkers}/spell-checking/packages.el (100%) rename layers/{ => +checkers}/syntax-checking/README.org (100%) rename layers/{ => +checkers}/syntax-checking/config.el (100%) rename layers/{ => +checkers}/syntax-checking/funcs.el (100%) rename layers/{ => +checkers}/syntax-checking/img/flycheck.png (100%) rename layers/{ => +checkers}/syntax-checking/packages.el (100%) rename layers/{ => +completion}/auto-completion/README.org (100%) rename layers/{ => +completion}/auto-completion/config.el (100%) rename layers/{ => +completion}/auto-completion/funcs.el (100%) rename layers/{ => +completion}/auto-completion/packages.el (100%) rename layers/{ => +completion}/auto-completion/snippets/emacs-lisp-mode/.yas-parents (100%) rename layers/{ => +completion}/auto-completion/snippets/emacs-lisp-mode/.yas-setup.el (100%) rename layers/{ => +completion}/auto-completion/snippets/emacs-lisp-mode/micro-state (100%) rename layers/{ => +completion}/auto-completion/snippets/emacs-lisp-mode/new-package (100%) rename layers/{ => +emacs}/better-defaults/README.org (100%) rename layers/{ => +emacs}/better-defaults/funcs.el (100%) rename layers/{ => +emacs}/better-defaults/img/emacs.png (100%) rename layers/{ => +emacs}/better-defaults/keybindings.el (100%) rename layers/{ => +emacs}/ibuffer/README.org (100%) rename layers/{ => +emacs}/ibuffer/config.el (100%) rename layers/{ => +emacs}/ibuffer/funcs.el (100%) rename layers/{ => +emacs}/ibuffer/packages.el (100%) rename layers/{ => +emacs}/org/README.org (100%) rename layers/{ => +emacs}/org/config.el (100%) rename layers/{ => +emacs}/org/img/org.png (100%) rename layers/{ => +emacs}/org/local/evil-org/evil-org.el (100%) rename layers/{ => +emacs}/org/local/ox-gfm/ox-gfm.el (100%) rename layers/{ => +emacs}/org/org-async-init.el (100%) rename layers/{ => +emacs}/org/packages.el (100%) rename layers/{ => +emacs}/semantic/README.org (100%) rename layers/{ => +emacs}/semantic/packages.el (100%) rename layers/{ => +emacs}/smex/README.org (100%) rename layers/{ => +emacs}/smex/img/smex.png (100%) rename layers/{ => +emacs}/smex/packages.el (100%) rename layers/{ => +emacs}/typography/README.org (100%) rename layers/{ => +emacs}/typography/config.el (100%) rename layers/{ => +emacs}/typography/packages.el (100%) rename layers/{ => +intl}/chinese/README.org (100%) rename layers/{ => +intl}/chinese/config.el (100%) rename layers/{ => +intl}/chinese/img/China.png (100%) rename layers/{ => +intl}/chinese/img/Chinese.png (100%) rename layers/{ => +intl}/chinese/packages.el (100%) rename layers/{ => +os}/nixos/README.org (100%) rename layers/{ => +os}/nixos/config.el (100%) rename layers/{ => +os}/nixos/img/nixos.jpg (100%) rename layers/{ => +os}/nixos/packages.el (100%) rename layers/{ => +os}/osx/README.org (100%) rename layers/{ => +os}/osx/config.el (100%) rename layers/{ => +os}/osx/img/apple.png (100%) rename layers/{ => +os}/osx/img/osx.png (100%) rename layers/{ => +os}/osx/keybindings.el (100%) rename layers/{ => +os}/osx/packages.el (100%) rename layers/{ => +pair-programming}/floobits/README.org (100%) rename layers/{ => +pair-programming}/floobits/img/floobits.png (100%) rename layers/{ => +pair-programming}/floobits/packages.el (100%) rename layers/{ => +tags}/cscope/README.org (100%) rename layers/{ => +tags}/cscope/img/cscope.jpg (100%) rename layers/{ => +tags}/cscope/packages.el (100%) rename layers/{ => +tags}/gtags/README.org (100%) rename layers/{ => +tags}/gtags/funcs.el (100%) rename layers/{ => +tags}/gtags/packages.el (100%) rename layers/{ => +themes}/colors/README.org (100%) rename layers/{ => +themes}/colors/config.el (100%) rename layers/{ => +themes}/colors/img/rainbow-mode.png (100%) rename layers/{ => +themes}/colors/img/rainbow_dash.png (100%) rename layers/{ => +themes}/colors/img/theme-tweaks-python.png (100%) rename layers/{ => +themes}/colors/local/nyan-mode/README.org (100%) rename layers/{ => +themes}/colors/local/nyan-mode/img/nyan-frame-1.xpm (100%) rename layers/{ => +themes}/colors/local/nyan-mode/img/nyan-frame-2.xpm (100%) rename layers/{ => +themes}/colors/local/nyan-mode/img/nyan-frame-3.xpm (100%) rename layers/{ => +themes}/colors/local/nyan-mode/img/nyan-frame-4.xpm (100%) rename layers/{ => +themes}/colors/local/nyan-mode/img/nyan-frame-5.xpm (100%) rename layers/{ => +themes}/colors/local/nyan-mode/img/nyan-frame-6.xpm (100%) rename layers/{ => +themes}/colors/local/nyan-mode/img/nyan-start.xpm (100%) rename layers/{ => +themes}/colors/local/nyan-mode/img/nyan.xpm (100%) rename layers/{ => +themes}/colors/local/nyan-mode/img/outerspace.xpm (100%) rename layers/{ => +themes}/colors/local/nyan-mode/img/rainbow-start.xpm (100%) rename layers/{ => +themes}/colors/local/nyan-mode/img/rainbow.xpm (100%) rename layers/{ => +themes}/colors/local/nyan-mode/mus/nyanlooped.mp3 (100%) rename layers/{ => +themes}/colors/local/nyan-mode/nyan-mode.el (100%) rename layers/{ => +themes}/colors/packages.el (100%) rename layers/{ => +themes}/themes-megapack/README.org (100%) rename layers/{ => +themes}/themes-megapack/packages.el (100%) rename layers/{ => +themes}/theming/README.org (100%) rename layers/{ => +themes}/theming/config.el (100%) rename layers/{ => +themes}/theming/funcs.el (100%) rename layers/{ => +tools}/chrome/README.org (100%) rename layers/{ => +tools}/chrome/img/chrome.png (100%) rename layers/{ => +tools}/chrome/packages.el (100%) rename layers/{ => +tools}/deft/README.org (100%) rename layers/{ => +tools}/deft/packages.el (100%) rename layers/{ => +tools}/finance/README.org (100%) rename layers/{ => +tools}/finance/config.el (100%) rename layers/{ => +tools}/finance/img/ledger.png (100%) rename layers/{ => +tools}/finance/packages.el (100%) rename layers/{ => +tools}/geolocation/README.org (100%) rename layers/{ => +tools}/geolocation/config.el (100%) rename layers/{ => +tools}/geolocation/extensions.el (100%) rename layers/{ => +tools}/geolocation/extensions/theme-changer/theme-changer.el (100%) rename layers/{ => +tools}/geolocation/img/emacs-location-helper.jpg (100%) rename layers/{ => +tools}/geolocation/img/emacs-sunshine.jpg (100%) rename layers/{ => +tools}/geolocation/packages.el (100%) rename layers/{ => +tools}/prodigy/README.org (100%) rename layers/{ => +tools}/prodigy/img/prodigy.png (100%) rename layers/{ => +tools}/prodigy/packages.el (100%) rename layers/{ => +tools}/restclient/README.org (100%) rename layers/{ => +tools}/restclient/config.el (100%) rename layers/{ => +tools}/restclient/funcs.el (100%) rename layers/{ => +tools}/restclient/packages.el (100%) rename layers/{ => +tools}/shell/README.org (100%) rename layers/{ => +tools}/shell/config.el (100%) rename layers/{ => +tools}/shell/funcs.el (100%) rename layers/{ => +tools}/shell/img/shell.png (100%) rename layers/{ => +tools}/shell/packages.el (100%) rename layers/{ => +tools}/speed-reading/README.org (100%) rename layers/{ => +tools}/speed-reading/packages.el (100%) rename layers/{+tools => +web-services}/elfeed/README.org (100%) rename layers/{+tools => +web-services}/elfeed/config.el (100%) rename layers/{+tools => +web-services}/elfeed/img/elfeed.png (100%) rename layers/{+tools => +web-services}/elfeed/packages-config.el (100%) rename layers/{+tools => +web-services}/elfeed/packages.el (100%) rename layers/{+tools => +web-services}/evernote/README.org (100%) rename layers/{+tools => +web-services}/evernote/config.el (100%) rename layers/{+tools => +web-services}/evernote/img/evernote.png (100%) rename layers/{+tools => +web-services}/evernote/img/geeknote.png (100%) rename layers/{+tools => +web-services}/evernote/packages.el (100%) rename layers/{ => +web-services}/search-engine/README.org (100%) rename layers/{ => +web-services}/search-engine/img/searchengine.jpg (100%) rename layers/{ => +web-services}/search-engine/packages.el (100%) rename layers/{ => +web-services}/spotify/README.org (100%) rename layers/{ => +web-services}/spotify/config.el (100%) rename layers/{ => +web-services}/spotify/img/spotify.png (100%) rename layers/{ => +web-services}/spotify/packages.el (100%) rename layers/{+fun => +web-services}/twitter/README.org (100%) rename layers/{+fun => +web-services}/twitter/img/twitter.png (100%) rename layers/{+fun => +web-services}/twitter/packages.el (100%) rename layers/{+tools => +web-services}/wakatime/README.org (100%) rename layers/{+tools => +web-services}/wakatime/img/wakatime.png (100%) rename layers/{+tools => +web-services}/wakatime/packages.el (100%) diff --git a/core/core-documentation.el b/core/core-documentation.el index e264a641bb08c..b5ee897b0e87b 100644 --- a/core/core-documentation.el +++ b/core/core-documentation.el @@ -17,8 +17,10 @@ (defvar spacemacs--category-names '(("config-files" . "Configuration files") ("email" . "E-mail") - ("irc" . "IRC") - ("lang" . "Programming and markup languages")) + ("intl" . "International support") + ("lang" . "Programming and markup languages") + ("os" . "Operating systems") + ("spacemacs" . "Spacemacs distribution layers")) "Special names for categories. Used to generate the layers list.") (defun spacemacs//generate-layers-from-path (path level) diff --git a/layers/+irc/erc/README.org b/layers/+chat/erc/README.org similarity index 100% rename from layers/+irc/erc/README.org rename to layers/+chat/erc/README.org diff --git a/layers/+irc/erc/config.el b/layers/+chat/erc/config.el similarity index 100% rename from layers/+irc/erc/config.el rename to layers/+chat/erc/config.el diff --git a/layers/+irc/erc/local/erc-sasl/erc-sasl.el b/layers/+chat/erc/local/erc-sasl/erc-sasl.el similarity index 100% rename from layers/+irc/erc/local/erc-sasl/erc-sasl.el rename to layers/+chat/erc/local/erc-sasl/erc-sasl.el diff --git a/layers/+irc/erc/local/erc-tex/erc-tex.el b/layers/+chat/erc/local/erc-tex/erc-tex.el similarity index 100% rename from layers/+irc/erc/local/erc-tex/erc-tex.el rename to layers/+chat/erc/local/erc-tex/erc-tex.el diff --git a/layers/+irc/erc/local/erc-yank/README.md b/layers/+chat/erc/local/erc-yank/README.md similarity index 100% rename from layers/+irc/erc/local/erc-yank/README.md rename to layers/+chat/erc/local/erc-yank/README.md diff --git a/layers/+irc/erc/local/erc-yank/erc-yank.el b/layers/+chat/erc/local/erc-yank/erc-yank.el similarity index 100% rename from layers/+irc/erc/local/erc-yank/erc-yank.el rename to layers/+chat/erc/local/erc-yank/erc-yank.el diff --git a/layers/+irc/erc/packages.el b/layers/+chat/erc/packages.el similarity index 100% rename from layers/+irc/erc/packages.el rename to layers/+chat/erc/packages.el diff --git a/layers/jabber/README.org b/layers/+chat/jabber/README.org similarity index 100% rename from layers/jabber/README.org rename to layers/+chat/jabber/README.org diff --git a/layers/jabber/img/attribution.md b/layers/+chat/jabber/img/attribution.md similarity index 100% rename from layers/jabber/img/attribution.md rename to layers/+chat/jabber/img/attribution.md diff --git a/layers/jabber/img/jabber-logo.gif b/layers/+chat/jabber/img/jabber-logo.gif similarity index 100% rename from layers/jabber/img/jabber-logo.gif rename to layers/+chat/jabber/img/jabber-logo.gif diff --git a/layers/jabber/packages.el b/layers/+chat/jabber/packages.el similarity index 100% rename from layers/jabber/packages.el rename to layers/+chat/jabber/packages.el diff --git a/layers/+irc/rcirc/README.org b/layers/+chat/rcirc/README.org similarity index 100% rename from layers/+irc/rcirc/README.org rename to layers/+chat/rcirc/README.org diff --git a/layers/+irc/rcirc/config.el b/layers/+chat/rcirc/config.el similarity index 100% rename from layers/+irc/rcirc/config.el rename to layers/+chat/rcirc/config.el diff --git a/layers/+irc/rcirc/funcs.el b/layers/+chat/rcirc/funcs.el similarity index 100% rename from layers/+irc/rcirc/funcs.el rename to layers/+chat/rcirc/funcs.el diff --git a/layers/+irc/rcirc/img/irc.png b/layers/+chat/rcirc/img/irc.png similarity index 100% rename from layers/+irc/rcirc/img/irc.png rename to layers/+chat/rcirc/img/irc.png diff --git a/layers/+irc/rcirc/local/helm-rcirc/README.md b/layers/+chat/rcirc/local/helm-rcirc/README.md similarity index 100% rename from layers/+irc/rcirc/local/helm-rcirc/README.md rename to layers/+chat/rcirc/local/helm-rcirc/README.md diff --git a/layers/+irc/rcirc/local/helm-rcirc/helm-rcirc.el b/layers/+chat/rcirc/local/helm-rcirc/helm-rcirc.el similarity index 100% rename from layers/+irc/rcirc/local/helm-rcirc/helm-rcirc.el rename to layers/+chat/rcirc/local/helm-rcirc/helm-rcirc.el diff --git a/layers/+irc/rcirc/local/rcirc-late-fix/rcirc-late-fix.el b/layers/+chat/rcirc/local/rcirc-late-fix/rcirc-late-fix.el similarity index 100% rename from layers/+irc/rcirc/local/rcirc-late-fix/rcirc-late-fix.el rename to layers/+chat/rcirc/local/rcirc-late-fix/rcirc-late-fix.el diff --git a/layers/+irc/rcirc/local/rcirc-reconnect/rcirc-reconnect.el b/layers/+chat/rcirc/local/rcirc-reconnect/rcirc-reconnect.el similarity index 100% rename from layers/+irc/rcirc/local/rcirc-reconnect/rcirc-reconnect.el rename to layers/+chat/rcirc/local/rcirc-reconnect/rcirc-reconnect.el diff --git a/layers/+irc/rcirc/packages.el b/layers/+chat/rcirc/packages.el similarity index 100% rename from layers/+irc/rcirc/packages.el rename to layers/+chat/rcirc/packages.el diff --git a/layers/spell-checking/README.org b/layers/+checkers/spell-checking/README.org similarity index 100% rename from layers/spell-checking/README.org rename to layers/+checkers/spell-checking/README.org diff --git a/layers/spell-checking/config.el b/layers/+checkers/spell-checking/config.el similarity index 100% rename from layers/spell-checking/config.el rename to layers/+checkers/spell-checking/config.el diff --git a/layers/spell-checking/funcs.el b/layers/+checkers/spell-checking/funcs.el similarity index 100% rename from layers/spell-checking/funcs.el rename to layers/+checkers/spell-checking/funcs.el diff --git a/layers/spell-checking/packages.el b/layers/+checkers/spell-checking/packages.el similarity index 100% rename from layers/spell-checking/packages.el rename to layers/+checkers/spell-checking/packages.el diff --git a/layers/syntax-checking/README.org b/layers/+checkers/syntax-checking/README.org similarity index 100% rename from layers/syntax-checking/README.org rename to layers/+checkers/syntax-checking/README.org diff --git a/layers/syntax-checking/config.el b/layers/+checkers/syntax-checking/config.el similarity index 100% rename from layers/syntax-checking/config.el rename to layers/+checkers/syntax-checking/config.el diff --git a/layers/syntax-checking/funcs.el b/layers/+checkers/syntax-checking/funcs.el similarity index 100% rename from layers/syntax-checking/funcs.el rename to layers/+checkers/syntax-checking/funcs.el diff --git a/layers/syntax-checking/img/flycheck.png b/layers/+checkers/syntax-checking/img/flycheck.png similarity index 100% rename from layers/syntax-checking/img/flycheck.png rename to layers/+checkers/syntax-checking/img/flycheck.png diff --git a/layers/syntax-checking/packages.el b/layers/+checkers/syntax-checking/packages.el similarity index 100% rename from layers/syntax-checking/packages.el rename to layers/+checkers/syntax-checking/packages.el diff --git a/layers/auto-completion/README.org b/layers/+completion/auto-completion/README.org similarity index 100% rename from layers/auto-completion/README.org rename to layers/+completion/auto-completion/README.org diff --git a/layers/auto-completion/config.el b/layers/+completion/auto-completion/config.el similarity index 100% rename from layers/auto-completion/config.el rename to layers/+completion/auto-completion/config.el diff --git a/layers/auto-completion/funcs.el b/layers/+completion/auto-completion/funcs.el similarity index 100% rename from layers/auto-completion/funcs.el rename to layers/+completion/auto-completion/funcs.el diff --git a/layers/auto-completion/packages.el b/layers/+completion/auto-completion/packages.el similarity index 100% rename from layers/auto-completion/packages.el rename to layers/+completion/auto-completion/packages.el diff --git a/layers/auto-completion/snippets/emacs-lisp-mode/.yas-parents b/layers/+completion/auto-completion/snippets/emacs-lisp-mode/.yas-parents similarity index 100% rename from layers/auto-completion/snippets/emacs-lisp-mode/.yas-parents rename to layers/+completion/auto-completion/snippets/emacs-lisp-mode/.yas-parents diff --git a/layers/auto-completion/snippets/emacs-lisp-mode/.yas-setup.el b/layers/+completion/auto-completion/snippets/emacs-lisp-mode/.yas-setup.el similarity index 100% rename from layers/auto-completion/snippets/emacs-lisp-mode/.yas-setup.el rename to layers/+completion/auto-completion/snippets/emacs-lisp-mode/.yas-setup.el diff --git a/layers/auto-completion/snippets/emacs-lisp-mode/micro-state b/layers/+completion/auto-completion/snippets/emacs-lisp-mode/micro-state similarity index 100% rename from layers/auto-completion/snippets/emacs-lisp-mode/micro-state rename to layers/+completion/auto-completion/snippets/emacs-lisp-mode/micro-state diff --git a/layers/auto-completion/snippets/emacs-lisp-mode/new-package b/layers/+completion/auto-completion/snippets/emacs-lisp-mode/new-package similarity index 100% rename from layers/auto-completion/snippets/emacs-lisp-mode/new-package rename to layers/+completion/auto-completion/snippets/emacs-lisp-mode/new-package diff --git a/layers/better-defaults/README.org b/layers/+emacs/better-defaults/README.org similarity index 100% rename from layers/better-defaults/README.org rename to layers/+emacs/better-defaults/README.org diff --git a/layers/better-defaults/funcs.el b/layers/+emacs/better-defaults/funcs.el similarity index 100% rename from layers/better-defaults/funcs.el rename to layers/+emacs/better-defaults/funcs.el diff --git a/layers/better-defaults/img/emacs.png b/layers/+emacs/better-defaults/img/emacs.png similarity index 100% rename from layers/better-defaults/img/emacs.png rename to layers/+emacs/better-defaults/img/emacs.png diff --git a/layers/better-defaults/keybindings.el b/layers/+emacs/better-defaults/keybindings.el similarity index 100% rename from layers/better-defaults/keybindings.el rename to layers/+emacs/better-defaults/keybindings.el diff --git a/layers/ibuffer/README.org b/layers/+emacs/ibuffer/README.org similarity index 100% rename from layers/ibuffer/README.org rename to layers/+emacs/ibuffer/README.org diff --git a/layers/ibuffer/config.el b/layers/+emacs/ibuffer/config.el similarity index 100% rename from layers/ibuffer/config.el rename to layers/+emacs/ibuffer/config.el diff --git a/layers/ibuffer/funcs.el b/layers/+emacs/ibuffer/funcs.el similarity index 100% rename from layers/ibuffer/funcs.el rename to layers/+emacs/ibuffer/funcs.el diff --git a/layers/ibuffer/packages.el b/layers/+emacs/ibuffer/packages.el similarity index 100% rename from layers/ibuffer/packages.el rename to layers/+emacs/ibuffer/packages.el diff --git a/layers/org/README.org b/layers/+emacs/org/README.org similarity index 100% rename from layers/org/README.org rename to layers/+emacs/org/README.org diff --git a/layers/org/config.el b/layers/+emacs/org/config.el similarity index 100% rename from layers/org/config.el rename to layers/+emacs/org/config.el diff --git a/layers/org/img/org.png b/layers/+emacs/org/img/org.png similarity index 100% rename from layers/org/img/org.png rename to layers/+emacs/org/img/org.png diff --git a/layers/org/local/evil-org/evil-org.el b/layers/+emacs/org/local/evil-org/evil-org.el similarity index 100% rename from layers/org/local/evil-org/evil-org.el rename to layers/+emacs/org/local/evil-org/evil-org.el diff --git a/layers/org/local/ox-gfm/ox-gfm.el b/layers/+emacs/org/local/ox-gfm/ox-gfm.el similarity index 100% rename from layers/org/local/ox-gfm/ox-gfm.el rename to layers/+emacs/org/local/ox-gfm/ox-gfm.el diff --git a/layers/org/org-async-init.el b/layers/+emacs/org/org-async-init.el similarity index 100% rename from layers/org/org-async-init.el rename to layers/+emacs/org/org-async-init.el diff --git a/layers/org/packages.el b/layers/+emacs/org/packages.el similarity index 100% rename from layers/org/packages.el rename to layers/+emacs/org/packages.el diff --git a/layers/semantic/README.org b/layers/+emacs/semantic/README.org similarity index 100% rename from layers/semantic/README.org rename to layers/+emacs/semantic/README.org diff --git a/layers/semantic/packages.el b/layers/+emacs/semantic/packages.el similarity index 100% rename from layers/semantic/packages.el rename to layers/+emacs/semantic/packages.el diff --git a/layers/smex/README.org b/layers/+emacs/smex/README.org similarity index 100% rename from layers/smex/README.org rename to layers/+emacs/smex/README.org diff --git a/layers/smex/img/smex.png b/layers/+emacs/smex/img/smex.png similarity index 100% rename from layers/smex/img/smex.png rename to layers/+emacs/smex/img/smex.png diff --git a/layers/smex/packages.el b/layers/+emacs/smex/packages.el similarity index 100% rename from layers/smex/packages.el rename to layers/+emacs/smex/packages.el diff --git a/layers/typography/README.org b/layers/+emacs/typography/README.org similarity index 100% rename from layers/typography/README.org rename to layers/+emacs/typography/README.org diff --git a/layers/typography/config.el b/layers/+emacs/typography/config.el similarity index 100% rename from layers/typography/config.el rename to layers/+emacs/typography/config.el diff --git a/layers/typography/packages.el b/layers/+emacs/typography/packages.el similarity index 100% rename from layers/typography/packages.el rename to layers/+emacs/typography/packages.el diff --git a/layers/chinese/README.org b/layers/+intl/chinese/README.org similarity index 100% rename from layers/chinese/README.org rename to layers/+intl/chinese/README.org diff --git a/layers/chinese/config.el b/layers/+intl/chinese/config.el similarity index 100% rename from layers/chinese/config.el rename to layers/+intl/chinese/config.el diff --git a/layers/chinese/img/China.png b/layers/+intl/chinese/img/China.png similarity index 100% rename from layers/chinese/img/China.png rename to layers/+intl/chinese/img/China.png diff --git a/layers/chinese/img/Chinese.png b/layers/+intl/chinese/img/Chinese.png similarity index 100% rename from layers/chinese/img/Chinese.png rename to layers/+intl/chinese/img/Chinese.png diff --git a/layers/chinese/packages.el b/layers/+intl/chinese/packages.el similarity index 100% rename from layers/chinese/packages.el rename to layers/+intl/chinese/packages.el diff --git a/layers/nixos/README.org b/layers/+os/nixos/README.org similarity index 100% rename from layers/nixos/README.org rename to layers/+os/nixos/README.org diff --git a/layers/nixos/config.el b/layers/+os/nixos/config.el similarity index 100% rename from layers/nixos/config.el rename to layers/+os/nixos/config.el diff --git a/layers/nixos/img/nixos.jpg b/layers/+os/nixos/img/nixos.jpg similarity index 100% rename from layers/nixos/img/nixos.jpg rename to layers/+os/nixos/img/nixos.jpg diff --git a/layers/nixos/packages.el b/layers/+os/nixos/packages.el similarity index 100% rename from layers/nixos/packages.el rename to layers/+os/nixos/packages.el diff --git a/layers/osx/README.org b/layers/+os/osx/README.org similarity index 100% rename from layers/osx/README.org rename to layers/+os/osx/README.org diff --git a/layers/osx/config.el b/layers/+os/osx/config.el similarity index 100% rename from layers/osx/config.el rename to layers/+os/osx/config.el diff --git a/layers/osx/img/apple.png b/layers/+os/osx/img/apple.png similarity index 100% rename from layers/osx/img/apple.png rename to layers/+os/osx/img/apple.png diff --git a/layers/osx/img/osx.png b/layers/+os/osx/img/osx.png similarity index 100% rename from layers/osx/img/osx.png rename to layers/+os/osx/img/osx.png diff --git a/layers/osx/keybindings.el b/layers/+os/osx/keybindings.el similarity index 100% rename from layers/osx/keybindings.el rename to layers/+os/osx/keybindings.el diff --git a/layers/osx/packages.el b/layers/+os/osx/packages.el similarity index 100% rename from layers/osx/packages.el rename to layers/+os/osx/packages.el diff --git a/layers/floobits/README.org b/layers/+pair-programming/floobits/README.org similarity index 100% rename from layers/floobits/README.org rename to layers/+pair-programming/floobits/README.org diff --git a/layers/floobits/img/floobits.png b/layers/+pair-programming/floobits/img/floobits.png similarity index 100% rename from layers/floobits/img/floobits.png rename to layers/+pair-programming/floobits/img/floobits.png diff --git a/layers/floobits/packages.el b/layers/+pair-programming/floobits/packages.el similarity index 100% rename from layers/floobits/packages.el rename to layers/+pair-programming/floobits/packages.el diff --git a/layers/cscope/README.org b/layers/+tags/cscope/README.org similarity index 100% rename from layers/cscope/README.org rename to layers/+tags/cscope/README.org diff --git a/layers/cscope/img/cscope.jpg b/layers/+tags/cscope/img/cscope.jpg similarity index 100% rename from layers/cscope/img/cscope.jpg rename to layers/+tags/cscope/img/cscope.jpg diff --git a/layers/cscope/packages.el b/layers/+tags/cscope/packages.el similarity index 100% rename from layers/cscope/packages.el rename to layers/+tags/cscope/packages.el diff --git a/layers/gtags/README.org b/layers/+tags/gtags/README.org similarity index 100% rename from layers/gtags/README.org rename to layers/+tags/gtags/README.org diff --git a/layers/gtags/funcs.el b/layers/+tags/gtags/funcs.el similarity index 100% rename from layers/gtags/funcs.el rename to layers/+tags/gtags/funcs.el diff --git a/layers/gtags/packages.el b/layers/+tags/gtags/packages.el similarity index 100% rename from layers/gtags/packages.el rename to layers/+tags/gtags/packages.el diff --git a/layers/colors/README.org b/layers/+themes/colors/README.org similarity index 100% rename from layers/colors/README.org rename to layers/+themes/colors/README.org diff --git a/layers/colors/config.el b/layers/+themes/colors/config.el similarity index 100% rename from layers/colors/config.el rename to layers/+themes/colors/config.el diff --git a/layers/colors/img/rainbow-mode.png b/layers/+themes/colors/img/rainbow-mode.png similarity index 100% rename from layers/colors/img/rainbow-mode.png rename to layers/+themes/colors/img/rainbow-mode.png diff --git a/layers/colors/img/rainbow_dash.png b/layers/+themes/colors/img/rainbow_dash.png similarity index 100% rename from layers/colors/img/rainbow_dash.png rename to layers/+themes/colors/img/rainbow_dash.png diff --git a/layers/colors/img/theme-tweaks-python.png b/layers/+themes/colors/img/theme-tweaks-python.png similarity index 100% rename from layers/colors/img/theme-tweaks-python.png rename to layers/+themes/colors/img/theme-tweaks-python.png diff --git a/layers/colors/local/nyan-mode/README.org b/layers/+themes/colors/local/nyan-mode/README.org similarity index 100% rename from layers/colors/local/nyan-mode/README.org rename to layers/+themes/colors/local/nyan-mode/README.org diff --git a/layers/colors/local/nyan-mode/img/nyan-frame-1.xpm b/layers/+themes/colors/local/nyan-mode/img/nyan-frame-1.xpm similarity index 100% rename from layers/colors/local/nyan-mode/img/nyan-frame-1.xpm rename to layers/+themes/colors/local/nyan-mode/img/nyan-frame-1.xpm diff --git a/layers/colors/local/nyan-mode/img/nyan-frame-2.xpm b/layers/+themes/colors/local/nyan-mode/img/nyan-frame-2.xpm similarity index 100% rename from layers/colors/local/nyan-mode/img/nyan-frame-2.xpm rename to layers/+themes/colors/local/nyan-mode/img/nyan-frame-2.xpm diff --git a/layers/colors/local/nyan-mode/img/nyan-frame-3.xpm b/layers/+themes/colors/local/nyan-mode/img/nyan-frame-3.xpm similarity index 100% rename from layers/colors/local/nyan-mode/img/nyan-frame-3.xpm rename to layers/+themes/colors/local/nyan-mode/img/nyan-frame-3.xpm diff --git a/layers/colors/local/nyan-mode/img/nyan-frame-4.xpm b/layers/+themes/colors/local/nyan-mode/img/nyan-frame-4.xpm similarity index 100% rename from layers/colors/local/nyan-mode/img/nyan-frame-4.xpm rename to layers/+themes/colors/local/nyan-mode/img/nyan-frame-4.xpm diff --git a/layers/colors/local/nyan-mode/img/nyan-frame-5.xpm b/layers/+themes/colors/local/nyan-mode/img/nyan-frame-5.xpm similarity index 100% rename from layers/colors/local/nyan-mode/img/nyan-frame-5.xpm rename to layers/+themes/colors/local/nyan-mode/img/nyan-frame-5.xpm diff --git a/layers/colors/local/nyan-mode/img/nyan-frame-6.xpm b/layers/+themes/colors/local/nyan-mode/img/nyan-frame-6.xpm similarity index 100% rename from layers/colors/local/nyan-mode/img/nyan-frame-6.xpm rename to layers/+themes/colors/local/nyan-mode/img/nyan-frame-6.xpm diff --git a/layers/colors/local/nyan-mode/img/nyan-start.xpm b/layers/+themes/colors/local/nyan-mode/img/nyan-start.xpm similarity index 100% rename from layers/colors/local/nyan-mode/img/nyan-start.xpm rename to layers/+themes/colors/local/nyan-mode/img/nyan-start.xpm diff --git a/layers/colors/local/nyan-mode/img/nyan.xpm b/layers/+themes/colors/local/nyan-mode/img/nyan.xpm similarity index 100% rename from layers/colors/local/nyan-mode/img/nyan.xpm rename to layers/+themes/colors/local/nyan-mode/img/nyan.xpm diff --git a/layers/colors/local/nyan-mode/img/outerspace.xpm b/layers/+themes/colors/local/nyan-mode/img/outerspace.xpm similarity index 100% rename from layers/colors/local/nyan-mode/img/outerspace.xpm rename to layers/+themes/colors/local/nyan-mode/img/outerspace.xpm diff --git a/layers/colors/local/nyan-mode/img/rainbow-start.xpm b/layers/+themes/colors/local/nyan-mode/img/rainbow-start.xpm similarity index 100% rename from layers/colors/local/nyan-mode/img/rainbow-start.xpm rename to layers/+themes/colors/local/nyan-mode/img/rainbow-start.xpm diff --git a/layers/colors/local/nyan-mode/img/rainbow.xpm b/layers/+themes/colors/local/nyan-mode/img/rainbow.xpm similarity index 100% rename from layers/colors/local/nyan-mode/img/rainbow.xpm rename to layers/+themes/colors/local/nyan-mode/img/rainbow.xpm diff --git a/layers/colors/local/nyan-mode/mus/nyanlooped.mp3 b/layers/+themes/colors/local/nyan-mode/mus/nyanlooped.mp3 similarity index 100% rename from layers/colors/local/nyan-mode/mus/nyanlooped.mp3 rename to layers/+themes/colors/local/nyan-mode/mus/nyanlooped.mp3 diff --git a/layers/colors/local/nyan-mode/nyan-mode.el b/layers/+themes/colors/local/nyan-mode/nyan-mode.el similarity index 100% rename from layers/colors/local/nyan-mode/nyan-mode.el rename to layers/+themes/colors/local/nyan-mode/nyan-mode.el diff --git a/layers/colors/packages.el b/layers/+themes/colors/packages.el similarity index 100% rename from layers/colors/packages.el rename to layers/+themes/colors/packages.el diff --git a/layers/themes-megapack/README.org b/layers/+themes/themes-megapack/README.org similarity index 100% rename from layers/themes-megapack/README.org rename to layers/+themes/themes-megapack/README.org diff --git a/layers/themes-megapack/packages.el b/layers/+themes/themes-megapack/packages.el similarity index 100% rename from layers/themes-megapack/packages.el rename to layers/+themes/themes-megapack/packages.el diff --git a/layers/theming/README.org b/layers/+themes/theming/README.org similarity index 100% rename from layers/theming/README.org rename to layers/+themes/theming/README.org diff --git a/layers/theming/config.el b/layers/+themes/theming/config.el similarity index 100% rename from layers/theming/config.el rename to layers/+themes/theming/config.el diff --git a/layers/theming/funcs.el b/layers/+themes/theming/funcs.el similarity index 100% rename from layers/theming/funcs.el rename to layers/+themes/theming/funcs.el diff --git a/layers/chrome/README.org b/layers/+tools/chrome/README.org similarity index 100% rename from layers/chrome/README.org rename to layers/+tools/chrome/README.org diff --git a/layers/chrome/img/chrome.png b/layers/+tools/chrome/img/chrome.png similarity index 100% rename from layers/chrome/img/chrome.png rename to layers/+tools/chrome/img/chrome.png diff --git a/layers/chrome/packages.el b/layers/+tools/chrome/packages.el similarity index 100% rename from layers/chrome/packages.el rename to layers/+tools/chrome/packages.el diff --git a/layers/deft/README.org b/layers/+tools/deft/README.org similarity index 100% rename from layers/deft/README.org rename to layers/+tools/deft/README.org diff --git a/layers/deft/packages.el b/layers/+tools/deft/packages.el similarity index 100% rename from layers/deft/packages.el rename to layers/+tools/deft/packages.el diff --git a/layers/finance/README.org b/layers/+tools/finance/README.org similarity index 100% rename from layers/finance/README.org rename to layers/+tools/finance/README.org diff --git a/layers/finance/config.el b/layers/+tools/finance/config.el similarity index 100% rename from layers/finance/config.el rename to layers/+tools/finance/config.el diff --git a/layers/finance/img/ledger.png b/layers/+tools/finance/img/ledger.png similarity index 100% rename from layers/finance/img/ledger.png rename to layers/+tools/finance/img/ledger.png diff --git a/layers/finance/packages.el b/layers/+tools/finance/packages.el similarity index 100% rename from layers/finance/packages.el rename to layers/+tools/finance/packages.el diff --git a/layers/geolocation/README.org b/layers/+tools/geolocation/README.org similarity index 100% rename from layers/geolocation/README.org rename to layers/+tools/geolocation/README.org diff --git a/layers/geolocation/config.el b/layers/+tools/geolocation/config.el similarity index 100% rename from layers/geolocation/config.el rename to layers/+tools/geolocation/config.el diff --git a/layers/geolocation/extensions.el b/layers/+tools/geolocation/extensions.el similarity index 100% rename from layers/geolocation/extensions.el rename to layers/+tools/geolocation/extensions.el diff --git a/layers/geolocation/extensions/theme-changer/theme-changer.el b/layers/+tools/geolocation/extensions/theme-changer/theme-changer.el similarity index 100% rename from layers/geolocation/extensions/theme-changer/theme-changer.el rename to layers/+tools/geolocation/extensions/theme-changer/theme-changer.el diff --git a/layers/geolocation/img/emacs-location-helper.jpg b/layers/+tools/geolocation/img/emacs-location-helper.jpg similarity index 100% rename from layers/geolocation/img/emacs-location-helper.jpg rename to layers/+tools/geolocation/img/emacs-location-helper.jpg diff --git a/layers/geolocation/img/emacs-sunshine.jpg b/layers/+tools/geolocation/img/emacs-sunshine.jpg similarity index 100% rename from layers/geolocation/img/emacs-sunshine.jpg rename to layers/+tools/geolocation/img/emacs-sunshine.jpg diff --git a/layers/geolocation/packages.el b/layers/+tools/geolocation/packages.el similarity index 100% rename from layers/geolocation/packages.el rename to layers/+tools/geolocation/packages.el diff --git a/layers/prodigy/README.org b/layers/+tools/prodigy/README.org similarity index 100% rename from layers/prodigy/README.org rename to layers/+tools/prodigy/README.org diff --git a/layers/prodigy/img/prodigy.png b/layers/+tools/prodigy/img/prodigy.png similarity index 100% rename from layers/prodigy/img/prodigy.png rename to layers/+tools/prodigy/img/prodigy.png diff --git a/layers/prodigy/packages.el b/layers/+tools/prodigy/packages.el similarity index 100% rename from layers/prodigy/packages.el rename to layers/+tools/prodigy/packages.el diff --git a/layers/restclient/README.org b/layers/+tools/restclient/README.org similarity index 100% rename from layers/restclient/README.org rename to layers/+tools/restclient/README.org diff --git a/layers/restclient/config.el b/layers/+tools/restclient/config.el similarity index 100% rename from layers/restclient/config.el rename to layers/+tools/restclient/config.el diff --git a/layers/restclient/funcs.el b/layers/+tools/restclient/funcs.el similarity index 100% rename from layers/restclient/funcs.el rename to layers/+tools/restclient/funcs.el diff --git a/layers/restclient/packages.el b/layers/+tools/restclient/packages.el similarity index 100% rename from layers/restclient/packages.el rename to layers/+tools/restclient/packages.el diff --git a/layers/shell/README.org b/layers/+tools/shell/README.org similarity index 100% rename from layers/shell/README.org rename to layers/+tools/shell/README.org diff --git a/layers/shell/config.el b/layers/+tools/shell/config.el similarity index 100% rename from layers/shell/config.el rename to layers/+tools/shell/config.el diff --git a/layers/shell/funcs.el b/layers/+tools/shell/funcs.el similarity index 100% rename from layers/shell/funcs.el rename to layers/+tools/shell/funcs.el diff --git a/layers/shell/img/shell.png b/layers/+tools/shell/img/shell.png similarity index 100% rename from layers/shell/img/shell.png rename to layers/+tools/shell/img/shell.png diff --git a/layers/shell/packages.el b/layers/+tools/shell/packages.el similarity index 100% rename from layers/shell/packages.el rename to layers/+tools/shell/packages.el diff --git a/layers/speed-reading/README.org b/layers/+tools/speed-reading/README.org similarity index 100% rename from layers/speed-reading/README.org rename to layers/+tools/speed-reading/README.org diff --git a/layers/speed-reading/packages.el b/layers/+tools/speed-reading/packages.el similarity index 100% rename from layers/speed-reading/packages.el rename to layers/+tools/speed-reading/packages.el diff --git a/layers/+tools/elfeed/README.org b/layers/+web-services/elfeed/README.org similarity index 100% rename from layers/+tools/elfeed/README.org rename to layers/+web-services/elfeed/README.org diff --git a/layers/+tools/elfeed/config.el b/layers/+web-services/elfeed/config.el similarity index 100% rename from layers/+tools/elfeed/config.el rename to layers/+web-services/elfeed/config.el diff --git a/layers/+tools/elfeed/img/elfeed.png b/layers/+web-services/elfeed/img/elfeed.png similarity index 100% rename from layers/+tools/elfeed/img/elfeed.png rename to layers/+web-services/elfeed/img/elfeed.png diff --git a/layers/+tools/elfeed/packages-config.el b/layers/+web-services/elfeed/packages-config.el similarity index 100% rename from layers/+tools/elfeed/packages-config.el rename to layers/+web-services/elfeed/packages-config.el diff --git a/layers/+tools/elfeed/packages.el b/layers/+web-services/elfeed/packages.el similarity index 100% rename from layers/+tools/elfeed/packages.el rename to layers/+web-services/elfeed/packages.el diff --git a/layers/+tools/evernote/README.org b/layers/+web-services/evernote/README.org similarity index 100% rename from layers/+tools/evernote/README.org rename to layers/+web-services/evernote/README.org diff --git a/layers/+tools/evernote/config.el b/layers/+web-services/evernote/config.el similarity index 100% rename from layers/+tools/evernote/config.el rename to layers/+web-services/evernote/config.el diff --git a/layers/+tools/evernote/img/evernote.png b/layers/+web-services/evernote/img/evernote.png similarity index 100% rename from layers/+tools/evernote/img/evernote.png rename to layers/+web-services/evernote/img/evernote.png diff --git a/layers/+tools/evernote/img/geeknote.png b/layers/+web-services/evernote/img/geeknote.png similarity index 100% rename from layers/+tools/evernote/img/geeknote.png rename to layers/+web-services/evernote/img/geeknote.png diff --git a/layers/+tools/evernote/packages.el b/layers/+web-services/evernote/packages.el similarity index 100% rename from layers/+tools/evernote/packages.el rename to layers/+web-services/evernote/packages.el diff --git a/layers/search-engine/README.org b/layers/+web-services/search-engine/README.org similarity index 100% rename from layers/search-engine/README.org rename to layers/+web-services/search-engine/README.org diff --git a/layers/search-engine/img/searchengine.jpg b/layers/+web-services/search-engine/img/searchengine.jpg similarity index 100% rename from layers/search-engine/img/searchengine.jpg rename to layers/+web-services/search-engine/img/searchengine.jpg diff --git a/layers/search-engine/packages.el b/layers/+web-services/search-engine/packages.el similarity index 100% rename from layers/search-engine/packages.el rename to layers/+web-services/search-engine/packages.el diff --git a/layers/spotify/README.org b/layers/+web-services/spotify/README.org similarity index 100% rename from layers/spotify/README.org rename to layers/+web-services/spotify/README.org diff --git a/layers/spotify/config.el b/layers/+web-services/spotify/config.el similarity index 100% rename from layers/spotify/config.el rename to layers/+web-services/spotify/config.el diff --git a/layers/spotify/img/spotify.png b/layers/+web-services/spotify/img/spotify.png similarity index 100% rename from layers/spotify/img/spotify.png rename to layers/+web-services/spotify/img/spotify.png diff --git a/layers/spotify/packages.el b/layers/+web-services/spotify/packages.el similarity index 100% rename from layers/spotify/packages.el rename to layers/+web-services/spotify/packages.el diff --git a/layers/+fun/twitter/README.org b/layers/+web-services/twitter/README.org similarity index 100% rename from layers/+fun/twitter/README.org rename to layers/+web-services/twitter/README.org diff --git a/layers/+fun/twitter/img/twitter.png b/layers/+web-services/twitter/img/twitter.png similarity index 100% rename from layers/+fun/twitter/img/twitter.png rename to layers/+web-services/twitter/img/twitter.png diff --git a/layers/+fun/twitter/packages.el b/layers/+web-services/twitter/packages.el similarity index 100% rename from layers/+fun/twitter/packages.el rename to layers/+web-services/twitter/packages.el diff --git a/layers/+tools/wakatime/README.org b/layers/+web-services/wakatime/README.org similarity index 100% rename from layers/+tools/wakatime/README.org rename to layers/+web-services/wakatime/README.org diff --git a/layers/+tools/wakatime/img/wakatime.png b/layers/+web-services/wakatime/img/wakatime.png similarity index 100% rename from layers/+tools/wakatime/img/wakatime.png rename to layers/+web-services/wakatime/img/wakatime.png diff --git a/layers/+tools/wakatime/packages.el b/layers/+web-services/wakatime/packages.el similarity index 100% rename from layers/+tools/wakatime/packages.el rename to layers/+web-services/wakatime/packages.el From 92cc50bbaae614afe95a134057eee91434bac186 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Thu, 24 Mar 2016 00:46:52 -0400 Subject: [PATCH 30/40] twitter: improve layer - Refactor configuration - Change logo - Better default key bindings - Add a transient state --- layers/+web-services/twitter/README.org | 52 +++++++-- layers/+web-services/twitter/img/twitter.png | Bin 17932 -> 19616 bytes layers/+web-services/twitter/packages.el | 110 ++++++++++++++++--- 3 files changed, 137 insertions(+), 25 deletions(-) diff --git a/layers/+web-services/twitter/README.org b/layers/+web-services/twitter/README.org index 02579927879a0..00ddf686052d8 100644 --- a/layers/+web-services/twitter/README.org +++ b/layers/+web-services/twitter/README.org @@ -1,15 +1,16 @@ #+TITLE: Twitter contribution layer for Spacemacs + [[file:img/twitter.png]] + * Table of Contents :TOC_4_org:noexport: - [[Description][Description]] - [[Features][Features]] - [[Install][Install]] - - [[Layer][Layer]] + - [[Configuration][Configuration]] - [[Key Bindings][Key Bindings]] * Description -This layer adds Twitter support to Spacemacs via the package =twittering-mode=, -do not hesitate to check the original package README [[https://github.com/hayamiz/twittering-mode][here]]. +This layer adds Twitter support to Spacemacs via the package [[https://github.com/hayamiz/twittering-mode][twittering-mode]]. * Features - Activities on Twitter @@ -33,11 +34,46 @@ do not hesitate to check the original package README [[https://github.com/hayami - Secure connection via HTTPS (cURL, GNU Wget, OpenSSL or GnuTLS is required) * Install -** Layer -#+begin_src emacs-lisp - (setq-default dotspacemacs-configuration-layers '(twitter)) -#+end_src +To use this configuration layer, add it to your =~/.spacemacs=. You will need to +add =twitter= to the existing =dotspacemacs-configuration-layers= list in this +file. + +* Configuration +Exhaustive configuration documentation can be found on the README page of the +package [[https://github.com/hayamiz/twittering-mode][here]]. + +You can authenticate easily via a PIN number, or you can use GnuPG by setting +the variable =twittering-use-master-password= to =t= in the =user-config= +function of your dotfile. * Key Bindings -Check out the original package doc [[https://github.com/hayamiz/twittering-mode/blob/master/README.markdown#usage][here]] as the key bindings =feel= evil enough :). +| Key Binding | Description | +|-------------+------------------------------------------| +| ~?~ | Open/Quit transient state | +| ~/~ | Search | +| ~a~ | Toggle auto-refresh | +| ~b~ | Heart | +| ~B~ | Unheart | +| ~d~ | Direct message to user around point | +| ~e~ | Edit tweet | +| ~f~ | Follow user around point | +| ~F~ | Unfollow user around point | +| ~g~ | First tweet | +| ~G~ | Last tweet | +| ~i~ | View user profile around point | +| ~q~ | Quit transient state | +| ~Q~ | Quit twittering mode | +| ~j~ | Next tweet | +| ~J~ | Next tweet of same user around point | +| ~k~ | Previous tweet | +| ~K~ | Previous tweet of same user around point | +| ~n~ | New tweet | +| ~o~ | Open URL | +| ~r~ | Retweet (native) | +| ~R~ | Retweet (organic) | +| ~t~ | View tweet replies | +| ~u~ | Update timeline | +| ~X~ | Delete tweet | +| ~y~ | Copy tweet URI | +| ~Y~ | Copy tweet content | diff --git a/layers/+web-services/twitter/img/twitter.png b/layers/+web-services/twitter/img/twitter.png index 6f4efb251da7c8b5c54a518db9e86ed5a9736b4a..8741acbf4088111786ee7cdac881c5879aa5ca34 100644 GIT binary patch literal 19616 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 TQXMQ7xe{*9o=)`+!O8yu&{l6& diff --git a/layers/+web-services/twitter/packages.el b/layers/+web-services/twitter/packages.el index 08b17cfe14d62..adc5ac81881f0 100644 --- a/layers/+web-services/twitter/packages.el +++ b/layers/+web-services/twitter/packages.el @@ -12,25 +12,101 @@ ;; List of all packages to install and/or initialize. Built-in packages ;; which require an initialization must be listed explicitly in the list. -(setq twitter-packages - '(twittering-mode)) +(setq twitter-packages '(twittering-mode)) (defun twitter/init-twittering-mode () (use-package twittering-mode - :commands twit + :defer t :init - (evil-leader/set-key - "at" 'twit) - (when (configuration-layer/package-usedp 'flyspell) - (add-hook 'twittering-edit-mode-hook (lambda () (flyspell-mode 1)))) - (push 'twittering-edit-mode evil-insert-state-modes) + (progn + (evil-leader/set-key "at" 'twit) + (setq twittering-initial-timeline-spec-string '(":home") + twittering-icon-mode t + twittering-use-icon-storage 1 + twittering-enable-unread-status-notifier t + twittering-display-remaining t + twittering-edit-skeleton 'inherit-any + twittering-url-show-status nil + twittering-timeline-header "" + twittering-timeline-footer "" + twitter-images-directory (concat spacemacs-cache-directory "twitter") + twittering-status-format "%i %S, %RT{%FACE[bold]{%S}} %@ %FACE[shadow]{%p%f%L%r}\n%FOLD[ ]{%T}\n") + (unless (file-exists-p twitter-images-directory) + (make-directory twitter-images-directory)) + + ) :config - (setq twitter-images-directory - (expand-file-name - (concat spacemacs-cache-directory "twitter-images"))) - (unless (file-exists-p twitter-images-directory) - (make-directory twitter-images-directory)) - (setq twittering-icon-mode t) - (setq twittering-url-show-status nil) - (setq twittering-use-master-password t) - (setq twittering-use-icon-storage 1))) + (progn + ;; twittering mode overwrite the leader key + (define-key twittering-mode-map (kbd "SPC") spacemacs-default-map) + ;; redefine better defaults + (let ((map twittering-mode-map)) + (define-key map "?" 'spacemacs/twittering-mode-transient-state/body) + (define-key map "/" 'twittering-search) + (define-key map "a" 'twittering-toggle-activate-buffer) + (define-key map "b" 'twittering-favorite) + (define-key map "B" 'twittering-unfavorite) + (define-key map "d" 'twittering-direct-message) + (define-key map "e" 'twittering-edit-mode) + (define-key map "f" 'twittering-follow) + (define-key map "F" 'twittering-unfollow) + (define-key map "g" 'beginning-of-buffer) + (define-key map "G" 'end-of-buffer) + (define-key map "i" 'twittering-view-user-page) + (define-key map "Q" 'twittering-kill-buffer) + (define-key map "j" 'twittering-goto-next-status) + (define-key map "J" 'twittering-goto-next-status-of-user) + (define-key map "k" 'twittering-goto-previous-status) + (define-key map "K" 'twittering-goto-previous-status-of-user) + (define-key map "n" 'twittering-update-status-interactive) + (define-key map "o" 'twittering-click) + (define-key map "r" 'twittering-native-retweet) + (define-key map "R" 'twittering-organic-retweet) + (define-key map "t" 'twittering-toggle-or-retrieve-replied-statuses) + (define-key map "u" 'twittering-current-timeline) + (define-key map "X" 'twittering-delete-status) + (define-key map "y" 'twittering-push-uri-onto-kill-ring) + (define-key map "Y" 'twittering-push-tweet-onto-kill-ring)) + ;; associated transient state + (spacemacs|define-transient-state twittering-mode + :title "Twittering Mode Transient State" + :doc " + Tweets^^^^^^ User^^^^ Other^^ + ──────^^^^^^────────────────────────────────── ────^^^^─────────────── ─────^^─────────────────── + [_j_/_k_] down/up [_r_] retweet [_d_]^^ direct message [_a_] toggle auto-refresh + [_RET_]^^ open or reply [_R_] retweet & edit [_f_]^^ follow [_q_] quit + [_b_]^^ heart [_n_] post new tweet [_F_]^^ unfollow [_Q_] quit twitter + [_B_]^^ unheart [_t_] show thread [_i_]^^ profile [_u_] update + [_e_]^^ edit mode [_X_] delete tweet [_J_/_K_] down/up [_/_] search + [_g_]^^ first [_y_] yank url + [_G_]^^ last [_Y_] yank tweet + [_o_]^^ open url" + :bindings + ("?" nil :exit t) + ("RET" twittering-enter :exit t) + ("/" twittering-search :exit t) + ("a" twittering-toggle-activate-buffer) + ("b" twittering-favorite) + ("B" twittering-unfavorite) + ("d" twittering-direct-message :exit t) + ("e" twittering-edit-mode :exit t) + ("f" twittering-follow) + ("F" twittering-unfollow) + ("g" beginning-of-buffer) + ("G" end-of-buffer) + ("i" twittering-view-user-page) + ("q" nil :exit t) + ("Q" twittering-kill-buffer :exit t) + ("j" twittering-goto-next-status) + ("J" twittering-goto-next-status-of-user) + ("k" twittering-goto-previous-status) + ("K" twittering-goto-previous-status-of-user) + ("n" twittering-update-status-interactive :exit t) + ("o" twittering-click :exit t) + ("r" twittering-native-retweet :exit t) + ("R" twittering-organic-retweet :exit t) + ("t" twittering-toggle-or-retrieve-replied-statuses :exit t) + ("u" twittering-current-timeline) + ("X" twittering-delete-status) + ("y" twittering-push-uri-onto-kill-ring) + ("Y" twittering-push-tweet-onto-kill-ring))))) From 9368cba427a24dbeea82f28fc1f19b560545f0e6 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Thu, 24 Mar 2016 00:49:46 -0400 Subject: [PATCH 31/40] Update windows transient state docstring --- .../spacemacs-base/keybindings.el | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/layers/+distribution/spacemacs-base/keybindings.el b/layers/+distribution/spacemacs-base/keybindings.el index beda2ddeebf4b..ac34cafdcdb2f 100644 --- a/layers/+distribution/spacemacs-base/keybindings.el +++ b/layers/+distribution/spacemacs-base/keybindings.el @@ -401,17 +401,15 @@ (spacemacs|define-transient-state window-manipulation :title "Window Manipulation Transient State" - :doc - " -Select^^^^ Move^^^^ Split^^ Resize^^ Other^^ -------^^^^------------- -----^^^^------------ ------^^-------------- -------^^------------------- ------^^------------------- -[_j_/_k_] down/up [_J_/_K_] down/up [_s_] vertical [_[_] shrink horizontally [_q_] quit -[_h_/_l_] left/right [_H_/_L_] left/right [_S_] vert & follow [_]_] enlarge horizontally [_u_] restore prev layout -[_0_-_9_] window N [_R_]^^ rotate [_v_] horizontal [_{_] shrink vertically [_U_] restore next layout -[_w_]^^ other window ^^^^ [_V_] horiz & follow [_}_] enlarge vertically [_d_] close current -[_o_]^^ other frame ^^^^ ^^ ^^ [_D_] close other -^^^^ ^^^^ ^^ ^^ [_g_] golden-ratio %`golden-ratio-mode -" + :doc " + Select^^^^ Move^^^^ Split^^ Resize^^ Other^^ + ──────^^^^───────────── ────^^^^───────────── ─────^^─────────────── ──────^^──────────────────── ─────^^────────────────────────────── + [_j_/_k_] down/up [_J_/_K_] down/up [_s_] vertical [_[_] shrink horizontally [_q_] quit + [_h_/_l_] left/right [_H_/_L_] left/right [_S_] vert & follow [_]_] enlarge horizontally [_u_] restore prev layout + [_0_-_9_] window N [_R_]^^ rotate [_v_] horizontal [_{_] shrink vertically [_U_] restore next layout + [_w_]^^ other window ^^^^ [_V_] horiz & follow [_}_] enlarge vertically [_d_] close current + [_o_]^^ other frame ^^^^ ^^ ^^ [_D_] close other + ^^^^ ^^^^ ^^ ^^ [_g_] golden-ratio %`golden-ratio-mode" :bindings ("q" nil :exit t) ("0" select-window-0) From 87db0174a2a15c619e10c9262dfd205a0b45339f Mon Sep 17 00:00:00 2001 From: luxbock Date: Fri, 29 Jan 2016 15:35:56 +0700 Subject: [PATCH 32/40] Adds Graphviz layer - Uses a forked version of graphviz-dot-mode.el with a local install. Upstream PR: ppareit/graphviz-dot-mode#18 --- layers/+lang/graphviz/README.org | 37 ++++++++++++++++++++++++ layers/+lang/graphviz/img/graphviz.png | Bin 0 -> 81173 bytes layers/+lang/graphviz/packages.el | 38 +++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 layers/+lang/graphviz/README.org create mode 100644 layers/+lang/graphviz/img/graphviz.png create mode 100644 layers/+lang/graphviz/packages.el diff --git a/layers/+lang/graphviz/README.org b/layers/+lang/graphviz/README.org new file mode 100644 index 0000000000000..badbc6a15f949 --- /dev/null +++ b/layers/+lang/graphviz/README.org @@ -0,0 +1,37 @@ +#+TITLE: graphviz layer +#+HTML_HEAD_EXTRA: + +#+CAPTION: logo + +# The maximum height of the logo should be 200 pixels. +[[img/graphviz.png]] + +* Table of Contents :TOC_4_org:noexport: + - [[Description][Description]] + - [[Install][Install]] + - [[Key bindings][Key bindings]] + +* Description +This contains a forked version of [[https://github.com/ppareit/graphviz-dot-mode][graphviz-dot-mode]] that enables a live-reload +type work flow for editing `.dot` files. When live-preview is enabled, saving +the file will automatically trigger a compilation and reload of the image buffer +associated with the file. + +If the live preview is not always updating the rendered image properly, you can +try to adjust the value of ~graphviz-dot-revert-delay~ higher to give the +compiler more time to finish generating the file before reverting the buffer. + +* Install +To use this contribution add it to your =~/.spacemacs= + +#+begin_src emacs-lisp + (setq-default dotspacemacs-configuration-layers '(graphviz)) +#+end_src + +* Key bindings +| Key Binding | Description | +|-------------+--------------------------------------| +| ~ t~ | Toggle live-preview | +| ~ c~ | Set compile command and compile file | +| ~ p~ | Preview file | +| ~ ,~ | Preview file | diff --git a/layers/+lang/graphviz/img/graphviz.png b/layers/+lang/graphviz/img/graphviz.png new file mode 100644 index 0000000000000000000000000000000000000000..2d452a4f6d1296afac1c49b3e8d34e100dee88ac GIT binary patch literal 81173 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 Date: Thu, 24 Mar 2016 21:54:54 -0400 Subject: [PATCH 33/40] graphviz: update key bindings and smartparens support Change the key bindings: - Remove SPC m p - Better support for double leader keys for preview (,, and M-m M-m) - Graph indentation on SPC m = Add support for smartparens when it is used for {} pair. Update the doc. --- layers/+lang/graphviz/README.org | 29 ++++++++++----------- layers/+lang/graphviz/packages.el | 43 +++++++++++++++++++------------ 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/layers/+lang/graphviz/README.org b/layers/+lang/graphviz/README.org index badbc6a15f949..18e4f943cc1a2 100644 --- a/layers/+lang/graphviz/README.org +++ b/layers/+lang/graphviz/README.org @@ -1,14 +1,12 @@ #+TITLE: graphviz layer #+HTML_HEAD_EXTRA: -#+CAPTION: logo - -# The maximum height of the logo should be 200 pixels. -[[img/graphviz.png]] +[[file:img/graphviz.png]] * Table of Contents :TOC_4_org:noexport: - [[Description][Description]] - [[Install][Install]] + - [[Configuration][Configuration]] - [[Key bindings][Key bindings]] * Description @@ -17,21 +15,20 @@ type work flow for editing `.dot` files. When live-preview is enabled, saving the file will automatically trigger a compilation and reload of the image buffer associated with the file. -If the live preview is not always updating the rendered image properly, you can -try to adjust the value of ~graphviz-dot-revert-delay~ higher to give the -compiler more time to finish generating the file before reverting the buffer. - * Install -To use this contribution add it to your =~/.spacemacs= +To use this configuration layer, add it to your =~/.spacemacs=. You will need to +add =graphviz= to the existing =dotspacemacs-configuration-layers= list in this +file. -#+begin_src emacs-lisp - (setq-default dotspacemacs-configuration-layers '(graphviz)) -#+end_src +* Configuration +If the live preview is not always updating the rendered image properly, you can +try to adjust the value of =graphviz-dot-revert-delay= higher to give the +compiler more time to finish generating the file before reverting the buffer. * Key bindings | Key Binding | Description | |-------------+--------------------------------------| -| ~ t~ | Toggle live-preview | -| ~ c~ | Set compile command and compile file | -| ~ p~ | Preview file | -| ~ ,~ | Preview file | +| ~ m ,~ | Preview file | +| ~ m =~ | Indent graph | +| ~ m t~ | Toggle live-preview | +| ~ m c~ | Set compile command and compile file | diff --git a/layers/+lang/graphviz/packages.el b/layers/+lang/graphviz/packages.el index d250eb0f534f2..e7a13b3d6f9b8 100644 --- a/layers/+lang/graphviz/packages.el +++ b/layers/+lang/graphviz/packages.el @@ -2,25 +2,26 @@ ;; ;; Copyright (c) 2012-2016 Sylvain Benner & Contributors ;; +;; Author: luxbock +;; URL: https://github.com/syl20bnr/spacemacs +;; ;; This file is not part of GNU Emacs. ;; ;;; License: GPLv3 -;;; Commentary: - -;;; Code: - (defconst graphviz-packages - '((graphviz-dot-mode :location (recipe :fetcher github :repo "luxbock/graphviz-dot-mode")))) + '((graphviz-dot-mode :location (recipe :fetcher github + :repo "luxbock/graphviz-dot-mode")) + smartparens)) (defun graphviz/init-graphviz-dot-mode () (use-package graphviz-dot-mode - :mode (("\\.diag$" . graphviz-dot-mode) - ("\\.blockdiag$" . graphviz-dot-mode) - ("\\.nwdiag$" . graphviz-dot-mode) - ("\\.rackdiag$" . graphviz-dot-mode) - ("\\.dot$" . graphviz-dot-mode) - ("\\.gv" . graphviz-dot-mode)) + :mode (("\\.diag\\'" . graphviz-dot-mode) + ("\\.blockdiag\\'" . graphviz-dot-mode) + ("\\.nwdiag\\'" . graphviz-dot-mode) + ("\\.rackdiag\\'" . graphviz-dot-mode) + ("\\.dot\\'" . graphviz-dot-mode) + ("\\.gv\\'" . graphviz-dot-mode)) :config (progn (spacemacs|add-toggle graphviz-live-reload @@ -28,11 +29,21 @@ :on (graphviz-turn-on-live-preview) :off (graphviz-turn-off-live-preview) :documentation "Enable Graphviz live reload.") - (define-key graphviz-dot-mode-map (kbd "M-q") 'graphviz-dot-indent-graph) (spacemacs/set-leader-keys-for-major-mode 'graphviz-dot-mode - "t" 'spacemacs/toggle-graphviz-live-reload + "=" 'graphviz-dot-indent-graph "c" 'compile - "p" 'graphviz-dot-preview - "," 'graphviz-dot-preview)))) + "t" 'spacemacs/toggle-graphviz-live-reload) + (when dotspacemacs-major-mode-emacs-leader-key + (spacemacs/set-leader-keys-for-major-mode 'graphviz-dot-mode + dotspacemacs-major-mode-emacs-leader-key 'graphviz-dot-preview)) + (when dotspacemacs-major-mode-leader-key + (spacemacs/set-leader-keys-for-major-mode 'graphviz-dot-mode + dotspacemacs-major-mode-leader-key 'graphviz-dot-preview))))) -;;; packages.el ends here +(defun graphviz/post-init-smartparens () + (spacemacs|use-package-add-hook graphviz-dot-mode + :post-config + (progn + ;; allow smartparens to work properly + (define-key graphviz-dot-mode-map "{" nil) + (define-key graphviz-dot-mode-map "}" nil)))) From 0a61440101a26ab5ac063351ce75dbf0f8a57cce Mon Sep 17 00:00:00 2001 From: Nathaniel Waisbrot Date: Thu, 4 Feb 2016 14:42:23 -0500 Subject: [PATCH 34/40] Add a layer for nginx config files --- layers/+config-files/nginx/README.org | 23 +++++++++++++++++++++++ layers/+config-files/nginx/img/nginx.png | Bin 0 -> 2103 bytes layers/+config-files/nginx/packages.el | 18 ++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 layers/+config-files/nginx/README.org create mode 100644 layers/+config-files/nginx/img/nginx.png create mode 100644 layers/+config-files/nginx/packages.el diff --git a/layers/+config-files/nginx/README.org b/layers/+config-files/nginx/README.org new file mode 100644 index 0000000000000..b94551217940b --- /dev/null +++ b/layers/+config-files/nginx/README.org @@ -0,0 +1,23 @@ +#+TITLE: nginx layer +#+HTML_HEAD_EXTRA: + +#+CAPTION: logo + +# The maximum height of the logo should be 200 pixels. +[[img/nginx.png]] + +* Table of Contents :TOC_4_org:noexport: + - [[Description][Description]] + - [[Install][Install]] + +* Description +[nginx-mode](https://github.com/ajc/nginx-mode) for editing [nginx](http://nginx.org) configuration files. Adds basic syntax highlighting and syntax-aware tabbing. + +* Install +To use this contribution add it to your =~/.spacemacs= + +#+begin_src emacs-lisp + (setq-default dotspacemacs-configuration-layers '(nginx)) +#+end_src + + diff --git a/layers/+config-files/nginx/img/nginx.png b/layers/+config-files/nginx/img/nginx.png new file mode 100644 index 0000000000000000000000000000000000000000..51bba47f98b5d5d76d4f9a36408c782b26973966 GIT binary patch literal 2103 zcmb_e`9IVP8~vK^SZASxk@ZSs8O9*WxRy+cMp<4at}zlN8nl=p!&q7@naC0bg+jJT ziSSNCSteVyYe_Y(8-+W@c8z$s?*H(9KF{Yl=cjX?=lpb%&$&1vWDd#z0Dw4s%E1i) z#K?R6loYtPcP+kV?19I*GamRo1oHmR(-zeeyC!s!QYYuV zMf=C$jY}$!D0s%5kJMn(3GEhhuav6l`isFvuY8MT63fS!y!2JyL7(RZj#k!Ycyo`A z%k|F}c%Po?WkyHtDCJn-vHhRtFASv>_Z{Q4C~h}84SOoUsubj2Y>!@}msV_6m1#%J zlUAvx%eyP%NDXR7bVhMZgW}z5GdHQ3&*Wo|Qh0wF);_5bY#R=~(*IU`{Kbj3s?dcg zTu$8c1IZy>qY-ffX3I@s(_#5pvC+ck3EGuuU+X97MAGN1k+IEZU`zIz%yz42!sF1pi_8SX zlsK#otCgZ$*c7A*kMYx2ZpmYjmmK>KRLnF<$dpBWwjan6V`eVq_hysyf(+B>QApfd zPx*dfGkp6Ghw1Bnv_d-CaggaJqcjc!{qu~OBkV@Jn)q)Kp%0}jCuFB|7ONtEg=nVH zCnUT?^O}6tOiMAW`pVxyo{W5Jg8uKhy7j6RRuWBoQRYG=*8({*WT0Zey2Yf)NjftD zb=ujEJg)4ZdaM7QH=#w0^{N=G%Ak%GO5)g3#QU!8QSBUc2i01Ejf8;a_skmBL;!>f zp{Gz=K`BzkbJxhN_yWq#{*9r2F+s@kBT{{%eKI|S@QFL+AU1=ZG>oGZTxaOs;S!00 zRK}ZaDNES_Ct4$`SZoRd&4C5@!9!QhGIE8!$zJcg)nsuPAYGx81D*3chH1uqdgwzV z1S2IW@=#TSGnh^ui&*!oj*@&M@n zeF37RW_5Fm(U8o7`@9S5y9=?XT>=>Kn7?nvS6(Q;p%gCO<%i48(f|UEJe&hi(gA)- zL^L@_5i&Pzp|?V~QX&iX-=BM0DD}umUQU7&OCD0}?ZxsB|6DI$8X0!wMz1ZpC2`F} zw@nupAX_#I_8pMif{l`x;^?o^X-ZA@{$wvyZZL%FQIe+&8f-A*O4ioVgu0P+F93xO z&j&DyogAa^%a2mgM`R_XESwpde^9f>s`Z#gO<;5Uwpsq(%Nu zVxBTEu-$UoRu^(B_pdtuX74ay+@|4@6P#6Q5pW5d5l8Ml|7U9ak9L=rD9aO$MKHKh zldHT$q%&eI8*~p3>f|1dL2MhxFLBnPz#;#|)Ofn-swTwKlilU+P11Nncn4Dj?zE39 zfu(s9;>fFm)g_IS6s%!gnyMKeBDojfN(XoP$F)Th;pk)Z4W6sQD-9yLNE``v!Hli( zkav0Kk?9DTaolVz*k17p2X;ji8FZN{S# zE^;X~5#iC5t%_X|P@ID04UVJpRr0qX)<#)^G&SA6c=q=I-CcsAZzMRGCEwZUC&= zcOU;mN1P38tanwPysTN4VDZISi+{2%qBcFZZh!L&Wk7%~74U2|pkQZWsR@4uI&OK+ zQ(T$|F|`lJ)8*7L>4edULr@eu&5%4if0s-VHZC)kJ1dbI36;ruGHGRLD>>2K6_aqb zJRqttF@leeXp<`&WU>JDGmkvkA{u?kZiS*$Fh~(SUO0?cJ@r8X=_l*~fSM=%b^tid1Bi7>;K|9XfhCd$g)fT5= ztXPi_L>N;4m$qh1`jtWj8ocU@3Mz`m)+LO49in3iS?-0I(@^w uAH%)B_rHq;ywC8iLsJE_3O@@uv(vKg`KqG(qJ|6qHh|N37l&GVa>73%N4(|$ literal 0 HcmV?d00001 diff --git a/layers/+config-files/nginx/packages.el b/layers/+config-files/nginx/packages.el new file mode 100644 index 0000000000000..935b160314675 --- /dev/null +++ b/layers/+config-files/nginx/packages.el @@ -0,0 +1,18 @@ +;;; packages.el --- nginx layer packages file for Spacemacs. +;; +;; Copyright (c) 2012-2016 Sylvain Benner & Contributors +;; +;; Author: Nathaniel Waisbrot +;; URL: https://github.com/syl20bnr/spacemacs +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 + +(defconst nginx-packages + '( + nginx-mode + )) + +(defun nginx/init-nginx-mode () + (use-package nginx-mode :defer t)) From 16afe679074e21ceb047d443015b427494d0b281 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Fri, 25 Mar 2016 00:24:52 -0400 Subject: [PATCH 35/40] core: enhance lazy installation of layer Now Spacemacs will ask for layer installation when opening a file with a known file type. The auto-mode-alist entries are added by the file auto-layer.el in the layers directory. Easy insert of forms for lazy initialization can be done with the interactive function configuration-layer//insert-lazy-install-form. Change default value of dotspacemacs-enable-lazy-installation to t. --- core/core-configuration-layer.el | 123 +++++++++++------- core/core-dotspacemacs.el | 17 ++- core/templates/.spacemacs.template | 4 +- .../helm-spacemacs-help.el | 13 +- layers/+config-files/nginx/README.org | 18 +-- layers/+config-files/nginx/img/nginx.png | Bin 2103 -> 33876 bytes layers/+config-files/nginx/packages.el | 5 +- layers/+lang/elixir/config.el | 3 - .../+spacemacs/spacemacs-layouts/packages.el | 6 +- layers/auto-layer.el | 16 +++ 10 files changed, 119 insertions(+), 86 deletions(-) create mode 100644 layers/auto-layer.el diff --git a/core/core-configuration-layer.el b/core/core-configuration-layer.el index 71b27a28fc50b..a21e7ca35b71e 100644 --- a/core/core-configuration-layer.el +++ b/core/core-configuration-layer.el @@ -8,10 +8,6 @@ ;; This file is not part of GNU Emacs. ;; ;;; License: GPLv3 -;; -;;; Commentary: -;; -;;; Code: (require 'cl-lib) (require 'eieio) @@ -281,26 +277,40 @@ refreshed during the current session." (package-read-all-archive-contents) (unless quiet (spacemacs-buffer/append "\n"))))) -(defun configuration-layer/sync () - "Synchronize declared layers in dotfile with spacemacs." +(defun configuration-layer/sync (&optional no-install) + "Synchronize declared layers in dotfile with spacemacs. +If NO-INSTALL is non nil then install steps are skipped." (dotspacemacs|call-func dotspacemacs/layers "Calling dotfile layers...") (when (spacemacs-buffer//choose-banner) (spacemacs-buffer//inject-version t)) ;; layers (setq configuration-layer--layers (configuration-layer//declare-layers)) (configuration-layer//configure-layers configuration-layer--layers) + (when dotspacemacs-enable-lazy-installation + (configuration-layer/load-auto-layer-file)) ;; packages (setq configuration-layer--packages (configuration-layer//declare-packages configuration-layer--layers)) (setq configuration-layer--used-distant-packages (configuration-layer//get-distant-used-packages configuration-layer--packages)) - (configuration-layer//install-packages - (configuration-layer/filter-objects configuration-layer--used-distant-packages - (lambda (x) (not (oref x :lazy-install))))) - (configuration-layer//configure-packages configuration-layer--packages) - (when dotspacemacs-delete-orphan-packages - (configuration-layer/delete-orphan-packages configuration-layer--packages))) + (unless no-install + (configuration-layer//install-packages + (configuration-layer/filter-objects + configuration-layer--used-distant-packages + (lambda (x) + (not (oref x :lazy-install))))) + (configuration-layer//configure-packages configuration-layer--packages) + (when dotspacemacs-delete-orphan-packages + (configuration-layer/delete-orphan-packages + configuration-layer--packages)))) + +(defun configuration-layer/load-auto-layer-file () + "Load `auto-layer.el' file" + (let ((file (concat configuration-layer-directory "auto-layer.el"))) + (when (file-exists-p file) + (spacemacs-buffer/message "Loading auto-layer file...") + (load-file file)))) (defun configuration-layer/create-layer () "Ask the user for a configuration layer name and the layer @@ -657,23 +667,24 @@ If TOGGLEP is non nil then `:toggle' parameter is ignored." (defun configuration-layer/lazy-install (layer-name &rest props) "Configure auto-installation of layer with name LAYER-NAME." (declare (indent 1)) - (when dotspacemacs-enable-lazy-installation - (let ((layer (object-assoc layer-name :name configuration-layer--layers)) - (extensions (spacemacs/mplist-get props :extensions))) - (oset layer :lazy-install t) - (dolist (x extensions) - (let ((ext (car x)) - (mode (cadr x))) - (add-to-list 'configuration-layer--lazy-mode-alist (cons mode ext)) - (add-to-list - 'auto-mode-alist - `(,ext . (lambda () - (configuration-layer//auto-mode - ',layer-name ',mode))))))))) + (let ((extensions (spacemacs/mplist-get props :extensions))) + (when (configuration-layer/layer-usedp layer-name) + (let ((layer (object-assoc layer-name + :name configuration-layer--layers))) + (oset layer :lazy-install t))) + (dolist (x extensions) + (let ((ext (car x)) + (mode (cadr x))) + (add-to-list 'configuration-layer--lazy-mode-alist (cons mode ext)) + (add-to-list + 'auto-mode-alist + `(,ext . (lambda () + (configuration-layer//auto-mode + ',layer-name ',mode)))))))) (defun configuration-layer//auto-mode (layer-name mode) "Auto mode support of lazily installed layers." - (when (configuration-layer//lazy-install-packages layer-name) + (when (configuration-layer//lazy-install-packages layer-name mode) (funcall mode))) (defun configuration-layer/filter-objects (objects ffunc) @@ -959,24 +970,32 @@ path." (format (concat "\nAn error occurred while installing %s " "(error: %s)\n") pkg-name err))))))) -(defun configuration-layer//lazy-install-packages (layer-name) - "Install packages of a lazily installed layer. +(defun configuration-layer//lazy-install-p (layer-name) + "Return non nil if the layer with LAYER-NAME should be lazy installed." + (or (not (memq layer-name configuration-layer--layers)) + (let ((layer (object-assoc layer-name :name configuration-layer--layers))) + (oref layer :lazy-install)))) + +(defun configuration-layer//lazy-install-packages (layer-name mode) + "Install layer with LAYER-NAME to support MODE. Returns non-nil if the packages have been installed." - (let* ((layer (object-assoc layer-name :name configuration-layer--layers)) - (packages (delq nil (mapcar (lambda (x) - (object-assoc - x :name configuration-layer--packages)) - (oref layer :packages)))) - (pkg-count (length packages))) - (when (and (oref layer :lazy-install) - (yes-or-no-p (format - (concat "Support for %s requires installation of " - "%s package(s), do you want to install?") - layer-name pkg-count))) + (when (and (configuration-layer//lazy-install-p layer-name) + (yes-or-no-p (format + (concat "Support for %s requires installation of " + "layer %s, do you want to install it?") + mode layer-name))) + (when (dotspacemacs/add-layer layer-name) + (configuration-layer/sync 'no-install)) + (let* ((layer (object-assoc layer-name :name configuration-layer--layers)) + (packages (delq nil + (mapcar (lambda (x) + (object-assoc + x :name configuration-layer--packages)) + (oref layer :packages))))) (configuration-layer//install-packages packages) (configuration-layer//configure-packages packages) (oset layer :lazy-install nil)) - (not (oref layer :lazy-install)))) + t)) (defun configuration-layer//install-packages (packages) "Install PACKAGES which are not lazy installed." @@ -1574,28 +1593,32 @@ to select one." (when ext (push (cons mode ext) result))))) result)) -(defun configuration-layer//insert-lazy-install-form (mode ext) +(defun configuration-layer//insert-lazy-install-form (layer-name mode ext) "Insert a configuration form for lazy installation of MODE." (let ((str (concat "(configuration-layer/lazy-install '" - (symbol-name mode) + (symbol-name layer-name) " :extensions '(" (let ((print-quoted t)) (prin1-to-string ext)) + " " + (symbol-name mode) "))\n"))) (insert str))) (defun configuration-layer/insert-lazy-install-configuration () "Prompt for a layer and insert the forms to configure lazy installation." (interactive) - (let ((layer-sym - (completing-read - "Choose a used layer" - (sort (object-assoc-list :name configuration-layer--layers) - (lambda (x y) - (string< (oref (cdr x) :name) (oref (cdr y) :name))))))) + (let ((layer-name + (intern (completing-read + "Choose a used layer" + (sort (object-assoc-list :name configuration-layer--layers) + (lambda (x y) + (string< (oref (cdr x) :name) + (oref (cdr y) :name)))))))) (let ((mode-exts (configuration-layer//lazy-install-extensions-for-layer - (intern layer-sym)))) + layer-name))) (dolist (x mode-exts) - (configuration-layer//insert-lazy-install-form (car x) (cdr x)))))) + (configuration-layer//insert-lazy-install-form + layer-name (car x) (cdr x)))))) (defun configuration-layer//increment-error-count () "Increment the error counter." diff --git a/core/core-dotspacemacs.el b/core/core-dotspacemacs.el index cde1810ba27b2..9e5a3cd17eb48 100644 --- a/core/core-dotspacemacs.el +++ b/core/core-dotspacemacs.el @@ -65,7 +65,7 @@ environment, otherwise it is strongly recommended to let it set to t.") "List of additional paths where to look for configuration layers. Paths must have a trailing slash (ie. `~/.mycontribs/')") -(defvar dotspacemacs-enable-lazy-installation nil +(defvar dotspacemacs-enable-lazy-installation t "If non-nil layers with lazy install support are lazy installed.") (defvar dotspacemacs-additional-packages '() @@ -334,6 +334,21 @@ the symbol of an editing style and the cdr is a list of keyword arguments like var))))) (car config)))) +(defun dotspacemacs/add-layer (layer-name) + "Add LAYER_NAME to dotfile and reload the it. +Returns non nil if the layer has been effectively inserted." + (unless (configuration-layer/layer-usedp layer-name) + (with-current-buffer (find-file-noselect (dotspacemacs/location)) + (beginning-of-buffer) + (let ((insert-point (re-search-forward + "dotspacemacs-configuration-layers *\n?.*\\((\\)"))) + (insert (format "\n%S" layer-name)) + (indent-region insert-point (+ insert-point + (length (symbol-name layer-name)))) + (save-buffer))) + (load-file (dotspacemacs/location)) + t)) + (defun dotspacemacs/sync-configuration-layers (&optional arg) "Synchronize declared layers in dotfile with spacemacs. diff --git a/core/templates/.spacemacs.template b/core/templates/.spacemacs.template index 75da4439bcf38..82fa3b05f26c6 100644 --- a/core/templates/.spacemacs.template +++ b/core/templates/.spacemacs.template @@ -12,8 +12,8 @@ values." ;; or `spacemacs'. (default 'spacemacs) dotspacemacs-distribution 'spacemacs ;; If non-nil layers with lazy install support are lazy installed. - ;; (default nil) - dotspacemacs-enable-lazy-installation nil + ;; (default t) + dotspacemacs-enable-lazy-installation t ;; List of additional paths where to look for configuration layers. ;; Paths must have a trailing slash (i.e. `~/.mycontribs/') dotspacemacs-configuration-layer-path '() diff --git a/layers/+completion/spacemacs-helm/local/helm-spacemacs-help/helm-spacemacs-help.el b/layers/+completion/spacemacs-helm/local/helm-spacemacs-help/helm-spacemacs-help.el index 9ba01fab38c10..c00b49aaf9e16 100644 --- a/layers/+completion/spacemacs-helm/local/helm-spacemacs-help/helm-spacemacs-help.el +++ b/layers/+completion/spacemacs-helm/local/helm-spacemacs-help/helm-spacemacs-help.el @@ -297,17 +297,8 @@ (defun helm-spacemacs-help//layer-action-install-layer (candidate-layer) "Add CANDIDATE-LAYER to dotspacemacs file and reloads configuration" - (if (configuration-layer/layer-usedp (intern candidate-layer)) - (message "Layer already installed. Not Doing Anything") - (let ((dotspacemacs (find-file-noselect (dotspacemacs/location)))) - (with-current-buffer dotspacemacs - (beginning-of-buffer) - (let ((insert-point (re-search-forward - "dotspacemacs-configuration-layers *\n?.*\\((\\)"))) - (insert (format "\n%s\n" candidate-layer)) - (indent-region insert-point (+ insert-point (length candidate-layer))) - (save-current-buffer))) - (dotspacemacs/sync-configuration-layers)))) + (when (dotspacemacs/add-layer (intern candidate-layer)) + (dotspacemacs/sync-configuration-layers))) (defun helm-spacemacs-help//layer-action-open-readme-edit (candidate) "Open the `README.org' file of the passed CANDIDATE for editing." diff --git a/layers/+config-files/nginx/README.org b/layers/+config-files/nginx/README.org index b94551217940b..9527b24357502 100644 --- a/layers/+config-files/nginx/README.org +++ b/layers/+config-files/nginx/README.org @@ -1,23 +1,17 @@ #+TITLE: nginx layer #+HTML_HEAD_EXTRA: -#+CAPTION: logo - -# The maximum height of the logo should be 200 pixels. -[[img/nginx.png]] +[[file:img/nginx.png]] * Table of Contents :TOC_4_org:noexport: - [[Description][Description]] - [[Install][Install]] * Description -[nginx-mode](https://github.com/ajc/nginx-mode) for editing [nginx](http://nginx.org) configuration files. Adds basic syntax highlighting and syntax-aware tabbing. +[[https://github.com/ajc/nginx-mode][nginx-mode]] for editing [[http://nginx.org][nginx]] configuration files. +It adds basic syntax highlighting and syntax-aware tabbing. * Install -To use this contribution add it to your =~/.spacemacs= - -#+begin_src emacs-lisp - (setq-default dotspacemacs-configuration-layers '(nginx)) -#+end_src - - +To use this configuration layer, add it to your =~/.spacemacs=. You will need to +add =nginx= to the existing =dotspacemacs-configuration-layers= list in this +file. diff --git a/layers/+config-files/nginx/img/nginx.png b/layers/+config-files/nginx/img/nginx.png index 51bba47f98b5d5d76d4f9a36408c782b26973966..6711c524ee92c76eef18590aed59e7d4dad368a9 100644 GIT binary patch literal 33876 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

wed{R>B*10XiLr1^?Xata2 z`tUQS($Z#j6>$qOZ9a6X&*Ne_sl6pmCF?R|kR3ZvDO)BSxq#IP(@MSM8a4XGa`ZX5 zyxxU1GU_*dYh2%7g9TNammJ&lNy7x-)@;nkQB7Y()jCpYDrjt`)%PF_@a;epJuH|0 zm@NY$!Rrv0?1|nA^EF&uo&V=ClZBMl0iks9Zak?yHaA^L*%}jcMhnIlmqj_L{W)Rj z!P7amY!)aJVAl9br4djXv}MqTOx~!peahi_s#^5xB%D?J%dmCG<9r?^<$C5x9@8#|=!oWILm?(yLX*{GT*`9^cBUx0&~Tx>|r zM2}9h%@T=BckgSB5WG%=rMpV4QmySNKs$tu!%wOv;RJ%XGK1-dbMVW_FZiC(E0{W( zmH&$k2AUTW!Qrh7yJ?aa7M8k{%W*)Mt%Tb+Lr$LArAws9VC;jCV+=P%ig^#P_(PiC zvM$mU66x0inKuJG0F)p00|45J@yn#*9&Ud&rXl|%*tRp{6G?$Cb$&z0D5pkk+j(X} zM+F6U{upMvLkzybAa-Lo+nJ(y64JcO)~7F+T-9C6ayDj&wA_E_+dNKnd8{}4nak27 zW|xC35hq+r8nz)YmA)$pu;*=yv}>ge-oq0l+A6BX1jAs@;#wSekH0{2P#7^1Ej$;D z!i$vmB0ygW72nL-c$PT4HvXB+?PCxrnu=|iB}(x)6`}AavZhb5DAH*iqg3m}-30Ti zlrjU$an@a0m}X*=MK-1Cg*-c5WMF`C93D_G_K4+t(3y40%3?lnBsAUl8QOQRqwSQhKSscFf*zg1#&o!MoIp-TLGo9wk$uWW2| zB%qJ~!A#1gw+(JuY=Wq;gX~2my>l_XVNYpPkSNSqZxlJEWpxmi2H0OIQLE$T_}I6p zn*kG+-k;Or@vxcqGMVk#<~+fg@aB_BHvy$4W%R2>g*rH=6xQ&LpUvqR$LjBDoFT~+ z%^rJrk;Ql0VE=lff5i1J>b$}pV|es_=Cj+D+_Tl!LVzk79F+>eE7BBht`utjdU2yp z@Cgl_*gu)xDU%Duv#kalp37tR6AMO$&NDmIT{B54g%D>G(FYS5c9@u_Ac2NcU}DK%(x_V;E;s){_F|YQ-Yy`Jb)zoec%(IHg~&pd%%n2 zxjd&iW6Lzka>0Ack`AX!jE>BO)~yp5=xZ>9-rQt)OSs-{-d5e&VE0?75`3hYfLu=( zZpzAHotP96joy@)!?mhK<_1yL4MT>IiVq2qY8ia3GGvHiTIV5dDlW!456*nB7-BSQ zIS5eeDsfB@#CwlfcWAnKL>QJex}Ulq7HfSQ)dKx&bq>|4IBLF$gY0~IK+j(dF>J@G z^ol%(>4oa4+(y)WTOs!;8im=%4G6sGo$PL2chxOqD_iA#=a{6ck8Kd;lw>+fg73($N6Vcict?OpYFRj(c(OB8i~Myb4dd=v_^3~YYqGXBj0xiO^=w#e;HE7YnVGTedB zg(=N1vM7VrSEtJGb&*LRHY{;^Ixrlk=K2wXj?xn8Xh@YBVcx0omQAE2+GROr2ZwcV zhH;g>cvkBzs--=xZv`ri;wxTp+%bfJbCrheGmc@Q4cQ5w&>XXFw2?X8E}@O!ZaqHE z@k^p%yTWUORh1fpfv4q#L9*m@_0%7|W=_NGs1}9Xn0b&GV`V18Q5@h`Fsg^CDL|$3hBh8~JoB=VPeSLJ1S8-SV6) zlbyn__1|AKsQduKUlXj(l*jIoY#=I4a%Y6+(^jTi>W_*Al-_=IWk)Y#nb{;A2**`v@QF^Odn zY1I?u^e2}bQ4p8?b6n50iR9U^jk#5Y;taHQ<@JE^haca>;^(4|lO$r4!OX7&Q=D|* z@La?TmLCPIwujCxBy~>QlgNuTr5HQ73q1Y2D4?Na&GNd0AFq{zKkkKoA3F4r4dPOg ztp-L75GKxaPNFn`^5F)AHHuRQ#HM78-&(SVobm1T5vumlwE3&3f)Fe#AT9F991^DO zs8UA5X7vaL+=p@B#$vt{FvuM$Bo6m+kw>j-h;~*TGG#b1fqE-anzcVc^c1vIIwaZZ zmwf4rw?F1!X_ms_VX1FcSQ)j<*d+N_^`!C%-PdNrFjc4vJY(?EY7pRR;Ra${7$V%7 zWyv53GBy{j0}%uM1e6-GBuM>-RrCp;apbj#*An(4PYw1xeW>S|5*;f|Y<|jbH++Kq zP`ntUr=!CQ>w_#z<_fYx*!=Oo4kYKC{kQ$U)=PNDTCFd{rT04N1wy{%xf|6H%j ziVDL-$iXQ65maMavm^mftaF$tB_{I#N+QZhg_&kZ8#7s!gskj5^0G`;O38cpS)#VT6~#7hl(FfCXZFGE1T%IIgD@C zL^*OS`E}nT5$)uen{Mu-UMU!#KqhSgN<_N z@!CEqB{~|&55LX1D4ahB>le$27?Rvs1S9ko_1cV%mCGfbzTWvXrtiao3I=iBmpoy$ zM*YMSPGc5*&&F~m)Y1#LO!FGheGF=$-z&GhCArHBkSkZjZRjRVO4RY!Besy-{(Wjo6kT9IHhwE*Y(=T#%E)+EqeFW^qU*pHFgTAUQ(*t za|H2}G*Oun;EZJ(O?b1y5&q)X1u~nqp)MsGbhzOj&Kg!{j2zseKVC&2N`t;eu4|-h z)M(mu{fdYQQxYz-8>Tgg)~_BnMd$o=n2`M2Cn}Va#{}3rkpS+6+r1cL-nAD(9eBY|y*_ z6Q<9uB-~eLoLbWXoFIz2;nEy?-?U6cxo4E84a$=%$_@V+J*zP~0b`i9HwB}K5Zy|* zNQsuxtPyKOSn>J_d$q$f;RQQ?n#_q4Er=-1-eu9RIrt70`{3~! zQHOsyMWsIV#>g?2zQU$JO;B&*jN7P@dLx`Za7AXvp8odv$)Js6*f&fX(fnk*tFBo( z+>I4d{y3s}?u+`$TE34TLqk(hT+uW-(*^X(JeFB_TKKUL;1KcJCl$jV^9KnL0!`-B z5z>A5+I!JXfHJg%sEH%CsMPzTc(|gk^ajsk{Ju*1_mQC$J>(={sfJwOOK+@bD($jXiT7-CPAuFY1>kq9{a;wFZ z#4R&>hqo;r{fG{YQ{PCK7hjXD*P3N#1zBb=6a+(v)}EU6rqy1<&GHS@3q^Ny6os6Wh8iB)(98SycR)R@AL}}i6fVTfa#d!zbu=wNRNuWAZ0Qs(fL~XKX=sfZ($B zUJ#q!vNNk^1F1y9dB;cssm$C?sm0zjmP zMUo+tZ5ru5S{GxIe>^#CU8D0Ul)<_}a1z}~s0v0arGomZZTcsi>iFV4iW2mbO;)m& zDUuqkVR@c#qr56vHF6Noh36!ayO4H_LSIwLFSR$RkR%Yr6PRx zg#MR_u;|(+eS&tNZ{T)mTyi24CfX}cQIyZM08N9%mMD~=sbO+nq75arrlAs{Ku@gF zDUE~h4OS(f@ImUE%z+OXUe{~C)xvmKlIFv?3mxe#g`i$eV^>|5!a)rq9{752GuRo+ z=+vyzgm-Y$J1fI#iBNW1a7>%2u3Ed;u_ork<-MFbP9i@RO$CQxw8{Fm)zjC2*GT zhPH5bP0p-~A5)R3X|yM}#W+vHCwk%t)u1*vuvklkc@6DJ<)yw!$*Y>N0^F;06X9 zc%pV>d_Y6FhEp*<%3?Rne)&qFcc>)dw3P(Ra*Ys0*UxLq`xDGPAj^}lEBwMXwOT$H z0bEI<6_{VS>2m1?6X=9+uy}EjA`aFgP?TAtpJfAQx-pMhL0A zI^WmYO_4*jNsi}7{qeh7U22nOM$yUTPME3v4KcGVriCs7)*v~SuH*n3k_XnuomVMo zkCbekST@^H4z2*oN3k06Y9s7{Mlg*=b9bp0{Z<>oWJ`V+&d5Bc)Qr=dMee|D%5HtO zFRgL2%8Uh5#*7!lfbW6krDL{MDs^VUI>DFH)cvn_dD=3EFYI~@ADid|gTkk8xJDn&Y>7Yt9?v9%6s`x4J$qKmR8VC~0 zQ5vea)#$O1s+O;!gXjQ|+GrF)21ZyD9^JnM#7}+63|nV7rKW1AKO$Hrd(b(1%}!R` zsQouyR5a7q!!Q8oVa{ikox8iHuIQyC(hR+i-a3N0c}@|vzZHHKkHmF`tA(){vM^NV zF`HfO2R?Hv-e({?s5JL zI1g@tuIYO1?2mhx!;!PfI-~JiaojZ{+-^aGuuH}h{S)e+wE8Dv(hJT_s>7af&_$*$ zy{;^cnu6$StS|nC`t7vD6G6 z79$U8$|h7;%63e-w948Kw4W=>UG{oX(XTUL@`a)4{gkSL637028Fa(DoPzD{TPMwc zoRtnpy+Qrn{W9k}QV-VOC(CJje}b>8U3WIPUOk(*FPch!&&4@B27mF$fO~ZHtE8he zpJyhOZoMa_ja;5K&fOihJg(vn;zYRx?Ze~vw~?}7Ti+1RpV8XBmjdwG9lvIFMmo7t zZpU{X#DiPl%13A%TnA+xo}ahO4;Z*HGPu4~QA>E1{9g6^ZsEIvOU4`X$?p+v#{J^8 zq}ZIC*>r_9P0rA_#S96W=lJX96$a4xBM1=CU?;{oWDbt9%mjmOXEis@>1y^)6_Zl` z;k7u47$&?=ge+g@{)Xe8h?pS6;(N?D+H^}ydBi&?{hYoXPSS~?44Uwx_l4CiXH$>K z{00s(Lwt^y<{#X+mL%VTrPqw?zf;lk4E?>^bmx>t$)2jYIr79HeWSN!^{F)~rsQ`B z4Tfa&(x59cIfw`dUOX3J7GK$ny+AVh(oRjyx;HCo4KXHHmV#lB*E5R(cf)tUKK{#A zSaz_EPkIu%QNEJ9d&{$fXfxa=5kl}gs~M$D47rGAdOaN1B1csV((|hqHchasddxJE zuRHQpuzdQ&Pl6;@$9%FfB7T1skPanYX6(=%z|6@a!IfA+&=!8@le-Zez2tgoDBUD? ze3xF2FZFb#|>6xKfmi`!DC#3fRpfp0=_~q!HjKcAraCDaiW!K z$t|i)s(c@BTa*}GKG}x=eiB&NtDj#Y;0?pDcw)gUbrjs-%D|an;s9r0aOKc zBc+y&^>jWQ`PR6!DhzvWxhWu>wr)=JuFW<3Z+`;fYX?(!mpcy^NGp&qGV8a7q&w`j zdTpVCmg5B`*uJd2e|Cao+!SKVq#b{A+m4 zE)V6NOpXuBd%q(hqY5S8n)9ID`Etjw1;yo)Z?Dm$P*scA+drLa9y){GuI^B`CzB*vu z09f;+kt9qB4B;cQ60ot`4%OVW4r3r&%VSH=dFE%DFPtO z$Gg>DeudV2bTc0xp(&}WT_t+7kOYyEYpk+n@nAQ!!#{U4R+_AudYWaNhpec z%ItewYlHqJtNh$e4W~%m_IGNCj-z+YrEgv5y=<+m{3va17F zKY1uQuH_Z4t_FiF`v*?=%!$5rM5#6C^@+Y3ihFdDL2PsB1-87!)Dx%;U%G`bJ%p%j zQbhWRprvBy0b~z7cCM;h^sXyuQ`b`i^;+=F^v46iXsB=--`15!?88Z3tk$qKdJ>il z1QrRCznj!89u}RpfO%P%UMi`n9Q4R6C=4dAo^#$@@Qh zJSBOdL0Jx>EUtxLmi!r-ckI^88b0^**5yRqi>Wi%v6itY*Ok+crZY^+|7~RFy{A`k z{6^XltCUDJXj(B~#WBO%KPI=7<-?l+dBe#-mZJ13>IcC{Z(G-==9gH?duKSKFlg=6 z^1lH0KnTAiPS?2i7&+FA+g#^B7GjKD42js&;GlAql#r=yy@vc*n*abn07*naRIEB0 z$}t?SSPj#-$XdVjE_-WG9r@>Zeq+SlynR zze?g#j!Dp)+y*@^atmNQ!1OjNod$1Syc`SJ??O-V1>P2W`a56op!H*O0Wgn8w}FWh z4xIgV_jamZG3prPHMB!ADMCHBA{jPpYpw>7zpl=bHM=^iGg&2;jVmZUm|`-rgCYBp zjvbXXwp?d92>#ze89CjpZ6%E}P|nTv>alOg3cuy{u)+f zulg?-Klojz(bwR&x_i{a@ahuGE1WL)EL9#b(Sc!t`=AHFnSDyO--^iHwn_#bffI;d zcU`C8H3(B3+##GzePdk^Tz6bv=jsppy|=Aqk%^mU9g-;%M|!S8jXJQ9?%xN~^wY(f z(MROMxEaIW={6(eJ+Vj&AyP}`wA0|-)gM86%`uo)hT0Z=W=S$}hB&DkU5tcUpzcu- zs=8M_@}MnQQ61Zwd?i+J{{zL?K0GEbrD={bSXIHdQopsI={jE%>yCP?-u`W#tc$5B#o%n1gwg3FGEM*sy1&8xixDLV@EW6RYey6U; zRA$k;bW)D~VHW0YfS1oYF#7xUUeyTYohtb~lEmRHk6KtHj!_vvOqU%{N z%3EvwxQ1e_mC~71$9lz5SJe=IFKoGHucwEdfh@Z3Wa|UMs z&7K1-ja_ju7F_pAMd~dx7&y$HQxPLc43JrZG|n0se3?#(?fg_JUruJ;HtH#a6CZOOW7>-Sv8Ig7rByaue_@=KGcV%}89 zr&9I;Yb92=@0GpIJNZD~=lLg&o(Bn}cFkdkk4YUSZLyk89XYXZ>jm3$&e`IUr}V4s zYfs0ioiZum^Ynvo#MpXlK9o)^Hwg$%7a`)PIIHk$;GWyM<^<#4OJc<}; zV8D}jl}84j1B3rBLeGn(V3Ibn?)Npi83En=W^MKMcgw1tD`{!_Ojw%qUbl&4d3(&* zfpydUW8=|BU^De57q=FXNapHOnIg9IAfNsU4JBZ8hLx>hnV+!M4Zc`*CJu_chq&7V zS}Hd@_D$%uTn|Yk2TOWe+GG^ra2Tt?!_CrxZ&K(SN}zwMJgfsIPBO~oKTFA9FS_l? zzW;F|hG_)WH?H_381Frb`Ip<(*+bK)#QaT0ji7A)u9YcDTBxcsRBglE3}$-)CP8jv z!Y^W0QY=}mDmKID;QQzH!{!ZxOV+i}_4uyzMU=I^oPiZB%Ors{ z-7l9n3_MFpkMhpU#U)0>Hzx!HxL-LJim;p($*`s)anX}5b>$54e!59elC(;DeO#Xm zVY$nxqk}+Zw3X?RX^WsSpe&8ae2?LbP-rXX!xe=Smt`hK1_5y%U=1r-}D%eK_|Psy_7oU9V9JEr}Z${Acu! zA3$wp5sV1(&BU=a*l&Z(9NWcmueLV!hGee2NzU)C-El{qG!iNVShBtvmaKPh#fQhN zm1emzpe5@<+jXx7fjU5K1uDj;JCGRxO1UK|%-X7LV;D(a0OQO=X_}{7m~^U`d>(I( zSI<%qj<(*%IrwR@$E#~TQ|eb{HIYR?Zx=@)7BL3E)4T5ZvL19Y+6#12s9bzG?_UQZORdQmRNuEA)X$DWZs*? z+34fB$cEvvBlm-K!{fnxQx?~2YwSifZ~a}gF+|V&7;)}*aJBhN9jCu^5g(c?~@cs}}QWcq4dKH|xyJJw}cVt1VgKiwNWFRrF1S z>6zl9tS1vVx5SEfL1~C*vJx~%fO^Z4m5ejDSh1=G8?;Uun$YGmyslzmMDFu z5;$aG9|aQ!=%sE~mJ1j50a~aU#(3=lF!`UAQo^AQGx@Xk>DgKuF28|B!+5lesMR%Q zOO==JK}lS<=)^_Cov$-z8ei^a$=uvzjwattIl+c))O;}71!9I4zM9k-U5oT7hpU4j}XbH%QW+J0Wb<+zTQ+`zl6T!aHu_) z$yS45a(iiaA&YAjfq`@`+Je$JLtKHQxV8bW23EpZFQ5VdHMwnn0&kLejy`E=i?mP` zU+@+z96;I34?do2@&ukewXfIKcowQelm9(ONQ($c-D1Ga2A>f@ixf>WaqE{nv#TX> zGgnqg=D1ujA(`t^ow@GoSTi?B{4Z0MtYag_gncnqg38|v2}gFsL#=rC(vsEqcj>E4 zZ~w-xQF84>skOJ=2XXc%ywe`iB+zU}oXJ?S9K$?Yf}#}Z<4G4hC&1#& ztvssYZh3k{y3)iT)_U+>dRQ-k$=+idj?#@&4rjAoJoO-MTdb1aw%joA_png?Di&FN zQx>W%W*I9P>8xUQw1w(Vp}+iEnMb!-sLodLwid&)WuC%!&BSejpE$!*)~Rr8kCMt6 z&W|ZnY+9B)eMuQ0ijdA+9V0$1U2a~?ZAOkn#M6VS4UfG8+X?DSR$5GD+JJK9t2&Zl zTv1-P^x0F}zj^5@Z4;qUC6!zBgv;PJ?C0_*mvo&3lVQLr%Xmp?!@!A>@F)k6(J{*Y z;pr@bk^8yY9>KdJ%#4Aidp)^`=CA9#$CwP@mt*o|0*g=}Xm zR891YNe4n&oT2*G+kP*N(a2!tCCuEX^8#VAaA+ou+o_JYQMnlLBylXMRT`QslxgIq zbmk;87w|K;8BT+9Ugv_5V|U;LuR8C8j_Iy|@1kAOl9h}=7Qyc%BxqG*Vd)>SLcSVI zraD!iS1egQ%S3z4_OHXh%5IV>$^Qhb2qDb&Rx1Vq3;Nx@!fDPYC3yu^)iZ z9z$N~!py?DIrx1!Tnnt_Ezm>rGvcfrcS}iUUL-DINPGX;w@@8fdJdSlS9Q=r)sm_f zu2@-n>-JG8rR}7JYNNKFxlcEW-QDjr6USq>gn6Ts#L?Mr_AY2Tg-73-)r6lpeVms% zfho6=xq^|?-9=lnuG;Y%!*O1YEe80Zg#A`0ELpiSUSJ((En50n2_7fB-XJDZPJ&Hg ze#A3KpgR)DEa|35@QQ(FAaAMI_Cc|EV7`)aN~7~=#c(z58A=$I_%Il4O67bPDsyeM zJ{#5=U6wCjW<1IcfHX}93^q329mh$s!co426X0doEMonVo{cAA!@GBcGEk+|)I!n@9c060qhQ#U(o+YdBELl6(iP|xC2-cE>8j{B9 z@Yd~k{Y5bkyfQ5r8T|Uo$3%YQ(OuZKnP)9F?{!zJJcr`-dk*4C1&)o!e&D)J1riJm zTCXtJx<2V$>3+dAE`T)dAu0XlR(lb$#lSfjX`HOFZ3#WxCGh|9IqBqDE><(LQ1xr< zouOL&nzLq%*7`yy=3di4KW18Yy|Fk>20NOG!?9aZ5?3}K2UQX!iA#enCj)glxv;)L zojKv+Y}R}`4URXVrGvJ7CABv8Z>~Q&RotUbICArt#a&&^Hq~zt9gVQq21>I9JST(Wwf_;EhcRqA5@K; zbs!I!CRoqeGMP&2S+YV?AC4sdL;6Fb#PBi8xvkeYgv*)A3(%KVRc|;6mPdCTY`WrY5|TT2#*=O`AL=Y3!1v%g-M!WKL7L&h z{~z0fd9i;`-;YcR>!O+eM)%=wI!+Q-j;CNg!RPQjq9V-JH=2Fd-+0x3Dp&rpJSfKD zlY^tUJc&2(Nci#~LJ$t6^>6JSsX>eqj)oYA?>+#YG zaVA$1GnE;HH+Ub0W2W>RC$LZjV}FnB*r$uLuA9(CP~j|6f1U~cFzms2`d(i(kl|<Td**fn=-@@fE4r|Cj$(*gN zS;beZ4NFg#MncL1f*x7n95R1ShLO{ijtjo(4hk8q<`K8dDDgSbczRLx!{)19TC(r6Pu1XSQ0+w(P%0RmlMn@ct0BqnS39THE{ae z3xMB0N#l}K^$}ej&`$dER$HXHOz<~`UDZsd(br&o^?kQorzCMl9bwg+A5OU#(fvZ# zqfuRh?}GO;rP1%3U71g#yuxW_i`OU*ou<*ZM)}vj^Cfe_yk^QZNsc6QB=kjSgaK~9 z(Ot&-wmyubn_mXPw{yypHA-h_lxJ)2%Jl7ogW#WJ*|n>rjtldl?ib}9S%su@zTpS;RWagMBwt}i_xBt{0 z9y)V7_D$zK^Fl}`d7spf5?OR`FvQJZe zC)sSX%?-zFdD3Td!{B-7|F6Q9CZ)zyXUH(1zfn3XjlPXH!$Nhd=P4liPDh5&))mzg z{h+Q!VhZ=riE~`5u_P{(B-=;XU)VSDp@xxj$y~;RIoqz#c4_owBv&nCzcpaF;?|s- zK!|9b%+3{0n$r$2H2vOF)JTkbkx~B4DDS0K+9w$g<1lz;Z>%lg$JZegaZP+q2 z#p9MfvE&$k=Q{3V;$)dgT&ze?cf&BuM=&@28x|(Vg3(I0FB3Ov;-fM<{KnO`)P{H5 zi24~&vS(RE$PxoC=oI?5bidPwQ%<0F3lSeEhmj@qz=8?Z<2X47()aVAfBbnG4~dnP zc;hZhyamhh`*iSa_ulL6RCVl@@)JkHhOi{Ab2Ws|Nz;Nf--HlDBu=ARsh8>l$~B4P z0R$y;mc3^5DsLX(Tozw2&w?m2&Gk!vEL;a?e`d!^rqX_tZjq>*zNKo6EIkhl^4Bok6Q>*y$xbwKAVMl9 zkM6R{&feOGP{xbp7ON^N{vcF-&~R4hkZK6Y5N`hiW~V@oY#a0i&GM zlY><awv|ndADS$lx<5^9Sh}P(uG6`#eNbL@ON@`o%I%L6nw>r^OoCdVkKr5I0=T- z;QQG6ISKVjesvfeh~u!AEt#iU8<(AIuiE-OFq0*zh#v=TKQ4?QJc%C5;E^tI4JrJ* z(z`nt$Hne{h$H=n+3rRx2=+xE2A;uiB^9*f!d222vA6npZa<3^kX%-_bcggMDO_|q zA1;WntqnTyRM?taY4n-%A>H6alg;W+_XX+|(;#SXZHN80{xc+6JV|z^Q53m+pLRq} zlFNtzCeE^O>{h?ENV*sixjA;rW8$0#Ov`;yb>;RQVq|C^YkcBc*o}G~R06mQRq7Zs zryG?p@Hj6inKQ0|pE=WBJ$iK~C36KMryHmFl`BWdusOqH?*YSc2qwaps)^837;c`v z{jXZ0V&qB1rv^^TA0GNxYBjntbg#R4=F zw+WKCTAj1syquk?nYjDm?PEEZxZA|%hvtblj6PytIPfCNklrJnFX!A&Gjpmx_>wsn zPJ>65x{%CW(<#YZc3Xof_R&nT<~AT#k_b4H^|c^Q*`CSjuL{-HV@)!2SxE!aMKL8> z(&6s5F%ofYsD%WjX2ymc)z9MTXSfql&J zH3qC?R>Luqct%-ZWFXLVUH5G9iDmoB?NKs3y%-K#A#rOy^6-0M{rpsHxpA8_S!ukU zyi1V4?5_RA>9;;3QCUdhI@6={WTTk%tot<=33Ql^i}6PIUZ@guvTupDu=~nZsh$|wrhyhAUTuipYt=i|=!`rTe z444w(LPxSigtnYaGjZ#dEw&8v24h~}*ez!2Gy5$U(Pl!;#65)V-sMx0IL@)bKq)Ti z7$tLm>pukx{n6YobEJEe%uP8BcCPM()8OO@dawa{^`0FKtAyI{*v+Woo50Airep%R z679{9wnUCt^Q1SBb}A>qIA|Sjsi2)~@Cg{s>p+vaU~opBbCBGA^tR8FEwF>Rc@B6j z!}$n^-$HD)L18$-b2T*sN9VtNP*L7%|I#TDqq{nV50L+@HX5#KQUE>ASv%KxpFcYV<(UQ5! z=(s(wVBJ|uITOB5ahPJ^WZ#4ECt%oU8B?kI7u^oa$%E_?OZf55-o`CNg5A>hPS z5UjYk)bT03p%{Jm)?HvWKIt*Y`fIXRHTWzray4UN>2angza!ZKa*&(nfS1;}*ycJN z#E(EFzon{h2|Gzi(>?))c#mvH>XmkL@EQJYu0@uxduOQH+cDXmDGTPpD6jpXvy4o7 z?V_1DPZ9_9pL(4*U2^C8cU7t+O*#*PWGt_)+4keQ?Nkk4_^Ksy(49m7%8z7D<8ewd zN5PJJm9;Lr)2JjZiF*Ks7t5y^HZ)4n z=p7fR+-)E;H!erYX9lLlFF{LI(>)C< z(*J|>qi>oNN!PPkF<~4ui`(d1IDN3p;C-XCv%SkoB1bqpy)JB9e**>y*Mm7G^h&}L zw;nn^ulk;41n;TexEFJdA@^zZcA4^2k*IyiN{R(_@f?QRP}JT$LwvNdZ|RuC4J7Jg0^g78>Sxko8eO0=Y9 zxjIADFkUZ@tK%d)ldek>~q9?^8nc&l`)Qj zE?BQHUK+t4j9>qqVmNy3hf1UCOXIp{8Rpj}h=-Z$>&H*(u2ES*SXfT@IjORBK2c!M zaqF+>XRs`%-@vMSuDyDj@^0VlXX-Y?x5kyeYJ7yB_4_QYnu&v-IO*)S4?1z$#Yoih z!|(^6gZIpj&%t-WdtIJ>r>Adw-Z?n=h$zE}a*bP5(JPNLnpE<&z z|8)A9u8rcUdQ4BzJg#z0B9AprS7$C6Ms9lb=H45RnX3(Ny#=${n?*@-qP=a&nr16= zkV4N(`k)f-7gBQ)?AM`$#jfsxKeRS>z5sa#l#y?CoYQ8 z8s|Lw7x^1smhD8M){WA*?rPyYK}!o&jGNk(&gyLy3D})mxQI|vt2{y4tFUM$4rix= zo%WplLJ|i`mXj)LN!)|5PCc=0NnE&6b&|RLmt#@+!={qCaQd{LrQ6vA|3#u~zGpW;(@4NxdW-cX}SSGB~AjdnJW&jx9B|$DZ0A+ki0z1J9W)CUJ?1 zp8eq{Q9)U#K2jUAt?C=)t2|q%_F{tsm^jlCHz*e)cD;*{&emHoag#7?aNH9kTc^f_ znTvknLOKl=FM`h853#^(ESZa&cQWyP$()&vpSctWd@?of(p*5~DiU<*LupU#tLRV= zS%^aEx0MDBItdnH9k*~0^hDB1j?L51sA3#i`~Bup>%f6G$jIF!mAmXn_BDZH$KH%> z;^#sdXG2CN-!-pzjIUD@Iga9*&-O4r2Pe*V7DsW#z+pE>RSO%cA(U~l%^&Sj=`^Vi zM@ev=EmXT1=Z#?3OdOBhDv2A7e(N9@G$~2k)EI4)Ftc}>iF+s&NnE%Z+!13RR8E6& zoEHor@?y=(_6SPm1gu#{mZ}pVDstCHZr_Eg6z92Mx4K19qKk|$x3C< zc0#8mLs?m^hH>QSdpV8`C&9Hp!V-&&NqSN_>ipoa4%ZML5TC=*T~c(PhD0k|(Keqc z4N=?s2jJMTb6|X+GEBPPsQi?b;_li`+pT`8O~~_`JZaqJx2AC*qyBFhOvAY48Y||6 zg=*gVfo9@h*kHQujngD?QQ?gmFHY}JaWxaiW4De^O%fM|OH1bHGP7=pL>EOH53pg%5Rf*TT}1&E3`2*cbn#c+B#$*t}1E zrK)%CG{mmExT>>DwetJjg{8m8_5u%`@3by%TN-~GJ_wz$9vi43~2WD;vOdU?N0X^*K9E#HE0*c3Zsbf8_ zhSOlzK7Gq($uB7V;+A%t(jxS2wnh&m*QHG+d*M~-=G%3CkeJ49$ zr<+4N3I3=4P3A8r&crstvr_bn#!1RR{+O?f_v4JxZ;9dSe${CdL@B?tVeom7#=YHh zrIMDk-KJC&Ox*8r6xSsZE-5wj&R2^9Xt%_f%VTbO8)1ThQ8%{JAsPRWvu3+zp}Hl% z3!Le7Xzfj2`T>OlE5S6w*{|t3I6KwS)~T%-HY8s!#l%$|O5$cdJGHe|h@OgbuUcS? z+ZPU;Y&o@SvCaDYjx%#UzLjLIB+qE)HmhN;8NH?*^^}5AhEPWt;NMc)OyLYg^f>REB8U= z3#!ta5}86G$I+!F-!-{SwWoFkm^kHXMp>vv?KSy}7qxwT9CWS@Wa7x6tUvk?Q`p~^ zOdNIMT9L%*TC`KI>1nl#k%wT|a5Ah@Z)?j>oQAR0D^+3?Gp8hTdnUe*{(Ef4nK@k_ zN(U*KGr`Q6;%e{*HAv>Z=1JyaFOCXEP9rw0D=k^E^@K*c0+P9>8VjrsOTTF8F(GNy zq_g>YZY|)e>TA~ef$u{y04I==kd*_IO_DI;99G*g%GT4sfL{rTD)I*Jod(<3D%5l~ z>9Mj#KZY`4tU3-viB>8&p?{`%RtZY(KZ7*xatZc5x2L7A*eX_vbV*^rpRB9WKi8hx zE%pJAe}l}v7q-)V2}x2IODCTdJg*j#&rL@@%5>~+f{8mAw2#)QeW{G|__fg6sk@Y6 z!&tPlQ{$HtFNM#{jboejBy0D?cf>xB%Hmj-$od#ENfB+pOUtNaFsOs?O_Ewm= zcv7KwXe?qY47kEuxjJjc{tcFdS7Bv9X;N&idyXSC=p^_&5Hg~J?nvT0366|N9N$%S zY-#-o0|**HUKvqE2L9n`W`}%_l6o?*d~%>2S~^#l#WbR(*0G85G!(we2b_- z3~;jJ3Kqfs>qD=Hc(>k?l|*y4;18VHV)pKLZY`jLE9bNB7cd}M*YqSps$D4E;y7U& z=|76+_{V2`-{>0r9=wl|wo!gFy<^@$1{lw@0)6bwvrI_+M(yD-r4Z*GrIuEaMZO)x zfTA}wY}J?1=6fy2Jx#oI>tEy~&2c!FLMLgj+)@>A@I7!Wb_UJ_BSNYp318by(0;wN zPTT{K#2sH<+2*lZZC7Z949Lt$<3k+hHNSs3=HGld4W{#EY?B)cOV2QOig&A848@}5 zu_Diars8!J3}{Q%${mxoWvy`cI)9R9&(SSOlmQim*^2^4x5v>=f?Y>B38pIqSDyEn ze9hP{zGQ-%s``)PhJSq4_l>T>@4@>hX&dD?(>vx(Xvol|5r~PBn82>B<0$99)IUkD zyfo@iz}&?6p@f zC5fBB*{QiPI2}@5Z*G+g& z4^}F=qyM;Ht*za0qg;4&`+1tZF&fgU1%?)kdeG)>&HaGAcKc?zqd?=Wxfs$LSIx1h z{EG=Ovh<%2@kBY%YmWy>z|?vkS`zmlILZ^M!#lQj1(RPVnd>`Q?8Vuvd2t#{fj|v9 z+5Ohv!!BGM5qa!rWd1C2#O6J&_!=1lo+WE_cM1gKGe+!` zL*Rx04RMQ6I9C6KaE0){aEB3%8E%+Y@v=Dv&@T<>BJQcxOdCg~F`O&CkyBRF+oAP| zuG{fK#@&L{;tSC0Js*`Z#ELC)%yoOkT7th*w0GBCa()K0^n9o_%!g!@3)bZ3?AGd~ zb>enGCoa8Xw_0kb2#K^Xg_5}gj2B|7Ixok0VOIst=-IliI7!xIXq4@(c3WntT5_FY zmV%1U0Su6tqb2K_v8&vwd#;jpNVgXGog6#m5IBIgsarY;Rz8*P#k)^Jk4JrKjWA7R zTii6j01j;x^C*ooz96^PaF(#%?r9Law_eT7{!|4$BIACuy|eGlvOy^snwz-jY=6Gz z6uHv?|I7a(7yNVt)7hXUaSxd_aZ+w|;%37U=U>hrr%Ro=`s2K2OPlt0oX7)Tpht)c zVf4T;S1A~|v{Bw({!^B$+bSTMSI8A`o-J8(C6OcQN0n6WZ~dFxJ@(JB#R`dZiiQvE zwRU%=rtTq~R_?7mV7u-oWF-!}Bhm`7J1aa#q4t?HIZ;E({d?Ph>IbD4a>Bz&HATo4 z1C$1H!K%U`v=)yxrKbj_V&W#9UGNikLiMbSPi#oKT0zMikMq)!IqD$#<00u%XUork zZ#nSn#v)-^2g=BvPWWsI^DU9%`oqeR1J>EF8RvUN_?E2JB(0Hl$TL|DLDTa5g*-{* zh#lgO`i2;gut=bjV7}E(f_Yzrb}>NRLmtH?#0Ifu?6<|F-Y!CsUQf*lWR+MJY71Fe zs7~0sVWIjmv3lFz^!Q4woVlJ+D~sWZ+-#fIVOgAJ;vRy&2?XU z=Yf_qlq{XK<8I4xX~{YXDI}Hm6+@C0zGuZ~%S33_oLi1S+;Hm$0dm{(;3$)WfVgXw zV73fOPbJiSu8cA0ii^Zqx9pU7-jc&DHYWqdh=et%U>K7fmac?rqL_qvki61Db$INX zbI3w9xpoa>RX?k-WT+hj<3aiQ&YjWA<<5g4xBGOC>0kBur$B**WRuQA(%EmXF>xA` z+G#K)b9>=582X`|VdgN4v1hnqyy{x2uV@%&xyEATs-|@x3fZH`TAEv)pe+ir2dicG zep!dZdRQ7j5igiIsXXesXL!>F7!<6OwNyY~XKB#HKaYdg=PA%x_nMpsGj5X7Vd@^#seO0i-xIIVyV6fS8E`ghS(W73%N-3 zWlZ!4mr@mdo103>nwb@tm;}DHMEG3$0ISJ0NS{*4$ z4m(U6Xmi|tLSU6Dw;m`N$WypyUpX#}YVAI#U+g6TL`Y_=C>(GBBd0Xznct(TJ`{~! zHo+6*+W!MD?ue1%DI8784}HQJs#Y2Lxuf=D|9-Xn*6S9kY*X))9T2r&O9m-~l!PDI zhoJfFxH$dbH?i_QR`oZKvY*OyvWv&cq1DJ*68E5Kz}auFO5(!U2{Ln(%dwCZXPUvCu-a6)!V-$Qz?H&O)}`jCnX`QE-c>#O81vU7nf@4 zB>{z#PCS^#owA0H|QQj37;UBt!qBv%-}t3HegS_ah@rbi9E@o24O8l#vGxW!5}5(#i9X8Vsm4N#J} zs`DURjC7B)-}W(}av(EDbsc2@aT2y!vpLR7;a{@qXyBV9Fx1`i+ofp@qcL*K!do3+ zhWxgu%DyDc*_!6w%0~&fYe9LP7OUTuS;WyPXr;`&q#?ts&t$bG--J$diJw<081 zENCogs6_>Xuz_~FO92h?h{Z|))6&vXDBai0J@@+ieP_{)-90BeGk0h1 z<2%3eo$qzd`A!KV9)&6blpa6 zw0bwD9rp-rZ&xtA!}jft?mf8I!*o=uO0N)D_FG=|P#xBLg2cN(wRP{9Q7cpn`PuZa zelp3$ThJD4jOy{u$YwA>2`~AZ`aYs8l<(w)a!NtgN<>Vlr)3u#J9oOA>$99=WPpvt zVcRYLtSO&jBuo9%=cZGW1UW|LxM6)GM%PyH#7yCOM%>(>vnGyIb|=`ysfEvoXfg zYxq@Oo=b`9sY~-6J^!>T=WF=P`nok`1r4g}`nLH=@_W@(GozX)Gr2NCyWVmEAxlt# zyj)n!r4nxm{$t^sn_5KWY$R?sW+|L0I}gcrl92l|u~>cA_S}GOX~LX2UEA%vJTH=w zq(nWSu6gD);ZNEEWtQ>{Im=Yo^c@N7Oma{e&IMDIJo+*pJH~0|9(Yec6F=0?)V2Q^ z7Dg`DgBjztQ}QdjBzjTbwm8;jCPR8NJOXRXO_Wi~`7?nU&`;_1-g^bdx{b!!RyGEI z9OQqU4D09NYy|LqtLJRk$4s|R)Ax+h8N?j$B)(m$Xp~4Tltz^hH0`b5ZvGSc$n#j} z!ZECBq@Q7(v09Hpw#eP-j=$xU!MBU09WI z=8TyWw?CdA5t$o47tYs{HHpkoW`#&Q)*o%xVQ6IU{%9NZd-;YOFSJZ`bQ8~s7|UYa7M$$q{NM2 ztU>)Q#wM?lpX+sqEloQO{z6_pFHUYNWJ4#9SI5~%KWq9OYf(BXSrK*gtsR%rnP^Pd z-sDRNTyzTjC-xAcT#^?pJ2fRkEsws&9G0uF8v4)uz&#)sO9UI=nLarYb<}7j=hH;cDZx0$r zjhN=KRr|q>Lgz|sb(Ym=CmnXWjn>ydChtH5k$S-B-Ad>*4xEj|nPk81eZA8n*{=Xz zg|`urx#n}Ahr1yg8l*o}f_;fJOh8wh`^d6bwLQI6WLk!3952jf$fcR8LA53Q(aRA2 zWUAqchBOQyIS87jWKZ;p4svZIuE4+(<*mvi>*~!Kb8Tzi(9KP!V-xFpAsjq(075u4a^`>=1Qb*R5v6 z!SL}h%r_7XYCrj@JZ3yfr)Ko+gMWLfBvJ#uXnTMm&jD&YU= zDE?N}v7qs36|)L1R(tXrpctA=e;%g+x>tDQetDVeH!I{;YrRO!Iky;zTe)%~qk(&+ za?*Y$ZGkxq)rnGR+~tu-N9O$8=Mg!30(Orv=CT^*Bk#-|Bz&gK z!k+6lAcx~hkqvxa#*)pDfiX5ViMS2g7JpAF~8UEDOS@ecjV=u+PPU zqyah{pq_K5vpT9gpHpWj>)%0W;4H~uI+N$b729wx2kFS%5bz&FWX?p>OS*F}myYo@ zbu|iWFMBlZCF2k8e!9u@n6^cVJn2FNf4$MnB}?_ZL?YTdInmqS*D zf-rw+>n-T5H^>|u=9!C;P15ix>E?^2Buh*5lb`uA{hq6ixq=sgXvwLVs0Vcr-vI;t zRowc`h zQFMf>=@b=srlD)@DOv>&dItn^Brl;(Xn2xB(#p>guUI;b)2}d3G8B2=A3dXE{Z)nO zI}$Oh)Y!yBr+u+~_Pzzp!BB1)Y?mvoo^QidbR#5R;>a^D~U{G>anwC=OHw^@S?{ z!MO$Y#vQOo?-T+oP}!-O8CNhwZ#!JqX@>?Xx&T0428Ngi=4cVyjp-wZy}_T1!4@cp zATjWKX#)x?wgtDgiWBUNklZ0dl0BnQ}gH&2c zfBu^I>h(*eYBWw7# zJRFC?1M14P8*yx=sc?Q?rzjHn%Dtr!NVP+_bpArXd>f{)d`1jnwgF|TL`vcOmI_u$ z19Wa>M_D=$&z*l263I$7g@^ zF7jCz5`dWeGb)UAo<9Rt3rbpA^brYU`3 zyhI;-G6=R@c+_nw-qIx$oeD;Dw(j)U2)=i|T2pr_^o`J+Ua(O_etPap_qU%0V4Ow=hV5z89@HRX3go8hfKpaj*xYB0#3C2U1v81;jS;kle!51p9&pw7=}!ZgT*r_YcMi^ z!_8=sCt%a9;1Ic>V%m|>Jf1o3g8NpX&_}!(TQ{W*i>}j-3q5^2s5=@w-vR*yCmrnEE#q2NsO#wzklH@Lld`+J)$nin=~S}0fYD; zUwv=go>af1Jec}@aI`$4eED$xgdm9LpmK+!hA@e|_q;@Jj)wi0k;UEY=gjN4$io^` z6WutZQ+3mbfaEWfd*;q=$g5-H#5)SqeF!8rNk2|Nzw&lsg7KTm3*S3Q0skR8Ll2Mi4W_{vmd0T?U6B)anz7uRn@Zg$GL}Hw{^usO{R1H>sAE zjS6#^4epRPX`{TBRi`oW$(KqF0Oj|;2ImBg!SUdr*@zS&R+tRKB;BG_^s0L6>`gE} z3~$lNbrIT1TL;6TqwJn#tw$q+`U#LT;FV++b2&k%?u4VbDc=-sEN;EUCy(Z{N~x*Z z^<2(Q1}V4jT$%e-?gj3=F%h5wB9?sdI7<=F0s~A$;qa5GM;bn$;LCE z?3jKnebV;Rnbo)J9|Wb>y6~RU|N3-|d3vm?<$)OmOO05LFt)_#Y)`pb`}E%SIiGL5 zd-}oh{nV#-isrpN*XY>x?^s>9-^S-*k@v5;6-@M~+IA+X_Q`MM`3KLgd#PDe+SYww z>g6wy=M5*Ty%g!s!QYYuV zMf=C$jY}$!D0s%5kJMn(3GEhhuav6l`isFvuY8MT63fS!y!2JyL7(RZj#k!Ycyo`A z%k|F}c%Po?WkyHtDCJn-vHhRtFASv>_Z{Q4C~h}84SOoUsubj2Y>!@}msV_6m1#%J zlUAvx%eyP%NDXR7bVhMZgW}z5GdHQ3&*Wo|Qh0wF);_5bY#R=~(*IU`{Kbj3s?dcg zTu$8c1IZy>qY-ffX3I@s(_#5pvC+ck3EGuuU+X97MAGN1k+IEZU`zIz%yz42!sF1pi_8SX zlsK#otCgZ$*c7A*kMYx2ZpmYjmmK>KRLnF<$dpBWwjan6V`eVq_hysyf(+B>QApfd zPx*dfGkp6Ghw1Bnv_d-CaggaJqcjc!{qu~OBkV@Jn)q)Kp%0}jCuFB|7ONtEg=nVH zCnUT?^O}6tOiMAW`pVxyo{W5Jg8uKhy7j6RRuWBoQRYG=*8({*WT0Zey2Yf)NjftD zb=ujEJg)4ZdaM7QH=#w0^{N=G%Ak%GO5)g3#QU!8QSBUc2i01Ejf8;a_skmBL;!>f zp{Gz=K`BzkbJxhN_yWq#{*9r2F+s@kBT{{%eKI|S@QFL+AU1=ZG>oGZTxaOs;S!00 zRK}ZaDNES_Ct4$`SZoRd&4C5@!9!QhGIE8!$zJcg)nsuPAYGx81D*3chH1uqdgwzV z1S2IW@=#TSGnh^ui&*!oj*@&M@n zeF37RW_5Fm(U8o7`@9S5y9=?XT>=>Kn7?nvS6(Q;p%gCO<%i48(f|UEJe&hi(gA)- zL^L@_5i&Pzp|?V~QX&iX-=BM0DD}umUQU7&OCD0}?ZxsB|6DI$8X0!wMz1ZpC2`F} zw@nupAX_#I_8pMif{l`x;^?o^X-ZA@{$wvyZZL%FQIe+&8f-A*O4ioVgu0P+F93xO z&j&DyogAa^%a2mgM`R_XESwpde^9f>s`Z#gO<;5Uwpsq(%Nu zVxBTEu-$UoRu^(B_pdtuX74ay+@|4@6P#6Q5pW5d5l8Ml|7U9ak9L=rD9aO$MKHKh zldHT$q%&eI8*~p3>f|1dL2MhxFLBnPz#;#|)Ofn-swTwKlilU+P11Nncn4Dj?zE39 zfu(s9;>fFm)g_IS6s%!gnyMKeBDojfN(XoP$F)Th;pk)Z4W6sQD-9yLNE``v!Hli( zkav0Kk?9DTaolVz*k17p2X;ji8FZN{S# zE^;X~5#iC5t%_X|P@ID04UVJpRr0qX)<#)^G&SA6c=q=I-CcsAZzMRGCEwZUC&= zcOU;mN1P38tanwPysTN4VDZISi+{2%qBcFZZh!L&Wk7%~74U2|pkQZWsR@4uI&OK+ zQ(T$|F|`lJ)8*7L>4edULr@eu&5%4if0s-VHZC)kJ1dbI36;ruGHGRLD>>2K6_aqb zJRqttF@leeXp<`&WU>JDGmkvkA{u?kZiS*$Fh~(SUO0?cJ@r8X=_l*~fSM=%b^tid1Bi7>;K|9XfhCd$g)fT5= ztXPi_L>N;4m$qh1`jtWj8ocU@3Mz`m)+LO49in3iS?-0I(@^w uAH%)B_rHq;ywC8iLsJE_3O@@uv(vKg`KqG(qJ|6qHh|N37l&GVa>73%N4(|$ diff --git a/layers/+config-files/nginx/packages.el b/layers/+config-files/nginx/packages.el index 935b160314675..8e43d5fd28aff 100644 --- a/layers/+config-files/nginx/packages.el +++ b/layers/+config-files/nginx/packages.el @@ -9,10 +9,7 @@ ;; ;;; License: GPLv3 -(defconst nginx-packages - '( - nginx-mode - )) +(defconst nginx-packages '(nginx-mode)) (defun nginx/init-nginx-mode () (use-package nginx-mode :defer t)) diff --git a/layers/+lang/elixir/config.el b/layers/+lang/elixir/config.el index f67395491e1b0..e3655573f8f24 100644 --- a/layers/+lang/elixir/config.el +++ b/layers/+lang/elixir/config.el @@ -11,8 +11,5 @@ ;; Variables -(configuration-layer/lazy-install 'elixir - :extensions '("\\.\\(ex\\|exs\\|elixir\\)\\'" elixir-mode)) - (spacemacs|defvar-company-backends elixir-mode) (spacemacs|defvar-company-backends alchemist-iex-mode) diff --git a/layers/+spacemacs/spacemacs-layouts/packages.el b/layers/+spacemacs/spacemacs-layouts/packages.el index 8a7c7ce54400a..aa946e6ce445a 100644 --- a/layers/+spacemacs/spacemacs-layouts/packages.el +++ b/layers/+spacemacs/spacemacs-layouts/packages.el @@ -80,9 +80,9 @@ ("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) + ;; note: we don't need to declare the `SPC l w' binding, it is + ;; declare in the layout transient state + (spacemacs/set-leader-keys "bW" 'spacemacs/goto-buffer-workspace) ;; hooks (add-hook 'persp-before-switch-functions #'spacemacs/update-eyebrowse-for-perspective) diff --git a/layers/auto-layer.el b/layers/auto-layer.el new file mode 100644 index 0000000000000..ea00b628f03d5 --- /dev/null +++ b/layers/auto-layer.el @@ -0,0 +1,16 @@ +;;; auto-layer.el --- auto-mode-alist entries for layer installation +;; +;; 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 + + +(configuration-layer/lazy-install 'elixir + :extensions '("\\.\\(ex\\|exs\\|elixir\\)\\'" elixir-mode)) +(configuration-layer/lazy-install 'nginx + :extensions '("\\(nginx\\.conf\\'\\|/nginx/.+\\.conf\\'\\)" nginx-mode)) From fa8271d68945dc238a58a5635d0f02ceeda24002 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Fri, 25 Mar 2016 01:03:47 -0400 Subject: [PATCH 36/40] Add entries in auto-layer.el --- layers/auto-layer.el | 109 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 105 insertions(+), 4 deletions(-) diff --git a/layers/auto-layer.el b/layers/auto-layer.el index ea00b628f03d5..7cce337c7b072 100644 --- a/layers/auto-layer.el +++ b/layers/auto-layer.el @@ -9,8 +9,109 @@ ;; ;;; License: GPLv3 +;; TODO comments placeholder means the utility function to insert form has failed -(configuration-layer/lazy-install 'elixir - :extensions '("\\.\\(ex\\|exs\\|elixir\\)\\'" elixir-mode)) -(configuration-layer/lazy-install 'nginx - :extensions '("\\(nginx\\.conf\\'\\|/nginx/.+\\.conf\\'\\)" nginx-mode)) +;; agda + +(configuration-layer/lazy-install 'ansible :extensions '("\\(\\.jinja2\\'\\|\\.j2\\'\\)" jinja2-mode)) + +(configuration-layer/lazy-install 'asciidoc :extensions '("\\(\\.adoc?$\\)" adoc-mode)) + +(configuration-layer/lazy-install 'autohotkey :extensions '("\\(\\.ahk\\'\\|\\.ahk$\\)" ahk-mode)) + +(configuration-layer/lazy-install 'clojure :extensions '("\\(\\.\\(clj\\|dtm\\|edn\\)\\'\\|\\(?:build\\|profile\\)\\.boot\\'\\|\\.boot\\'\\)" clojure-mode)) + +;; common-lisp + +;; csharp + +(configuration-layer/lazy-install 'd :extensions '("\\(\\.d[i]?\\'\\)" d-mode)) + +(configuration-layer/lazy-install 'elixir :extensions '("\\.\\(ex\\|exs\\|elixir\\)\\'" elixir-mode)) + +(configuration-layer/lazy-install 'elm :extensions '("\\(\\.elm\\'\\)" elm-mode)) + +(configuration-layer/lazy-install 'erlang :extensions '("\\(\\.erl$\\|\\.app\\.src$\\|\\.escript\\|\\.hrl$\\|\\.xrl$\\|\\.yrl\\|/ebin/.+\\.app\\|\\.erl\\'\\|\\.hrl\\'\\)" erlang-mode)) + +;; ess + +(configuration-layer/lazy-install 'finance :extensions '("\\(\\.\\(ledger\\|ldg\\)\\'\\)" ledger-mode)) + +(configuration-layer/lazy-install 'fsharp :extensions '("\\(\\.fs[iylx]?$\\)" fsharp-mode)) + +(configuration-layer/lazy-install 'go :extensions '("\\(\\.go\\'\\)" go-mode)) + +(configuration-layer/lazy-install 'graphviz :extensions '("\\(\\.dot\\'\\|\\.gv\\'\\|\\.diag\\'\\|\\.blockdiag\\'\\|\\.nwdiag\\'\\|\\.rackdiag\\'\\)" graphviz-dot-mode)) + +(configuration-layer/lazy-install 'haskell :extensions '("\\(\\.cmm\\'\\)" cmm-mode)) +(configuration-layer/lazy-install 'haskell :extensions '("\\(\\.[gh]s\\'\\|\\.hsc\\'\\)" haskell-mode)) + +(configuration-layer/lazy-install 'html :extensions '("\\(\\.css\\'\\)" css-mode)) +(configuration-layer/lazy-install 'html :extensions '("\\(\\.haml\\'\\)" haml-mode)) +(configuration-layer/lazy-install 'html :extensions '("\\(\\.jade\\'\\)" jade-mode)) +(configuration-layer/lazy-install 'html :extensions '("\\(\\.less\\'\\)" less-css-mode)) +(configuration-layer/lazy-install 'html :extensions '("\\(\\.sass\\'\\)" sass-mode)) +(configuration-layer/lazy-install 'html :extensions '("\\(\\.scss\\'\\)" scss-mode)) +(configuration-layer/lazy-install 'html :extensions '("\\(\\.slim\\'\\)" slim-mode)) +(configuration-layer/lazy-install 'html :extensions '("\\(\\.phtml\\'\\|\\.tpl\\.php\\'\\|\\.twig\\'\\|\\.html\\'\\|\\.htm\\'\\|\\.[gj]sp\\'\\|\\.as[cp]x?\\'\\|\\.eex\\'\\|\\.erb\\'\\|\\.mustache\\'\\|\\.handlebars\\'\\|\\.hbs\\'\\|\\.eco\\'\\|\\.ejs\\'\\|\\.djhtml\\'\\)" web-mode)) + +(configuration-layer/lazy-install 'idris :extensions '("\\(\\.idr$\\|\\.lidr$\\)" idris-mode)) + +;; java + +(configuration-layer/lazy-install 'javascript :extensions '("\\(\\.coffee\\'\\|\\.iced\\'\\|Cakefile\\'\\|\\.cson\\'\\)" coffee-mode)) +(configuration-layer/lazy-install 'javascript :extensions '("\\(\\.js\\'\\)" js2-mode)) +(configuration-layer/lazy-install 'javascript :extensions '("\\(\\.json$\\)" json-mode)) + +;; latex + +(configuration-layer/lazy-install 'lua :extensions '("\\(\\.lua$\\|\\.lua\\'\\)" lua-mode)) + +(configuration-layer/lazy-install 'nginx :extensions '("\\(nginx\\.conf\\'\\|/nginx/.+\\.conf\\'\\)" nginx-mode)) + +(configuration-layer/lazy-install 'octave :extensions '("\\(\\.m\\'\\)" octave-mode)) + +(configuration-layer/lazy-install 'markdown :extensions '("\\(\\.markdown\\'\\|\\.md\\'\\|\\.m[k]d\\)" markdown-mode)) + +(configuration-layer/lazy-install 'ocaml :extensions '("\\(\\.ml[ip]?\\'\\|\\.eliomi?\\'\\)" tuareg-mode)) + +(configuration-layer/lazy-install 'php :extensions '("\\(\\.amk\\'\\|/Amkfile\\'\\|\\.phtml\\'\\|\\.php[s345t]?\\'\\|[^/]\\.\\(module\\|test\\|install\\|profile\\|tpl\\.php\\|theme\\|inc\\)\\'\\|\\.php\\'\\)" php-mode)) + +(configuration-layer/lazy-install 'purescript :extensions '("\\(\\.purs\\'\\)" purescript-mode)) + +(configuration-layer/lazy-install 'python :extensions '("\\(\\.pyx\\'\\|\\.pxd\\'\\|\\.pxi\\'\\)" cython-mode)) +(configuration-layer/lazy-install 'python :extensions '("\\(\\.hy\\'\\)" hy-mode)) +(configuration-layer/lazy-install 'python :extensions '("\\(\\.pip\\'\\|requirements\\(?:.\\|\n\\)*\\.txt\\'\\)" pip-requirements-mode)) +(configuration-layer/lazy-install 'python :extensions '("\\(\\.py\\'\\)" python-mode)) + +(configuration-layer/lazy-install 'racket :extensions '("\\(\\.rkt[dl]?\\'\\)" racket-mode)) + +;; TODO check how to support for the layer variable `restclient-use-org' +(configuration-layer/lazy-install 'restclient :extensions '("\\(\\.http\\'\\)" restclient-mode)) + +(configuration-layer/lazy-install 'ruby + :extensions '("\\(\\(?:\\.rb\\|ru\\|rake\\|thor\\|jbuilder\\|gemspec\\|podspec\\|/\\(?:Gem\\|Rake\\|Cap\\|Thor\\|Vagrant\\|Guard\\|Pod\\)file\\)\\'\\|Puppetfile\\)" ruby-mode)) + +(configuration-layer/lazy-install 'rust :extensions '("\\(\\.rs\\'\\)" rust-mode)) +(configuration-layer/lazy-install 'rust :extensions '("\\(\\.toml$\\)" toml-mode)) + +;; scala + +;; scheme + +(configuration-layer/lazy-install 'sml :extensions '("\\(\\.s\\(ml\\|ig\\)\\'\\|\\.\\(sml\\|sig\\)\\'\\)" sml-mode)) + +(configuration-layer/lazy-install 'sql :extensions '("\\(\\.sql\\'\\)" sql-mode)) + +(configuration-layer/lazy-install 'swift :extensions '("\\(\\.swift\\'\\)" swift-mode)) + +(configuration-layer/lazy-install 'shell-scripts :extensions '("\\(\\.fish\\'\\|/fish_funced\\..*\\'\\)" fish-mode)) + +(configuration-layer/lazy-install 'typescript :extensions '("\\(\\.ts$\\)" typescript-mode)) + +(configuration-layer/lazy-install 'vimscript :extensions '("\\(\\.vim\\'\\|[._]?g?vimrc\\'\\|\\.exrc\\'\\|_vimrc\\'\\|\\.vim[rc]?\\'\\)" vimrc-mode)) +(configuration-layer/lazy-install 'vimscript :extensions '("\\(_vimperatorrc\\'\\|_pentadactylrc\\'\\|\\.penta\\'\\|vimperatorrc\\'\\|\\.vimp\\'\\|pentadactylrc\\'\\)" dactyl-mode)) + +;; windows-script + +(configuration-layer/lazy-install 'yaml :extensions '("\\(\\.e?ya?ml$\\|\\.\\(yml\\|yaml\\)\\'\\|Procfile\\'\\)" yaml-mode)) From a33b0d02c7bd7b2296204dfdf28da6a3a7c54ca8 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Fri, 25 Mar 2016 01:11:32 -0400 Subject: [PATCH 37/40] Revert unwanted change in previous commit --- layers/+spacemacs/spacemacs-layouts/packages.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/layers/+spacemacs/spacemacs-layouts/packages.el b/layers/+spacemacs/spacemacs-layouts/packages.el index aa946e6ce445a..8a7c7ce54400a 100644 --- a/layers/+spacemacs/spacemacs-layouts/packages.el +++ b/layers/+spacemacs/spacemacs-layouts/packages.el @@ -80,9 +80,9 @@ ("p" eyebrowse-prev-window-config) ("R" spacemacs/workspaces-ts-rename :exit t) ("w" eyebrowse-switch-to-window-config :exit t)) - ;; note: we don't need to declare the `SPC l w' binding, it is - ;; declare in the layout transient state - (spacemacs/set-leader-keys "bW" 'spacemacs/goto-buffer-workspace) + (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) From 63df395975f336d09e4b3adc389f1de3dd82fb0c Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Fri, 25 Mar 2016 01:12:30 -0400 Subject: [PATCH 38/40] Fix eyebrowse error when syncing layers Fixes #5573 --- layers/+spacemacs/spacemacs-layouts/packages.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/layers/+spacemacs/spacemacs-layouts/packages.el b/layers/+spacemacs/spacemacs-layouts/packages.el index 8a7c7ce54400a..aa946e6ce445a 100644 --- a/layers/+spacemacs/spacemacs-layouts/packages.el +++ b/layers/+spacemacs/spacemacs-layouts/packages.el @@ -80,9 +80,9 @@ ("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) + ;; note: we don't need to declare the `SPC l w' binding, it is + ;; declare in the layout transient state + (spacemacs/set-leader-keys "bW" 'spacemacs/goto-buffer-workspace) ;; hooks (add-hook 'persp-before-switch-functions #'spacemacs/update-eyebrowse-for-perspective) From 48fa6107e866de224202fd9ca9bad1e94c950d6a Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Fri, 25 Mar 2016 01:29:57 -0400 Subject: [PATCH 39/40] Add lazy installation support for csv files --- layers/auto-layer.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/layers/auto-layer.el b/layers/auto-layer.el index 7cce337c7b072..0896191e8f22f 100644 --- a/layers/auto-layer.el +++ b/layers/auto-layer.el @@ -25,6 +25,8 @@ ;; csharp +(configuration-layer/lazy-install 'csv :extensions '("\\(\\.[Cc][Ss][Vv]\\'\\)" csv-mode)) + (configuration-layer/lazy-install 'd :extensions '("\\(\\.d[i]?\\'\\)" d-mode)) (configuration-layer/lazy-install 'elixir :extensions '("\\.\\(ex\\|exs\\|elixir\\)\\'" elixir-mode)) From 35b314f67729674df1a611b9dc360c89a3d73b31 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Fri, 25 Mar 2016 01:48:05 -0400 Subject: [PATCH 40/40] Fix unit-test test-insert-lazy-install-form --- tests/core/core-configuration-layer-utest.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/core/core-configuration-layer-utest.el b/tests/core/core-configuration-layer-utest.el index 4615b691dfab2..0afe39bd0ff08 100644 --- a/tests/core/core-configuration-layer-utest.el +++ b/tests/core/core-configuration-layer-utest.el @@ -1223,6 +1223,6 @@ (cl-letf (((symbol-function 'insert) 'identity)) (should (equal - (concat "(configuration-layer/lazy-install 'mode " - ":extensions '(\"\\\\(\\\\.ext\\\\'\\\\)\"))\n") - (configuration-layer//insert-lazy-install-form 'mode "\\(\\.ext\\'\\)"))))) + (concat "(configuration-layer/lazy-install 'layer " + ":extensions '(\"\\\\(\\\\.ext\\\\'\\\\)\" mode))\n") + (configuration-layer//insert-lazy-install-form 'layer 'mode "\\(\\.ext\\'\\)")))))