#+title: Phundrak’s Spacemacs Configuration
#+INCLUDE: ~/org/config-website/headers.org
#+OPTIONS: auto-id:t
#+HTML_HEAD_EXTRA:
#+HTML_HEAD_EXTRA:
#+HTML_HEAD_EXTRA:
* 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 = 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
#+END_SRC
#+END_SRC
* User Initialization
:PROPERTIES:
:CUSTOM_ID: h-e297b9be-9b0d-4c2d-bb6e-402f0d00be0d
:header-args:emacs-lisp: :comments link :tangle ~/.emacs.d/private/user-init.el :exports code
: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
:header-args:emacs-lisp: :comments link :tangle ~/.emacs.d/private/user-config.el :exports code
:END:
** ASM configuration
:PROPERTIES:
:CUSTOM_ID: h-73c92790-872d-404d-b3b7-7a94fba4ef34
:END:
The first thing I will set with my ASM configuration is where the reference
PDF is located.
#+BEGIN_SRC emacs-lisp
(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 ?\#)
#+END_SRC
** 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.
#+BEGIN_SRC emacs-lisp
(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")))
#+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
** 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
** 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
** Eshell
:PROPERTIES:
:CUSTOM_ID: h-846478af-19e5-4e06-a97b-0886062d32c7
:END:
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.
*** 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
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:
#+BEGIN_SRC emacs-lisp
(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))
#+END_SRC
We also have a couple of extensions which should all be in ~conf-unix-mode~,
let’s indicate that to Emacs:
#+BEGIN_SRC emacs-lisp
(dolist (e '("service" "timer" "target" "mount" "automount"
"slice" "socket" "path" "netdev" "network"
"link"))
(push (cons (concat "\\." e "\\'") 'conf-unix-mode)
auto-mode-alist))
#+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
** 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
** 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
** 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
** 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
<>
<>
))
#+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
'(
<>
<>
<>
<>
<>
<>
<>))
#+END_SRC
**** 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
**** 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
** Shortcuts
:PROPERTIES:
:CUSTOM_ID: h-f193126f-abc1-4287-aa70-4f2080d2ef8f
:END:
As you will see, I defined A LOT of custom shortcuts. First, I have some
shortcuts defined the vanilla Emacs way:
#+BEGIN_SRC emacs-lisp
(global-set-key (kbd "C-x C-b") 'ibuffer)
(global-set-key (kbd "S-C-") 'shrink-window-horizontally)
(global-set-key (kbd "S-C-") 'enlarge-window-horizontally)
(global-set-key (kbd "S-C-") 'shrink-window)
(global-set-key (kbd "S-C-") 'enlarge-window)
(global-set-key (kbd "C-x ") 'windmove-up)
(global-set-key (kbd "C-x ") 'windmove-down)
(global-set-key (kbd "C-x ") 'windmove-right)
(global-set-key (kbd "C-x ") 'windmove-left)
(global-set-key (kbd "C-") 'previous-buffer)
(global-set-key (kbd "C-") 'next-buffer)
(global-set-key (kbd "M-»") 'end-of-buffer)
(global-set-key (kbd "M-«") 'beginning-of-buffer)
(global-set-key (kbd "") 'spacemacs/home)
(global-set-key (kbd "") 'helm-find-files)
(global-set-key (kbd "") 'kill-this-buffer)
(global-set-key (kbd "") 'save-buffer)
(global-set-key (kbd "") 'evil-close-fold)
(global-set-key (kbd "") 'evil-close-folds)
(global-set-key (kbd "") '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)
#+END_SRC
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~.