Validate .spacemacs variables.
This commit is contained in:
parent
780a96cfac
commit
0f2df2727d
|
@ -10,4 +10,5 @@ https://raw.githubusercontent.com/nashamri/spacemacs-theme/master/spacemacs-comm
|
||||||
https://raw.githubusercontent.com/nashamri/spacemacs-theme/master/spacemacs-dark-theme.el core/libs/spacemacs-theme/spacemacs-dark-theme.el
|
https://raw.githubusercontent.com/nashamri/spacemacs-theme/master/spacemacs-dark-theme.el core/libs/spacemacs-theme/spacemacs-dark-theme.el
|
||||||
https://raw.githubusercontent.com/nashamri/spacemacs-theme/master/spacemacs-light-theme.el core/libs/spacemacs-theme/spacemacs-light-theme.el
|
https://raw.githubusercontent.com/nashamri/spacemacs-theme/master/spacemacs-light-theme.el core/libs/spacemacs-theme/spacemacs-light-theme.el
|
||||||
https://raw.githubusercontent.com/nashamri/spacemacs-theme/master/spacemacs-theme-pkg.el core/libs/spacemacs-theme/spacemacs-theme-pkg.el
|
https://raw.githubusercontent.com/nashamri/spacemacs-theme/master/spacemacs-theme-pkg.el core/libs/spacemacs-theme/spacemacs-theme-pkg.el
|
||||||
https://raw.githubusercontent.com/sigma/mocker.el/master/mocker.el core/libs/mocker.el
|
https://raw.githubusercontent.com/sigma/mocker.el/master/mocker.el core/libs/mocker.el
|
||||||
|
https://raw.githubusercontent.com/Malabarba/validate.el/master/validate.el core/libs/validate.el
|
||||||
|
|
|
@ -462,6 +462,7 @@ In org-agenda-mode
|
||||||
- flow-type (replaced by LSP in =javascript= layer)
|
- flow-type (replaced by LSP in =javascript= layer)
|
||||||
- ycmd (moved to =c-c++=)
|
- ycmd (moved to =c-c++=)
|
||||||
*** Dotfile changes
|
*** Dotfile changes
|
||||||
|
- Added type bases validation for .spacemacs variables.
|
||||||
- New Variables:
|
- New Variables:
|
||||||
- New dotvariable =dotspacemacs-auto-generate-layout-names= (thanks to bmag)
|
- New dotvariable =dotspacemacs-auto-generate-layout-names= (thanks to bmag)
|
||||||
- New dotvariables =dotspacemacs-emacs-pdumper-executable-file=,
|
- New dotvariables =dotspacemacs-emacs-pdumper-executable-file=,
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
"core/libs/package-recipe-mode.el"
|
"core/libs/package-recipe-mode.el"
|
||||||
"core/libs/package-recipe.el"
|
"core/libs/package-recipe.el"
|
||||||
"core/libs/page-break-lines.el"
|
"core/libs/page-break-lines.el"
|
||||||
|
"core/libs/validate.el"
|
||||||
"core/libs/quelpa.el"
|
"core/libs/quelpa.el"
|
||||||
"core/libs/spinner.el")
|
"core/libs/spinner.el")
|
||||||
"List of Spacemacs files that should be compiled.
|
"List of Spacemacs files that should be compiled.
|
||||||
|
|
|
@ -1381,6 +1381,15 @@ Returns nil if the directory is not a category."
|
||||||
(when (string-match "^+" dirname)
|
(when (string-match "^+" dirname)
|
||||||
(intern (substring dirname 1))))))
|
(intern (substring dirname 1))))))
|
||||||
|
|
||||||
|
(defun configuration-layer//get-layer-parent-category (layer-name)
|
||||||
|
"Return a parent category symbol for given LAYER-NAME.
|
||||||
|
Returns nil if there is no layer named LAYER-NAME."
|
||||||
|
(when-let ((lp (configuration-layer/get-layer-path layer-name)))
|
||||||
|
(thread-last lp
|
||||||
|
directory-file-name
|
||||||
|
file-name-directory
|
||||||
|
configuration-layer//get-category-from-path)))
|
||||||
|
|
||||||
(defun configuration-layer/discover-layers (&optional refresh-index)
|
(defun configuration-layer/discover-layers (&optional refresh-index)
|
||||||
"Initialize `configuration-layer--indexed-layers' with layer directories.
|
"Initialize `configuration-layer--indexed-layers' with layer directories.
|
||||||
If REFRESH-INDEX is non-nil, the layer index is cleared before
|
If REFRESH-INDEX is non-nil, the layer index is cleared before
|
||||||
|
@ -1591,7 +1600,11 @@ RNAME is the name symbol of another existing layer."
|
||||||
(let ((var (pop variables)))
|
(let ((var (pop variables)))
|
||||||
(if (consp variables)
|
(if (consp variables)
|
||||||
(condition-case-unless-debug err
|
(condition-case-unless-debug err
|
||||||
(set-default var (eval (pop variables)))
|
(let ((val (eval (pop variables))))
|
||||||
|
(when (get var 'spacemacs-customization--variable)
|
||||||
|
(spacemacs-customization//validate
|
||||||
|
val (custom-variable-type var)))
|
||||||
|
(set-default var val))
|
||||||
('error
|
('error
|
||||||
(configuration-layer//error
|
(configuration-layer//error
|
||||||
(concat "\nAn error occurred while setting layer "
|
(concat "\nAn error occurred while setting layer "
|
||||||
|
@ -1636,7 +1649,11 @@ RNAME is the name symbol of another existing layer."
|
||||||
"Configure layers with LAYER-NAMES."
|
"Configure layers with LAYER-NAMES."
|
||||||
(let ((warning-minimum-level :error))
|
(let ((warning-minimum-level :error))
|
||||||
(dolist (layer-name layer-names)
|
(dolist (layer-name layer-names)
|
||||||
(configuration-layer//load-layer-files layer-name '("config.el")))))
|
(let ((spacemacs-customization--current-group
|
||||||
|
(spacemacs-customization//create-layer-group
|
||||||
|
layer-name
|
||||||
|
(configuration-layer//get-layer-parent-category layer-name))))
|
||||||
|
(configuration-layer//load-layer-files layer-name '("config.el"))))))
|
||||||
|
|
||||||
(defun configuration-layer//declare-used-packages (layers)
|
(defun configuration-layer//declare-used-packages (layers)
|
||||||
"Declare used packages contained in LAYERS."
|
"Declare used packages contained in LAYERS."
|
||||||
|
|
|
@ -0,0 +1,130 @@
|
||||||
|
;;; core-customization.el --- Spacemacs Core File -*- lexical-binding: t -*-
|
||||||
|
;;
|
||||||
|
;; Copyright (c) 2012-2021 Sylvain Benner & Contributors
|
||||||
|
;;
|
||||||
|
;; Author: Eugene "JAremko" Yaremenko <w3techplayground@gmail.com>
|
||||||
|
;; URL: https://github.com/syl20bnr/spacemacs
|
||||||
|
;;
|
||||||
|
;; This file is not part of GNU Emacs.
|
||||||
|
;;
|
||||||
|
;;; License: GPLv3
|
||||||
|
|
||||||
|
(require 'validate)
|
||||||
|
(require 'seq)
|
||||||
|
(eval-when-compile (require 'cl-lib))
|
||||||
|
|
||||||
|
(defalias 'spacemacs-customization//validate 'validate-value)
|
||||||
|
|
||||||
|
(defvar spacemacs-customization--current-group nil
|
||||||
|
"Used to auto-set `spacemacs|defc' group.")
|
||||||
|
|
||||||
|
(defgroup spacemacs-layers nil
|
||||||
|
"Spacemacs layers customizations."
|
||||||
|
:group 'spacemacs
|
||||||
|
:prefix 'spacemacs-layers-)
|
||||||
|
|
||||||
|
(defgroup spacemacs--uncustomizable nil
|
||||||
|
"Dummy group that contains variables that can't be customized.")
|
||||||
|
|
||||||
|
(defmacro spacemacs|defc (symbol standard doc type &optional group-override)
|
||||||
|
"Spacemacs flavored `defcustom' for .spacemacs configurations.
|
||||||
|
SYMBOL is the variable name; it should not be quoted.
|
||||||
|
STANDARD is an expression specifying the variable's standard value.
|
||||||
|
DOC is a doc-string.
|
||||||
|
TYPE should be a widget type for editing the symbol's value.
|
||||||
|
See Info node `(elisp) Customization Types' for a list of
|
||||||
|
base types and useful composite types.
|
||||||
|
GROUP-OVERRIDE should be provided if you don't want Spacemacs to infer the
|
||||||
|
configuration group from the currently configured layer name.
|
||||||
|
|
||||||
|
NOTE: You can use interactive function `spacemacs/customization-valid-p' to
|
||||||
|
test if a variable has a proper type.
|
||||||
|
NOTE: `core-dotspacemacs' contains plenty of customization examples.
|
||||||
|
NOTE: Spacemacs checks variables using validate.el package. Currently it
|
||||||
|
doesn't support: `:inline', `plist', `coding-system', `color', `hook',
|
||||||
|
`restricted-sexp' types so more general ones should be used instead."
|
||||||
|
(declare (indent defun) (doc-string 3) (debug (name body)))
|
||||||
|
`(progn
|
||||||
|
(put ',symbol 'spacemacs-customization--variable t)
|
||||||
|
(custom-declare-variable
|
||||||
|
',symbol
|
||||||
|
;; Took this from the `defcustom' implementation.
|
||||||
|
,(if lexical-binding
|
||||||
|
``(funcall #',(lambda () ,standard))
|
||||||
|
`',standard)
|
||||||
|
,(format "%s\n\nTYPE: %s\n" doc type)
|
||||||
|
:type ,type
|
||||||
|
:group
|
||||||
|
(or ,group-override
|
||||||
|
spacemacs-customization--current-group
|
||||||
|
'spacemacs--uncustomizable))))
|
||||||
|
|
||||||
|
(defun spacemacs/customization-valid-p (var-symbol)
|
||||||
|
"returns true if symbol refers spacemacs custom variable with valid value.
|
||||||
|
Emits message with the result when called interactively."
|
||||||
|
(interactive "v")
|
||||||
|
(let* ((defc? (get var-symbol 'spacemacs-customization--variable))
|
||||||
|
(val (symbol-value var-symbol))
|
||||||
|
(type (custom-variable-type var-symbol))
|
||||||
|
(valid? (and defc? (validate-value val type t))))
|
||||||
|
(when (called-interactively-p 'interactive)
|
||||||
|
(if valid?
|
||||||
|
(message "symbol: \"%s\" value: \"%s\" type: \"%s\" is valid."
|
||||||
|
var-symbol val type)
|
||||||
|
(if defc?
|
||||||
|
(condition-case err (validate-value val type) (error (message err)))
|
||||||
|
(message "%s is not Spacemacs customization variable" var-symbol))))
|
||||||
|
valid?))
|
||||||
|
|
||||||
|
(defun spacemacs-customization//group-variables (group-symbol)
|
||||||
|
"Given customization group symbol get its variables."
|
||||||
|
(let (ret-val)
|
||||||
|
(cl-labels ((rec (gs)
|
||||||
|
(cl-dolist (el (get gs 'custom-group))
|
||||||
|
(cl-case (cadr el)
|
||||||
|
(custom-variable (push (car el) ret-val))
|
||||||
|
(custom-group (rec (car el)))))))
|
||||||
|
(rec group-symbol))
|
||||||
|
ret-val))
|
||||||
|
|
||||||
|
(defun spacemacs-customization//validate-group-vars (group-symbol)
|
||||||
|
"Given customization group symbol validate its variables."
|
||||||
|
(dolist (var (spacemacs-customization//group-variables group-symbol))
|
||||||
|
(let ((val (symbol-value var))
|
||||||
|
(type (custom-variable-type var)))
|
||||||
|
(condition-case err (validate-value val type)
|
||||||
|
(error (error (concat "Variable: \"%s\" "
|
||||||
|
"has value: \"%s\" "
|
||||||
|
"that doesn't match its type: \"%s\". "
|
||||||
|
"Validator message: \"%s\"")
|
||||||
|
var val type err))))))
|
||||||
|
|
||||||
|
(defun spacemacs-customization//validate-dotspacemacs-init-vars ()
|
||||||
|
"Validate variables set in `dotspacemacs/init' function."
|
||||||
|
(spacemacs-customization//validate-group-vars 'spacemacs-dotspacemacs-init))
|
||||||
|
|
||||||
|
(defun spacemacs-customization//validate-dotspacemacs-layers-vars ()
|
||||||
|
"Validate variables set in `dotspacemacs/layers' function."
|
||||||
|
(spacemacs-customization//validate-group-vars 'spacemacs-dotspacemacs-layers))
|
||||||
|
|
||||||
|
(defun spacemacs-customization//create-layer-group (layer-name category-name)
|
||||||
|
"Create customization group heirarchy for the LAYER-NAME configurations.
|
||||||
|
Layers customization group symbol is returned."
|
||||||
|
(let* ((category-group-name (format "spacemacs-layers-%s" category-name))
|
||||||
|
(layer-group-name (format "%s-%s" category-group-name layer-name))
|
||||||
|
(category-group-symbol (intern category-group-name)))
|
||||||
|
(custom-declare-group category-group-symbol
|
||||||
|
nil
|
||||||
|
(format "Spacemacs %s category customizations."
|
||||||
|
category-name)
|
||||||
|
:group 'spacemacs-layers
|
||||||
|
:prefix (intern (concat category-group-name "-")))
|
||||||
|
(custom-declare-group
|
||||||
|
(intern layer-group-name)
|
||||||
|
nil
|
||||||
|
(format "Spacemacs %s layer customizations." layer-name)
|
||||||
|
:group category-group-symbol
|
||||||
|
:prefix (intern (concat category-group-name "-"
|
||||||
|
layer-group-name "-")))))
|
||||||
|
|
||||||
|
(provide 'core-customization)
|
|
@ -8,6 +8,20 @@
|
||||||
;; This file is not part of GNU Emacs.
|
;; This file is not part of GNU Emacs.
|
||||||
;;
|
;;
|
||||||
;;; License: GPLv3
|
;;; License: GPLv3
|
||||||
|
|
||||||
|
(require 'core-customization)
|
||||||
|
|
||||||
|
;; Those groups exists for bookkeeping.
|
||||||
|
(defgroup spacemacs-dotspacemacs-init nil
|
||||||
|
"Dotspacemacs init customizations."
|
||||||
|
:group 'spacemacs--uncustomizable
|
||||||
|
:prefix 'spacemacs--uncustomizable-spacemacs-dotspacemacs-init-)
|
||||||
|
|
||||||
|
(defgroup spacemacs-dotspacemacs-layers nil
|
||||||
|
"Dotspacemacs layers customizations."
|
||||||
|
:group 'spacemacs--uncustomizable
|
||||||
|
:prefix 'spacemacs--uncustomizable-spacemacs-dotspacemacs-layers-)
|
||||||
|
|
||||||
(defconst dotspacemacs-template-directory
|
(defconst dotspacemacs-template-directory
|
||||||
(expand-file-name (concat spacemacs-core-directory "templates/"))
|
(expand-file-name (concat spacemacs-core-directory "templates/"))
|
||||||
"Templates directory.")
|
"Templates directory.")
|
||||||
|
@ -53,73 +67,99 @@ exists, then this is used. If ~/.spacemacs does not exist, then
|
||||||
check for init.el in dotspacemacs-directory and use this if it
|
check for init.el in dotspacemacs-directory and use this if it
|
||||||
exists. Otherwise, fallback to ~/.spacemacs"))
|
exists. Otherwise, fallback to ~/.spacemacs"))
|
||||||
|
|
||||||
(defvar dotspacemacs-distribution 'spacemacs
|
(spacemacs|defc dotspacemacs-distribution 'spacemacs
|
||||||
"Base distribution to use. This is a layer contained in the directory
|
"Base distribution to use. This is a layer contained in the directory
|
||||||
`+distributions'. For now available distributions are `spacemacs-base'
|
`+distributions'. For now available distributions are `spacemacs-base'
|
||||||
or `spacemacs'.")
|
or `spacemacs'."
|
||||||
|
'(choice (const spacemacs-base) (const spacemacs))
|
||||||
|
'spacemacs-dotspacemacs-layers)
|
||||||
|
|
||||||
(defvar dotspacemacs-enable-emacs-pdumper nil
|
(spacemacs|defc dotspacemacs-enable-emacs-pdumper nil
|
||||||
"If non-nil then enable support for the portable dumper. You'll need
|
"If non-nil then enable support for the portable dumper. You'll need
|
||||||
to compile Emacs 27 from source following the instructions in file
|
to compile Emacs 27 from source following the instructions in file
|
||||||
EXPERIMENTAL.org at the root of the git repository.")
|
EXPERIMENTAL.org at the root of the git repository."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-emacs-pdumper-executable-file "emacs"
|
(spacemacs|defc dotspacemacs-emacs-pdumper-executable-file "emacs"
|
||||||
"File path pointing to emacs 27 or later executable.")
|
"File path pointing to emacs 27 or later executable."
|
||||||
|
'string
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-emacs-dumper-dump-file
|
(spacemacs|defc dotspacemacs-emacs-dumper-dump-file
|
||||||
(format "spacemacs-%s.pdmp" emacs-version)
|
(format "spacemacs-%s.pdmp" emacs-version)
|
||||||
"Name of the Spacemacs dump file. This is the file will be created by the
|
"Name of the Spacemacs dump file. This is the file will be created by the
|
||||||
portable dumper in the cache directory under dumps sub-directory.
|
portable dumper in the cache directory under dumps sub-directory.
|
||||||
To load it when starting Emacs add the parameter `--dump-file'
|
To load it when starting Emacs add the parameter `--dump-file'
|
||||||
when invoking Emacs 27.1 executable on the command line, for instance:
|
when invoking Emacs 27.1 executable on the command line, for instance:
|
||||||
./emacs --dump-file=$HOME/.emacs.d/.cache/dumps/spacemacs-27.1.pdmp")
|
./emacs --dump-file=$HOME/.emacs.d/.cache/dumps/spacemacs-27.1.pdmp"
|
||||||
|
'string
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-gc-cons '(100000000 0.1)
|
(spacemacs|defc dotspacemacs-gc-cons '(100000000 0.1)
|
||||||
"Set `gc-cons-threshold' and `gc-cons-percentage' when startup finishes.
|
"Set `gc-cons-threshold' and `gc-cons-percentage' when startup finishes.
|
||||||
This is an advanced option and should not be changed unless you suspect
|
This is an advanced option and should not be changed unless you suspect
|
||||||
performance issues due to garbage collection operations.")
|
performance issues due to garbage collection operations."
|
||||||
|
'(list integer float)
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-read-process-output-max (* 1024 1024)
|
(spacemacs|defc dotspacemacs-read-process-output-max (* 1024 1024)
|
||||||
"Set `read-process-output-max' when startup finishes.
|
"Set `read-process-output-max' when startup finishes.
|
||||||
This defines how much data is read from a foreign process.
|
This defines how much data is read from a foreign process.
|
||||||
Setting this >= 1 MB should increase performance for lsp servers
|
Setting this >= 1 MB should increase performance for lsp servers
|
||||||
in emacs 27.")
|
in emacs 27."
|
||||||
|
'integer
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-elpa-https t
|
(spacemacs|defc dotspacemacs-elpa-https t
|
||||||
"If non nil ELPA repositories are contacted via HTTPS whenever it's
|
"If non nil ELPA repositories are contacted via HTTPS whenever it's
|
||||||
possible. Set it to nil if you have no way to use HTTPS in your
|
possible. Set it to nil if you have no way to use HTTPS in your
|
||||||
environment, otherwise it is strongly recommended to let it set to t.")
|
environment, otherwise it is strongly recommended to let it set to t."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-elpa-timeout 5
|
(spacemacs|defc dotspacemacs-elpa-timeout 5
|
||||||
"Maximum allowed time in seconds to contact an ELPA repository.")
|
"Maximum allowed time in seconds to contact an ELPA repository."
|
||||||
|
'integer
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-use-spacelpa nil
|
(spacemacs|defc dotspacemacs-use-spacelpa nil
|
||||||
"If non-nil then Spacelpa repository is the primary source to install
|
"If non-nil then Spacelpa repository is the primary source to install
|
||||||
a locked version of packages. If nil then Spacemacs will install the latest
|
a locked version of packages. If nil then Spacemacs will install the latest
|
||||||
version of packages from MELPA. Spacelpa is currently in experimental
|
version of packages from MELPA. Spacelpa is currently in experimental
|
||||||
state and should only be used for testing.")
|
state and should only be used for testing."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-verify-spacelpa-archives nil
|
(spacemacs|defc dotspacemacs-verify-spacelpa-archives nil
|
||||||
"If non-nil then verify the signature for downloaded Spacelpa archives.")
|
"If non-nil then verify the signature for downloaded Spacelpa archives."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-elpa-subdirectory 'emacs-version
|
(spacemacs|defc dotspacemacs-elpa-subdirectory 'emacs-version
|
||||||
"If non-nil, a form that evaluates to a package directory. For
|
"If non-nil, a form that evaluates to a package directory. For
|
||||||
example, to use different package directories for different Emacs
|
example, to use different package directories for different Emacs
|
||||||
versions, set this to `emacs-version'.")
|
versions, set this to `emacs-version'."
|
||||||
|
'sexp
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-configuration-layer-path '()
|
(spacemacs|defc dotspacemacs-configuration-layer-path '()
|
||||||
"List of additional paths where to look for configuration layers.
|
"List of additional paths where to look for configuration layers.
|
||||||
Paths must have a trailing slash (ie. `~/.mycontribs/')")
|
Paths must have a trailing slash (ie. `~/.mycontribs/')"
|
||||||
|
'(repeat string)
|
||||||
|
'spacemacs-dotspacemacs-layers)
|
||||||
|
|
||||||
(defvar dotspacemacs-install-packages 'used-only
|
(spacemacs|defc dotspacemacs-install-packages 'used-only
|
||||||
"Defines the behaviour of Spacemacs when installing packages.
|
"Defines the behaviour of Spacemacs when installing packages.
|
||||||
Possible values are `used-only', `used-but-keep-unused' and `all'. `used-only'
|
Possible values are `used-only', `used-but-keep-unused' and `all'. `used-only'
|
||||||
installs only explicitly used packages and deletes any unused packages as well
|
installs only explicitly used packages and deletes any unused packages as well
|
||||||
as their unused dependencies. `used-but-keep-unused' installs only the used
|
as their unused dependencies. `used-but-keep-unused' installs only the used
|
||||||
packages but won't delete unused ones. `all' installs *all*
|
packages but won't delete unused ones. `all' installs *all*
|
||||||
packages supported by Spacemacs and never uninstalls them.")
|
packages supported by Spacemacs and never uninstalls them."
|
||||||
|
'(choice (const used-only) (const used-but-keep-unused) (const all))
|
||||||
|
'spacemacs-dotspacemacs-layers)
|
||||||
|
|
||||||
(defvar dotspacemacs-enable-lazy-installation 'unused
|
(spacemacs|defc dotspacemacs-enable-lazy-installation 'unused
|
||||||
"Lazy installation of layers (i.e. layers are installed only when a file
|
"Lazy installation of layers (i.e. layers are installed only when a file
|
||||||
with a supported type is opened). Possible values are `all', `unused' and `nil'.
|
with a supported type is opened). Possible values are `all', `unused' and `nil'.
|
||||||
`unused' will lazy install only unused layers (i.e. layers not listed in
|
`unused' will lazy install only unused layers (i.e. layers not listed in
|
||||||
|
@ -127,226 +167,333 @@ variable `dotspacemacs-configuration-layers'), `all' will lazy install any layer
|
||||||
that support lazy installation even the layers listed in
|
that support lazy installation even the layers listed in
|
||||||
`dotspacemacs-configuration-layers'. `nil' disable the lazy installation feature
|
`dotspacemacs-configuration-layers'. `nil' disable the lazy installation feature
|
||||||
and you have to explicitly list a layer in the variable
|
and you have to explicitly list a layer in the variable
|
||||||
`dotspacemacs-configuration-layers' to install it.")
|
`dotspacemacs-configuration-layers' to install it."
|
||||||
|
'(choice (const all) (const unused) (const nil))
|
||||||
|
'spacemacs-dotspacemacs-layers)
|
||||||
|
|
||||||
(defvar dotspacemacs-ask-for-lazy-installation t
|
(spacemacs|defc dotspacemacs-ask-for-lazy-installation t
|
||||||
"If non-nil then Spacemacs will ask for confirmation before installing
|
"If non-nil then Spacemacs will ask for confirmation before installing
|
||||||
a layer lazily.")
|
a layer lazily."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-layers)
|
||||||
|
|
||||||
(defvar dotspacemacs-additional-packages '()
|
(spacemacs|defc dotspacemacs-additional-packages '()
|
||||||
"List of additional packages that will be installed wihout being
|
"List of additional packages that will be installed wihout being
|
||||||
wrapped in a layer. If you need some configuration for these
|
wrapped in a layer. If you need some configuration for these
|
||||||
packages then consider to create a layer, you can also put the
|
packages then consider to create a layer, you can also put the
|
||||||
configuration in `dotspacemacs/user-config'.")
|
configuration in `dotspacemacs/user-config'."
|
||||||
|
'(repeat symbol)
|
||||||
|
'spacemacs-dotspacemacs-layers)
|
||||||
|
|
||||||
(defvar dotspacemacs--additional-theme-packages '()
|
(defvar dotspacemacs--additional-theme-packages '()
|
||||||
"Same as `dotspacemacs-additional-packages' but reserved for themes declared
|
"Same as `dotspacemacs-additional-packages' but reserved for themes declared
|
||||||
in `dotspacemacs-themes'.")
|
in `dotspacemacs-themes'.")
|
||||||
|
|
||||||
(defvar dotspacemacs-editing-style 'vim
|
(spacemacs|defc dotspacemacs-editing-style 'vim
|
||||||
"One of `vim', `emacs' or `hybrid'.
|
"One of `vim', `emacs' or `hybrid'.
|
||||||
`hybrid' is like `vim' except that `insert state' is replaced by the
|
`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
|
`hybrid state' with `emacs' key bindings. The value can also be a list
|
||||||
with `:variables' keyword (similar to layers). Check the editing styles
|
with `:variables' keyword (similar to layers). Check the editing styles
|
||||||
section of the documentation for details on available variables.")
|
section of the documentation for details on available variables."
|
||||||
|
'(choice (const vim) (const emacs) (const hybrid))
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-startup-banner 'official
|
(spacemacs|defc dotspacemacs-startup-banner 'official
|
||||||
"Specify the startup banner. Default value is `official', it displays
|
"Specify the startup banner. Default value is `official', it displays
|
||||||
the official spacemacs logo. An integer value is the index of text
|
the official spacemacs logo. An integer value is the index of text
|
||||||
banner, `random' chooses a random text banner in `core/banners'
|
banner, `random' chooses a random text banner in `core/banners'
|
||||||
directory. A string value must be a path to a .PNG file.
|
directory. A string value must be a path to a .PNG file.
|
||||||
If the value is nil then no banner is displayed.")
|
If the value is nil then no banner is displayed."
|
||||||
|
'(choice (const official) (const random) (const nil) string integer)
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-startup-buffer-show-version t
|
(spacemacs|defc dotspacemacs-startup-buffer-show-version t
|
||||||
"If bound, show Spacemacs and Emacs version at the top right of the
|
"If true, show Spacemacs and Emacs version at the top right of the
|
||||||
Spacemacs buffer.")
|
Spacemacs buffer."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-scratch-mode 'text-mode
|
(spacemacs|defc dotspacemacs-scratch-mode 'text-mode
|
||||||
"Default major mode of the scratch buffer.")
|
"Default major mode of the scratch buffer."
|
||||||
|
'symbol
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-initial-scratch-message 'nil
|
(spacemacs|defc dotspacemacs-initial-scratch-message 'nil
|
||||||
"Initial message in the scratch buffer.")
|
"Initial message in the scratch buffer."
|
||||||
|
'(choice (const nil) string)
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-check-for-update nil
|
(spacemacs|defc dotspacemacs-check-for-update nil
|
||||||
"If non nil then spacemacs will check for updates at startup
|
"If non nil then spacemacs will check for updates at startup
|
||||||
when the current branch is not `develop'. Note that checking for
|
when the current branch is not `develop'. Note that checking for
|
||||||
new versions works via git commands, thus it calls GitHub services
|
new versions works via git commands, thus it calls GitHub services
|
||||||
whenever you start Emacs.")
|
whenever you start Emacs."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-configuration-layers '(emacs-lisp)
|
(spacemacs|defc dotspacemacs-configuration-layers '(emacs-lisp)
|
||||||
"List of configuration layers to load.")
|
"List of configuration layers to load."
|
||||||
|
'(repeat (choice symbol (cons symbol sexp)))
|
||||||
|
'spacemacs-dotspacemacs-layers)
|
||||||
|
|
||||||
(defvar dotspacemacs--configuration-layers-saved nil
|
(defvar dotspacemacs--configuration-layers-saved nil
|
||||||
"Saved value of `dotspacemacs-configuration-layers' after sync.")
|
"Saved value of `dotspacemacs-configuration-layers' after sync.")
|
||||||
|
|
||||||
(defvar dotspacemacs-themes '(spacemacs-dark
|
(spacemacs|defc dotspacemacs-themes '(spacemacs-dark
|
||||||
spacemacs-light)
|
spacemacs-light)
|
||||||
"List of themes, the first of the list is loaded when spacemacs starts.
|
"List of themes, the first of the list is loaded when spacemacs starts.
|
||||||
Press `SPC T n' to cycle to the next theme in the list (works great
|
Press `SPC T n' to cycle to the next theme in the list (works great
|
||||||
with 2 themes variants, one dark and one light")
|
with 2 themes variants, one dark and one light"
|
||||||
|
'(repeat symbol)
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-mode-line-theme '(spacemacs
|
(spacemacs|defc dotspacemacs-mode-line-theme '(spacemacs
|
||||||
:separator wave
|
:separator wave
|
||||||
:separator-scale 1.5)
|
:separator-scale 1.5)
|
||||||
"Set the theme for the Spaceline. Supported themes are `spacemacs',
|
"Set the theme for the Spaceline. Supported themes are `spacemacs',
|
||||||
`all-the-icons', `custom', `doom',`vim-powerline' and `vanilla'. The first three
|
`all-the-icons', `custom', `doom',`vim-powerline' and `vanilla'. The first three
|
||||||
are spaceline themes. `doom' is the doom-emacs mode-line. `vanilla' is default
|
are spaceline themes. `doom' is the doom-emacs mode-line. `vanilla' is default
|
||||||
Emacs mode-line. `custom' is a user defined themes, refer to the
|
Emacs mode-line. `custom' is a user defined themes, refer to the
|
||||||
DOCUMENTATION.org for more info on how to create your own spaceline theme. Value
|
DOCUMENTATION.org for more info on how to create your own spaceline theme. Value
|
||||||
can be a symbol or a list with additional properties like '(all-the-icons
|
can be a symbol or a list with additional properties like '(all-the-icons
|
||||||
:separator-scale 1.5).")
|
:separator-scale 1.5)."
|
||||||
|
'(choice (const spacemacs)
|
||||||
|
(const all-the-icons)
|
||||||
|
(const custom)
|
||||||
|
(const doom)
|
||||||
|
(const vim-powerline)
|
||||||
|
(const vanilla)
|
||||||
|
|
||||||
(defvar dotspacemacs-frame-title-format "%I@%S"
|
(cons (choice (const spacemacs)
|
||||||
|
(const all-the-icons)
|
||||||
|
(const custom)
|
||||||
|
(const doom)
|
||||||
|
(const vim-powerline)
|
||||||
|
(const vanilla))
|
||||||
|
sexp))
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
|
(spacemacs|defc dotspacemacs-frame-title-format "%I@%S"
|
||||||
"Default format string for a frame title bar, using the
|
"Default format string for a frame title bar, using the
|
||||||
original format spec, and additional customizations.")
|
original format spec, and additional customizations."
|
||||||
|
'string
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-icon-title-format nil
|
(spacemacs|defc dotspacemacs-icon-title-format nil
|
||||||
"Default format string for a icon title bar, using the
|
"Default format string for a icon title bar, using the
|
||||||
original format spec, and additional customizations.")
|
original format spec, and additional customizations."
|
||||||
|
'(choice (const nil) string)
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-colorize-cursor-according-to-state t
|
(spacemacs|defc dotspacemacs-colorize-cursor-according-to-state t
|
||||||
"If non nil the cursor color matches the state color in GUI Emacs.")
|
"If non nil the cursor color matches the state color in GUI Emacs."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-leader-key "SPC"
|
(spacemacs|defc dotspacemacs-leader-key "SPC"
|
||||||
"The leader key.")
|
"The leader key."
|
||||||
|
'string
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-emacs-leader-key "M-m"
|
(spacemacs|defc dotspacemacs-emacs-leader-key "M-m"
|
||||||
"The leader key accessible in `emacs state' and `insert state'")
|
"The leader key accessible in `emacs state' and `insert state'"
|
||||||
|
'string
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-major-mode-leader-key ","
|
(spacemacs|defc dotspacemacs-major-mode-leader-key ","
|
||||||
"Major mode leader key is a shortcut key which is the equivalent of
|
"Major mode leader key is a shortcut key which is the equivalent of
|
||||||
pressing `<leader> m`. Set it to `nil` to disable it.")
|
pressing `<leader> m`. Set it to `nil` to disable it."
|
||||||
|
'string
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-major-mode-emacs-leader-key (if window-system "<M-return>" "C-M-m")
|
(spacemacs|defc dotspacemacs-major-mode-emacs-leader-key
|
||||||
"Major mode leader key accessible in `emacs state' and `insert state'")
|
(if window-system "<M-return>" "C-M-m")
|
||||||
|
"Major mode leader key accessible in `emacs state' and `insert state'"
|
||||||
|
'string
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-ex-command-key ":"
|
(spacemacs|defc dotspacemacs-ex-command-key ":"
|
||||||
"The key used for Vim Ex commands.")
|
"The key used for Vim Ex commands."
|
||||||
|
'string
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-command-key "SPC"
|
(spacemacs|defc dotspacemacs-command-key "SPC"
|
||||||
"The key used for Emacs commands (M-x) (after pressing on the leader key).")
|
"The key used for Emacs commands (M-x) (after pressing on the leader key)."
|
||||||
|
'string
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
(defvaralias 'dotspacemacs-emacs-command-key 'dotspacemacs-command-key
|
(defvaralias 'dotspacemacs-emacs-command-key 'dotspacemacs-command-key
|
||||||
"New official name for `dotspacemacs-command-key'")
|
"New official name for `dotspacemacs-command-key'")
|
||||||
|
|
||||||
(defvar dotspacemacs-distinguish-gui-tab nil
|
(spacemacs|defc dotspacemacs-distinguish-gui-tab nil
|
||||||
"If non nil, distinguish C-i and tab in the GUI version of Emacs.")
|
"If non nil, distinguish C-i and tab in the GUI version of Emacs."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
;; (defvar dotspacemacs-distinguish-gui-ret nil
|
;; (defvar dotspacemacs-distinguish-gui-ret nil
|
||||||
;; "If non nil, distinguish C-m and return in the GUI version of
|
;; "If non nil, distinguish C-m and return in the GUI version of
|
||||||
;; emacs.")
|
;; emacs.")
|
||||||
|
|
||||||
(defvar dotspacemacs-default-font '("Source Code Pro"
|
(spacemacs|defc dotspacemacs-default-font '("Source Code Pro"
|
||||||
:size 10.0
|
:size 10.0
|
||||||
:weight normal
|
:weight normal
|
||||||
:width normal)
|
:width normal)
|
||||||
"Default font, or prioritized list of fonts. This setting has no effect when
|
"Default font, or prioritized list of fonts. This setting has no effect when
|
||||||
running Emacs in terminal.")
|
running Emacs in terminal."
|
||||||
|
'(choice (cons string sexp)
|
||||||
|
(repeat (cons string sexp)))
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-folding-method 'evil
|
(spacemacs|defc dotspacemacs-folding-method 'evil
|
||||||
"Code folding method. Possible values are `evil', `origami' and `vimish'.")
|
"Code folding method. Possible values are `evil', `origami' and `vimish'."
|
||||||
|
'(choice (cosnt evil) (const origami) (const vimish))
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-default-layout-name "Default"
|
(spacemacs|defc dotspacemacs-default-layout-name "Default"
|
||||||
"Name of the default layout.")
|
"Name of the default layout."
|
||||||
|
'string
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-display-default-layout nil
|
(spacemacs|defc dotspacemacs-display-default-layout nil
|
||||||
"If non nil the default layout name is displayed in the mode-line.")
|
"If non nil the default layout name is displayed in the mode-line."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-auto-resume-layouts nil
|
(spacemacs|defc dotspacemacs-auto-resume-layouts nil
|
||||||
"If non nil then the last auto saved layouts are resume automatically upon
|
"If non nil then the last auto saved layouts are resume automatically upon
|
||||||
start.")
|
start."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-auto-generate-layout-names nil
|
(spacemacs|defc dotspacemacs-auto-generate-layout-names nil
|
||||||
"If non-nil, auto-generate layout name when creating new layouts.
|
"If non-nil, auto-generate layout name when creating new layouts.
|
||||||
Only has effect when using the \"jump to layout by number\" commands.")
|
Only has effect when using the \"jump to layout by number\" commands."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-max-rollback-slots 5
|
(spacemacs|defc dotspacemacs-max-rollback-slots 5
|
||||||
"Maximum number of rollback slots to keep in the cache.")
|
"Maximum number of rollback slots to keep in the cache."
|
||||||
|
'integer
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-large-file-size 1
|
(spacemacs|defc dotspacemacs-large-file-size 1
|
||||||
"Size (in MB) above which spacemacs will prompt to open the large file
|
"Size (in MB) above which spacemacs will prompt to open the large file
|
||||||
literally to avoid performance issues. Opening a file literally means that
|
literally to avoid performance issues. Opening a file literally means that
|
||||||
no major mode or minor modes are active.")
|
no major mode or minor modes are active."
|
||||||
|
'integer
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-auto-save-file-location 'cache
|
(spacemacs|defc dotspacemacs-auto-save-file-location 'cache
|
||||||
"Location where to auto-save files. Possible values are `original' to
|
"Location where to auto-save files. Possible values are `original' to
|
||||||
auto-save the file in-place, `cache' to auto-save the file to another
|
auto-save the file in-place, `cache' to auto-save the file to another
|
||||||
file stored in the cache directory and `nil' to disable auto-saving.")
|
file stored in the cache directory and `nil' to disable auto-saving."
|
||||||
|
'(choice (const cache) (const original) (const nil))
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-enable-paste-transient-state nil
|
(spacemacs|defc dotspacemacs-enable-paste-transient-state nil
|
||||||
"If non-nil, the paste transient-state is enabled. While enabled, after you
|
"If non-nil, the paste transient-state is enabled. While enabled, after you
|
||||||
paste something, pressing `C-j' and `C-k' several times cycles through the
|
paste something, pressing `C-j' and `C-k' several times cycles through the
|
||||||
elements in the `kill-ring'.")
|
elements in the `kill-ring'."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
(defvaralias
|
(defvaralias
|
||||||
'dotspacemacs-enable-paste-micro-state
|
'dotspacemacs-enable-paste-micro-state
|
||||||
'dotspacemacs-enable-paste-transient-state
|
'dotspacemacs-enable-paste-transient-state
|
||||||
"Old name of `dotspacemacs-enable-paste-transient-state'.")
|
"Old name of `dotspacemacs-enable-paste-transient-state'.")
|
||||||
|
|
||||||
(defvar dotspacemacs-which-key-delay 0.4
|
(spacemacs|defc dotspacemacs-which-key-delay 0.4
|
||||||
"Delay in seconds starting from the last keystroke after which
|
"Delay in seconds starting from the last keystroke after which
|
||||||
the which-key buffer will be shown if you have not completed a
|
the which-key buffer will be shown if you have not completed a
|
||||||
key sequence. Setting this variable is equivalent to setting
|
key sequence. Setting this variable is equivalent to setting
|
||||||
`which-key-idle-delay'.")
|
`which-key-idle-delay'."
|
||||||
|
'float
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-which-key-position 'bottom
|
(spacemacs|defc dotspacemacs-which-key-position 'bottom
|
||||||
"Location of the which-key popup buffer. Possible choices are bottom,
|
"Location of the which-key popup buffer. Possible choices are bottom,
|
||||||
right, and right-then-bottom. The last one will display on the
|
right, and right-then-bottom. The last one will display on the
|
||||||
right if possible and fallback to bottom if not.")
|
right if possible and fallback to bottom if not."
|
||||||
|
'(choice (const right) (const bottom) (const right-then-bottom))
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-switch-to-buffer-prefers-purpose nil
|
(spacemacs|defc dotspacemacs-switch-to-buffer-prefers-purpose nil
|
||||||
"Control where `switch-to-buffer' displays the buffer.
|
"Control where `switch-to-buffer' displays the buffer.
|
||||||
If nil, `switch-to-buffer' displays the buffer in the current
|
If nil, `switch-to-buffer' displays the buffer in the current
|
||||||
window even if another same-purpose window is available. If non
|
window even if another same-purpose window is available. If non
|
||||||
nil, `switch-to-buffer' displays the buffer in a same-purpose
|
nil, `switch-to-buffer' displays the buffer in a same-purpose
|
||||||
window even if the buffer can be displayed in the current
|
window even if the buffer can be displayed in the current
|
||||||
window.")
|
window."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-loading-progress-bar t
|
(spacemacs|defc dotspacemacs-loading-progress-bar t
|
||||||
"If non nil a progress bar is displayed when spacemacs is loading. This
|
"If non nil a progress bar is displayed when spacemacs is loading. This
|
||||||
may increase the boot time on some systems and emacs builds, set it to nil
|
may increase the boot time on some systems and emacs builds, set it to nil
|
||||||
to boost the loading time.")
|
to boost the loading time."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-fullscreen-at-startup nil
|
(spacemacs|defc dotspacemacs-fullscreen-at-startup nil
|
||||||
"If non nil the frame is fullscreen when Emacs starts up (Emacs 24.4+ only).")
|
"If non nil the frame is fullscreen when Emacs starts up (Emacs 24.4+ only)."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-fullscreen-use-non-native nil
|
(spacemacs|defc dotspacemacs-fullscreen-use-non-native nil
|
||||||
"If non nil `spacemacs/toggle-fullscreen' will not use native fullscreen. Use
|
"If non nil `spacemacs/toggle-fullscreen' will not use native fullscreen. Use
|
||||||
to disable fullscreen animations on macOS.")
|
to disable fullscreen animations on macOS."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-maximized-at-startup nil
|
(spacemacs|defc dotspacemacs-maximized-at-startup nil
|
||||||
"If non nil the frame is maximized when Emacs starts up (Emacs 24.4+ only).
|
"If non nil the frame is maximized when Emacs starts up (Emacs 24.4+ only).
|
||||||
Takes effect only if `dotspacemacs-fullscreen-at-startup' is nil.")
|
Takes effect only if `dotspacemacs-fullscreen-at-startup' is nil."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-undecorated-at-startup nil
|
(spacemacs|defc dotspacemacs-undecorated-at-startup nil
|
||||||
"If non nil the frame is undecorated when Emacs starts up.")
|
"If non nil the frame is undecorated when Emacs starts up."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-active-transparency 90
|
(spacemacs|defc dotspacemacs-active-transparency 90
|
||||||
"A value from the range (0..100), in increasing opacity, which describes the
|
"A value from the range (0..100), in increasing opacity, which describes the
|
||||||
transparency level of a frame when it's active or selected. Transparency
|
transparency level of a frame when it's active or selected. Transparency
|
||||||
can be toggled through `toggle-transparency'.")
|
can be toggled through `toggle-transparency'."
|
||||||
|
'integer
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-inactive-transparency 90
|
(spacemacs|defc dotspacemacs-inactive-transparency 90
|
||||||
"A value from the range (0..100), in increasing opacity, which describes the
|
"A value from the range (0..100), in increasing opacity, which describes the
|
||||||
transparency level of a frame when it's inactive or deselected. Transparency
|
transparency level of a frame when it's inactive or deselected. Transparency
|
||||||
can be toggled through `toggle-transparency'.")
|
can be toggled through `toggle-transparency'."
|
||||||
|
'integer
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-show-transient-state-title t
|
(spacemacs|defc dotspacemacs-show-transient-state-title t
|
||||||
"If non nil show the titles of transient states.")
|
"If non nil show the titles of transient states."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-show-transient-state-color-guide t
|
(spacemacs|defc dotspacemacs-show-transient-state-color-guide t
|
||||||
"If non nil show the color guide hint for transient state keys.")
|
"If non nil show the color guide hint for transient state keys."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-mode-line-unicode-symbols t
|
(spacemacs|defc dotspacemacs-mode-line-unicode-symbols t
|
||||||
"If non nil unicode symbols are displayed in the mode-line (eg. for lighters).
|
"If non nil unicode symbols are displayed in the mode-line (eg. for lighters).
|
||||||
If you use Emacs as a daemon and wants unicode characters only in GUI set
|
If you use Emacs as a daemon and wants unicode characters only in GUI set
|
||||||
the value to quoted `display-graphic-p'. (default t)")
|
the value to quoted `display-graphic-p'. (default t)"
|
||||||
|
'(choice boolean (connst display-graphic-p))
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-smooth-scrolling t
|
(spacemacs|defc dotspacemacs-smooth-scrolling t
|
||||||
"If non nil smooth scrolling (native-scrolling) is enabled.
|
"If non nil smooth scrolling (native-scrolling) is enabled.
|
||||||
Smooth scrolling overrides the default behavior of Emacs which
|
Smooth scrolling overrides the default behavior of Emacs which
|
||||||
recenters point when it reaches the top or bottom of the
|
recenters point when it reaches the top or bottom of the
|
||||||
screen.")
|
screen."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-line-numbers nil
|
(spacemacs|defc dotspacemacs-line-numbers nil
|
||||||
"Control line numbers activation.
|
"Control line numbers activation.
|
||||||
If set to `t' or `relative' line numbers are turned on in all `prog-mode' and
|
If set to `t' or `relative' line numbers are turned on in all `prog-mode' and
|
||||||
`text-mode' derivatives. If set to `relative', line numbers are relative.
|
`text-mode' derivatives. If set to `relative', line numbers are relative.
|
||||||
|
@ -360,59 +507,87 @@ This variable can also be set to a property list for finer control:
|
||||||
text-mode
|
text-mode
|
||||||
:size-limit-kb 1000)
|
:size-limit-kb 1000)
|
||||||
The property `:enabled-for-modes' takes priority over `:disabled-for-modes' and
|
The property `:enabled-for-modes' takes priority over `:disabled-for-modes' and
|
||||||
restricts line-number to the specified list of major-mode.")
|
restricts line-number to the specified list of major-mode."
|
||||||
|
'(choice boolean
|
||||||
|
(const relative)
|
||||||
|
(const visual)
|
||||||
|
(const prog-mode)
|
||||||
|
(repeat sexp))
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-enable-server nil
|
(spacemacs|defc dotspacemacs-enable-server nil
|
||||||
"If non-nil, start an Emacs server if one is not already running.")
|
"If non-nil, start an Emacs server if one is not already running."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-persistent-server nil
|
(spacemacs|defc dotspacemacs-persistent-server nil
|
||||||
"If non nil advises quit functions to keep server open when quitting.")
|
"If non nil advises quit functions to keep server open when quitting."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-server-socket-dir nil
|
(spacemacs|defc dotspacemacs-server-socket-dir nil
|
||||||
"Set the emacs server socket location.
|
"Set the emacs server socket location.
|
||||||
If nil, uses whatever the Emacs default is,
|
If nil, uses whatever the Emacs default is,
|
||||||
otherwise a directory path like \"~/.emacs.d/server\".
|
otherwise a directory path like \"~/.emacs.d/server\".
|
||||||
Has no effect if `dotspacemacs-enable-server' is nil.")
|
Has no effect if `dotspacemacs-enable-server' is nil."
|
||||||
|
'(choice (const nil) string)
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-smartparens-strict-mode nil
|
(spacemacs|defc dotspacemacs-smartparens-strict-mode nil
|
||||||
"If non-nil and `dotspacemacs-activate-smartparens-mode' is also non-nil,
|
"If non-nil and `dotspacemacs-activate-smartparens-mode' is also non-nil,
|
||||||
smartparens-strict-mode will be enabled in programming modes.")
|
smartparens-strict-mode will be enabled in programming modes."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-activate-smartparens-mode t
|
(spacemacs|defc dotspacemacs-activate-smartparens-mode t
|
||||||
"If non-nil smartparens-mode will be enabled in programming modes.")
|
"If non-nil smartparens-mode will be enabled in programming modes."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-smart-closing-parenthesis nil
|
(spacemacs|defc dotspacemacs-smart-closing-parenthesis nil
|
||||||
"If non-nil pressing the closing parenthesis `)' key in insert mode passes
|
"If non-nil pressing the closing parenthesis `)' key in insert mode passes
|
||||||
over any automatically added closing parenthesis, bracket, quote, etc...
|
over any automatically added closing parenthesis, bracket, quote, etc...
|
||||||
This can be temporary disabled by pressing `C-q' before `)'. (default nil)")
|
This can be temporary disabled by pressing `C-q' before `)'. (default nil)"
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-zone-out-when-idle nil
|
(spacemacs|defc dotspacemacs-zone-out-when-idle nil
|
||||||
"Either nil or a number of seconds.
|
"Either nil or a number of seconds.
|
||||||
If non-nil zone out after the specified number of seconds.")
|
If non-nil zone out after the specified number of seconds."
|
||||||
|
'(choice (const nil) integer)
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-highlight-delimiters 'all
|
(spacemacs|defc dotspacemacs-highlight-delimiters 'all
|
||||||
"Select a scope to highlight delimiters.
|
"Select a scope to highlight delimiters.
|
||||||
Possible values are `any', `current', `all' or `nil'.
|
Possible values are `any', `current', `all' or `nil'.
|
||||||
Default is `all' (highlight any scope and emphasize the current one.")
|
Default is `all' (highlight any scope and emphasize the current one."
|
||||||
|
'(choice (const all) (const any) (const current) (const nil))
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-show-trailing-whitespace t
|
(spacemacs|defc dotspacemacs-show-trailing-whitespace t
|
||||||
"Show trailing whitespace. Default is `t'.")
|
"Show trailing whitespace. Default is `t'."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-whitespace-cleanup nil
|
(spacemacs|defc dotspacemacs-whitespace-cleanup nil
|
||||||
"Delete whitespace while saving buffer.
|
"Delete whitespace while saving buffer.
|
||||||
|
|
||||||
Possible values are:
|
Possible values are:
|
||||||
`all' to aggressively delete empty lines and long sequences of whitespace,
|
`all' to aggressively delete empty lines and long sequences of whitespace,
|
||||||
`trailing' to delete only the whitespace at end of lines,
|
`trailing' to delete only the whitespace at end of lines,
|
||||||
`changed' to delete only whitespace for changed lines or
|
`changed' to delete only whitespace for changed lines or
|
||||||
`nil' to disable cleanup.")
|
`nil' to disable cleanup."
|
||||||
|
'(choice (const nil) (const all) (const trailing) (const changed))
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-search-tools '("rg" "ag" "pt" "ack" "grep")
|
(spacemacs|defc dotspacemacs-search-tools '("rg" "ag" "pt" "ack" "grep")
|
||||||
"List of search tool executable names. Spacemacs uses the first installed
|
"List of search tool executable names. Spacemacs uses the first installed
|
||||||
tool of the list. Supported tools are `rg', `ag', `pt', `ack' and `grep'.")
|
tool of the list. Supported tools are `rg', `ag', `pt', `ack' and `grep'."
|
||||||
|
'(set (const "rg") (const "ag") (const "pt") (const "ack") (const "grep"))
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-startup-lists '((recents . 5)
|
(spacemacs|defc dotspacemacs-startup-lists '((recents . 5)
|
||||||
(projects . 7))
|
(projects . 7))
|
||||||
"Association list of items to show in the startup buffer of the form
|
"Association list of items to show in the startup buffer of the form
|
||||||
`(list-type . list-size)`. If nil it is disabled.
|
`(list-type . list-size)`. If nil it is disabled.
|
||||||
|
|
||||||
|
@ -422,60 +597,94 @@ List sizes may be nil, in which case
|
||||||
`spacemacs--buffer-startup-lists-length' takes effect.
|
`spacemacs--buffer-startup-lists-length' takes effect.
|
||||||
In the `recents-by-project' case, the list size should be a `cons' cell whose
|
In the `recents-by-project' case, the list size should be a `cons' cell whose
|
||||||
`car' is the maximum number of projects to show, and whose `cdr' is the maximum
|
`car' is the maximum number of projects to show, and whose `cdr' is the maximum
|
||||||
number of recent files to show in each project.")
|
number of recent files to show in each project."
|
||||||
|
'(choice (alist :key-type (choice (const recents)
|
||||||
|
(const recents-by-project)
|
||||||
|
(const bookmarks)
|
||||||
|
(const projects)
|
||||||
|
(const agenda)
|
||||||
|
(const todos))
|
||||||
|
:value-type (choice integer
|
||||||
|
(const nil)
|
||||||
|
;; for `recents-by-project':
|
||||||
|
(cons integer integer)))
|
||||||
|
(const nil))
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-startup-buffer-responsive t
|
(spacemacs|defc dotspacemacs-startup-buffer-responsive t
|
||||||
"True if the home buffer should respond to resize events.")
|
"True if the home buffer should respond to resize events."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-excluded-packages '()
|
(spacemacs|defc dotspacemacs-excluded-packages '()
|
||||||
"A list of packages that will not be installed and loaded.")
|
"A list of packages that will not be installed and loaded."
|
||||||
|
'(repeat symbol)
|
||||||
|
'spacemacs-dotspacemacs-layers)
|
||||||
|
|
||||||
(defvar dotspacemacs-frozen-packages '()
|
(spacemacs|defc dotspacemacs-frozen-packages '()
|
||||||
"A list of packages that cannot be updated.")
|
"A list of packages that cannot be updated."
|
||||||
|
'(repeat symbol)
|
||||||
|
'spacemacs-dotspacemacs-layers)
|
||||||
|
|
||||||
(defvar dotspacemacs-pretty-docs nil
|
(spacemacs|defc dotspacemacs-pretty-docs nil
|
||||||
"Run `spacemacs/prettify-org-buffer' when
|
"Run `spacemacs/prettify-org-buffer' when
|
||||||
visiting README.org files of Spacemacs.")
|
visiting README.org files of Spacemacs."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-new-empty-buffer-major-mode nil
|
(spacemacs|defc dotspacemacs-new-empty-buffer-major-mode nil
|
||||||
"Set the major mode for a new empty buffer.")
|
"Set the major mode for a new empty buffer."
|
||||||
|
'symbol
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-use-clean-aindent-mode t
|
(spacemacs|defc dotspacemacs-use-clean-aindent-mode t
|
||||||
"Correct indentation for simple modes.
|
"Correct indentation for simple modes.
|
||||||
|
|
||||||
If non nil activate `clean-aindent-mode' which tries to correct
|
If non nil activate `clean-aindent-mode' which tries to correct
|
||||||
virtual indentation of simple modes. This can interfer with mode specific
|
virtual indentation of simple modes. This can interfer with mode specific
|
||||||
indent handling like has been reported for `go-mode'.
|
indent handling like has been reported for `go-mode'.
|
||||||
If it does deactivate it here. (default t)")
|
If it does deactivate it here. (default t)"
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-swap-number-row nil
|
(spacemacs|defc dotspacemacs-swap-number-row nil
|
||||||
"Shift number row for easier access.
|
"Shift number row for easier access.
|
||||||
|
|
||||||
If non-nil shift your number row to match the entered keyboard layout
|
If non-nil shift your number row to match the entered keyboard layout
|
||||||
(only in insert mode). Currently the keyboard layouts
|
(only in insert mode). Currently the keyboard layouts
|
||||||
(qwerty-us qwertz-de) are supported.
|
(qwerty-us qwertz-de) are supported.
|
||||||
New layouts can be added in `spacemacs-editing' layer.
|
New layouts can be added in `spacemacs-editing' layer.
|
||||||
(default nil)")
|
(default nil)"
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-home-shorten-agenda-source nil
|
(spacemacs|defc dotspacemacs-home-shorten-agenda-source nil
|
||||||
"If nil the home buffer shows the full path of agenda items
|
"If nil the home buffer shows the full path of agenda items
|
||||||
and todos. If non nil only the file name is shown.")
|
and todos. If non nil only the file name is shown."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs--pretty-ignore-subdirs
|
(defvar dotspacemacs--pretty-ignore-subdirs
|
||||||
'(".cache/junk")
|
'(".cache/junk")
|
||||||
"Subdirectories of `spacemacs-start-directory' to ignore when
|
"Subdirectories of `spacemacs-start-directory' to ignore when
|
||||||
prettifying Org files.")
|
prettifying Org files.")
|
||||||
|
|
||||||
(defvar dotspacemacs-scratch-buffer-persistent nil
|
(spacemacs|defc dotspacemacs-scratch-buffer-persistent nil
|
||||||
"If non-nil, *scratch* buffer will be persistent. Things you write down in
|
"If non-nil, *scratch* buffer will be persistent. Things you write down in
|
||||||
*scratch* buffer will be saved automatically.")
|
*scratch* buffer will be saved automatically."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-scratch-buffer-unkillable nil
|
(spacemacs|defc dotspacemacs-scratch-buffer-unkillable nil
|
||||||
"If non-nil, `kill-buffer' on *scratch* buffer
|
"If non-nil, `kill-buffer' on *scratch* buffer
|
||||||
will bury it instead of killing.")
|
will bury it instead of killing."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defvar dotspacemacs-byte-compile nil
|
(spacemacs|defc dotspacemacs-byte-compile nil
|
||||||
"If non-nil, byte-compile some of Spacemacs files.")
|
"If non-nil, byte-compile some of Spacemacs files."
|
||||||
|
'boolean
|
||||||
|
'spacemacs-dotspacemacs-init)
|
||||||
|
|
||||||
(defun dotspacemacs//prettify-spacemacs-docs ()
|
(defun dotspacemacs//prettify-spacemacs-docs ()
|
||||||
"Run `spacemacs/prettify-org-buffer' if `buffer-file-name'
|
"Run `spacemacs/prettify-org-buffer' if `buffer-file-name'
|
||||||
|
@ -732,8 +941,12 @@ If ARG is non nil then ask questions to the user before installing the dotfile."
|
||||||
(unless (with-demoted-errors "Error loading .spacemacs: %S"
|
(unless (with-demoted-errors "Error loading .spacemacs: %S"
|
||||||
(load dotspacemacs))
|
(load dotspacemacs))
|
||||||
(dotspacemacs/safe-load))))
|
(dotspacemacs/safe-load))))
|
||||||
(advice-add 'dotspacemacs/user-config
|
(advice-add 'dotspacemacs/layers :after
|
||||||
:around 'dotspacemacs//profile-user-config))
|
'spacemacs-customization//validate-dotspacemacs-layers-vars)
|
||||||
|
(advice-add 'dotspacemacs/init :after
|
||||||
|
'spacemacs-customization//validate-dotspacemacs-init-vars)
|
||||||
|
(advice-add 'dotspacemacs/user-config :around
|
||||||
|
'dotspacemacs//profile-user-config))
|
||||||
|
|
||||||
(defun spacemacs/title-prepare (title-format)
|
(defun spacemacs/title-prepare (title-format)
|
||||||
"A string is printed verbatim except for %-constructs.
|
"A string is printed verbatim except for %-constructs.
|
||||||
|
|
|
@ -10,6 +10,11 @@
|
||||||
;;; License: GPLv3
|
;;; License: GPLv3
|
||||||
(setq message-log-max 16384)
|
(setq message-log-max 16384)
|
||||||
|
|
||||||
|
(defgroup spacemacs nil
|
||||||
|
"Spacemacs customizations."
|
||||||
|
:group 'emacs
|
||||||
|
:prefix 'spacemacs-)
|
||||||
|
|
||||||
(require 'subr-x nil 'noerror)
|
(require 'subr-x nil 'noerror)
|
||||||
(require 'core-emacs-backports)
|
(require 'core-emacs-backports)
|
||||||
(require 'core-env)
|
(require 'core-env)
|
||||||
|
@ -35,11 +40,6 @@
|
||||||
(require 'core-spacebind)
|
(require 'core-spacebind)
|
||||||
(require 'core-compilation)
|
(require 'core-compilation)
|
||||||
|
|
||||||
(defgroup spacemacs nil
|
|
||||||
"Spacemacs customizations."
|
|
||||||
:group 'starter-kit
|
|
||||||
:prefix 'spacemacs-)
|
|
||||||
|
|
||||||
(defvar spacemacs-post-user-config-hook nil
|
(defvar spacemacs-post-user-config-hook nil
|
||||||
"Hook run after dotspacemacs/user-config")
|
"Hook run after dotspacemacs/user-config")
|
||||||
(defvar spacemacs-post-user-config-hook-run nil
|
(defvar spacemacs-post-user-config-hook-run nil
|
||||||
|
|
|
@ -0,0 +1,213 @@
|
||||||
|
;;; validate.el --- Schema validation for Emacs-lisp -*- lexical-binding: t; -*-
|
||||||
|
|
||||||
|
;; Copyright (C) 2016 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
;; Author: Artur Malabarba <emacs@endlessparentheses.com>
|
||||||
|
;; Keywords: lisp
|
||||||
|
;; Package-Requires: ((emacs "24.1") (cl-lib "0.5") (seq "2.16"))
|
||||||
|
;; Version: 1.0.4
|
||||||
|
|
||||||
|
;;; Commentary:
|
||||||
|
;;
|
||||||
|
;; This library offers two functions that perform schema validation.
|
||||||
|
;; Use this is your Elisp packages to provide very informative error
|
||||||
|
;; messages when your users accidentally misconfigure a variable.
|
||||||
|
;; For instance, if everything is fine, these do the same thing:
|
||||||
|
;;
|
||||||
|
;; 1. (validate-variable 'cider-known-endpoints)
|
||||||
|
;; 2. cider-known-endpoints
|
||||||
|
;;
|
||||||
|
;; However, if the user has misconfigured this variable, option
|
||||||
|
;; 1. will immediately give them an informative error message, while
|
||||||
|
;; option 2. won't say anything and will lead to confusing errors down
|
||||||
|
;; the line.
|
||||||
|
;;
|
||||||
|
;; The format and language of the schemas is the same one used in the
|
||||||
|
;; `:type' property of a `defcustom'.
|
||||||
|
;;
|
||||||
|
;; See: (info "(elisp) Customization Types")
|
||||||
|
;;
|
||||||
|
;; Both functions throw a `user-error' if the value in question
|
||||||
|
;; doesn't match the schema, and return the value itself if it
|
||||||
|
;; matches. The function `validate-variable' verifies whether the value of a
|
||||||
|
;; custom variable matches its custom-type, while `validate-value' checks an
|
||||||
|
;; arbitrary value against an arbitrary schema.
|
||||||
|
;;
|
||||||
|
;; Missing features: `:inline', `plist', `coding-system', `color',
|
||||||
|
;; `hook', `restricted-sexp'.
|
||||||
|
|
||||||
|
;;; License:
|
||||||
|
;;
|
||||||
|
;; This file is part of GNU Emacs.
|
||||||
|
;;
|
||||||
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
||||||
|
;; it under the terms of the GNU General Public License as published by
|
||||||
|
;; the Free Software Foundation, either version 3 of the License, or
|
||||||
|
;; (at your option) any later version.
|
||||||
|
;;
|
||||||
|
;; GNU Emacs is distributed in the hope that it will be useful,
|
||||||
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
;; GNU General Public License for more details.
|
||||||
|
;;
|
||||||
|
;; You should have received a copy of the GNU General Public License
|
||||||
|
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
;;; Code:
|
||||||
|
(require 'cl-lib)
|
||||||
|
(require 'seq)
|
||||||
|
(require 'cus-edit)
|
||||||
|
|
||||||
|
(defun validate--check-list-contents (values schemas)
|
||||||
|
"Check that all VALUES match all SCHEMAS."
|
||||||
|
(when schemas
|
||||||
|
(if (not (= (length values) (length schemas)))
|
||||||
|
"wrong number of elements"
|
||||||
|
(seq-find #'identity (seq-mapn #'validate--check values schemas)))))
|
||||||
|
|
||||||
|
(defun validate--indent-by-2 (x)
|
||||||
|
(replace-regexp-in-string "^" " " x))
|
||||||
|
|
||||||
|
(defun validate--check (value schema)
|
||||||
|
"Return nil if VALUE matches SCHEMA.
|
||||||
|
If they don't match, return an explanation."
|
||||||
|
(let ((args (cdr-safe schema))
|
||||||
|
(expected-type (or (car-safe schema) schema))
|
||||||
|
(props nil))
|
||||||
|
(while (and (keywordp (car args)) (cdr args))
|
||||||
|
(setq props `(,(pop args) ,(pop args) ,@props)))
|
||||||
|
(setq args (or (plist-get props :args) args))
|
||||||
|
;; :convert-widget is not supported.
|
||||||
|
(unless (plist-get props :convert-widget)
|
||||||
|
(let ((r
|
||||||
|
(cl-labels ((wtype ;wrong-type
|
||||||
|
(tt) (unless (funcall (intern (format "%sp" tt)) value)
|
||||||
|
(format "not a %s" tt))))
|
||||||
|
;; TODO: hook (top-level only).
|
||||||
|
(cl-case expected-type
|
||||||
|
((sexp other) nil)
|
||||||
|
(variable (cond ((wtype 'symbol))
|
||||||
|
((not (boundp value)) "this symbol has no variable binding")))
|
||||||
|
((integer number float string character symbol function boolean face)
|
||||||
|
(wtype expected-type))
|
||||||
|
(regexp (cond ((ignore-errors (string-match value "") t) nil)
|
||||||
|
((wtype 'string))
|
||||||
|
(t "not a valid regexp")))
|
||||||
|
(repeat (cond
|
||||||
|
((or (not args) (cdr args)) (error "`repeat' needs exactly one argument"))
|
||||||
|
((wtype 'list))
|
||||||
|
(t (let ((subschema (car args)))
|
||||||
|
(seq-some (lambda (v) (validate--check v subschema)) value)))))
|
||||||
|
((const function-item variable-item)
|
||||||
|
(unless (equal value (or (plist-get props :value) (car args)))
|
||||||
|
"not the expected value"))
|
||||||
|
(file (cond ((wtype 'string))
|
||||||
|
((file-exists-p value) nil)
|
||||||
|
((plist-get props :must-match) "file does not exist")
|
||||||
|
((not (file-writable-p value)) "file is not accessible")))
|
||||||
|
(directory (cond ((wtype 'string))
|
||||||
|
((file-directory-p value) nil)
|
||||||
|
((file-exists-p value) "path is not a directory")
|
||||||
|
((not (file-writable-p value)) "directory is not accessible")))
|
||||||
|
(key-sequence (and (wtype 'string)
|
||||||
|
(wtype 'vector)))
|
||||||
|
;; TODO: `coding-system', `color'
|
||||||
|
(coding-system (wtype 'symbol))
|
||||||
|
(color (wtype 'string))
|
||||||
|
(cons (or (wtype 'cons)
|
||||||
|
(validate--check (car value) (car args))
|
||||||
|
(validate--check (cdr value) (cadr args))))
|
||||||
|
((list group) (or (wtype 'list)
|
||||||
|
(validate--check-list-contents value args)))
|
||||||
|
(vector (or (wtype 'vector)
|
||||||
|
(validate--check-list-contents value args)))
|
||||||
|
(alist (let ((value-type (plist-get props :value-type))
|
||||||
|
(key-type (plist-get props :key-type)))
|
||||||
|
(cond ((not value-type) (error "`alist' needs a :value-type"))
|
||||||
|
((not key-type) (error "`alist' needs a :key-type"))
|
||||||
|
((wtype 'list))
|
||||||
|
(t (validate--check value
|
||||||
|
`(repeat (cons ,key-type ,value-type)))))))
|
||||||
|
;; TODO: `plist'
|
||||||
|
((choice radio) (if (not (cdr args))
|
||||||
|
(error "`choice' needs at least one argument")
|
||||||
|
(let ((gather (mapcar (lambda (x) (validate--check value x)) args)))
|
||||||
|
(when (seq-every-p #'identity gather)
|
||||||
|
(concat "all of the options failed\n"
|
||||||
|
(mapconcat #'validate--indent-by-2 gather "\n"))))))
|
||||||
|
;; TODO: `restricted-sexp'
|
||||||
|
(set (or (wtype 'list)
|
||||||
|
(let ((failed (list t)))
|
||||||
|
(dolist (schema args)
|
||||||
|
(let ((elem (seq-find (lambda (x) (not (validate--check x schema)))
|
||||||
|
value
|
||||||
|
failed)))
|
||||||
|
(unless (eq elem failed)
|
||||||
|
(setq value (remove elem value)))))
|
||||||
|
(when value
|
||||||
|
(concat "the following values don't match any of the options:\n "
|
||||||
|
(mapconcat (lambda (x) (format "%s" x)) value "\n "))))))))))
|
||||||
|
(when r
|
||||||
|
(let ((print-length 5)
|
||||||
|
(print-level 2))
|
||||||
|
(format "Looking for `%S' in `%S' failed because:\n%s"
|
||||||
|
schema value
|
||||||
|
(if (string-match "\\`Looking" r)
|
||||||
|
r
|
||||||
|
(validate--indent-by-2 r)))))))))
|
||||||
|
|
||||||
|
|
||||||
|
;;; Exposed API
|
||||||
|
;;;###autoload
|
||||||
|
(defun validate-value (value schema &optional noerror)
|
||||||
|
"Check that VALUE matches SCHEMA.
|
||||||
|
If it matches return VALUE, otherwise signal a `user-error'.
|
||||||
|
|
||||||
|
If NOERROR is non-nil, return t to indicate a match and nil to
|
||||||
|
indicate a failure."
|
||||||
|
(let ((report (validate--check value schema)))
|
||||||
|
(if report
|
||||||
|
(unless noerror
|
||||||
|
(user-error "%s" report))
|
||||||
|
value)))
|
||||||
|
|
||||||
|
;;;###autoload
|
||||||
|
(defun validate-variable (symbol &optional noerror)
|
||||||
|
"Check that SYMBOL's value matches its schema.
|
||||||
|
SYMBOL must be the name of a custom option with a defined
|
||||||
|
`custom-type'. If SYMBOL has a value and a type, they are checked
|
||||||
|
with `validate-value'. NOERROR is passed to `validate-value'."
|
||||||
|
(let* ((val (symbol-value symbol))
|
||||||
|
(type (custom-variable-type symbol)))
|
||||||
|
(if type
|
||||||
|
(validate-value val type)
|
||||||
|
(if noerror val
|
||||||
|
(error "Variable `%s' has no custom-type." symbol)))))
|
||||||
|
|
||||||
|
;;;###autoload
|
||||||
|
(defun validate-mark-safe-local (symbol)
|
||||||
|
"Mark SYMBOL as a safe local if its custom type is obeyed."
|
||||||
|
(put symbol 'safe-local-variable
|
||||||
|
(lambda (val)
|
||||||
|
(validate-value val (custom-variable-type symbol) 'noerror))))
|
||||||
|
|
||||||
|
(defmacro validate-setq (&rest svs)
|
||||||
|
"Like `setq', but throw an error if validation fails.
|
||||||
|
VALUE is validated against SYMBOL's custom type.
|
||||||
|
|
||||||
|
\(fn [SYM VAL] ...)"
|
||||||
|
(let ((out))
|
||||||
|
(while svs
|
||||||
|
(let ((symbol (pop svs))
|
||||||
|
(value (if (not svs)
|
||||||
|
(error "`validate-setq' takes an even number of arguments")
|
||||||
|
(pop svs))))
|
||||||
|
(push `(if (boundp ',symbol)
|
||||||
|
(setq ,symbol (validate-value ,value (custom-variable-type ',symbol)))
|
||||||
|
(user-error "Trying to validate a variable that's not defined yet: `%s'.\nYou need to require the package before validating"
|
||||||
|
',symbol))
|
||||||
|
out)))
|
||||||
|
`(progn ,@(reverse out))))
|
||||||
|
|
||||||
|
(provide 'validate)
|
||||||
|
;;; validate.el ends here
|
|
@ -30,7 +30,7 @@
|
||||||
(require 'org-compat)
|
(require 'org-compat)
|
||||||
|
|
||||||
(defgroup space-doc nil "Minor mode for viewing Spacemacs documentation files."
|
(defgroup space-doc nil "Minor mode for viewing Spacemacs documentation files."
|
||||||
:group 'convenience)
|
:group 'spacemacs)
|
||||||
|
|
||||||
;; NOTE: Dont forget to update Spacemacs FAQ if you modify this list!
|
;; NOTE: Dont forget to update Spacemacs FAQ if you modify this list!
|
||||||
(defcustom spacemacs-space-doc-modificators
|
(defcustom spacemacs-space-doc-modificators
|
||||||
|
|
|
@ -24,12 +24,14 @@
|
||||||
"Default shell to use in Spacemacs. Possible values are `eshell' (default),
|
"Default shell to use in Spacemacs. Possible values are `eshell' (default),
|
||||||
`shell', `term', `ansi-term', `multi-term' and `vterm'.")
|
`shell', `term', `ansi-term', `multi-term' and `vterm'.")
|
||||||
|
|
||||||
(defvar shell-default-position 'bottom
|
(spacemacs|defc shell-default-position 'bottom
|
||||||
"Position of the shell. Possible values are `top', `bottom', `full',
|
"Position of the shell. Possible values are `top', `bottom', `full',
|
||||||
`left' and `right'.")
|
`left' and `right'."
|
||||||
|
'(choice (const bottom) (const full) (const top)))
|
||||||
|
|
||||||
(defvar shell-default-height 30
|
(spacemacs|defc shell-default-height 30
|
||||||
"Height in percents for the shell window.")
|
"Height in percents for the shell window."
|
||||||
|
'integer)
|
||||||
|
|
||||||
(defvar shell-default-width 30
|
(defvar shell-default-width 30
|
||||||
"Width in percents for the shell window.")
|
"Width in percents for the shell window.")
|
||||||
|
|
Loading…
Reference in New Issue