├── .gitignore ├── README.md ├── customizations ├── editing.el ├── elisp-editing.el ├── filetree.el ├── git.el ├── navigation.el ├── projects.el ├── setup-clojure.el ├── setup-js.el ├── shell-integration.el └── ui.el ├── early-init.el └── init.el /.gitignore: -------------------------------------------------------------------------------- 1 | .smex-items 2 | *~$ 3 | places 4 | .recentf 5 | ido.last 6 | cider-history 7 | projectile-bookmarks.eld 8 | projectile.cache 9 | auto-save-list 10 | backups 11 | melpa-stable 12 | elpa 13 | custom.el 14 | archive-contents 15 | *.elc 16 | .cache 17 | recentf 18 | transient 19 | network-security.data 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # this is a Clojure-friendly emacs config 2 | 3 | If you're new to emacs, check out 4 | [this introductory tutorial](http://www.braveclojure.com/basic-emacs/)! 5 | 6 | ## Installing 7 | 8 | 1. Close Emacs. 9 | 2. Delete `~/.emacs` or `~/.emacs.d` if they exist. (Windows users, your 10 | emacs files will probably live in 11 | `C:\Users\your_user_name\AppData\Roaming\`. So, for example, you 12 | would delete `C:\Users\jason\AppData\Roaming\.emacs.d`.) This is 13 | where Emacs looks for configuration files, and deleting these files 14 | and directories will ensure that you start with a clean slate. 15 | 3. Download the Emacs 16 | [configuration zip file](https://github.com/flyingmachine/emacs-for-clojure/archive/book1.zip) 17 | and unzip it. Its contents should be a folder, 18 | `emacs-for-clojure-book1`. Run `mv path/to/emacs-for-clojure-book1 19 | ~/.emacs.d`. 20 | 21 | Then open Emacs. The first time you start, it will take a few minutes, 22 | because it needs to download and install around fifty packages. You 23 | will see some warnings pop up, but they are only style suggestions for 24 | the packages being loaded. 25 | 26 | ## Prerequisites 27 | Since you're working in Clojure, we assume you have it and its prerequisites 28 | installed (see [this guide](https://clojure.org/guides/install_clojure) for 29 | those instructions). Additionally, you're likely to want to have 30 | [Leiningen](https://leiningen.org/) installed, since many many projects use 31 | it for running builds, tests, and tasks. 32 | 33 | To support specific features of this emacs configuration, there are three more 34 | prerequisites: 35 | 36 | 1. [git](https://git-scm.com/) is the dominant system for source code 37 | version control. There's a good chance it came installed with your operating 38 | system of choice, but in case it didn't, you'll want it! 39 | 2. [clojure-lsp](https://clojure-lsp.io/installation/) enables Find References, 40 | live linting, and many more features. 41 | 3. To get nice icons in your modeline, you need the fonts installed. After 42 | startup the first time, run `M-x all-the-icons-install-fonts`. You will only 43 | need to do this once. 44 | 45 | ### A Word About Project-Wide Search 46 | One of the capabilities that comes in very handy is searching for some text 47 | across all the files within your project. You can use git for that with the following 48 | command: `M-x counsel-git-grep`. This works just fine, with the caveat that it 49 | _must_ be in a directory version-controlled with git. There are quite a few 50 | alternative search utilities, but you'll have to install them separately. In 51 | practice, you'll probably settle on one you like and use it exclusively. Here 52 | are the links, along with the emacs command to invoke each: 53 | 54 | * [ack](https://beyondgrep.com/) `M-x counsel-ack` 55 | * [The Silver Searcher](https://github.com/ggreer/the_silver_searcher) `M-x 56 | counsel-ag` 57 | * [The Platinum 58 | Searcher](https://github.com/monochromegane/the_platinum_searcher) `M-x 59 | counsel-pt` 60 | * [ripgrep](https://github.com/BurntSushi/ripgrep) `M-x counsel-rg` 61 | 62 | ## Features 63 | This will allow you to edit Clojure files with syntax-aware 64 | highlighting and [structural 65 | editing](https://clojure.org/guides/structural_editing) 66 | via paredit, which means it will keep all your delimiters for nested forms 67 | balanced (think parens, square brackets, and curly braces). Check out [this animated 68 | guide](http://danmidwood.com/content/2014/11/21/animated-paredit.html) 69 | to paredit. It's one of those things that seems strange at first, but 70 | once you get used to it, you won't want to edit Clojure without it! 71 | 72 | Other excellent capabilities you'll want to know about include: 73 | 74 | * [CIDER](https://cider.mx/), a fully interactive Clojure environent 75 | * [clojure-lsp](https://clojure-lsp.io/), provides static analysis 76 | features for Clojure, such as live style and syntax warnings 77 | * [Projectile](https://projectile.mx/), navigate and manage project 78 | files 79 | * [Magit](https://magit.vc/), a complete interface to git 80 | * [Treemacs](https://github.com/Alexander-Miller/treemacs), a tree 81 | layout file explorer 82 | 83 | ## Upgrading 84 | Each package we use gets updated by its authors, at whatever cadence works for 85 | them. It's a good idea to stay up-to-date, to get improvements and bug 86 | fixes. It's analogous to keeping the software up-to-date in your operating 87 | system. 88 | 89 | When you run `M-x list-packages` it refreshes the cache of all the package 90 | repositories, and then tells you in the status line whether there are any 91 | updates to install. Press `U` to mark all upgradeable packages for installation, 92 | and then press `x` to execute the installation. You will be prompted to confirm, 93 | and when you press `y` the package updates will be installed. Press `q` to exit 94 | the package list when it's finished. 95 | 96 | If you ever get curious to look, you can find all the installed packages in `~/.emacs.d/elpa`. 97 | 98 | ## Organization 99 | 100 | I've tried to separate everything logically and document the purpose 101 | of every line. [`init.el`](./init.el) acts as a kind of table of 102 | contents. It's a good idea to eventually go through `init.el` and the 103 | files under the `customizations` directory so that you know exactly 104 | what's going on. 105 | 106 | ## Supporting CSS, HTML, JS, etc. 107 | 108 | Emacs has decent support for CSS, HTML, JS, and many other file types 109 | out of the box, but if you want better support, then have a look at 110 | [my personal emacs config's 111 | init.el](https://github.com/flyingmachine/emacs.d/blob/master/init.el). 112 | It's meant to read as a table of contents. The emacs.d as a whole adds the following: 113 | 114 | * [Customizes js-mode and html editing](https://github.com/flyingmachine/emacs.d/blob/master/customizations/setup-js.el) 115 | * Sets indentation level to 2 spaces for JS 116 | * enables subword-mode so that M-f and M-b break on capitalization changes 117 | * Uses `tagedit` to give you paredit-like functionality when editing html 118 | * adds support for coffee mode 119 | * [Uses enh-ruby-mode for ruby 120 | editing](https://github.com/flyingmachine/emacs.d/blob/master/customizations/setup-ruby.el). 121 | enh-ruby-mode is a little nicer than the built-in ruby-mode, in my opinion. 122 | * Associates many filenames and extensions with enh-ruby-mode (.rb, .rake, Rakefile, etc) 123 | * Adds keybindings for running specs 124 | * Adds support for YAML and SCSS using the yaml-mode and scss-mode packages 125 | 126 | In general, if you want to add support for a language then you should 127 | be able to find good instructions for it through Google. Most of the 128 | time, you'll just need to install the "x-lang-mode" package for it. 129 | -------------------------------------------------------------------------------- /customizations/editing.el: -------------------------------------------------------------------------------- 1 | ;; Customizations relating to editing a buffer. 2 | 3 | ;; Key binding to use "hippie expand" for text autocompletion 4 | ;; http://www.emacswiki.org/emacs/HippieExpand 5 | (global-set-key (kbd "M-/") 'hippie-expand) 6 | 7 | ;; Lisp-friendly hippie expand 8 | (setq hippie-expand-try-functions-list 9 | '(try-expand-dabbrev 10 | try-expand-dabbrev-all-buffers 11 | try-expand-dabbrev-from-kill 12 | try-complete-lisp-symbol-partially 13 | try-complete-lisp-symbol)) 14 | 15 | ;; Highlights matching parenthesis 16 | (show-paren-mode 1) 17 | 18 | ;; Highlight current line 19 | (global-hl-line-mode 1) 20 | 21 | ;; line numbers 22 | (global-display-line-numbers-mode 1) 23 | ;; but not everywhere 24 | (dolist (mode '(org-mode-hook 25 | term-mode-hook 26 | shell-mode-hook 27 | treemacs-mode-hook 28 | eshell-mode-hook)) 29 | (add-hook mode (lambda () (display-line-numbers-mode 0)))) 30 | 31 | ;; Don't use hard tabs 32 | (setq-default indent-tabs-mode nil) 33 | 34 | ;; shell scripts 35 | (setq-default sh-basic-offset 2 36 | sh-indentation 2) 37 | 38 | ;; When you visit a file, point goes to the last place where it 39 | ;; was when you previously visited the same file. 40 | ;; http://www.emacswiki.org/emacs/SavePlace 41 | (save-place-mode 1) 42 | ;; keep track of saved places in ~/.emacs.d/places 43 | (setq save-place-file (concat user-emacs-directory "places")) 44 | 45 | ;; Emacs can automatically create backup files. This tells Emacs to 46 | ;; put all backups in ~/.emacs.d/backups. More info: 47 | ;; http://www.gnu.org/software/emacs/manual/html_node/elisp/Backup-Files.html 48 | (setq backup-directory-alist `(("." . ,(concat user-emacs-directory 49 | "backups")))) 50 | (setq auto-save-default nil) 51 | 52 | ;; comments 53 | (defun toggle-comment-on-line () 54 | "comment or uncomment current line" 55 | (interactive) 56 | (comment-or-uncomment-region (line-beginning-position) (line-end-position))) 57 | (global-set-key (kbd "C-;") 'toggle-comment-on-line) 58 | 59 | ;; use 2 spaces for tabs 60 | (defun die-tabs () 61 | (interactive) 62 | (set-variable 'tab-width 2) 63 | (mark-whole-buffer) 64 | (untabify (region-beginning) (region-end)) 65 | (keyboard-quit)) 66 | 67 | ;; fix weird os x kill error 68 | (defun ns-get-pasteboard () 69 | "Returns the value of the pasteboard, or nil for unsupported formats." 70 | (condition-case nil 71 | (ns-get-selection-internal 'CLIPBOARD) 72 | (quit nil))) 73 | 74 | (setq electric-indent-mode nil) 75 | -------------------------------------------------------------------------------- /customizations/elisp-editing.el: -------------------------------------------------------------------------------- 1 | ;; paredit enables structural editing of just about any lisp 2 | ;; https://www.emacswiki.org/emacs/ParEdit 3 | (setup (:package paredit) 4 | (:hook-into emacs-lisp-mode 5 | eval-expression-minibuffer-setup 6 | ielm-mode 7 | lisp-mode 8 | lisp-interaction-mode 9 | scheme-mode)) 10 | 11 | (setup turn-on-eldoc-mode 12 | (:hook-into emacs-lisp-mode 13 | lisp-interaction-mode 14 | iel-mode)) 15 | 16 | ;; rainbow-delimiters makes nested parentheses easier to 17 | ;; follow by showing each pair in its own color. 18 | ;; Depending on your theme, the colors might be very subtle, 19 | ;; and not very rainbow! 20 | ;; https://github.com/Fanael/rainbow-delimiters 21 | (setup (:package rainbow-delimiters) 22 | (:hook-into prog-mode)) 23 | -------------------------------------------------------------------------------- /customizations/filetree.el: -------------------------------------------------------------------------------- 1 | ;; treemacs is a tree layout file explorer 2 | ;; https://github.com/Alexander-Miller/treemacs 3 | (setup (:package treemacs treemacs-projectile treemacs-magit) 4 | (:global "M-0" treemacs-select-window 5 | "M-o" ace-window ;; treemacs brings ace-window as a dependency 6 | "s-b" treemacs)) 7 | -------------------------------------------------------------------------------- /customizations/git.el: -------------------------------------------------------------------------------- 1 | ;; magit is a full-fledged interface for git 2 | ;; https://magit.vc/manual/magit/ 3 | (add-to-list 'package-pinned-packages '(magit . "melpa-stable") t) 4 | (setup (:package magit) 5 | (:global "C-M-;" magit-status)) 6 | -------------------------------------------------------------------------------- /customizations/navigation.el: -------------------------------------------------------------------------------- 1 | ;; These customizations make it easier for you to navigate files, 2 | ;; switch buffers, and choose options from the minibuffer. 3 | 4 | ;; which-key is the best feature for the discoverability and 5 | ;; usability of Emacs. When you start a key sequence, e.g. C-x, 6 | ;; a menu opens up that shows you what all your next options 7 | ;; are. It's a great way to find out what's in Emacs, and it 8 | ;; helps transfer commands from your short-term memory to 9 | ;; your long-term memory and (finally) your muscle memory. 10 | (setup (:package which-key) 11 | (which-key-mode) 12 | (:option which-key-idle-delay 0.3)) 13 | 14 | ;; ivy is the completion framework. This makes M-x much more usable. 15 | ;; Installing counsel brings ivy and swiper as dependencies 16 | ;; swiper is a powerful search-within-a-buffer capability. 17 | ;; https://github.com/abo-abo/swiper 18 | (setup (:package counsel) 19 | (ivy-mode) 20 | (:option ivy-use-virtual-buffers t 21 | ivy-re-builders-alist '((t . ivy--regex-ignore-order)) 22 | ivy-count-format "%d/%d ") 23 | (:global "C-s" swiper 24 | "s-f" swiper 25 | "C-x C-f" counsel-find-file 26 | "C-x C-b" counsel-switch-buffer 27 | "M-x" counsel-M-x)) 28 | 29 | ;; ivy-rich-mode adds docstrings and additional metadata 30 | ;; in the ivy picker minibuffer 31 | ;; see screenshots: https://github.com/Yevgnen/ivy-rich/blob/master/screenshots.org 32 | (setup (:package ivy-rich) 33 | (ivy-rich-mode)) 34 | -------------------------------------------------------------------------------- /customizations/projects.el: -------------------------------------------------------------------------------- 1 | ;; projectile is another amazing package from the 2 | ;; creator of CIDER. It's got lots of commands 3 | ;; for searching and managing files in a project. 4 | ;; https://projectile.mx/ 5 | (setup (:package projectile) 6 | (projectile-mode +1) 7 | (:bind "s-p" projectile-command-map 8 | "C-c p" projectile-command-map)) 9 | 10 | ;; counsel-projectile integrates projectile with 11 | ;; counsel's browse-and-select UI 12 | (setup (:package counsel-projectile)) 13 | -------------------------------------------------------------------------------- /customizations/setup-clojure.el: -------------------------------------------------------------------------------- 1 | ;; See: https://clojure-lsp.io/ 2 | ;; also: https://emacs-lsp.github.io/lsp-mode/ 3 | (setup (:package lsp-mode lsp-ui lsp-ivy lsp-treemacs) 4 | (:hook lsp-enable-which-key-integration) 5 | (:bind "M-" lsp-find-references)) 6 | 7 | ;; clojure-mode is (naturally) the major mode for editing 8 | ;; Clojure and ClojureScript. subword-mode allows words 9 | ;; in camel case to be treated as separate words for 10 | ;; movement and editing commands. 11 | ;; https://github.com/clojure-emacs/clojure-mode 12 | ;; subword-mode is useful for working with camel-case tokens, 13 | ;; like names of Java classes (e.g. JavaClassName) 14 | (setup (:package clojure-mode) 15 | (:hook subword-mode 16 | paredit-mode 17 | lsp)) 18 | 19 | ;; CIDER is a whole interactive development environment for 20 | ;; Clojure. There is a ton of functionality here, so be sure 21 | ;; to check out the excellent documentation at 22 | ;; https://docs.cider.mx/cider/index.html 23 | (setup (:package cider) 24 | (:bind "C-c u" cider-user-ns 25 | "C-M-r" cider-refresh) 26 | (:option cider-show-error-buffer t 27 | cider-auto-select-error-buffer t 28 | cider-repl-history-file "~/.emacs.d/cider-history" 29 | cider-repl-pop-to-buffer-on-connect t 30 | cider-repl-wrap-history t)) 31 | 32 | ;; company provides auto-completion for CIDER 33 | ;; see https://docs.cider.mx/cider/usage/code_completion.html 34 | (setup (:package company) 35 | (:hook-into cider-mode 36 | cider-repl-mode)) 37 | 38 | ;; hydra provides a nice looking menu for commands 39 | ;; to see what's available, use M-x and the prefix cider-hydra 40 | ;; https://github.com/clojure-emacs/cider-hydra 41 | (setup (:package cider-hydra) 42 | (:hook-into clojure-mode)) 43 | 44 | ;; additional refactorings for CIDER 45 | ;; e.g. add missing libspec, extract function, destructure keys 46 | ;; https://github.com/clojure-emacs/clj-refactor.el 47 | (setup (:package clj-refactor) 48 | (cljr-add-keybindings-with-prefix "C-c C-m") 49 | (:hook-into clojure-mode)) 50 | 51 | ;; enable paredit in your REPL 52 | (setup cider-repl-mode 53 | (:hook paredit-mode)) 54 | 55 | ;; Use clojure mode for other extensions 56 | (add-to-list 'auto-mode-alist '("\\.boot$" . clojure-mode)) 57 | (add-to-list 'auto-mode-alist '("\\.cljs.*$" . clojure-mode)) 58 | (add-to-list 'auto-mode-alist '("lein-env" . enh-ruby-mode)) 59 | 60 | ;; these help me out with the way I usually develop web apps 61 | (defun cider-start-http-server () 62 | (interactive) 63 | (cider-load-buffer) 64 | (let ((ns (cider-current-ns))) 65 | (cider-repl-set-ns ns) 66 | (cider-interactive-eval (format "(println '(def server (%s/start))) (println 'server)" ns)) 67 | (cider-interactive-eval (format "(def server (%s/start)) (println server)" ns)))) 68 | 69 | (defun cider-refresh () 70 | (interactive) 71 | (cider-interactive-eval (format "(user/reset)"))) 72 | 73 | (defun cider-user-ns () 74 | (interactive) 75 | (cider-repl-set-ns "user")) 76 | 77 | -------------------------------------------------------------------------------- /customizations/setup-js.el: -------------------------------------------------------------------------------- 1 | ;; javascript / html 2 | (setup (:package tagedit) 3 | (:hook-into html-mode)) 4 | 5 | (setup subword-mode 6 | (:hook-into js-mode 7 | html-mode 8 | coffee-mode)) 9 | 10 | (setq js-indent-level 2) 11 | 12 | ;; coffeescript 13 | (setup coffee-mode 14 | (:hook highlight-indentation-current-column-mode 15 | (defun coffee-mode-newline-and-indent () 16 | (define-key coffee-mode-map "\C-j" 'coffee-newline-and-indent) 17 | (setq coffee-cleanup-whitespace nil)))) 18 | 19 | (custom-set-variables 20 | '(coffee-tab-width 2)) 21 | -------------------------------------------------------------------------------- /customizations/shell-integration.el: -------------------------------------------------------------------------------- 1 | ;; Sets up exec-path-from shell 2 | ;; https://github.com/purcell/exec-path-from-shell 3 | (setup 4 | (when (memq window-system '(mac ns)) 5 | (:package exec-path-from-shell) 6 | (exec-path-from-shell-initialize))) 7 | -------------------------------------------------------------------------------- /customizations/ui.el: -------------------------------------------------------------------------------- 1 | ;; These customizations change the way emacs looks and disable/enable 2 | ;; some user interface elements. Some useful customizations are 3 | ;; commented out, and begin with the line "CUSTOMIZE". These are more 4 | ;; a matter of preference and may require some fiddling to match your 5 | ;; preferences 6 | 7 | (tooltip-mode -1) ;; disable tooltips 8 | (tool-bar-mode -1) ;; the toolbar is pretty ugly 9 | (scroll-bar-mode -1) ;; disable visible scrollbar 10 | (blink-cursor-mode 0) ;; turn off blinking cursor. distracting! 11 | (setq create-lockfiles nil) ;; no need for ~ files when editing 12 | (fset 'yes-or-no-p 'y-or-n-p) ;; changes all yes/no questions to y/n type 13 | (setq inhibit-startup-message t) ;; go straight to scratch buffer on startup 14 | (setq ring-bell-function 'ignore) ;; turn off audible bell 15 | 16 | ;; show full path in title bar 17 | (setq-default frame-title-format "%b (%f)") 18 | 19 | ;; initial frame height and width 20 | (add-to-list 'default-frame-alist '(height . 45)) 21 | (add-to-list 'default-frame-alist '(width . 100)) 22 | 23 | ;; increase font size for better readability 24 | (set-face-attribute 'default nil :height 140) 25 | 26 | ;; on a Mac, don't pop up font menu 27 | (when (string-equal system-type "darwin") 'ok 28 | (global-set-key (kbd "s-t") '(lambda () (interactive)))) 29 | 30 | ;; doom is a whole Emacs distribution unto itself, 31 | ;; but it's got some really nice packages that you 32 | ;; can use a-la-carte. doom-modeline is simply a more 33 | ;; modern and more beautiful modeline. 34 | ;; doom-modeline uses nice icons from all-the-icons 35 | (setup (:package all-the-icons)) 36 | 37 | ;; for some reason, this crashes Emacs on Windows. Argh! 38 | (setup (when (not (string-equal system-type "windows-nt")) 39 | (:package doom-modeline) 40 | (doom-modeline-mode t))) 41 | 42 | ;; Lots of great themes, both light ones 43 | ;; and dark ones. Use M-x load-theme to select one. 44 | ;; The first time you load one, it asks for 45 | ;; confirmation. You can see what they all 46 | ;; look like here: 47 | ;; https://github.com/doomemacs/themes/tree/screenshots 48 | (setup (:package doom-themes) 49 | (when (not custom-enabled-themes) 50 | (load-theme 'doom-dracula t))) 51 | 52 | ;; These settings relate to how emacs interacts with your operating system 53 | (setq ;; makes killing/yanking interact with the clipboard 54 | x-select-enable-clipboard t 55 | 56 | ;; I'm actually not sure what this does but it's recommended? 57 | x-select-enable-primary t 58 | 59 | ;; Save clipboard strings into kill ring before replacing them. 60 | ;; When one selects something in another program to paste it into Emacs, 61 | ;; but kills something in Emacs before actually pasting it, 62 | ;; this selection is gone unless this variable is non-nil 63 | save-interprogram-paste-before-kill t 64 | 65 | ;; Shows all options when running apropos. For more info, 66 | ;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Apropos.html 67 | apropos-do-all t 68 | 69 | ;; Mouse yank commands yank at point instead of at click. 70 | mouse-yank-at-point t) 71 | 72 | ;; CUSTOMIZE 73 | 74 | ;; You can uncomment this to remove the graphical toolbar at the top. After 75 | ;; awhile, you won't need the toolbar. 76 | ;; (tool-bar-mode -1) 77 | 78 | ;; Your choice of font is very personal, and you must have installed it 79 | ;; on your system before you specify it here, 80 | ;; Some font suggestions: https://www.creativebloq.com/features/the-best-monospace-fonts-for-coding 81 | ;; (set-face-attribute 'default nil :font "Fira Code") 82 | 83 | -------------------------------------------------------------------------------- /early-init.el: -------------------------------------------------------------------------------- 1 | ;; improve startup time by pausing garbage collection during init 2 | (setq gc-cons-threshold most-positive-fixnum) 3 | -------------------------------------------------------------------------------- /init.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t; -*- 2 | ;; Emacs comes with package.el for installing packages. 3 | ;; Try M-x list-packages to see what's available. 4 | (require 'package) 5 | (setq package-archives '(("melpa" . "https://melpa.org/packages/") 6 | ("melpa-stable" . "https://stable.melpa.org/packages/") 7 | ("elpa" . "https://elpa.gnu.org/packages/"))) 8 | (package-initialize) 9 | 10 | ;; setup.el provides a macro for configuration patterns 11 | ;; it makes package installation and config nice and tidy! 12 | ;; https://www.emacswiki.org/emacs/SetupEl 13 | (if (package-installed-p 'setup) 14 | nil 15 | (if (memq 'setup package-archive-contents) 16 | nil 17 | (package-refresh-contents)) 18 | (package-install 'setup)) 19 | (require 'setup) 20 | 21 | ;; All other features are loaded one by one from 22 | ;; the customizations directory. Read those files 23 | ;; to find out what they do. 24 | (add-to-list 'load-path "~/.emacs.d/customizations") 25 | 26 | (defvar addons 27 | '("ui.el" 28 | "navigation.el" 29 | "projects.el" 30 | "git.el" 31 | "filetree.el" 32 | "editing.el" 33 | "elisp-editing.el" 34 | "setup-clojure.el" 35 | "setup-js.el" 36 | "shell-integration.el")) 37 | 38 | (dolist (x addons) 39 | (load x)) 40 | 41 | ;; Make gc pauses faster by decreasing the threshold. 42 | (setq gc-cons-threshold (* 2 1000 1000)) 43 | 44 | (setq custom-file (concat user-emacs-directory "custom.el")) 45 | (load custom-file 'noerror) 46 | --------------------------------------------------------------------------------