From 117e8248bc00bbcd699d15ff0ec8e9a26575eb43 Mon Sep 17 00:00:00 2001 From: Jack Foltz Date: Fri, 8 Feb 2019 01:06:51 -0500 Subject: [PATCH] Add sandbox --- lain/.emacs.d/config.org | 16 +- lain/.emacs.d/sandbox.org | 1218 +++++++++++++++++++++++++++++++++++++++++++++ packages.yml | 1 + 3 files changed, 1227 insertions(+), 8 deletions(-) create mode 100644 lain/.emacs.d/sandbox.org diff --git a/lain/.emacs.d/config.org b/lain/.emacs.d/config.org index 8afb0cd..2ad24b5 100644 --- a/lain/.emacs.d/config.org +++ b/lain/.emacs.d/config.org @@ -754,7 +754,7 @@ Keybinds in =M-x sp-cheat-sheet=. :commands smartparens-strict-mode :config (require 'smartparens-config)) - + (use-package evil-smartparens :hook (smartparens-enabled . evil-smartparens-mode)) #+END_SRC @@ -847,7 +847,9 @@ Built into emacs since 24.1 Flycheck does syntax highlighting in a few languages #+BEGIN_SRC emacs-lisp (use-package flycheck - :hook (prog-mode . flycheck-mode)) + :hook (prog-mode . flycheck-mode) + :custom + (flycheck-disabled-checkers '(emacs-lisp-checkdoc))) #+END_SRC *** Column 80 Highlight @@ -883,12 +885,10 @@ Yasnippet adds support for custom snippets It's magic git! Keybinds [[https://github.com/emacs-evil/evil-magit][here]] #+BEGIN_SRC emacs-lisp - (use-package magit - :general - (foltz-git-def - "s" 'magit-status - "d" 'magit-diff - "g" 'magit-grep)) +(use-package magit + :general + (foltz-git-def + "s" 'magit-status)) #+END_SRC It's *evil* magic git! #+BEGIN_SRC emacs-lisp diff --git a/lain/.emacs.d/sandbox.org b/lain/.emacs.d/sandbox.org new file mode 100644 index 0000000..cba4b39 --- /dev/null +++ b/lain/.emacs.d/sandbox.org @@ -0,0 +1,1218 @@ +* Packaging +** Package.el +[[http://wikemacs.org/wiki/Package.el][Package.el]] is the built-in package manager in Emacs. This is where the fun begins. +#+BEGIN_SRC emacs-lisp + (require 'package) + (setq package-archives + '(("gnu" . "https://elpa.gnu.org/packages/") + ("melpa" . "https://melpa.org/packages/") + ("melpa-stable" . "https://stable.melpa.org/packages/") + ("marmalade" . "https://marmalade-repo.org/packages/") + ("org" . "https://orgmode.org/elpa/"))) + (setq package-enable-at-startup nil) + (package-initialize) +#+END_SRC +** use-package +[[https://github.com/jwiegley/use-package][use-package]] is a nifty macro that interfaces with ~Package.el~, keeping package-specific +configuration all in once place. It's pretty much the basis of this entire config. +#+BEGIN_SRC emacs-lisp + (unless (package-installed-p 'use-package) + (package-refresh-contents) + (package-install 'use-package)) + + (eval-when-compile + (require 'use-package)) + + (setq use-package-compute-statistics t) + (setq use-package-always-ensure t) + (setq use-package-always-pin "melpa") + (setq use-package-verbose t) +#+END_SRC +*** Custom Keywords +A few useful ~:keyword~ macros that extend the vanilla ~use-package~ functionality. +**** HelpersHH +Define some helpers for bootstrapping the custom keywords. +#+BEGIN_SRC emacs-lisp + (defun foltz-add-use-package-keyword (keyword deferring) + "Add a KEYWORD, which may imply DEFERRING, to the use-package keyword list." + (setq use-package-keywords + (let ((idx (+ 1 (cl-position :hook use-package-keywords)))) + (append + (seq-subseq use-package-keywords 0 idx) + (list keyword) + (nthcdr idx use-package-keywords)))) + (when deferring + (setq use-package-deferring-keywords + (append use-package-deferring-keywords (list keyword))))) +#+END_SRC +**** :company +#+BEGIN_SRC emacs-lisp + (defun use-package-normalize/:company (name keyword args) + (use-package-as-one (symbol-name keyword) args + (lambda (label arg) + (unless (or (consp arg) (use-package-non-nil-symbolp arg)) + (use-package-error + (concat + label + " or " + "( . ) or " + "a list of these"))) + (use-package-normalize-pairs + (lambda (k) + (or (use-package-non-nil-symbolp k) + (and (consp k) + (not (cdr (last k))) + (seq-every-p 'use-package-non-nil-symbolp k)))) + #'use-package-recognize-function + name label arg)))) + + (defun use-package-handler/:company (name keyword args rest state) + (use-package-concat + (use-package-process-keywords name rest state) + (mapcan + (lambda (def) + (let ((modes (car def)) + (backend (cdr def)) + (fun (intern (concat "jf-company-add-" (symbol-name (cdr def)))))) + (when backend + (append + `((defun ,fun () + (let ((backend ,(append (list backend) '(:with company-yasnippet)))) + (unless (member backend company-backends) + (add-to-list 'company-backends backend))))) + (mapcar + (lambda (mode) + `(add-hook + ',(intern (concat (symbol-name mode) use-package-hook-name-suffix)) + #',fun)) + (if (use-package-non-nil-symbolp modes) (list modes) modes)))))) + (use-package-normalize-commands args)))) + + (defalias 'use-package-autoloads/:company 'use-package-autoloads-mode) + + (foltz-add-use-package-keyword :company nil) +#+END_SRC +* Emacs +** Defaults +*** Customize +Make changes in ~M-x customize~ go somewhere other than being schlunked into =init.el=. +#+BEGIN_SRC emacs-lisp + (setq custom-file (concat user-emacs-directory "_customize.el")) + (load custom-file t) +#+END_SRC +*** Bell +Shut up, emacs. +#+BEGIN_SRC emacs-lisp + (setq ring-bell-function #'ignore) +#+END_SRC +*** Prompts +Make ~yes-or-no~ prompts ask for ~y-or-n~ instead. Saves loads of timeā„¢. +#+BEGIN_SRC emacs-lisp + (defalias 'yes-or-no-p #'y-or-n-p) +#+END_SRC +*** Backup Files +By default, emacs gunks up every folder with =file~= backups +and =#file#= lockfiles. Schlunk them all in =/tmp= instead. +#+BEGIN_SRC emacs-lisp + (setq backup-directory-alist + `((".*" . ,temporary-file-directory))) + (setq auto-save-file-name-transforms + `((".*" ,temporary-file-directory t))) +#+END_SRC +*** auth-source +GPG encrypt stored auth tokens from [[https://www.gnu.org/software/emacs/manual/html_mono/auth.html][auth-source]] instead of storing them in plaintext. +#+BEGIN_SRC emacs-lisp + (setq auth-sources '("~/.emacs.d/authinfo.gpg")) +#+END_SRC +** UI +*** Font +Engage a nice coding font. +#+BEGIN_SRC emacs-lisp + (add-to-list 'default-frame-alist '(font . "Fira Code 12")) + (set-face-attribute 'default t :font "Fira Code 12") +#+END_SRC +*** Menu Bar +Disable the useless cruft at the top of the screen. +#+BEGIN_SRC emacs-lisp + (menu-bar-mode -1) + (tool-bar-mode -1) + (scroll-bar-mode -1) +#+END_SRC +** Themes +*** pywal +Fancy dynamic color scheme generation from desktop wallpapers. +Requires additional setup on the machine itself. +#+BEGIN_SRC emacs-lisp + (defvar jf-theme-pywal-path "~/.cache/wal/colors.el" "Path to the colorscheme generated by pywal.") + + (defun jf-theme-pywal () + (load-file jf-theme-pywal-path)) + + (when (= 'jf-theme 'jf-theme-pywal) + (require 'filenotify) + (file-notify-add-watch jf-theme-pywal-path '(change) #'jf-theme-pywal)) +#+END_SRC +*** spacemacs +This theme is pretty fancy and has lots of supported modes. +#+BEGIN_SRC emacs-lisp + (unless (package-installed-p 'spacemacs-theme) + (package-install 'spacemacs-theme)) + + (defun jf-theme-spacemacs () + (load-theme 'spacemacs-dark)) +#+END_SRC +*** Helpers +#+BEGIN_SRC emacs-lisp + (defvar jf-theme #'jf-theme-pywal "Theme function to call.") + + (defun jf-apply-theme () + "Apply the current theme as set by jf-theme." + (funcall jf-theme)) + + (jf-apply-theme) +#+END_SRC +* Keybinds +** General +[[https://github.com/noctuid/general.el][General]] is an excellent keybind manager that adds all kinds of +cool stuff like leader keys from Vim. +#+BEGIN_SRC emacs-lisp +(use-package general) +#+END_SRC +** which-key +[[https://github.com/justbur/emacs-which-key][which-key]] displays a popup in the minibuffer that shows +keybindings following incomplete commands. +#+BEGIN_SRC emacs-lisp + (use-package which-key + :diminish + :config + (which-key-mode)) +#+END_SRC +** Leaders +*** Helpers +Some helper functions to aid in defining leader keys and prefixes. +#+BEGIN_SRC emacs-lisp + (defvar jf-leader-keys + '(("b" . "buffers") + ("f" . "files") + ("g" . "git") + ("h" . "help") + ("o" . "org") + ("p" . "projects") + ("w" . "windows"))) + + (general-create-definer jf-leader-def + :keymaps 'override + :states '(normal insert emacs) + :prefix "SPC" + :non-normal-prefix "C-SPC") + + (dolist (def jf-leader-keys) + (let ((key (car def)) + (name (cdr def))) + (jf-leader-def key `('(:ignore t :wk ,(concat name "...")))) + (general-create-definer (intern (concat "jf-" name "-def")) + :keymaps 'override + :states '(normal insert emacs) + :prefix (concat "SPC " key) + :non-normal-prefix (concat "C-SPC " key) + :prefix-map (concat "jf-" key "-map")))) +#+END_SRC +*** Definitions +* Communication +* Web +* Tools +* Programming +** Checkers +** Completion +** Debugging +** Formatting +** Projects +** Tools +** Languages +* Vim +** Evil +[[https://github.com/emacs-evil/evil][Evil]] is pretty much the entirety of Vim in Emacs. +#+BEGIN_SRC emacs-lisp + (use-package evil + :diminish undo-tree-mode + + :init + (setq evil-want-integration t) + (setq evil-want-keybinding nil) + + (defun foltz-window-split () + (interactive) + (evil-window-split) + (evil-window-down 1)) + (defun foltz-window-vsplit () + (interactive) + (evil-window-vsplit) + (evil-window-right 1)) + + :config + (evil-mode t)) +#+END_SRC +** Evil Collection +[[https://github.com/emacs-evil/evil-collection][Evil Collection]] adds Evil bindings for all the parts of Emacs that Evil +doesn't cover properly by default. +#+BEGIN_SRC emacs-lisp + (use-package evil-collection + :after evil + :config + (evil-collection-init + '(calendar + cmake-mode + company + custom + debug + dired + doc-view + elisp-mode + elisp-refs + eshell + eval-sexp-fu + flycheck + flymake + grep + help + ibuffer + image + image-dired + info + ivy + js2-mode + log-view + man + neotree + python + racer + realgud + which-key))) +#+END_SRC +** Evil Leader +* --- Here Be Dragons --- +* Emacs Config +** Show matching parenthesis +Shows matching parenthesis +#+BEGIN_SRC emacs-lisp +(require 'paren) +(setq show-paren-delay 0) +(show-paren-mode) +#+END_SRC + +** Show columns +#+BEGIN_SRC emacs-lisp +(setq column-number-mode t) +#+END_SRC + +** Transparency +Sets the window's transparency. +The first number in the alpha section applies when the window is +active, the second when it's inactive. +#+BEGIN_SRC emacs-lisp +(set-frame-parameter (selected-frame) 'alpha 85) +(add-to-list 'default-frame-alist '(alpha . 85)) +#+END_SRC + +** Scrolling +#+BEGIN_SRC emacs-lisp +(setq scroll-conservatively 100) ;; don't scroll a metric boatload when bottom is hit +#+END_SRC + +** Relative line numbers +Use the default emacs relative line numbers, but switch to absolute lines when in insert mode. +#+BEGIN_SRC emacs-lisp +(setq linum-format " %3d ") +(setq-default display-line-numbers 'relative + display-line-numbers-widen t + display-line-numbers-current-absolute t) + +(defun foltz-relative-numbers () + (setq-local display-line-numbers 'relative)) + +(defun foltz-absolute-numbers () + (setq-local display-line-numbers t)) + +(add-hook 'evil-insert-state-entry-hook #'foltz-absolute-numbers) +(add-hook 'evil-insert-state-exit-hook #'foltz-relative-numbers) + +(global-display-line-numbers-mode t) +#+END_SRC + +* General Packages Configuration +** Modeline cleanup +Adds support for =:diminish= in use-package declarations, +basically hides a mode from the modeline. +#+BEGIN_SRC emacs-lisp +(use-package diminish) +#+END_SRC + +** Keybind completion +Pops up a buffer that helps you navigate and complete commands +#+BEGIN_SRC emacs-lisp +(use-package which-key + :diminish + :config + (which-key-mode)) +#+END_SRC +** Keybind Manager +*** Leader definitions +Create a leader key, like the \ in vim. +In this case, =SPC= is used as a leader. Following the leader, +different buttons bring you to different options. +See [[https://github.com/noctuid/general.el#which-key-integration][here]] for which-key integration information + +#+BEGIN_SRC emacs-lisp +(general-create-definer foltz-leader-def + :keymaps 'override + :states 'normal + :prefix "SPC" + "m" '(:ignore t :which-key "major-mode...") + "o" '(:ignore t :which-key "org-mode...") + "p" '(:ignore t :which-key "projectile-mode...") + "g" '(:ignore t :which-key "git...") + "h" '(:ignore t :which-key "help...") + "b" '(:ignore t :which-key "buffer...") + "w" '(:ignore t :which-key "window...") + "f" '(:ignore t :which-key "file...")) +#+END_SRC + +**** m - major-modes +#+BEGIN_SRC emacs-lisp +(general-create-definer foltz-major-def + :states 'normal + :prefix "SPC m") +#+END_SRC + +**** o - org-mode +#+BEGIN_SRC emacs-lisp +(general-create-definer foltz-org-def + :keymaps 'override + :states +'normal + :prefix "SPC o") +#+END_SRC + +**** p - projectile-mode +Since we will be binding the entire projectile-mode +keymap to this, we don't actually need a definer. +**** g - git +#+BEGIN_SRC emacs-lisp +(general-create-definer foltz-git-def + :states 'normal + :keymaps 'override + :prefix "SPC g") +#+END_SRC + +**** h - help +#+BEGIN_SRC emacs-lisp +(general-create-definer foltz-help-def + :states 'normal + :keymaps 'override + :prefix "SPC h") + +(foltz-help-def + "?" 'help-for-help + "h" 'help-for-help + "k" 'describe-key + "m" 'describe-mode) +#+END_SRC + +**** b - buffer +#+BEGIN_SRC emacs-lisp +(general-create-definer foltz-buffer-def + :states 'normal + :keymaps 'override + :prefix "SPC b") + +(foltz-buffer-def + "i" 'ibuffer) +#+END_SRC + +**** w - window +#+BEGIN_SRC emacs-lisp +(general-create-definer foltz-window-def + :states 'normal + :keymaps 'override + :prefix "SPC w") + +(foltz-window-def + "o" 'delete-other-windows) +#+END_SRC + +**** f - file +#+BEGIN_SRC emacs-lisp +(general-create-definer foltz-file-def + :states 'normal + :keymaps 'override + :prefix "SPC f") + +(defun foltz-config-visit () + (interactive) + (find-file (concat user-emacs-directory "config.org"))) + +(defun foltz-config-reload () + (interactive) + (org-babel-load-file + (expand-file-name "config.org" user-emacs-directory))) + +(foltz-file-def + "w" 'save-buffer + "r" 'revert-buffer + "e" '(:ignore t :which-key "emacs files") + "e e" 'foltz-config-visit + "e r" 'foltz-config-reload) +#+END_SRC + +** Vim +Evil is pretty much the entirety of Vim in Emacs. +[[https://github.com/Somelauw/evil-org-mode][evil-org]] adds nice bindings to org-mode. + +#+BEGIN_SRC emacs-lisp + (use-package evil-leader + :after evil + :init + + :general + (:keymaps 'override + :states 'normal + "U" 'undo-tree-visualize) + (foltz-window-def + "-" 'foltz-window-split + "=" 'foltz-window-vsplit + "h" 'evil-window-left + "j" 'evil-window-down + "k" 'evil-window-up + "l" 'evil-window-right + "H" 'evil-window-far-left + "J" 'evil-window-move-very-bottom + "K" 'evil-window-move-very-top + "L" 'evil-window-far-right + "<" 'evil-window-decrease-width + ">" 'evil-window-increase-width + "^" 'evil-window-decrease-height + "%" 'evil-window-increase-height + "n" 'evil-window-new + "c" 'evil-window-delete + "w" 'evil-window-next + "W" 'evil-window-prev + "r" 'evil-window-rotate-downwards + "|" 'evil-window-set-width + "_" 'evil-window-set-height) + + :config + (global-evil-leader-mode)) + + (use-package evil-org + :after (evil org) + :hook (org-mode . evil-org-mode) + :config + (add-hook 'evil-org-mode (lambda () + (evil-org-set-key-theme + '(textobjects insert navigation + additional shift todo calendar))))) +#+END_SRC + +** Startup dashboard +Show a cool custom buffer on startup +#+BEGIN_SRC emacs-lisp +(use-package dashboard + :diminish page-break-lines-mode + + :config + (dashboard-setup-startup-hook) + (setq initial-buffer-choice (lambda () + (if (get-buffer "*scratch*") + (kill-buffer "*scratch*")) + (get-buffer "*dashboard*"))) + + :custom + (dashboard-startup-banner 'logo) + (dashboard-banner-logo-title "Welcome to Electronic Macs") + (dashboard-items + '((recents . 5) + (agenda) + (bookmarks . 5) + (registers . 5)))) +#+END_SRC + +** Folder tree +A cool toggleable directory structure sidebar +It also needs icon fonts, installed with =M-x all-the-icons-install-fonts= +#+BEGIN_SRC emacs-lisp +(use-package all-the-icons) +(use-package neotree + :after all-the-icons + :commands neotree-toggle + :general + (:keymaps 'neotree-mode-map + :states 'normal + "RET" 'neotree-enter + "TAB" 'neotree-quick-look + "q" 'neotree-hide + "g" 'neotree-refresh + "A" 'neotree-stretch-toggle + "H" 'neotree-hidden-file-toggle) + (foltz-leader-def + :states 'normal + "t" 'neotree-toggle) + :custom + (neo-theme (if (display-graphic-p) 'icons 'arrow))) +#+END_SRC +** Organization +*** Capture Templates +All of my capture templates, from tasks to bookmarks. +**** Refile Targets +Goodize the refiling targets to allow moving to subtrees +#+BEGIN_SRC emacs-lisp +(defun foltz-org-capture-refile () + (interactive) + (setq-local org-refile-targets '((nil :maxlevel . 5))) + (setq-local org-refile-use-outline-path t) + (org-refile)) +#+END_SRC + +**** Tasks +#+BEGIN_SRC emacs-lisp +(setq foltz-org-capture-task-templates + '(("t" "Todo") + ("tg" "General" entry + (file+headline "notes.org" "Todo") + "** TODO %^{todo}\nNotes: %?\n") + ("tt" "General (Date)" entry + (file+olp+datetree "notes.org") + "*** TODO %^{todo}\nDue: %^t\nNotes: %?\n") + ("tT" "General (Date+Time)" entry + (file+olp+datetree "notes.org") + "*** TODO %^{todo}\nDue: %^T\nNotes: %?\n") + ("ts" "School (Date)" entry + (file+olp+datetree "notes.org") + "*** TODO %^{todo}\nDue: %^t\nClass: %^{class}\nNotes: %?\n") + ("tS" "School (Date+Time)" entry + (file+olp+datetree "notes.org") + "*** TODO %^{todo}\nDue: %^T\nClass: %^{class}\nNotes: %?\n"))) +#+END_SRC + +**** Bookmarks +#+BEGIN_SRC emacs-lisp +(setq foltz-org-capture-bookmark-templates + '(("b" "Bookmark" entry + (file+headline "links.org" "Unsorted Links") + "** [[%^{link}][%^{name}]]\nCreated: %U\nAbout: %^{description}%?\n"))) +#+END_SRC + +**** Personal +#+BEGIN_SRC emacs-lisp +(setq foltz-org-capture-personal-templates + '(("j" "Journal") + ("jj" "Journal Entry" entry + (file+olp+datetree "journal.org") + "**** Today's Events\n%?") + ("jt" "Thoughts" entry + (file+headline "notes.org" "Thoughts") + "** %^{summary}\n%U\n%?") + ("jd" "Dream Journal Entry" entry + (file+olp+datetree "dreams.org") + "**** Dream\n%?"))) +#+END_SRC + +**** Protocol +#+BEGIN_SRC emacs-lisp +(setq foltz-org-capture-protocol-templates + '(("w" "Website" entry + (file+headline "sites.org" "Unsorted Sites") + "** [[%:link][%:description%?]]\nCreated: %U\nAbout: %^{description}%?\n%:initial"))) +#+END_SRC + +**** All +Tie it all together. +#+BEGIN_SRC emacs-lisp +(setq foltz-org-capture-templates + (append + foltz-org-capture-task-templates + foltz-org-capture-personal-templates + foltz-org-capture-bookmark-templates + foltz-org-capture-protocol-templates)) +#+END_SRC + +*** Structure Templates +Defines expansions with =<= followed by a string in org-mode. +**** Source Blocks +#+BEGIN_SRC emacs-lisp +(setq foltz-org-source-structure-templates '( + ("el" "#+BEGIN_SRC emacs-lisp\n?\n#+END_SRC"))) +#+END_SRC + +**** All +Tie it all together. +#+BEGIN_SRC emacs-lisp +(setq foltz-org-structure-templates + (append + foltz-org-source-structure-templates)) +#+END_SRC + +*** Org-mode +Keep org-mode up to date straight from the cow's utters. +If the manual is not on your computer, it's [[https://orgmode.org/manual/][here]]. +#+BEGIN_SRC emacs-lisp +(use-package org + :pin org + :mode ("\\.org\\'" . org-mode) + :hook ((org-mode . org-indent-mode) + (org-capture-mode . evil-insert-state)) + + :general + (foltz-major-def + :keymaps 'org-mode-map + "e" 'org-export-dispatch + "a" 'org-attach) + (foltz-org-def + "a" 'org-agenda + "c" 'org-capture + "l" 'org-store-link + "b" 'org-switchb + "r" 'foltz-org-capture-refile) + + :custom + (org-directory "~/Documents/org") + (org-agenda-files '("~/Documents/org/")) + (org-default-notes-file "notes.org") + (org-agenda-include-diary t) + (org-src-window-setup 'current-window "Edit source code in the current window") + (org-src-fontify-natively t "Highlight syntax in source blocks") + (org-latex-to-pdf-process '("latexmk -f pdf %f") "Use pdflatex for export") + (org-capture-templates foltz-org-capture-templates) + (org-structure-template-alist (append org-structure-template-alist foltz-org-structure-templates))) +#+END_SRC + +*** Pretty org-mode bullets +Make bullets look choice +#+BEGIN_SRC emacs-lisp +(use-package org-bullets + :hook (org-mode . org-bullets-mode)) +#+END_SRC + +** Fuzzy Matching +Ivy, swiper, and counsel all provide fuzzy-matching on different +emacs operations. +#+BEGIN_SRC emacs-lisp +(use-package ivy + :init + ; Define some functions to bind to + (defun foltz-kill-curr-buffer () + (interactive) + (kill-buffer (current-buffer))) + (defun foltz-kill-all-buffers () + (interactive) + (mapc 'kill-buffer (buffer-list))) + + :general + (foltz-buffer-def + "b" 'ivy-switch-buffer + "v" 'ivy-push-view + "V" 'ivy-pop-view + "c" 'foltz-kill-curr-buffer + "C" 'foltz-kill-all-buffers) + (:keymaps 'org-capture-mode-map + :states 'normal + "C-c C-w" 'foltz-org-capture-refile) + + :custom + (ivy-use-virtual-buffers t) + (ivy-count-format "%d/%d")) + +(use-package swiper + :after evil + :general + (:keymaps 'override + :states 'normal + "/" 'swiper + "n" 'evil-search-previous + "N" 'evil-search-next)) + +(use-package counsel + :general + ("M-x" 'counsel-M-x) + (foltz-leader-def + :states 'normal + "x" 'counsel-M-x) + (foltz-file-def + "f" 'counsel-find-file) + (foltz-help-def + "k" 'counsel-descbinds + "f" 'counsel-describe-function + "v" 'counsel-describe-variable + "l" 'counsel-find-library + "a" 'counsel-apropos + "s" 'counsel-info-lookup-symbol + "u" 'counsel-unicode-char)) +#+END_SRC + +** Avy +Hotkeys for jumping to characters with =f= +#+BEGIN_SRC emacs-lisp +(use-package avy + :general + (:keymaps 'override + :states 'normal + "C-f" 'avy-goto-char-in-line + "C-F" 'avy-goto-char)) +#+END_SRC +** Discord Rich Presence +#+BEGIN_SRC emacs-lisp +(use-package elcord + :commands elcord-mode + :general + (foltz-major-def + :keymaps 'prog-mode-map + "d" #'elcord-mode)) +#+END_SRC +* Programming Packages Configuration +** General Configuration +Everything the light touches is prog-mode's kingdom. +#+BEGIN_SRC emacs-lisp +; Default to 4 space indent +(add-hook 'prog-mode-hook #'foltz-indent-4-spaces) +#+END_SRC +** Formatting +*** Indentation +Set some *sane* defaults +#+BEGIN_SRC emacs-lisp +(setq foltz-tab-width 4) +(setq-default python-indent-offset foltz-tab-width) +(setq-default evil-shift-width foltz-tab-width) +(setq-default c-basic-offset foltz-tab-width) +; Disable annoying electric indent of previous lines +(setq-default electric-indent-inhibit t) +; Eat the whole tab when I press backspace +(setq backward-delete-char-untabify-method 'hungry) +#+END_SRC +Define some *useful* helper functions +#+BEGIN_SRC emacs-lisp +(defun foltz-indent-tabs () + (interactive) + (setq tab-width foltz-tab-width) + (local-set-key (kbd "TAB") 'tab'to-tab-stop) + (setq indent-tabs-mode t)) + +(defun foltz-indent-spaces (num-spaces) + (interactive) + (setq tab-width num-spaces) + (setq indent-tabs-mode nil)) +(defun foltz-indent-2-spaces () + (foltz-indent-spaces 2)) +(defun foltz-indent-4-spaces () + (foltz-indent-spaces 4)) +(defun foltz-indent-8-spaces () + (foltz-indent-spaces 8)) + +(foltz-indent-4-spaces) + +(setq whitespace-style '(face tabs tab-mark trailing)) +(custom-set-faces + '(whitespace-tab ((t (:foreground "#636363"))))) + +(setq whitespace-display-mappings + '((tab-mark 9 [124 9] [92 9]))) + +(add-hook 'prog-mode-hook #'whitespace-mode) +#+END_SRC +*** Company +company auto-completes stuff in the buffer, +company-quickhelp shows documentation popups +when idling on a completion candidate. +#+BEGIN_SRC emacs-lisp +(use-package company + :defer t + :hook ((prog-mode cdlatex-mode) . company-mode) + :general + (:keymaps 'company-active-map + "C-SPC" 'company-abort) + :custom + (company-maximum-prefix-length 2) + (company-idle-delay 0.2 "Decrease idle delay")) + +(use-package company-quickhelp + :after company + :hook (company-mode . company-quickhelp-mode)) +#+END_SRC +*** Smart Parentheses +smartparens handles parens for languages that aren't lispy, +and paredit handles the rest. +Keybinds in =M-x sp-cheat-sheet=. +#+BEGIN_SRC emacs-lisp +(use-package paredit + :diminish + :commands enable-paredit-mode) + +(use-package smartparens + :diminish + :commands smartparens-strict-mode + :config + (require 'smartparens-config)) + +(use-package evil-smartparens + :hook (smartparens-enabled . evil-smartparens-mode)) +#+END_SRC +*** Smart Parentheses Modes +Picks a suitable parenthesis editing mode for the +current major mode when entering any prog-mode. +#+BEGIN_SRC emacs-lisp +(defun foltz-paren-mode () + (if (member major-mode + '(emacs-lisp-mode + lisp-mode + lisp-interaction-mode + scheme-mode)) + (enable-paredit-mode) + (smartparens-strict-mode))) + +(add-hook 'prog-mode-hook #'foltz-paren-mode) +#+END_SRC +*** evil-surround +Use =S= and a delimiter to surround in visual mode. +#+BEGIN_SRC emacs-lisp +(use-package evil-surround + :after evil + :diminish + :config + (global-evil-surround-mode 1)) +#+END_SRC +*** ws-butler +Unobtrusively cleans up whitespace before EOLs +as you edit, stopping the noisy commits generated +from blanket trimming entire files. +#+BEGIN_SRC emacs-lisp +(use-package ws-butler + :hook (prog-mode . ws-butler-mode)) +#+END_SRC +** Prettification +*** pretty-mode +[[https://github.com/pretty-mode/pretty-mode][Redisplay parts of the Emacs buffer as pretty symbols.]] +#+BEGIN_SRC emacs-lisp +(use-package pretty-mode + :hook (prog-mode . pretty-mode) + :config + (pretty-deactivate-groups + '(:equality :sub-and-superscripts)) + (pretty-activate-groups + '(:greek :arithmetic-nary + :ordering :ordering-double :ordering-triple + :arrows :arrows-twoheaded :punctuation :logic :sets))) +#+END_SRC + +*** prettify-symbols-mode +Built into emacs since 24.1 +#+BEGIN_SRC emacs-lisp +(add-hook 'python-mode-hook 'prettify-symbols-mode) +(add-hook 'python-mode-hook (lambda () + (mapc (lambda (pair) (push pair prettify-symbols-alist)) + '(;; Syntax + ("in" . #x2208) + ("not in" . #x2209) + ("return" . #x27fc) + ("yield" . #x27fb) + ("for" . #x2200) + ;; Base Types + ("int" . #x2124) + ("float" . #x211d) + ("str" . #x1d54a) + ("True" . #x1d54b) + ("False" . #x1d53d))))) +#+END_SRC + +** Debugging and Disassembly +*** Realgud +[[https://github.com/realgud/realgud][Realgud]] is a modular frontend for many debuggers +#+BEGIN_SRC emacs-lisp +(use-package realgud + :commands + (realgud:gdb + realgud:lldb + realgud:node-inspect + realgud:pdb + realgud:trepan3k)) +#+END_SRC +*** RMSBolt +#+BEGIN_SRC emacs-lisp +(use-package rmsbolt + :commands rmsbolt-mode) +#+END_SRC +** Syntax checking +*** Flycheck +Flycheck does syntax highlighting in a few languages +#+BEGIN_SRC emacs-lisp +(use-package flycheck + :hook (prog-mode . flycheck-mode)) +#+END_SRC + +*** Column 80 Highlight +Add a hotkey for highlighting column 80 +and activate it in =prog-mode= +#+BEGIN_SRC emacs-lisp +(use-package fill-column-indicator + :init + (setq fci-rule-use-dashes t) + (setq fci-rule-column 80) + :general + (foltz-major-def + :keymaps 'prog-mode-map + "l" 'fci-mode + "f" 'toggle-truncate-lines)) +#+END_SRC + +** Snippets +Yasnippet adds support for custom snippets +#+BEGIN_SRC emacs-lisp +(use-package yasnippet + :commands yas-minor-mode + :hook (prog-mode . yas-minor-mode) + :custom + (yas-snippet-dirs + '("~/.emacs.d/snippets" + "~/.emacs.d/elpa/yasnippet-snippets-0.6/snippets"))) +;;;(use-package yasnippet-snippets) +#+END_SRC + +** Git +*** magit +It's magic git! +Keybinds [[https://github.com/emacs-evil/evil-magit][here]] +#+BEGIN_SRC emacs-lisp + (use-package magit + :general + (foltz-git-def + "s" 'magit-status + "d" 'magit-diff + "g" 'magit-grep)) +#+END_SRC +It's *evil* magic git! +#+BEGIN_SRC emacs-lisp +(use-package evil-magit + :after (evil magit)) +#+END_SRC +*** forge +Magic GitHub facilities for git forges such as GitHub and GitLab! +#+BEGIN_SRC emacs-lisp + (use-package forge + :after magit + :init + (setq foltz-forge-hosts + '(("git.lcsr.rutgers.edu" "git.lcsr.rutgers.edu/api/v4" "git.lcsr.rutgers.edu" forge-gitlab-repository))) + :config + (setq forge-alist (append forge-alist foltz-forge-hosts))) +#+END_SRC +** Projects +Projectile provides project-level features like +make shortcuts and file switching +#+BEGIN_SRC emacs-lisp +(use-package projectile + :init + (defun foltz-projectile-neotree () "Open NeoTree in the project root" + (interactive) + (let + ((project-dir (projectile-project-root)) + (file-name (buffer-file-name))) + (neotree-toggle) + (if project-dir + (if (neo-global--window-exists-p) + (progn + (neotree-dir project-dir) + (neotree-find file-name)))))) + + (defun foltz-projectile-discover-projects (directory) "Add projects in dir to projectile cache" + (interactive + (list (read-directory-name "Starting directory: "))) + (let ((subdirs (directory-files directory t))) + (mapcar (lambda (dir) + (when + (and + (file-directory-p dir) + (not (member (file-name-nondirectory dir) '(".." ".")))) + (let ((default-directory dir) (projectile-cached-project-root dir)) + (when (projectile-project-p) + (projectile-add-known-project (projectile-project-root)))))) + subdirs))) + + :config + (projectile-mode 1) + (foltz-projectile-discover-projects "~/Documents/dev") + :general + (:keymaps 'projectile-command-map + "t" 'foltz-projectile-neotree) + (foltz-leader-def + :states 'normal + "p" '(:keymap projectile-command-map)) + :custom + (projectile-completion-system 'ivy) + (projectile-project-search-path '("~/Documents/dev"))) +#+END_SRC +** Languages +*** Fish +Beter editing of scripts for the fish shell +#+BEGIN_SRC emacs-lisp +(use-package fish-mode + :mode "\\.fish\\'") +#+END_SRC +*** Markdown +#+BEGIN_SRC emacs-lisp +(use-package markdown-mode + :mode "\\.md\\'") +#+END_SRC + +*** Python +Jedi for autocompletion sources +#+BEGIN_SRC emacs-lisp +(use-package company-jedi + :company python-mode) +#+END_SRC + +*** Javascript +[[https://github.com/mooz/js2-mode][js2-mode]] improves the default js mode. Keybindings in [[https://github.com/emacs-evil/evil-collection/blob/master/evil-collection-js2-mode.el][this file]]. +#+BEGIN_SRC emacs-lisp +(use-package js2-mode + :mode "\\.js\\'" + :interpreter "node") +#+END_SRC + +*** Web-dev +Web-mode should give everything you need for a web-dev major mode. +Company integration is done with company-web + +#+BEGIN_SRC emacs-lisp +(use-package web-mode + :mode ("\\.html\\'" + "\\.php\\'" + "\\.blade\\.") + :custom + (web-mode-code-indent-offset 4) + (web-mode-indent-style 4)) + +(use-package company-web + :company web-mode) +#+END_SRC + +*** JSON +Just an enhanced json mode +#+BEGIN_SRC emacs-lisp +(use-package json-mode + :mode "\\.json\\'") +#+END_SRC + +*** YAML +Enhanced yaml mode +#+BEGIN_SRC emacs-lisp +(use-package yaml-mode + :mode "\\.yaml\\'") +#+END_SRC + +*** Arch PKGBUILD +For editing PKGBUILD files +#+BEGIN_SRC emacs-lisp +(use-package pkgbuild-mode + :mode ".*PKGBUILD\\'") +#+END_SRC + +*** LaTeX +**** AUCTeX +AUCTeX is a major mode for editing tex, +CDLaTeX adds some minor niceities to it. +company-auctex for completion. +#+BEGIN_SRC emacs-lisp +(use-package tex + :defer t + :ensure auctex + :general + (foltz-major-def + :keymaps 'TeX-mode-map + "e" 'TeX-command-run-all) + :custom + (TeX-auto-save t)) + +(use-package company-auctex + :company LaTeX-mode) + +(use-package company-math + :company ((TeX-mode . company-math-symbols-latex) + (TeX-mode . company-math-symbols-unicode) + (TeX-mode . company-latex-commands))) +#+END_SRC +**** cdlatex +***** Environment +#+BEGIN_SRC emacs-lisp +(setq foltz-cdlatex-envs nil) +#+END_SRC +***** Commands +#+BEGIN_SRC emacs-lisp +(setq foltz-cdlatex-commands nil) +#+END_SRC +***** Math Symbols +#+BEGIN_SRC emacs-lisp +(setq foltz-cdlatex-symbols + '((?I ("\\infty")))) +#+END_SRC +***** cdlatex +cdlatex adds better TeX-specific template expansions and other niceties. +#+BEGIN_SRC emacs-lisp +(use-package cdlatex + :hook (LaTeX-mode . cdlatex-mode) + :custom + (cdlatex-env-alist foltz-cdlatex-envs) + (cdlatex-command-alist foltz-cdlatex-commands) + (cdlatex-math-symbol-alist foltz-cdlatex-symbols)) +#+END_SRC +*** Rust +#+BEGIN_SRC emacs-lisp +(use-package rust-mode + :mode "\\.rs\\'" + :general + (foltz-major-def + :keymaps 'rust-mode-map + "TAB" 'rust-format-buffer)) + +(use-package flycheck-rust + :hook (rust-mode . flycheck-rust-setup)) + +(use-package racer + :hook ((rust-mode . racer-mode) + (rust-mode . eldoc-mode)) + :custom + (racer-cmd "~/.cargo/bin/racer") + (racer-rust-src-path "~/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src")) + +(use-package cargo + :hook (rust-mode . cargo-minor-mode) + :general + (foltz-major-def + :keymaps 'rust-mode-map + "b" 'cargo-process-build + "r" 'cargo-process-run + "t" 'cargo-process-test)) +#+END_SRC +*** C/C++ +**** Irony +Irony handles enhanced C/C++ operations powered by clang +company-irony for company integration +#+BEGIN_SRC emacs-lisp +(use-package irony + :after counsel + :hook ((c++-mode . irony-mode) + (c-mode . irony-mode) + (irony-mode . irony-cdb-autosetup-compile-options))) + +(use-package company-irony + :company irony-mode) + +(use-package company-irony-c-headers + :company irony-mode) + +(use-package flycheck-irony + :hook (irony-mode . flycheck-irony-setup)) +#+END_SRC +**** Hotkeys +#+BEGIN_SRC emacs-lisp +(foltz-major-def + :keymaps '(c++-mode-map c-mode-map) + "r" 'rmsbolt-mode + "c" 'rmsbolt-compile) +#+END_SRC diff --git a/packages.yml b/packages.yml index dd1105f..ebef6f1 100644 --- a/packages.yml +++ b/packages.yml @@ -31,6 +31,7 @@ Editors: - emacs: config: - .emacs.d/config.org + - .emacs.d/sandbox.org - .emacs.d/init.el - .local/share/applications/emacs.desktop - neovim