Skip to content

Instantly share code, notes, and snippets.

@matthew-ball
Created December 20, 2016 05:07
Show Gist options
  • Save matthew-ball/faa6a927c0f31729fef9b36461cd8b5b to your computer and use it in GitHub Desktop.
Save matthew-ball/faa6a927c0f31729fef9b36461cd8b5b to your computer and use it in GitHub Desktop.
(defgroup user-variables nil "User variables.")
(defcustom user-projects-directory "~/Public/" "Directory for user's project files." :type 'directory :group 'user-variables)
(defcustom user-documents-directory "~/Documents/" "Directory for user's files." :type 'directory :group 'user-variables)
(defcustom user-notes-file (concat (expand-file-name user-documents-directory) "notes.org") "File for user's organisation." :type 'file :group 'user-variables)
(defcustom user-packages-list '(magit gist markdown-mode undo-tree browse-kill-ring adaptive-wrap projectile slime yasnippet auto-complete diminish) "List of user packages." :type '(repeat symbol) :group 'user-variables)
(eval-when-compile (require 'cl-lib))
(defmacro load-after (mode &rest body)
(declare (indent defun))
`(eval-after-load ,mode '(progn ,@body)))
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)
(blink-cursor-mode -1)
(tooltip-mode -1)
(file-name-shadow-mode 1)
(delete-selection-mode 1)
(show-paren-mode 1)
(electric-pair-mode 1)
(line-number-mode 1)
(column-number-mode 1)
(size-indication-mode 1)
(global-prettify-symbols-mode 1)
(global-visual-line-mode 1)
(fringe-mode '(nil . 2))
(setq-default tab-width 4
show-trailing-whitespace 1
delete-old-versions 1)
(setq show-paren-style 'parenthesis
show-paren-delay 1.0
inhibit-startup-message 1
inhibit-echo-area-message 1
completion-ignore-case 1
read-buffer-completion-ignore-case 1
read-file-name-completion-ignore-case 1
disabled-command-function nil
use-dialog-box nil
confirm-nonexistent-file-or-buffer nil)
(require 'package)
(load-after "package"
(package-initialize)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
(defun user-packages-install ()
(dolist (package user-packages-list)
(unless (package-installed-p package)
(package-install package))))
(unless package-archive-contents
(package-refresh-contents)
(user-packages-install)))
(require 'uniquify)
(load-after "uniquify"
(setq uniquify-buffer-name-style 'reverse
uniquify-separator "/"
uniquify-after-kill-buffer-p 1
unifuidy-ignore-buffers-re "^\\*"))
(require 'recentf)
(load-after "recentf"
(setq recentf-save-file (concat (expand-file-name user-emacs-directory) "recent-files")
recentf-max-saved-items 500
recentf-max-menu-items 25)
(recentf-mode 1))
(require 'savehist)
(load-after "savehist"
(savehist-mode 1)
(setq savehist-file (concat (expand-file-name user-emacs-directory) "save-history")))
(require 'saveplace)
(load-after "saveplace"
;; TODO: update this for emacs25
(setq-default save-place 1)
(setq save-place-file (concat (expand-file-name user-emacs-directory) "save-place")))
(require 'flyspell)
(load-after "flyspell"
(add-hook 'text-mode-hook #'turn-on-flyspell)
(defun turn-on-flyspell-prog-mode ()
(flyspell-prog-mode))
(add-hook 'prog-mode-hook #'turn-on-flyspell-prog-mode))
(require 'ispell)
(load-after "ispell"
(setq ispell-program-name "aspell"
ispell-dictionary "en_GB"
ispell-parser 'tex
ispell-extra-args '("--sug-mode=ultra")))
(require 'eldoc)
(load-after "eldoc"
(defun turn-on-eldoc-mode ()
(eldoc-mode 1))
(add-hook 'emacs-lisp-mode-hook #'turn-on-eldoc-mode))
(require 'midnight)
(require 'hideshow)
(load-after "hideshow"
(setq hs-hide-comments nil
hs-isearch-open t
hs-set-up-overlay #'display-code-line-count)
(defun toggle-selective-display (column)
(interactive "P")
(set-selective-display
(or column
(unless selective-display
(1+ (current-column))))))
(defun toggle-hiding (column)
(interactive "P")
(if hs-minor-mode
(if (condition-case nil
(hs-toggle-hiding)
(error t))
(hs-show-all))
(toggle-selective-display column)))
(defun display-code-line-count (ov)
(when (eq 'code (overlay-get ov 'hs))
(overlay-put ov 'display
(format "... / %d" (count-lines (overlay-start ov)
(overlay-end ov))))))
(defun turn-on-hideshow-mode ()
(hs-minor-mode 1))
(add-hook 'prog-mode-hook #'turn-on-hideshow-mode))
(require 'imenu)
(load-after "imenu"
(defun ido-jump-to-symbol (&optional symbol-list)
(interactive)
(unless (featurep 'imenu)
(require 'imenu nil t))
(cond
((not symbol-list)
(let ((ido-mode ido-mode)
(ido-enable-flex-matching
(if (boundp 'ido-enable-flex-matching)
ido-enable-flex-matching t))
name-and-pos symbol-names position)
(unless ido-mode
(ido-mode 1)
(setq ido-enable-flex-matching t))
(while (progn
(imenu--cleanup)
(setq imenu--index-alist nil)
(ido-jump-to-symbol (imenu--make-index-alist))
(setq selected-symbol (ido-completing-read "Jump to: " symbol-names))
(string= (car imenu--rescan-item) selected-symbol)))
(unless (and (boundp 'mark-active) mark-active)
(push-mark nil t nil))
(setq position (cdr (assoc selected-symbol name-and-pos)))
(cond
((overlayp position) (goto-char (overlay-start position)))
(t (goto-char position)))))
((listp symbol-list)
(dolist (symbol symbol-list)
(let (name position)
(cond
((and (listp symbol) (imenu--subalist-p symbol)) (ido-jump-to-symbol symbol))
((listp symbol) (setq name (car symbol)) (setq position (cdr symbol)))
((stringp symbol) (setq name symbol) (setq position (get-text-property 1 'org-imenu-marker symbol))))
(unless (or (null position) (null name) (string= (car imenu--rescan-item) name))
(add-to-list 'symbol-names name) (add-to-list 'name-and-pos (cons name position))))))))
(global-set-key (kbd "C-c C-j") #'ido-jump-to-symbol))
(autoload 'ido-switch-buffer "ido" "Interactively do things!" t)
(load-after "ido"
(ido-mode 1)
(ido-everywhere 1)
(setq ido-enable-flex-matching 1
ido-use-virtual-buffers 1
ido-create-new-buffer 'always
ido-case-fold 1
ido-show-dot-for-dired 1))
(autoload 'ibuffer "ibuffer" "Interactively list buffers." t)
(load-after "ibuffer"
(require 'ibuf-ext)
(setq ibuffer-show-empty-filter-groups nil
ibuffer-default-sorting-mode 'filename/process
ibuffer-sorting-mode 'recency
ibuffer-expert 1
ibuffer-always-show-last-buffer 1
ibuffer-display-summary 1
ibuffer-case-fold-search 1
ibuffer-old-time 24
ibuffer-truncate-lines 1
ibuffer-use-header-line 1
;; ibuffer-use-other-window 1
ibuffer-directory-abbrev-alist `((,(expand-file-name user-emacs-directory) . "~/.emacs.d/")
(,(expand-file-name "~/.config-scripts/") . "~/.conf/")
(,(expand-file-name user-documents-directory) . "~/Documents/")
(,(expand-file-name user-projects-directory) . "~/Public/"))
ibuffer-saved-filter-groups `(("default"
("Configuration"
(or (filename . ,(expand-file-name user-emacs-directory))
(filename . ,(expand-file-name "~/.config-scripts/"))))
("Projects"
(filename . ,(expand-file-name user-projects-directory)))
("Documents"
(filename . ,(expand-file-name user-documents-directory)))
("Miscellaneous"
(or (name . "\\*scratch\\*$")
(mode . ibuffer-mode)
(mode . customize-mode)
(mode . Custom-mode)
(mode . help-mode)
(mode . messages-buffer-mode))))))
(add-to-list 'ibuffer-never-show-predicates " ^\\*Minibuf-0\\*$")
(add-to-list 'ibuffer-never-show-predicates " ^\\*Minibuf-1\\*$")
(add-to-list 'ibuffer-never-show-predicates "^\\*Completions\\*$")
(add-to-list 'ibuffer-never-show-predicates "^\\*Backtrace\\*$")
(defun turn-on-custom-ibuffer-mode ()
(ibuffer-auto-mode 1)
(ibuffer-switch-to-saved-filter-groups "default"))
(add-hook 'ibuffer-mode-hook #'turn-on-custom-ibuffer-mode))
;; (autoload 'eshell "eshell" "Shell written in Emacs Lisp." t)
;; (load-after "eshell"
;; (setq eshell-prompt-function #'custom-eshell-prompt)
;; (defmacro with-face (string &rest properties)
;; `(propertize ,string 'face (list ,@properties)))
;; (defun custom-eshell-prompt ()
;; (format "%s@%s:%s%s%s"
;; (with-face user-login-name :foreground "red" :weight 'bold)
;; (with-face (car (split-string system-name "\\.")) :foreground "green" :weight 'bold)
;; (with-face (eshell/pwd) :foreground "blue" :weight 'bold)
;; (if (= (user-uid) 0)
;; (with-face " #" :foreground "red")
;; "$")
;; " ")))
(require 'dired)
(load-after "dired"
(require 'dired-x)
(setq dired-listing-switches "--color=auto -DaGghlv --group-directories-first --time-style=long-iso"
dired-dwim-target t
dired-omit-files (concat dired-omit-files "\\|^\\..+$"))
(defun turn-on-custom-dired-mode-bindings ()
(define-key dired-mode-map (kbd "<return>") #'dired-find-alternate-file)
(define-key dired-mode-map (kbd "^") #'(lambda () (interactive) (find-alternate-file ".."))))
(defun turn-on-custom-dired-mode ()
(turn-on-custom-dired-mode-bindings)
(dired-hide-details-mode)
(dired-omit-mode))
(add-hook 'dired-mode-hook #'turn-on-custom-dired-mode))
(autoload 'org-mode "org" "Outline based notes management and organizer." t)
(load-after "org"
(setq org-return-follow-links 1
org-completion-use-ido 1
org-cycle-separator 1
org-directory user-documents-directory
org-default-notes-file user-notes-file
org-agenda-include-diary nil
org-agenda-inhibit-startup 1
org-agenda-span 'month
org-agenda-files `(,(expand-file-name user-notes-file))
org-confirm-babel-evaluate nil
org-src-fontify-natively 1
org-src-tab-acts-natively 1
org-export-in-background 1
org-export-with-toc nil
org-export-with-tasks nil
org-export-with-todo-keywords nil
org-latex-listings 1
org-tag-alist '(("NOTES" . ?n)
("TASKS" . ?t))
org-capture-templates '(("N" "Note" entry (file+headline (expand-file-name user-notes-file) "Notes")
"*** %^{Title} %^g\n%^{Text}\n\n" :empty-lines 1 :immediate-finish 1)
("T" "Task" entry (file+headline (expand-file-name user-notes-file) "Tasks")
"*** TODO %^{Description} %^g\n%^{Text}\n\n" :empty-lines 1 :immediate-finish 1)))
(add-to-list 'org-latex-packages-alist '("" "listings"))
(add-to-list 'org-latex-packages-alist '("" "color"))
(org-babel-do-load-languages 'org-babel-do-load-languages
'((emacs-lisp . t)
(sh . t)))
(defun surrounded-by-p (char)
(save-excursion
(and (forward-word -1)
(equal char (char-before))
(forward-word 1)
(equal char (char-after)))))
(defun surround-word (char &optional force)
(save-excursion
(if (not (surrounded-by-p char))
(progn
(forward-word 1)
(insert char)
(forward-word -1)
(insert char)
t)
(forward-word 1)
(delete-char 1)
(forward-word -1)
(delete-char -1)
nil)))
(defmacro org-propertise-word (prop char)
`(defun ,(intern (format "org-%s-word" prop)) (&optional force)
(interactive "p")
(surround-word ,char force)))
(org-propertise-word bold ?*)
(org-propertise-word italic ?/)
(org-propertise-word underline ?_)
(org-propertise-word verbatim ?~)
(org-propertise-word teletype ?=)
(defun turn-on-custom-org-mode-bindings ()
(define-key org-mode-map (kbd "C-c b") #'org-bold-word)
(define-key org-mode-map (kbd "C-c i") #'org-italic-word)
(define-key org-mode-map (kbd "C-c u") #'org-underline-word)
(define-key org-mode-map (kbd "C-c v") #'org-verbatim-word)
(define-key org-mode-map (kbd "C-c t") #'org-teletype-word))
(defun turn-on-custom-org-mode ()
(org-toggle-pretty-entities)
(turn-on-custom-org-mode-bindings))
(add-hook 'org-mode-hook #'turn-on-custom-org-mode)
(defun turn-on-hl-line-mode ()
(hl-line-mode 1))
(add-hook 'org-agenda-mode-hook #'turn-on-hl-line-mode 'append))
(autoload 'python-mode "python" "Python development." t)
(load-after "python"
(setq python-shell-interpreter "python3"))
(autoload 'magit-status "magit" "Manage git repositories." t)
(load-after "magit"
;;(setq magit-completing-read-function #'magit-ido-completing-read)
(diminish 'auto-revert-mode ""))
(autoload 'gist-region "gist" "Gist!" t)
(load-after "gist")
(autoload 'gfm-mode "markdown-mode" "GitHub flavoured markdown." t)
(autoload 'undo-tree-visualize "undo-tree" "Display undo information." t)
(load-after "undo-tree"
(setq undo-tree-auto-save-history 1
undo-tree-history-directory-alist `((".*" . ,(concat (expand-file-name user-emacs-directory) "undo-history")))))
(autoload 'browse-kill-ring "browse-kill-ring" "Browse kill ring." t)
(load-after "browse-kill-ring"
(setq browse-kill-ring-highlight-inserted-item 1
browse-kill-ring-show-preview 1))
(require 'adaptive-wrap)
(load-after "adaptive-wrap"
(defun turn-on-adaptive-wrap-prefix-mode ()
(adaptive-wrap-prefix-mode 1))
(add-hook 'text-mode-hook #'turn-on-adaptive-wrap-prefix-mode))
(require 'projectile)
(load-after "projectile"
(projectile-mode 1))
(require 'slime-autoloads)
(load-after "slime"
(setq inferior-lisp-program "~/Public/ccl/armcl"
slime-startup-animation nil
slime-repl-history-file (concat (expand-file-name user-emacs-directory) "slime-history"))
(slime-setup '(slime-fancy)))
(require 'yasnippet)
(load-after "yasnippet"
(yas-global-mode 1))
(require 'auto-complete)
(load-after "auto-complete"
(ac-config-default)
(setq ac-auto-start nil
ac-auto-show-menu nil
ac-delay 1.0
ac-candidate-limit 10)
(defun ac-add-yasnippet-source ()
(add-to-list 'ac-sources 'ac-source-yasnippet))
(add-hook 'prog-mode-hook #'ac-add-yasnippet-source)
(global-auto-complete-mode 1))
(require 'diminish)
(load-after "diminish"
(diminish 'flyspell-mode "")
(diminish 'visual-line-mode "")
(diminish 'yas-minor-mode "")
(diminish 'auto-complete-mode "")
(diminish 'abbrev-mode "")
(diminish 'eldoc-mode "")
(diminish 'hs-minor-mode ""))
(defun complete-string (source)
(cond
((fboundp #'auto-complete) (auto-complete source))
(t (dabbrev-expand source))))
(defun smart-tab ()
(interactive)
(if (minibufferp)
(unless (minibuffer-complete)
(complete-string nil))
(if mark-active
(indent-region (region-beginning) (region-end))
(if (looking-at "\\_>")
(complete-string nil)
(indent-for-tab-command)))))
(global-set-key (kbd "TAB") #'smart-tab)
(global-set-key (kbd "C-x C-b") #'ibuffer)
(global-set-key (kbd "C-x b") #'ido-switch-buffer)
(global-set-key (kbd "C-z") #'undo-tree-visualize)
(global-set-key (kbd "M-+") #'toggle-hiding)
;; (global-set-key (kbd "C-c o a") #'org-agenda)
;; (global-set-key (kbd "C-c o c") #'org-capture)
;; (global-set-key (kbd "C-c o b") #'org-iswitchb)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment