this is no longer my emacs config please see r-medina/dotfiles
After getting to know org-mode, I am starting the process of moving more and more of my life onto it.
I’ve had my emacs config all over the place for the last 10 years, but this is an attempt to get it documented and in one place.
(setq backup-directory-alist '(("." . "~/.emacs.d/backups")))
(setq backup-by-copying t)
(add-to-list 'load-path "~/.emacs.d/usr")
=winner-mode= allows for window configuration undo and redo with
C-c left
and C-c right
(setq winner-mode t)
Fixes dired
issue on startup
(if (eq system-type 'darwin)
(setq insert-directory-program "gls" dired-use-ls-dired t))
So coding system works consistently in terminal (I don’t remember why I initially needed this):
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(prefer-coding-system 'utf-8)
So selections get deleted if you type:
(delete-selection-mode 1)
Getting rid of annoying bell:
(setq ring-bell-function #'ignore)
Reloads a file if saved elsewhere (docs):
(global-auto-revert-mode t)
Function for basic cleaning of buffer:
(defun my-clean ()
(interactive)
(setq end (point-max))
"does some cleaning up of files"
(indent-region 0 end)
(delete-trailing-whitespace 0 end))
So deleting words backwards (M-<Backspace>
) doesn’t yank (source):
(defun delete-word (arg)
"Delete characters forward until encountering the end of a
word. With argument, do this that many times."
(interactive "p")
(delete-region (point) (progn (forward-word arg) (point))))
(defun backward-delete-word (arg)
"Delete characters backward until encountering the end of a word.
With argument, do this that many times."
(interactive "p")
(delete-word (- arg)))
;; TODO: add bindings in use-package statements to this instead
(defvar my-keys-mode-map (make-keymap) "key map containing all of my personal shortcuts")
A lot of the following was taken from this config.
This installs it and updates package list just in case
I may have to install org-mode
on its own for the literate stuff to work.
I’m going to keep these all in the same block rather than having a bunch of text explaining each one.
(use-package ace-jump-mode
:bind (:map my-keys-mode-map
("C-j" . ace-jump-mode)))
(use-package beacon
:commands (beacon-mode beacon-blink)
:config
(beacon-mode 1)
:bind (:map my-keys-mode-map
("C-c b" . beacon-blink)))
(use-package company
:hook (after-init . global-company-mode)
:config
(setq company-idle-delay 1)
;; starts completing after a single character instead of 3
(setq company-minimum-prefix-length 1)
;; aligns fields in completions
(setq company-tooltip-align-annotations t)
(setq company-global-modes '(not markdown-mode)))
(use-package company-lsp)
(use-package diff-hl
:commands diff-hl
:hook
(diff-hl-mode . diff-hl-margin-mode)
(diff-hl-mode . diff-hl-flydiff-mode)
(magit-pre-refresh . diff-hl-magit-pre-refresh)
(magit-post-refresh . diff-hl-magit-post-refresh)
:config
(global-diff-hl-mode))
(use-package dockerfile-mode)
(use-package expand-region) ;; TODO: am i using this?
(use-package flycheck)
(use-package flyspell
:hook (prog-mode . flyspell-prog-mode))
(use-package forge)
(use-package git-link
:bind
("C-c l" . git-link))
(use-package go-mode
:mode "\\.go\\'"
:hook
(go-mode . flycheck-mode)
(go-mode . lsp-deferred))
;; additional go packages are in el-get
(use-package golden-ratio
:config
(golden-ratio-mode 1))
(use-package hcl-mode
:mode "\\.hcl.ctmpl\\'")
(use-package heaven-and-hell
:hook
(after-init . heaven-and-hell-init-hook)
:config
(setq heaven-and-hell-themes
'((light . bergen)
(dark . atom-dark)))
(setq heaven-and-hell-load-theme-no-confirm t))
(use-package helm
:config
(helm-mode 1)
:bind (:map helm-map
("<tab>" . 'helm-execute-persistent-action)
:map my-keys-mode-map
("M-x" . helm-M-x)
("C-x C-b" . helm-multi-files)
("C-x C-f" . helm-find-files)))
(use-package helm-flyspell
:bind (:map my-keys-mode-map
;; TODO: consider putting this in my-keys-mode-map
("C-;" . helm-flyspell-correct)))
(use-package helm-projectile)
(use-package json-mode) ;; init in el-get
(use-package lsp-mode)
(use-package lsp-ui)
(use-package magit
:bind (:map my-keys-mode-map
("C-S-U" . magit-status)))
(use-package markdown-mode
:mode "\\.md\\'")
(use-package org
:ensure org-plus-contrib
;; :commands (org
;; org-capture
;; org-mode
;; org-store-link
;; update-org-hours
;; my-term-agenda
;; dired-notes
;; jump-to-org-agenda)
:mode ("\\.org\\'" . org-mode)
:config
(setq org-ellipsis "↩")
(setq org-todo-keywords
'((sequence "TODO" "IN PROGRESS" "WAITING" "|" "DONE")
(sequence "MAYBE")))
(setq org-directory "~/notes")
(setq org-agenda-files (list "~/notes"))
(setq org-tag-alist '(("work" . ?w)
("health" . ?h)
("family" . ?f)
("personal" . ?p)
("engineering-success" . ?e)))
(require 'org-tempo)
(use-package org-bullets
:hook (org-mode . (lambda () (org-bullets-mode 1))))
:hook
(org-mode . flyspell-mode)
:bind (("C-j" . nil)
:map org-mode-map
("M-<left>" . nil)
("M-S-<left>" . org-metaleft)
("M-C-S-<left>" . org-shiftmetaleft)
("M-<right>" . nil)
("M-S-<right>" . org-metaright)
("M-C-S-<right>" . org-shiftmetaright)
("C-j" . nil)))
;; ;; commented because it's not in the package registries right now :(
(use-package org-roam
:requires org
:hook
(emacs-startup-hook . org-roam-mode)
:config
(setq org-roam-dailies-capture-templates
'(("d" "daily" plain (function org-roam-capture--get-point)
""
:immediate-finish t
:file-name "%<%Y-%m-%d>"
:head "#+TITLE: %<%Y-%m-%d>
* Notes
** Uncategorized
* TODOs")))
:bind (:map my-keys-mode-map
("C-c o t" . org-roam-dailies-today)
("C-c o c" . org-roam-capture)
("C-c o f" . org-roam-find-file)
:map org-mode-map
("C-c o r" . org-roam)
("C-c o y" . org-roam-dailies-yesterday)
("C-c o m" . org-roam-dailies-tomorrow)
("C-c o d" . org-roam-dailies-date)
("C-c o i" . org-roam-insert)
("C-c o s" . org-roam-server-mode)
("C-c o S" . (lambda () (interactive) (browse-url "http://localhost:8080/"))))
:config
(setq org-roam-directory "~/notes"))
(use-package paredit
:hook
(emacs-lisp-mode . enable-paredit-mode)
(eval-expression-minibuffer-setup-hook . enable-paredit-mode)
(ielm-mode-hook . enable-paredit-mode)
(lisp-mode-hook . enable-paredit-mode)
(lisp-interaction-mode-hook . enable-paredit-mode)
(scheme-mode-hook . enable-paredit-mode)
(javascript-mode-hook . enable-paredit-mode)
(clojure-mode-hook . enable-paredit-mode)
(org-mode-hook . enable-paredit-mode))
(use-package pbcopy
:config
(turn-on-pbcopy))
(use-package plantuml-mode)
(use-package protobuf-mode)
(use-package smart-mode-line
:commands sml/setup
:hook
(after-init . sml/setup))
(use-package switch-window
:bind (:map my-keys-mode-map
("C-x o" . switch-window)))
(use-package tramp
:config
(setq tramp-default-method "ssh")
(customize-set-variable 'tramp-syntax 'simplified))
;; more info here if i need to expand: https://github.com/efiivanir/.emacs.d/blob/a3f705714cc00f1fe2905a2ceaa99d9e97b8e600/settings/treemacs-settings.el
(use-package treemacs)
(use-package yaml-mode
:mode ("\\.yaml\\'" "\\.yml\\'"))
(use-package yascroll
:config
(global-yascroll-bar-mode))
(use-package yasnippet
:config
(yas-global-mode 1)
:bind (:map my-keys-mode-map
("C-c y" . yas-expand)))
(add-to-list 'load-path "~/.emacs.d/el-get/el-get")
(unless (require 'el-get nil 'noerror)
(with-current-buffer
(url-retrieve-synchronously
"https://raw.githubusercontent.com/dimitri/el-get/master/el-get-install.el")
(goto-char (point-max))
(eval-print-last-sexp)))
(add-to-list 'el-get-recipe-path "~/.emacs.d/el-get-user/recipes/")
(setq el-get-user-package-directory "~/.emacs.d/el-get-user/init/")
(setq my-packages
'(atom-dark-theme
chrome.el
emacs-powerline
go-mod
go-imports))
(ignore-errors (el-get-self-update)) ;; maybe bring this back?
;; (el-get-update-all)
(el-get-cleanup my-packages) ;; deletes no-longer-listed packages
(el-get 'sync my-packages)
;; get rid of menus and bars
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)
;; get rid of startup screens
(setq inhibit-splash-screen t)
(setq inhibit-startup-message t)
(column-number-mode t)
;; so lines don't get broken onto next line if longer than buffer
(set-default 'truncate-lines t)
;; show matching parenthesis
(show-paren-mode t)
;; fixing scrolling behavior to be less jumpy
(setq scroll-step 1)
(setq scroll-conservatively 10000)
(setq auto-window-vscroll nil)
Fixes annoying comment that ruby-mode
puts in:
(setq ruby-insert-encoding-magic-comment nil)
Inspired by this stackoverflow. The idea is you make all your personal key bindings in their own map that you can disable and get to everything underneath.
(global-set-key (kbd "<M-DEL>") 'backward-delete-word)
;; personal minor mode for key map. GREAT hack
(define-minor-mode my-keys-mode
"A minor mode so that my key settings override annoying major modes."
t " my-keys" 'my-keys-mode-map)
(my-keys-mode 1)
;; toggle my minor mode
(global-unset-key (kbd "M-m"))
(global-set-key (kbd "M-m m") 'my-keys-mode)
(let ((m my-keys-mode-map))
(define-key m (kbd "C-t") 'comment-or-uncomment-region)
(define-key m (kbd "C-S-T") (lambda () (interactive) (org-agenda)))
(define-key m (kbd "M-P") 'package-list-packages)
(define-key m (kbd "M-E") 'el-get-list-packages)
(define-key m (kbd "M-S") 'eshell)
(define-key m (kbd "C-c c") 'my-clean)
(define-key m (kbd "C-c b") 'beacon-blink)
(define-key m (kbd "C-c p") 'helm-projectile)
(define-key m (kbd "C-c t") 'heaven-and-hell-toggle-theme)
(define-key m (kbd "C-v") 'nav-text-minor-mode)
(define-key m (kbd "C-c . e") ; open README.org
(lambda () (interactive) (find-file "~/.emacs.d/README.org")))
(define-key m (kbd "C-c . E") ; open emacs config
(lambda () (interactive) (find-file "~/.emacs.d/init.el")))
(define-key m (kbd "C-c . z") ; open .zshrc
(lambda () (interactive) (find-file "~/.zshrc")))
(define-key m (kbd "C-c . o") ; open .zsh
(lambda () (interactive) (find-file "~/.oh-my-zsh")))
(define-key m (kbd "C-c . b") ; open .bashrc
(lambda () (interactive) (find-file "~/.bashrc")))
(define-key m (kbd "C-c . i") ; open init folder
(lambda () (interactive) (find-file "~/.emacs.d/el-get-user/init")))
;; experimenting
;; TODO
;; for interacting with chrome from emacs
(define-key m (kbd "C-c . C")
(lambda () (interactive)
(save-window-excursion
(async-shell-command
(concat
"'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' --remote-debugging-port=9222 "
"'" (read-string "url: ") "'")))))
;; opens url
;; TODO doesn't work
(define-key m (kbd "C-c . c")
(lambda () (interactive)
(browse-url (read-string "url: "))))
;; opens Joe zoom + facebook page
(define-key m (kbd "C-c . j")
(lambda () (interactive)
(async-shell-command
(concat
"'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' "
"--profile-directory='Profile 2' "
"'https://www.facebook.com/groups/565308257695776/post_tags/?post_tag_id=566705834222685' "
"'" (getenv "JOE_ZOOM") "'"))))
;; work
;; open github notifications
(define-key m (kbd "C-c . n")
(lambda () (interactive)
(async-shell-command
(concat
"'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' "
"--profile-directory='Profile 3' "
"https://github.com/notifications"))))
m)
;; for directed buffer navigation
(setq windmove-wrap-around t)
(define-prefix-command 'nav-map)
(define-key my-keys-mode-map (kbd "C-n") nav-map)
(let ((m nav-map))
(define-key m (kbd "o") 'windmove-up)
(define-key m (kbd "l") 'windmove-down)
(define-key m (kbd "j") 'windmove-left)
(define-key m (kbd "k") 'windmove-right))
;; for quickly changing minor modes
(define-prefix-command 'quick-modes-map)
(define-key my-keys-mode-map (kbd "M-m") quick-modes-map)
(let ((m quick-modes-map))
(define-key m (kbd "w") 'whitespace-mode)
(define-key m (kbd "l") 'display-line-numbers-mode)
(define-key m (kbd "e") 'electric-pair-mode)
(define-key m (kbd "f") 'flymake-mode)
(define-key m (kbd "p") 'paredit-mode)
(define-key m (kbd "o") 'outline-minor-mode)
(define-key m (kbd "d") 'diff-hl-mode)
(define-key m (kbd "h") 'global-hl-line-mode)
(define-key m (kbd "a") 'auto-complete-mode)
(define-key m (kbd "t") 'toggle-truncate-lines))
;; minor mode for navigating text easily
;; enter into it with M-m k
(defvar nav-text-minor-mode-map
(let ((m (make-sparse-keymap)))
(suppress-keymap m t)
(define-key m (kbd "j") 'backward-char)
(define-key m (kbd "k") 'forward-char)
(define-key m (kbd "o") 'previous-line)
(define-key m (kbd "l") 'next-line)
(define-key m (kbd "J") 'backward-word)
(define-key m (kbd "K") 'forward-word)
(define-key m (kbd "O") 'backward-paragraph)
(define-key m (kbd "L") 'forward-paragraph)
(define-key m (kbd "t") 'beginning-of-buffer)
(define-key m (kbd "y") 'end-of-buffer)
(define-key m (kbd "a") 'beginning-of-line)
(define-key m (kbd "e") 'end-of-line)
(define-key m (kbd "g") 'goto-line)
(define-key m (kbd "G") 'ace-jump-mode)
(define-key m (kbd "S") 'isearch-backward)
(define-key m (kbd "s") 'isearch-forward)
m)
"nav-text-minor-mode keymap.")
(define-minor-mode nav-text-minor-mode
"A minor mode so that my hands hurt less."
nil " nav-text" 'nav-text-minor-mode-map)