pillow-fort.org/pillow-fort.org

8.2 KiB

Pillow-Fort, an emacs config by Eli Mellen

Fiddling with the basic UI and setting the stage

  (setq frame-title-format '("Cozy Pillow Fort")
        ring-bell-function 'ignore
        default-directory "~/")

  (tool-bar-mode   -1)
  (menu-bar-mode   +1) ; I <3 menu bar
  (scroll-bar-mode -1)
  (window-divider-mode 1) ; allows you to resize windows by grabbing the divider
  (global-visual-line-mode 1) ; line wrapping, because I spend a lot of time working on very tiny screens
  (global-prettify-symbols-mode 1)
  (column-number-mode +1)
  (global-hl-line-mode 1) ; highlight the currently active line

  ;; Display line numbers, but only on Emacs26 or higher
  (when (version<= "26.0.50" emacs-version )
    (global-display-line-numbers-mode))

  ;; Silkier scrolling
  (setq scroll-margin 0
        scroll-conservatively 10000
        scroll-preserve-screen-position t
        auto-window-vscroll nil)

  ;; Increase line space for better readability
  (setq-default line-spacing 3)

  ;; Tabs are for monsters. No monsters are allowed in the pillow fort (defaults to 4 spaces).
  (setq-default indent-tabs-mode nil
                tab-width 4)

Theme

I've been waffling a lot, lately, and also enjoying light themes.

; (use-package dracula-theme
;     :ensure t)
; (add-to-list 'default-frame-alist '(tty-color-mode  . -1)) ; this makes it so that emacs doesn't load a theme when launched in a terminal

Override some default behaviors for more convenient editing

;; Stop emacs from littering your file system with garbage
(setq create-lock-files nil make-backup-files nil auto-save-default nil)

;; Play nice(er) with the X11 clipboard
(setq select-enable-clipboard t)

;; Surpress the welcome screen
(setq inhibit-startup-message t initial-scratch-message nil)

;; Automatically save and load changes
(global-auto-revert-mode +1)
(auto-save-visited-mode  +1)

;; Automatically insert buddies
(electric-pair-mode +1)

;; Highlight buddies (and do it right away)
(setq show-paren-delay 0)
(show-paren-mode 1)

FedEx (because packages?)

Helm, the completion framework

