#+TITLE: Emacs Configuration #+AUTHOR: Levi Olson #+EMAIL: olson.levi@gmail.com #+DATE: <2019-01-30 Wed> #+LANGUAGE: en #+BABEL: :cache yes #+HTML_HEAD: #+EXPORT_FILE_NAME: index.html #+PROPERTY: header-args :tangle yes #+OPTIONS: num:10 whn:nil toc:10 H:10 #+STARTUP: content * Summary I've really been wanting to have a nicely formatted emacs config file and this is my attempt at it. * Required Magic ** Lexical Binding #+BEGIN_SRC emacs-lisp :results silent ;;; -*- lexical-binding: t -*- ;;; DO NOT EDIT THIS FILE DIRECTLY ;;; EDIT ~init.org~ instead #+END_SRC ** The Magical Glue The following auto compiles the emacs-lisp within the =init.org= file. Simply run `org-babel-tangle` to make it RAIN! #+BEGIN_SRC emacs-lisp :results silent ;; (setq byte-compile-warnings nil) (defun tangle-init () "If the current buffer is 'init.org' the code-blocks are tangled, and the tangled file is compiled." (when (equal (buffer-file-name) (expand-file-name (concat user-emacs-directory "init.org"))) ;; Avoid running hooks when tangling. (let ((prog-mode-hook nil)) (org-babel-tangle) (byte-compile-file (concat user-emacs-directory "init.el"))))) (add-hook 'after-save-hook 'tangle-init) #+END_SRC * Config ** Packages #+BEGIN_SRC emacs-lisp :results silent (require 'package) (package-initialize) (defvar my-packages '(all-the-icons amx anzu base16-theme bbdb better-defaults company company-go counsel counsel-projectile dash-at-point dashboard diminish dockerfile-mode doom-modeline doom-themes ein eldoc-eval elfeed elfeed-org elpy emmet-mode excorporate expand-region fic-mode flycheck gitignore-mode go-mode go-playground gorepl-mode iedit indium ivy ivy-hydra jabber json-mode magit markdown-mode material-theme multiple-cursors ox-reveal poporg projectile rainbow-delimiters rust-mode shrink-path tide typescript-mode ;; use-package web-mode which-key)) (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/")) (add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/")) (when (not package-archive-contents) (package-refresh-contents)) (package-initialize) (dolist (p my-packages) (when (not (package-installed-p p)) (package-install p))) #+END_SRC ** Server #+BEGIN_SRC emacs-lisp :results silent :tangle no (require 'edit-server) (edit-server-start) #+END_SRC ** Better Defaults #+BEGIN_SRC emacs-lisp :results silent (require 'better-defaults) ;; Instead of the annoying giant warning icon, just flash the modeline. ;; (this happens when you do something like C-g) (setq ring-bell-function (lambda () (let ((orig-fg (face-foreground 'mode-line))) (set-face-foreground 'mode-line "#F2804F") (run-with-idle-timer 0.1 nil (lambda (fg) (set-face-foreground 'mode-line fg)) orig-fg)))) (defun set-frame-size-according-to-resolution () "Set the Emacs window size on startup." (interactive) (if window-system (progn ;; WIDTH (if (> (x-display-pixel-width) 1280) ;; Large Screen (only show 120 cols) (add-to-list 'default-frame-alist (cons 'width 240)) ;; Small Screen (fill window) (add-to-list 'default-frame-alist (cons 'width (/ (x-display-pixel-width) (frame-char-width))))) ;; HEIGHT (if (> (x-display-pixel-height) 1080) ;; Large Screen (only fill half screen) (add-to-list 'default-frame-alist (cons 'height (/ (/ (x-display-pixel-height) 2) (frame-char-height)))) ;; Small Screen (fill window) (add-to-list 'default-frame-alist (cons 'height (/ (x-display-pixel-height) (frame-char-height))))) ))) ;; (set-frame-size-according-to-resolution) (defun window-px-width () "Get the width of the Emacs window in pixels." (interactive) (* (* (window-total-width) 2.874) (frame-char-width))) (defun window-px-left-pos () "Calculate the left position of the Emacs window." (interactive) (/ (- (x-display-pixel-width) (window-px-width)) 2)) ;; (add-to-list 'default-frame-alist (cons 'top 0)) ;; (add-to-list 'default-frame-alist (cons 'left 1000)) #+END_SRC ** Enable Disabled Commands #+BEGIN_SRC emacs-lisp :results silent (put 'narrow-to-region 'disabled nil) (put 'upcase-region 'disabled nil) (put 'downcase-region 'disabled nil) #+END_SRC ** Splash Screen #+BEGIN_SRC emacs-lisp :results silent (require 'dashboard) (dashboard-setup-startup-hook) ;; Set the title (setq dashboard-banner-logo-title "Let's begin...") ;; Set the banner (setq dashboard-startup-banner "~/.emacs.d/public/emacs-logo-350.png") ;; Value can be ;; 'official which displays the official emacs logo ;; 'logo which displays an alternative emacs logo ;; 1, 2 or 3 which displays one of the text banners ;; "path/to/your/image.png" which displays whatever image you would prefer ;; Content is not centered by default. To center, set (setq dashboard-center-content t) ;; To disable shortcut "jump" indicators for each section, set (setq dashboard-show-shortcuts t) (setq show-week-agenda-p t) (setq dashboard-items '((recents . 5) (bookmarks . 5) (projects . 5) (agenda . 5) (registers . 5))) #+END_SRC ** Basic Customization #+BEGIN_SRC emacs-lisp :results silent (defvar backup-dir (expand-file-name "~/.emacs.d/backup/")) (defvar autosave-dir (expand-file-name "~/.emacs.d/autosave/")) (setq initial-scratch-message nil backup-directory-alist (list (cons ".*" backup-dir)) auto-save-list-file-prefix autosave-dir auto-save-file-name-transforms `((".*" ,autosave-dir t))) (menu-bar-mode 0) (scroll-bar-mode 0) (tool-bar-mode 0) (setq auth-sources '("~/.authinfo.gpg")) (set-default 'truncate-lines t) ;; (load-theme 'doom-city-lights t) ;; (load-theme 'doom-dracula t) ;; (load-theme 'doom-nord t) (load-theme 'doom-one t) ;; (load-theme 'doom-spacegrey t) ;; (load-theme 'base16-ocean t) (load-theme 'base16-onedark t) (global-linum-mode t) (global-auto-revert-mode t) (defalias 'yes-or-no-p 'y-or-n-p) #+END_SRC *** Diary #+BEGIN_SRC emacs-lisp :results silent (defvar diary-file (expand-file-name "~/.emacs.d/diary/main")) (add-hook 'diary-list-entries-hook 'diary-sort-entries t) (add-hook 'diary-list-entries-hook 'diary-include-other-diary-files) (add-hook 'diary-mark-entries-hook 'diary-mark-included-diary-files) (add-hook 'calendar-today-visible-hook 'calendar-mark-today) (setq calendar-latitude 44 calendar-longitude -97 calendar-location-name "Hayti, SD") #+END_SRC ** Custom Modes *** OpenHAB Mode #+BEGIN_SRC emacs-lisp :results silent (require 'font-lock) (defvar openhab-mode-hook nil) (defvar openhab-mode-map (let ((map (make-keymap))) (define-key map "\C-j" 'newline-and-indent) map) "Keymap for OPENHAB major mode.") (add-to-list 'auto-mode-alist '("\\.sitemap\\'" . openhab-mode)) (add-to-list 'auto-mode-alist '("\\.items\\'" . openhab-mode)) (add-to-list 'auto-mode-alist '("\\.rules\\'" . openhab-mode)) (add-to-list 'auto-mode-alist '("\\.things\\'" . openhab-mode)) (defconst openhab-font-lock-keywords `( ("\<.*\>" . font-lock-constant-face) (,(regexp-opt '( ;; KEYWORDS "Selection" "Slider" "List" "Setpoint" "Video" "Chart" "Webview" "Colorpicker" "Timer" "Number" "String" "Switch" "Rollershutter" "Number" "String" "Dimmer" "Contact" "DateTime" "Color" "Text" "Group" "Image" "Frame" "Thing" "Bridge" "Time" "System" "sitemap" "rule" "when" "then" "end" "if" "val" "import" "var" "say" "postUpdate" "switch" "println" "case" "or" "sendCommand" ) 'words) (1 font-lock-keyword-face)) (,(regexp-opt '( "ON" "OFF" "on" "off" "AND" "OR" "NAND" "NOR" "AVG" "SUM" "MAX" "MIN" "true" "false" ) 'words) (1 font-lock-constant-face)) (,(regexp-opt '( "name" "label" "item" "period" "refresh" "icon" "mappings" "minValue" "maxValue" "step" "switchsupport" "url" "height" "refresh" "visibility" "valuecolor" ) 'words) (1 font-lock-type-face)) ("\(.*\)" . font-lock-variable-name-face) ("[^a-zA-Z0-9_:]\\([0-9]*\\)[^a-zA-Z0-9_:]" . (1 font-lock-variable-name-face)) ("\s@\s" . font-lock-variable-name-face) ("\s\\([a-zA-Z0-9_:]*\\)\\(\s\\|$\\)" . (1 font-lock-type-face)) ("=\\([a-zA-Z_]*\\)" . (1 font-lock-string-face)) ("\\([a-zA-Z]*\\)=" . (1 font-lock-type-face)) ) "The regexps to highlight in openHAB mode.") (defvar openhab-mode-syntax-table (let ((st (make-syntax-table))) (modify-syntax-entry ?/ ". 12b" st) ;; C-style comments // ... (modify-syntax-entry ?\n "> b" st) ;; \n ends comment ;; Block comments /*...*/ (modify-syntax-entry ?\/ ". 14" st) (modify-syntax-entry ?* ". 23" st) st) "Syntax table for openhab-mode.") (defun openhab-mode () "Major mode for editing OPENHAB config files." (interactive) (kill-all-local-variables) (set-syntax-table openhab-mode-syntax-table) (use-local-map openhab-mode-map) (set (make-local-variable 'font-lock-defaults) '(openhab-font-lock-keywords nil t)) (electric-pair-mode -1) (flycheck-mode -1) (setq major-mode 'openhab-mode) (setq mode-name "OpenHAB") (run-hooks 'openhab-mode-hook)) (provide 'openhab-mode) #+END_SRC ** Custom Packages *** Hyperspace #+BEGIN_SRC emacs-lisp :results silent ;;; hyperspace.el --- Get there from here -*- lexical-binding: t; -*- ;; Copyright (C) 2017-2019 Ian Eure ;; Author: Ian Eure ;; URL: https://github.com/ieure/hyperspace-el ;; Version: 0.8.4 ;; Package-Requires: ((emacs "25") (s "1.12.0")) ;; Keywords: tools, convenience ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Commentary: ;; Hyperspace is a way to get nearly anywhere from wherever you are, ;; whether that's within Emacs or on the web. It's somewhere in ;; between Quicksilver and keyword URLs, giving you a single, ;; consistent interface to get directly where you want to go. It’s ;; for things that you use often, but not often enough to justify a ;; dedicated binding. ;; ;; When you enter Hyperspace, it prompts you where to go: ;; ;; HS: ;; ;; This prompt expects a keyword and a query. The keyword picks where ;; you want to go, and the remainder of the input is an optional ;; argument which can be used to further search or direct you within ;; that space. ;; ;; Some concrete examples: ;; ;; | *If you enter* | *then Hyperspace* | ;; |------------------+----------------------------------------------------------| ;; | "el" | opens info node "(elisp)Top" | ;; | "el eval-region" | searches for "eval-region" in the elisp Info index | ;; | "bb" | shows all BBDB entries | ;; | "bb kenneth" | shows all BBDB entries with a name matching "kenneth" | ;; | "ddg foo" | searches DuckDuckGo for "foo" using browse-url | ;; | "wp foo" | searches Wikipedia for "foo" using browse-url | ;; ;;; Code: (require 'subr-x) (require 's) ;; Action helpers (defun hyperspace-action->browse-url-pattern (pattern query) "Browse a URL former from PATTERN and QUERY." (browse-url (format pattern query))) (defun hyperspace-action->info (node &optional query) "Open an Info buffer for NODE. If QUERY is present, look it up in the index." (info node) (when query (Info-index query))) ;; Package definitions (defvar hyperspace-history nil "History of Hyperspace actions.") (defgroup hyperspace nil "Getting there from here" :prefix "hyperspace-" :group 'applications) (defcustom hyperspace-actions '(("ddg" . "https://duckduckgo.com/?q=%s") ("dis" . "https://duckduckgo.com/?q=%s&iax=images&ia=images") ("wp" . "https://en.wikipedia.org/wiki/%s") ("g" . "https://www.google.com/search?q=%s") ("gi" . "https://www.google.com/search?tbm=isch&q=%s") ("gm" . "https://www.google.com/maps/search/%s") ("yt" . "https://www.youtube.com/results?search_query=%s") ("clp" . "https://portland.craigslist.org/search/sss?query=%s") ("eb" . "https://www.ebay.com/sch/i.html?_nkw=%s") ("nf" . "https://www.netflix.com/search?q=%s") ("sh" . (lambda (query) (interactive) (shell-command query))) ("imdb" . "https://www.imdb.com/find?q=peter+jackson&s=all") ("bb" . bbdb-search-name) ("el" . (apply-partially #'hyperspace-action->info "(elisp)Top")) ("av" . apropos-variable) ("ac" . apropos-command) ("af" . (lambda (query) (apropos-command query t)))) "Where Hyperspace should send you. Hyperspace actions are a cons of (KEYWORD . DISPATCHER). When Hyperspace is invoked, the keyword is extracted from the user input and looked up in this alist. The remainder of the string is passed to the dispatcher as its QUERY argument. DISPATCHER can be a function which performs the action. DISPATCHER can also be an expression which returns a function to perform the action. Finally, DISPATCHER can be a string with a URL pattern containing '%s'. The '%s' will be replaced with the query, and the URL browsed." :group 'hyperspace :type '(alist :key-type (string :tag "Keyword") :value-type (choice (function :tag "Function") (string :tag "URL Pattern") (sexp :tag "Expression")))) (defcustom hyperspace-default-action (caar hyperspace-actions) "A place to go if you don't specify one." :group 'hyperspace :type `(radio ,@(mapcar (lambda (action) (list 'const (car action))) hyperspace-actions))) (defcustom hyperspace-max-region-size 256 "Maximum size of a region to consider for a Hyperspace query. If the region is active when Hyperspace is invoked, it's used as the default query, unless it's more than this number of characters." :group 'hyperspace :type 'integer) (defun hyperspace--cleanup (text) "Clean TEXT so it can be used for a Hyperspace query." (save-match-data (string-trim (replace-regexp-in-string (rx (1+ (or blank "\n"))) " " text)))) (defun hyperspace--initial-text () "Return the initial text. This is whatever's in the active region, but cleaned up." (when (use-region-p) (let* ((start (region-beginning)) (end (region-end)) (size (- end start))) (when (<= size hyperspace-max-region-size) (hyperspace--cleanup (buffer-substring-no-properties start end)))))) (defun hyperspace--initial (initial-text) "Turn INITIAL-TEXT into INITIAL-CONTENTS for reading." (when initial-text (cons (concat " " initial-text) 1))) (defun hyperspace--process-input (text) "Process TEXT into an actionable keyword and query." (let ((kw-text (s-split-up-to "\\s-+" text 1))) (if (assoc (car kw-text) hyperspace-actions) kw-text (list hyperspace-default-action text)))) (defun hyperspace--query () "Ask the user for the Hyperspace action and query. Returns (KEYWORD . QUERY). If the region isn't active, the user is prompted for the action and query. If the region is active, its text is used as the initial value for the query, and the user enters the action. If a prefix argument is specified and the region is active, `HYPERSPACE-DEFAULT-ACTION' is chosen without prompting." (let ((initial (hyperspace--initial-text))) (if (and initial current-prefix-arg) (list hyperspace-default-action initial) (hyperspace--process-input (read-from-minibuffer "HS: " (hyperspace--initial initial) nil nil 'hyperspace-history))))) (defun hyperspace--evalable-p (form) "Can FORM be evaluated?" (and (listp form) (or (functionp (car form)) (subrp (car form))))) (defun hyperspace--dispatch (action &optional query) "Execute ACTION, with optional QUERY argument." (pcase action ((pred functionp) (funcall action query)) ((pred hyperspace--evalable-p) (funcall (eval action) query)) ((pred stringp) (hyperspace-action->browse-url-pattern action query)) (_ (error "Unknown action")))) ;;;###autoload (defun hyperspace (keyword &optional query) "Execute action for keyword KEYWORD, with optional QUERY." (interactive (hyperspace--query)) (let ((action (cdr (assoc keyword hyperspace-actions)))) (hyperspace--dispatch (or action hyperspace-default-action) query))) ;;;###autoload (defun hyperspace-enter (&optional query) "Enter Hyperspace, sending QUERY to the default action. If the region is active, use that as the query for ‘hyperspace-default-action’. Otherwise, prompt the user." (interactive (list (hyperspace--initial-text))) (hyperspace hyperspace-default-action (or query (read-from-minibuffer (format "HS: %s " hyperspace-default-action) nil nil 'hyperspace-history)))) ;; Minor mode (defvar hyperspace-minor-mode-map (let ((kmap (make-sparse-keymap))) (define-key kmap (kbd "H-SPC") #'hyperspace) (define-key kmap (kbd "") #'hyperspace-enter) kmap)) ;;;###autoload (define-minor-mode hyperspace-minor-mode "Global (universal) minor mode to jump from here to there." nil nil hyperspace-minor-mode-map :group 'hyperspace :global t) (provide 'hyperspace) ;;; hyperspace.el ends here #+END_SRC ** Tools *** General #+BEGIN_SRC emacs-lisp :results silent (require 'which-key) (which-key-setup-minibuffer) (which-key-mode) (require 'fic-mode) (add-hook 'js-mode-hook 'fic-mode) #+END_SRC *** Company #+BEGIN_SRC emacs-lisp :results silent (require 'company) (add-hook 'after-init-hook 'global-company-mode) (setq company-dabbrev-downcase nil) (setq company-idle-delay 0.1) #+END_SRC *** Diminish #+BEGIN_SRC emacs-lisp :results silent (require 'diminish) (diminish 'auto-revert-mode) (eval-after-load "company" '(diminish 'company-mode)) (eval-after-load "counsel" '(diminish 'counsel-mode)) (eval-after-load "elpy" '(diminish 'elpy-mode)) (eval-after-load "go-mode" '(diminish 'go-mode)) (eval-after-load "go-playground" '(diminish 'go-playground-mode)) (eval-after-load "gorepl-mode" '(diminish 'gorepl-mode)) (eval-after-load "flycheck" '(diminish 'flycheck-mode)) (eval-after-load "ivy" '(diminish 'ivy-mode)) (eval-after-load "projectile" '(diminish 'projectile-mode)) (eval-after-load "which-key" '(diminish 'which-key-mode)) #+END_SRC *** Dired #+BEGIN_SRC emacs-lisp :results silent (defun dired-mode-setup () "Will run as hook for `dired-mode'." (dired-hide-details-mode nil)) (add-hook 'dired-mode-hook 'dired-mode-setup) #+END_SRC *** Excorporate #+BEGIN_SRC emacs-lisp :results silent :tangle no ;;; ;;; Configuration for our Exchange server ;;; (setq-default excorporate-configuration '("lolson@eaglecrk.com" . "https://outlook.office365.com/EWS/Exchange.asmx") org-agenda-include-diary t) ;;; ;;; Make sure that Emacs diary knows how to follow `#include "..."' ;;; directives (needed by excorporate) ;;; (add-hook 'diary-mark-entries-hook 'diary-mark-included-diary-files) ;;; ;;; Create a hook function to pull down Exchange meetings and ;;; update my Emacs diary whenever org-agenda merges diary into ;;; agenda. ;;; (defun my/agenda-update-diary () "Update exchange diary." (interactive) (exco-diary-diary-advice (calendar-current-date) (calendar-current-date) #'message "Diary updated")) (add-hook 'org-agenda-cleanup-fancy-diary-hook 'my/agenda-update-diary) ;;; ;;; Finally, turn on excorporate and enable excorporate-diary ;;; (excorporate) (excorporate-diary-enable) #+END_SRC *** Ivy and Amx #+BEGIN_SRC emacs-lisp :results silent (require 'ivy-hydra) (require 'ivy) (require 'swiper) (ivy-mode 1) (counsel-mode) (setq ivy-use-virtual-buffers t enable-recursive-minibuffers t ivy-height 25 ivy-initial-inputs-alist nil ivy-extra-directories nil) (global-set-key (kbd "C-s") 'swiper) (global-set-key (kbd "C-c C-r") 'ivy-resume) (global-set-key (kbd "M-x") 'counsel-M-x) (global-set-key (kbd "C-x C-f") 'counsel-find-file) (global-set-key (kbd "C-c g") 'counsel-git) (global-set-key (kbd "C-c j") 'counsel-git-grep) (global-set-key (kbd "C-c k") 'counsel-ag) (define-key minibuffer-local-map (kbd "C-r") 'counsel-minibuffer-history) (defun ivy-open-current-typed-path () (interactive) (when ivy--directory (let* ((dir ivy--directory) (text-typed ivy-text) (path (concat dir text-typed))) (delete-minibuffer-contents) (ivy--done path)))) (define-key ivy-minibuffer-map (kbd "") 'ivy-alt-done) (define-key ivy-minibuffer-map (kbd "C-f") 'ivy-open-current-typed-path) #+END_SRC *** Magit #+BEGIN_SRC emacs-lisp :results silent (require 'magit) (global-set-key (kbd "C-x g") 'magit-status) (global-set-key (kbd "C-c g") 'magit-status) (setq magit-completing-read-function 'ivy-completing-read) #+END_SRC *** Markdown #+BEGIN_SRC emacs-lisp :results silent (add-to-list 'exec-path "/home/locust/.local/bin") #+END_SRC *** Mu4e #+BEGIN_SRC emacs-lisp :results silent (add-to-list 'load-path "/usr/local/share/emacs/site-lisp/mu/mu4e") (require 'mu4e) (setq mu4e-maildir "~/Mail" mu4e-mu-binary "/usr/local/bin/mu" mu4e-change-filenames-when-moving t ;; Rename files when moving (required by mbsync) mu4e-compose-in-new-frame t ;; New compose gets new frame mu4e-context-policy 'pick-first mu4e-get-mail-command "mbsync -a" ;; MBSYNC is the mail cmd mu4e-html2text-command "/usr/local/bin/w3m -T text/html" ;; HTML to text command mu4e-headers-include-related nil ;; Stop threading in INBOX mu4e-sent-messages-behavior 'delete ;; Delete sent messages mu4e-update-interval 300 ;; 5 mins mu4e-use-fancy-chars t ;; use 'fancy' chars mu4e-user-mail-address-list '("lolson@eaglecrk.com" "lolson@vlocity.com" "olson.levi@gmail.com") mu4e-view-show-images t ;; attempt to show images mu4e-view-image-max-width 400 ;; max image size message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n" ;; customize the reply-quote-string message-citation-line-function 'message-insert-formatted-citation-line ;; choose to use the formatted string message-kill-buffer-on-exit t ;; don't keep messages around send-mail-function 'smtpmail-send-it ;; Default email send function smtpmail-default-smtp-server "smtp.gmail.com" smtpmail-smtp-service 587 ) ;; (defun leo/convert-message-set-point () ;; "Set the point to the start of the message body." ;; (interactive) ;; (beginning-of-buffer) ;; (search-forward "--text follows this line--") ;; (forward-char) ;; ) ;; (defun leo/convert-message-from-markdown () ;; "Convert a markdown flavored mail buffer to html w/mime support." ;; (interactive) ;; (if (y-or-n-p "Convert to HTML? ") ;; ((leo/convert-message-set-point) ;; (save-excursion ;; (message-goto-body) ;; (shell-command-on-region (point) (point-max) "~/.emacs.d/scripts/expand-mime.sh" nil t))) ;; (message "Aborting.")) ;; ) (setq mu4e-contexts `( ;; ,(make-mu4e-context ;; :name "Vlocity" ;; :enter-func (lambda () (mu4e-message "Entering Vlocity")) ;; :leave-func (lambda () (mu4e-message "Leaving Vlocity")) ;; ;; we match based on the contact-fields of the message ;; :match-func (lambda (msg) ;; (when msg ;; (string= (mu4e-message-field msg :maildir) "/Vlocity"))) ;; :vars '( ( user-mail-address . "lolson@vlocity.com" ) ;; ( smtpmail-mail-address . "lolson@vlocity.com" ) ;; ( smtpmail-smtp-user . "lolson@vlocity.com" ) ;; ( smtpmail-smtp-server . "smtp.gmail.com" ) ;; ( user-full-name . "Levi Olson" ) ;; ( mu4e-compose-signature . ;; (concat ;; "Levi Olson\n" ;; "Senior UI Developer")) ;; ( mu4e-sent-folder . "/Vlocity/[Gmail].Sent Mail" ) ;; ( mu4e-drafts-folder . "/Vlocity/[Gmail].Drafts" ) ;; ( mu4e-trash-folder . "/Vlocity/[Gmail].Trash" ) ;; ( mu4e-maildir-shortcuts . (("/Vlocity/INBOX" . ?i) ;; ("/Vlocity/[Gmail].Sent Mail" . ?s) ;; ("/Vlocity/[Gmail].Trash" . ?t) ;; ("/Vlocity/[Gmail].All Mail" . ?a))))) ,(make-mu4e-context :name "EagleCreek" :enter-func (lambda () (mu4e-message "Entering EagleCreek")) :leave-func (lambda () (mu4e-message "Leaving EagleCreek")) ;; we match based on the contact-fields of the message :match-func (lambda (msg) (when msg (string= (mu4e-message-field msg :maildir) "/eaglecrk"))) :vars '( ( user-mail-address . "lolson@eaglecrk.com" ) ( smtpmail-mail-address . "lolson@eaglecrk.com" ) ( smtpmail-smtp-user . "lolson@eaglecrk.com" ) ( smtpmail-smtp-server . "smtp.office365.com" ) ( user-full-name . "Levi Olson" ) ;; ( mu4e-compose-signature . ;; (concat ;; "Levi Olson\n" ;; "Eagle Creek Software Services\n" ;; "Senior Application Developer Consultant\n")) ( mu4e-sent-folder . "/eaglecrk/Sent Items" ) ( mu4e-drafts-folder . "/eaglecrk/Drafts" ) ( mu4e-trash-folder . "/eaglecrk/Deleted Items" ) ( mu4e-maildir-shortcuts . (("/eaglecrk/Inbox" . ?i) ("/eaglecrk/Sent Items" . ?s) ("/eaglecrk/Deleted Items" . ?t) ("/eaglecrk/Archive" . ?a))))) ;; ,(make-mu4e-context ;; :name "Gmail" ;; :enter-func (lambda () (mu4e-message "Entering Gmail")) ;; :leave-func (lambda () (mu4e-message "Leaving Gmail")) ;; ;; this matches maildir /Arkham and its sub-directories ;; :match-func (lambda (msg) ;; (when msg ;; (string= (mu4e-message-field msg :maildir) "/Gmail"))) ;; :vars '( ( user-mail-address . "olson.levi@gmail.com" ) ;; ( smtpmail-mail-address . "olson.levi@gmail.com" ) ;; ( smtpmail-smtp-user . "olson.levi@gmail.com" ) ;; ( smtpmail-smtp-server . "smtp.gmail.com" ) ;; ( user-full-name . "Levi Olson" ) ;; ( mu4e-compose-signature . ;; (concat ;; "Levi\n")) ;; ( mu4e-sent-folder . "/Gmail/[Gmail].Sent Mail" ) ;; ( mu4e-drafts-folder . "/Gmail/[Gmail].Drafts" ) ;; ( mu4e-trash-folder . "/Gmail/[Gmail].Trash" ) ;; ( mu4e-maildir-shortcuts . (("/Gmail/INBOX" . ?i) ;; ("/Gmail/[Gmail].Sent Mail" . ?s) ;; ("/Gmail/[Gmail].Trash" . ?t) ;; ("/Gmail/[Gmail].All Mail" . ?a)) ;; ))) )) ;; Add option to view HTML in browser (add-to-list 'mu4e-headers-actions '("in browser" . mu4e-action-view-in-browser) t) (add-to-list 'mu4e-view-actions '("in browser" . mu4e-action-view-in-browser) t) (defun my-message-current-line-cited-p () "Indicate whether the line at point is a cited line." (save-match-data (string-match (concat "^" message-cite-prefix-regexp) (buffer-substring (line-beginning-position) (line-end-position))))) (defun my-message-says-attachment-p () "Return t if the message suggests there can be an attachment." (save-excursion (goto-char (point-min)) (save-match-data (let (search-result) (while (and (setq search-result (re-search-forward "\\(attach\\|pdf\\|file\\)" nil t)) (my-message-current-line-cited-p))) search-result)))) (defun my-message-has-attachment-p () "Return t if the message has an attachment." (save-excursion (goto-char (point-min)) (save-match-data (re-search-forward "<#part" nil t)))) (defun my-message-pre-send-check-attachment () (when (and (my-message-says-attachment-p) (not (my-message-has-attachment-p))) (unless (y-or-n-p "No attachment. Send anyway?") (error "It seems that an attachment is needed, but none was found. Aborting sending.")))) (add-hook 'message-send-hook 'my-message-pre-send-check-attachment) #+END_SRC *** Projectile #+BEGIN_SRC emacs-lisp :results silent (require 'projectile) (require 'counsel-projectile) (projectile-mode) (setq projectile-mode-line '(:eval (format " %s" (projectile-project-name))) projectile-remember-window-configs t projectile-completion-system 'ivy) (counsel-projectile-mode) #+END_SRC *** Poporg Edit comments in a separate window #+BEGIN_SRC emacs-lisp :results silent (autoload 'poporg-dwim "poporg" nil t) (global-set-key (kbd "C-c \"") 'poporg-dwim) #+END_SRC *** Notify #+BEGIN_SRC emacs-lisp :results silent ;;; notify.el --- notification front-end ;; Copyright (C) 2008 Mark A. Hershberger ;; Original Author: Mark A. Hershberger ;; Modified by Andrey Kotlarski ;; Modified by Andrew Gwozdziewycz ;; Modified by Aidan Gauland October 2011 ;; Modified by Olivier Sirven November 2013 ;; Keywords: extensions, convenience, lisp ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;; Commentary: ;; This provides a single function, `notify', that will produce a notify ;; pop-up via D-Bus, libnotify, simple message or growl. ;; To use, just put (autoload 'notify "notify" "Notify TITLE, BODY.") ;; in your init file. You may override default chosen notification ;; method by assigning `notify-method' to one of 'notify-via-dbus ;; 'notify-via-libnotify or 'notify-via-message ;;; Code: (defvar notify-defaults (list :app "Emacs" :icon "emacs" :timeout 5000 :urgency "low" :category "emacs.message") "Notification settings' defaults. May be overridden with key-value additional arguments to `notify'.") (defvar notify-delay '(0 5 0) "Minimum time allowed between notifications in time format.") (defvar notify-last-notification '(0 0 0) "Time of last notification.") (defvar notify-method 'notify-via-growl "Notification method among 'notify-via-dbus, 'notify-via-libnotify, 'notify-via-message or 'notify-via-growl") ;; determine notification method unless already set ;; prefer growl > D-Bus > libnotify > message (cond ((null notify-method) (setq notify-method (cond ((executable-find "growlnotify") 'notify-via-growl) ((and (require 'dbus nil t) (dbus-ping :session "org.freedesktop.Notifications")) (defvar notify-id 0 "Current D-Bus notification id.") 'notify-via-dbus) ((executable-find "notify-send") 'notify-via-libnotify) (t 'notify-via-message)))) ((eq notify-method 'notify-via-dbus) ;housekeeping for pre-chosen DBus (if (and (require 'dbus nil t) (dbus-ping :session "org.freedesktop.Notifications")) (defvar notify-id 0 "Current D-Bus notification id.") (setq notify-method (if (executable-find "notify-send") 'notify-via-libnotify 'notify-via-message)))) ((and (eq notify-method 'notify-via-libnotify) (not (executable-find "notify-send"))) ;housekeeping for pre-chosen libnotify (setq notify-method (if (and (require 'dbus nil t) (dbus-ping :session "org.freedesktop.Notifications")) (progn (defvar notify-id 0 "Current D-Bus notification id.") 'notify-via-dbus) 'notify-via-message))) ((and (eq notify-method 'notify-via-growl) (not (executable-find "growlnotify"))) (setq notify-method 'notify-via-message))) (defun notify-via-dbus (title body) "Send notification with TITLE, BODY `D-Bus'." (dbus-call-method :session "org.freedesktop.Notifications" "/org/freedesktop/Notifications" "org.freedesktop.Notifications" "Notify" (get 'notify-defaults :app) (setq notify-id (+ notify-id 1)) (get 'notify-defaults :icon) title body '(:array) '(:array :signature "{sv}") ':int32 (get 'notify-defaults :timeout))) (defun notify-via-libnotify (title body) "Notify with TITLE, BODY via `libnotify'." (call-process "notify-send" nil 0 nil title body "-t" (number-to-string (get 'notify-defaults :timeout)) "-i" (get 'notify-defaults :icon) "-u" (get 'notify-defaults :urgency) "-c" (get 'notify-defaults :category))) (defun notify-via-message (title body) "Notify TITLE, BODY with a simple message." (message "%s: %s" title body)) (defun notify-via-growl (title body) "Notify TITLE, BODY with a growl" (call-process "growlnotify" nil 0 nil "-a" (get 'notify-defaults :app) "-n" (get 'notify-defaults :category) "-t" (notify-via-growl-stringify title) "-m" (notify-via-growl-stringify body))) (defun notify-via-growl-stringify (thing) (cond ((null thing) "") ((stringp thing) thing) (t (format "%s" thing)))) (defun keywords-to-properties (symbol args &optional defaults) "Add to SYMBOL's property list key-values from ARGS and DEFAULTS." (when (consp defaults) (keywords-to-properties symbol defaults)) (while args (put symbol (car args) (cadr args)) (setq args (cddr args)))) ;;;###autoload (defun notify (title body &rest args) "Notify TITLE, BODY via `notify-method'. ARGS may be amongst :timeout, :icon, :urgency, :app and :category." (when (time-less-p notify-delay (time-since notify-last-notification)) (or (eq notify-method 'notify-via-message) (keywords-to-properties 'notify-defaults args notify-defaults)) (setq notify-last-notification (current-time)) (funcall notify-method title body))) (provide 'notify) ;;; notify.el ends here #+END_SRC *** Jabber #+BEGIN_SRC emacs-lisp :results silent (require 'jabber) (setq jabber-history-enabled t jabber-use-global-history nil jabber-backlog-number 40 jabber-backlog-days 30 jabber-alert-presence-message-function (lambda (_who _oldstatus _newstatus _statustext) nil) ) (setq jabber-account-list '( ("olson.levi@gmail.com" (:network-server . "talk.google.com") (:connection-type . ssl)) ;; ("lolson@vlocity.com" ;; (:network-server . "talk.google.com") ;; (:connection-type . ssl)) )) (defvar my-chat-prompt "[%t] %n>\n" "Customized chat prompt") (when (featurep 'jabber) (setq jabber-chat-foreign-prompt-format my-chat-prompt jabber-chat-local-prompt-format my-chat-prompt jabber-groupchat-prompt-format my-chat-prompt jabber-muc-private-foreign-prompt-format "[%t] %g/%n>\n" ) ) (defun notify-jabber-notify (from buf text _proposed-alert) "(jabber.el hook) Notify of new Jabber chat messages via notify.el" (when (or jabber-message-alert-same-buffer (not (memq (selected-window) (get-buffer-window-list buf)))) (if (jabber-muc-sender-p from) (notify (format "(PM) %s" (jabber-jid-displayname (jabber-jid-user from))) (format "%s: %s" (jabber-jid-resource from) text))) (notify (format "%s" (jabber-jid-displayname from)) text))) ;; (add-hook 'jabber-alert-message-hooks 'notify-jabber-notify) ;; (require 'autosmiley) ;; (add-hook 'jabber-chat-mode-hook 'autosmiley-mode) (defun jabber () (interactive) (jabber-connect-all) (switch-to-buffer "*-jabber-roster-*")) #+END_SRC *** Terminal-Notifier #+BEGIN_SRC emacs-lisp :results silent :tangle no ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Terminal notifier ;; requires 'brew install terminal-notifier' ;; stolen from erc-notifier (defvar terminal-notifier-command (executable-find "terminal-notifier") "The path to terminal-notifier.") ; (terminal-notifier-notify "Emacs notification" "Something amusing happened") (defun terminal-notifier-notify (title message) "Show a message with terminal-notifier-command ." (start-process "terminal-notifier" "terminal-notifier" terminal-notifier-command "-title" title "-message" message "-activate" "org.gnu.Emacs")) (defun timed-notification (time msg) (interactive "sNotification when (e.g: 2 minutes, 60 seconds, 3 days): \nsMessage: ") (run-at-time time nil (lambda (msg) (terminal-notifier-notify "Emacs" msg)) msg)) #+END_SRC *** Hyperspace #+BEGIN_SRC emacs-lisp :results silent (defun hyperspace-action->mu4e (&optional query) "Search mu4e with QUERY. If QUERY is unspecified, use the first bookmark in variable ‘mu4e-bookmarks’ and update mail and index." (mu4e-headers-search (or query (caar mu4e-bookmarks))) (unless query (mu4e-update-mail-and-index nil))) (add-to-list 'hyperspace-actions '("m4" . hyperspace-action->mu4e)) (defun hyperspace-action->elfeed (&optional query) "Load elfeed, optionally searching for QUERY." (elfeed) (if query (elfeed-search-set-filter query) (elfeed-search-fetch nil))) (add-to-list 'hyperspace-actions '("lf" . hyperspace-action->elfeed)) #+END_SRC ** Functions #+BEGIN_SRC emacs-lisp :results silent (defun find-user-init-file () "Edit the `~/.emacs.d/init.org' file." (interactive) (find-file "~/.emacs.d/init.org")) (defun find-todo-file () "Edit the `~/todo.org' file." (interactive) (find-file "~/Dropbox/Org/todo.org")) (defun load-user-init-file () "LO: Reload the `~/.emacs.d/init.elc' file." (interactive) (load-file "~/.emacs.d/init.elc")) (defun leo-swiper () "LO: Custom swiper." (interactive) (let ((word (thing-at-point 'symbol))) (if word (swiper (format "%s" word))) (unless word (swiper (format "")))) ) (defun jump-to-symbol-internal (&optional backwardp) "Jumps to the next symbol near the point if such a symbol exists. If BACKWARDP is non-nil it jumps backward." (let* ((point (point)) (bounds (find-tag-default-bounds)) (beg (car bounds)) (end (cdr bounds)) (str (isearch-symbol-regexp (find-tag-default))) (search (if backwardp 'search-backward-regexp 'search-forward-regexp))) (goto-char (if backwardp beg end)) (funcall search str nil t) (cond ((<= beg (point) end) (goto-char point)) (backwardp (forward-char (- point beg))) (t (backward-char (- end point)))))) (defun jump-to-previous-like-this () "Jumps to the previous occurrence of the symbol at point." (interactive) (jump-to-symbol-internal t)) (defun jump-to-next-like-this () "Jumps to the next occurrence of the symbol at point." (interactive) (jump-to-symbol-internal)) (defun match-paren (arg) "Go to the matching paren if on a paren; otherwise insert ARG (a literal % sign)." (interactive "p") (cond ((looking-at "\\s(") (forward-list 1)) ((looking-back "\\s(" 2) (backward-char 1) (forward-list 1)) ((looking-at "\\s)") (forward-char 1) (backward-list 1)) ((looking-back "\\s)" 2) (backward-list 1)) (t (self-insert-command (or arg 1))))) (defun kill-this-buffer-unless-scratch () "Works like `kill-this-buffer' unless the current buffer is the *scratch* buffer. In which case the buffer content is deleted and the buffer is buried." (interactive) (if (not (string= (buffer-name) "*scratch*")) (kill-this-buffer) (delete-region (point-min) (point-max)) (switch-to-buffer (other-buffer)) (bury-buffer "*scratch*"))) (defun delete-backward-sentence () "LO: Delete to the beginning of the sentence/line." (interactive) (delete-region (point) (progn (backward-sentence) (point)))) (defun delete-backward-to-boundary (arg) "LO: Delete backward to the previous word boundary. With ARG, do this many times." (interactive "p") (let ((a (point)) (b (progn (backward-word arg) (forward-word) (point)))) (if (< a b) (delete-region a (progn (backward-word arg) (point))) (if (= a b) (delete-region a (progn (backward-word arg) (point))) (delete-region a b))))) (defun comment-or-uncomment-region-or-line () "Comments or uncomments the region or the current line if there's no active region." (interactive) (let (beg end) (if (region-active-p) (setq beg (region-beginning) end (region-end)) (setq beg (line-beginning-position) end (line-end-position))) (comment-or-uncomment-region beg end))) (defun fold-toggle (column) "Code folding by COLUMN." (interactive "P") (set-selective-display (or column (unless selective-display (1+ (current-column)))))) (defun new-line-below () "LO: Create a new line below current line." (interactive) (move-end-of-line 1) (newline-and-indent)) (defun new-line-above () "LO: Create a new line above current line." (interactive) (move-beginning-of-line 1) (newline) (forward-line -1)) (defun duplicate-thing (comment) "LO: Duplicates the current line, or the region if active. If an argument (COMMENT) is given, the duplicated region will be commented out." (interactive "P") (save-excursion (let ((start (if (region-active-p) (region-beginning) (point-at-bol))) (end (if (region-active-p) (region-end) (point-at-eol)))) (goto-char end) (unless (region-active-p) (newline)) (insert (buffer-substring start end)) (when comment (comment-region start end))))) (defun tidy () "LO: Ident, untabify and unwhitespacify current buffer, or region if active." (interactive) (let ((beg (if (region-active-p) (region-beginning) (point-min))) (end (if (region-active-p) (region-end) (point-max)))) (let ((inhibit-message t)) (indent-region beg end)) (whitespace-cleanup) (untabify beg (if (< end (point-max)) end (point-max))) (if (region-active-p) (message "Indenting Region...Done") (message "Indenting File...Done")))) (defun phil-columns () "LO: Good 'ol Phil-Columns." (interactive) (message "Good 'ol fill-columns") (with-output-to-temp-buffer "*PHIL-COLUMN*" (shell-command "mpv --no-video 'https://www.youtube.com/watch?v=YkADj0TPrJA&t=3m16s' > /dev/null 2>&1 & sleep 8; pkill mpv")) (other-window 1) (delete-window)) (declare-function first "Goto FIRST shell.") (declare-function goto-non-shell-buffer "Goto something other than a shell buffer.") (declare-function switch-shell "Switch shell.") (let ((last-shell "")) (defun toggle-shell () (interactive) (cond ((string-match-p "^\\*shell<[1-9][0-9]*>\\*$" (buffer-name)) (goto-non-shell-buffer)) ((get-buffer last-shell) (switch-to-buffer last-shell)) (t (shell (setq last-shell "*shell<1>*"))))) (defun switch-shell (n) (let ((buffer-name (format "*shell<%d>*" n))) (setq last-shell buffer-name) (cond ((get-buffer buffer-name) (switch-to-buffer buffer-name)) (t (shell buffer-name) (rename-buffer buffer-name))))) (defun goto-non-shell-buffer () (let* ((r "^\\*shell<[1-9][0-9]*>\\*$") (shell-buffer-p (lambda (b) (string-match-p r (buffer-name b)))) (non-shells (cl-remove-if shell-buffer-p (buffer-list)))) (when non-shells (switch-to-buffer (first non-shells)))))) (defadvice shell (after kill-with-no-query nil activate) "." (set-process-query-on-exit-flag (get-buffer-process ad-return-value) nil)) (declare-function comint-truncate-buffer ".") (defun clear-comint () "Run `comint-truncate-buffer' with the `comint-buffer-maximum-size' set to zero." (interactive) (let ((comint-buffer-maximum-size 0)) (comint-truncate-buffer))) (defun c-setup () "Compile." (local-set-key (kbd "C-c C-c") 'compile)) #+END_SRC ** Bindings #+begin_src emacs-lisp :results silent (require 'company) (add-hook 'comint-mode-hook (lambda () (local-set-key (kbd "c-l") 'clear-comint))) (add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode) (add-hook 'lisp-interaction-mode-hook 'turn-on-eldoc-mode) (add-hook 'c-mode-common-hook 'c-setup) (add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-mode)) (defvar company-active-map (make-keymap) "company mode keymap.") (defvar custom-bindings (make-keymap) "a keymap of custom bindings.") (define-key custom-bindings (kbd "M-p") 'jump-to-previous-like-this) (define-key custom-bindings (kbd "M-n") 'jump-to-next-like-this) (define-key custom-bindings (kbd "M-") 'switch-to-next-buffer) (define-key custom-bindings (kbd "M-")'delete-backward-to-boundary) (define-key custom-bindings (kbd "C-")'delete-backward-to-boundary) (define-key custom-bindings (kbd "C-}") 'mc/mark-next-like-this) (define-key custom-bindings (kbd "C-)") 'mc/unmark-next-like-this) (define-key custom-bindings (kbd "C-{") 'mc/mark-previous-like-this) (define-key custom-bindings (kbd "C-(") 'mc/unmark-previous-like-this) (define-key custom-bindings (kbd "C-'") 'mc-hide-unmatched-lines-mode) (define-key custom-bindings (kbd "C-c 1") 'mc/insert-numbers) (define-key custom-bindings (kbd "C-c s") 'mc/sort-regions) (define-key custom-bindings "%" 'match-paren) (define-key custom-bindings (kbd "C-x .") 'dash-at-point) (define-key custom-bindings (kbd "C-x ,") 'dash-at-point-with-docset) (define-key custom-bindings (kbd "C-s") 'leo-swiper) (define-key custom-bindings (kbd "C-x C-l m") 'mu4e) (define-key custom-bindings (kbd "C-x C-o t") 'find-todo-file) (define-key custom-bindings (kbd "C-x C-l j") 'jabber) (define-key custom-bindings (kbd "C-x C-l f") 'elfeed) (define-key custom-bindings (kbd "C-x C-l a") 'org-agenda) (define-key custom-bindings (kbd "C-x C-l c") 'calendar) (define-key custom-bindings (kbd "M-SPC") #'hyperspace) ;; (dolist (n (number-sequence 1 9)) ;; (global-set-key (kbd (concat "M-" (int-to-string n))) ;; (lambda () (interactive) (switch-shell n)))) (define-key company-active-map (kbd "C-d") 'company-show-doc-buffer) (define-key company-active-map (kbd "C-n") 'company-select-next) (define-key company-active-map (kbd "C-p") 'company-select-previous) (define-key company-active-map (kbd "") 'company-complete) (define-key custom-bindings (kbd "C-c p") 'counsel-projectile-switch-project) (define-key custom-bindings (kbd "C-c f") 'counsel-projectile-find-file) (define-key custom-bindings (kbd "C-c c") 'ivy-resume) (define-key custom-bindings (kbd "C-c m") 'magit-status) (define-key custom-bindings (kbd "C-c D") 'define-word-at-point) (define-key custom-bindings (kbd "C-@") 'er/expand-region) (define-key custom-bindings (kbd "C-#") 'er/contract-region) (define-key custom-bindings (kbd "C-S-c C-S-c") 'mc/edit-lines) (define-key custom-bindings (kbd "C-c b") 'ivy-switch-buffer) (define-key custom-bindings (kbd "C-c l") 'org-store-link) (define-key custom-bindings (kbd "C-c t") 'org-set-tags) (define-key custom-bindings (kbd "M-u") 'upcase-dwim) (define-key custom-bindings (kbd "M-c") 'capitalize-dwim) (define-key custom-bindings (kbd "M-l") 'downcase-dwim) (define-key custom-bindings (kbd "M-o") 'other-window) (define-key custom-bindings (kbd "C-c s") 'ispell-word) (define-key custom-bindings (kbd "C-c C-d") 'org-capture) (define-key custom-bindings (kbd "C-c ") 'windmove-up) (define-key custom-bindings (kbd "C-c ") 'windmove-down) (define-key custom-bindings (kbd "C-c ") 'windmove-left) (define-key custom-bindings (kbd "C-c ") 'windmove-right) (define-key custom-bindings (kbd "C-c a") (lambda () (interactive) (org-agenda nil "n"))) (define-key custom-bindings (kbd "C-c e") 'find-user-init-file) (define-key custom-bindings (kbd "C-x f") 'phil-columns) (define-key custom-bindings (kbd "C-x k") 'kill-this-buffer-unless-scratch) (define-key custom-bindings (kbd "C-c d") 'duplicate-thing) (define-key custom-bindings (kbd "C-;") 'comment-or-uncomment-region-or-line) (define-key custom-bindings (kbd "C-o") 'new-line-below) (define-key custom-bindings (kbd "C-S-o") 'new-line-above) (define-key custom-bindings (kbd "") 'tidy) (define-key custom-bindings (kbd "M-q") 'kill-this-buffer) ;; (define-key custom-bindings (kbd "M-RET") '(lambda () (interactive) (term (getenv "SHELL")))) (define-minor-mode custom-bindings-mode "A mode that activates custom-bindings." t nil custom-bindings) #+END_SRC ** Development Specific *** General #+BEGIN_SRC emacs-lisp :results silent (require 'rainbow-delimiters) (global-flycheck-mode) (add-hook 'before-save-hook 'delete-trailing-whitespace) (add-hook 'prog-mode-hook 'rainbow-delimiters-mode) (setq-default indent-tabs-mode nil tab-width 4) (defvaralias 'c-basic-offset 'tab-width) (defvaralias 'cperl-indent-level 'tab-width) (electric-pair-mode 1) (show-paren-mode 1) (require 'dockerfile-mode) (add-to-list 'auto-mode-alist '("Dockerfile*\\'" . dockerfile-mode)) (require 'gitignore-mode) (add-to-list 'auto-mode-alist '("gitignore\\'" . gitignore-mode)) ;; Workaround to get Projectile to work again (setq projectile-git-submodule-command nil) (require 'json-mode) (add-to-list 'auto-mode-alist '("\\.json\\'" . json-mode)) (require 'web-mode) (add-to-list 'auto-mode-alist '("\\.html\\'" . web-mode)) #+END_SRC *** Python #+BEGIN_SRC emacs-lisp :results silent (elpy-enable) (setq python-shell-interpreter "jupyter" python-shell-interpreter-args "console --simple-prompt") (when (require 'flycheck nil t) (setq elpy-modules (delq 'elpy-module-flymake elpy-modules)) (add-hook 'elpy-mode-hook 'flycheck-mode)) (require 'py-autopep8) (setq py-autopep8-options '("--ignore=E501")) (add-hook 'elpy-mode-hook 'py-autopep8-enable-on-save) #+END_SRC *** Go #+BEGIN_SRC emacs-lisp :results silent (require 'go-mode) (require 'go-playground) (require 'gorepl-mode) (require 'company-go) (add-to-list 'auto-mode-alist '("\\.go\\'" . go-mode)) (add-hook 'go-mode-hook (lambda () (add-hook 'before-save-hook 'gofmt-before-save) (local-set-key (kbd "M-.") 'godef-jump) (local-set-key (kbd "M-,") 'pop-tag-mark) (local-set-key (kbd "C-c C-c") (lambda () (interactive) (ansi-term) (comint-send-string "*ansi-term*" "make\n"))) (set (make-local-variable 'company-backends) '(company-go)) (setq company-tooltip-limit 20 company-echo-delay 0 company-begin-commands '(self-insert-command)) (gorepl-mode))) (defun set-exec-path-from-shell-PATH () (let ((path-from-shell (replace-regexp-in-string "[ \t\n]*$" "" (shell-command-to-string "$SHELL --login -i -c 'echo $PATH'")))) (setenv "PATH" path-from-shell) (setq eshell-path-env path-from-shell) (setq exec-path (split-string path-from-shell path-separator)))) (when window-system (set-exec-path-from-shell-PATH)) (setenv "GOPATH" "/home/locust/go") (add-to-list 'exec-path "/home/locust/go/bin") #+END_SRC *** JS **** Indium #+BEGIN_SRC emacs-lisp :results silent (add-to-list 'exec-path "/usr/local/bin") #+END_SRC *** TypeScript #+BEGIN_SRC emacs-lisp :results silent (defun setup-tide-mode () "Tide setup function." (interactive) (tide-setup) (flycheck-mode +1) (setq flycheck-check-syntax-automatically '(save mode-enabled)) (eldoc-mode +1) (tide-hl-identifier-mode +1) (company-mode +1)) ;; aligns annotation to the right hand side (setq company-tooltip-align-annotations t) ;; formats the buffer before saving (add-hook 'before-save-hook 'tide-format-before-save) (add-hook 'typescript-mode-hook #'setup-tide-mode) (require 'typescript-mode) (require 'tide) (add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode)) (add-hook 'typescript-mode-hook '(lambda () (set (make-local-variable 'company-backends) '(company-tide)) (setq company-tooltip-limit 20 company-echo-delay 0 company-begin-commands '(self-insert-command) tide-format-options '(:insertSpaceAfterFunctionKeywordForAnonymousFunctions t :placeOpenBraceOnNewLineForFunctions nil)) (tide-setup))) #+END_SRC **** TSX #+BEGIN_SRC emacs-lisp :results silent (require 'web-mode) (add-to-list 'auto-mode-alist '("\\.tsx\\'" . web-mode)) (add-hook 'web-mode-hook (lambda () (when (string-equal "tsx" (file-name-extension buffer-file-name)) (setup-tide-mode)))) ;; enable typescript-tslint checker (flycheck-add-mode 'typescript-tslint 'web-mode) #+END_SRC **** JSX #+BEGIN_SRC emacs-lisp :results silent (require 'web-mode) (add-to-list 'auto-mode-alist '("\\.jsx\\'" . web-mode)) (add-hook 'web-mode-hook (lambda () (when (string-equal "jsx" (file-name-extension buffer-file-name)) (setup-tide-mode)))) ;; configure jsx-tide checker to run after your default jsx checker (flycheck-add-mode 'javascript-eslint 'web-mode) (flycheck-add-next-checker 'javascript-eslint 'jsx-tide 'append) #+END_SRC *** Org #+BEGIN_SRC emacs-lisp :results silent (org-babel-do-load-languages 'org-babel-load-languages '((js . t) (shell . t) (emacs-lisp . t))) (setq org-todo-keywords '((sequence "TODO(t)" "|" "DONE(d)") (sequence "BUG(b)" "|" "INPROGRESS(i)" "FIXED(f)") (sequence "TEST(T)" "NOTEST(N)" "|" "COMPLETE(C)") (sequence "|" "CANCELED(c)") (sequence "|" "NEEDCLARIFICATION(n)") (sequence "|" "PROVIDEUPDATE(p)") (sequence "|" "WAITING(w)") )) (setq org-agenda-files '("~/Dropbox/Org/todo.org" "~/Dropbox/Org/archive.org")) (setq org-refile-targets '((nil :maxlevel . 1) (org-agenda-files :maxlevel . 1))) ;; (add-hook 'focus-in-hook ;; (lambda () (progn ;; (setq org-tags-column (- 5 (frame-width)))) (org-align-all-tags))) ;; (add-hook 'focus-out-hook ;; (lambda () (progn ;; (setq org-tags-column (- 5 (frame-width)))) (org-align-all-tags))) (defvar org-src-tab-acts-natively) (setq org-src-tab-acts-natively t) (defvar org-confirm-babel-evaluate) (defun my-org-confirm-babel-evaluate (lang _body) "Execute certain languages without confirming. Takes LANG to allow and BODY to execute." (not (or (string= lang "js") (string= lang "restclient") (string= lang "emacs-lisp") (string= lang "shell")))) (setq org-confirm-babel-evaluate #'my-org-confirm-babel-evaluate) (add-to-list 'org-structure-template-alist (list "e" (concat "#+BEGIN_SRC emacs-lisp :results silent\n" "\n" "#+END_SRC"))) (add-to-list 'org-structure-template-alist (list "j" (concat "#+BEGIN_SRC js :cmd \"/usr/local/bin/babel-node\" :results output code\n" "\n" "#+END_SRC"))) (add-to-list 'org-structure-template-alist (list "r" (concat "#+BEGIN_SRC restclient :results raw\n" "\n" "#+END_SRC"))) (defun my-org-config () "Activate org and yas in 'org-mode' buffers." (yas-minor-mode) (lambda () (local-set-key (kbd "M-RET") 'org-insert-todo-heading) (global-set-key (kbd "C-c c") nil) (local-set-key (kbd "C-c c i") 'org-clock-in) (local-set-key (kbd "C-c c o") 'org-clock-out) ) ) (add-hook 'org-mode-hook #'my-org-config) #+END_SRC **** Presentations - Reveal #+BEGIN_SRC emacs-lisp :results silent (require 'ox-reveal) (setq org-reveal-root "https://cdn.jsdelivr.net/npm/reveal.js" org-reveal-klipsify-src t) #+END_SRC **** Mu4e #+BEGIN_SRC emacs-lisp :results silent ;;store org-mode links to messages (require 'org-mu4e) ;;store link to message if in header view, not to header query (setq org-mu4e-link-query-in-headers-mode nil) (setq org-capture-templates '(("t" "todo" entry (file+headline "~/Dropbox/Org/todo.org" "Tasks") "* TODO [#A] %?\nSCHEDULED: %(org-insert-time-stamp (org-read-date nil t \"+0d\"))\n%a\n"))) #+END_SRC **** ElFeed #+BEGIN_SRC emacs-lisp :results silent (elfeed-org) (setq rmh-elfeed-org-files (list "~/Dropbox/Org/elfeed.org")) (defun leo/elfeed-search (arg) "Search for ARG in feed." (interactive) (elfeed-search-set-filter arg)) (define-key elfeed-search-mode-map "a" (lambda () (interactive) (leo/elfeed-search ""))) (define-key elfeed-search-mode-map "e" (lambda () (interactive) (leo/elfeed-search "+emacs"))) (define-key elfeed-search-mode-map "d" (lambda () (interactive) (leo/elfeed-search "+daily"))) (define-key elfeed-search-mode-map "x" (lambda () (interactive) (leo/elfeed-search "xkcd"))) #+End_SRC ** UI #+BEGIN_SRC emacs-lisp :results silent (cond ((member "PragmataPro Mono Liga" (font-family-list)) (set-face-attribute 'default nil :font "PragmataPro Mono Liga-13"))) #+END_SRC *** Org Headings #+BEGIN_SRC emacs-lisp :results silent (set-face-attribute 'org-level-1 nil :height 1.5) (set-face-attribute 'org-level-2 nil :height 1.2) (set-face-attribute 'org-level-3 nil :height 1.1) (set-face-attribute 'org-level-4 nil :height 1.1) (set-face-attribute 'org-scheduled-today nil :height 1.0) (set-face-attribute 'org-agenda-date-today nil :height 1.1) ;; (set-face-attribute 'org-table nil :foreground "#008787") #+END_SRC *** Rainbow Mode (highlight hex colors) #+BEGIN_SRC emacs-lisp :results silent ;;; rainbow-mode.el --- Colorize color names in buffers ;; Copyright (C) 2010-2018 Free Software Foundation, Inc ;; Author: Julien Danjou ;; Keywords: faces ;; Version: 1.0.1 ;; This file is part of GNU Emacs. ;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs. If not, see . ;;; Commentary: ;; ;; This minor mode sets background color to strings that match color ;; names, e.g. #0000ff is displayed in white with a blue background. ;; ;;; Code: (eval-when-compile (require 'cl)) (require 'regexp-opt) (require 'faces) (require 'color) (unless (require 'xterm-color nil t) (require 'ansi-color)) (defgroup rainbow nil "Show color strings with a background color." :tag "Rainbow" :group 'help) ;;; Hexadecimal colors (defvar rainbow-hexadecimal-colors-font-lock-keywords '(("[^&]\\(#\\(?:[0-9a-fA-F]\\{3\\}\\)+\\{1,4\\}\\)" (1 (rainbow-colorize-itself 1))) ("^\\(#\\(?:[0-9a-fA-F]\\{3\\}\\)+\\{1,4\\}\\)" (0 (rainbow-colorize-itself))) ("[Rr][Gg][Bb]:[0-9a-fA-F]\\{1,4\\}/[0-9a-fA-F]\\{1,4\\}/[0-9a-fA-F]\\{1,4\\}" (0 (rainbow-colorize-itself))) ("[Rr][Gg][Bb][Ii]:[0-9.]+/[0-9.]+/[0-9.]+" (0 (rainbow-colorize-itself))) ("\\(?:[Cc][Ii][Ee]\\(?:[Xx][Yy][Zz]\\|[Uu][Vv][Yy]\\|[Xx][Yy][Yy]\\|[Ll][Aa][Bb]\\|[Ll][Uu][Vv]\\)\\|[Tt][Ee][Kk][Hh][Vv][Cc]\\):[+-]?[0-9.]+\\(?:[Ee][+-]?[0-9]+\\)?/[+-]?[0-9.]+\\(?:[Ee][+-]?[0-9]+\\)?/[+-]?[0-9.]+\\(?:[Ee][+-]?[0-9]+\\)?" (0 (rainbow-colorize-itself)))) "Font-lock keywords to add for hexadecimal colors.") ;;; rgb() colors (defvar rainbow-html-rgb-colors-font-lock-keywords '(("rgb(\s*\\([0-9]\\{1,3\\}\\(?:\.[0-9]\\)?\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\\.[0-9]\\)?\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\\.[0-9]\\)?\\(?:\s*%\\)?\\)\s*)" (0 (rainbow-colorize-rgb))) ("rgba(\s*\\([0-9]\\{1,3\\}\\(?:\\.[0-9]\\)?\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\\.[0-9]\\)?\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\\.[0-9]\\)?\\(?:\s*%\\)?\\)\s*,\s*[0-9]*\.?[0-9]+\s*%?\s*)" (0 (rainbow-colorize-rgb))) ("hsl(\s*\\([0-9]\\{1,3\\}\\)\s*,\s*\\([0-9]\\{1,3\\}\\)\s*%\s*,\s*\\([0-9]\\{1,3\\}\\)\s*%\s*)" (0 (rainbow-colorize-hsl))) ("hsla(\s*\\([0-9]\\{1,3\\}\\)\s*,\s*\\([0-9]\\{1,3\\}\\)\s*%\s*,\s*\\([0-9]\\{1,3\\}\\)\s*%\s*,\s*[0-9]*\.?[0-9]+\s*%?\s*)" (0 (rainbow-colorize-hsl)))) "Font-lock keywords to add for RGB colors.") ;;; HTML colors (defvar rainbow-html-colors-font-lock-keywords nil "Font-lock keywords to add for HTML colors.") (make-variable-buffer-local 'rainbow-html-colors-font-lock-keywords) (defcustom rainbow-html-colors-alist '(("AliceBlue" . "#F0F8FF") ("AntiqueWhite" . "#FAEBD7") ("Aqua" . "#00FFFF") ("Aquamarine" . "#7FFFD4") ("Azure" . "#F0FFFF") ("Beige" . "#F5F5DC") ("Bisque" . "#FFE4C4") ("Black" . "#000000") ("BlanchedAlmond" . "#FFEBCD") ("Blue" . "#0000FF") ("BlueViolet" . "#8A2BE2") ("Brown" . "#A52A2A") ("BurlyWood" . "#DEB887") ("CadetBlue" . "#5F9EA0") ("Chartreuse" . "#7FFF00") ("Chocolate" . "#D2691E") ("Coral" . "#FF7F50") ("CornflowerBlue" . "#6495ED") ("Cornsilk" . "#FFF8DC") ("Crimson" . "#DC143C") ("Cyan" . "#00FFFF") ("DarkBlue" . "#00008B") ("DarkCyan" . "#008B8B") ("DarkGoldenRod" . "#B8860B") ("DarkGray" . "#A9A9A9") ("DarkGrey" . "#A9A9A9") ("DarkGreen" . "#006400") ("DarkKhaki" . "#BDB76B") ("DarkMagenta" . "#8B008B") ("DarkOliveGreen" . "#556B2F") ("Darkorange" . "#FF8C00") ("DarkOrchid" . "#9932CC") ("DarkRed" . "#8B0000") ("DarkSalmon" . "#E9967A") ("DarkSeaGreen" . "#8FBC8F") ("DarkSlateBlue" . "#483D8B") ("DarkSlateGray" . "#2F4F4F") ("DarkSlateGrey" . "#2F4F4F") ("DarkTurquoise" . "#00CED1") ("DarkViolet" . "#9400D3") ("DeepPink" . "#FF1493") ("DeepSkyBlue" . "#00BFFF") ("DimGray" . "#696969") ("DimGrey" . "#696969") ("DodgerBlue" . "#1E90FF") ("FireBrick" . "#B22222") ("FloralWhite" . "#FFFAF0") ("ForestGreen" . "#228B22") ("Fuchsia" . "#FF00FF") ("Gainsboro" . "#DCDCDC") ("GhostWhite" . "#F8F8FF") ("Gold" . "#FFD700") ("GoldenRod" . "#DAA520") ("Gray" . "#808080") ("Grey" . "#808080") ("Green" . "#008000") ("GreenYellow" . "#ADFF2F") ("HoneyDew" . "#F0FFF0") ("HotPink" . "#FF69B4") ("IndianRed" . "#CD5C5C") ("Indigo" . "#4B0082") ("Ivory" . "#FFFFF0") ("Khaki" . "#F0E68C") ("Lavender" . "#E6E6FA") ("LavenderBlush" . "#FFF0F5") ("LawnGreen" . "#7CFC00") ("LemonChiffon" . "#FFFACD") ("LightBlue" . "#ADD8E6") ("LightCoral" . "#F08080") ("LightCyan" . "#E0FFFF") ("LightGoldenRodYellow" . "#FAFAD2") ("LightGray" . "#D3D3D3") ("LightGrey" . "#D3D3D3") ("LightGreen" . "#90EE90") ("LightPink" . "#FFB6C1") ("LightSalmon" . "#FFA07A") ("LightSeaGreen" . "#20B2AA") ("LightSkyBlue" . "#87CEFA") ("LightSlateGray" . "#778899") ("LightSlateGrey" . "#778899") ("LightSteelBlue" . "#B0C4DE") ("LightYellow" . "#FFFFE0") ("Lime" . "#00FF00") ("LimeGreen" . "#32CD32") ("Linen" . "#FAF0E6") ("Magenta" . "#FF00FF") ("Maroon" . "#800000") ("MediumAquaMarine" . "#66CDAA") ("MediumBlue" . "#0000CD") ("MediumOrchid" . "#BA55D3") ("MediumPurple" . "#9370D8") ("MediumSeaGreen" . "#3CB371") ("MediumSlateBlue" . "#7B68EE") ("MediumSpringGreen" . "#00FA9A") ("MediumTurquoise" . "#48D1CC") ("MediumVioletRed" . "#C71585") ("MidnightBlue" . "#191970") ("MintCream" . "#F5FFFA") ("MistyRose" . "#FFE4E1") ("Moccasin" . "#FFE4B5") ("NavajoWhite" . "#FFDEAD") ("Navy" . "#000080") ("OldLace" . "#FDF5E6") ("Olive" . "#808000") ("OliveDrab" . "#6B8E23") ("Orange" . "#FFA500") ("OrangeRed" . "#FF4500") ("Orchid" . "#DA70D6") ("PaleGoldenRod" . "#EEE8AA") ("PaleGreen" . "#98FB98") ("PaleTurquoise" . "#AFEEEE") ("PaleVioletRed" . "#D87093") ("PapayaWhip" . "#FFEFD5") ("PeachPuff" . "#FFDAB9") ("Peru" . "#CD853F") ("Pink" . "#FFC0CB") ("Plum" . "#DDA0DD") ("PowderBlue" . "#B0E0E6") ("Purple" . "#800080") ("Red" . "#FF0000") ("RosyBrown" . "#BC8F8F") ("RoyalBlue" . "#4169E1") ("SaddleBrown" . "#8B4513") ("Salmon" . "#FA8072") ("SandyBrown" . "#F4A460") ("SeaGreen" . "#2E8B57") ("SeaShell" . "#FFF5EE") ("Sienna" . "#A0522D") ("Silver" . "#C0C0C0") ("SkyBlue" . "#87CEEB") ("SlateBlue" . "#6A5ACD") ("SlateGray" . "#708090") ("SlateGrey" . "#708090") ("Snow" . "#FFFAFA") ("SpringGreen" . "#00FF7F") ("SteelBlue" . "#4682B4") ("Tan" . "#D2B48C") ("Teal" . "#008080") ("Thistle" . "#D8BFD8") ("Tomato" . "#FF6347") ("Turquoise" . "#40E0D0") ("Violet" . "#EE82EE") ("Wheat" . "#F5DEB3") ("White" . "#FFFFFF") ("WhiteSmoke" . "#F5F5F5") ("Yellow" . "#FFFF00") ("YellowGreen" . "#9ACD32")) "Alist of HTML colors. Each entry should have the form (COLOR-NAME . HEXADECIMAL-COLOR)." :type 'alist :group 'rainbow) (defcustom rainbow-html-colors-major-mode-list '(html-mode css-mode php-mode nxml-mode xml-mode) "List of major mode where HTML colors are enabled when `rainbow-html-colors' is set to auto." :type '(repeat (symbol :tag "Major-Mode")) :group 'rainbow) (defcustom rainbow-html-colors 'auto "When to enable HTML colors. If set to t, the HTML colors will be enabled. If set to nil, the HTML colors will not be enabled. If set to auto, the HTML colors will be enabled if a major mode has been detected from the `rainbow-html-colors-major-mode-list'." :type '(choice (symbol :tag "enable in certain modes" auto) (symbol :tag "enable globally" t) (symbol :tag "disable" nil)) :group 'rainbow) ;;; X colors (defvar rainbow-x-colors-font-lock-keywords `((,(regexp-opt (x-defined-colors) 'words) (0 (rainbow-colorize-itself)))) "Font-lock keywords to add for X colors.") (defcustom rainbow-x-colors-major-mode-list '(emacs-lisp-mode lisp-interaction-mode c-mode c++-mode java-mode) "List of major mode where X colors are enabled when `rainbow-x-colors' is set to auto." :type '(repeat (symbol :tag "Major-Mode")) :group 'rainbow) (defcustom rainbow-x-colors 'auto "When to enable X colors. If set to t, the X colors will be enabled. If set to nil, the X colors will not be enabled. If set to auto, the X colors will be enabled if a major mode has been detected from the `rainbow-x-colors-major-mode-list'." :type '(choice (symbol :tag "enable in certain modes" auto) (symbol :tag "enable globally" t) (symbol :tag "disable" nil)) :group 'rainbow) ;;; LaTeX colors (defvar rainbow-latex-rgb-colors-font-lock-keywords '(("{rgb}{\\([0-9.]+\\),\s*\\([0-9.]+\\),\s*\\([0-9.]+\\)}" (0 (rainbow-colorize-rgb-float))) ("{RGB}{\\([0-9]\\{1,3\\}\\),\s*\\([0-9]\\{1,3\\}\\),\s*\\([0-9]\\{1,3\\}\\)}" (0 (rainbow-colorize-rgb))) ("{HTML}{\\([0-9A-Fa-f]\\{6\\}\\)}" (0 (rainbow-colorize-hexadecimal-without-sharp)))) "Font-lock keywords to add for LaTeX colors.") (defcustom rainbow-latex-colors-major-mode-list '(latex-mode) "List of major mode where LaTeX colors are enabled when `rainbow-x-colors' is set to auto." :type '(repeat (symbol :tag "Major-Mode")) :group 'rainbow) (defcustom rainbow-latex-colors 'auto "When to enable LaTeX colors. If set to t, the LaTeX colors will be enabled. If set to nil, the LaTeX colors will not be enabled. If set to auto, the LaTeX colors will be enabled if a major mode has been detected from the `rainbow-latex-colors-major-mode-list'." :type '(choice (symbol :tag "enable in certain modes" auto) (symbol :tag "enable globally" t) (symbol :tag "disable" nil)) :group 'rainbow) ;;; Shell colors (defvar rainbow-ansi-colors-font-lock-keywords '(("\\(\\\\[eE]\\|\\\\033\\|\\\\x1[bB]\\|\033\\)\\[\\([0-9;]*m\\)" (0 (rainbow-colorize-ansi)))) "Font-lock keywords to add for ANSI colors.") (defcustom rainbow-ansi-colors-major-mode-list '(sh-mode c-mode c++-mode) "List of major mode where ANSI colors are enabled when `rainbow-ansi-colors' is set to auto." :type '(repeat (symbol :tag "Major-Mode")) :group 'rainbow) (defcustom rainbow-ansi-colors 'auto "When to enable ANSI colors. If set to t, the ANSI colors will be enabled. If set to nil, the ANSI colors will not be enabled. If set to auto, the ANSI colors will be enabled if a major mode has been detected from the `rainbow-ansi-colors-major-mode-list'." :type '(choice (symbol :tag "enable in certain modes" auto) (symbol :tag "enable globally" t) (symbol :tag "disable" nil)) :group 'rainbow) ;;; R colors (defvar rainbow-r-colors-font-lock-keywords nil "Font-lock keywords to add for R colors.") (make-variable-buffer-local 'rainbow-r-colors-font-lock-keywords) ;; use the following code to generate the list in R ;; output_colors <- function(colors) {for(color in colors) {col <- col2rgb(color); cat(sprintf("(\"%s\" . \"#%02X%02X%02X\")\n",color,col[1],col[2],col[3]));}} ;; output_colors(colors()) (defcustom rainbow-r-colors-alist '(("white" . "#FFFFFF") ("aliceblue" . "#F0F8FF") ("antiquewhite" . "#FAEBD7") ("antiquewhite1" . "#FFEFDB") ("antiquewhite2" . "#EEDFCC") ("antiquewhite3" . "#CDC0B0") ("antiquewhite4" . "#8B8378") ("aquamarine" . "#7FFFD4") ("aquamarine1" . "#7FFFD4") ("aquamarine2" . "#76EEC6") ("aquamarine3" . "#66CDAA") ("aquamarine4" . "#458B74") ("azure" . "#F0FFFF") ("azure1" . "#F0FFFF") ("azure2" . "#E0EEEE") ("azure3" . "#C1CDCD") ("azure4" . "#838B8B") ("beige" . "#F5F5DC") ("bisque" . "#FFE4C4") ("bisque1" . "#FFE4C4") ("bisque2" . "#EED5B7") ("bisque3" . "#CDB79E") ("bisque4" . "#8B7D6B") ("black" . "#000000") ("blanchedalmond" . "#FFEBCD") ("blue" . "#0000FF") ("blue1" . "#0000FF") ("blue2" . "#0000EE") ("blue3" . "#0000CD") ("blue4" . "#00008B") ("blueviolet" . "#8A2BE2") ("brown" . "#A52A2A") ("brown1" . "#FF4040") ("brown2" . "#EE3B3B") ("brown3" . "#CD3333") ("brown4" . "#8B2323") ("burlywood" . "#DEB887") ("burlywood1" . "#FFD39B") ("burlywood2" . "#EEC591") ("burlywood3" . "#CDAA7D") ("burlywood4" . "#8B7355") ("cadetblue" . "#5F9EA0") ("cadetblue1" . "#98F5FF") ("cadetblue2" . "#8EE5EE") ("cadetblue3" . "#7AC5CD") ("cadetblue4" . "#53868B") ("chartreuse" . "#7FFF00") ("chartreuse1" . "#7FFF00") ("chartreuse2" . "#76EE00") ("chartreuse3" . "#66CD00") ("chartreuse4" . "#458B00") ("chocolate" . "#D2691E") ("chocolate1" . "#FF7F24") ("chocolate2" . "#EE7621") ("chocolate3" . "#CD661D") ("chocolate4" . "#8B4513") ("coral" . "#FF7F50") ("coral1" . "#FF7256") ("coral2" . "#EE6A50") ("coral3" . "#CD5B45") ("coral4" . "#8B3E2F") ("cornflowerblue" . "#6495ED") ("cornsilk" . "#FFF8DC") ("cornsilk1" . "#FFF8DC") ("cornsilk2" . "#EEE8CD") ("cornsilk3" . "#CDC8B1") ("cornsilk4" . "#8B8878") ("cyan" . "#00FFFF") ("cyan1" . "#00FFFF") ("cyan2" . "#00EEEE") ("cyan3" . "#00CDCD") ("cyan4" . "#008B8B") ("darkblue" . "#00008B") ("darkcyan" . "#008B8B") ("darkgoldenrod" . "#B8860B") ("darkgoldenrod1" . "#FFB90F") ("darkgoldenrod2" . "#EEAD0E") ("darkgoldenrod3" . "#CD950C") ("darkgoldenrod4" . "#8B6508") ("darkgray" . "#A9A9A9") ("darkgreen" . "#006400") ("darkgrey" . "#A9A9A9") ("darkkhaki" . "#BDB76B") ("darkmagenta" . "#8B008B") ("darkolivegreen" . "#556B2F") ("darkolivegreen1" . "#CAFF70") ("darkolivegreen2" . "#BCEE68") ("darkolivegreen3" . "#A2CD5A") ("darkolivegreen4" . "#6E8B3D") ("darkorange" . "#FF8C00") ("darkorange1" . "#FF7F00") ("darkorange2" . "#EE7600") ("darkorange3" . "#CD6600") ("darkorange4" . "#8B4500") ("darkorchid" . "#9932CC") ("darkorchid1" . "#BF3EFF") ("darkorchid2" . "#B23AEE") ("darkorchid3" . "#9A32CD") ("darkorchid4" . "#68228B") ("darkred" . "#8B0000") ("darksalmon" . "#E9967A") ("darkseagreen" . "#8FBC8F") ("darkseagreen1" . "#C1FFC1") ("darkseagreen2" . "#B4EEB4") ("darkseagreen3" . "#9BCD9B") ("darkseagreen4" . "#698B69") ("darkslateblue" . "#483D8B") ("darkslategray" . "#2F4F4F") ("darkslategray1" . "#97FFFF") ("darkslategray2" . "#8DEEEE") ("darkslategray3" . "#79CDCD") ("darkslategray4" . "#528B8B") ("darkslategrey" . "#2F4F4F") ("darkturquoise" . "#00CED1") ("darkviolet" . "#9400D3") ("deeppink" . "#FF1493") ("deeppink1" . "#FF1493") ("deeppink2" . "#EE1289") ("deeppink3" . "#CD1076") ("deeppink4" . "#8B0A50") ("deepskyblue" . "#00BFFF") ("deepskyblue1" . "#00BFFF") ("deepskyblue2" . "#00B2EE") ("deepskyblue3" . "#009ACD") ("deepskyblue4" . "#00688B") ("dimgray" . "#696969") ("dimgrey" . "#696969") ("dodgerblue" . "#1E90FF") ("dodgerblue1" . "#1E90FF") ("dodgerblue2" . "#1C86EE") ("dodgerblue3" . "#1874CD") ("dodgerblue4" . "#104E8B") ("firebrick" . "#B22222") ("firebrick1" . "#FF3030") ("firebrick2" . "#EE2C2C") ("firebrick3" . "#CD2626") ("firebrick4" . "#8B1A1A") ("floralwhite" . "#FFFAF0") ("forestgreen" . "#228B22") ("gainsboro" . "#DCDCDC") ("ghostwhite" . "#F8F8FF") ("gold" . "#FFD700") ("gold1" . "#FFD700") ("gold2" . "#EEC900") ("gold3" . "#CDAD00") ("gold4" . "#8B7500") ("goldenrod" . "#DAA520") ("goldenrod1" . "#FFC125") ("goldenrod2" . "#EEB422") ("goldenrod3" . "#CD9B1D") ("goldenrod4" . "#8B6914") ("gray" . "#BEBEBE") ("gray0" . "#000000") ("gray1" . "#030303") ("gray2" . "#050505") ("gray3" . "#080808") ("gray4" . "#0A0A0A") ("gray5" . "#0D0D0D") ("gray6" . "#0F0F0F") ("gray7" . "#121212") ("gray8" . "#141414") ("gray9" . "#171717") ("gray10" . "#1A1A1A") ("gray11" . "#1C1C1C") ("gray12" . "#1F1F1F") ("gray13" . "#212121") ("gray14" . "#242424") ("gray15" . "#262626") ("gray16" . "#292929") ("gray17" . "#2B2B2B") ("gray18" . "#2E2E2E") ("gray19" . "#303030") ("gray20" . "#333333") ("gray21" . "#363636") ("gray22" . "#383838") ("gray23" . "#3B3B3B") ("gray24" . "#3D3D3D") ("gray25" . "#404040") ("gray26" . "#424242") ("gray27" . "#454545") ("gray28" . "#474747") ("gray29" . "#4A4A4A") ("gray30" . "#4D4D4D") ("gray31" . "#4F4F4F") ("gray32" . "#525252") ("gray33" . "#545454") ("gray34" . "#575757") ("gray35" . "#595959") ("gray36" . "#5C5C5C") ("gray37" . "#5E5E5E") ("gray38" . "#616161") ("gray39" . "#636363") ("gray40" . "#666666") ("gray41" . "#696969") ("gray42" . "#6B6B6B") ("gray43" . "#6E6E6E") ("gray44" . "#707070") ("gray45" . "#737373") ("gray46" . "#757575") ("gray47" . "#787878") ("gray48" . "#7A7A7A") ("gray49" . "#7D7D7D") ("gray50" . "#7F7F7F") ("gray51" . "#828282") ("gray52" . "#858585") ("gray53" . "#878787") ("gray54" . "#8A8A8A") ("gray55" . "#8C8C8C") ("gray56" . "#8F8F8F") ("gray57" . "#919191") ("gray58" . "#949494") ("gray59" . "#969696") ("gray60" . "#999999") ("gray61" . "#9C9C9C") ("gray62" . "#9E9E9E") ("gray63" . "#A1A1A1") ("gray64" . "#A3A3A3") ("gray65" . "#A6A6A6") ("gray66" . "#A8A8A8") ("gray67" . "#ABABAB") ("gray68" . "#ADADAD") ("gray69" . "#B0B0B0") ("gray70" . "#B3B3B3") ("gray71" . "#B5B5B5") ("gray72" . "#B8B8B8") ("gray73" . "#BABABA") ("gray74" . "#BDBDBD") ("gray75" . "#BFBFBF") ("gray76" . "#C2C2C2") ("gray77" . "#C4C4C4") ("gray78" . "#C7C7C7") ("gray79" . "#C9C9C9") ("gray80" . "#CCCCCC") ("gray81" . "#CFCFCF") ("gray82" . "#D1D1D1") ("gray83" . "#D4D4D4") ("gray84" . "#D6D6D6") ("gray85" . "#D9D9D9") ("gray86" . "#DBDBDB") ("gray87" . "#DEDEDE") ("gray88" . "#E0E0E0") ("gray89" . "#E3E3E3") ("gray90" . "#E5E5E5") ("gray91" . "#E8E8E8") ("gray92" . "#EBEBEB") ("gray93" . "#EDEDED") ("gray94" . "#F0F0F0") ("gray95" . "#F2F2F2") ("gray96" . "#F5F5F5") ("gray97" . "#F7F7F7") ("gray98" . "#FAFAFA") ("gray99" . "#FCFCFC") ("gray100" . "#FFFFFF") ("green" . "#00FF00") ("green1" . "#00FF00") ("green2" . "#00EE00") ("green3" . "#00CD00") ("green4" . "#008B00") ("greenyellow" . "#ADFF2F") ("grey" . "#BEBEBE") ("grey0" . "#000000") ("grey1" . "#030303") ("grey2" . "#050505") ("grey3" . "#080808") ("grey4" . "#0A0A0A") ("grey5" . "#0D0D0D") ("grey6" . "#0F0F0F") ("grey7" . "#121212") ("grey8" . "#141414") ("grey9" . "#171717") ("grey10" . "#1A1A1A") ("grey11" . "#1C1C1C") ("grey12" . "#1F1F1F") ("grey13" . "#212121") ("grey14" . "#242424") ("grey15" . "#262626") ("grey16" . "#292929") ("grey17" . "#2B2B2B") ("grey18" . "#2E2E2E") ("grey19" . "#303030") ("grey20" . "#333333") ("grey21" . "#363636") ("grey22" . "#383838") ("grey23" . "#3B3B3B") ("grey24" . "#3D3D3D") ("grey25" . "#404040") ("grey26" . "#424242") ("grey27" . "#454545") ("grey28" . "#474747") ("grey29" . "#4A4A4A") ("grey30" . "#4D4D4D") ("grey31" . "#4F4F4F") ("grey32" . "#525252") ("grey33" . "#545454") ("grey34" . "#575757") ("grey35" . "#595959") ("grey36" . "#5C5C5C") ("grey37" . "#5E5E5E") ("grey38" . "#616161") ("grey39" . "#636363") ("grey40" . "#666666") ("grey41" . "#696969") ("grey42" . "#6B6B6B") ("grey43" . "#6E6E6E") ("grey44" . "#707070") ("grey45" . "#737373") ("grey46" . "#757575") ("grey47" . "#787878") ("grey48" . "#7A7A7A") ("grey49" . "#7D7D7D") ("grey50" . "#7F7F7F") ("grey51" . "#828282") ("grey52" . "#858585") ("grey53" . "#878787") ("grey54" . "#8A8A8A") ("grey55" . "#8C8C8C") ("grey56" . "#8F8F8F") ("grey57" . "#919191") ("grey58" . "#949494") ("grey59" . "#969696") ("grey60" . "#999999") ("grey61" . "#9C9C9C") ("grey62" . "#9E9E9E") ("grey63" . "#A1A1A1") ("grey64" . "#A3A3A3") ("grey65" . "#A6A6A6") ("grey66" . "#A8A8A8") ("grey67" . "#ABABAB") ("grey68" . "#ADADAD") ("grey69" . "#B0B0B0") ("grey70" . "#B3B3B3") ("grey71" . "#B5B5B5") ("grey72" . "#B8B8B8") ("grey73" . "#BABABA") ("grey74" . "#BDBDBD") ("grey75" . "#BFBFBF") ("grey76" . "#C2C2C2") ("grey77" . "#C4C4C4") ("grey78" . "#C7C7C7") ("grey79" . "#C9C9C9") ("grey80" . "#CCCCCC") ("grey81" . "#CFCFCF") ("grey82" . "#D1D1D1") ("grey83" . "#D4D4D4") ("grey84" . "#D6D6D6") ("grey85" . "#D9D9D9") ("grey86" . "#DBDBDB") ("grey87" . "#DEDEDE") ("grey88" . "#E0E0E0") ("grey89" . "#E3E3E3") ("grey90" . "#E5E5E5") ("grey91" . "#E8E8E8") ("grey92" . "#EBEBEB") ("grey93" . "#EDEDED") ("grey94" . "#F0F0F0") ("grey95" . "#F2F2F2") ("grey96" . "#F5F5F5") ("grey97" . "#F7F7F7") ("grey98" . "#FAFAFA") ("grey99" . "#FCFCFC") ("grey100" . "#FFFFFF") ("honeydew" . "#F0FFF0") ("honeydew1" . "#F0FFF0") ("honeydew2" . "#E0EEE0") ("honeydew3" . "#C1CDC1") ("honeydew4" . "#838B83") ("hotpink" . "#FF69B4") ("hotpink1" . "#FF6EB4") ("hotpink2" . "#EE6AA7") ("hotpink3" . "#CD6090") ("hotpink4" . "#8B3A62") ("indianred" . "#CD5C5C") ("indianred1" . "#FF6A6A") ("indianred2" . "#EE6363") ("indianred3" . "#CD5555") ("indianred4" . "#8B3A3A") ("ivory" . "#FFFFF0") ("ivory1" . "#FFFFF0") ("ivory2" . "#EEEEE0") ("ivory3" . "#CDCDC1") ("ivory4" . "#8B8B83") ("khaki" . "#F0E68C") ("khaki1" . "#FFF68F") ("khaki2" . "#EEE685") ("khaki3" . "#CDC673") ("khaki4" . "#8B864E") ("lavender" . "#E6E6FA") ("lavenderblush" . "#FFF0F5") ("lavenderblush1" . "#FFF0F5") ("lavenderblush2" . "#EEE0E5") ("lavenderblush3" . "#CDC1C5") ("lavenderblush4" . "#8B8386") ("lawngreen" . "#7CFC00") ("lemonchiffon" . "#FFFACD") ("lemonchiffon1" . "#FFFACD") ("lemonchiffon2" . "#EEE9BF") ("lemonchiffon3" . "#CDC9A5") ("lemonchiffon4" . "#8B8970") ("lightblue" . "#ADD8E6") ("lightblue1" . "#BFEFFF") ("lightblue2" . "#B2DFEE") ("lightblue3" . "#9AC0CD") ("lightblue4" . "#68838B") ("lightcoral" . "#F08080") ("lightcyan" . "#E0FFFF") ("lightcyan1" . "#E0FFFF") ("lightcyan2" . "#D1EEEE") ("lightcyan3" . "#B4CDCD") ("lightcyan4" . "#7A8B8B") ("lightgoldenrod" . "#EEDD82") ("lightgoldenrod1" . "#FFEC8B") ("lightgoldenrod2" . "#EEDC82") ("lightgoldenrod3" . "#CDBE70") ("lightgoldenrod4" . "#8B814C") ("lightgoldenrodyellow" . "#FAFAD2") ("lightgray" . "#D3D3D3") ("lightgreen" . "#90EE90") ("lightgrey" . "#D3D3D3") ("lightpink" . "#FFB6C1") ("lightpink1" . "#FFAEB9") ("lightpink2" . "#EEA2AD") ("lightpink3" . "#CD8C95") ("lightpink4" . "#8B5F65") ("lightsalmon" . "#FFA07A") ("lightsalmon1" . "#FFA07A") ("lightsalmon2" . "#EE9572") ("lightsalmon3" . "#CD8162") ("lightsalmon4" . "#8B5742") ("lightseagreen" . "#20B2AA") ("lightskyblue" . "#87CEFA") ("lightskyblue1" . "#B0E2FF") ("lightskyblue2" . "#A4D3EE") ("lightskyblue3" . "#8DB6CD") ("lightskyblue4" . "#607B8B") ("lightslateblue" . "#8470FF") ("lightslategray" . "#778899") ("lightslategrey" . "#778899") ("lightsteelblue" . "#B0C4DE") ("lightsteelblue1" . "#CAE1FF") ("lightsteelblue2" . "#BCD2EE") ("lightsteelblue3" . "#A2B5CD") ("lightsteelblue4" . "#6E7B8B") ("lightyellow" . "#FFFFE0") ("lightyellow1" . "#FFFFE0") ("lightyellow2" . "#EEEED1") ("lightyellow3" . "#CDCDB4") ("lightyellow4" . "#8B8B7A") ("limegreen" . "#32CD32") ("linen" . "#FAF0E6") ("magenta" . "#FF00FF") ("magenta1" . "#FF00FF") ("magenta2" . "#EE00EE") ("magenta3" . "#CD00CD") ("magenta4" . "#8B008B") ("maroon" . "#B03060") ("maroon1" . "#FF34B3") ("maroon2" . "#EE30A7") ("maroon3" . "#CD2990") ("maroon4" . "#8B1C62") ("mediumaquamarine" . "#66CDAA") ("mediumblue" . "#0000CD") ("mediumorchid" . "#BA55D3") ("mediumorchid1" . "#E066FF") ("mediumorchid2" . "#D15FEE") ("mediumorchid3" . "#B452CD") ("mediumorchid4" . "#7A378B") ("mediumpurple" . "#9370DB") ("mediumpurple1" . "#AB82FF") ("mediumpurple2" . "#9F79EE") ("mediumpurple3" . "#8968CD") ("mediumpurple4" . "#5D478B") ("mediumseagreen" . "#3CB371") ("mediumslateblue" . "#7B68EE") ("mediumspringgreen" . "#00FA9A") ("mediumturquoise" . "#48D1CC") ("mediumvioletred" . "#C71585") ("midnightblue" . "#191970") ("mintcream" . "#F5FFFA") ("mistyrose" . "#FFE4E1") ("mistyrose1" . "#FFE4E1") ("mistyrose2" . "#EED5D2") ("mistyrose3" . "#CDB7B5") ("mistyrose4" . "#8B7D7B") ("moccasin" . "#FFE4B5") ("navajowhite" . "#FFDEAD") ("navajowhite1" . "#FFDEAD") ("navajowhite2" . "#EECFA1") ("navajowhite3" . "#CDB38B") ("navajowhite4" . "#8B795E") ("navy" . "#000080") ("navyblue" . "#000080") ("oldlace" . "#FDF5E6") ("olivedrab" . "#6B8E23") ("olivedrab1" . "#C0FF3E") ("olivedrab2" . "#B3EE3A") ("olivedrab3" . "#9ACD32") ("olivedrab4" . "#698B22") ("orange" . "#FFA500") ("orange1" . "#FFA500") ("orange2" . "#EE9A00") ("orange3" . "#CD8500") ("orange4" . "#8B5A00") ("orangered" . "#FF4500") ("orangered1" . "#FF4500") ("orangered2" . "#EE4000") ("orangered3" . "#CD3700") ("orangered4" . "#8B2500") ("orchid" . "#DA70D6") ("orchid1" . "#FF83FA") ("orchid2" . "#EE7AE9") ("orchid3" . "#CD69C9") ("orchid4" . "#8B4789") ("palegoldenrod" . "#EEE8AA") ("palegreen" . "#98FB98") ("palegreen1" . "#9AFF9A") ("palegreen2" . "#90EE90") ("palegreen3" . "#7CCD7C") ("palegreen4" . "#548B54") ("paleturquoise" . "#AFEEEE") ("paleturquoise1" . "#BBFFFF") ("paleturquoise2" . "#AEEEEE") ("paleturquoise3" . "#96CDCD") ("paleturquoise4" . "#668B8B") ("palevioletred" . "#DB7093") ("palevioletred1" . "#FF82AB") ("palevioletred2" . "#EE799F") ("palevioletred3" . "#CD6889") ("palevioletred4" . "#8B475D") ("papayawhip" . "#FFEFD5") ("peachpuff" . "#FFDAB9") ("peachpuff1" . "#FFDAB9") ("peachpuff2" . "#EECBAD") ("peachpuff3" . "#CDAF95") ("peachpuff4" . "#8B7765") ("peru" . "#CD853F") ("pink" . "#FFC0CB") ("pink1" . "#FFB5C5") ("pink2" . "#EEA9B8") ("pink3" . "#CD919E") ("pink4" . "#8B636C") ("plum" . "#DDA0DD") ("plum1" . "#FFBBFF") ("plum2" . "#EEAEEE") ("plum3" . "#CD96CD") ("plum4" . "#8B668B") ("powderblue" . "#B0E0E6") ("purple" . "#A020F0") ("purple1" . "#9B30FF") ("purple2" . "#912CEE") ("purple3" . "#7D26CD") ("purple4" . "#551A8B") ("red" . "#FF0000") ("red1" . "#FF0000") ("red2" . "#EE0000") ("red3" . "#CD0000") ("red4" . "#8B0000") ("rosybrown" . "#BC8F8F") ("rosybrown1" . "#FFC1C1") ("rosybrown2" . "#EEB4B4") ("rosybrown3" . "#CD9B9B") ("rosybrown4" . "#8B6969") ("royalblue" . "#4169E1") ("royalblue1" . "#4876FF") ("royalblue2" . "#436EEE") ("royalblue3" . "#3A5FCD") ("royalblue4" . "#27408B") ("saddlebrown" . "#8B4513") ("salmon" . "#FA8072") ("salmon1" . "#FF8C69") ("salmon2" . "#EE8262") ("salmon3" . "#CD7054") ("salmon4" . "#8B4C39") ("sandybrown" . "#F4A460") ("seagreen" . "#2E8B57") ("seagreen1" . "#54FF9F") ("seagreen2" . "#4EEE94") ("seagreen3" . "#43CD80") ("seagreen4" . "#2E8B57") ("seashell" . "#FFF5EE") ("seashell1" . "#FFF5EE") ("seashell2" . "#EEE5DE") ("seashell3" . "#CDC5BF") ("seashell4" . "#8B8682") ("sienna" . "#A0522D") ("sienna1" . "#FF8247") ("sienna2" . "#EE7942") ("sienna3" . "#CD6839") ("sienna4" . "#8B4726") ("skyblue" . "#87CEEB") ("skyblue1" . "#87CEFF") ("skyblue2" . "#7EC0EE") ("skyblue3" . "#6CA6CD") ("skyblue4" . "#4A708B") ("slateblue" . "#6A5ACD") ("slateblue1" . "#836FFF") ("slateblue2" . "#7A67EE") ("slateblue3" . "#6959CD") ("slateblue4" . "#473C8B") ("slategray" . "#708090") ("slategray1" . "#C6E2FF") ("slategray2" . "#B9D3EE") ("slategray3" . "#9FB6CD") ("slategray4" . "#6C7B8B") ("slategrey" . "#708090") ("snow" . "#FFFAFA") ("snow1" . "#FFFAFA") ("snow2" . "#EEE9E9") ("snow3" . "#CDC9C9") ("snow4" . "#8B8989") ("springgreen" . "#00FF7F") ("springgreen1" . "#00FF7F") ("springgreen2" . "#00EE76") ("springgreen3" . "#00CD66") ("springgreen4" . "#008B45") ("steelblue" . "#4682B4") ("steelblue1" . "#63B8FF") ("steelblue2" . "#5CACEE") ("steelblue3" . "#4F94CD") ("steelblue4" . "#36648B") ("tan" . "#D2B48C") ("tan1" . "#FFA54F") ("tan2" . "#EE9A49") ("tan3" . "#CD853F") ("tan4" . "#8B5A2B") ("thistle" . "#D8BFD8") ("thistle1" . "#FFE1FF") ("thistle2" . "#EED2EE") ("thistle3" . "#CDB5CD") ("thistle4" . "#8B7B8B") ("tomato" . "#FF6347") ("tomato1" . "#FF6347") ("tomato2" . "#EE5C42") ("tomato3" . "#CD4F39") ("tomato4" . "#8B3626") ("turquoise" . "#40E0D0") ("turquoise1" . "#00F5FF") ("turquoise2" . "#00E5EE") ("turquoise3" . "#00C5CD") ("turquoise4" . "#00868B") ("violet" . "#EE82EE") ("violetred" . "#D02090") ("violetred1" . "#FF3E96") ("violetred2" . "#EE3A8C") ("violetred3" . "#CD3278") ("violetred4" . "#8B2252") ("wheat" . "#F5DEB3") ("wheat1" . "#FFE7BA") ("wheat2" . "#EED8AE") ("wheat3" . "#CDBA96") ("wheat4" . "#8B7E66") ("whitesmoke" . "#F5F5F5") ("yellow" . "#FFFF00") ("yellow1" . "#FFFF00") ("yellow2" . "#EEEE00") ("yellow3" . "#CDCD00") ("yellow4" . "#8B8B00") ("yellowgreen" . "#9ACD32")) "Alist of R colors. Each entry should have the form (COLOR-NAME . HEXADECIMAL-COLOR)." :type 'alist :group 'rainbow) (defcustom rainbow-r-colors-major-mode-list '(ess-mode) "List of major mode where R colors are enabled when `rainbow-r-colors' is set to auto." :type '(repeat (symbol :tag "Major-Mode")) :group 'rainbow) (defcustom rainbow-r-colors 'auto "When to enable R colors. If set to t, the R colors will be enabled. If set to nil, the R colors will not be enabled. If set to auto, the R colors will be enabled if a major mode has been detected from the `rainbow-r-colors-major-mode-list'." :type '(choice (symbol :tag "enable in certain modes" auto) (symbol :tag "enable globally" t) (symbol :tag "disable" nil)) :group 'rainbow) ;;; Functions (defun rainbow-colorize-match (color &optional match) "Return a matched string propertized with a face whose background is COLOR. The foreground is computed using `rainbow-color-luminance', and is either white or black." (let ((match (or match 0))) (put-text-property (match-beginning match) (match-end match) 'face `((:foreground ,(if (> 0.5 (rainbow-x-color-luminance color)) "white" "black")) (:background ,color))))) (defun rainbow-colorize-itself (&optional match) "Colorize a match with itself." (rainbow-colorize-match (match-string-no-properties (or match 0)) match)) (defun rainbow-colorize-hexadecimal-without-sharp () "Colorize an hexadecimal colors and prepend # to it." (rainbow-colorize-match (concat "#" (match-string-no-properties 1)))) (defun rainbow-colorize-by-assoc (assoc-list) "Colorize a match with its association from ASSOC-LIST." (rainbow-colorize-match (cdr (assoc-string (match-string-no-properties 0) assoc-list t)))) (defun rainbow-rgb-relative-to-absolute (number) "Convert a relative NUMBER to absolute. If NUMBER is absolute, return NUMBER. This will convert \"80 %\" to 204, \"100 %\" to 255 but \"123\" to \"123\". If the percentage value is above 100, it's converted to 100." (let ((string-length (- (length number) 1))) ;; Is this a number with %? (if (eq (elt number string-length) ?%) (/ (* (min (string-to-number (substring number 0 string-length)) 100) 255) 100) (string-to-number number)))) (defun rainbow-colorize-hsl () "Colorize a match with itself." (let ((h (/ (string-to-number (match-string-no-properties 1)) 360.0)) (s (/ (string-to-number (match-string-no-properties 2)) 100.0)) (l (/ (string-to-number (match-string-no-properties 3)) 100.0))) (rainbow-colorize-match (multiple-value-bind (r g b) (color-hsl-to-rgb h s l) (format "#%02X%02X%02X" (* r 255) (* g 255) (* b 255)))))) (defun rainbow-colorize-rgb () "Colorize a match with itself." (let ((r (rainbow-rgb-relative-to-absolute (match-string-no-properties 1))) (g (rainbow-rgb-relative-to-absolute (match-string-no-properties 2))) (b (rainbow-rgb-relative-to-absolute (match-string-no-properties 3)))) (rainbow-colorize-match (format "#%02X%02X%02X" r g b)))) (defun rainbow-colorize-rgb-float () "Colorize a match with itself, with relative value." (let ((r (* (string-to-number (match-string-no-properties 1)) 255.0)) (g (* (string-to-number (match-string-no-properties 2)) 255.0)) (b (* (string-to-number (match-string-no-properties 3)) 255.0))) (rainbow-colorize-match (format "#%02X%02X%02X" r g b)))) (defvar ansi-color-context) (defvar xterm-color-current) (defun rainbow-colorize-ansi () "Return a matched string propertized with ansi color face." (let ((xterm-color? (featurep 'xterm-color)) (string (match-string-no-properties 0)) color) (save-match-data (let* ((replaced (concat (replace-regexp-in-string "^\\(\\\\[eE]\\|\\\\033\\|\\\\x1[bB]\\)" "\033" string) "x")) xterm-color-current ansi-color-context (applied (funcall (if xterm-color? 'xterm-color-filter 'ansi-color-apply) replaced)) (face-property (get-text-property 0 (if xterm-color? 'face 'font-lock-face) applied))) (unless (listp (or (car-safe face-property) face-property)) (setq face-property (list face-property))) (setq color (funcall (if xterm-color? 'cadr 'cdr) (or (assq (if xterm-color? :foreground 'foreground-color) face-property) (assq (if xterm-color? :background 'background-color) face-property)))))) (when color (rainbow-colorize-match color)))) (defun rainbow-color-luminance (red green blue) "Calculate the luminance of color composed of RED, GREEN and BLUE. Return a value between 0 and 1." (/ (+ (* .2126 red) (* .7152 green) (* .0722 blue)) 256)) (defun rainbow-x-color-luminance (color) "Calculate the luminance of a color string (e.g. \"#ffaa00\", \"blue\"). Return a value between 0 and 1." (let* ((values (x-color-values color)) (r (/ (car values) 256.0)) (g (/ (cadr values) 256.0)) (b (/ (caddr values) 256.0))) (rainbow-color-luminance r g b))) ;;; Mode (defun rainbow-turn-on () "Turn on raibow-mode." (font-lock-add-keywords nil rainbow-hexadecimal-colors-font-lock-keywords t) ;; Activate X colors? (when (or (eq rainbow-x-colors t) (and (eq rainbow-x-colors 'auto) (memq major-mode rainbow-x-colors-major-mode-list))) (font-lock-add-keywords nil rainbow-x-colors-font-lock-keywords t)) ;; Activate LaTeX colors? (when (or (eq rainbow-latex-colors t) (and (eq rainbow-latex-colors 'auto) (memq major-mode rainbow-latex-colors-major-mode-list))) (font-lock-add-keywords nil rainbow-latex-rgb-colors-font-lock-keywords t)) ;; Activate ANSI colors? (when (or (eq rainbow-ansi-colors t) (and (eq rainbow-ansi-colors 'auto) (memq major-mode rainbow-ansi-colors-major-mode-list))) (font-lock-add-keywords nil rainbow-ansi-colors-font-lock-keywords t)) ;; Activate HTML colors? (when (or (eq rainbow-html-colors t) (and (eq rainbow-html-colors 'auto) (memq major-mode rainbow-html-colors-major-mode-list))) (setq rainbow-html-colors-font-lock-keywords `((,(regexp-opt (mapcar 'car rainbow-html-colors-alist) 'words) (0 (rainbow-colorize-by-assoc rainbow-html-colors-alist))))) (font-lock-add-keywords nil `(,@rainbow-html-colors-font-lock-keywords ,@rainbow-html-rgb-colors-font-lock-keywords) t)) ;; Activate R colors? (when (or (eq rainbow-r-colors t) (and (eq rainbow-r-colors 'auto) (memq major-mode rainbow-r-colors-major-mode-list))) (setq rainbow-r-colors-font-lock-keywords `((,(regexp-opt (mapcar 'car rainbow-r-colors-alist) 'words) (0 (rainbow-colorize-by-assoc rainbow-r-colors-alist))))) (font-lock-add-keywords nil rainbow-r-colors-font-lock-keywords t))) (defun rainbow-turn-off () "Turn off rainbow-mode." (font-lock-remove-keywords nil `(,@rainbow-hexadecimal-colors-font-lock-keywords ,@rainbow-x-colors-font-lock-keywords ,@rainbow-latex-rgb-colors-font-lock-keywords ,@rainbow-r-colors-font-lock-keywords ,@rainbow-html-colors-font-lock-keywords ,@rainbow-html-rgb-colors-font-lock-keywords))) ;;;###autoload (define-minor-mode rainbow-mode "Colorize strings that represent colors. This will fontify with colors the string like \"#aabbcc\" or \"blue\"." :lighter " Rbow" (progn (if rainbow-mode (rainbow-turn-on) (rainbow-turn-off)) ;; Call font-lock-mode to refresh the buffer when used e.g. interactively (font-lock-mode 1))) ;;;; ChangeLog: ;; 2018-05-21 Julien Danjou ;; ;; * rainbow-mode/rainbow-mode.el: do not fail if face-property is a symbol ;; ;; It turns out there are cases when `face-property' can be just a symbol ;; and we need to protect our selves from that, i.e. `car' should not fail. ;; Hence, ;; `car-safe' is there and if it's `nil', then fall back to `face-property' ;; as is. ;; ;; See https://github.com/tarsius/hl-todo/issues/17 ;; ;; 2018-03-26 Julien Danjou ;; ;; rainbow-mode: release 1.0 ;; ;; 2018-03-26 Jonas Bernoulli ;; ;; Allow outline-minor-mode to find section headings ;; ;; 2018-03-26 Jonas Bernoulli ;; ;; Set type of customizable options ;; ;; 2018-03-26 Jonas Bernoulli ;; ;; Enforce use of spaces for indentation ;; ;; Also untabify some code added by a contributor who, unlike you, has not ;; globally set `indent-tabs-mode' to nil. ;; ;; 2017-05-29 Julien Danjou ;; ;; Fix `rainbow-color-luminance' docstring ;; ;; 2015-10-12 Julien Danjou ;; ;; rainbow: add font-lock at the end ;; ;; See https://github.com/fxbois/web-mode/issues/612 ;; ;; 2015-03-06 Julien Danjou ;; ;; rainbow: fix font-lock-mode refresh ;; ;; 2014-10-15 Stefan Monnier ;; ;; * packages/rainbow-mode/rainbow-mode.el (ansi-color-context) ;; (xterm-color-current): Declare. ;; ;; 2014-09-07 Julien Danjou ;; ;; rainbow-mode: support float in CSS and limit to 100% ;; ;; 2013-08-05 Julien Danjou ;; ;; rainbow-mode: 0.9, allow spaces in LaTeX colors ;; ;; 2013-05-03 Julien Danjou ;; ;; rainbow-mode: add support for R, bump version to 0.8 ;; ;; Signed-off-by: Julien Danjou ;; ;; 2013-02-26 Julien Danjou ;; ;; rainbow-mode: version 0.7 ;; ;; * rainbow-mode.el: don't activate font-lock-mode ;; ;; 2012-12-11 Julien Danjou ;; ;; * rainbow-mode: update to 0.6, add support for ANSI coloring ;; ;; 2012-11-26 Julien Danjou ;; ;; rainbow-mode: fix some LaTex docstrings ;; ;; 2012-11-14 Julien Danjou ;; ;; rainbow-mode: version 0.5 ;; ;; * rainbow-mode.el: fix syntax error on ;; `rainbow-hexadecimal-colors-font-lock-keywords'. ;; ;; 2012-11-09 Julien Danjou ;; ;; rainbow-mode: version 0.4 ;; ;; * rainbow-mode.el: Use functions from color package to colorize HSL ;; rather ;; than our own copy. ;; ;; 2012-11-09 Julien Danjou ;; ;; rainbow-mode 0.3 ;; ;; * rainbow-mode.el: avoid colorizing HTML entities ;; ;; 2011-09-23 Julien Danjou ;; ;; Update rainbow-mode to version 0.2 ;; ;; 2011-07-01 Chong Yidong ;; ;; Give every package its own directory in packages/ including single-file ;; packages. ;; (provide 'rainbow-mode) ;; Local Variables: ;; indent-tabs-mode: nil ;; End: ;;; rainbow-mode.el ends here #+END_SRC *** Doom Modeline #+BEGIN_SRC emacs-lisp :results silent (require 'doom-modeline) (doom-modeline-mode 1) ;; How tall the mode-line should be (only respected in GUI Emacs). (setq doom-modeline-height 30) ;; How wide the mode-line bar should be (only respected in GUI Emacs). (setq doom-modeline-bar-width 4) ;; Determines the style used by `doom-modeline-buffer-file-name'. ;; ;; Given ~/Projects/FOSS/emacs/lisp/comint.el ;; truncate-upto-project => ~/P/F/emacs/lisp/comint.el ;; truncate-from-project => ~/Projects/FOSS/emacs/l/comint.el ;; truncate-with-project => emacs/l/comint.el ;; truncate-except-project => ~/P/F/emacs/l/comint.el ;; truncate-upto-root => ~/P/F/e/lisp/comint.el ;; truncate-all => ~/P/F/e/l/comint.el ;; relative-from-project => emacs/lisp/comint.el ;; relative-to-project => lisp/comint.el ;; file-name => comint.el ;; buffer-name => comint.el<2> (uniquify buffer name) ;; ;; If you are expereicing the laggy issue, especially while editing remote files ;; with tramp, please try `file-name' style. ;; Please refer to https://github.com/bbatsov/projectile/issues/657. (setq doom-modeline-buffer-file-name-style 'truncate-upto-project) ;; What executable of Python will be used (if nil nothing will be showed). (setq doom-modeline-python-executable "python") ;; Whether show `all-the-icons' or not (if nil nothing will be showed). (setq doom-modeline-icon t) ;; Whether show the icon for major mode. It respects `doom-modeline-icon'. (setq doom-modeline-major-mode-icon t) ;; Display color icons for `major-mode'. It respects `all-the-icons-color-icons'. (setq doom-modeline-major-mode-color-icon nil) ;; Whether display minor modes or not. Non-nil to display in mode-line. (setq doom-modeline-minor-modes nil) ;; If non-nil, a word count will be added to the selection-info modeline segment. (setq doom-modeline-enable-word-count nil) ;; If non-nil, only display one number for checker information if applicable. (setq doom-modeline-checker-simple-format t) ;; Whether display perspective name or not. Non-nil to display in mode-line. (setq doom-modeline-persp-name t) ;; Whether display `lsp' state or not. Non-nil to display in mode-line. (setq doom-modeline-lsp t) ;; Whether display github notifications or not. Requires `ghub` package. (setq doom-modeline-github nil) ;; The interval of checking github. (setq doom-modeline-github-interval (* 30 60)) ;; Whether display environment version or not. (setq doom-modeline-env-version t) ;; Whether display mu4e notifications or not. Requires `mu4e-alert' package. (setq doom-modeline-mu4e t) #+END_SRC