Sourav Badami's Blog
Tinkerer. Technomad. Rational.
Emacs Configuration
This is my personal emacs configuration tree, continually used and tweaked since last 365 days, and it may be a good starting point for other new emacs users.


This is my personal emacs configuration tree, continually used and tweaked since the last 365 days, and it may be a good starting point for other new emacs users.


  • init.el
(require 'package)

;; Define package repositories
(add-to-list 'package-archives
             '("melpa-stable" . ""))
(add-to-list 'package-archives
             '("melpa" . ""))

;; Load and activate emacs packages. Do this first so that the
;; packages are loaded before you start trying to modify them.
;; This also sets the load path.

;; Reduce the frequency of garbage collection by making it happen on
;; each 50MB of allocated data (the default is on every 0.76MB)
(setq gc-cons-threshold 50000000)

;; Automatically reload files when they change on disk
(global-auto-revert-mode 1)
(setq auto-revert-verbose nil)

;; Install use-package
(unless (package-installed-p 'use-package)
  (package-install 'use-package))
(require 'use-package)
(setq use-package-verbose t)
(setq-default use-package-always-ensure t)

;; Move custom configuration variables set by Emacs, to a seperate file
(setq custom-file "~/.emacs.d/custom.el")
(load custom-file 'noerror)


;; don't show the tool bar
(tool-bar-mode -1)

;; don't show the scroll bar
(scroll-bar-mode -1)

;; switch to full screen on startup
(add-to-list 'default-frame-alist '(fullscreen . maximized))

;; Make the title bar blend with the background color
;; Set the appearance to light/dark depending on your theme
(add-to-list 'default-frame-alist
             '(ns-transparent-titlebar . t))
(add-to-list 'default-frame-alist
             '(ns-appearance . dark))

;; Hide cursor in inactive windows
(setq-default cursor-in-non-selected-windows nil)

;; Set default line spacing
(setq-default line-spacing 0.2)

;; Show full file path in the title bar
 '((:eval (if (buffer-file-name)
              (abbreviate-file-name (buffer-file-name))

;; Set font and line spacing
(set-face-attribute 'default nil :font "Monaco 13")
(setq-default line-spacing 0.3)

;; Line numbers
;; Add some padding when displaying line numbers
(setq linum-format "%5d ")
(add-hook 'prog-mode-hook 'linum-mode)


;; Use y/n instead of full yes/no for confirmation messages
(fset 'yes-or-no-p 'y-or-n-p)

;; Use spaces instead of tabs
(setq tab-width 2)
(setq js-indent-level 2)
(setq css-indent-offset 2)
(setq c-basic-offset 2)
(setq-default indent-tabs-mode nil)
(setq-default c-basic-offset 2)
(setq-default tab-width 2)
(setq-default c-basic-indent 2)

;; Type over selected text
(delete-selection-mode 1)

;; Kill whole line
(global-set-key (kbd "s-<backspace>") 'kill-whole-line)

;; Use Cmd for movement
(global-set-key (kbd "s-<right>") (kbd "C-e"))  ;; End of line
(global-set-key (kbd "s-<left>") (kbd "C-a"))   ;; Beginning of line

;; Kills the current buffer without displaying the annoying menu.
;; A confirmation will be asked for, if the buffer has been modified
(global-set-key (kbd "C-x k") 'kill-this-buffer)

;; Remove trailing whitespace before saving
(add-hook 'before-save-hook 'delete-trailing-whitespace)

;; On OS X, an Emacs instance started from the graphical user
;; interface will have a different environment than a shell in a
;; terminal window, because OS X does not run a shell during the
;; login. Obviously this will lead to unexpected results when
;; calling external utilities like make from Emacs.
;; This library works around this problem by copying important
;; environment variables from the user's shell.
(use-package exec-path-from-shell
  :ensure t

;; M-x with recently/frequently used commands
(use-package smex
  (global-set-key (kbd "M-x") 'smex)
  (global-set-key (kbd "s-x") 'smex))

;; Install and setup company-mode for autocompletion
(use-package company
  :ensure t
  (add-hook 'prog-mode-hook 'company-mode)
  (setq company-tooltip-limit 10)
  (setq company-idle-delay 0.2)
  (setq company-echo-delay 0)
  (setq company-minimum-prefix-length 3)
  (setq company-require-match nil)
  (setq company-selection-wrap-around t)
  (setq company-tooltip-align-annotations t)
  (setq company-tooltip-flip-when-above t)
  ;; weight by frequency
  (setq company-transformers '(company-sort-by-occurrence)))

;; Better syntax highlighting
(use-package clojure-mode-extra-font-locking
  :ensure t)

;; Highlight matching parentheses
(require 'paren)
(show-paren-mode 1)
(setq show-paren-delay 1)
(set-face-background 'show-paren-match (face-background 'default))
(if (eq (frame-parameter nil 'background-mode) 'dark)
    (set-face-foreground 'show-paren-match "red")
  (set-face-foreground 'show-paren-match "black"))
(set-face-attribute 'show-paren-match nil :weight 'extra-bold)

;; Add ability to shift between buffers using shift+arrow keys.
(when (fboundp 'windmove-default-keybindings)

;; Paredit makes it easier to navigate/edit s-expressions as blocks.
(use-package paredit
  :ensure t
  (add-hook 'clojure-mode-hook 'enable-paredit-mode)
  (add-hook 'cider-repl-mode-hook 'enable-paredit-mode)
  (add-hook 'emacs-lisp-mode-hook 'enable-paredit-mode))

;; To add some colors to those boring parens
(use-package rainbow-delimiters
  :ensure t
  :init (add-hook 'prog-mode-hook #'rainbow-delimiters-mode))

;; Cider integrates a Clojure buffer with a REPL
(use-package cider
  :ensure t
  (setq cider-repl-pop-to-buffer-on-connect t
        cider-show-error-buffer t
        cider-auto-select-error-buffer t
        cider-repl-history-file "~/.emacs.d/cider-history"
        cider-repl-wrap-history t
        cider-repl-history-size 100
        cider-repl-use-clojure-font-lock t
        cider-docview-fill-column 70
        cider-stacktrace-fill-column 76
        ;; Stop error buffer from popping up while working in buffers other than REPL:
        nrepl-popup-stacktraces nil
        nrepl-log-messages nil
        nrepl-hide-special-buffers t
        cider-repl-use-pretty-printing t
        cider-repl-result-prefix ";; => ")

  (add-hook 'cider-mode-hook #'eldoc-mode)
  (add-hook 'cider-repl-mode-hook #'paredit-mode)
  (add-hook 'cider-repl-mode-hook #'company-mode)
  (add-hook 'cider-mode-hook #'company-mode)
 ; (add-hook 'cider-mode-hook (local-set-key (kbd "<C-return>") 'cider-eval-defun-at-point))

;; Adds some niceties/refactoring support
;; (use-package clj-refactor
;;   :ensure t
;;   :config
;;   (add-hook 'clojure-mode-hook
;;             (lambda ()
;;               (clj-refactor-mode 1))))

;; Aggressively indents your clojure code
(use-package aggressive-indent
  :ensure t
  :commands (aggressive-indent-mode)
  (add-hook 'clojure-mode-hook 'aggressive-indent-mode))

;; Operate (list, search, replace....) on files at a project level.
(use-package projectile
  :ensure t
  (setq-default projectile-cache-file
                (expand-file-name ".projectile-cache" user-emacs-directory))
  (add-hook 'prog-mode-hook #'projectile-mode)

  (setq-default projectile-enable-caching t
                ;; Show project (if any) name in modeline
                projectile-mode-line '(:eval (projectile-project-name)))
  (define-key projectile-mode-map (kbd "s-p") 'projectile-command-map)
  (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map))

;; Magit: The only git interface you'll ever need
(use-package magit :ensure t)

;; Enable IDO (Interactively Do Things) mode.
;; IDO offers an improvement over Emacs' completion engine for common
;; tasks like opening file, switching buffers etc
(use-package ido
  :ensure t
  (setq ido-use-faces t)
  ;; Enable fuzzy search
  (setq ido-enable-flex-matching t)
  ;; Use C-n, C-p or arrow keys to navigate options
  (setq ido-vertical-define-keys 'C-n-C-p-up-and-down)
  (ido-everywhere t)
  (ido-mode 1)

  ;; Make ido-mode display vertically
  (use-package ido-vertical-mode
    :ensure t
    :config (ido-vertical-mode 1)))

;; User customizations
;; Add your customizations to `init-user.el`
(when (file-exists-p "~/.emacs.d/init-user.el")
  (setq user-custom-file "~/.emacs.d/init-user.el")
  (load user-custom-file))


  • Clone this repository to emacs configuration path git clone ~/.emacs.d.

Last modified on 2020-06-12

Comments powered by Disqus