Start cleaning up basic structure

This commit is contained in:
Tom Willemse 2015-09-23 14:24:02 +02:00
parent dea9949d4b
commit 85fe9b1ab3

View file

@ -1,6 +1,6 @@
#+TITLE: Emacs init
#+PROPERTY: tangle init2.el
#+STARTUP: showall
#+STARTUP: content
#+OPTIONS: author:nil num:nil toc:nil
#+MACRO: key @@html:<kbd>$1</kbd>@@@@ascii:`$1'@@
#+HTML_HEAD: <link href="https://ryuslash.org/org.css" rel="stylesheet" type="text/css">
@ -122,62 +122,41 @@
(cask-initialize))
#+END_SRC
* Some general-purpose functions and macros
** Some helper functions
A configuration as big as mine is bound to have some functions and
macros that are used in many places.
Certain functions make life a lot easier when configuring Emacs.
These don't generally belong to any one specific customization, but
make things look a lot prettier.
** Turn off
*** Optimized ~with-eval-after-load~
This macro creates a function that will turn off a minor mode that
passed to it.
First offered [[http://www.lunaryorn.com/2013/05/01/byte-compiling-eval-after-load.html][here]] and then later updated [[http://www.lunaryorn.com/2013/06/25/introducing-with-eval-after-load.html][here]] (when
~with-eval-after-load~ was added). Makes for very nice on-demand
settings loading.
#+BEGIN_SRC emacs-lisp
(defmacro turn-off (func)
"Create a function that will turn off FUNC when called."
`(lambda () (eval (,func -1))))
;; http://www.lunaryorn.com/2013/06/25/introducing-with-eval-after-load/
(defmacro stante-after (feature &rest forms)
"After FEATURE is loaded, evaluate FORMS.
FEATURE may be an unquoted feature symbol or a file name, see
`eval-after-load'."
(declare (indent 1) (debug t))
`(,(if (or (not byte-compile-current-file)
(if (symbolp feature)
(require feature nil :noerror)
(load feature :no-message :no-error)))
`progn
(message "stante-after: cannot find %s" feature)
'with-no-warnings)
(with-eval-after-load ',feature ,@forms)))
#+END_SRC
** Change setting
* General customization
Sometimes a mode just needs to change a certain setting to a
specific value.
These customizations don't belong with any specific mode.
#+BEGIN_SRC emacs-lisp
(defmacro change-settings (&rest settings)
"Create a function that changes the value of NAME to VALUE."
`(lambda () (setq ,@settings)))
#+END_SRC
** Whitespace only with tabs
In some modes I want to see the tabs in a buffer. Though I don't
want to be overwhelmed by seeing all spaces and line endings.
#+BEGIN_SRC emacs-lisp
(defvar whitespace-style)
(defun oni:whitespace-only-tabs ()
(setq-local whitespace-style '(face tabs))
(whitespace-mode))
#+END_SRC
** Eval after init
Some things can only really work after all other initialization
functions have completed. For example, any functions that require
any ELPA packages to be loaded, unless you want to load it in your
init manually (and have it loaded again later on after your config
has run).
#+BEGIN_SRC emacs-lisp
(defmacro oni:eval-after-init (&rest body)
"Defer execution of BODY until after Emacs init."
(declare (indent 0))
`(add-hook 'emacs-startup-hook #'(lambda () ,@body)))
#+END_SRC
* Set some personal information
** Set some personal information
This information is used by some emacs commands and modules to make
your life easier.
@ -187,14 +166,7 @@
user-mail-address "tom@ryuslash.org")
#+END_SRC
* Clean up some UI elements
Some elements are only really useful if you use the mouse. Which I
don't, not if I can help it. Only when browsing the web or using the
odd graphical application do I touch the mouse, and even then as
little as I can.
** Menu bar
** Turn-off menu bar
The menu bar is one of the UI elements which work best with mouses.
Sure you can change your toolkit's key bindings to allow you to
@ -206,7 +178,7 @@
(menu-bar-mode -1)
#+END_SRC
** Tool bar
** Turn-off tool bar
The toolbar is another such thing, and it takes up quite a bit more
space too. Icons can look pretty cool, but in the end if you're not
@ -217,7 +189,7 @@
(tool-bar-mode -1)
#+END_SRC
** Blinking cursor
** Turn-off blinking cursor
I suppose a blinking cursor doesn't get lost very easily. But on
the other hand, it can induce quite a few more headaches.
@ -230,17 +202,17 @@
(blink-cursor-mode -1)
#+END_SRC
** Line numbers
** Turn-off line numbers
As I'm currently using svg-mode-line-themes[fn:2] for my ~mode-line~ I
don't need to show these. Also I didn't really use them much, I
As I'm currently using svg-mode-line-themes[fn:2] for my ~mode-line~
I don't need to show these. Also I didn't really use them much, I
don't often need to know what line I'm on.
#+BEGIN_SRC emacs-lisp
(line-number-mode -1)
#+END_SRC
** Tooltips
** Turn-off tooltips
Tooltips are another one of those UI elements that aren't quite
keyboard-friendly. As usually this information is shown just as well
@ -250,7 +222,7 @@
(tooltip-mode -1)
#+END_SRC
** Cursor type
** Change cursor type
I prefer using a bar as a cursor, as opposed to a box. Using a bar
is a better way of representing the location of the cursor, in my
@ -260,18 +232,16 @@
(setq-default cursor-type 'bar)
#+END_SRC
** Cursors in inactive windows
I use a bar cursor that's already pretty thin, so having an even
thinner one in inactive windows is not very clear. Even when I
was using a box cursor I didn't like seeing a hollow box everywhere
my focus /wasn't/.
thinner one in inactive windows is not very clear. Even when I was
using a box cursor I didn't like seeing a hollow box everywhere my
focus /wasn't/.
#+BEGIN_SRC emacs-lisp
(setq-default cursor-in-non-selected-windows nil)
#+END_SRC
** Long lines
** Truncate long lines
Sometimes, very long lines can't help but show up in code. The
default of wrapping lines around to the next line and showing an
@ -282,7 +252,7 @@
(setq-default truncate-lines t)
#+END_SRC
** The default frame
** Change default frame settings
Usually, most of these settings would be done with functions like
=set-frame-font= or =scroll-bar-mode=, but working with the Emacs
@ -290,7 +260,7 @@
start a graphical environment at some point (I usually do
immediately), but the startup process isn't.
*** Internal border
*** Remove internal border
Set the internal border width to 0. This makes a small difference,
with my current setup it causes my window's width to increase from
@ -302,7 +272,7 @@
(internal-border-width . 0)
#+END_SRC
*** A fantastic font
*** Use a fantastic font
I've tried several fonts, and all of them were nice, but came up
short on some way. Some didn't have italic variants, some had
@ -329,7 +299,7 @@
(font . "Fantasque Sans Mono-13")
#+END_SRC
*** Scroll bar
*** Hide the scroll bar
The scroll-bar is almost just as informative as the current line
number and buffer position information shown in the (my) mode
@ -352,7 +322,7 @@
(vertical-scroll-bars . nil)
#+END_SRC
*** Setting the option
*** Bringing it all together
So I've explained the reasons for each individual setting, but to
get them to work they have to be put in the =default-frame-alist=.
@ -365,7 +335,7 @@
<<default-frame-scroll-bar>>))
#+END_SRC
** Frame title
** Set the frame title
Show the buffer name in the frame title to make multiple frames
identifiable by the buffer they're showing.
@ -435,7 +405,201 @@
(setq frame-resize-pixelwise t)
#+END_SRC
* Add org-mode appointments to the diary
** Don't just quit Emacs with {{{key(C-x C-c)}}} in the daemon
When working with Emacs as a daemon, which I do almost all of the
time, I prefer using {{{key(C-x C-c)}}} to close the current frame
instead of the entire session. Before this change I would
occasionally close my session by mistake.
#+BEGIN_SRC emacs-lisp
(defun oni:close-client-window ()
"Close a client's frames."
(interactive)
(server-save-buffers-kill-terminal nil))
(when (daemonp)
(global-set-key (kbd "C-x C-c") 'oni:close-client-window))
#+END_SRC
** Don't minimize the frame with {{{key(C-z)}}}
One of the more annoying things that can happen is accidentally
minimizing the frame you're working with. This doesn't really matter
if you're working on a normal stacking window manager, but with a
tiling window manager and no task bar this just causes the Emacs
frame to hang until it is refocused or disappear with no way to get
it back.
#+BEGIN_SRC emacs-lisp
(when (or window-system (daemonp))
(global-unset-key (kbd "C-z")))
#+END_SRC
** Lazily load some buffers
Don't load all buffers right away. Having a lot of buffers and
switching between projects a lot can take up quite a bit of time.
*Note:* See my [[Vacuous defvar][note]] on vacuous defvar for this use of =defvar=.
#+BEGIN_SRC emacs-lisp
(defvar desktop-restore-eager)
(setq desktop-restore-eager 5)
#+END_SRC
** Ask for a ~y~ or ~n~, not ~yes~ or ~no~.
Emacs starts out asking for you to type ~yes~ or ~no~ with most
important questions. It is possible that this is used for such
important questions where accidentally saying ~yes~ when you meant ~no~
would be catastrophic (or at least could be). However, I've never
(so far) had this problem, and I find it quite tedious to have to
write out ~yes~ or ~no~ and then press {{{kbd(RET)}}}, give me a simple
~y~ or ~n~ with no {{{kdb(RET)}}} required and I'm quite happy.
#+BEGIN_SRC emacs-lisp
(defalias 'yes-or-no-p 'y-or-n-p)
#+END_SRC
** Use =hippie-expand=, not =dabbrev-expand=
I've never actually used =dabbrev-expand=, and only rarely use
=hippie-expand= really, but since =hippie-expand= also includes a
=dabbrev= expander and a lot more than just that, it seems alright to
do this.
#+BEGIN_SRC emacs-lisp
(defalias 'dabbrev-expand 'hippie-expand)
#+END_SRC
** Setting up =load-path=
First, to help, I create a function that takes a path, adds it to
=load-path= and then checks to see if there is a file named
~loaddefs.el~ in the given path. If there is, it loads it. This
~loaddefs.el~ file is something that is created from autoload cookies
in the files in some of these paths.
Since the =load-path= is also important during byte-compilation, this
function should be defined both at run-time and compile-time.
#+BEGIN_SRC emacs-lisp
(eval-and-compile
(defun oni:loadpath-add-and-autoload (path)
"Add PATH to `load-path' and load a `loaddefs.el' if it exists."
(add-to-list 'load-path path)
(let ((loaddefs (concat path "/loaddefs.el")))
(when (file-exists-p loaddefs)
(load loaddefs)))))
#+END_SRC
After that I add some directories to my =load-path= so I can use these
libraries when wanted. One of these is the ~site-lisp~ directory in my
~.emacs.d~ directory, which is where I keep most of my personal
non-ELPA modules (like module-specific initialization files). There
are also some directories I include in ~vendor-lisp~, which is where I
keep modules that I didn't write myself and, for some reason, can't
or don't want to use ELPA for. Again it is important to realize that
this information is relevant both at run-time and compile-time, so
we wrap it with an =eval-and-compile=.
#+BEGIN_SRC emacs-lisp
(eval-and-compile
(mapc #'oni:loadpath-add-and-autoload
'("~/.emacs.d/site-lisp"
"~/.emacs.d/vendor-lisp/mozrepl"
"~/.emacs.d/vendor-lisp/eap" "/usr/share/emacs/site-lisp"
"/usr/lib/node_modules/tern/emacs/"
"~/.emacs.d/vendor-lisp/habitrpg.el")))
#+END_SRC
** Turn off bidirectional text
To speed things up a little, and because I have no contacts at all
(so far) who use right-to-left text, there is no reason for me to
use bidirectional text. For this reason I tell Emacs to always use
left-to-right by default, instead of checking each paragraph.
#+BEGIN_SRC emacs-lisp
(setq-default bidi-paragraph-direction 'left-to-right)
#+END_SRC
** Don't use tabs
There is a war going on out there. Actually there are several, but
the one I'm talking about here is the one about tabs vs. spaces. I
have been deeply entrenched in the spaces camp for quite a while.
Indentation always gets screwy for me if I don't use the exact same
=tab-width= everyone else uses. I just like the consistency of using
spaces.
#+BEGIN_SRC emacs-lisp
(setq-default indent-tabs-mode nil)
#+END_SRC
** Use four spaces for indentation
I once, long ago, started out with using eight spaces for each
level of indentation. Although I think, technically, I was using
tabs. This means that even just 3 levels of indentation take up a
/huge/ amount of space that can't be used for anything else. Since I
also try to limit the length of the lines in my code, this can make
for very little code per line.
I also tried (and enjoyed) two spaces, but after a while, looking
at bigger files, I noticed that it all becomes a blur. Two spaces
is not a big-enough visual difference to make code read nicely, in
my opinion.
So far, I have quite enjoyed four spaces for most code[fn:8].
#+BEGIN_SRC emacs-lisp
(setq-default tab-width 4)
#+END_SRC
** Keep the message buffer from growing too large
Keep at most one-thousand messages in the ~*Messages*~ buffer. I can
leave my Emacs session running for quite long times, sometimes
days, at a time. If there are a lot of messages it can get a little
tricky to manage/search.
#+BEGIN_SRC emacs-lisp
(setq message-log-max 1000)
#+END_SRC
** Reject SSL/TLS certificates that don't check out
You just can't trust the internet. And I'd prefer to know if
something goes wrong.
#+BEGIN_SRC emacs-lisp
(defvar gnutls-verify-error)
(setq gnutls-verify-error t)
#+END_SRC
** Use Conkeror to browse URLs
Use the generic browse-url function to open URLs in Conkeror.
#+BEGIN_SRC emacs-lisp
(stante-after browse-url
(setq browse-url-browser-function 'browse-url-generic)
(setq browse-url-generic-program "conkeror"))
#+END_SRC
* Major mode customization
Many major modes offer and require some customization.
** Org mode
Org mode offers /a lot/ of customization options. Most of mine are in
a separate file.
*** Add org-mode appointments to the diary
Diary offers reminders, which can be useful when scheduling
appointments.
@ -447,7 +611,13 @@
(org-agenda-to-appt))
#+END_SRC
* Close ansi-term buffer after exit
** Ansi term
I don't use ansi term much. Though I probably should do it more.
Eshell is much nicer for many reasons but it can't handle
everything.
*** Close ansi-term buffer after exit
After the ansi-term process ends it leaves a buffer. I don't use
ansi term in such a way that this has ever been useful, so just kill
@ -461,6 +631,61 @@
(kill-buffer (current-buffer)))
#+END_SRC
* Some general-purpose functions and macros
A configuration as big as mine is bound to have some functions and
macros that are used in many places.
** Turn off
This macro creates a function that will turn off a minor mode that
passed to it.
#+BEGIN_SRC emacs-lisp
(defmacro turn-off (func)
"Create a function that will turn off FUNC when called."
`(lambda () (eval (,func -1))))
#+END_SRC
** Change setting
Sometimes a mode just needs to change a certain setting to a
specific value.
#+BEGIN_SRC emacs-lisp
(defmacro change-settings (&rest settings)
"Create a function that changes the value of NAME to VALUE."
`(lambda () (setq ,@settings)))
#+END_SRC
** Whitespace only with tabs
In some modes I want to see the tabs in a buffer. Though I don't
want to be overwhelmed by seeing all spaces and line endings.
#+BEGIN_SRC emacs-lisp
(defvar whitespace-style)
(defun oni:whitespace-only-tabs ()
(setq-local whitespace-style '(face tabs))
(whitespace-mode))
#+END_SRC
** Eval after init
Some things can only really work after all other initialization
functions have completed. For example, any functions that require
any ELPA packages to be loaded, unless you want to load it in your
init manually (and have it loaded again later on after your config
has run).
#+BEGIN_SRC emacs-lisp
(defmacro oni:eval-after-init (&rest body)
"Defer execution of BODY until after Emacs init."
(declare (indent 0))
`(add-hook 'emacs-startup-hook #'(lambda () ,@body)))
#+END_SRC
* Stumpwm integration
This variable, macro and function help with integrating Emacs and
@ -505,37 +730,6 @@
(format "move-focus %s" (ad-get-arg 0))))))
#+END_SRC
* Don't just quit Emacs with {{{key(C-x C-c)}}} in the daemon
When working with Emacs as a daemon, which I do almost all of the
time, I prefer using {{{key(C-x C-c)}}} to close the current frame
instead of the entire session. Before this change I would
occasionally close my session by mistake.
#+BEGIN_SRC emacs-lisp
(defun oni:close-client-window ()
"Close a client's frames."
(interactive)
(server-save-buffers-kill-terminal nil))
(when (daemonp)
(global-set-key (kbd "C-x C-c") 'oni:close-client-window))
#+END_SRC
* Don't minimize the frame with {{{key(C-z)}}}
One of the more annoying things that can happen is accidentally
minimizing the frame you're working with. This doesn't really matter
if you're working on a normal stacking window manager, but with a
tiling window manager and no task bar this just causes the Emacs
frame to hang until it is refocused or disappear with no way to get
it back.
#+BEGIN_SRC emacs-lisp
(when (or window-system (daemonp))
(global-unset-key (kbd "C-z")))
#+END_SRC
* Use the right dictionary
One of the caveats of using two (or more) languages in a single
@ -590,30 +784,6 @@
#'oni:shr-colorize-remove-last-arg))
#+END_SRC
* Optimized ~with-eval-after-load~
First offered [[http://www.lunaryorn.com/2013/05/01/byte-compiling-eval-after-load.html][here]] and then later updated [[http://www.lunaryorn.com/2013/06/25/introducing-with-eval-after-load.html][here]] (when
~with-eval-after-load~ was added). Makes for very nice on-demand
settings loading.
#+BEGIN_SRC emacs-lisp
;; http://www.lunaryorn.com/2013/06/25/introducing-with-eval-after-load/
(defmacro stante-after (feature &rest forms)
"After FEATURE is loaded, evaluate FORMS.
FEATURE may be an unquoted feature symbol or a file name, see
`eval-after-load'."
(declare (indent 1) (debug t))
`(,(if (or (not byte-compile-current-file)
(if (symbolp feature)
(require feature nil :noerror)
(load feature :no-message :no-error)))
`progn
(message "stante-after: cannot find %s" feature)
'with-no-warnings)
(with-eval-after-load ',feature ,@forms)))
#+END_SRC
* Remember SQL input
Remembering input between sessions is a good thing.
@ -624,18 +794,6 @@
(expand-file-name "~/.emacs.d/sqliinput")))
#+END_SRC
* Lazily load some buffers
Don't load all buffers right away. Having a lot of buffers and
switching between projects a lot can take up quite a bit of time.
*Note:* See my [[Vacuous defvar][note]] on vacuous defvar for this use of =defvar=.
#+BEGIN_SRC emacs-lisp
(defvar desktop-restore-eager)
(setq desktop-restore-eager 5)
#+END_SRC
* Fix some term keybindings
=ansi-term= passes along a lot of characters correctly, but things
@ -662,72 +820,6 @@
(add-hook 'term-mode-hook #'oni:set-term-keys)
#+END_SRC
* Ask for a ~y~ or ~n~, not ~yes~ or ~no~.
Emacs starts out asking for you to type ~yes~ or ~no~ with most
important questions. It is possible that this is used for such
important questions where accidentally saying ~yes~ when you meant ~no~
would be catastrophic (or at least could be). However, I've never
(so far) had this problem, and I find it quite tedious to have to
write out ~yes~ or ~no~ and then press {{{kbd(RET)}}}, give me a simple
~y~ or ~n~ with no {{{kdb(RET)}}} required and I'm quite happy.
#+BEGIN_SRC emacs-lisp
(defalias 'yes-or-no-p 'y-or-n-p)
#+END_SRC
* Use =hippie-expand=, not =dabbrev-expand=
I've never actually used =dabbrev-expand=, and only rarely use
=hippie-expand= really, but since =hippie-expand= also includes a
=dabbrev= expander and a lot more than just that, it seems alright to
do this.
#+BEGIN_SRC emacs-lisp
(defalias 'dabbrev-expand 'hippie-expand)
#+END_SRC
* Setting up =load-path=
First, to help, I create a function that takes a path, adds it to
=load-path= and then checks to see if there is a file named
~loaddefs.el~ in the given path. If there is, it loads it. This
~loaddefs.el~ file is something that is created from autoload cookies
in the files in some of these paths.
Since the =load-path= is also important during byte-compilation, this
function should be defined both at run-time and compile-time.
#+BEGIN_SRC emacs-lisp
(eval-and-compile
(defun oni:loadpath-add-and-autoload (path)
"Add PATH to `load-path' and load a `loaddefs.el' if it exists."
(add-to-list 'load-path path)
(let ((loaddefs (concat path "/loaddefs.el")))
(when (file-exists-p loaddefs)
(load loaddefs)))))
#+END_SRC
After that I add some directories to my =load-path= so I can use these
libraries when wanted. One of these is the ~site-lisp~ directory in my
~.emacs.d~ directory, which is where I keep most of my personal
non-ELPA modules (like module-specific initialization files). There
are also some directories I include in ~vendor-lisp~, which is where I
keep modules that I didn't write myself and, for some reason, can't
or don't want to use ELPA for. Again it is important to realize that
this information is relevant both at run-time and compile-time, so
we wrap it with an =eval-and-compile=.
#+BEGIN_SRC emacs-lisp
(eval-and-compile
(mapc #'oni:loadpath-add-and-autoload
'("~/.emacs.d/site-lisp"
"~/.emacs.d/vendor-lisp/mozrepl"
"~/.emacs.d/vendor-lisp/eap" "/usr/share/emacs/site-lisp"
"/usr/lib/node_modules/tern/emacs/"
"~/.emacs.d/vendor-lisp/habitrpg.el")))
#+END_SRC
* Some unconditional settings
Here are some settings that either need to be changed before certain
@ -747,61 +839,6 @@
(setq gnus-init-file "~/.emacs.d/site-lisp/gnus-init")
#+END_SRC
** Turn off bidirectional text
To speed things up a little, and because I have no contacts at all
(so far) who use right-to-left text, there is no reason for me to
use bidirectional text. For this reason I tell Emacs to always use
left-to-right by default, instead of checking each paragraph.
#+BEGIN_SRC emacs-lisp
(setq-default bidi-paragraph-direction 'left-to-right)
#+END_SRC
** Don't use tabs
There is a war going on out there. Actually there are several, but
the one I'm talking about here is the one about tabs vs. spaces. I
have been deeply entrenched in the spaces camp for quite a while.
Indentation always gets screwy for me if I don't use the exact same
=tab-width= everyone else uses. I just like the consistency of using
spaces.
#+BEGIN_SRC emacs-lisp
(setq-default indent-tabs-mode nil)
#+END_SRC
** Use four spaces for indentation
I once, long ago, started out with using eight spaces for each
level of indentation. Although I think, technically, I was using
tabs. This means that even just 3 levels of indentation take up a
/huge/ amount of space that can't be used for anything else. Since I
also try to limit the length of the lines in my code, this can make
for very little code per line.
I also tried (and enjoyed) two spaces, but after a while, looking
at bigger files, I noticed that it all becomes a blur. Two spaces
is not a big-enough visual difference to make code read nicely, in
my opinion.
So far, I have quite enjoyed four spaces for most code[fn:8].
#+BEGIN_SRC emacs-lisp
(setq-default tab-width 4)
#+END_SRC
** Keep the message buffer from growing too large
Keep at most one-thousand messages in the ~*Messages*~ buffer. I can
leave my Emacs session running for quite long times, sometimes
days, at a time. If there are a lot of messages it can get a little
tricky to manage/search.
#+BEGIN_SRC emacs-lisp
(setq message-log-max 1000)
#+END_SRC
** Don't start =elnode= when Emacs starts
Elnode is an awesome project and I'm still looking for a moment
@ -1093,17 +1130,6 @@
(setq electric-pair-skip-whitespace 'chomp)
#+END_SRC
* Reject SSL/TLS certificates that don't check out
You just can't trust the internet. And I'd prefer to know if
something goes wrong.
#+BEGIN_SRC emacs-lisp
(defvar gnutls-verify-error)
(setq gnutls-verify-error t)
#+END_SRC
* Programming
Emacs is a real programmer's editor, especially so because it's so
@ -1495,16 +1521,6 @@
<<flycheck-display>>)
#+END_SRC
* Use Conkeror to browse URLs
Use the generic browse-url function to open URLs in Conkeror.
#+BEGIN_SRC emacs-lisp
(stante-after browse-url
(setq browse-url-browser-function 'browse-url-generic)
(setq browse-url-generic-program "conkeror"))
#+END_SRC
* Magit
Recently Magit gained the annoying habit of producing a /huge/ warning
@ -1568,7 +1584,12 @@
<<magit-auto-revert-mode>>)
#+END_SRC
* Load custom file
* Final touches
These options and calls need to come last so they don't interfere
with the rest of the initialization process, or get interfered with.
** Load custom file
I don't really use the Emacs customization interface much, but I
have used it as a kind-of persistent datastore, specifically for