Ask HN: What's in your .emacs file?
I recently accidentally lost my .emacs file which I'd tweaked and put together over the last 5 years. I though this would be a good chance to ask you, what's in your .emacs file?
(
52 comments
| 121 points
| on HN
)
The basic init.el file loads my various language modes, and some other minor modes (e.g., tempbuf-mode). It also loads a bunch of files from the "emacs.d/my_lisp" directory which contains various overrides and new functionality attached to existing modes (e.g., icicles customization, assorted one-off functions I want to add to modes). Lastly, it loads a bunch more files from my emacs.d/lisp directory which implement custom functionality.
For example, the current emacs M-x eshell doesn't behave the way I like. I often want multiple shells, so I've build a "ring of shells" functionality: f6 cycles through the ring of shells, C-f6 creates new shell window in the ring. I did something similar with window configurations.
Also, the emacs.d stores all modes which I use regularly. So when I migrate to a new computer, all I need to do is
and tweak a few settings.Lots of cruft (roughly 10 years worth), although I did recently start to refactor.
Most notable: it's fairly portable and relocatable, thanks to a snippet I cooked up (probably not original, but I haven't seen it else-where): http://everythingtastesbetterwithchilli.com/initialisation-f... (check it out anywhere and just symlink init.el to ~/.emacs, it figures out all paths from there. It'll also load platform-specific code, if you need that).
I try and make it lazier by combining autoload and eval-after-load, which helps with startup time.
On an organisational point (still work to be done here!), init.el mostly just loads a bunch of other files, which are roughly grouped by task or mode. Github has been a huge boon, combined with submodules to track a lot of third-party extensions.
I don't change many key bindings (most notable is the Yegge-suggested C-w for backward-kill-word), but I do have a /lot/ of extensions installed. I'm a fairly heavy user, although almost exclusively as an editor (+ lisp or python interaction, etc) -- I don't use it as a mail client, browser, or anything along those lines. The furthest away I get is the occasional twitter or IRC usage.
While I'm rambling: I'd like to make all my key-binding specifications consistent. Currently I have a mix of string specifications, vectors, kbd macros, etc. Does anyone know what the canonical approach is these days? Extra reference: http://www.nongnu.org/emacs-tiny-tools/keybindings/ and http://www.emacswiki.org/emacs/KeyBindingNotation
For uninitiated, C-w is "yank text", i.e. cut it, and Firefox it is "close current tab without warning".
https://addons.mozilla.org/en-US/firefox/addon/4141
Still, your lapse is pretty good. Sometimes I can't even name the keys -- but my fingers know :)
Clone that as your emacs.d, add a .el file named the same as your logged in user, and add your specific preferences there. (I like to have it include stuff in a jmhodges directory in emacs.d, of course.)
On that note, my own fork of it with very minor personal changes: https://github.com/jmhodges/emacs-starter-kit
;; Switch buffer
(global-set-key [f5] 'buffer-menu)
;; Save and load
(global-set-key [f2] 'save-buffer)
(global-set-key [f3] 'find-file)
;; Compile file
(global-set-key [f9] 'slime-compile-and-load-file)
;; Goto line
(global-set-key "\M-l" 'goto-line)
;; Go to other window
(global-set-key (kbd "<C-tab>") 'other-window)
;; And probably the most useful one, numpad Enter for eval line:
(global-set-key (kbd "<kp-enter>") 'slime-eval-last-expression)
(setq transient-mark-mode t) ; visually show region
(setq line-number-mode t) ; show line numbers
(setq global-font-lock-mode 1) ; everything should use font
(windmove-default-keybindings) ; shift-arrow key moves to window in that direction
I set up `webjump' to search online API documentation
http://justinsboringpage.blogspot.com/2009/05/emacs-searchin...
I like to send gmail
http://justinsboringpage.blogspot.com/2009/02/sending-mail-w...
I think this is the most important one
(setq visible-bell t) ; annoying beeps off
Granted, you could probably do that with transient mark mode, but seeing everything highlighted would be too annoying.
http://www.nongnu.org/bm/
Now, I used to work for Google and most people there let you see their own home directories and I used that as an opportunity to learn from Stevey's setup.
There are a lot of customization going on and I should do a separate blog post about the setup. Here are I just cherry-picked some recent configuration favorites of mine:
And then I have this in my .emacs:
I try to get in the habit of using C-cC-e instead of C-xC-f or C-x b. Anything is just too useful as a file/buffer finder.http://bitbucket.org/[redacted]/dotfiles/src/tip/.emacs.d/pl...
Probably my favorite bit of the config is that it uses flymake to run Pyflakes on my Python code as I'm writing it. I also have a little plugin that shows the error in the minibuffer area when the point is over the offending line.
It also disables backup/autosave file littering by using a locked down directory in /tmp.
As far as bindings go, I wrote delete-backward-indent for python-mode which deletes a level of indentation instead of just one space. There's also newline-maybe-indent that doesn't indent if the previous line has no indentation.
Everything else is pretty straightforward customization, I think. flyspell-prog-mode is another thing worth mentioning: it highlights spelling errors, but only in strings and comments.
rebindings are useful, such ctrl-q for M-x goto-line: (global-set-key "\C-q" 'goto-line)
I cribbed the following from someone else, but i find it most awesome:
; ===== Put auto-save, backup files in one place ===
;; Put autosave files (ie #foo#) in one place, not ;; scattered all over the file system! (defvar autosave-dir (concat "/Users/diN0bot/.emacs.d/auto-save-list/"))
(make-directory autosave-dir t)
(defun auto-save-file-name-p (filename) (string-match "^#.*#$" (file-name-nondirectory filename)))
(defun make-auto-save-file-name () (concat autosave-dir (if buffer-file-name (concat "#" (file-name-nondirectory buffer-file-name) "#") (expand-file-name (concat "#%" (buffer-name) "#")))))
;; Put backup files (ie foo~) in one place too. (The backup-directory-alist ;; list contains regexp=>directory mappings; filenames matching a regexp are ;; backed up in the corresponding directory. Emacs will mkdir it if necessary.) (defvar backup-dir (concat "/Users/diN0bot/.emacs.d/backup-file-list/")) (setq backup-directory-alist (list (cons "." backup-dir)))
(fset 'yes-or-no-p 'y-or-n-p)
http://github.com/technomancy/emacs-starter-kit
most useful parts: replacing fundamental mode with text-mode as the default mode when a new buffer is open.
(setq default-major-mode 'text-mode)
turn auto fill (automatic line wraping) and flyspell (spellchecking) on by default
(add-hook 'text-mode-hook 'turn-on-auto-fill)
(add-hook 'text-mode-hook 'turn-on-flyspell)
also I find yasnippet http://code.google.com/p/yasnippet/ wonderful for coding html mockups and django templates.
my github repo if anyone cares to take a peek: http://github.com/bmac/emacs
As folks successively quote each other in a thread, the prepending of '>' to the quoted text requires something narrower than 80, else it'll hit the 80-chars-wide limit and wrap.
72 would allow 4 or 8 quote-levels, depending on if your client decides to insert spaces around the '>'.
Mine's pretty minimal at the moment, but it does the job.
delete-delete-delete save-buffer Much better.
I hear ya.
One of the things I started doing lately is not moving any dotfiles automatically when I get a new machine. After 3 days of moaning, I go and dig out just the stuff that I have noticed I am missing. (I do the same for firefox plugins and so on). It has definitely helped with the historical crud.
(require 'activator) (activator-start)
Which then looks at all of the stuff here: http://github.com/apgwoz/emacs-config
http://github.com/larrywright/emacs
The default undo history is only 32. I like to be able to go further back.
(defun init-streamfocus () (interactive)
;; Slime is for starting or connecting to SBCL ;; To start: C-x slime RET (add-to-list 'load-path "c:/Otech/sf/lib/slime")
;;(setq inferior-lisp-program "C:/Otech/programs/sbcl-1.0.9/sbcl")
(add-hook 'lisp-mode-hook (lambda () (slime-mode t))) (add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode t))) ;; (defun lw-start () ;; (interactive) ;; (shell-command (concat "C:/Program Files/LispWorks/lispworks-4450.exe -multiprocessing " ;; "-init c:/Otech/swank.lisp&")));;;For SBCL on Windows ;(setq inferior-lisp-program "sbcl") ;(add-to-list 'load-path "C:/Program Files/Steel Bank Common Lisp/1.0.22/sbcl.exe")
;;For Allegro on Windows (setq inferior-lisp-program "allegro") (add-to-list 'load-path "C:/Program Files/acl81/allegro.exe")
(require 'slime) (slime-setup '(slime-fancy slime-banner))
;;allegro (global-set-key "\C-cs" 'slime-selector) (setq slime-complete-symbol-fancy t) (setq slime-complete-symbol-function 'slime-fuzzy-complete-symbol)
(setq slime-multiprocessing t) ;; choose one of the below based on Express or non-Express usage ;(setq slime-lisp* "alisp.exe") (setq slime-lisp "allegro.exe")
;;;; For remote slime ;; see http://a1k0n.net/blah/archives/2005/11/04/T18_00_44/index.ht... (require 'tramp) (defvar cayenne-path "/sshx:streamfocus@cayenne:") (defvar current-tramp-path nil) ;;;; TRAMP remote editing. See notes for NTEmacs on http://www.emacswiki.org/cgi-bin/wiki/TrampMode (setq tramp-default-method "sshx") ;;;; SLIME settings to edit remote files on rembrandt ;(push (list "^cayenne$" ; (lambda (emacs-filename) ; (subseq emacs-filename (length "/cayenne:"))) ; (lambda (lisp-filename) ; (concat "/cayenne:" lisp-filename))) ; slime-filename-translations) (defun init-clojure () "Inits slime for streamfocus" (interactive) ;; clojure-mode (add-to-list 'load-path "C:/Otech/programs/clojure/clojure-mode") (require 'clojure-mode)