r-medina / .emacs.d

see https://github.com/r-medina/dotfiles/tree/master/dotfiles/emacs.d

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

emacs config

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.

General

Keep the backups in a sane location

(setq backup-directory-alist '(("." . "~/.emacs.d/backups")))
(setq backup-by-copying t)

And not that I’m writing too much elisp, but just in case

(add-to-list 'load-path "~/.emacs.d/usr")

Miscellaneous

=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)))

my-keys-mode-map setup

More on this later:

;; 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")

Packages

A lot of the following was taken from this config.

The almighty use-package:

This installs it and updates package list just in case

Package configurations

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)))

make a macro to encapsulate :bind (:map my-key-mode-map)

Installation

     (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)))

Configure my custom recipes and configurations

(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/")

My packages

 (setq my-packages
	    '(atom-dark-theme
	      chrome.el
	      emacs-powerline
	      go-mod
	      go-imports))

Run it

(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)

Look/Feel

;; 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)

Programming

Fixes annoying comment that ruby-mode puts in:

(setq ruby-insert-encoding-magic-comment nil)

Key Bindings

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)

TODOs

google search from keyboard shortcut

make nav-text better and faster to get to

About

see https://github.com/r-medina/dotfiles/tree/master/dotfiles/emacs.d


Languages

Language:Emacs Lisp 98.4%Language:YASnippet 1.6%