My Emacs configuration (aka ".emacs")

Alex Kost fd7afe3a98 init/guix: Bind "H-x" to 'guix' vor 5 Jahren
data e115dd0718 data/bookmarks: Rename bookmark for my guix os config vor 7 Jahren
init fd7afe3a98 init/guix: Bind "H-x" to 'guix' vor 5 Jahren
utils b1733e76f2 utils/emms: Simplify the code of 'al/emms-short-track-description' vor 5 Jahren
.gitignore e543e4cbd4 gitignore: Ignore any "autoloads.el" vor 8 Jahren
LICENSE ffdfbe9e24 Initial commit vor 9 Jahren
Makefile c60fd1efa9 Makefile: Prefer ".el" if it is newer than ".elc" vor 7 Jahren
README.org 79a502f17e README: Mention that I don't 'require' stuff without a reason vor 7 Jahren

README.org

About

Ask fsbot on freenode about hell, and it will answer you that hell is other people's .emacs. This repo is my own hell and I like it very much.

It is not some elisp code that is pretended to be used by other people (like prelude, emacs-starter-kit or even dopemacs). It is *my own* Emacs config and it is intended to be used only by me.

Anyway here is what makes this hell so warm and comfortable for me.

Features

  • Unusable key bindings: I use hundreds and hundreds of non-standard key
  • bindings that are suitable for me. Besides I use dvorak layout, so my bindings may look really weird for other people. I use my code (from [[https://github.com/alezost/emacs-config/blob/master/keys.el][keys.el]]) based on [[https://github.com/jwiegley/use-package/blob/master/bind-key.el][bind-key]] to manage those tons of keys.
  • I prefer to split my config into several files than to keep everything
  • in a single one. And it is really easy to search them using [[https://github.com/alezost/imenus.el][imenus]]. I just press =s-s= (which is bound to =al/imenus-search-elisp-dir= from [[https://github.com/alezost/emacs-config/blob/master/utils/al-imenus.el][al-imenus.el]]) and jump to =with-eval-after-load= clause or perform =isearch= or =occur= if I need to search for something.
  • Currently I use quelpa to install/upgrade Emacs packages. I just run
  • =al/quelpa= command (with prefix if needed) to install or upgrade some package (or all packages). However I'm going to switch to [[http://www.gnu.org/software/guix/][GNU Guix]] for managing the Emacs packages I use (this is a work in progress: some of the packages are already handled by Guix, but most are still installed using Emacs package system and quelpa).
  • My Emacs config is intended to be robust. I mean it does not require
  • any third-party packages to be started successfully. So I can easily deploy my config on a fresh system: I just clone the repo and make [[~/.emacs.d/init.el]] file a symlink to my [[https://github.com/alezost/emacs-config/blob/master/init/init.el][init.el]]. Actually this process is even more simple, as I don't do this manually – I use my [[https://gitlab.com/alezost-config/config][config]] script to fetch and deploy all my configs including this Emacs config.
  • And I don't use use-package anymore (see commit 2e49f03). I used to
  • do it until I realized the importance of the previous point. When you use =use-package= in your config, it becomes a required dependency for starting Emacs, so on a "fresh" system, you need to install it at first, before you can use your config. Also someday it may be changed in a way that will break your system, and you'll have to fix your config without using it.
  • My Emacs start time is always less than a second according to =M-x
  • emacs-init-time= (actually, I have this value in my =initial-scratch-message= so I know the init time very well), because I don't =require= packages without a reason as some people do. Instead I use =with-eval-after-load= everywhere.

Files

As you can see, this repository consists of the following directories:

  • =init=: The files that are loaded on Emacs start. As described above
  • [[file:init/init.el]] is the "main" init file. It defines some major things and then loads the rest files from this directory.
  • =utils=: These are my various auxiliary small packages with the
  • additional code (for Emacs itself and for external packages) that is not needed for start-up. All of the code there have "al/" prefix and are placed in files that provide "al-…" features. My init files are full of things like:

#+BEGIN_SRC emacs-lisp (with-eval-after-load 'eshell ;; ... (when (require 'al-eshell nil t) ;; ... )) #+END_SRC

So these utils are loaded only if and when they are needed. Also there are many interactive commands there which are autoloaded (I use al/update-autoloads command to update these autoloads).

In the past these utils were placed in a separate repository and had "utl-" prefix.

  • =data=: Just some Emacs related data (like eshell aliases or my
  • yasnippets) that I use.