5.7 KiB
Emacs Configuration
Shout out to Harry R. Schwartz; A whole bunch of this config (including the idea of embeddeding the lot in an Org document) is yanked from his dotfiles repo.
The rest of this config grabs packages via use-package
, so that
needs to be set up to install them if they aren't already.
(require 'use-package-ensure)
(setq use-package-always-ensure t)
UI
The start-up message gets pretty annoying, so disable that.
(setq inhibit-startup-screen t)
The default window size is just a little too small for my taste.
(when window-system (set-frame-size (selected-frame) 90 48))
Also, the menu-, tool- and scroll-bar are ugly, take up space and I don't use them.
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)
Colour Scheme
Currently using spacemacs-theme
's light variant, but I prefer a pure
white background to the off-white it has by default.
(use-package spacemacs-theme
:defer t)
(setq spacemacs-theme-custom-colors
'((bg1 . "#ffffff")
(comment-bg . "#ffffff")))
(load-theme 'spacemacs-light t)
Font
I am addicted to programming ligatures but Fira Code (my preferred ligature font) requires some hackery to display properly; this is defined in fira-code-mode.el so first we load that.
(add-to-list 'load-path "/home/cdo/.emacs.d/fira-code-mode")
(require 'fira-code-mode)
And then make sure that mode is enabled for any prog-mode
buffer.
(add-hook 'prog-mode-hook 'fira-code-mode)
Magit
magit
is truly a wonderful creation! Only deviations from defaults
here are a keybinding for magit-status
and a maximum length for the
summary line of commit messages (after which the excess is
highlighted).
(use-package magit
:bind
("C-x g" . magit-status)
:config
(setq git-commit-summary-max-length 50))
Language Integrations
Generally, 8-character-wide tabs are not my thing.
(setq-default tab-width 4)
(setq-default basic-offset 4)
C
For C, I like to indent with tabs and align with spaces: this
behaviour is provided by smart-tabs-mode
.
(use-package smart-tabs-mode)
(smart-tabs-insinuate 'c)
I'll generally format my code in BSD style but I also use
clang-format
a lot, so I have a keybinding to run that.
(setq c-default-style "bsd")
(use-package clang-format)
(add-hook 'c-mode-hook
(lambda ()
(define-key c-mode-map (kbd "C-M-f")
'clang-format-buffer)))
Meson is my build system of choice for C, but I also use CMake a lot.
(use-package meson-mode)
(use-package cmake-mode)
Haskell
My workflow with Haskell is very REPL-based, so I always want
interactive-haskell-mode
on.
(use-package haskell-mode)
(require 'haskell-interactive-mode)
(add-hook 'haskell-mode-hook 'interactive-haskell-mode)
And, of course, that REPL needs to be taking advantage of parallelism!
(require 'haskell-process)
(set-variable 'haskell-process-args-ghci
'("-threaded" "+RTS" "-N8" "-RTS"))
Idris
The only thing to change from the defaults here is to add a more convenient way to case-split.
(use-package idris-mode)
(add-hook 'idris-mode-hook
(lambda ()
(define-key idris-mode-map (kbd "C-c SPC")
'idris-case-split)))
Rust
I never really use Rust without Cargo, so always turn on the minor mode for Cargo in Rust buffers.
(use-package rust-mode)
(use-package cargo)
(add-hook 'rust-mode-hook 'cargo-minor-mode)
Lisps
Get racket-mode
for some Racket-specific things, like searching documentation
(use-package racket-mode)
paredit
is generally very useful for balancing parenthesis so we
want that turned on for all the lisps. Additionally, it's nice to have
an entire expression highlighted when the cursor is on one of its
enclosing parens.
(use-package paredit)
(setq lispy-mode-hooks
'(emacs-lisp-mode-hook
lisp-mode-hook
racket-mode-hook
scheme-mode-hook))
(dolist (hook lispy-mode-hooks)
(add-hook hook (lambda ()
(setq show-paren-style 'expression)
(paredit-mode))))
Org-mode
I use a couple non-standard bits and pieces, but not a whole bunch. I
really like the <s
to insert a source block thing (which was
deprecated); org-tempo
brings that back.
(use-package org
:ensure org-plus-contrib
:config
(require 'org-tempo))
Org is better suited as scratch space than Emacs lisp, I'd say.
(setq initial-major-mode 'org-mode)
Source Blocks
Pressing tab inside a source block should indent appropriately for its language.
(setq org-src-tab-acts-natively t)
babel
lets us evaluate Org documents containing source blocks! I
currently only use it for this very file, so it's only turned on for
Emacs lisp.
(org-babel-do-load-languages
'org-babel-load-languages
'((emacs-lisp . t)))
HTML Exporting
htmlize
is needed for decent HTML exporting, and there is no need
for all that stuff at the bottom.
(use-package htmlize)
(setq org-html-postamble nil)