2020-01-15 18:04:55 +00:00
|
|
|
|
#+title: Phundrak’s Spacemacs Configuration
|
2020-01-15 11:38:29 +00:00
|
|
|
|
#+INCLUDE: ~/org/config-website/headers.org
|
|
|
|
|
#+OPTIONS: auto-id:t
|
2020-01-15 18:04:55 +00:00
|
|
|
|
#+HTML_HEAD_EXTRA: <meta name="description" content="Phundrak’s Spacemacs Configuration" />
|
|
|
|
|
#+HTML_HEAD_EXTRA: <meta property="og:title" content="Phundrak’s Spacemacs Configuration" />
|
|
|
|
|
#+HTML_HEAD_EXTRA: <meta property="og:description" content="Description of the Spacemacs configuration of Phundrak" />
|
|
|
|
|
|
2020-01-15 23:49:36 +00:00
|
|
|
|
* Spacemacs layers and packages
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:header-args:emacs-lisp: :comments link :tangle ~/.emacs.d/private/spacemacs-layers.el :exports code
|
|
|
|
|
:CUSTOM_ID: h-9d9869e0-4672-419c-bf37-3d3ae1b7c0aa
|
|
|
|
|
:END:
|
|
|
|
|
Here will be our layer configuration set. Everything here is set with a
|
|
|
|
|
~setq-default~ in the ~dotspacemacs/layers~ function like so:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :tangle no
|
|
|
|
|
(defun dotspacemacs/layers ()
|
|
|
|
|
(setq-default
|
|
|
|
|
;; configuration goes here
|
|
|
|
|
))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** General configuration
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-ecfe1909-18af-451d-b78f-0d7e5a1d45c0
|
|
|
|
|
:END:
|
|
|
|
|
First, we need to tell Spacemacs which base distribution we are using. This
|
|
|
|
|
is a layer contained in the directory ~+distribution~. For now, available
|
|
|
|
|
distributions are ~spacemacs-base~ and ~spacemacs~ (the default one).
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-distribution 'spacemacs)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
We can seet a lazy installation of layers —i.e. layers are installed only
|
|
|
|
|
when a file with a supported type is opened. Possible values are:
|
|
|
|
|
- ~all~ :: will lazy install any layer that support lazy installation even
|
|
|
|
|
the layers listed in ~dotspacemacs-configuration-layers~
|
|
|
|
|
- ~unused~ :: will lazy install only unused layers (i.e. layers not listed in
|
|
|
|
|
the variable ~dotspacemacs-configuration-layers~)
|
|
|
|
|
- ~nil~ :: disables the lazy installation feature and you have to explicitly
|
|
|
|
|
list a layer in the variable ~dotspacemacs-configuration-layers~
|
|
|
|
|
to install it.
|
|
|
|
|
The default value is ~unused~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-enable-lazy-installation 'unused)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
If the following variable is non-nil, Spacemacs will ask for confirmation
|
|
|
|
|
before installing a layer lazily. The default value is ~t~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-ask-for-lazy-installation t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Package management
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-587fd3fb-5a99-4c19-af02-b1553c6acfae
|
|
|
|
|
:END:
|
|
|
|
|
It is possible to indicate to Spacemacs a list of additional paths where to
|
|
|
|
|
look for configuration layers. Paths must have a trailing slash, i.e.
|
|
|
|
|
=~/.mycontribs/=. As you can see, I added none:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-configuration-layer-path '())
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
However, I do have additional packages I installed either from the Elpa or
|
|
|
|
|
the Melpa. These are set in ~dotspacemacs-additional-packages~, a list of
|
|
|
|
|
additional packages that will be installed without being wrapped in a layer.
|
|
|
|
|
If you need some configuration for these packages, then consider creating a
|
|
|
|
|
layer. You can also puth the configuration in ~dotspacemacs/user-config~. To
|
|
|
|
|
use a local version of a package, use the ~:location~ property, for instance:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :tangle no
|
|
|
|
|
'(your-package :location "~/path/to/your-package/")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
Alos include the dependencies as they will not be resolved automatically:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-additional-packages '(atomic-chrome
|
|
|
|
|
dired-du
|
|
|
|
|
doom-themes
|
|
|
|
|
edit-indirect
|
|
|
|
|
elcord
|
|
|
|
|
eshell-git-prompt
|
|
|
|
|
flycheck-golangci-lint
|
|
|
|
|
kaolin-themes
|
|
|
|
|
magit-gitflow
|
|
|
|
|
meson-mode
|
|
|
|
|
modern-cpp-font-lock
|
|
|
|
|
multiple-cursors
|
|
|
|
|
org-sidebar
|
|
|
|
|
outorg
|
|
|
|
|
pinentry
|
|
|
|
|
visual-fill-column
|
|
|
|
|
wttrin
|
|
|
|
|
xresources-theme
|
|
|
|
|
yasnippet-snippets))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
It is possible to also list packages that cannot be updated:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-frozen-packages '())
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
And to list packages which won’t be installed nor loaded:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-excluded-packages '())
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Finally, it is possible to define the behaviour of Spacemacs when installing
|
|
|
|
|
packages. Possible values are:
|
|
|
|
|
- ~used-only~ :: installs only explicitly used packages and deletes any
|
|
|
|
|
unused packages as well as their unused dependencies
|
|
|
|
|
- ~used-but-keep-unused~ :: installs only the used packages but won’t delete
|
|
|
|
|
unused ones
|
|
|
|
|
- ~all~ :: installs *all* packages supported by Spacemacs and never
|
|
|
|
|
uninstalls them.
|
|
|
|
|
The default value is ~used-only~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-install-packages 'used-only)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Layers
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-313bf79e-c24c-40a6-8bc0-eb608fda05d9
|
|
|
|
|
:END:
|
|
|
|
|
All layers are set one variable: ~dotspacemacs-configuration-layers~. This
|
|
|
|
|
variable is a list of layers, some of them will have some custom variables.
|
|
|
|
|
Typically, the variable will be set like so:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :tangle no
|
|
|
|
|
(setq-default dotspacemacs-configuration-layers
|
|
|
|
|
'(emacs-lisp
|
|
|
|
|
helm
|
|
|
|
|
multiple-cursors
|
|
|
|
|
org
|
|
|
|
|
(shell :variables shell-default-height
|
|
|
|
|
30 shell-default-position 'bottom)
|
|
|
|
|
treemacs))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
# Don’t delete this code block, it wraps the layers
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :exports none
|
|
|
|
|
(setq-default dotspacemacs-configuration-layers '(
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Checkers
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-04664b1a-8138-4566-8b63-8050437351a7
|
|
|
|
|
:END:
|
|
|
|
|
The two first checkers I use are for spell and syntax checking.
|
|
|
|
|
~spell-checking~ is disabled by default, however it should auto-detect the
|
|
|
|
|
dictionary to use.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(spell-checking :variables
|
|
|
|
|
spell-checking-enable-by-default nil
|
|
|
|
|
spell-checking-enable-auto-dictionary t)
|
|
|
|
|
syntax-checking
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Completion
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-fc18dd98-1411-4516-a87c-6c1047d2a13c
|
|
|
|
|
:END:
|
|
|
|
|
~auto-completion~ is a layer enabled in order to provide auto-completion to
|
|
|
|
|
all supported language layers. It is set so that the =RET= key has no
|
|
|
|
|
behavior with this layer, however the =TAB= key cycles between candidates
|
|
|
|
|
displayed by the auto-completion toolbox. I also want the autocompletion to
|
|
|
|
|
include snippets in the popup, and the content of the popup is sorted by
|
|
|
|
|
usage. It is also disabled for two modes: magit and Org.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(auto-completion :variables
|
|
|
|
|
auto-completion-complete-with-key-sequence-delay 0.2
|
|
|
|
|
auto-completion-enable-help-tooltip 'manual
|
|
|
|
|
auto-completion-enable-snippets-in-popup t
|
|
|
|
|
auto-completion-enable-sort-by-usage t
|
|
|
|
|
:disabled-for
|
|
|
|
|
org
|
|
|
|
|
git)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
~helm~ is also enabled, with its header disabled.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(helm :variables helm-no-header t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Email
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-0db2333c-86bf-4b41-8226-da66885fce36
|
|
|
|
|
:END:
|
|
|
|
|
As described below, I use Gnus as my main email client. Therefore, I have
|
|
|
|
|
the gnus layer enabled:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
gnus
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Emacs
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-ad6174a6-4056-420e-9620-3da5f00bd3fc
|
|
|
|
|
:END:
|
|
|
|
|
The first layer enabled in this category is ~better-defaults~. I also made
|
|
|
|
|
it so that when a command equivalent to ~C-a~ or ~C-e~ is pressed, the
|
|
|
|
|
cursor will respectively first move to the beginning of code first before
|
|
|
|
|
going past the indentation and to the end of the code before going to the
|
|
|
|
|
end of the line before going over the end of the comments on the same line.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(better-defaults :variables
|
|
|
|
|
better-defaults-move-to-beginning-of-code-first t
|
|
|
|
|
better-defaults-move-to-end-of-code-first t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
I also enabled ~ibuffer~ and made it so that buffers are sorted by projects.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(ibuffer :variables
|
|
|
|
|
ibuffer-group-buffers-by 'projects)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Most important of all, the ~org~ layer is also enabled. I enabled support
|
|
|
|
|
for Epub exports, Github, Reveal.JS exports, and sticky headers. Project
|
|
|
|
|
support is also enabled through files named ~TODOs.org~. I also set the
|
|
|
|
|
org-download folder for images in =~/Pictures/org/=, and I set the =RET= key
|
|
|
|
|
to follow org links if the cursor is on one.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(org :variables
|
|
|
|
|
org-enable-epub-support t
|
|
|
|
|
org-enable-github-support t
|
|
|
|
|
org-enable-reveal-js-support t
|
|
|
|
|
org-enable-sticky-header t
|
|
|
|
|
org-enable-org-journal-support t
|
|
|
|
|
spaceline-org-clock-p t
|
|
|
|
|
org-projectile-file "TODOs.org"
|
|
|
|
|
org-download-image-dir "~/Pictures/org/"
|
|
|
|
|
org-return-follows-link t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
The ~semantic~ layer is also enabled.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
semantic
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** File trees
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-35f135ac-45cd-4e91-a23d-41700dc7495f
|
|
|
|
|
:END:
|
|
|
|
|
In this category, I only enabled one layer: ~treemacs~. In this layer, I set
|
|
|
|
|
is so that treemacs syncs with my current buffer, and it automatically
|
|
|
|
|
refreshes its buffer when there is a change in the part of the file system
|
|
|
|
|
shown by treemacs.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(treemacs :variables
|
|
|
|
|
treemacs-use-follow-mode t
|
|
|
|
|
treemacs-use-filewatch-mode t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Fonts
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-7a0a7d6d-6caa-4504-acf6-f97c25436ef1
|
|
|
|
|
:END:
|
|
|
|
|
In this category, again, one layer is enabled: ~unicode-fonts~. This layer
|
|
|
|
|
addssupport for the ~unicode-fonts~ package.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
unicode-fonts
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Fun
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-3aec0cda-50d5-4c31-a57e-4244a254a57f
|
|
|
|
|
:END:
|
|
|
|
|
In this category, I only enabled two layers: ~selectric~ and ~xkcd~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
selectric xkcd
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Internationalization
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-0edb1ff3-15a1-46cd-b980-7fdd124020b6
|
|
|
|
|
:END:
|
|
|
|
|
In this category, I enabled the ~keyboard-layout~ layer to enable
|
|
|
|
|
compatibility with the bépo layout. This layer, however, is disabled for
|
|
|
|
|
magit, Dired and eww.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(keyboard-layout :variables
|
|
|
|
|
kl-layout 'bepo
|
|
|
|
|
kl-disabled-configurations '(magit dired eww))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Programming languages
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-9dd88370-a959-4266-a01e-2231f9008a1f
|
|
|
|
|
:END:
|
|
|
|
|
**** Domain-specific (DSLs)
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-c212d89f-6854-48f3-84a5-8195811bfc4d
|
|
|
|
|
:END:
|
|
|
|
|
In this category, I enabled support for the R programming language (the
|
|
|
|
|
~ess~ layer), the ~major-modes~ layer for the Arch Linux PKGBUILDs support,
|
|
|
|
|
the ~prolog~, ~emacs-lisp~ and ~scheme~ layers, support for the CSV format
|
|
|
|
|
with the ~csv~ layer, the ~yaml~ language, shell scripting languages and
|
|
|
|
|
support for the ~dot~ tool with the ~graphviz~ layer.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
ess major-modes prolog emacs-lisp scheme graphviz yaml shell-scripts
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
I also added support for HTML and CSS with the ~html~ layer, with the web
|
|
|
|
|
formatting tool set to ~web-beautify~, and the LSP layer compatibility
|
|
|
|
|
enabled for CSS, less, SCSS and HTML.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(html :variables
|
|
|
|
|
web-fmt-tool 'web-beautify
|
|
|
|
|
css-enable-lsp t
|
|
|
|
|
less-enable-lsp t
|
|
|
|
|
scss-enable-lsp t
|
|
|
|
|
html-enable-lsp t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
The ~json~ layer is also enabled, with the format tool set to
|
|
|
|
|
~web-beautify~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(json :variables
|
|
|
|
|
json-fmt-tool 'web-beautify)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
The LaTeX layer has also been enabled, with its default compiler set to
|
|
|
|
|
XeLaTeX. I also enabled the auto-fill feature, the folding capacity and the
|
|
|
|
|
“magic” symbols.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(latex :variables
|
|
|
|
|
latex-build-command "xelatex"
|
|
|
|
|
latex-enable-auto-fill t
|
|
|
|
|
latex-enable-folding t
|
|
|
|
|
latex-enable-magic t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
The Markdown layer has been enabled, with support for live preview with
|
|
|
|
|
~vmd~, and and automatic MMM-mode generation for C, C++, Python, Rust and
|
|
|
|
|
Emacs Lisp.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(markdown :variables
|
|
|
|
|
markdown-live-preview-engine 'vmd
|
|
|
|
|
markdown-mmm-auto-modes '("c"
|
|
|
|
|
"c++"
|
|
|
|
|
"python"
|
|
|
|
|
"rust"
|
|
|
|
|
("elisp" "emacs-lisp")))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
**** Frameworks
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-ac43dd9a-5a2f-4a80-bb35-535ec6e31e72
|
|
|
|
|
:END:
|
|
|
|
|
Only one framework support has been enabled so far, and is is for the
|
|
|
|
|
Django framework.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
django
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
**** General-purpose
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-9d41427d-ec93-40c6-8c24-113c5b174fc3
|
|
|
|
|
:END:
|
|
|
|
|
Among the layers I activated, the only one without any specific
|
|
|
|
|
configuration is the ~asm~ layer for the Assembly language.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
asm
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Next, you can find the C/C++ layer for which I set the default language for
|
|
|
|
|
~.h~ files to be C. I also enabled support for the C++11 standard, the
|
|
|
|
|
Google coding style for C++, support for subprojects and organization of
|
|
|
|
|
the include directives on a file save. I also set a couple of LSP-related
|
|
|
|
|
variables, such as the LSP executable for C/C++ for its CCLS backend and
|
|
|
|
|
some highlight variables.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(c-c++ :variables
|
|
|
|
|
c-c++-default-mode-for-headers 'c-mode
|
|
|
|
|
c-c++-adopt-subprojects t
|
|
|
|
|
c-c++-enable-google-style t
|
|
|
|
|
c-c++-enable-c++11 t
|
|
|
|
|
c-c++-backend 'lsp-ccls
|
|
|
|
|
c-c++-lsp-executable "/usr/bin/ccls"
|
|
|
|
|
c-c++-lsp-sem-highlight-method 'overlay
|
|
|
|
|
c-c++-lsp-sem-highlight-rainbow t
|
|
|
|
|
c++-enable-organize-includes-on-save t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Dart has also been enabled, with a custom path to the SDK of the Dart
|
|
|
|
|
server, and to the LSP server of Dart.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(dart :variables
|
|
|
|
|
dart-server-sdk-path "/opt/flutter/bin/cache/dart-sdk/"
|
|
|
|
|
lsp-dart-sdk-dir "/opt/flutter/bin/cache/dart-sdk/")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
When it comes to the Python layer, I set its backend and formatter to be
|
|
|
|
|
bound to the LSP layer. Its fill columnn was also set to 80 characters,
|
|
|
|
|
imports are sorted on save, and the tests can be run using either nose.el
|
|
|
|
|
or pytest.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(python :variables
|
|
|
|
|
python-backend 'lsp
|
|
|
|
|
python-sort-imports-on-save t
|
|
|
|
|
python-fill-column 80
|
|
|
|
|
python-test-runner '(pytest nose)
|
|
|
|
|
python-formatter 'lsp)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
With the Rust layer, the only custom configuration set is the backend being
|
|
|
|
|
bound to the LSP layer.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(rust :variables rust-backend 'lsp)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
As regards the JavaScript layer, I set its backend to the LSP layer, and
|
|
|
|
|
bound its format tool to ~web-beautify~ and its REPL is browser-based. I
|
|
|
|
|
also want to include ~node_modules/.bin~ to be automatically added to the
|
|
|
|
|
buffer local ~exec_path~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(javascript :variables
|
|
|
|
|
javascript-backend 'lsp
|
|
|
|
|
javascript-fmt-tool 'web-beautify
|
|
|
|
|
javascript-repl 'skewer
|
|
|
|
|
node-add-modules-path t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Readers
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-02099754-7102-4251-9e2e-a3ee33f4b469
|
|
|
|
|
:END:
|
|
|
|
|
In this category, only the ~epub~ and ~pdf~ layers are enabled so I can read
|
|
|
|
|
these files from Emacs directly.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
epub pdf
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Version control
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-53ebecc5-53da-4a0c-88f4-b031ff3b1952
|
|
|
|
|
:END:
|
|
|
|
|
Only the ~git~ layer is enabled in this category.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
git
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Themes
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-e593bbe4-d778-4b11-a450-4e6e418109fe
|
|
|
|
|
:END:
|
|
|
|
|
Here, the ~colors~ layer is the only one enabled. It activates support for
|
|
|
|
|
identifiers colorization, and strings representing colors.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
colors
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Tools
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-51f1d8a6-5f52-486a-a16b-301429cf8313
|
|
|
|
|
:END:
|
|
|
|
|
In this category, the first layer to be enabled is the CMake layer for which
|
|
|
|
|
I enabled support for the ~cmake-ide~ package.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(cmake :variables
|
|
|
|
|
cmake-enable-cmake-ide-support t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Next, we have the Docker, Nginx, Pass (the standard Unix password manager),
|
|
|
|
|
Prettier, Systemd, Imenu-list, Web-beautify, Dap, Helpful, and LSP layers
|
|
|
|
|
enabled.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
docker imenu-list nginx pass prettier systemd web-beautify helpful dap lsp
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
We also have the RestClient layer enabled for which I enabled the Org
|
|
|
|
|
compatibility support.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(restclient :variables
|
|
|
|
|
restclient-use-org t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
And finally, we also have the Shell layer for which I specified its default
|
|
|
|
|
height when spawning at the bottom of the screen should be 40 lines high,
|
|
|
|
|
and the default shell to invoke is Eshell.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(shell :variables
|
|
|
|
|
shell-default-height 40
|
|
|
|
|
shell-default-position 'bottom
|
|
|
|
|
shell-default-shell 'eshell)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Web Services
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-6ec58708-518c-44f4-8ad0-3fa3b58117d5
|
|
|
|
|
:END:
|
|
|
|
|
In this category, I have only enabled a layer for Twitter support.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
twitter
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Custom layers
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-f9c6b261-f06b-4fd5-bf4e-161cb8744aeb
|
|
|
|
|
:END:
|
|
|
|
|
Lastly, three custom layers have been enabled: a w3m layer, and two of my
|
|
|
|
|
custom layers for Dired and for conlanging tools.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
conlanging dired-phundrak w3m
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
# Don’t delete this code block, it wraps the layers
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :exports none
|
|
|
|
|
))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2020-01-15 18:04:55 +00:00
|
|
|
|
* Init
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-3f3c8a0b-56cd-4be6-b019-3ba6f1e24f96
|
|
|
|
|
:header-args:emacs-lisp: :comments link :tangle ~/.emacs.d/private/spacemacs-init.el :exports code
|
|
|
|
|
:END:
|
|
|
|
|
The ~dotspacemacs/init~ function is the one called at the very begining of the
|
|
|
|
|
Spacemacs startup, before any kind of configuration, including the layer
|
|
|
|
|
configuration. Only the values of the Spacemacs settings should be modified
|
|
|
|
|
here. By default, every values are set in a ~setq-default~ sexp, and they
|
|
|
|
|
represent all the supported Spacemacs settings. Hence, the function looks like
|
|
|
|
|
this:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :tangle no
|
|
|
|
|
(defun dotspacemacs/init ()
|
|
|
|
|
(setq-default
|
|
|
|
|
;; default Spacemacs configuration here
|
|
|
|
|
))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Emacs with pdumper
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-bb7c391e-3d0c-4c3c-99d4-09a1cb20be43
|
|
|
|
|
:END:
|
|
|
|
|
It is possible to compile Emacs 27 from source with support for the portable
|
|
|
|
|
dumper, as shown in Spacemacs’ =EXPERIMENTAL.org= file. I do not use this
|
|
|
|
|
feature yet, as I am still on Emacs 26 provided from Arch Linux’s
|
|
|
|
|
repositories, so I’ll disable the Spacemacs support for this feature. The
|
|
|
|
|
default value of this variable is =nil=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-enable-emacs-pdumper nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
In case the support for pdumper was enabled, Spacemacs needs to know the name
|
|
|
|
|
of the Emacs executable which supports such a feature. The executable must be
|
|
|
|
|
in the user’s =PATH=. By default, the value of the variable is ="emacs"=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-emacs-pdumper-executable-file "emacs")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
And finally, we can name the Spacemacs dump file. This is the file that will
|
|
|
|
|
be created by the portable dumper in the cache directory under the =dumps=
|
|
|
|
|
sub-directory. To load it when starting Emacs, the parameter =--dump-file=
|
|
|
|
|
should be added when invoking Emacs 27.1 executable from the command line,
|
|
|
|
|
for instance:
|
|
|
|
|
#+BEGIN_SRC sh :tangle no :exports code
|
|
|
|
|
./emacs --dump-file=~/.emacs.d/.cache/dumps/spacemacs.pdmp
|
|
|
|
|
#+END_SRC
|
|
|
|
|
The default value of this variable is ="spacemacs.pdmp"=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-emacs-dumper-dump-file "spacemacs.pdmp")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Package managment and updates
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-8573bacc-4372-49e3-a0ff-4520fe999c97
|
|
|
|
|
:END:
|
|
|
|
|
Spacemacs’ core configuration can be updated via git commands using Github
|
|
|
|
|
services. If Spacemacs is not set to the =develop= branch, it can check by
|
|
|
|
|
itself if any update is available. However, I am using said branch, therefore
|
|
|
|
|
I should set this variable to =nil=. The default value is =nil=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-check-for-update nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
When it comes to package management, Spacemacs is able to store them in
|
|
|
|
|
different directories depending on the version of Emacs used or based on
|
|
|
|
|
other variables. I personally prefer to use the value =emacs-version= since
|
|
|
|
|
it makes it easier to upgrade or downgrade Emacs without any conflict with
|
|
|
|
|
the already installed packages. The default value is =emacs-version=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-elpa-subdirectory 'emacs-version)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Spacemacs has a capacity of performing rollbacks after updates. We can set
|
|
|
|
|
the maximum number of rollback slots to keep in the cache. The default value
|
|
|
|
|
is =5=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-max-rollback-slots 5)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Elpa repository
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-ac64233a-5c7a-41f4-98b5-ce838b33ba44
|
|
|
|
|
:END:
|
|
|
|
|
It is possible to ask Emacs to use an HTTPS connection when contacting the
|
|
|
|
|
Elpa whenever possible. This value should be set to =nil= when the user has
|
|
|
|
|
no way to contact the Elpa though HTTPS, otherwise it is strongly
|
|
|
|
|
recommended to let it set to =t=. This variable however has no effect if
|
|
|
|
|
Emacs is launched with the parameter =--insecure= which forces the value of
|
|
|
|
|
this variable to =nil=. The default value is =t=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-elpa-https t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
We can set a maximum amount of seconds which will represent the maximum
|
|
|
|
|
allowed time to contact the Elpa repository. By default, this setting is set
|
|
|
|
|
on =5=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-elpa-timeout 5)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Spacelpa repository
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-1f432881-39b2-4d60-862f-a1a95ebe4a58
|
|
|
|
|
:END:
|
|
|
|
|
The Spacelpa repository is a Spacemacs-specific package repository. It is
|
|
|
|
|
possible to use it as the primary source to install a locked version of a
|
|
|
|
|
package. If the below value is set to =nil=, then Spacemacs will install the
|
|
|
|
|
latest version of packages from MELPA. I personally don’t use it, so I let
|
|
|
|
|
it set to =nil=. The default value is =nil=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-use-spacelpa nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
If the below value is not =nil=, then the signature for the downloaded
|
|
|
|
|
Spacelpa packages must be verified.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-verify-spacelpa-archives t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Editing style
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-8a6bfe01-3e45-4189-9bde-70efbe9739ee
|
|
|
|
|
:END:
|
|
|
|
|
By default, Spacemacs encourages the use of evil-mode, which brings vim
|
|
|
|
|
keybinding in Emacs. Still, it has three different styles available:
|
|
|
|
|
- =vim=, which goes full evil-mode usage and most adapted to Emacs newcomers,
|
|
|
|
|
especially if they were used to vim before, with the use of a normal mode
|
|
|
|
|
and an insert mode.
|
|
|
|
|
- =emacs= which keeps an Emacs-like feel to the keybindings, without any
|
|
|
|
|
difference between an insert or normal mode.
|
|
|
|
|
- =hybrid= is a modification of the =vim= mode which brings the =emacs= style
|
|
|
|
|
in insert mode, but otherwise behaves like the =vim= style in normal mode.
|
|
|
|
|
This is the style I personally use.
|
|
|
|
|
The value can also be a list with the =:variables= keyword (similar to
|
|
|
|
|
layers). Check the editing styles section of the documentation for details on
|
|
|
|
|
available variables. The default value is =vim=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-editing-style '(hybrid :variables
|
|
|
|
|
hybrid-mode-enable-evilified-state t
|
|
|
|
|
hybrid-mode-default-state 'normal))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Spacemacs home configuration
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-6a78794e-9c0b-4390-99d5-55c5b13c8c5a
|
|
|
|
|
:END:
|
|
|
|
|
The value below specifies the startup banner of Spacemacs. The default value
|
|
|
|
|
is =official=, it displays the official Spacemacs logo. An integer value is
|
|
|
|
|
the index of text banner, =random= chooses a random text banner in the
|
|
|
|
|
=core/banners= directory. A string value must be a path to an image format
|
|
|
|
|
supported by your Emacs build. If the value is nil, then no banner is
|
|
|
|
|
displayed. The default value is =official=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-startup-banner 'official)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
On the Spacemacs homepage, a list of elements can also be shown, be it recent
|
|
|
|
|
files, projects, agenda items,… Each of the elements making up the list value
|
|
|
|
|
of the below variable are pairs in the form =(list-type . list-size)=. If the
|
|
|
|
|
value is =nil=, then it is disabled. The possible values for =list-type= are:
|
|
|
|
|
- =recents= :: displays recently opened files
|
|
|
|
|
- =bookmarks= :: displays saved bookmarks
|
|
|
|
|
- =projects= :: displays projectile projects recently opened
|
|
|
|
|
- =agenda= :: displays upcoming events from Org-mode agendas
|
|
|
|
|
- =todos= :: displays recent TODOs detected in projectile projects
|
|
|
|
|
The order in which they are set in the below list affects their order on the
|
|
|
|
|
Spacemacs startup page. List sikes may be =nil=, in which case
|
|
|
|
|
=spacemacs-buffer-startup-lists-length= takes effect.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-startup-lists '((recents . 15)
|
|
|
|
|
(projects . 15)))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
The below variable allows the startup page to respond to resize events. Its
|
|
|
|
|
default value is =t=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-startup-buffer-responsive t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Default major modes
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-8318ee22-ffaf-419a-a76b-41f327c23970
|
|
|
|
|
:END:
|
|
|
|
|
The below variable sets a default major mode for a new empty buffer. Possible
|
|
|
|
|
values are mode names such as =text-mode=, or =nil= to use Fundamental mode.
|
|
|
|
|
The default value is =text-mode=, but I prefer to use =org-mode= by default.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-new-empty-buffer-major-mode 'org-mode)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Similarly, the below variable sets the default mode for the scratch buffer.
|
|
|
|
|
Its default value is =text-mode=, but I also set it to use =org-mode= by
|
|
|
|
|
default.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-scratch-mode 'org-mode)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
By the way, it is possible to set a default message for the scratch buffer,
|
|
|
|
|
such as “Welcome to Spacemacs!”. I prefer to keep it clean. The default value
|
|
|
|
|
is =nil=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-initial-scratch-message nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Visual configuration
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-d7fe8e66-bfcd-43c4-81e5-fba433300b7b
|
|
|
|
|
:END:
|
|
|
|
|
*** Themes
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-013f84c3-92c6-453f-9229-98f0ad6ba884
|
|
|
|
|
:END:
|
|
|
|
|
Spacemacs makes it quite easy to use themes and organize them. The below
|
|
|
|
|
value is a list of themes, the first of the list is loaded when Spacemacs
|
|
|
|
|
starts. The user can press =SPC T n= to cycle to the next theme in the list.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-themes '(xresources doom-vibrant doom-nord spacemacs-dark
|
|
|
|
|
doom-one doom-opera doom-dracula doom-molokai
|
|
|
|
|
doom-peacock doom-sourcerer doom-spacegrey
|
|
|
|
|
kaolin-dark kaolin-aurora kaolin-bubblegum
|
|
|
|
|
kaolin-galaxy kaolin-mono-dark kaolin-temple
|
|
|
|
|
kaolin-valley-dark))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Emacs also makes use of themes for the Spaceline at the bottom of buffers.
|
|
|
|
|
Supported themes are:
|
|
|
|
|
- =spacemacs=
|
|
|
|
|
- =all-the-icons=
|
|
|
|
|
- =custom=
|
|
|
|
|
- =doom= (the one I use)
|
|
|
|
|
- =vim-powerline=
|
|
|
|
|
- =vanilla=
|
|
|
|
|
The first three are Spaceline themes. =doom= is the Doom-Emacs mode-line,
|
|
|
|
|
and =vanilla= is the default Emacs mode-line. =custom= is a user defined
|
|
|
|
|
theme, refer to Spacemacs’ =DOCUMENTATION.org= file for more info on how to
|
|
|
|
|
create your own Spaceline theme. Value can be a symbol or list with
|
|
|
|
|
additional properties. The default value is ='(spacemacs :separator wave
|
|
|
|
|
:separator-scale 1.5))=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-mode-line-theme '(doom
|
|
|
|
|
:separator wave
|
|
|
|
|
:separator-scale 1.0))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
It is also possible to color the cursor depending on which mode Spacemacs is
|
|
|
|
|
in, in order to mach the state color in GUI Emacs. The default value is =t=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-colorize-cursor-according-to-state t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
The below variable sets either the default font or a prioritized list of
|
|
|
|
|
fonts to be used by Emacs.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-default-font '("FiraCode Nerd Font Mono" :size 8.0
|
|
|
|
|
:weight normal
|
|
|
|
|
:width normal))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Other on-screen elements
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-fabead22-a4d0-4826-9ed1-37297810c30b
|
|
|
|
|
:END:
|
|
|
|
|
=which-key= is a helper which displays available keyboard shortcuts. This
|
|
|
|
|
variable sets in seconds the time Spacemacs should wait between a key press
|
|
|
|
|
and the moment =which-key= should be shown.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-which-key-delay 0.4)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
This variable sets =which-key='s frame position. Possible values are:
|
|
|
|
|
- =right=
|
|
|
|
|
- =bottom=
|
|
|
|
|
- =right-then-bottom=
|
|
|
|
|
=right-then-bottom= tries to display the frame to the right, but if there is
|
|
|
|
|
insufficient space it displays it at the bottom. The default value is
|
|
|
|
|
=bottom=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-which-key-position 'bottom)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
This controls where =switch-to-buffer= displays the buffer. If the value is
|
|
|
|
|
=nil=, =switch-to-buffer= displays the buffer in the current window even if
|
|
|
|
|
another same-purpose window is available. If non-nil, ~switch-to-buffer~
|
|
|
|
|
displays the buffer in a same-purpose window even if the buffer can be
|
|
|
|
|
displayed in the current window. The default value is =nil=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-switch-to-buffer-prefers-purpose nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
If this variable is 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= to boost the loading time. The default value is =t=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-loading-progress-bar t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
If the value is non-nil, Emacs will show the title of the transient states.
|
|
|
|
|
The default value is ~t~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-show-transient-state-title t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
If non-nil, this will show the color guide hint for transient state keys.
|
|
|
|
|
The default value is ~t~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-show-transient-state-color-guide t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
If non-nil, unicode symbols are displayed in the mode line. If you use Emacs
|
|
|
|
|
as a daemon and want unicode characters only in GUI set the value to quoted
|
|
|
|
|
~display-graphic-p~. The default value is ~t~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-mode-line-unicode-symbols
|
|
|
|
|
'display-graphic-p)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
If non-nil, smooth scrolling (native-scrolling) is enabled. Smooth scrolling
|
|
|
|
|
overrides the default behavior of Emacs which recenters point when it
|
|
|
|
|
reaches the top or bottom of the screen. The default value is ~t~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-smooth-scrolling t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
The following value controls the line number activation. If set to ~t~,
|
|
|
|
|
~relative~ or ~visual~ then line numbers are enabled in all ~prog-mode~ and
|
|
|
|
|
~text-mode~ derivatives. If set to ~relative~, line numbers are relative. If
|
|
|
|
|
set to ~visual~, line numbers are also relative, but only visual lines are
|
|
|
|
|
counted. For example, folded lines will not be counted and wrapped lines are
|
|
|
|
|
counted as multiple lines. This variable can also be set to a property list
|
|
|
|
|
for finer control:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :tangle no
|
|
|
|
|
'(:relative nil
|
|
|
|
|
:visual nil
|
|
|
|
|
:disabled-for-modes dired-mode
|
|
|
|
|
doc-view-mode
|
|
|
|
|
markdown-mode
|
|
|
|
|
org-mode
|
|
|
|
|
pdf-view-mode
|
|
|
|
|
text-mode
|
|
|
|
|
:size-limit-kb 1000)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
When used in a plist, ~visual~ takes precendence over ~relative~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-line-numbers '(:relative nil :enabled-for-modes prog-mode))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Select a scope to highlight delimiter. Possible values are:
|
|
|
|
|
- ~any~
|
|
|
|
|
- ~current~
|
|
|
|
|
- ~all~
|
|
|
|
|
- ~nil~
|
|
|
|
|
The default value is ~all~ (highlights any scope and emphasis the current
|
|
|
|
|
one).
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-highlight-delimiters 'all)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
After a certain amount of time in seconds, Spacemacs can zone-out. The
|
|
|
|
|
default value is ~nil~. I set it so Spacemacs zones out after 15 minutes.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-zone-out-when-idle 900)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Run ~spacemacs/prettify-org-buffer~ when visiting the ~README.org~ files of
|
|
|
|
|
Spacemacs. The default value is ~nil~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-pretty-docs nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Appearance of Emacs frames
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-deae54d7-5790-4c11-8640-573cd3824dbd
|
|
|
|
|
:END:
|
|
|
|
|
Starting from Emacs 24.4, it is possible to make the Emacs frame fullscreen
|
|
|
|
|
when Emacs starts up if the variable is set to a non-nil value. The default
|
|
|
|
|
value is =nil=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-fullscreen-at-startup nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
This variable is to be used if the user does not want to use native
|
|
|
|
|
fullscreen with ~spacemacs/toggle-fullscreen~. This disables for instance
|
|
|
|
|
the fullscreen animation under OSX. The default value is =nil=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-fullscreen-use-non-native nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
If you do not start Emacs in fullscreen at startup, you might want it to be
|
|
|
|
|
maximized by default. If the value for the variable below is set to be
|
|
|
|
|
non-nil, the frame will be maximized. This can only work if
|
|
|
|
|
~dotspacemacs-fullscreen-at-startup~ is set to ~nil~, and it is only
|
|
|
|
|
available from Emacs 24.4 onwards. The default value is ~nil~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-maximized-at-startup nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
If non-nil, the frame is undecorated when Emacs starts up. Combine this with
|
|
|
|
|
the variable ~dotspacemacs-maximized-at-startup~ in OSX to obtain borderless
|
|
|
|
|
fullscreen. The default value is ~nil~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-undecorated-at-startup nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
You can also set a transparency level for Emacs when you toggle the
|
|
|
|
|
transparency of the frame with ~toggle-transparency~. The value of the
|
|
|
|
|
transparency, going from 0 to 100 in increasing opacity, describes the
|
|
|
|
|
transparency level of a frame when it’s active or selected. The default
|
|
|
|
|
value is ~90~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-active-transparency 95)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Similarly, you can set a value from 0 to 100 in increasing opacity which
|
|
|
|
|
describes the transparency level of a frame when it’s inactive or
|
|
|
|
|
deselected. The default value is ~90~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-inactive-transparency 80)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
The variable below sets the format of frame title. You can use:
|
|
|
|
|
- ~%a~ :: the ~abbreviated-file-name~ or ~buffer-name~
|
|
|
|
|
- ~%t~ :: ~projectile-project-name~
|
|
|
|
|
- ~%I~ :: ~invocation-name~
|
|
|
|
|
- ~%S~ :: ~system-name~
|
|
|
|
|
- ~%U~ :: contents of ~$USER~
|
|
|
|
|
- ~%b~ :: buffer name
|
|
|
|
|
- ~%f~ :: visited file name
|
|
|
|
|
- ~%F~ :: frame name
|
|
|
|
|
- ~%s~ :: process status
|
|
|
|
|
- ~%p~ :: percent of buffer above top of window, or Top, Bot, or All
|
|
|
|
|
- ~%P~ :: percent of buffer above bottom of window, perhaps plus Top, or
|
|
|
|
|
Bot, or All
|
|
|
|
|
- ~%m~ :: mode name
|
|
|
|
|
- ~%n~ :: Narrow if appropriate
|
|
|
|
|
- ~%z~ :: mnemonics of buffer, terminal, and keyboard coding systems
|
|
|
|
|
- ~%Z~ :: like ~%z~, but including the end-of-line format
|
|
|
|
|
The default value is ~"%I@%S"~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-frame-title-format "%b (%m)")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Format specification for setting the icon title format. The default value is
|
|
|
|
|
~nil~, same as ~frame-title-format~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-icon-title-format nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Spacemacs leader keys and shortcuts
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-0bf00e10-d577-4133-91c6-39bdc96d847d
|
|
|
|
|
:END:
|
|
|
|
|
The below setting sets the Spacemacs leader key. By default, this is the
|
|
|
|
|
=SPC= key.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-leader-key "SPC")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Once the leader key has been pressed, it is possible to set another key in
|
|
|
|
|
order to call Emacs’ command =M-x=. By default, it is again the =SPC= key.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-emacs-command-key "SPC")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
It is also possible to invoke Vim Ex commands with the press of a key, and by
|
|
|
|
|
default it is the =:= key.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-ex-command-key ":")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
The below variable sets the leader key accessible in =emacs-state= and
|
|
|
|
|
=insert-state=:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-emacs-leader-key "M-m")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
The major mode leader key is a shortcut key which is the equivalent of
|
|
|
|
|
pressing =<leader> m=. Set it to =nil= to disable it. Its default value is
|
|
|
|
|
=,=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-major-mode-leader-key ",")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
In =emacs-state= and =insert-state=, the same major mode leader key can be
|
|
|
|
|
accessible from another shortcut, which by default is =C-M-m=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-major-mode-emacs-leader-key "C-M-m")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
These variables control whether separate commands are bound in the GUI to the
|
|
|
|
|
key pairs =C-i= and =TAB=, and =C-m= and =RET=. Setting it to a non-nil value
|
|
|
|
|
allows for separate commands under =C-i= and =TAB=, and =C-m= and =RET=. In
|
|
|
|
|
the terminal, these pairs are generally indistinguishable, so this only works
|
|
|
|
|
in the GUI. The default value is =nil=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-distinguish-gui-tab nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Layouts
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-7b84a553-6c54-431e-ad23-dfa26c8a334f
|
|
|
|
|
:END:
|
|
|
|
|
The variable belows sets the name of the default layout. Its default value is
|
|
|
|
|
="Default"=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-default-layout-name "Default")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
If non-nil, the default layout name is displayed in the mode-line. The
|
|
|
|
|
default value is =nil=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-display-default-layout nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
If non-nil, then the last auto saved layouts are resumed automatically upon
|
|
|
|
|
start. The default value is =nil=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-auto-resume-layouts nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
If non-nil, the layout name will be auto-generated when creating new layouts.
|
|
|
|
|
It only has an effect when using the “jump to layout by number” command. The
|
|
|
|
|
default value is =nil=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-auto-generate-layout-names nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Files-related settings
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-c3aa3e27-4c42-4607-98fa-6e4647247ed3
|
|
|
|
|
:END:
|
|
|
|
|
The below value sets the size in MB above which Spacemacs will prompt to open
|
|
|
|
|
the file literally in order to avoid preformance issues. Opening a file
|
|
|
|
|
literally means that no major or minor mode is active. The default value is
|
|
|
|
|
=1=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-large-file-size 5)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
This variable sets the location where to auto-save files. Possible values
|
|
|
|
|
are:
|
|
|
|
|
- =original= :: auto-saves files in-place
|
|
|
|
|
- =cache= :: auto-saves files in another file stored in the cache directory
|
|
|
|
|
- =nil= :: disables auto-saving.
|
|
|
|
|
The default value is =cache=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-auto-save-file-location 'original)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Emacs server
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-ca601390-7851-4c05-8021-18ca3eb48ac7
|
|
|
|
|
:END:
|
|
|
|
|
Emacs can be launched as a server if the following value is set to non-nil
|
|
|
|
|
and if one isn’t already running. The default value is ~nil~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-enable-server nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
You can also set a custom emacs server socket location. If the value is
|
|
|
|
|
~nil~, Emacs will use whatever the Emacs default is, otherwise a directory
|
|
|
|
|
path like ="~/.emacs.d/server"=. It has no effect if
|
|
|
|
|
~dotspacemacs-enable-server~ is ~nil~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-server-socket-dir nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
It is also possible to tell Emacs that the quit function should keep the
|
|
|
|
|
server open when quitting. The default value is ~nil~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-persistent-server t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Miscellaneous
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-69b80cd3-dc0c-405b-bd02-315821105922
|
|
|
|
|
:END:
|
|
|
|
|
This value changes the folding method of code blocks. The possible values are
|
|
|
|
|
either ~evil~, the default value, or ~origami~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-folding-method 'evil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
If non-nil, ~smartparens-strict-mode~ will be enabled in programming modes.
|
|
|
|
|
The default value is ~nil~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-smartparens-strict-mode nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
If non-nil, pressing the closing parenthesis ~)~ key in insert mode passes
|
|
|
|
|
over any automatically added closing parenthesis, bracket, quote, etc… This
|
|
|
|
|
can temporarily disabled by pressing ~C-q~ before ~)~. The default value is
|
|
|
|
|
~nil~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-smart-closing-parenthesis nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
List of search tool executable names. Spacemacs uses the first installed tool
|
|
|
|
|
of the list. Supported tools are:
|
|
|
|
|
- ~rg~
|
|
|
|
|
- ~ag~
|
|
|
|
|
- ~pt~
|
|
|
|
|
- ~ack~
|
|
|
|
|
- ~grep~
|
|
|
|
|
The default value is ~'("rg" "ag" "pt" "ack" "grep")~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-search-tools '("rg" "ag" "pt" "ack" "grep"))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Delete whitespace while saving buffer. Possible values are:
|
|
|
|
|
- ~all~ :: aggresively delete empty lines and long sequences of whitespace
|
|
|
|
|
- ~trailing~ :: only detele the whitespace at end of lines
|
|
|
|
|
- ~changed~ :: to delete only whitespace for changed lines
|
|
|
|
|
- ~nil~ :: disable cleanup
|
|
|
|
|
The default value is ~nil~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq-default dotspacemacs-whitespace-cleanup nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2020-01-14 20:10:21 +00:00
|
|
|
|
* User Initialization
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-e297b9be-9b0d-4c2d-bb6e-402f0d00be0d
|
2020-01-15 18:04:55 +00:00
|
|
|
|
:header-args:emacs-lisp: :comments link :tangle ~/.emacs.d/private/user-init.el :exports code
|
2020-01-14 20:10:21 +00:00
|
|
|
|
:END:
|
|
|
|
|
While Emacs and especially Spacemacs loads, I want it to initialize some
|
|
|
|
|
elements and load some packages. First of all, I want it to load my private
|
|
|
|
|
Emacs config file:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(load "~/.emacs.d/private/private_emacs.el")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Then, I want a couple of requires:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(require 'org-id)
|
|
|
|
|
(require 'package)
|
|
|
|
|
(require 'ox-latex)
|
|
|
|
|
(require 'ox-publish)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
I also want to load what’s in ~icons-in-terminal~ so I can use them in various
|
|
|
|
|
packages in Emacs:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(add-to-list 'load-path "~/.local/share/icons-in-terminal/")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
I would also like to enable the setup of flycheck for Rust when Flycheck is
|
|
|
|
|
loaded:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(add-hook 'flycheck-mode-hook #'flycheck-rust-setup)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
By default, Flyspell should be disabled and only enabled manually.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(flyspell-mode 0)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Finally, here is a quick workaround for Tramp, sometimes it cannot connect to
|
|
|
|
|
my hosts if I don’t have this code snippet.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq tramp-ssh-controlmaster-options
|
|
|
|
|
"-o ControlMaster=auto -o ControlPath='tramp.%%C' -o ControlPersist=no")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
* User Configuration
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-7a36d3a0-8bb6-4d9d-9402-eadbc49fef32
|
2020-01-15 18:04:55 +00:00
|
|
|
|
:header-args:emacs-lisp: :comments link :tangle ~/.emacs.d/private/user-config.el :exports code
|
2020-01-14 20:10:21 +00:00
|
|
|
|
:END:
|
2020-01-14 20:56:02 +00:00
|
|
|
|
** ASM configuration
|
2020-01-14 20:10:21 +00:00
|
|
|
|
:PROPERTIES:
|
2020-01-14 20:56:02 +00:00
|
|
|
|
:CUSTOM_ID: h-73c92790-872d-404d-b3b7-7a94fba4ef34
|
2020-01-14 20:10:21 +00:00
|
|
|
|
:END:
|
2020-01-14 20:56:02 +00:00
|
|
|
|
The first thing I will set with my ASM configuration is where the reference
|
|
|
|
|
PDF is located.
|
2020-01-14 20:10:21 +00:00
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
2020-01-14 20:56:02 +00:00
|
|
|
|
(setq x86-lookup-pdf "~/Documents/code/asm/Intelx86/325383-sdm-vol-2abcd.pdf")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
I will also modify what the comment character is, from a ~;~ to a ~#~:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq asm-comment-char ?\#)
|
2020-01-14 20:10:21 +00:00
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2020-01-14 20:56:02 +00:00
|
|
|
|
** C/C++
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-c0ee6b96-db28-408e-872a-4c4347f807d8
|
|
|
|
|
:END:
|
|
|
|
|
As the C/C++ syntax is checked by flycheck, let’s make sure we are using the
|
|
|
|
|
latest standard available, that is C++17 and C17, from Clang.
|
2020-01-14 20:10:21 +00:00
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
2020-01-14 20:56:02 +00:00
|
|
|
|
(add-hook 'c-mode-hook
|
|
|
|
|
(lambda ()
|
|
|
|
|
(setq flycheck-clang-language-standard "c17")))
|
|
|
|
|
(add-hook 'c++-mode-hook
|
|
|
|
|
(lambda ()
|
|
|
|
|
(setq flycheck-clang-language-standard "c++17")))
|
2020-01-14 20:10:21 +00:00
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Custom functions
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-e3766e6a-3b77-488d-8dfc-8489411b1c4f
|
|
|
|
|
:END:
|
|
|
|
|
In this section, I will put my various custom functions that do not fit in
|
|
|
|
|
other sections and which are more oriented towards general usage throughout
|
|
|
|
|
Emacs and in Elisp code.
|
|
|
|
|
|
|
|
|
|
Almost all of my code snippets will be prefixed by either my name or the name
|
|
|
|
|
of the package or layer they are part of, unless they are an explicit
|
|
|
|
|
overwrite of a function that already exists.
|
|
|
|
|
|
|
|
|
|
*** ~phundrak/fill-paragraph~
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-e87c6c3f-728d-4065-a886-70eb2c3cc579
|
|
|
|
|
:END:
|
|
|
|
|
This function was created in order to bind to another keyboard shortcut the
|
|
|
|
|
already existing ~C-u M-q~ which I cannot type with evil-mode unless I’m in
|
|
|
|
|
insert mode.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(defun phundrak/fill-paragraph ()
|
|
|
|
|
(interactive)
|
|
|
|
|
(let* ((current-prefix-arg 4))
|
|
|
|
|
(call-interactively 'fill-paragraph)))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** ~terminal-here-default-terminal-command~
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-4e7c3229-4baa-47d5-8897-545a8b85800a
|
|
|
|
|
:END:
|
|
|
|
|
This function is actually an overwrite of the default one which apparently
|
|
|
|
|
does not work on my machine. This function is called by
|
|
|
|
|
~terminal-here-launch~ and spawns an external terminal emulator in the
|
|
|
|
|
directory emacs was in when the terminal was invoked. I simply point out to
|
|
|
|
|
this function the name of my terminal emulator. Here is the code:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(defun terminal-here-default-terminal-command (_dir)
|
|
|
|
|
'("st"))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Dart configuration
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-00537655-3c5f-4cc0-af90-4f357ba9350f
|
|
|
|
|
:END:
|
|
|
|
|
For Dart, I mainly declared some custom shortcuts bound to ~dart-mode~
|
|
|
|
|
related to flutter, so nothing too exciting here. Some prefix are declared in
|
|
|
|
|
order to avoid the shortcuts in helm to show up as just ~custom~.
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
(spacemacs/declare-prefix-for-mode 'dart-mode "o" "user-defined")
|
|
|
|
|
(spacemacs/declare-prefix-for-mode 'dart-mode "of" "flutter")
|
|
|
|
|
(spacemacs/declare-prefix-for-mode 'dart-mode "ofr" "flutter-run")
|
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
|
|
Now, for the shortcuts themselves:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(spacemacs/set-leader-keys-for-major-mode 'dart-mode
|
|
|
|
|
"ofH" 'flutter-hot-restart
|
|
|
|
|
"ofh" 'flutter-hot-reload
|
|
|
|
|
"ofq" 'flutter-quit
|
|
|
|
|
"ofr" (lambda () (interactive) (flutter-run "-v"))
|
|
|
|
|
"ofs" 'flutter-screenshot)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2020-01-14 20:56:02 +00:00
|
|
|
|
** Dired
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-1214442f-4dc7-4855-90ba-bb23d59af2c9
|
|
|
|
|
:END:
|
|
|
|
|
When it comes to dired, I chose do modify some elements on how things are
|
|
|
|
|
sorted and shown, but there isn’t much configuration. First, I want to always
|
|
|
|
|
copy folders in a recursive way, no questions asked.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq dired-recursive-copies 'always)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Also, when I have two Dired buffers opened side by side, I generally want
|
|
|
|
|
them to interact, for example if I want to move something around. So, let’s
|
|
|
|
|
tell Emacs that:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq dired-dwim-target t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Finally, let’s tell Dired how to sort the elements to be displayed:
|
|
|
|
|
directories first, non-hidden first.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq dired-listing-switches "-ahl --group-directories-first")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
By the way, let’s enable ~org-download~ when we are in a Dired buffer:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(add-hook 'dired-mode-hook 'org-download-enable)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2020-01-14 20:10:21 +00:00
|
|
|
|
** Emacs Lisp
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-f087976e-3350-46c7-a269-f90c83f60d64
|
|
|
|
|
:END:
|
|
|
|
|
Here will be stored my configuration directly related to Emacs Lisp,
|
|
|
|
|
including some functions or default modes.
|
|
|
|
|
|
|
|
|
|
*** Enable ~eldoc-mode~ by default
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-ef91e851-f0f2-4fe6-a1ee-b1556a17761c
|
|
|
|
|
:END:
|
|
|
|
|
By default, if some Elisp code is opened, I want to enable ~eldoc-mode~ so I
|
|
|
|
|
can easily get some documentation on the symbols in the source code. This is
|
|
|
|
|
done via the use of hooks.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(add-hook 'prog-mode-hook 'eldoc-mode)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** ~phundrak/write-to-buffer~
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-3f3b771e-a4dd-42fd-bf97-8930d20c0a86
|
|
|
|
|
:END:
|
|
|
|
|
I was very surprised when I discovered no such function exists in Elisp.
|
|
|
|
|
This function basically writes a string into a buffer, and optionally
|
|
|
|
|
switches the user to the buffer. Here is the code for that function:
|
|
|
|
|
#+BEGIN_SRC elisp
|
|
|
|
|
(defun write-to-buffer (input-string outputbuf &optional switchbuf)
|
|
|
|
|
"Writes `input-string' to the specified `output-buffer'. If
|
|
|
|
|
`switch-buffer' is non-nil, the active buffer will switch to the
|
|
|
|
|
output buffer; otherwise, it will take the user back to their
|
|
|
|
|
initial buffer. Works with `input-string' as a string or a list
|
|
|
|
|
of strings."
|
|
|
|
|
(let ((oldbuf (current-buffer)))
|
|
|
|
|
(switch-to-buffer outputbuf)
|
|
|
|
|
(cond ((char-or-string-p input-string) (insert input-string))
|
|
|
|
|
((listp input-string) (dolist (elem input-string)
|
|
|
|
|
(insert (format "%s\n" elem)))))
|
|
|
|
|
(if switchbuf
|
|
|
|
|
(switch-to-buffer oldbuf))))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2020-01-14 20:56:02 +00:00
|
|
|
|
** Eshell
|
2020-01-14 20:10:21 +00:00
|
|
|
|
:PROPERTIES:
|
2020-01-14 20:56:02 +00:00
|
|
|
|
:CUSTOM_ID: h-846478af-19e5-4e06-a97b-0886062d32c7
|
2020-01-14 20:10:21 +00:00
|
|
|
|
:END:
|
2020-01-14 20:56:02 +00:00
|
|
|
|
Eshell is a built-in shell available from Emacs which I use almost as often
|
|
|
|
|
as Fish. Some adjustments are necessary for making this shell usable for me.
|
2020-01-14 20:10:21 +00:00
|
|
|
|
|
2020-01-14 20:56:02 +00:00
|
|
|
|
*** Environment variables
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-f88fac3c-5bf1-452b-93f2-1f68436f2302
|
|
|
|
|
:END:
|
|
|
|
|
Some environment variables need to be correctly set so Eshell can correctly
|
|
|
|
|
work. The first environment variable to be set is the ~PATH~, as I have a
|
|
|
|
|
couple of directories where executables are located. Let’s add them to our
|
|
|
|
|
path.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setenv "PATH"
|
|
|
|
|
(concat
|
|
|
|
|
(getenv "HOME") "/.pub-cache/bin"
|
|
|
|
|
":" (getenv "HOME") "/.local/bin"
|
|
|
|
|
":" (getenv "HOME") "/go/bin"
|
|
|
|
|
":" (getenv "HOME") "/.cargo/bin"
|
|
|
|
|
":" (getenv "HOME") "/.gem/ruby/2.6.0/bin"
|
|
|
|
|
":" (getenv "PATH")))
|
|
|
|
|
#+END_SRC
|
2020-01-14 20:10:21 +00:00
|
|
|
|
|
2020-01-14 20:56:02 +00:00
|
|
|
|
I would also like to set two environment variables related to Dart
|
|
|
|
|
development: the ~DART_SDK~ and ~ANDROID_HOME~ variables.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setenv "DART_SDK" "/opt/dart-sdk/bin")
|
|
|
|
|
(setenv "ANDROID_HOME" (concat (getenv "HOME") "/Android/Sdk/"))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Finally, I’d like to add a custom directory to the ~PKG_CONFIG_PATH~:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setenv "PKG_CONFIG_PATH" (concat
|
|
|
|
|
"/usr/local/lib/pkgconfig/" ":"
|
|
|
|
|
(getenv "PKG_CONFIG_PATH")))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Custom functions
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-8c921fc7-6b55-4829-92cd-133131f1e5f8
|
|
|
|
|
:END:
|
|
|
|
|
When I’m in Eshell, sometimes I wish to open multiple files at once in
|
|
|
|
|
Emacs. For this, when I have several arguments for ~find-file~, I want to be
|
|
|
|
|
able to open them all at once. Let’s modify ~find-file~ like so:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(defadvice find-file (around find-files activate)
|
|
|
|
|
"Also find all files within a list of files. This even works recursively."
|
|
|
|
|
(if (listp filename)
|
|
|
|
|
(loop for f in filename do (find-file f wildcards))
|
|
|
|
|
ad-do-it))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
I also want to be able to have multiple instances of Eshell opened at once.
|
|
|
|
|
For that, I declared the function ~eshell-new~ that does exactly that.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(defun eshell-new()
|
|
|
|
|
"Open a new instance of eshell."
|
|
|
|
|
(interactive)
|
|
|
|
|
(eshell 'N))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Aliases
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-7e11a04b-4387-4a62-af00-5d402814acac
|
|
|
|
|
:END:
|
|
|
|
|
Just like most shells, it is possible to declare in Eshell aliases. First, I
|
|
|
|
|
would like to be able to use ~open~ to open files in Emacs:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(defalias 'open 'find-file)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
I also have ~openo~ which allows me to perform the same action, but in
|
|
|
|
|
another window:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(defalias 'openo 'find-file-other-window)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
The function ~yes-or-no-p~ is also aliased to ~y-or-n-p~ so I only have to
|
|
|
|
|
answer by ~y~ or ~n~ instead of typing ~yes~ or ~no~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(defalias 'yes-or-no-p 'y-or-n-p)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
For some ease of use, I’ll also declare ~list-buffers~ as an alias of
|
|
|
|
|
~ibuffer~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(defalias 'list-buffers 'ibuffer)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Visual commands
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-b276c491-58ba-43a2-898f-1d65aad0df89
|
|
|
|
|
:END:
|
|
|
|
|
With Eshell, some commands don’t work very well, especially commands that
|
|
|
|
|
create a TUI. So, let’s declare them as visual commands or subcommands:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq eshell-visual-commands
|
|
|
|
|
'("fish" "zsh" "bash" "tmux" "htop" "top" "vim" "bat" "nano")
|
|
|
|
|
eshell-visual-subcommands
|
|
|
|
|
'("git" "log" "l" "diff" "show"))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Eshell theme
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-83cff5d6-d77c-40af-ba49-80e5c84ff581
|
|
|
|
|
:END:
|
|
|
|
|
As with most shells, again, it is possible to customize the appearance of
|
|
|
|
|
the Eshell prompt. First, we need to declare a macro so we can set a face
|
|
|
|
|
with properties:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(defmacro with-face (str &rest properties)
|
|
|
|
|
`(propertize ,str 'face (list ,@properties)))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Now, let’s declare a function that will abbreviate the current ~pwd~
|
|
|
|
|
fish-shell style.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(defun eshell/abbr-pwd ()
|
|
|
|
|
(let ((home (getenv "HOME"))
|
|
|
|
|
(path (eshell/pwd)))
|
|
|
|
|
(cond
|
|
|
|
|
((string-equal home path) "~")
|
|
|
|
|
((f-ancestor-of? home path) (concat "~/" (f-relative path home)))
|
|
|
|
|
(path))))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Now, let’s declare our prompt:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(defun eshell/my-prompt ()
|
|
|
|
|
(let ((header-bg "#161616"))
|
|
|
|
|
(concat
|
|
|
|
|
(with-face (eshell/abbr-pwd) :foreground "#008700")
|
|
|
|
|
"\n"
|
|
|
|
|
(if (= (user-uid) 0)
|
|
|
|
|
(with-face "➜" :foreground "red")
|
|
|
|
|
(with-face "➜" :foreground "#2345ba"))
|
|
|
|
|
" ")))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Now, let’s declare our prompt regexp and our prompt functions:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq eshell-prompt-regexp "^[^#$\n]*[#$] "
|
|
|
|
|
eshell-prompt-function 'eshell/my-prompt)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Finally, let’s declare the theme of our shell:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(eshell-git-prompt-use-theme 'powerline)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** File extensions
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-beb67a88-d7d3-4d58-bbc7-7a7be67f64aa
|
|
|
|
|
:END:
|
|
|
|
|
Sometimes, Emacs doesn’t recognize or misrecognizes some extensions,
|
|
|
|
|
resulting in a wrong mode set for said file. Let’s fix that by associating
|
|
|
|
|
the extension with the desired mode:
|
2020-01-14 20:10:21 +00:00
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
2020-01-14 20:56:02 +00:00
|
|
|
|
(dolist (e '(("xml" . web-mode)
|
|
|
|
|
("xinp" . web-mode)
|
|
|
|
|
("aiml" . web-mode)
|
|
|
|
|
("C" . c++-mode)
|
|
|
|
|
("dconf" . conf-mode)
|
|
|
|
|
("yy" . bison-mode)
|
|
|
|
|
("ll" . flex-mode)
|
|
|
|
|
("s" . asm-mode)
|
|
|
|
|
("pl" . prolog-mode)
|
|
|
|
|
("l" . scheme-mode)
|
|
|
|
|
("vs" . glsl-mode)
|
|
|
|
|
("fs" . glsl-mode)))
|
|
|
|
|
(push (cons (concat "\\."
|
|
|
|
|
(car e)
|
|
|
|
|
"\\'") (cdr e))
|
|
|
|
|
auto-mode-alist))
|
2020-01-14 20:10:21 +00:00
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2020-01-14 20:56:02 +00:00
|
|
|
|
We also have a couple of extensions which should all be in ~conf-unix-mode~,
|
|
|
|
|
let’s indicate that to Emacs:
|
2020-01-14 20:10:21 +00:00
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
2020-01-14 20:56:02 +00:00
|
|
|
|
(dolist (e '("service" "timer" "target" "mount" "automount"
|
|
|
|
|
"slice" "socket" "path" "netdev" "network"
|
|
|
|
|
"link"))
|
|
|
|
|
(push (cons (concat "\\." e "\\'") 'conf-unix-mode)
|
|
|
|
|
auto-mode-alist))
|
2020-01-14 20:10:21 +00:00
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Gnus
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-fb05a405-110f-4e7e-a21d-b768615754cc
|
|
|
|
|
:END:
|
|
|
|
|
Here comes my Gnus configuration. Gnus is an email client I use daily to
|
|
|
|
|
read, manage, answer to and forward messages I receive by email.
|
|
|
|
|
|
|
|
|
|
*** Shortcuts
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-4715e44d-b95b-40d4-b79a-c7873d972b39
|
|
|
|
|
:END:
|
|
|
|
|
Some shortcuts needed to be redefined in order for Evil to work well with
|
|
|
|
|
Gnus. Here is first the declaration of a prefix:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(spacemacs/declare-prefix "og" "gnus")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
And here are said shortcuts. As described above in the [[#h-f193126f-abc1-4287-aa70-4f2080d2ef8f][shortcuts]] chapter,
|
|
|
|
|
these Spacemacs shortcuts are invoked with the ~SPC~ leader key.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(spacemacs/set-leader-keys
|
|
|
|
|
"ogD" 'turn-on-gnus-dired-mode
|
|
|
|
|
"ogd" 'gnus-summary-delete-article
|
|
|
|
|
"ogf" 'gnus-summary-mail-forward
|
|
|
|
|
"ogo" 'my-gnus-group-list-subscribed-groups
|
|
|
|
|
"ogr" 'gnus-summary-insert-new-articles
|
|
|
|
|
"ogs" 'message-send-and-exit)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Hooks
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-5208e53f-d2e7-4dc1-a081-964ac1c90d4b
|
|
|
|
|
:END:
|
|
|
|
|
To sort by topics my different mailboxes and folders, I use the
|
|
|
|
|
~gnus-topic-mode~ minor mode. To get it active by default, I use the
|
|
|
|
|
following hook to activate it:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Mail account configuration
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-eb1a12b5-38ef-4c81-9d6c-01c1e066feaa
|
|
|
|
|
:header-args:emacs-lisp: :comments link :tangle ~/.gnus.el
|
|
|
|
|
:END:
|
|
|
|
|
This section will be tangled in =~/.gnus.el=.
|
|
|
|
|
|
|
|
|
|
I only use one email account with Gnus: ~lucien@phundrak.com~. Here is how I
|
|
|
|
|
configured it:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq gnus-secondary-select-methods '((nnimap "lucien@phundrak.com"
|
|
|
|
|
(nnimap-address "mail.phundrak.com")
|
|
|
|
|
(nnimap-server-port 143)
|
|
|
|
|
(nnimap-stream starttls)))
|
|
|
|
|
message-send-mail-function 'smtpmail-send-it
|
|
|
|
|
smtpmail-smtp-server "mail.phundrak.com"
|
|
|
|
|
smtpmail-stream-type 'starttls
|
|
|
|
|
smtpmail-smtp-service 587
|
|
|
|
|
gnus-message-archive-method '(nnimap "mail.phundrak.com")
|
|
|
|
|
gnus-message-archive-group "Sent"
|
|
|
|
|
nnml-directory "~/Mails"
|
|
|
|
|
message-directory "~/Mails"
|
|
|
|
|
gnus-fetch-old-headers 'some
|
|
|
|
|
mm-discouraged-alternatives '("text/html" "text/richtext"))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** General options
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-336a2c1c-ed8d-4a90-b4a3-6422a0199ba0
|
|
|
|
|
:header-args:emacs-lisp: :comments link :tangle ~/.gnus.el
|
|
|
|
|
:END:
|
|
|
|
|
This section will be tangled in =~/.gnus.el=.
|
|
|
|
|
|
|
|
|
|
I want to use at one point the [[https://www.emacswiki.org/emacs/EmacsApplicationFramework][Emacs Application Framework]] which is set to
|
|
|
|
|
be able one day to render Gnus emails, but for now I am using w3m to render
|
|
|
|
|
HTML emails I receive.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq mm-text-html-renderer 'w3m)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
I also want Gnus to use the cache in case I need to navigate my emails
|
|
|
|
|
offline:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq gnus-use-cache t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Let’s set a quick organization of the Gnus folders, the format in which sent
|
|
|
|
|
messages should be saved, and the typology of Gnus’ topics:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(eval-after-load 'gnus-topic
|
|
|
|
|
'(progn
|
|
|
|
|
(setq gnus-message-archive-group '((format-time-string "sent.%Y")))
|
|
|
|
|
(setq gnus-topic-topology '(("Gnus" visible)
|
|
|
|
|
(("lucien@phundrak.com" visible nil nil))))
|
|
|
|
|
(setq gnus-topic-alist '(("lucien@phundrak.com" ; the key of the topic
|
|
|
|
|
"nnimap+lucien@phundrak.com:INBOX"
|
|
|
|
|
"nnimap+lucien@phundrak.com:Sent"
|
|
|
|
|
"nnimap+lucien@phundrak.com:Drafts")
|
|
|
|
|
("Gnus")))))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Visual configuration
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-8ccda149-c755-4c80-8643-7a9b99ee85b2
|
|
|
|
|
:header-args:emacs-lisp: :comments link :tangle ~/.gnus.el
|
|
|
|
|
:END:
|
|
|
|
|
This section will be tangled in =~/.gnus.el=.
|
|
|
|
|
|
|
|
|
|
I get it that it used to be a good option with 4/3 screens, but frankly
|
|
|
|
|
opening an email at the bottom of the frame instead of the side of the frame
|
|
|
|
|
does not look good anymore. So, let’s fix that:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(gnus-add-configuration
|
|
|
|
|
'(article (horizontal 1.0 (summary .4 point) (article 1.0))))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** LSP
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-4d0272c3-df5e-4f6b-a6e6-f769add4e603
|
|
|
|
|
:END:
|
|
|
|
|
When it comes to the LSP layer, there are some options which are not enabled
|
|
|
|
|
by default that I want to use, especially some modes I want to take advantage
|
|
|
|
|
of. This is why I enable first the ~lsp-treemacs-sync-mode~ so treemacs is
|
|
|
|
|
LSP aware:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(lsp-treemacs-sync-mode 1)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
I also enable some layers related to ~dap~, the Debug Adapter Protocol, which
|
|
|
|
|
works really nicely with LSP. Let’s enable Dap’s modes:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(dap-mode 1)
|
|
|
|
|
(dap-ui-mode 1)
|
|
|
|
|
(dap-tooltip-mode 1)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Finally, I also want the documentation tooltip to show up when the cursor is
|
|
|
|
|
above a documented piece of code or symbol. Let’s enable that too:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(tooltip-mode 1)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2020-01-14 20:56:02 +00:00
|
|
|
|
** Miscellaneous
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-cee08965-745a-4a6f-b04e-bf1638342698
|
|
|
|
|
:END:
|
|
|
|
|
I have a lot of variables that need to be set but don’t fall in any other
|
|
|
|
|
category, so I’ll collect them here.
|
|
|
|
|
|
|
|
|
|
I have this regexp for detecting paragraphs.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq paragraph-start "\f\\|[ \t]*$\\|[ \t]*[-+*] ")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Evil
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-1d889318-8b93-4e78-9fe4-9e751b0b1cbe
|
|
|
|
|
:END:
|
|
|
|
|
As a user of Evil, I’m sometimes pissed when I accidentally press ~C-u~ and
|
|
|
|
|
it gets me to the top of the document. So, let’s disable it:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq evil-want-C-u-scroll nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Default modes
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-3ac59b6b-4ea3-4270-bdf2-07a68b867ebc
|
|
|
|
|
:END:
|
|
|
|
|
Some buffers sometimes won’t have a default mode at all, such as the
|
|
|
|
|
~*scratch*~ buffer. In any vanilla configuration, they will then default to
|
|
|
|
|
~text-mode~. I personally prefer ~org-mode~ to be my default mode, so let’s
|
|
|
|
|
set it so!
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq edit-server-default-major-mode 'org-mode)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
I also want to have by default some aggressive indentation in my source
|
|
|
|
|
files. Let’s enable that:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(global-aggressive-indent-mode 1)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
However, I do not wish to see it activated for Dart mode, so let’s exclude
|
|
|
|
|
it:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(add-to-list 'aggressive-indent-excluded-modes 'dart-mode)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Hooks
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-a895c541-505f-4dc2-8eac-d1fbc45e2512
|
|
|
|
|
:END:
|
|
|
|
|
I also have some hooks I use for enabling some major and minor modes. The
|
|
|
|
|
first one here allows the execution of the deletion of trailing space each
|
|
|
|
|
time I save a file.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(add-hook 'before-save-hook 'delete-trailing-whitespace)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
I also want to always be in ~visual-line-mode~ so Emacs soft-wraps lines
|
|
|
|
|
that are too long for the buffer they are displayed in.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(add-hook 'prog-mode-hook 'visual-line-mode)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
I also want for some non-programming modes to enable a hard-limit in terms
|
|
|
|
|
of how many characters can fit on one line. The modes that benefit from that
|
|
|
|
|
are ~message-mode~, ~org-mode~, ~text-mode~ and ~markdown-mode~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(mapc (lambda (x)
|
|
|
|
|
(add-hook x 'auto-fill-mode)
|
|
|
|
|
(add-hook x 'visual-line-mode))
|
|
|
|
|
'(message-mode-hook
|
|
|
|
|
org-mode-hook
|
|
|
|
|
text-mode-hook
|
|
|
|
|
markdown-mode-hook))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Pinentry
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-c69ca384-fb5b-49e9-9b0d-987da0df1d61
|
|
|
|
|
:END:
|
|
|
|
|
Pinentry should use the ~loopback~ mode when communicating with GnuPG. Let’s
|
|
|
|
|
set it so:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq epa-pinentry-mode 'loopback)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Prettified symbols
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-3b37d76b-8da4-4c06-adfc-0ccd04bbef18
|
|
|
|
|
:END:
|
|
|
|
|
Just because it is pleasing to the eye, some symbols in source code get
|
|
|
|
|
prettified into simpler symbols. Here is the list of symbols that are to be
|
|
|
|
|
prettified. You can see in the corresponding comment what symbol will be
|
|
|
|
|
displayed.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq prettify-symbols-alist '(("lambda" . 955) ; λ
|
|
|
|
|
("->" . 8594) ; →
|
|
|
|
|
("<->" . 8596) ; ↔
|
|
|
|
|
("<-" . 8592) ; ←
|
|
|
|
|
("=>" . 8658) ; ⇒
|
|
|
|
|
("<=>" . 8860) ; ⇔
|
|
|
|
|
("<=" . 8656) ; ⇐
|
|
|
|
|
("mapc" . 8614) ; ↦
|
|
|
|
|
("map" . 8614) ; ↦
|
|
|
|
|
(">>" . 187) ; »
|
|
|
|
|
("<<" . 171) ; «
|
|
|
|
|
))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Twittering mode
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-fb99695a-99f9-4c30-a286-a9accbb8410f
|
|
|
|
|
:END:
|
|
|
|
|
For ~twittering-mode~, a Twitter major mode for Emacs, I want to encrypt my
|
|
|
|
|
data using a master password, which I do thanks to this option:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq twittering-use-master-password t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Wttr.in cities
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-9d0208e7-f88f-4bba-a48a-e306d3f00939
|
|
|
|
|
:END:
|
|
|
|
|
Thanks to the wttrin package, I can get the weather forecast in Emacs for a
|
|
|
|
|
couple of cities. I just need to specify them to Emacs like so:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq wttrin-default-cities '("Aubervilliers" "Paris" "Lyon" "Nonières"
|
|
|
|
|
"Saint Agrève"))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2020-01-14 20:10:21 +00:00
|
|
|
|
** Nov-mode
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-fea5c178-425f-4e1d-a491-591a3dbb4f93
|
|
|
|
|
:END:
|
|
|
|
|
~nov-mode~ is the mode used in the Epub reader. Here I will write a little
|
|
|
|
|
function that I will call through a hook each time I’m opening a new EPUB
|
|
|
|
|
file.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(defun my-nov-font-setup ()
|
|
|
|
|
(face-remap-add-relative 'variable-pitch :family "Charis SIL"
|
|
|
|
|
:size 16
|
|
|
|
|
:height 1.0))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
Let’s bind this function to the ~nov-mode~ hook. By the way, we’ll also
|
|
|
|
|
enable the ~visual-line-mode~ here, just in case.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(mapc (lambda (mode)
|
|
|
|
|
(add-hook 'nov-mode-hook mode))
|
|
|
|
|
'('my-nov-font-setup 'visual-line-mode))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
Let’s also set the maximum length of the lines in ~nov-mode~:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq nov-text-width 80)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2020-01-14 20:56:02 +00:00
|
|
|
|
** Python
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-d26ce2ad-94b6-4e50-9803-d53e567f1206
|
|
|
|
|
:END:
|
|
|
|
|
Emacs throws me an error about the python interpreter, let’s silence it:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq python-shell-completion-native-disabled-interpreters '("python"))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2020-01-14 20:10:21 +00:00
|
|
|
|
** Org-mode
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-5534acb1-963d-4aec-874d-f1f66b02a597
|
|
|
|
|
:END:
|
|
|
|
|
Org-mode is probably one of the best if not the best Emacs feature I have
|
|
|
|
|
ever discovered. It is awesome for writing documents, regardless of the
|
|
|
|
|
format you need it to be exported to, for agenda management, and for literary
|
|
|
|
|
programming, such as with this document.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :tangle no
|
|
|
|
|
(with-eval-after-load 'org
|
|
|
|
|
;; configuration goes here
|
|
|
|
|
)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
# Don’t delete this, this code block is here to wrap the org configuration
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :exports none
|
|
|
|
|
(with-eval-after-load 'org
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Custom org-mode functions
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-e87fcf0c-2e3e-48e1-80aa-1d8f1a39842b
|
|
|
|
|
:END:
|
|
|
|
|
We begin with a couple of custom functions that I use in my org-mode files.
|
|
|
|
|
|
|
|
|
|
**** Custom and unique headings ID
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-c6950fac-82a2-49cd-86bb-8f72c0fe9f22
|
|
|
|
|
:END:
|
|
|
|
|
The first ones are dedicated to provide org-mode headings a fixed and
|
|
|
|
|
unique ID that won’t change over time. This code was taken from
|
|
|
|
|
[[https://writequit.org/articles/emacs-org-mode-generate-ids.html][https://writequit.org/articles/emacs-org-mode-generate-ids.html]]. The first
|
|
|
|
|
function’s job is to create these unique IDs
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(defun eos/org-id-new (&optional prefix)
|
|
|
|
|
"Create a new globally unique ID.
|
|
|
|
|
|
|
|
|
|
An ID consists of two parts separated by a colon:
|
|
|
|
|
- a prefix
|
|
|
|
|
- a unique part that will be created according to
|
|
|
|
|
`org-id-method'.
|
|
|
|
|
|
|
|
|
|
PREFIX can specify the prefix, the default is given by the
|
|
|
|
|
variable `org-id-prefix'. However, if PREFIX is the symbol
|
|
|
|
|
`none', don't use any prefix even if `org-id-prefix' specifies
|
|
|
|
|
one.
|
|
|
|
|
|
|
|
|
|
So a typical ID could look like \"Org-4nd91V40HI\"."
|
|
|
|
|
(let* ((prefix (if (eq prefix 'none)
|
|
|
|
|
""
|
|
|
|
|
(concat (or prefix org-id-prefix)
|
|
|
|
|
"-"))) unique)
|
|
|
|
|
(if (equal prefix "-")
|
|
|
|
|
(setq prefix ""))
|
|
|
|
|
(cond
|
|
|
|
|
((memq org-id-method
|
|
|
|
|
'(uuidgen uuid))
|
|
|
|
|
(setq unique (org-trim (shell-command-to-string org-id-uuid-program)))
|
|
|
|
|
(unless (org-uuidgen-p unique)
|
|
|
|
|
(setq unique (org-id-uuid))))
|
|
|
|
|
((eq org-id-method 'org)
|
|
|
|
|
(let* ((etime (org-reverse-string (org-id-time-to-b36)))
|
|
|
|
|
(postfix (if org-id-include-domain
|
|
|
|
|
(progn
|
|
|
|
|
(require 'message)
|
|
|
|
|
(concat "@"
|
|
|
|
|
(message-make-fqdn))))))
|
|
|
|
|
(setq unique (concat etime postfix))))
|
|
|
|
|
(t (error "Invalid `org-id-method'")))
|
|
|
|
|
(concat prefix unique)))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Now, let’s see the function that will be used to get the custom id of a
|
|
|
|
|
heading at point. If the function does not detect any custom ID, then one
|
|
|
|
|
should be created and inserted.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(defun eos/org-custom-id-get (&optional pom create prefix)
|
|
|
|
|
"Get the CUSTOM_ID property of the entry at point-or-marker POM.
|
|
|
|
|
If POM is nil, refer to the entry at point. If the entry does
|
|
|
|
|
not have an CUSTOM_ID, the function returns nil. However, when
|
|
|
|
|
CREATE is non nil, create a CUSTOM_ID if none is present
|
|
|
|
|
already. PREFIX will be passed through to `eos/org-id-new'. In
|
|
|
|
|
any case, the CUSTOM_ID of the entry is returned."
|
|
|
|
|
(interactive)
|
|
|
|
|
(org-with-point-at pom
|
|
|
|
|
(let ((id (org-entry-get nil "CUSTOM_ID")))
|
|
|
|
|
(cond
|
|
|
|
|
((and id
|
|
|
|
|
(stringp id)
|
|
|
|
|
(string-match "\\S-" id)) id)
|
|
|
|
|
(create (setq id (eos/org-id-new (concat prefix "h")))
|
|
|
|
|
(org-entry-put pom "CUSTOM_ID" id)
|
|
|
|
|
(org-id-add-location id
|
|
|
|
|
(buffer-file-name (buffer-base-buffer)))
|
|
|
|
|
id)))))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Finally, this is the function that gets called on file saves. If the
|
|
|
|
|
function detects ~auto-id:t~ among the org options in the ~#+OPTIONS:~
|
|
|
|
|
header, then the above function is called.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(defun eos/org-add-ids-to-headlines-in-file ()
|
|
|
|
|
"Add CUSTOM_ID properties to all headlines in the current
|
|
|
|
|
file which do not already have one. Only adds ids if the
|
|
|
|
|
`auto-id' option is set to `t' in the file somewhere. ie,
|
|
|
|
|
,#+OPTIONS: auto-id:t"
|
|
|
|
|
(interactive)
|
|
|
|
|
(save-excursion
|
|
|
|
|
(widen)
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(when (re-search-forward "^#\\+OPTIONS:.*auto-id:t"
|
|
|
|
|
(point-max)
|
|
|
|
|
t)
|
|
|
|
|
(org-map-entries (lambda ()
|
|
|
|
|
(eos/org-custom-id-get (point)
|
|
|
|
|
'create))))))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Let’s add a hook to the above function so it is called automatically on
|
|
|
|
|
save, and only in read-write functions.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(add-hook 'org-mode-hook
|
|
|
|
|
(lambda ()
|
|
|
|
|
(add-hook 'before-save-hook
|
|
|
|
|
(lambda ()
|
|
|
|
|
(when (and (eq major-mode 'org-mode)
|
|
|
|
|
(eq buffer-read-only nil))
|
|
|
|
|
(eos/org-add-ids-to-headlines-in-file))))))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Org babel languages
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-e60e0cf5-55ec-401a-82ed-256baff90f0c
|
|
|
|
|
:END:
|
|
|
|
|
One of the amazing features of org-mode is its literary programming
|
|
|
|
|
capacities by running code blocks from within Org-mode itself. But for that,
|
|
|
|
|
only a couple of languages are supported directly by Org-mode itself, and
|
|
|
|
|
they need to be activated. Here are the languages I activated in my Org-mode
|
|
|
|
|
configuration:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(org-babel-do-load-languages
|
|
|
|
|
'org-babel-load-languages
|
|
|
|
|
'((C . t)
|
|
|
|
|
(dot . t)
|
|
|
|
|
(emacs-lisp . t)
|
|
|
|
|
(gnuplot . t)
|
|
|
|
|
(latex . t)
|
|
|
|
|
(makefile . t)
|
|
|
|
|
(python . t)
|
|
|
|
|
(R . t)
|
|
|
|
|
(sass . t)
|
|
|
|
|
(scheme . t)
|
|
|
|
|
(shell . t)))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Scheme requires a default implementation for geiser:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq geiser-default-implementation 'racket)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
By the way, I wish to see source code behave the same way in the source
|
|
|
|
|
blocks as in their own major mode. Let’s tell Emacs so:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq org-src-tab-acts-natively t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Org variables
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-8e86e8dc-5889-44ff-9d10-766fb3e8b873
|
|
|
|
|
:END:
|
|
|
|
|
**** User information
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-73307234-da02-4e61-8443-616213d5b004
|
|
|
|
|
:END:
|
|
|
|
|
Some variables about myself need to be set so Org-mode knows what
|
|
|
|
|
information to include in exported files.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq user-full-name "Lucien Cartier-Tilet"
|
|
|
|
|
user-real-login-name "Lucien Cartier-Tilet"
|
|
|
|
|
user-login-name "phundrak"
|
|
|
|
|
user-mail-address "lucien@phundrak.com")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
**** Visual settings
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-a88bf63a-5200-46a6-be6e-2e455c347e4a
|
|
|
|
|
:END:
|
|
|
|
|
Visually, I prefer to hide the markers of macros, so let’s do that:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq org-hide-macro-markers t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
**** Miscellaneous
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-42ccf90a-f507-4fab-ae42-3fd815a34ef0
|
|
|
|
|
:END:
|
|
|
|
|
When creating a link to an Org flie, I want to create an ID only if the
|
|
|
|
|
link is created interactively, and only if there is no custom ID already
|
|
|
|
|
created.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq org-id-link-to-org-use-id 'create-if-interactive-and-no-custom-id)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Org files exports
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-65bba789-e7d5-4f60-9280-5c7d11d7f657
|
|
|
|
|
:END:
|
|
|
|
|
When it comes to exports, I want the LaTeX and PDF exports to be done with
|
|
|
|
|
XeLaTeX only. This implies the modification of the following variable:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq org-latex-compiler "xelatex")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
I also want to get by default ~minted~ for LaTeX listings so I can have
|
|
|
|
|
syntax highlights:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq org-latex-listings 'minted)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
The default packages break my LaTeX exports: for some reasons, images are
|
|
|
|
|
not loaded and exported in PDFs, so I needed to redifine the default
|
|
|
|
|
packages excluding the one that broke my exports. I also added two default
|
|
|
|
|
packages, ~minted~ and ~xeCJK~ for syntax highlighting and Japanese (and
|
|
|
|
|
additionally Chinese and Korean) support.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq org-latex-default-packages-alist '(("" "graphicx" t)
|
|
|
|
|
("T1" "fontspec" t ("pdflatex"))
|
|
|
|
|
("" "longtable" nil)
|
|
|
|
|
("" "wrapfig" nil)
|
|
|
|
|
("" "rotating" nil)
|
|
|
|
|
("normalem" "ulem" t)
|
|
|
|
|
("" "amsmath" t)
|
|
|
|
|
("" "textcomp" t)
|
|
|
|
|
("" "amssymb" t)
|
|
|
|
|
("" "capt-of" nil)
|
|
|
|
|
("" "minted" nil)
|
|
|
|
|
("" "xeCJK" nil)
|
|
|
|
|
("" "hyperref" nil)))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
By the way, reference links in LaTeX should be written in this format:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq org-export-latex-hyperref-format "\\ref{%s}")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
When it comes to the export itself, the latex file needs to be processed
|
|
|
|
|
several times through XeLaTeX.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq org-latex-pdf-process
|
|
|
|
|
'("xelatex -shell-escape -interaction nonstopmode -output-directory %o %f"
|
|
|
|
|
"xelatex -shell-escape -interaction nonstopmode -output-directory %o %f"
|
|
|
|
|
"xelatex -shell-escape -interaction nonstopmode -output-directory %o %f"))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
For Reveal.JS exports, I need to set where to find the framework by default:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq org-reveal-root "file:///home/phundrak/fromGIT/reveal.js")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
I also want to disable by default behavior of ~^~ and ~_~ for only one
|
|
|
|
|
character, making it compulsory to use instead ~^{}~ and ~_{}~ respectively.
|
|
|
|
|
This is due to my frequent usage of the underscore in my org files as a
|
|
|
|
|
regular character and not a markup one. So, let’s disable it:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq org-use-sub-superscripts (quote {}))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
On HTML exports, Org-mode tries to include a validation link for the
|
|
|
|
|
exported HTML. Let’s disable that since I never use it.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq org-html-validation-link nil)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Custom LaTeX formats
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-783545b6-04b8-4d16-8ab5-12a74c34cfba
|
|
|
|
|
:END:
|
|
|
|
|
I currently have two custom formats for my Org-mode exports: one for general
|
|
|
|
|
use (initialy for my conlanging files, hence its ~conlang~ name), and one
|
|
|
|
|
for beamer exports.
|
|
|
|
|
|
|
|
|
|
Below is the declaration of the ~conlang~ LaTeX class:
|
|
|
|
|
#+NAME: org-latex-class-conlang
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :tangle no
|
|
|
|
|
'("conlang"
|
|
|
|
|
"\\documentclass{book}"
|
|
|
|
|
("\\chapter{%s}" . "\\chapter*{%s}")
|
|
|
|
|
("\\section{%s}" . "\\section*{%s}")
|
|
|
|
|
("\\subsection{%s}" . "\\subsection*{%s}")
|
|
|
|
|
("\\subsubsection{%s}" . "\\subsubsection*{%s}"))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
And here is the declaration of the ~beamer~ class:
|
|
|
|
|
#+NAME: org-latex-class-beamer
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :tangle no
|
|
|
|
|
`("beamer"
|
|
|
|
|
,(concat "\\documentclass[presentation]{beamer}\n"
|
|
|
|
|
"[DEFAULT-PACKAGES]"
|
|
|
|
|
"[PACKAGES]"
|
|
|
|
|
"[EXTRA]\n")
|
|
|
|
|
("\\section{%s}" . "\\section*{%s}")
|
|
|
|
|
("\\subsection{%s}" . "\\subsection*{%s}")
|
|
|
|
|
("\\subsubsection{%s}" . "\\subsubsection*{%s}"))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Both these classes have to be added to ~org-latex-classes~ like so:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :noweb yes
|
|
|
|
|
(eval-after-load "ox-latex"
|
|
|
|
|
;; update the list of LaTeX classes and associated header (encoding, etc.)
|
|
|
|
|
;; and structure
|
|
|
|
|
'(add-to-list 'org-latex-classes
|
|
|
|
|
<<org-latex-class-conlang>>
|
|
|
|
|
<<org-latex-class-beamer>>
|
|
|
|
|
))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Org agenda
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-1c4fb1d5-dfc9-4b1e-be8c-375e6d61f886
|
|
|
|
|
:END:
|
|
|
|
|
One awesome feature of Org mode is the agenda. By default, my agendas are
|
|
|
|
|
stored in =~/org=.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq org-agenda-files (list "~/org"))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
I also have a custom command in Org agenda to mark some tasks as daily
|
|
|
|
|
tasks, with the =:DAILY:= tag:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq org-agenda-custom-commands '(("h" "Daily habits"
|
|
|
|
|
((agenda ""))
|
|
|
|
|
((org-agenda-show-log t)
|
|
|
|
|
(org-agenda-ndays 7)
|
|
|
|
|
(org-agenda-log-mode-items '(state))
|
|
|
|
|
(org-agenda-skip-function
|
|
|
|
|
'(org-agenda-skip-entry-if 'notregexp
|
|
|
|
|
":DAILY:"))))))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
By the way, let’s also add all TODO.org files in Org-agenda with
|
|
|
|
|
Org-projectile:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(with-eval-after-load 'org-agenda
|
|
|
|
|
(require 'org-projectile)
|
|
|
|
|
(mapcar #'(lambda (file)
|
|
|
|
|
(when (file-exists-p file)
|
|
|
|
|
(push file org-agenda-files)))
|
|
|
|
|
(org-projectile-todo-files)))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Org journal
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-d679ae6c-3096-4933-8e06-9848ad35adb0
|
|
|
|
|
:END:
|
|
|
|
|
I also occasionally use Org journal. All my files are stored in
|
|
|
|
|
=~/org/journal=, as set below:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq org-journal-dir "~/org/journal/")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
The default prefix for org journals is the following:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq org-journal-date-prefix "#+TITLE: ")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
The timestamp will be set following the ISO 8601 format:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq org-journal-file-format "%Y-%m-%d")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
*** Org projects
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-a1d5b79e-a053-46b0-a5ea-d5457acd1f7e
|
|
|
|
|
:END:
|
|
|
|
|
Another great features of Org-mode is the Org projects that allow the user
|
|
|
|
|
to easily publish a bunch of org files to a remote location. Here is the
|
|
|
|
|
current declaration of my projects, which will be detailed later:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :noweb yes
|
|
|
|
|
(setq org-publish-project-alist
|
|
|
|
|
'(
|
2020-01-15 11:38:29 +00:00
|
|
|
|
<<org-proj-config-html>>
|
|
|
|
|
<<org-proj-config-static>>
|
|
|
|
|
<<org-proj-config>>
|
2020-01-14 20:10:21 +00:00
|
|
|
|
<<org-proj-lang-html>>
|
|
|
|
|
<<org-proj-lang-pdf>>
|
|
|
|
|
<<org-proj-lang-static>>
|
|
|
|
|
<<org-proj-lang>>))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2020-01-15 11:38:29 +00:00
|
|
|
|
**** Configuration website
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-7559d45e-a1e8-4755-8c34-a95c80a592c7
|
|
|
|
|
:END:
|
|
|
|
|
#+NAME: org-proj-config-html
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :tangle no
|
|
|
|
|
("config-website-org"
|
|
|
|
|
:base-directory "~/org/config-website/"
|
|
|
|
|
:base-extension "org"
|
|
|
|
|
:exclude "\\./\\(CONTRIB\\|head\\|temp\\|svg-ink\\).*"
|
|
|
|
|
:publishing-directory "/ssh:Naro:~/www/phundrak.com/www/config"
|
|
|
|
|
:recursive t
|
|
|
|
|
:language "fr"
|
|
|
|
|
:publishing-function org-html-publish-to-html
|
|
|
|
|
:headline-levels 5
|
|
|
|
|
:auto-sitemap t
|
|
|
|
|
:auto-preamble t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
And lastly, we have the component for all the static files needed to run
|
|
|
|
|
the website:
|
|
|
|
|
#+NAME: org-proj-config-static
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :tangle no
|
|
|
|
|
("config-website-static"
|
|
|
|
|
:base-directory "~/org/config-website/"
|
|
|
|
|
:base-extension "css\\|scss\\|dart\\|js\\|png\\|jpg\\|gif\\|svg\\|jpeg\\|ttf\\|woff\\|txt\\|epub\\|html"
|
|
|
|
|
:publishing-directory "/ssh:Naro:~/www/phundrak.com/www/config"
|
|
|
|
|
:recursive t
|
|
|
|
|
:language "fr"
|
|
|
|
|
:publishing-function org-publish-attachment)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
The project is then defined like so:
|
|
|
|
|
#+NAME: org-proj-config
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :tangle no
|
|
|
|
|
("config-website"
|
|
|
|
|
:components ("config-website-org"
|
|
|
|
|
"config-website-static"))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2020-01-14 20:10:21 +00:00
|
|
|
|
**** Linguistics website
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-a54bbe09-960f-428e-9cbd-5dabb4bb8daa
|
|
|
|
|
:END:
|
|
|
|
|
In my case, I only have my linguistics website, made out of three projects.
|
|
|
|
|
The first component is the one generating the HTML files from the org
|
|
|
|
|
files.
|
|
|
|
|
#+NAME: org-proj-lang-html
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :tangle no
|
|
|
|
|
("langue-phundrak-com-org"
|
|
|
|
|
:base-directory "~/Documents/conlanging/web/"
|
|
|
|
|
:base-extension "org"
|
|
|
|
|
:exclude "\\./\\(CONTRIB\\|README\\|head\\|temp\\|svg-ink\\).*"
|
|
|
|
|
:publishing-directory "/ssh:Naro:~/www/phundrak.com/langue-phundrak-com/web"
|
|
|
|
|
:recursive t
|
|
|
|
|
:language "fr"
|
|
|
|
|
:publishing-function org-html-publish-to-html
|
|
|
|
|
:headline-levels 5
|
|
|
|
|
:auto-sitemap t
|
|
|
|
|
:auto-preamble t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
We also have the component for the LaTeX and PDF part of the website:
|
|
|
|
|
#+NAME: org-proj-lang-pdf
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :tangle no
|
|
|
|
|
("langue-phundrak-com-pdf"
|
|
|
|
|
:base-directory "~/Documents/conlanging/web/"
|
|
|
|
|
:base-extension "org"
|
|
|
|
|
:exclude "\\./\\(CONTRIB\\|README\\|index\\|head\\|temp\\|svg-ink\\).*"
|
|
|
|
|
:publishing-directory "/ssh:Naro:~/www/phundrak.com/langue-phundrak-com/web"
|
|
|
|
|
:recursive t
|
|
|
|
|
:language "fr"
|
|
|
|
|
:publishing-function org-latex-publish-to-pdf
|
|
|
|
|
:headline-levels 5
|
|
|
|
|
:auto-preamble t)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
And lastly, we have the component for all the static files needed to run
|
|
|
|
|
the website:
|
|
|
|
|
#+NAME: org-proj-lang-static
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :tangle no
|
|
|
|
|
("langue-phundrak-com-static"
|
|
|
|
|
:base-directory "~/Documents/conlanging/web/"
|
|
|
|
|
:base-extension "css\\|scss\\|dart\\|js\\|png\\|jpg\\|gif\\|svg\\|jpeg\\|ttf\\|woff\\|txt\\|epub"
|
|
|
|
|
:publishing-directory "/ssh:Naro:~/www/phundrak.com/langue-phundrak-com/web"
|
|
|
|
|
:recursive t
|
|
|
|
|
:language "fr"
|
|
|
|
|
:publishing-function org-publish-attachment)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
The project is then defined like so:
|
|
|
|
|
#+NAME: org-proj-lang
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :tangle no
|
|
|
|
|
("langue-phundrak-com"
|
|
|
|
|
:components ("langue-phundrak-com-org"
|
|
|
|
|
"langue-phundrak-com-static"
|
|
|
|
|
"langue-phundrak-com-pdf"))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
# Don’t delete this, this code block is here to wrap the org configuration
|
|
|
|
|
#+BEGIN_SRC emacs-lisp :exports none
|
|
|
|
|
)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Rust
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-4f572b65-92eb-4ecd-beb3-75aa5c260e37
|
|
|
|
|
:END:
|
|
|
|
|
The first thing I need to set for my Rust setup is the path to ~racer~.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq racer-cmd "~/.cargo/bin/racer")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Now, I also need to point to racer where the source code of Rust is located
|
|
|
|
|
so I can get some documentation.
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq racer-rust-src-path "~/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Finally, I wish to enable ~electric-pair-mode~ and ~indent-guide-mode~ for
|
|
|
|
|
Rust files, so let’s enable that through the use of a hook:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(add-hook 'rust-mode-hook
|
|
|
|
|
'(lambda ()
|
|
|
|
|
(local-set-key (kbd "TAB") #'company-indent-or-complete-common)
|
|
|
|
|
(electric-pair-mode 1)
|
|
|
|
|
(indent-guide-mode 1)))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Scheme
|
|
|
|
|
:PROPERTIES:
|
|
|
|
|
:CUSTOM_ID: h-6b392c4b-9014-4dfa-802d-2bc0c85273b3
|
|
|
|
|
:END:
|
|
|
|
|
The Scheme configuration will be very short, I just need to tell Emacs the
|
|
|
|
|
name of the interpreter since it is not the default one:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq geiser-chicken-binary "chicken-csi")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2020-01-14 20:56:02 +00:00
|
|
|
|
** Shortcuts
|
2020-01-14 20:10:21 +00:00
|
|
|
|
:PROPERTIES:
|
2020-01-14 20:56:02 +00:00
|
|
|
|
:CUSTOM_ID: h-f193126f-abc1-4287-aa70-4f2080d2ef8f
|
2020-01-14 20:10:21 +00:00
|
|
|
|
:END:
|
2020-01-14 20:56:02 +00:00
|
|
|
|
As you will see, I defined A LOT of custom shortcuts. First, I have some
|
|
|
|
|
shortcuts defined the vanilla Emacs way:
|
2020-01-14 20:10:21 +00:00
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
2020-01-14 20:56:02 +00:00
|
|
|
|
(global-set-key (kbd "C-x C-b") 'ibuffer)
|
|
|
|
|
(global-set-key (kbd "S-C-<left>") 'shrink-window-horizontally)
|
|
|
|
|
(global-set-key (kbd "S-C-<right>") 'enlarge-window-horizontally)
|
|
|
|
|
(global-set-key (kbd "S-C-<down>") 'shrink-window)
|
|
|
|
|
(global-set-key (kbd "S-C-<up>") 'enlarge-window)
|
|
|
|
|
(global-set-key (kbd "C-x <up>") 'windmove-up)
|
|
|
|
|
(global-set-key (kbd "C-x <down>") 'windmove-down)
|
|
|
|
|
(global-set-key (kbd "C-x <right>") 'windmove-right)
|
|
|
|
|
(global-set-key (kbd "C-x <left>") 'windmove-left)
|
|
|
|
|
(global-set-key (kbd "C-<prior>") 'previous-buffer)
|
|
|
|
|
(global-set-key (kbd "C-<next>") 'next-buffer)
|
|
|
|
|
(global-set-key (kbd "M-»") 'end-of-buffer)
|
|
|
|
|
(global-set-key (kbd "M-«") 'beginning-of-buffer)
|
|
|
|
|
(global-set-key (kbd "<XF86HomePage>") 'spacemacs/home)
|
|
|
|
|
(global-set-key (kbd "<XF86Open>") 'helm-find-files)
|
|
|
|
|
(global-set-key (kbd "<XF86Close>") 'kill-this-buffer)
|
|
|
|
|
(global-set-key (kbd "<XF86Save>") 'save-buffer)
|
|
|
|
|
(global-set-key (kbd "<C-tab>") 'evil-close-fold)
|
|
|
|
|
(global-set-key (kbd "<S-C-tab>") 'evil-close-folds)
|
|
|
|
|
(global-set-key (kbd "<C-iso-lefttab>") 'evil-open-fold)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
These shortcuts can be called as-is, that is, typing ~C-x C-b~ will call
|
|
|
|
|
~ibuffer~.
|
|
|
|
|
|
|
|
|
|
Now, I also have some Spacemacs shortcuts, defined in a way they can be used
|
|
|
|
|
seamlessly with Evil. First, let’s declare some prefixes in order to avoid
|
|
|
|
|
seeing lots of ~custom~ in helm:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(spacemacs/declare-prefix "o" "custom")
|
|
|
|
|
(spacemacs/declare-prefix "oa" "applications")
|
|
|
|
|
(spacemacs/declare-prefix "oB" "byte-compile .emacs.d")
|
|
|
|
|
(spacemacs/declare-prefix "oc" "comments")
|
|
|
|
|
(spacemacs/declare-prefix "of" "files")
|
|
|
|
|
(spacemacs/declare-prefix "ofb" ".local/bin sources")
|
|
|
|
|
(spacemacs/declare-prefix "ofe" "spacemacs.org")
|
|
|
|
|
(spacemacs/declare-prefix "off" "fish config")
|
|
|
|
|
(spacemacs/declare-prefix "ofi" "i3 config")
|
|
|
|
|
(spacemacs/declare-prefix "ofp" "polybar config")
|
|
|
|
|
(spacemacs/declare-prefix "ofr" "yadm README")
|
|
|
|
|
(spacemacs/declare-prefix "oi" "insert")
|
|
|
|
|
(spacemacs/declare-prefix "oii" "invisible space")
|
|
|
|
|
(spacemacs/declare-prefix "om" "multiple-cursors")
|
|
|
|
|
(spacemacs/declare-prefix "oo" "org-mode")
|
|
|
|
|
(spacemacs/declare-prefix "ooi" "custom IDs")
|
|
|
|
|
(spacemacs/declare-prefix "oos" "structure")
|
|
|
|
|
(spacemacs/declare-prefix "oot" "tables")
|
|
|
|
|
(spacemacs/declare-prefix "oott" "toggle width")
|
|
|
|
|
(spacemacs/declare-prefix "oote" "expand")
|
|
|
|
|
(spacemacs/declare-prefix "oots" "shrink")
|
|
|
|
|
(spacemacs/declare-prefix "or" "external command")
|
|
|
|
|
(spacemacs/declare-prefix "ot" "toggle")
|
|
|
|
|
(spacemacs/declare-prefix "ow" "writeroom")
|
|
|
|
|
(spacemacs/declare-prefix "ox" "text")
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
Now, onto the shortcuts:
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(spacemacs/set-leader-keys
|
|
|
|
|
"oac" 'calc
|
|
|
|
|
"oaC" 'calendar
|
|
|
|
|
"oae" 'eww
|
|
|
|
|
"oaw" 'wttrin
|
|
|
|
|
"oB" (lambda () (byte-recompile-directory (expand-file-name "~/.emacs.d") 0))
|
|
|
|
|
"ob" 'fancy-battery-mode
|
|
|
|
|
"occ" 'outorg-copy-edits-and-exit
|
|
|
|
|
"oce" 'outorg-edit-as-org
|
|
|
|
|
"oco" 'outline-minor-mode
|
|
|
|
|
"od" 'elcord-mode
|
|
|
|
|
"oF" 'flycheck-mode
|
|
|
|
|
"ofb" (lambda () (interactive) (find-file "~/.local/bin/README.org"))
|
|
|
|
|
"ofe" (lambda () (interactive) (find-file "~/spacemacs.org"))
|
|
|
|
|
"off" (lambda () (interactive) (find-file "~/.config/fish/README.org"))
|
|
|
|
|
"ofi" (lambda () (interactive) (find-file "~/.config/i3/README.org"))
|
|
|
|
|
"ofp" (lambda () (interactive) (find-file "~/.config/polybar/config##yadm.j2"))
|
|
|
|
|
"ofr" (lambda () (interactive) (find-file "~/README.org"))
|
|
|
|
|
"ofo" 'find-file-at-point
|
|
|
|
|
"oii" (lambda () (interactive) (insert ""))
|
|
|
|
|
"ome" 'mc/edit-lines
|
|
|
|
|
"omn" 'mc/mark-next-like-this
|
|
|
|
|
"omp" 'mc/mark-previous-like-this
|
|
|
|
|
"oma" 'mc/mark-all-like-this
|
|
|
|
|
"ooi" 'eos/org-add-ids-to-headlines-in-file
|
|
|
|
|
"oos" 'org-insert-structure-template
|
|
|
|
|
"ooT" 'org-sidebar-tree
|
|
|
|
|
"oott" 'org-table-toggle-column-width
|
|
|
|
|
"oote" 'org-table-expand
|
|
|
|
|
"oots" 'org-table-shrink
|
|
|
|
|
"oow" 'org-pomodoro
|
|
|
|
|
"owi" 'writeroom-increase-width
|
|
|
|
|
"or" 'helm-run-external-command
|
|
|
|
|
"os" 'prettify-symbols-mode
|
|
|
|
|
"oti" 'toggle-input-method
|
|
|
|
|
"otI" 'set-input-method
|
|
|
|
|
"owd" 'writeroom-decrease-width
|
|
|
|
|
"oxf" 'phundrak/fill-paragraph)
|
2020-01-14 20:10:21 +00:00
|
|
|
|
#+END_SRC
|
2020-01-14 20:56:02 +00:00
|
|
|
|
|
|
|
|
|
You can notice they all begin with ~o~. This is actually a userspace, and I
|
|
|
|
|
know these shortcuts won’t conflict with any other packages. These shortcuts,
|
|
|
|
|
like a lot of Spacemacs shortcuts, can be called with the use of the leader
|
|
|
|
|
key, in my case ~SPC~. So, if I want to call the calculator, I will type ~SPC
|
|
|
|
|
o a c~.
|