Skip to content

seshaljain/.emacs.d

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

70 Commits
 
 
 
 

Repository files navigation

Emacs config

I’m sure I’ll be tweaking it forever though, it’s almost as satisfying as actually using it.

Meta

When this configuration is loaded for the first time, the init.el is the file that is loaded.

;; This file replaces itself with the actual configuration at first run.
;; Tangle requires org
(require 'org)
;; Open the configuration
(find-file (concat user-emacs-directory "README.org"))
;; tangle init.org
(org-babel-tangle)
;; load init.el
(load-file (concat user-emacs-directory "init.el"))
;; byte-compile init.el
(byte-compile-file (concat user-emacs-directory "init.el"))

Lexical scoping for the init-file is needed, it can be specified in the header. This is the first line of the actual configuration:

;;; -*- lexical-binding: t -*-

Tangle and compile this file on save automatically:

(defun tangle-init ()
  "If the current buffer is 'init.org' the code-blocks are
tangled, and the tangled file is compiled."
  (when (equal (buffer-file-name)
               (expand-file-name (concat user-emacs-directory "README.org")))
    ;; Avoid running hooks when tangling.
    (let ((prog-mode-hook nil))
      (org-babel-tangle)
      (byte-compile-file (concat user-emacs-directory "init.el")))))
(add-hook 'after-save-hook 'tangle-init)

Define separate customize file

(setq custom-file (concat user-emacs-directory ".custom.el"))
(load custom-file t)

Packages

Add package archives

(require 'package)
(let* ((no-ssl (and (memq system-type '(windows-nt ms-dos))
                    (not (gnutls-available-p))))
       (proto (if no-ssl "http" "https")))
  (add-to-list 'package-archives (cons "melpa" (concat proto "://melpa.org/packages/")) t)
  (when (< emacs-major-version 24)
    ;; For important compatibility libraries like cl-lib
    (add-to-list 'package-archives '("gnu" . (concat proto "://elpa.gnu.org/packages/")))))

(package-initialize)

Setup use-package

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

(require 'use-package)
(setq use-package-always-ensure t)

Bundled packages

org

(setq org-startup-folded 'overview)

Org Source Code Blocks

(setq org-confirm-babel-evaluate nil)
(setq org-edit-src-content-indentation 0)
(setq org-src-window-setup 'current-window)

Org Capture

(setq org-directory "~/Dropbox/org")

(global-set-key (kbd "C-c c") 'org-capture)

(setq org-capture-templates
      '(("t"
          "TIL"
          entry
          (file+headline "~/Dropbox/org/til.org" "TIL")
          "* %^{TIL} %^g\n%^{Description}\n%T"
          :prepend t)
         ("l"
          "Link"
          entry
          (file+headline "~/Dropbox/org/links.org" "Links")
          "* %? %^L %^g\n%T"
          :prepend t)
         ("k"
          "Keybinding"
          entry
          (file "~/Dropbox/org/learn-keybindings.org")
          "* =%^{Keybinding}= %^g\n%^{Description}")
         ("p"
          "CP"
          entry
          (file+datetree "~/Dropbox/org/cp.org")
          "**** %^{Link} %^g\n#+BEGIN_SRC cpp\n%?\n#+END_SRC"
          :empty-lines 1)))

Org Latex Export

Use syntax highlighting via Minted

pip install Pygments

tlmgr install minted
(setq org-latex-listings 'minted
      org-latex-packages-alist '(("" "minted"))
      org-latex-pdf-process
      '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
        "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
        "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"))

Break long lines

(setq org-latex-minted-options '(("breaklines" "true")
                                 ("breakanywhere" "true")
                                 ("linenos")))

dired

Ability to use a to visit a new directory or file in dired instead of using RET. RET works just fine, but it will create a new buffer for every interaction whereas a reuses the current buffer.

(put 'dired-find-alternate-file 'disabled nil)

Human readable units

(setq-default dired-listing-switches "-alh")

python

(setq python-shell-interpreter "python3")

External packages

bufler

(use-package bufler)

company

(use-package company
  :diminish
  :config
  (setq company-idle-delay 0)
  (setq company-minimum-prefix-length 2)
  (setq company-selection-wrap-around t)
  (setq company-tooltip-align-annotations t)
  (global-company-mode t))

counsel/ivy/swiper

(use-package counsel
  :config
  (setq ivy-wrap t)
  :bind (("M-x" . counsel-M-x)
         ("C-x f" . counsel-find-file)
         ("C-x b" . counsel-ibuffer)
         ("M-y" . counsel-yank-pop)))

(use-package swiper
  :bind (("C-s" . swiper)
         ("C-c s" . swiper-thing-at-point)))

(use-package ivy
  :diminish
  :config
  (setq ivy-use-virtual-buffers t)
  (setq ivy-use-selectable-prompt t)
  (setq ivy-count-format "[%d/%d] ")
  (ivy-mode 1))

diminish

(use-package diminish)

expand-region

(use-package expand-region
  :bind ("M-=" . er/expand-region))

eglot

(use-package eglot
  :hook
  ((c-mode c++-mode) . eglot-ensure)
  :config
  (add-to-list 'eglot-server-programs '((c++-mode c-mode) "clangd-10")))

evil

(use-package evil
  :init
  (setq evil-mode-line-format '(before . mode-line-front-space))
  (setq evil-move-cursor-back nil)
  (setq
   evil-normal-state-tag (propertize " " 'face '((:background "#ff5555")))
   evil-insert-state-tag (propertize " " 'face '((:background "#50fa7b")))
   evil-operator-state-tag (propertize " " 'face '((:background "#f8f8f2")))
   evil-motion-state-tag (propertize " " 'face '((:background "#ffb86c")))
   evil-emacs-state-tag (propertize " " 'face '((:background "#bd98f9")))
   evil-visual-state-tag (propertize " " 'face '((:background "#f1fa8c"))))
  :config
  (evil-mode 1))

iedit

(use-package iedit)

magit

(use-package magit
  :defer t
  :bind ("C-x g" . magit-status))

markdown

(use-package markdown-mode
  :defer t
  :init (setq markdown-command "multimarkdown")
  :mode (("README\\.md\\'" . gfm-mode)
         ("\\.mdx?$\\'" . markdown-mode)
         ("\\.markdown\\'" . markdown-mode)))

mode-line-bell

(use-package mode-line-bell
  :config
  (mode-line-bell-mode))

prettier

Dependency: prettier

npm i -g prettier
(use-package prettier
  :defer t)

projectile

(use-package projectile
  :config
  (projectile-mode)
  (setq projectile-completion-system 'ivy)
  :bind-keymap
  ("C-c p" . projectile-command-map))

(use-package counsel-projectile
  :config
  (counsel-projectile-mode))

pyvenv

(use-package pyvenv)

rainbow

(use-package rainbow-mode
  :defer t)

try

(use-package try
  :defer t)

undo-tree

(use-package undo-tree
  :diminish)

web

(use-package web-mode
  :defer t
  :mode ("\\.html\\'")
  :config
  (add-to-list 'web-mode-comment-formats '("javascript" . "//"))
  (setq web-mode-markup-indent-offset 2)
  (setq web-mode-css-indent-offset 2)
  (setq web-mode-code-indent-offset 2)
  (setq web-mode-style-padding 0)
  (setq web-mode-script-padding 0))

emmet

(use-package emmet-mode
  :defer t
  :diminish
  :config
  (setq emmet-indentation 2)
  (defadvice emmet-preview-accept (after expand-and-fontify activate)
    "Update the font-face after an emmet expantion."
    (font-lock-flush))
  :hook (web-mode css-mode))

which-key

(use-package which-key
  :diminish which-key-mode
  :config
  (which-key-mode))

yasnippet

(use-package yasnippet
  :diminish yas-minor-mode
  :config (yas-global-mode 1))

(use-package yasnippet-snippets)

Preferences

UX

Get environment variables from shell

Set $MANPATH, $PATH and exec-path from shell even when started from GUI helpers like dmenu or Spotlight

(unless (package-installed-p 'exec-path-from-shell)
  (package-refresh-contents)
  (package-install 'exec-path-from-shell))

;; Safeguard, so this only runs on Linux (or MacOS)
(when (memq window-system '(mac ns x))
  (exec-path-from-shell-initialize))

Increase GC Threshold

Allow 20MB (instead of 0.76MB) before calling GC

(setq gc-cons-threshold 20000000)

Ask y/n instead of yes/no

(fset 'yes-or-no-p 'y-or-n-p)

Auto revert files on change

(global-auto-revert-mode t)

Use ibuffer as default buffer list

(global-set-key (kbd "C-x C-b") 'ibuffer)

(setq ibuffer-saved-filter-groups
      '(("files"
               ("dired" (mode . dired-mode))
               ("org" (name . "^.*org$"))

               ("web" (or (mode . web-mode)
                          (mode . css-mode)))
               ("js" (mode . rjsx-mode))
               ("shell" (or (mode . eshell-mode)
                            (mode . shell-mode)))
               ("programming" (mode . python-mode))
               ("emacs" (or
                         (name . "^\\*scratch\\*$")
                         (name . "^\\*Compile-Log\\*$")
                         (name . "^\\*Messages\\*$"))))))

(add-hook 'ibuffer-mode-hook
          (lambda ()
            (ibuffer-auto-mode 1)
            (ibuffer-switch-to-saved-filter-groups "files")))

(setq ibuffer-show-empty-filter-groups nil)

(setq ibuffer-expert t)

UI

Encoding

utf-8 encoding for all files, resolves \u... in terminal

(set-charset-priority 'unicode)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-selection-coding-system 'utf-8)
(prefer-coding-system 'utf-8)

Startup

(add-to-list 'default-frame-alist '(fullscreen . maximized))
(setq inhibit-startup-message t)
(setq initial-scratch-message nil)
(setq initial-major-mode 'org-mode)

Theme

Dracula

(use-package dracula-theme
  :config (load-theme 'dracula t))

Font

Victor Mono, Inter

(add-to-list 'default-frame-alist '(font . "Iosevka Term Curly 14"))
(set-face-font 'variable-pitch "Inter")

Use emoji in Emacs 27+

(if ( version< "27.0" emacs-version ) ; )
    (set-fontset-font t 'symbol "Noto Color Emoji" nil 'prepend)
  (warn "This Emacs version is too old to properly support emoji."))

Scrolling

Nicer scrolling behaviour https://zeekat.nl/articles/making-emacs-work-for-me.html

(setq scroll-step 1
      scroll-conservatively 100
      scroll-preserve-screen-position 1)

(setq mouse-wheel-follow-mouse 't)
(setq mouse-wheel-scroll-amount '(1 ((shift) . 1)))

UI Elements

Remove window chrome

(scroll-bar-mode -1)
(tool-bar-mode -1)
(menu-bar-mode -1) ;; still accessible via <f10>

Show keystrokes immediately in the echo area

(setq echo-keystrokes 0.1)

Always show line and col num in modeline

(setq line-number-mode t)
(setq column-number-mode t)

Display relative line numbers

(setq display-line-numbers-type 'relative)
(add-hook 'prog-mode-hook 'display-line-numbers-mode)

Prefer vertical splits

(setq split-width-threshold 120)

Text Editing

Always highlight parentheses

(show-paren-mode 1)

Autocomplete brackets

(electric-pair-mode 1)

Configure backup files

(setq make-backup-files nil)
(setq auto-save-default nil)
(setq create-lockfiles nil)

(setq backup-directory-alist
      `((".*" . ,temporary-file-directory)))
(setq auto-save-file-name-transforms
      `((".*" ,temporary-file-directory t)))

Single space after sentences

(setq sentence-end-double-space nil)

Enable narrow-to-region

(put 'narrow-to-region 'disabled nil)

Indentation

Set tab width to 2 spaces

(setq-default tab-width 2
              indent-tabs-mode nil)

Add a newline at end of file

(setq require-final-newline t)

Delete trailing whitespace on save

(add-hook 'before-save-hook 'delete-trailing-whitespace)

Replace highlighted text

(delete-selection-mode 1)

Utility Functions

Reload config

(defun my-reload-config()
  "Reload init.el"
  (interactive)
  (load-file user-init-file))

Create new scratch buffer

(defun my-create-scratch-buffer nil
  "Create a new scratch buffer <*scratch-N*>."
  (interactive)
  (let ((n 0) bufname)
    (while (progn
             (setq bufname (concat "*scratch-"
                                   (if (= n 0) "" (int-to-string n)) "*"))
             (setq n (1+ n))
             (get-buffer bufname)))
    (switch-to-buffer (get-buffer-create bufname))
    (org-mode)))

Rename buffer & file

(defun my-rename-current-buffer-file ()
  "Renames current buffer and file it is visiting."
  (interactive)
  (let ((name (buffer-name))
        (filename (buffer-file-name)))
    (if (not (and filename (file-exists-p filename)))
        (error "Buffer '%s' is not visiting a file" name)
      (let ((new-name (read-file-name "New name: " filename)))
        (if (get-buffer new-name)
            (error "A buffer named '%s' already exists" new-name)
          (rename-file filename new-name 1)
          (rename-buffer new-name)
          (set-visited-file-name new-name)
          (set-buffer-modified-p nil)
          (message "File '%s' successfully renamed to '%s'"
                   name (file-name-nondirectory new-name)))))))

Save and compile

(setq compilation-ask-about-save nil)

(defun my-save-all-and-compile ()
  (interactive)
  (save-some-buffers 1)
  (compile compile-command))

(global-set-key (kbd "<f5>") 'my-save-all-and-compile)

About

stuff i copied from people

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published