Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
1093 lines (925 sloc) 32 KB

Emacs configuration

Initialize

gc-cons

(setq gc-cons-threshold 64000000)
(add-hook 'after-init-hook (lambda ()
                             ;; restore after startup
                             (setq gc-cons-threshold 800000)))

Add custom load path

(add-to-list 'load-path (expand-file-name "my-packages" user-emacs-directory))

Install use-package

(setq core-packages
      '(use-package))

(defun ensure-packages (packages)
  (dolist (package packages)
    (unless (package-installed-p package)
      (package-install package))))

(ensure-packages core-packages)

Enable auto-installing of packages using use-package

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

Helpers

(defun enable-minor-mode (my-pair)
  "Enable minor mode if filename match the regexp.  MY-PAIR is a cons cell (regexp . minor-mode)."
  (if (buffer-file-name)
      (if (string-match (car my-pair) buffer-file-name)
          (funcall (cdr my-pair)))))

Server

Start server automatically. Use emacsclient to associate/open files.

(use-package server
  :if window-system
  :init
  (server-start))

Appearance/UI

Hide welcome message

(setq inhibit-startup-message t)

Hide initial scratch buffer message

(setq initial-scratch-message nil)

Hide toolbar

(if window-system
    (tool-bar-mode -1))
(if window-system
    (menu-bar-mode -1))

Disable Scrollbar

(scroll-bar-mode -1)

Switch window to fullscreen

(add-to-list 'default-frame-alist '(fullscreen . maximized))

Disable emacs window disappearing on Ctrl-z

(global-unset-key (kbd "C-z"))

Turn off ad-handle-definition: `tramp-read-passwd’ got redefined

(setq ad-redefinition-action 'accept)

Change “yes or no” to “y or n”

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

Show Line/Col Numbers

Show Line col numbers

;; (global-linum-mode t)
;;(add-hook 'prog-mode-hook 'linum-mode)
(use-package nlinum
  :config
  (add-hook 'prog-mode-hook 'nlinum-mode)
  ;;(global-nlinum-mode)
  )

Update line numbers format to avoid graphics glitches in fringe

(setq-default linum-format " %4d ")

Show column numbers

;; show column number
(setq-default column-number-mode t)

Set Font, Size

Set font and size

(set-frame-font "Hack 14")

Change font-size with ctrl + mouse wheel

(global-set-key (vector (list 'control mouse-wheel-down-event)) 'text-scale-increase)
(global-set-key (vector (list 'control mouse-wheel-up-event))   'text-scale-decrease)

Enable Soft-wrap lines

(global-visual-line-mode t)

Enable Smooth scrolling

;;(use-package smooth-scrolling)
;;(setq mouse-wheel-progressive-speed nil) ;; don't accelerate scrolling

(setq scroll-conservatively 101) ;; move minimum when cursor exits view, instead of recentering
(setq mouse-wheel-scroll-amount '(5)) ;; mouse scroll moves 1 line at a time, instead of 5 lines
(setq mouse-wheel-progressive-speed nil) ;; on a long mouse scroll keep scrolling by 1 line

Change cursor from box to bar

(setq-default cursor-type 'bar)

Show matching parentheses with 0 delay

(show-paren-mode 1)
(setq-default show-paren-delay 0)

Show beacon on cursor

A light that follows your cursor around so you don’t lose it!

(use-package beacon
  :config
  (beacon-mode t))

Show Tabs for buffers

(use-package tabbar
  :config
  (tabbar-mode t)
  (setq tabbar-cycle-scope (quote tabs))
  (setq tabbar-use-images nil)
  (setq table-time-before-update 0.1)

  ;; define all tabs to be one of 3 possible groups: “Emacs Buffer”, “Dired”, “User Buffer”.
  (defun tabbar-buffer-groups ()
    (list
     (cond
      ((string-equal "*" (substring (buffer-name) 0 1))
       "Emacs Buffer"
       )
      ((eq major-mode 'dired-mode)
       "Dired"
       )
      (t
       "User Buffer"
       )
      )))

  ;; ignore all buffers starting with *
  (setq tabbar-buffer-list-function
        (lambda ()
          (remove-if
           (lambda(buffer)
             (find (aref (buffer-name buffer) 0) " *"))
           (buffer-list))))

  (setq tabbar-buffer-groups-function 'tabbar-buffer-groups)
  (global-set-key (vector (list 'control `tab)) 'tabbar-forward-tab)
  (global-set-key (kbd "C-S-p") 'tabbar-backward-group)
  (global-set-key (kbd "C-S-n") 'tabbar-forward-group)
  (global-set-key (kbd "C-<") 'tabbar-backward)
  (global-set-key (kbd "C->") 'tabbar-forward))

Highlight indentation

(use-package highlight-indent-guides
  :config
  (setq highlight-indent-guides-method 'fill)
  (add-hook 'prog-mode-hook 'highlight-indent-guides-mode))

Layout

Enable winner mode

(winner-mode 1)

Apply syntax highlighting to all buffers

(global-font-lock-mode t)

Load Colour theme

(use-package dracula-theme)
(load-theme 'dracula t)
;;(use-package nova-theme)
;;(load-theme 'nova t)

Modeline

Spaceline

(use-package spaceline
  :config
  (progn
    (require 'spaceline-config)
    (setq powerline-default-separator 'curve)
    (setq powerline-height 27)
    (setq spaceline-separator-dir-left '(left . left))
    (setq spaceline-separator-dir-right '(right . right))
    (setq spaceline-workspace-numbers-unicode t)
    (spaceline-toggle-battery-off)
    (spaceline-toggle-buffer-modified-off)
    (spaceline-toggle-hud-off)
    (spaceline-toggle-major-mode-on)
    (spaceline-toggle-projectile-root-off)
    (spaceline-toggle-version-control-off)
    (spaceline-toggle-window-number-off)
    (spaceline-emacs-theme)
    ;;(spaceline-helm-mode)
    ))

Diminish

(use-package diminish
  :config
  (diminish 'company-mode)
  (diminish 'helm-mode)
  (diminish 'beacon-mode)
  (diminish 'cursor-in-brackets-mode)
  (diminish 'undo-tree-mode)
  (diminish 'visual-line-mode)
  ;;(diminish 'yas-minor-mode)
  )

Mode Icons

(use-package mode-icons
  :config
  (mode-icons-mode))

Editing

Character Encodings

(set-default-coding-systems 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-language-environment 'utf-8)
(setq locale-coding-system 'utf-8)
(set-selection-coding-system 'utf-8)
(set-terminal-coding-system 'utf-8)
(prefer-coding-system 'utf-8)
(when (display-graphic-p)
  (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)))

Copy/paste

Enable clipboard

(setq select-enable-clipboard t)

Save Interprogram paste

https://www.reddit.com/r/emacs/comments/30g5wo/the_kill_ring_and_the_clipboard/

(setq save-interprogram-paste-before-kill t)

Overwrite active region

(delete-selection-mode t)

Indent new line automatically on ENTER

(global-set-key (kbd "RET") 'newline-and-indent)

Duplicate current line

(defun duplicate-line()
  (interactive)
  (move-beginning-of-line 1)
  (kill-line)
  (yank)
  (open-line 1)
  (next-line 1)
  (yank)
  )
(global-set-key (kbd "C-c d") 'duplicate-line)

Simplify whitespace style

(setq-default whitespace-style (quote (spaces tabs newline space-mark tab-mark newline-mark)))

Delete trailing whitespace before saving

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

Set default tab char’s display width to 4 spaces

(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
;; make tab key always call a indent command.
(setq-default tab-always-indent t)
;; make tab key call indent command or insert tab character, depending on cursor position
(setq-default tab-always-indent nil)
;; make tab key do indent first then completion.
(setq-default tab-always-indent 'complete)

Move cursor inside brackets after adding

;; (use-package cursor-in-brackets
;;   :config
;;   (add-hook 'prog-mode-hook 'cursor-in-brackets-mode))

Enable moving line or region, up or down

(use-package move-text
  :config
  (move-text-default-bindings))

Editor config

(use-package editorconfig
  :config
  (move-text-default-bindings))

Multiple Cursors

(use-package multiple-cursors
  :config
  (global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines))

Enable code folding

undo-tree

(use-package undo-tree)
(global-undo-tree-mode 1)

Sorting lines

(global-set-key (kbd "C-c M-s") 'sort-lines)

Bookmarks

(use-package bm
  :demand t

  :init
  ;; restore on load (even before you require bm)
  (setq bm-restore-repository-on-load t)


  :config
  ;; Allow cross-buffer 'next'
  (setq bm-cycle-all-buffers t)

  ;; where to store persistant files
  (setq bm-repository-file "~/.emacs.d/bm-repository")

  ;; save bookmarks
  (setq-default bm-buffer-persistence t)

  ;; Loading the repository from file when on start up.
  (add-hook' after-init-hook 'bm-repository-load)

  ;; Restoring bookmarks when on file find.
  (add-hook 'find-file-hooks 'bm-buffer-restore)

  ;; Saving bookmarks
  (add-hook 'kill-buffer-hook #'bm-buffer-save)

  ;; Saving the repository to file when on exit.
  ;; kill-buffer-hook is not called when Emacs is killed, so we
  ;; must save all bookmarks first.
  (add-hook 'kill-emacs-hook #'(lambda nil
                                 (bm-buffer-save-all)
                                 (bm-repository-save)))

  ;; The `after-save-hook' is not necessary to use to achieve persistence,
  ;; but it makes the bookmark data in repository more in sync with the file
  ;; state.
  (add-hook 'after-save-hook #'bm-buffer-save)

  ;; Restoring bookmarks
  (add-hook 'find-file-hooks   #'bm-buffer-restore)
  (add-hook 'after-revert-hook #'bm-buffer-restore)

  ;; The `after-revert-hook' is not necessary to use to achieve persistence,
  ;; but it makes the bookmark data in repository more in sync with the file
  ;; state. This hook might cause trouble when using packages
  ;; that automatically reverts the buffer (like vc after a check-in).
  ;; This can easily be avoided if the package provides a hook that is
  ;; called before the buffer is reverted (like `vc-before-checkin-hook').
  ;; Then new bookmarks can be saved before the buffer is reverted.
  ;; Make sure bookmarks is saved before check-in (and revert-buffer)
  (add-hook 'vc-before-checkin-hook #'bm-buffer-save)


  :bind (("<f2>" . bm-next)
         ("S-<f2>" . bm-previous)
         ("C-<f2>" . bm-toggle))
  )

Expand region

(use-package expand-region
  :config
  (global-set-key (kbd "C-=") 'er/expand-region))

Key Bindings

Which Key

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

Buffers

Backup

Force emacs to save backups to a specific directory.

(setq backup-directory-alist '(("." . "~/.emacs.d/backup/per-save"))
      backup-by-copying t    ; Don't delink hardlinks
      version-control t      ; Use version numbers on backups
      delete-old-versions t  ; Automatically delete excess backups
      kept-new-versions 20   ; how many of the newest versions to keep
      kept-old-versions 5    ; and how many of the old
      )

(defun force-backup-of-buffer ()
  "Make a special 'per session' backup at the first save of each Emacs session."
  (when (not buffer-backed-up)
    ;; Override the default parameters for per-session backups.
    (let ((backup-directory-alist '(("" . "~/.emacs.d/backup/per-session")))
          (kept-new-versions 3))
      (backup-buffer)))
  ;; Make a "per save" backup on each save.  The first save results in
  ;; both a per-session and a per-save backup, to keep the numbering
  ;; of per-save backups consistent.
  (let ((buffer-backed-up nil))
    (backup-buffer)))

Force backup of buffer before saving.

(add-hook 'before-save-hook  'force-backup-of-buffer)

Kill buffer without confirmation

(defun volatile-kill-buffer ()
  "Kill current buffer unconditionally."
  (interactive)
  (let ((buffer-modified-p nil))
    (kill-buffer (current-buffer))))
(global-set-key (kbd "C-x k") 'volatile-kill-buffer)

Refresh buffer from filesystem periodically

(global-auto-revert-mode t)

Show current file path

(defun show-file-name ()
  "Show the full path file name in the minibuffer."
  (interactive)
  (message (buffer-file-name)))
(global-set-key [C-f1] 'show-file-name)

Make buffer names unique

(use-package uniquify
  :ensure nil
  :config (setq uniquify-buffer-name-style 'forward))

Global Packages

projectile

(use-package projectile
  :init
  (setq projectile-keymap-prefix (kbd "C-c p"))
  :config
  (projectile-global-mode)
  (setq projectile-completion-system 'default)
  (setq projectile-enable-caching t)
  :diminish projectile-mode)

(use-package helm-projectile)

helm

(use-package helm
  :config
  ;; replace default find file
  (global-set-key (kbd "C-x C-f") 'helm-find-files)

  ;; The default "C-x c" is quite close to "C-x C-c", which quits Emacs.
  ;; Changed to "C-c h". Note: We must set "C-c h" globally, because we
  ;; cannot change `helm-command-prefix-key' once `helm-config' is loaded.
  (global-set-key (kbd "C-c h") 'helm-command-prefix)
  (global-unset-key (kbd "C-x c"))

  ;; Use helm-M-x instead, shows keybindings for commands
  (global-set-key (kbd "M-x") 'helm-M-x)

  ;; rebind tab to run persistent action
  (define-key helm-map (kbd "<tab>") 'helm-execute-persistent-action)

  ;; make TAB works in terminal
  (define-key helm-map (kbd "C-i") 'helm-execute-persistent-action)

  ;; list actions using C-z
  ;; (define-key helm-map (kbd "C-z")  'helm-select-action)

  (when (executable-find "curl")
    (setq helm-google-suggest-use-curl-p t))

  ;; move to end or beginning of source when reaching top or bottom of source.
  (setq helm-move-to-line-cycle-in-source t)

  ;; search for library in `require' and `declare-function' sexp.
  (setq helm-ff-search-library-in-sexp  t)

  ;; scroll 8 lines other window using M-<next>/M-<prior>
  (setq helm-scroll-amount 8)
  (setq helm-ff-file-name-history-use-recentf t)

  ;; Make helm window lean
  ;; https://www.reddit.com/r/emacs/comments/2z7nbv/lean_helm_window/
  (setq helm-display-header-line nil) ;; t by default
  (set-face-attribute 'helm-source-header nil :height 0.1)
  (helm-autoresize-mode 1)
  (defun helm-toggle-header-line ()
    (if (= (length helm-sources) 1)
        (set-face-attribute 'helm-source-header nil :height 0.1)
      (set-face-attribute 'helm-source-header nil :height 1.0)))
  (add-hook 'helm-before-initialize-hook 'helm-toggle-header-line)

  ;; Set shortcut to helm-occur
  ;; (global-set-key (kbd "C-c h o") 'helm-occur)

  ;; Enable helm
  (helm-mode 1))

thesilversearcher - ag

(use-package ag
  :config
  ;;(setq ag-reuse-window 't)
  ;;(setq ag-reuse-buffers 't)
  (global-set-key "\C-c\C-g" 'ag-project)
  (customize-set-variable 'ag-arguments
                          (quote
                           ("--ignore-dir" "node_modules" "--ignore-dir" "elpa" "--ignore-dir" "lib" "--ignore-dir" "build"))))

(use-package helm-ag)
;; (defun projectile-helm-ag ()
;;   (interactive)
;;   (helm-ag (projectile-project-root)))

wgrep

(use-package wgrep-helm)
(use-package wgrep-ag)

company

(use-package company
  :config
  (add-hook 'after-init-hook 'global-company-mode)
  (setq company-idle-delay 0.2
        company-minimum-prefix-length 1
        company-selection-wrap-around t
        company-tooltip-align-annotations t
        company-tooltip-flip-when-above nil
        company-tooltip-limit 10
        company-tooltip-minimum 3
        company-tooltip-margin 1
        company-transformers '(company-sort-by-occurrence)
        company-dabbrev-downcase nil)

  ;; Add yasnippet support for all company backends
  ;; https://github.com/syl20bnr/spacemacs/pull/179
  (defvar company-mode/enable-yas t "Enable yasnippet for all backends.")
  (defun company-mode/backend-with-yas (backend)
    (if (or (not company-mode/enable-yas) (and (listp backend) (member 'company-yasnippet backend)))
        backend
      (append (if (consp backend) backend (list backend))
              '(:with company-yasnippet))))
  )

(use-package company-statistics
  :config
  (company-statistics-mode)
  )

Shell/exec-path-from-shell

;; exec-path-from-shell
(use-package exec-path-from-shell
  :config
  (exec-path-from-shell-initialize))

direnv

(use-package direnv
 :config
 (direnv-mode))

Terminal

(use-package multi-term)
(setq multi-term-program "/bin/bash")
(defalias 'term 'multi-term)
(defun term-bash (buffer-name)
  "Start a terminal and rename buffer."
  (interactive "sbuffer name: ")
  (ansi-term "/bin/bash")
  (rename-buffer buffer-name t))

SSH

;; (setq tramp-default-method "ssh")

magit

(use-package magit
  :config
  (setq magit-auto-revert-mode nil)
  (setq magit-last-seen-setup-instructions "1.4.0"))

Icons

(use-package all-the-icons)

neotree

(use-package neotree
  :config
  (global-set-key [f8] 'neotree-toggle)
  (setq neo-smart-open t)
  (setq-default neo-show-hidden-files t)
  (setq neo-theme 'icons)
  (setq projectile-switch-project-action 'neotree-projectile-action))

Programming

Coverage

;;(add-to-list 'load-path "~/.emacs.d/coverage-mode/")
;;(load "coverage-mode.el")
;;(require 'coverage-mode)

Language Server Protocol (LSP)

(use-package lsp-mode)

org

(use-package org
  :config
  ;; Change ... to downward arrow when there's stuff under a header.
  ;;(setq org-ellipsis "⤵")
  (setq org-hide-leading-stars t)

  ;; Use syntax highlighting in source blocks while editing.
  ;; (setq org-src-fontify-natively t)
  (font-lock-flush)

  ;; Make TAB act as if it were issued in a buffer of the language's major mode.
  (setq org-src-tab-acts-natively t)

  (setq org-support-shift-select t)
  (setq org-todo-keyword-faces
        '(("TODO" . (:foreground "yellow" :weight bold))
          ("DONE" . "green")
          ))
  (global-set-key (kbd "C-c a") 'org-agenda)

  (setq org-directory "~/Projects/Notes")
  (setq org-agenda-files '("~/Projects/Notes/todo.org"))
  )

Use bullets instead of asterisks.

(use-package org-bullets
  :config
  (add-hook 'org-mode-hook (lambda () (org-bullets-mode t))))

flycheck

(use-package let-alist)
(use-package flycheck
  :init (global-flycheck-mode)
  :config
  (setq-default flycheck-checker-error-threshold 500)
  (setq-default flycheck-highlighting-mode 'lines)
  (setq-default flycheck-idle-change-delay 3)
  (setq-default flycheck-display-errors-delay 0))

dockerfile-mode

(use-package dockerfile-mode
  :mode "Dockerfile$")

Python

(add-hook 'python-mode-hook
          (lambda ()
            (setq indent-tabs-mode nil)
            (setq tab-width 4)
            (setq-default python-indent-guess-indent-offset nil)
            (setq python-indent-offset 4)))
(use-package pipenv
  :hook (python-mode . pipenv-mode)
  :init
  (setq pipenv-projectile-after-switch-function #'pipenv-projectile-after-switch-extended))
;; python3
;; (setq-default python-shell-interpreter "~/.pyenv/versions/3.6.5/bin/python")
;; anaconda
(use-package anaconda-mode
  :config
  (add-hook 'python-mode-hook 'anaconda-mode)
  (add-hook 'python-mode-hook 'anaconda-eldoc-mode)
  )
(use-package company-anaconda
  :config
  (add-to-list 'company-backends 'company-anaconda))
;; pip install isort
(use-package py-isort
  :init
  ;;(add-hook 'before-save-hook 'py-isort-before-save)
  )
;; TODO deprecate in favour of black
;; sudo -H pip install yapf
(use-package yapfify
  :init
  ;;(add-hook 'python-mode-hook 'yapf-mode)
  )
(use-package python-pytest)

Golang

(use-package go-mode)

Markdown

(use-package markdown-mode)
(add-hook 'markdown-mode-hook
          (lambda ()
            (when buffer-file-name
              (add-hook 'after-save-hook
                        'check-parens
                        nil t))))

(use-package flymd)
(defun my-flymd-browser-function (url)
  (let ((browse-url-browser-function 'browse-url-firefox))
    (browse-url url)))
(setq flymd-browser-open-function 'my-flymd-browser-function)

R/ESS

;; (use-package ess
;;   :commands R
;;   :init (progn
;;           ;; TODO: why doesn't use-package require it for us?
;;           (require 'ess)

;;           (setq ess-eval-visibly-p nil
;;                 ess-use-tracebug t
;;                 ;; ess-use-auto-complete t
;;                 ess-help-own-frame 'one
;;                 ess-ask-for-ess-directory nil)
;;           (setq-default ess-dialect "R")
;;           ))
;; ;; (ess-toggle-underscore t)))
;; (add-to-list 'company-backends 'company-ess)

rainbow-mode

(use-package rainbow-mode
  :init
  (setq rainbow-html-colors-major-mode-list '(css-mode
                                              html-mode
                                              less-css-mode
                                              nxml-mode
                                              php-mode
                                              sass-mode
                                              scss-mode
                                              web-mode
                                              xml-mode))
  (dolist (mode rainbow-html-colors-major-mode-list)
    (add-hook (intern (format "%s-hook" mode)) 'rainbow-mode)))

rainbow-delimiters

(use-package rainbow-delimiters
  :config
  (progn
    (add-hook 'prog-mode-hook 'rainbow-delimiters-mode)))

HTML/Javascript

web-mode

(use-package web-mode
  :mode (
         ("\\.css$" . web-mode)
         ("\\.html$" . web-mode)
         ("\\.js$" . web-mode)
         ("\\.json$" . web-mode)
         ("\\.jsx$" . web-mode)
         ("\\.vue$" . web-mode)
         ("\\.scss$" . web-mode)
         ("\\.less$" . web-mode))
  :config
  (setq-default indent-tabs-mode nil) ;; no TABS
  (setq web-mode-code-indent-offset 2)
  (setq web-mode-css-indent-offset 2)
  (setq web-mode-enable-auto-closing t)
  (setq web-mode-enable-auto-expanding t)
  (setq web-mode-enable-auto-opening t)
  (setq web-mode-enable-auto-pairing t)
  (setq web-mode-enable-auto-pairing t)
  (setq web-mode-enable-auto-quoting nil)
  (setq web-mode-enable-css-colorization t)
  (setq web-mode-enable-current-column-highlight t)
  (setq web-mode-enable-current-element-highlight t)
  (setq web-mode-js-indent-offset 2)
  (setq web-mode-markup-indent-offset 2)
  (setq web-mode-content-types-alist
        '(("jsx" . "\\.js[x]?\\'")))

  ;; Default comment to //
  (setq-default web-mode-comment-formats (remove '("javascript" . "/*") web-mode-comment-formats))
  (add-to-list 'web-mode-comment-formats '("javascript" . "//"))
  )

(use-package company-web);

Javascript

Prettier

(use-package prettier-js
  :config
  ;;(add-hook 'web-mode-hook 'prettier-js-mode)
  (add-hook 'web-mode-hook #'(lambda ()
                               (enable-minor-mode
                                '("\\.jsx?\\'" . prettier-js-mode))))
  )

Emmet(Zencoding)

(use-package emmet-mode)

YAML

(use-package yaml-mode
  :mode (("\\.yaml$" . yaml-mode)))

Snippets

(use-package yasnippet
  :config
  (yas-global-mode 1)
  (add-hook 'term-mode-hook (lambda()
                              (setq yas-dont-activate-functions t))))

(use-package yasnippet-snippets)

Notes

deft - Searching/Filtering notes

(use-package deft
  :config
  (setq deft-extensions '("txt" "org"))
  (setq deft-directory "~/Projects/Notes/")
  (setq deft-recursive t)
  (global-set-key [f9] 'deft)
  )

Shortcuts/Registers

(set-register ?t (cons 'file "~/Projects/Notes/todo.org"))
(set-register ?j (cons 'file "~/Projects/Notes/journal.org"))
(set-register ?p (cons 'file "~/Projects/Notes/pw/permanent.org"))
(set-register ?i (cons 'file "~/.emacs.d/configuration.org"))

Project Specific

(defun thrive-enable () (interactive)
       (setq web-mode-code-indent-offset 4)
       (setq web-mode-markup-indent-offset 4)
       (setq web-mode-css-indent-offset 4)
       (setq web-mode-js-indent-offset 4)
       (setq-default flycheck-flake8-maximum-line-length 120)

       (pipenv-activate)
       ;; (setq-default python-shell-interpreter "~/.local/share/virtualenvs/Rpm-ffkIv7wJ/bin/python")
       ;;(flycheck-select-checker `("python-flake8" "python-pylint"))
       (add-hook 'before-save-hook 'py-isort-before-save)

       ;;(prettier-js-mode 1)
       ;;(setq prettier-args '())
       (editorconfig-mode)
       )

(defun thrive-disable () (interactive)
       (setq web-mode-code-indent-offset 2)
       (setq web-mode-markup-indent-offset 2)
       (setq web-mode-css-indent-offset 2)
       (setq web-mode-js-indent-offset 2)
       (setq-default flycheck-flake8-maximum-line-length 80)

       (pipenv-deactivate)
       (remove-hook 'before-save-hook 'py-isort-before-save)
       ;;(setq-default python-shell-interpreter "~/.local/share/virtualenvs/Rpm-ffkIv7wJ/bin/python")
       ;;(flycheck-disable-checker python-syntax-checker)

       ;;(prettier-js-mode 0)
       ;;(setq prettier-args '())
       (editorconfig-mode 0)
       )

(defun hobbit-enable () (interactive)
       (setq web-mode-code-indent-offset 4)
       (setq web-mode-markup-indent-offset 4)
       (setq web-mode-css-indent-offset 4)
       (setq web-mode-js-indent-offset 4)
       (setq-default flycheck-flake8-maximum-line-length 88)
       (editorconfig-mode)
       (pipenv-activate)

       (add-hook 'before-save-hook 'py-isort-before-save)
       (add-hook 'python-mode-hook 'blacken-mode)
       )
(defun hobbit-disable () (interactive)
       (setq web-mode-code-indent-offset 2)
       (setq web-mode-markup-indent-offset 2)
       (setq web-mode-css-indent-offset 2)
       (setq web-mode-js-indent-offset 2)
       (setq-default flycheck-flake8-maximum-line-length 80)
       (editorconfig-mode 0)
       (pipenv-deactivate)

       (remove-hook 'before-save-hook 'py-isort-before-save)
       (remove-hook 'python-mode-hook 'blacken-mode)
       )

;; Forcing django mode on all html
;; TODO: Better way to do this?
(setq-default web-mode-engines-alist
              '(("django"    . "\\.html\\'")))