(use-package helm
    :ensure t
    :init
    (setq helm-M-x-fuzzy-match t
        helm-mode-fuzzy-match t
        helm-buffers-fuzzy-matching t
        helm-recentf-fuzzy-match t
        helm-locate-fuzzy-match t
        helm-semantic-fuzzy-match t
        helm-imenu-fuzzy-match t
        helm-completion-in-region-fuzzy-match t
        helm-candidate-number-list 150
        helm-split-window-in-side-p t
        helm-move-to-line-cycle-in-source t
        helm-echo-input-in-header-line t
        helm-autoresize-max-height 0
        helm-autoresize-min-height 20)
    :config (helm-mode 1)
    (global-set-key (kbd "M-x") 'helm-M-x) ; like spacemacs, but with M-x instead of SPC
    (global-set-key (kbd "M-f") 'helm-find-files))

Which Key, because things are easier with hints

(use-package which-key
    :ensure t
    :init
    (setq which-key-separator " ")
    (setq which-key-prefix-prefix "+")
    :config (which-key-mode 1))

Company, complettion in the mode-line

(use-package company 
  :ensure t 
  :init (setq company-dabbrev-downcase 0 company-idle-delay 0) 
  :config (progn (company-mode +1)
  (global-company-mode +1)))

Rainbows!

(use-package rainbow-delimiters
    :ensure t
    :config (add-hook 'prog-mode-hook #'rainbow-delimiters-mode)) ; on by default
(use-package rainbow-identifiers
    :ensure t
    :config (add-hook 'prog-mode-hook #'rainbow-identifiers-mode))
(use-package nyan-mode 
    :ensure t
    :config (add-hook 'prog-mode-hook #'nyan-mode))

Git gutter

  (use-package git-gutter
    :ensure t
    :config (global-git-gutter-mode 't)
    :diminish git-gutter-mode)

Highlight TODO messages

(use-package hl-todo
  :ensure t
  :config (add-hook 'prog-mode-hook #'hl-todo-mode))

Better undo-ing

(use-package undo-tree 
    :ensure t 
    :config (global-undo-tree-mode))

(use-package browse-kill-ring 
    :ensure t)

Indent stuff for me

 (use-package aggressive-indent
      :ensure t)

Flycheck (make sure the zipper is up?)

(use-package flycheck
    :ensure t
    :defer 2
    :config (global-flycheck-mode)
    (add-hook 'after-init-hook #'global-flycheck-mode))

Automatically re-size splits

(use-package golden-ratio
  :defer 2
  :ensure t
  :config (golden-ratio-mode 1))

Language specific packages

Org related stuff

(use-package org
  :mode (("\\.org$" . org-mode))
  :ensure t
  :config 
  (setq org-todo-keywords
      '((sequence "TODO" "IN-PROCESS" "FOLLOW-UP" "WAIT" "|" "DONE")))
      (setq org-fontify-done-headline t)
      (custom-set-faces
      '(org-done ((t (:foreground "#5DA7AA" :weight normal :strike-through t))))
      '(org-headline-done
            ((((class color) (min-colors 16) (background light))
               (:foreground "#5E81AC" :strike-through t))))))

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

;; Export org files in various formats
(use-package htmlize
  :ensure t)
(use-package ox-pandoc
  :ensure t)

Restclient

Who needs Postman when you've got emacs!?

(use-package restclient
    :ensure t)
(use-package ob-restclient 
    :ensure t 
    :init (org-babel-do-load-languages
 'org-babel-load-languages
 '((restclient . t))))

Clojure

(use-package clojure-mode
    :ensure t)

(use-package 
  cider 
  :ensure t 
  :config (progn (add-hook 'cider-repl-mode-hook #'cider-company-enable-fuzzy-completion) 
		 (add-hook 'cider-mode-hook #'cider-company-enable-fuzzy-completion) 
		 (add-hook 'after-save-hook (lambda() 
					      (when (eq major-mode 'clojure-mode) 
						(cider-load-buffer))))))

WISP

(use-package wispjs-mode
  :ensure t
  :mode "\\.wisp\\'")

Markdown

(use-package markdown-mode 
  :ensure t 
  :commands (markdown-mode gfm-mode) 
  :mode (("README\\.md\\'" . gfm-mode) 
	 ("\\.txt\\'" . markdown-mode) 
	 ("\\.md\\'" . markdown-mode) 
	 ("\\.markdown\\'" . markdown-mode))
  :init (setq markdown-command "multimarkdown"))

Elisp

(use-package package-lint 
  :ensure t)
(use-package elisp-format 
  :ensure t)

HTML

(use-package web-mode 
  :ensure t)

JSON

(use-package json-mode 
  :ensure t
  :mode "\\.json\\'")

Javascript

(use-package 
  js2-mode 
  :ensure t 
  :mode "\\.js\\'" 
  :interpreter "node" 
  :init (setq-default js2-concat-multiline-strings 'eol) 
  (setq-default js2-global-externs '("module" "require" "setTimeout" "clearTimeout" "setInterval"
             "clearInterval" "location" "__dirname" "console" "JSON"
             "window" "process" "fetch")) 
  (setq-default js2-strict-inconsistent-return-warning nil) 
  :config (use-package 
      prettier-js 
      :ensure t))

Typescript

(use-package tide
  :ensure t
  :mode "\\.ts\\'"
  :after (typescript-mode company flycheck)
  :hook ((typescript-mode . tide-setup)
         (typescript-mode . tide-hl-identifier-mode)
         (before-save . tide-format-before-save)))

Useful functions

Namespaced custom funtions.

Quickly edit this very file!

(defun pillow-fort/find-config ()
    "Build the pillow fort!"
    (interactive)
    (find-file "~/.emacs.d/pillow-fort.org"))

Create a new empty buffer

;; Straight up stollen from <http://ergoemacs.org/emacs/emacs_new_empty_buffer.html>
(defun pillow-fort/new-empty-buffer () 
  "Create an empty buffer." 
  (interactive) 
  (let (($buf (generate-new-buffer "untitled"))) 
    (switch-to-buffer $buf) 
    (funcall initial-major-mode) 
    (setq buffer-offer-save t)
    $buf))