This commit defines:
- spacemacs-default-jump-handlers: a list of functions that can jump to
definition in ALL modes.
- spacemacs-jump-handlers-MODE: a list of functions that can jump to
definition in MODE.
- spacemacs-jump-handlers: a buffer-local list of functions that can
jump to definition. This is made up of the values of the two previous
variables whenever a given major mode is activated.
- spacemacs/jump-to-definition: a function that tries each function in
spacemacs-jump-handlers in order, and stops when one of them takes us
somewhere new.
- spacemacs|define-jump-handlers: a macro that
* defines spacemacs-jump-handlers-MODE, possibly filled with initial
functions
* defines a function that is added to the hook of the given MODE
* binds “SPC m g g” of that MODE to spacemacs/jump-to-definition
This is an attempt to harmonize all the different approaches to jumping.
Specifically,
- Existing intelligent jump packages that work for only a single mode
should go to the beginning of spacemacs-jump-handlers-MODE. E.g.
anaconda for python, ensime for scala, etc.
- Packages like gtags that work for several modes (but potentially not
all) and which is dumber than the intelligent jumpers should go the
the END of spacemacs-jump-handlers-MODE.
- Packages like dumb-jump that work for all modes should go to
spacemacs-default-jump-handlers.
In all cases the order of the jump handlers in each list should be from
most to least intelligent.
Fixes#6619
Rename dotspacemacs-download-packages to dotspacemacs-install-packages
to better reflect the changes in the previous commit.
Also change the value 'used to 'used-only (note that 'used is still
supported for backward compatibility).
See end of this message for important breaking changes.
Previous behavior was to configure any installed package which caused
a lot of bad side effects and could make spacemacs unusable. This
behavior made little sense and does not fit with spacemacs.
This commit fixes this behavior by separating installed packages from
configured packages. In short dostspacemacs-download-packages variable
now only affect package installation. Packages are now configured if and
only if they are effectively *used* (i.e. listed in variable
dotspacemacs-configuration-layers or dotspacemacs-additional-packages).
IMPORTANT CHANGE: functions `configuration-layer/declare-used-layer` and
`configuration-layer/declare-used-layers` have been removed. These
functions have been introduced in develop branch only so the impact
should be minimal.
Saving a pkg-match regex to a temporary variable lets us avoid recomputing it on each
iteration. I didn't benchmark the performance impact, but unless there's a downside to
using `let*` vs `let`, it seems like a no-brainer.
Passing pkg-match to `directory-files` reduces the returned files to those that match the
regex rolling our own reduction.
For emacs 24.5 packages will be installed in .emacs.d/elpa/24.5, for
emacs 24.4 packages will be installed in .emacs.d/elpa/24.4, etc.
For a user that uses several emacs versions with the same config, the
packages for version X will be in .emacs.d/elpa/X and the packages for
version Y will be in .emacs.d/elpa/Y. This is instead of using the same
.emacs.d/elpa and possibly having copmiled elisp packages the are
incompatible with one of the emacs versions in use.
Rollback directories are also separated by version:
.cache/.rollback/24.5, .cache/.rollback/24.4, etc.
Don't fallback to default init file when SPACMACSDIR is used and
$SPACEMACSDIR/init.el doesn't exist. The file will be created during
the startup process.
Misspellings:
"beginnign" changed to "beginning",
"Insert one of several lines" changed to "Insert one or several lines" in two functions,
"identation" changed to "indentation",
Missing comment copied from the function that inserts a line
in the opposite direction:
(defun spacemacs/insert-line-below-no-indent (count)
"Insert a new line below with no indentation."
and renamed the direction, resulting in:
"Insert a new line above with no indentation."
Duplicate comments removed, the comments inside the functions,
are better explanations of what the function does.
Functions reordered:
The functions:
(defun spacemacs/evil-insert-line-below (count)
and
(defun spacemacs/evil-insert-line-above (count)
were written in a illogical order,
the "above" function should be written before the "below" function,
with this change, the function order will match other functions
with "above" and "below" in their names,
for example these:
(defun spacemacs/insert-line-above-no-indent (count)
https://github.com/syl20bnr/spacemacs/blob/develop/layers/%2Bdistributions/spacemacs-base/funcs.el#L535
(defun spacemacs/insert-line-below-no-indent (count)
https://github.com/syl20bnr/spacemacs/blob/develop/layers/%2Bdistributions/spacemacs-base/funcs.el#L549
evil-commands.el
line 2205: (defun evil-open-above (count)
line 2219: (defun evil-open-below (count)
line 2310: (defun evil-copy-from-above (arg)
line 2326: (defun evil-copy-from-below (arg)
evil-common.el
line 1892: (defun evil-insert-newline-above ()
line 1901: (defun evil-insert-newline-below ()
Can force a check with the universal prefix argument, for instance:
SPC u SPC SPC spacemacs/check-for-new-version
will always check for a new version even if not on master branch.
Once per 24 hours by default.
Caveat: if a new version is detected on the current instance of Emacs
and Emacs is restarted before the end of the 24 hours window then
the new version lighter in the modeline disappear; i.e. we don't
remember the last check results.
Fixes#6692
TL;DR Should get 20~25% speed improvement on startup, should get a big
improvement when using ivy or helm SPC h SPC. Users with layers.el files
in their layers must use `configuration-layer/declare-used-layer`
instead of `configuration-layer/declare-layer`
The implementation of the layer system made heavy use of `object-assoc`
and `object-assoc-list` functions which are not efficient. This PR
mainly replaces those object lists with hash maps in order to index the
objects by their name and achieve an O(1) access time.
The old object lists `configuration-layer--layers` and
`configuration-layer--packages` have been each by two variables each:
- `configuration-layer--indexed-layers` which is a hash-map of all the
layer objects and `configuration-layer--used-layers` which is a list of
all _used_ layers symbols,
- symmetrically `configuration-layer--indexed-packages` which is a
hash-map of all the package objects and
`configuration-layer--used-packages` which is a list of all _used_
packages symbols.
The hash map `configuration-layer--layer-paths` is gone, now we create
directly layer objects when discovering the layers and set the :dir
property. Note that previously the layer paths were the parent directory
of the layer, now :dir is the layer path.
The function `configuration-layer//make-layer` is now similar to its
counterpart `configuration-layer//make-package` in the sense that it
takes an optional `obj` to be able to override its properties.
The functions `configuration-layer/declare-layer` and
`configuration-layer/declare-layers` now takes an optional parameter
`usedp` in order to declare used or not used layers. For convenience
new functions have been added: `configuration-layer/declare-used-layer`
and `configuration-layer/declare-used-layers`, users _must_ update all
occurrences of `configuration-layer/declare-layer` by
`configuration-layer/declare-used-layers` in their `layers.el` files.
`helm-spacemacs-help` and `ivy-spacemacs-help` are updated to match the
changes in `core-configuration-layer.el`.
Rename some variables to make them more explicit:
`configuration-layer-no-layer` -> `configuration-layer-exclude-all-layers`
`configuration-layer-distribution` -> `configuration-layer-force-distribution`
Choose to inherit from face lazy-highlight instead of region.
Ideally a theme should not set lazy-highlight to the same face as
region.
Also move some function to funcs.el and remove some empty lines.
Providing a min-version allows to fetch the elpa version of a built-in
package. For intance to install python mode from GNU elpa, add to
the dotspacemacs-additional-packages:
(python :location elpa :min-version "0.25.2")
This feels weird to set as default a variable using a third-party
service like Dropbox. Was OK when Spacemacs was less popular, now this
variable has nothing to do in this project.
- make it clear that setting dotspacemacs-default-font has no effect in
terminal
- make it clear that it's user responsibility to install Source Code Pro
font
Random banner choice was broken by the presence of the `img` directory.
Even if `random` was set instead of `random*` in .spacemacs file the
cate banner would still show.
This commit fixes this bug while simplifying the existing code by adding
a regexp filter to only choose "*.txt" files.
Previous behavior, if a micro-state binding had :doc not nil, was an error
Wrong type argument: stringp, 1
Detailed reproduction:
cat > /tmp/test.el <<EOF
(spacemacs|define-micro-state test
:doc "[a] a [b] b [q] quit"
:bindings
("a" nil :doc "a")
("b" nil :doc "b")
("q" nil :doc "quit" :exit t))
(spacemacs/test-micro-state)
EOF
emacs --load /tmp/test.el
Type a, b, or q and see the error in the echo buffer.
With this new variable, user can load spacemacs anywhere, e.g.
"~/.emacs.d/spacemacs/". Only user's cache directory is still hard-coded
as "~/.emacs.d/.cache/". If user want to use spacemacs this way, drop
one line as the below in "~/.emacs.d/init.el":
(setq spacemacs-start-directory "~/.emacs.d/spacemacs/")
(load-file (concat spacemacs-start-directory "init.el"))
Helm-flx, which is included as a core package, requires a minimum Emacs
version of 24.4. As it stands attempting to install Spacemacs on Emacs
24.3 or below will break on helm-flx.
Old implementation excluded package that were not selected, this
implementation does not excluded them, it simply ignore it in the
layer where they are not selected. This reimplementation comes from
a refactor of the way packages.el files are loaded, instead of loading
these files at the moment of resolving the list of used packages, they
are now loaded when making the layer objects. A neat consequence is that
side effects is better confined and the configuration-layer/get-packages
is now pure (at least a lot more pure than before).
In the `cfgl-layer` class the slot `:user-packages` has been renamed
to `:selected-packages` which defaults to `'all` meaning that all
the packages in `:packages` are selected. `:selected-packages` value
is given by the new function `configuration-layer//select-packages`.
Effectively selected packages are given by a new method for `cfgl-layer`
class called `cfgl-layer-get-packages`.
Tests have been updated to reflect the changes.
Also documentation on configuration layer declaration in the dotfile
section of DOCUMENTATION.org has been greatly improved (I hope) and
reflect the last feature added to the
`dotspacemacs-configuration-layers` list.
I had a duplicated layer, but the message that's printed broke spacemacs starting up because it was a format string but wasn't in a `format` form. Simple fix. Spacemacs works again! Yay!
This issue was introduced in c0851ddcb3, according to a quick `git bisect`. :)
The car of :owners is the real owner.
Now we can easily gather the list of all owners of a package.
Also fix unit tests about missing spacemacs-insecure variable.
Revert "Parse CLI args after dotspacemacs/init"
This reverts commit 0a35502de4.
We cannot delay the parsing of CLI params since we need their values
early during the loading process (i.e. debug info).
Replace the previous commit with a new variable `spacemacs-insecure`
which takes the value of --insecure boolean parameter.
* layers/+spacemacs/spacemacs-editing/packages.el (spacemacs-editing/init-origami):
add origami package and initialize it
* core/core-dotspacemacs.el (dotspacemacs-override-evil-folding): new
variable to allow choosing between different code folding methods.
Currently supported `evil' and `origami'
- Use completing-read when called interactively
- Check for string locations in addition to built-in etc.
- Don’t double-princ on/off for toggles
- Bind to SPC hdP
This new variable replace dotspacemacs-delete-orphan-packages
It defines the behaviour of Spacemacs when downloading packages.
Possible values are `used', `used-but-keep-unused' and `all'.
- `used' will download only explicitly used packages and remove any
unused packages as well as their dependencies.
- `used-but-keep-unused' will download only the used packages but won't
delete them if they become unused.
- `all' will download all the packages regardless if they are used or
not and packages won't be deleted by Spacemacs.
Default value is `used`.
The new layer file `layers.el` is used to declared additional layers.
It is like the sibling of packages.el except that for now it does not
take a list (can do this in a futur commit).
The new order for file loading is the following:
layers.el > packages.el > funcs.el > config.el > keybindings.el
Since packages.el relies on some undefined stuff encapsulated
in init functions, it is not meant to be byte compiled. OTOH funcs.el
(where lies most of the computation added by a package config) should
be compilable.
Since we load packages.el very early it is not possible to use
`configuration-layer/package-usedp` in funcs.el.
This commit also fixes the tests.
Add argument `action` as first positional argument, the second
positonal argument is for tests.
Add actions `doc` and `config`, doc works on org files and config works
on configuration file like packages.el.
The special action `all` performs all actions.
Move test files to `test` sub-folder.
Choose between `md5sum` and `md5` (on OS X) executables.
Add a new formatting function `move-packages-to-config` to move
package lists to config.el file.
Change the semantic of the files for a better control over the
configuration (like being able to use package-usedp function to
guard package configuration and function definition).
This is a big change!
The list of packages of the layer must now be placed in config.el
packages.el only contains pre-init, init and post-init functions
Now both packages.el and funcs.el can use
configuration-layer/package-usedp which is much more powerful than
just configuration-layer/layer-usedp.
Also merging into one file the layer variable and the list of packages
make sense (in this case config.el).
It also means that we can quickly load all the packages declared in
all layer for helm and ivy sources by just loading the config.el file.
Expect some regressions introduced by this change, like the helm
and ivy sources, they will be fixed in other commits.
This commit introduces two new options to add-toggle:
:prefix, a symbol that is bound to the raw prefix argument (as
in `(interactive "P") forms).
:on-message, an expression overriding the default 'on' toggle
message (useful to document a toggle's argument).
These new options are applied to long-lines' toggle, so we can choose
how many lines to toggle it on via a raw prefix argument.
Visiting the dump file before writing to it is slow, because it triggers
all the regular actions that happen when a user opens a file, e.g.
enable major mode and minor modes. We don't need all that,
with-temp-file is what we really want.
spacemacs/report-issue opens a buffer prepopulated with a template and some
system information. The buffer is markdown-mode augmented with a keybinding to
send the contents to github.
Or if that doesn't work, the text remains in the buffer to be manually copied
and pasted. This makes the error reporting more robust: right after the user has
experienced one bug is the worst time to manifest another one.
This commit also rewrites spacemacs//describe-last-keys-string because I
couldn't figure out how else to prevent view-lossage from burying the new
REPORT_SPACEMACS_ISSUE buffer. Suggestions welcome.
--no-layer: desactive all the layers except the distribution layer
--distribution: allow the change temporarily the distribution
example
Start emacs with spacemacs-base and no layers:
emacs --no-layer --distribution spacemacs-base
Add test mode: {repo-root}/core/tools/doc-fmt/run.bash test
applies formatting only to {repo-root}/core/tools/doc-fmt/test.org
Use "gsed" if present.
Add new filters, refactor code.
test.org now represents most of the .org file formatting errors.
If emacs is launched with -q option and spacemacs files are loaded via
--eval option, then spacemacs fails due to depending `after-init-time'
variable being set properly which is done only when emacs is launched
without -q. This patch is to remove this dependence so that spacemacs
launched with -q can still work. This is done by introducing
`spacemacs-initialized' variable which is set properly regardless of
which command line options are present or absent.
New package :step 'bootstrap', this step happens before 'pre' packages.
A new layer names 'spacemacs-bootstrap' gather all the ':step bootstrap'
packages. This layer is special and is always the first element of
the variable 'configuration-layer--layers' which assure that all
bootstrap packages are configured first.
This new layer leverages the configuration layer system, removes the
clutter of package installations in the function 'spacemacs/init' and
isolate the bootstrap packages in one place.
The https link-type opens the local copies of the Spacemacs documentation files with
the spacemacs/view-org-file function. It supports GitHub style heading links
For example, the link:
https://github.com/syl20bnr/spacemacs/blob/develop/layers/org/README.org#links
Will be handled similary to as if it was:
file:~/.emacs.d/layers/org/README.org::*links
Also the `space-doc' mode will be applied.
Refactored GH style anchor search.
`space-doc-mode` - Buffer local minor mode for Spacemacs documentation files. The mode hides org meta tags.
Enabled when viewing documentation via `SPC` `h` `SPC`
Add new html preprocessors to the org-html-publish-to-html pipeline:
- `spacemacs//toc-org-unhrefify-toc`
- remove the `toc-org` modifications for the TOC
- `spacemacs//org-heading-annotate-custom-id`
- annotate org headings with the indexes that GitHub uses for linking.
`org-html-publish-to-html` will use them instead of the default
`#orgheadline{N}`. This way the GitHub links and the
http://spacemacs.org/ links will be compatible."
- `spacemacs//reroot-links`
- find the links that start with
https://github.com/syl20bnr/spacemacs/blob/ and end with
.org{#an-optional-heading-link} (i.e the links between the local org
files). Change their root to http://spacemacs.org/ so the links will
point at files located on the site.
*For the "file to file" links to work properly the expor
Several things have been fixed:
- correctly set the :lazy-install flag on all packages of a lazy
installed layer
- correctly unset the :lazy-install flag when installing the packages
- sort the packages before installation and configuration
Fixes#5610
Make cfgl-layer-owned-packages return a list of package objects instead
of just package names.
Use this function to correctly excluded non owned package when flagging
package for lazy installation.
Fixes#5608
- only consider distant packages (i.e. requiring an installation)
- remove lazy install flag of a layer if at least one owned package is
already installed
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.
Motivation
While disabling Evil in holy-mode makes its implementation shorter and
sounds elegant on the paper, in practice it puts a big burden on the
configuration parts which need to know if Evil is enable or not. This is
a bad separation of concerns and the bunch of fixes that we were forced
to do in the past weeks shows this issue. Those fixes were about
removing the knowledge of the activation of Evil by implementing new
dispatching functions to be used by layers, this is cumbersome and makes
Spacemacs layer configuration more subtle which is not good. There was
additional bad consequences of the removal of Evil state like the
impossibility to use Evil lisp state or iedit states, or we would have
been forced to implement a temporary activation of Evil which is
awkward.
Instead I reintroduce Evil as the central piece of Spacemacs design thus
Evil is now re-enabled in holy-mode. It provides the abstraction we need
to isolate editing styles and be able to grow the Spacemacs
configuration coverage sanely. Layers don't need to check whether the
holy mode is active or not and they don't need to know if Evil is
available (it is always available). We also don't need to write
additional dispatching functions, this is the job of Evil, and I think
it provides everything for this. Ideally configuration layer should be
implemented with only Evil in mind and the holy-mode (and hybrid-mode)
should magically make it work for Emacs style users, for instance we can
freely use `evil-insert-state` anywhere in the code without any guard.
Evil is now even more part of Spacemacs, we can really say that
Spacemacs is Emacs+Evil which is now an indivisible pair. Spacemacs
needed this stable API to continue on the right track.
While these changes should be rather transparent to the user, I'm sorry
for this experimental period, I failed to see all the implications of
such a change, I was just excited about the possibility to make Evil
optional. The reality is that Spacemacs has to embrace it and keep its
strong position on being Emacs+Evil at the core.
Implementation
- insert, motion and normal states are forced to emacs state using an
advice on `evil-insert-state`, `evil-motion-state` and
`evil-normal-state` respectively. These functions can be used freely in
the layer configuration.
- A new general hook `spacemacs-editing-style-hook` allow to hook any
code that need to be configured based on the editing style. Functions
hooked to this hook takes the current style as parameter, this
basically generalize the hook used to setup hjkl navigation bindings.
- ESC has been removed from the emacs state map.
- Revert unneeded changes
- Revert "evil: enter insert-state only from normal-state"
commit bdd702dfbe.
- Revert "avoid being evil in deft with emacs editing style"
commit f3a16f49ed.
Additional changes
All editing style packages have been moved to a layer called
`spacemacs-editing-styles`
Notes
I did not have time to attack hybrid mode, I should be able to do it
later.
New function configuration-layer/insert-lazy-install-configuration
This function asks for a layer and then insert the lazy configuration
for all the packages owned by this layer.
- New macro `spacemacs|transient-state-format-hint`
Additional hints can be formatted outside of the transient state macro.
This is a better separation of concern from an API point of view
because those hint are coupled to with the usage of :dynamic-hint
keyword. The transient state macro only need to know the entry point
for such dynamic hints, effectively increasing the readability of
transient state definition.
To be able to decouple the formatting of additional hints, a new
private variable whose name is given by the function
`spacemacs//transient-state-props-var-name` has been introduced.
An alternative would have been the save the whole transient state macro
props but a variable allows the cherry-pick only the values we really
need.
- Remove commented code about old variable
`spacemacs-transient-state-title-face`
- Remove unused keyword :entry-binding since it is not used. Given
the number and diversity of transient states in Spacemacs currently it
is a safe guess to remove this keyword for now. We can reintroduce it
later if really needed.
It's not possible to get full backtraces in these instances when an
error is signaled, and I think we should generate full backtraces when
debug-on-error is enabled as a general rule.
I had to make this change at one place to track down the root of problem
2 in #5200.
Bug lurking in the code for quite some time, if both a package and
its dependencies were uninstalled then activation of the dependencies
could fail. This is resolved by explicitly asking package.el to install
the dependencies if required.
Add actions for both helm and ivy.
TODO:
- see TODO in function body
- replace SPC h d p (list all packages, use spacemacs describe when
it is a layer package, otherwise use vanilla describe).
This new keyword allows to add all the packages to the <layer>-packages
even when a package is not toggled on by a given layer variable.
This fixes an issue of the layer system where we had to choose between
discoverability (ie. the list of package in helm or ivy with SPC h SPC)
and installation of package (because any package listed in the variable
<layer>-packages were installed).
Fix bug: When the list of package names returned by
configuration-layer//get-uninstalled-packages contains a package that
isn't contained in configuration-layer--packages, then
configuration-layer//install-package throws "wrong-argument-type:
eieio-object-p nil" error at startup.
configuration-layer//install-packages catches it and prints it in the
home buffer.