Start cleaning up basic structure
This commit is contained in:
parent
dea9949d4b
commit
85fe9b1ab3
1 changed files with 436 additions and 415 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue