* About # -*- mode: org; -*- #+TITLE: Wolfe's Literate Emacs Config #+AUTHOR: Josh Wolfe #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+LATEX_HEADER: \usepackage[margin=0.7in]{geometry} #+HTML: Build Status

This literate config is best read [[http://wolfecub.github.io/dotfiles/][here]] or in emacs. This page is generated and kept up to date using a combination of [[https://travis-ci.org/WolfeCub/dotfiles/][travis ci]] and [[https://github.com/fniessen/org-html-themes][ReadTheOrg]]. If you want to see the script that travis uses [[https://github.com/WolfeCub/dotfiles/blob/master/emacs/.emacs.d/build_site.sh][here]] is the bash script it runs and [[https://github.com/WolfeCub/dotfiles/blob/master/emacs/.emacs.d/generate-html.el][this]] is the =.el= file that it runs through emacs to generate the html page (this was mostly stolen from IvanMalison). Included in this section is also my export headers. These are responsible for including the ReadTheOrg theme as well as some metadata and options like title, author, table of contents etc. If you wish to see the headers I'm using, [[https://raw.githubusercontent.com/WolfeCub/dotfiles/master/emacs/.emacs.d/README.org][this]] is the raw org file. * Startup Runs a different function on startup depending on display mode. #+BEGIN_SRC emacs-lisp :tangle yes (setq custom-theme-directory "~/.emacs.d/themes") #+END_SRC #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/term-setup () (use-package base16-theme :config (load-theme 'base16-default-dark t)) (setq nlinum-format "%d ") ;;(global-hl-line-mode 1) ;;(add-to-list 'default-frame-alist '(background-color . "color-16")) (custom-set-faces '(line-number ((t (:background "color-18" :foreground "brightblack")))) '(ivy-current-match ((t (:background "color-18" :foreground "color-16")))) '(linum ((t (:background "color-18")))) '(region ((t :background "color-19"))) '(mode-line ((t (:background "color-19" :foreground "brightblue" :box nil)))) '(mode-line-inactive ((t (:background "color-18" :foreground "color-244")))))) #+END_SRC #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/gui-setup () (use-package base16-theme :config (load-theme 'base16-default-dark t) (defvar my/base16-colors base16-default-dark-colors) (setq evil-emacs-state-cursor `(,(plist-get my/base16-colors :base0D) box) evil-insert-state-cursor `(,(plist-get my/base16-colors :base0D) bar) evil-motion-state-cursor `(,(plist-get my/base16-colors :base0E) box) evil-normal-state-cursor `(,(plist-get my/base16-colors :base07) box) evil-replace-state-cursor `(,(plist-get my/base16-colors :base08) bar) evil-visual-state-cursor `(,(plist-get my/base16-colors :base09) box)) (set-face-attribute 'fringe nil :background nil)) (custom-set-faces '(region ((t (:background "gray19")))) '(org-block ((t (:foreground "#d8d8d8")))) '(org-done ((t (:box (:line-width 1) :weight bold)))) '(org-level-1 ((t (:inherit outline-1 :height 1.3)))) '(org-todo ((t (:box (:line-width 1) :weight bold)))))) #+END_SRC #+BEGIN_SRC emacs-lisp :tangle yes ;; Not a function but it needs to be after the 2 setup functions (if (display-graphic-p) (wolfe/gui-setup) (wolfe/term-setup)) #+END_SRC * General Settings Basic settings I can't really live without. #+BEGIN_SRC emacs-lisp :tangle yes (setq inhibit-splash-screen t inhibit-startup-message t inhibit-startup-echo-area-message "wolfe") (tool-bar-mode -1) ; No toolbar (scroll-bar-mode -1) ; Hide scrollbars (menu-bar-mode -1) ; No menubar (show-paren-mode t) ; Highlights matching parens (setq initial-scratch-message "") ; No scratch text (fset 'yes-or-no-p 'y-or-n-p) ; y/n instead of yes/no (setq-default indent-tabs-mode nil) (column-number-mode t) (delete-selection-mode 1) ; Replace selection on insert (setq vc-follow-symlinks t) ; Always follow symlinks (when (member "Inconsolata" (font-family-list)) ; Set default font (add-to-list 'default-frame-alist '(font . "Inconsolata-15" )) (set-face-attribute 'default t :font "Inconsolata-15")) (setq custom-file "~/.emacs.d/custom.el") ; Set custom file & don't load it (setq tags-revert-without-query t) ; Don't ask to reload TAGS file (setq scroll-margin 10 scroll-step 1 scroll-conservatively 10000 scroll-preserve-screen-position 1) (setq-default truncate-lines t) (load-file "~/.emacs.d/lisp/column-marker.el") (add-hook 'prog-mode-hook (lambda () (interactive) (column-marker-1 81))) (custom-set-faces '(column-marker-1 ((t (:background "dim gray"))))) (setq explicit-shell-file-name (if (file-readable-p "/usr/bin/zsh") "/usr/bin/zsh" "/bin/bash")) (setq source-directory "~/Projects/emacs/") (when (eq system-type 'windows-nt) (setq explicit-shell-file-name "cmdproxy.exe")) #+END_SRC * Mode Line #+BEGIN_SRC emacs-lisp :tangle yes (if (display-graphic-p) (use-package powerline :init (defadvice powerline-major-mode (around delight-powerline-major-mode activate) (let ((inhibit-mode-name-delight nil)) ad-do-it)) :config (setq powerline-arrow-shape 'curve powerline-display-buffer-size nil powerline-display-mule-info nil) (powerline-default-theme) (remove-hook 'focus-out-hook 'powerline-unset-selected-window) (setq powerline-height 24)) (setq-default mode-line-format (list " " ;; is this buffer read-only? '(:eval (when buffer-read-only (propertize "RO" 'face 'font-lock-type-face 'help-echo "Buffer is read-only"))) ;; was this buffer modified since the last save? '(:eval (when (buffer-modified-p) (propertize "M" 'face 'font-lock-warning-face 'help-echo "Buffer has been modified"))) " " ;; the buffer name; the file name as a tool tip '(:eval (propertize "%b " 'face 'font-lock-keyword-face 'help-echo (buffer-file-name))) ;; the current major mode for the buffer. "[" '(:eval (propertize (format-mode-line mode-name) 'face '(:family "Arial") 'help-echo buffer-file-coding-system)) '(:eval (propertize (format-mode-line minor-mode-alist) 'face '(:family "Arial"))) "] " ;; line and column "(" ;; '%02' to set to 2 chars at least; prevents flickering (propertize "%02l" 'face 'font-lock-type-face) "," (propertize "%02c" 'face 'font-lock-type-face) ") " ;; relative position, size of file "[" (propertize "%p" 'face 'font-lock-constant-face) ;; % above top "/" (propertize "%I" 'face 'font-lock-constant-face) ;; size "] " ;; add the time, with the date and the emacs uptime in the tooltip '(:eval (propertize (format-time-string "%H:%M") 'help-echo (concat (format-time-string "%c; ") (emacs-uptime "Uptime:%hh")))) ))) #+END_SRC * Functions ** Face Under Point Returns the font lock face that's under the cursor. #+BEGIN_SRC emacs-lisp :tangle yes (defun what-face (pos) (interactive "d") (let ((face (or (get-char-property (point) 'read-face-name) (get-char-property (point) 'face)))) (if face (message "Face: %s" face) (message "No face at %d" pos)))) #+END_SRC ** Compile Project Compiles the project without a prompt. #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/compile-no-prompt () (interactive) (let ((compilation-read-command nil)) (compile (eval compile-command)))) #+END_SRC ** Compile Dotfiles Compiles all el files in the =~/.emacs.d= directory. #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/compile-dot-emacs () "Byte-compile dotfiles." (interactive) (byte-recompile-directory user-emacs-directory 0)) #+END_SRC #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/clear-all-elc () (interactive) (shell-command "find ~/.emacs.d/ -name \"*.elc\" -type f -delete")) #+END_SRC #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/remove-elc-on-save () "If you're saving an emacs-lisp file, likely the .elc is no longer valid." (add-hook 'after-save-hook (lambda () (if (file-exists-p (concat buffer-file-name "c")) (delete-file (concat buffer-file-name "c")))) nil t)) (add-hook 'emacs-lisp-mode-hook 'wolfe/remove-elc-on-save) #+END_SRC ** Find Tags Looks up tag under point. #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/find-tag () "Jump to the tag at point without prompting" (interactive) (find-tag (find-tag-default))) #+END_SRC #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/create-tags () "Create the tags table" (interactive) (save-window-excursion (shell-command "etags -R -o ETAGS *"))) #+END_SRC #+BEGIN_SRC emacs-lisp :tangle yes (defadvice xref-find-definitions (around refresh-etags activate) "Rerun etags and reload tags if tag not found and redo find-tag. If buffer is modified, ask about save before running etags." (condition-case err ad-do-it (error (and (buffer-modified-p) (not (ding)) (save-buffer)) (save-window-excursion (shell-command "etags -R *")) ad-do-it))) #+END_SRC ** Terminal Suspend Fixes =C-z= in terminal. #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/controlz () (interactive) (when (eq (display-graphic-p) nil) (suspend-frame))) #+END_SRC ** Dropbox Utility functions for finding Dropbox directories/files. #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/org-open (name) "Opens the file in the dropbox path" (interactive) (when (eq system-type 'gnu/linux) (evil-buffer-new nil (concat "~/Dropbox/org/" name ".org"))) (when (eq system-type 'windows-nt) (evil-buffer-new nil (concat "C:\\Users\\Josh\\Dropbox\\org\\" name ".org")))) #+END_SRC #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/org-dropbox-path () "Returns the dropbox path" (interactive) (cond ((eq system-type 'gnu/linux) "~/Dropbox/org/") ((eq system-type 'windows-nt) "C:\\Users\\Josh\\Dropbox\\org\\") (else ""))) #+END_SRC #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/dropbox-start () (interactive) (if (eq nil (file-exists-p "/virtual/wolfejos/dropbox/.dropbox-dist")) (call-process-shell-command "(python ~/.emacs.d/dropbox.py start -i&)") (call-process-shell-command "(python ~/.emacs.d/dropbox.py start&)"))) #+END_SRC #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/dropbox-stop () (interactive) (call-process-shell-command "python ~/.emacs.d/dropbox.py stop&")) #+END_SRC ** Reload For reloading =init.el= file without restarting. #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/load-init () "Reloads init file" (interactive) (load-file "~/.emacs.d/init.el")) #+END_SRC ** Narrowing Better narrowing. #+BEGIN_SRC emacs-lisp :tangle yes (defun narrow-or-widen-dwim (p) "Widen if buffer is narrowed, narrow-dwim otherwise. Dwim means: region, org-src-block, org-subtree, or defun, whichever applies first. Narrowing to org-src-block actually calls `org-edit-src-code'. With prefix P, don't widen, just narrow even if buffer is already narrowed." (interactive "P") (declare (interactive-only)) (cond ((and (buffer-narrowed-p) (not p)) (widen)) ((region-active-p) (narrow-to-region (region-beginning) (region-end))) ((derived-mode-p 'org-mode) ;; `org-edit-src-code' is not a real narrowing ;; command. Remove this first conditional if ;; you don't want it. (cond ((ignore-errors (org-edit-src-code) t) (delete-other-windows)) ((ignore-errors (org-narrow-to-block) t)) (t (org-narrow-to-subtree)))) ((derived-mode-p 'latex-mode) (LaTeX-narrow-to-environment)) (t (narrow-to-defun)))) (defun wolfe/man () (if (executable-find "man") (man (word-at-point)) (woman))) #+END_SRC ** Projects Folder This function returns the path to my projects folder depending on OS. #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/project-path () (cond ((eq system-type 'gnu/linux) "~/Projects") ((eq system-type 'windows-nt) "C:/dev/") (else nil))) #+END_SRC ** Open C# Project File This function prompts for a file. It then opens that file and looks for a src/ directory above it. The dir can be any number of levels higher. In that folder it looks for a C# .sln file and starts the an omnisharp server for that project. #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/csharp-project () (interactive) (setq path (read-file-name "File: " (wolfe/project-path))) (setq split-path (split-string path "/")) (if (member "src" split-path) (catch 'loop (dolist (item (reverse split-path)) (if (string-equal item "src") (throw 'loop nil) (delete item split-path))) (message "src/ directory not found"))) (if (or (equal '("c:") split-path) (equal '() split-path)) (message "Could not find src directory for specified project") (progn (omnisharp-start-omnisharp-server (mapconcat 'identity split-path "/")) (find-file path)))) #+END_SRC ** Hot Expand Is used in one of my [[Hydra][hydras]] =wolfe/hydra-org-expand=. For inserting org-templates. #+BEGIN_SRC emacs-lisp :tangle yes (defun hot-expand (str) "Expand org template." (insert str) (org-try-structure-completion)) #+END_SRC ** Ag Project If In Project Ag #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/ag-try-project () (interactive) (if (projectile-project-p) (call-interactively 'projectile-ag) (call-interactively 'ag))) #+END_SRC ** Projectile Invalidate From List Select project from list of projectile projects to invalidate. #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/projectile-invalidate-list () (interactive) (projectile-invalidate-cache t)) #+END_SRC * Org Mode ** General Setup some basic quality of life org settings. #+BEGIN_SRC emacs-lisp :tangle yes (setq org-pretty-entities t org-src-fontify-natively t org-src-tab-acts-natively t org-src-window-setup 'current-window org-fontify-whole-heading-line t org-fontify-done-headline t org-fontify-quote-and-verse-blocks t org-log-done 'time org-agenda-use-time-grid nil org-agenda-skip-deadline-if-done t org-agenda-skip-scheduled-if-done t org-ellipsis "⤵") (global-set-key "\C-cl" 'org-store-link) ;; ispell ignores SRC blocks (add-to-list 'ispell-skip-region-alist '("#\\+BEGIN_SRC" . "#\\+END_SRC")) (add-to-list 'ispell-skip-region-alist '("#\\+BEGIN_LATEX" . "#\\+END_LATEX")) (add-hook 'org-mode-hook '(lambda () (setq org-file-apps (append '(("\\.pdf\\'" . "zathura \"%s\"")) org-file-apps )))) #+END_SRC ** Bullets Replaces the asterisks with nice UTF-8 bullets. #+BEGIN_SRC emacs-lisp :tangle yes (use-package org-bullets :config (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))) #+END_SRC ** Agenda Setup org agenda for managing my life. #+BEGIN_SRC emacs-lisp :tangle yes (use-package org-agenda :ensure nil :bind (("C-c a" . org-agenda) :map org-agenda-mode-map ("j" . org-agenda-next-item) ("k" . org-agenda-previous-item)) :config ;; Formats the agenda into nice columns (setq org-agenda-prefix-format '((agenda . " %i %-12t% s %-12(car (last (org-get-outline-path)))") (timeline . " % s") (todo . " %i %-12:c") (tags . " %i %-12:c") (search . " %i %-12:c"))) ;; Sets location of org files (setq org-agenda-files '("~/Dropbox/org/everything.org")) (setq browse-url-browser-function 'browse-url-chromium)) #+END_SRC ** Export Setup html for syntax highlighting on export and add the apppropriate minted package for PDF export. #+BEGIN_SRC emacs-lisp :tangle yes (use-package htmlize) (require 'ox-latex) (add-to-list 'org-latex-packages-alist '("" "minted")) (setq org-latex-listings 'minted) (setq org-latex-pdf-process '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f" "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f" "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f")) #+END_SRC * Hydra Customizable popup menus. #+BEGIN_SRC emacs-lisp :tangle yes (use-package hydra) #+END_SRC #+BEGIN_SRC emacs-lisp :tangle yes (setq wolfe/hydra-projectile (defhydra hydra-projectile (:color blue :columns 4) "Projectile" ("f" counsel-projectile-find-file "Find File") ("s" counsel-projectile-switch-project "Switch Project") ("k" projectile-kill-buffers "Kill Buffers") ("c" projectile-invalidate-cache "Clear Cache") ("d" counsel-projectile-find-dir "Find Directory") ("o" projectile-multi-occur "Multi Occur") ("P" projectile-clear-known-projects "Clear Projects") ("C" wolfe/projectile-invalidate-list "Clear A Cache") )) (setq wolfe/hydra-jira (defhydra hydra-jira (:color blue :columns 4) "Jira" ("p" org-jira-get-projects "Get Projects") ("b" org-jira-browse-issue "Browse Issue") ("g" org-jira-get-issues "Get Issues") ("u" org-jira-update-issue "Update Issue") ("p" org-jira-progress-issue "Update Issue Progress") ("a" org-jira-assign-issue "Assign Issue") ("r" org-jira-refresh-issue "Refresh Issue") ("R" org-jira-refresh-issues-in-buffer "Refresh Issues in Buffer") ("c" org-jira-create-issue "Create Issue") ("y" org-jira-copy-current-issue-key "Copy Current Issue Key") ("s" org-jira-create-subtask "Create Subtask") ("G" org-jira-get-subtasks "Get Subtasks") ("U" org-jira-update-comment "Update Comment") ("t" org-jira-todo-to-jira "Todo to Jira") ("O" (funcall wolfe/hydra-org-expand) "Org Hydra"))) (setq wolfe/hydra-csharp (defhydra hydra-csharp (:color blue) "Omnisharp" ("d" omnisharp-go-to-definition "Goto definition") ("D" omnisharp-go-to-definition-other-window "Pop-open definition") ("u" omnisharp-find-usages "Find usages") ("r" omnisharp-rename "Rename symbol") ("R" omnisharp-reload-solution "Reload solution") ("i" omnisharp-code-format-region "Indent region") ("I" omnisharp-code-format-entire-file "Indent entire file") )) (setq wolfe/hydra-org-expand (defhydra hydra-org-template (:color blue :hint nil) " _c_enter _q_uote _L_aTeX: _l_atex _e_xample _i_ndex: _a_scii _v_erse _I_NCLUDE: _s_rc ^ ^ _H_TML: _h_tml ^ ^ _A_SCII: " ("s" (hot-expand " for evil mode's use (setq evil-want-C-i-jump nil) :config (evil-mode t) (setq evil-split-window-below t) (setq evil-vsplit-window-right t) (setq-default evil-symbol-word-search t) (setq evil-lookup-func #'wolfe/man) (evil-ex-define-cmd "re[load]" 'wolfe/load-init) ; Custom reload command (evil-ex-define-cmd "Q" 'save-buffers-kill-terminal) ; For typos (define-key evil-ex-map "e " 'counsel-find-file) ; Trigger file completion :e (global-unset-key (kbd "M-SPC")) ; Unbind secondary leader (general-create-definer wolfe/bind-leader :keymaps 'global :states '(normal insert visual emacs) :prefix "SPC" :non-normal-prefix "M-SPC") :general (:states 'motion "k" 'evil-previous-visual-line "j" 'evil-next-visual-line) (:states 'operator "k" 'evil-previous-line "j" 'evil-next-line) (:states 'visual "<" (lambda () (interactive) (evil-shift-left (region-beginning) (region-end)) (evil-normal-state) (evil-visual-restore)) ">" (lambda () (interactive) (evil-shift-right (region-beginning) (region-end)) (evil-normal-state) (evil-visual-restore))) (:states 'normal "C-z" 'wolfe/controlz) (wolfe/bind-leader "w" 'save-buffer "S" 'eval-buffer "s" 'eval-defun "b" 'mode-line-other-buffer "k" 'kill-buffer "m" 'ivy-switch-buffer "t" 'wolfe/find-tag "e" 'iedit-mode "c" 'wolfe/compile-no-prompt "n" 'narrow-or-widen-dwim "a" 'org-agenda "g" 'magit-status "f" 'wolfe/ag-try-project "''" 'org-edit-src-exit "#" 'wolfe/csharp-project "p" (lambda() (interactive) (funcall wolfe/hydra-projectile)) ";" (lambda() (interactive) (save-excursion (end-of-line) (insert-char ?\;))) "id" (lambda() (interactive) (indent-region (point-min) (point-max))) "o" (lambda() (interactive) (wolfe/org-open "everything")) "SPC" (lambda() (interactive) (funcall (wolfe/hydra-selector))) "init" (lambda() (interactive) (evil-buffer-new nil "~/.emacs.d/README.org")) ) ) ;; Tpope's surround (use-package evil-surround :config (global-evil-surround-mode 1)) (use-package evil-magit) (use-package evil-matchit :config (global-evil-matchit-mode 1)) #+END_SRC * Ivy, Counsel and Swiper #+BEGIN_SRC emacs-lisp :tangle yes (use-package ivy :demand :bind (("M-x" . counsel-M-x) ("C-x C-f" . counsel-find-file) :map ivy-minibuffer-map ("TAB" . ivy-next-line) ("RET" . ivy-alt-done)) :init (use-package smex) (use-package counsel) :config (setq ivy-re-builders-alist '((t . ivy--regex-ignore-order))) (setq ivy-wrap t) (ivy-mode 1) (eval-after-load "hydra" (use-package ivy-hydra))) #+END_SRC #+BEGIN_SRC emacs-lisp :tangle yes (use-package swiper :bind (("C-s" . swiper))) #+END_SRC * Ag Emacs interface for ag #+BEGIN_SRC emacs-lisp :tangle yes (use-package ag) #+END_SRC * Projectile Project management #+BEGIN_SRC emacs-lisp :tangle yes (use-package projectile :config (use-package counsel-projectile :config (counsel-projectile-on)) (setq projectile-enable-caching t) (setq projectile-indexing-method 'alien) (setq projectile-globally-ignored-file-suffixes '(".dll" ".exe")) (projectile-global-mode)) #+END_SRC * Magit Magic git interface from within emacs #+BEGIN_SRC emacs-lisp :tangle yes (use-package magit :config (global-set-key "\C-x\g" 'magit-status)) #+END_SRC * Nlinum Vim-like relative line numbering #+BEGIN_SRC emacs-lisp :tangle yes (if (fboundp 'display-line-numbers-mode) (progn (setq display-line-numbers 'relative) (add-hook 'prog-mode-hook 'display-line-numbers-mode)) (progn (use-package nlinum-relative :config (nlinum-relative-setup-evil) (setq nlinum-relative-redisplay-delay 0.25) (setq nlinum-relative-current-symbol "") (add-hook 'prog-mode-hook 'nlinum-relative-mode)))) #+END_SRC * Iedit Edit all instances of a string #+BEGIN_SRC emacs-lisp :tangle yes (use-package iedit :config (setq iedit-toggle-key-default nil)) #+END_SRC * Flycheck On the fly syntax checking #+BEGIN_SRC emacs-lisp :tangle yes (use-package flycheck :config (global-flycheck-mode) (with-eval-after-load 'flycheck (setq-default flycheck-disabled-checkers '(emacs-lisp-checkdoc)))) #+END_SRC * Restclient Postman inside of emacs. #+BEGIN_SRC emacs-lisp :tangle yes (use-package restclient) #+END_SRC * Delight #+BEGIN_SRC emacs-lisp :tangle yes (use-package delight :config (delight '((emacs-lisp-mode "ξ" :major) (lisp-interaction-mode "λ" :major) (python-mode "π" :major) (org-mode "Ø" :major) (company-mode " C" company) (ivy-mode " ι" ivy) (projectile-mode " ρ" projectile) (eldoc-mode " ε" eldoc) (flycheck-mode " ƒ" flycheck) (undo-tree-mode "" undo-tree) (auto-revert-mode "" autorevert)))) #+END_SRC * Web #+BEGIN_SRC emacs-lisp :tangle yes (use-package web-mode :config (add-to-list 'auto-mode-alist '("\\.html\\'" . web-mode)) (add-to-list 'auto-mode-alist '("\\.php\\'" . web-mode)) (add-to-list 'auto-mode-alist '("\\.js\\'" . web-mode)) (setq web-mode-enable-auto-closing t) (setq web-mode-enable-auto-opening t) (setq web-mode-enable-auto-indentation t)) (use-package json-mode) #+END_SRC * Latex #+BEGIN_SRC emacs-lisp :tangle yes (use-package latex-preview-pane :ensure f) #+END_SRC * Company Autocomplete engine #+BEGIN_SRC emacs-lisp :tangle yes (use-package company :bind (:map company-active-map ("C-n" . company-select-next) ("C-p" . company-select-previous)) :init (global-company-mode) :config (setq company-idle-delay 0) ; Delay to complete (setq company-minimum-prefix-length 1) (setq company-selection-wrap-around t) ; Loops around suggestions (if (display-graphic-p) (define-key company-active-map [tab] 'company-select-next) (define-key company-active-map (kbd "C-i") 'company-select-next)) ;; C / C++ (setq company-clang-insert-arguments nil) (add-hook 'c++-mode-hook 'irony-mode) (add-hook 'c-mode-hook 'irony-mode) (use-package company-irony :config (eval-after-load 'company '(add-to-list 'company-backends 'company-irony))) ;; C# (use-package omnisharp :config (setq omnisharp-server-executable-path "C:/emacs/omnisharp/Omnisharp.exe") (add-hook 'csharp-mode-hook 'omnisharp-mode) (add-to-list 'company-backends 'company-omnisharp)) (use-package company-jedi :config (add-to-list 'company-backends 'company-jedi)) ;; Javascript (use-package company-tern :config (add-to-list 'company-backends 'company-tern) (add-hook 'web-mode-hook 'tern-mode)) ;; Restclient (use-package company-restclient :config (add-to-list 'company-backends 'company-restclient)) (ignore-errors (require 'color) (let ((bg (face-attribute 'default :background))) (custom-set-faces `(company-tooltip ((t (:inherit default :background ,(color-lighten-name bg 2))))) `(company-scrollbar-bg ((t (:background ,(color-lighten-name bg 10))))) `(company-scrollbar-fg ((t (:background ,(color-lighten-name bg 5))))) `(company-tooltip-selection ((t (:inherit font-lock-function-name-face)))) `(company-tooltip-common ((t (:inherit font-lock-constant-face)))))))) #+END_SRC * Email #+BEGIN_SRC emacs-lisp :tangle yes (when (require 'mu4e nil 'noerror) (setq mu4e-msg2pdf "/usr/bin/msg2pdf") (setq ;; set mu4e as default mail client mail-user-agent 'mu4e-user-agent ;; root mail directory - can't be switched ;; with context, can only be set once mu4e-maildir "~/.mail" mu4e-attachments-dir "~/Downloads/Attachments" ;; update command mu4e-get-mail-command "mbsync -q -a" ;; update database every seven minutes mu4e-update-interval (* 60 7) ;; use smtpmail (bundled with emacs) for sending message-send-mail-function 'smtpmail-send-it ;; optionally log smtp output to a buffer smtpmail-debug-info t ;; close sent message buffers message-kill-buffer-on-exit t ;; customize list columns mu4e-headers-fields '((:flags . 4) (:from . 20) (:human-date . 10) (:subject)) ;; for mbsync mu4e-change-filenames-when-moving t ;; pick first context automatically on launch mu4e-context-policy 'pick-first ;; use current context for new mail mu4e-compose-context-policy nil mu4e-confirm-quit nil) (global-set-key (kbd "") 'mu4e) (global-set-key (kbd "") 'mu4e-update-mail-and-index) (setq mu4e-contexts `(,(make-mu4e-context :name "gmail" :match-func (lambda(msg) (when msg (mu4e-message-contact-field-matches msg :to "@gmail.com"))) :vars '( ;; local directories, relative to mail root (mu4e-sent-folder . "/gmail/[Gmail]/.Sent Mail") (mu4e-drafts-folder . "/gmail/[Gmail]/.Drafts") (mu4e-trash-folder . "/gmail/[Gmail]/.Trash") (mu4e-refile-folder . "/gmail/[Gmail]/.All Mail") ;; account details (user-mail-address . "joshuafwolfe@gmail.com") (user-full-name . "Josh Wolfe") (mu4e-user-mail-address-list . ( "@gmail.com" )) ;; gmail saves every outgoing message automatically (mu4e-sent-messages-behavior . delete) (mu4e-maildir-shortcuts . (("/gmail/INBOX" . ?j) ("/gmail/[Gmail]/.All Mail" . ?a) ("/gmail/[Gmail]/.Trash" . ?t) ("/gmail/[Gmail]/.Drafts" . ?d))) ;; outbound mail server (smtpmail-smtp-server . "smtp.gmail.com") ;; outbound mail port (smtpmail-smtp-service . 465) ;; use ssl (smtpmail-stream-type . ssl) ;; the All Mail folder has a copy of every other folder's contents, ;; and duplicates search results, which is confusing (mue4e-headers-skip-duplicates . t))))) (use-package evil-mu4e)) #+END_SRC * Misc #+BEGIN_SRC emacs-lisp :tangle yes (setq gdb-many-windows t ;; use gdb-many-windows by default gdb-show-main t ;; Non-nil means display source file containing the main routine at startup ) (use-package help-fns+) (use-package org-jira :config (setq jiralib-url "https://indigoca.atlassian.net")) #+END_SRC #+BEGIN_SRC emacs-lisp :tangle yes (use-package circe :config (setq circe-network-options '(("Freenode" :tls t :nick "interior" :channels ("#emacs") )))) #+END_SRC * Backups Stores all backups and temp files in =~/.bak.emacs/= #+BEGIN_SRC emacs-lisp :tangle yes (setq backup-by-copying t) ; Stop shinanigans with links (setq backup-directory-alist '((".*" . "~/.bak.emacs/backup/"))) ;; Creates directory if it doesn't already exist (if (eq nil (file-exists-p "~/.bak.emacs/")) (make-directory "~/.bak.emacs/")) ;; Creates auto directory if it doesn't already exist (if (eq nil (file-exists-p "~/.bak.emacs/auto")) (make-directory "~/.bak.emacs/auto")) ;; backup in one place. flat, no tree structure (setq auto-save-file-name-transforms '((".*" "~/.bak.emacs/auto/" t))) #+END_SRC * Testing ** Org Project #+BEGIN_SRC emacs-lisp :tangle yes (load-file "~/Projects/org-project/org-project.el") (setq org-project-use-ag t) #+END_SRC ** Extract Dates #+BEGIN_SRC emacs-lisp :tangle yes (defun wolfe/extract-dates (file-path) "Parse through a file for a list of all the comments" (let (already-open buf start (comments '())) (setq already-open (find-buffer-visiting file-path) buf (find-file-noselect file-path)) (with-current-buffer buf (goto-char (point-min)) (while (setq start (text-property-any (point) (point-max) 'face 'org-date)) (goto-char start) (goto-char (next-single-char-property-change (point) 'face)) (let ((item (string-trim (buffer-substring-no-properties start (point))))) (setq comments (cons item comments))))) (unless already-open (kill-buffer buf)) (reverse comments))) #+END_SRC