X-Git-Url: https://git.donarmstrong.com/?p=lib.git;a=blobdiff_plain;f=emacs_el%2Fconfiguration%2Fdon-configuration.org;h=e9b962c70cd52f580753485b5174653864aae21f;hp=0e26c2ab1e115df9174c20f24b94d2c20fcfb02d;hb=bc8ab5fa2e2107be64a9d0399b603607731caac5;hpb=083047b4e1ea03ea932d86185da345ae18de78bd diff --git a/emacs_el/configuration/don-configuration.org b/emacs_el/configuration/don-configuration.org index 0e26c2a..e9b962c 100644 --- a/emacs_el/configuration/don-configuration.org +++ b/emacs_el/configuration/don-configuration.org @@ -7,33 +7,68 @@ #+BEGIN_SRC emacs-lisp (setq debug-on-event 'siguser2) #+END_SRC -* Add library paths - +* Initial startup stuff +** Disable startup screen #+BEGIN_SRC emacs-lisp - (add-to-list 'load-path '"~/lib/emacs_el/") - (add-to-list 'load-path '"~/lib/emacs_el/tiny-tools/lisp/tiny") - (add-to-list 'load-path '"~/lib/emacs_el/tiny-tools/lisp/other") - (add-to-list 'load-path '"~/lib/emacs_el/magit-annex") + (setq inhibit-startup-screen t) +#+END_SRC +** Disable cluter +#+BEGIN_SRC emacs-lisp + ; (if (fboundp 'menu-bar-mode) (menu-bar-mode -1)) + (if (fboundp 'tool-bar-mode) (tool-bar-mode -1)) + (if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1)) +#+END_SRC +** Fullscreen +#+BEGIN_SRC emacs-lisp + (setq frame-resize-pixelwise t) + (add-to-list 'default-frame-alist '(fullscreen . maximixed)) #+END_SRC - * Package management ** package repositories and package manager +Borrowed from https://github.com/nilcons/emacs-use-package-fast/ to +load [[https://github.com/jwiegley/use-package/][use-package]] even faster #+BEGIN_SRC emacs-lisp - (require 'package) + (setq package-enable-at-startup nil) + (setq package--init-file-ensured t) + (eval-and-compile + (setq use-package-verbose (not (bound-and-true-p byte-compile-current-file)))) + (mapc #'(lambda (add) (add-to-list 'load-path add)) + (eval-when-compile + (package-initialize) + (unless (package-installed-p 'use-package) + (package-refresh-contents) + (package-install 'use-package)) + (let ((package-user-dir-real (file-truename package-user-dir))) + ;; The reverse is necessary, because outside we mapc + ;; add-to-list element-by-element, which reverses. + (nreverse (apply #'nconc + ;; Only keep package.el provided loadpaths. + (mapcar #'(lambda (path) + (if (string-prefix-p package-user-dir-real path) + (list path) + nil)) + load-path)))))) + (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/") - ("melpa" . "https://melpa.org/packages/") - ("org" . "http://orgmode.org/elpa/") )) -#+END_SRC -** [[https://github.com/jwiegley/use-package/][use-package]] -#+BEGIN_SRC emacs-lisp - (package-initialize) + ("melpa" . "https://melpa.org/packages/") + ("org" . "http://orgmode.org/elpa/") )) (require 'use-package) + (require 'diminish) + (require 'bind-key) #+END_SRC ** Paradox #+BEGIN_SRC emacs-lisp (use-package paradox :ensure paradox - ) + :commands (paradox-upgrade-packages paradox-list-packages) + :config (setq paradox-execute-asynchronously t) + ) +#+END_SRC +* Add library paths + +#+BEGIN_SRC emacs-lisp + (add-to-list 'load-path '"~/lib/emacs_el/") + (add-to-list 'load-path '"~/lib/emacs_el/magit-annex") #+END_SRC * Disable custom-vars #+BEGIN_SRC emacs-lisp @@ -78,13 +113,18 @@ (add-hook 'minibuffer-exit-hook #'don/minibuffer-exit-hook) #+END_SRC * Modules +** Hippie Expand +#+BEGIN_SRC emacs-lisp + (use-package hippie-expand + :bind* (("M-" . hippie-expand)) + ) +#+END_SRC ** Flyspell 🐝 #+BEGIN_SRC emacs-lisp (use-package flyspell :ensure t :diminish flyspell-mode 🐝 :config - (add-hook 'message-mode-hook 'turn-on-flyspell) (add-hook 'text-mode-hook 'turn-on-flyspell) (add-hook 'c-mode-common-hook 'flyspell-prog-mode) (add-hook 'cperl-mode-hook 'flyspell-prog-mode) @@ -94,6 +134,12 @@ ) #+END_SRC +** Flymake +#+begin_src emacs-lisp :tangle yes + (use-package flymake + :diminish "Φ") +#+end_src + ** Winnermode #+BEGIN_SRC emacs-lisp (winner-mode 1) @@ -101,48 +147,48 @@ ** Eyebrowse #+BEGIN_SRC emacs-lisp - ;; (use-package eyebrowse - ;; :ensure t - ;; :diminish eyebrowse-mode - ;; :init (setq eyebrowse-keymap-prefix (kbd "C-c C-\\")) - ;; :config (progn - ;; (setq eyebrowse-wrap-around t) - ;; (eyebrowse-mode t) - ;; - ;; (defun my/eyebrowse-new-window-config () - ;; (interactive) - ;; (let ((done nil)) - ;; (dotimes (i 10) - ;; ;; start at 1 run till 0 - ;; (let ((j (mod (+ i 1) 10))) - ;; (when (and (not done) - ;; (not (eyebrowse--window-config-present-p j))) - ;; (eyebrowse-switch-to-window-config j) - ;; (call-interactively 'eyebrowse-rename-window-config2 j) - ;; (setq done t) - ;; )) - ;; ))) - ;; - ;; ;; I don't use latex-preview-pane - ;; ;; (require 'latex-preview-pane) - ;; ;; (defun my/close-latex-preview-pane-before-eyebrowse-switch () - ;; ;; ;; latex-preview-pane uses window-parameters which are - ;; ;; ;; not preserved by eyebrowse, so we close the preview - ;; ;; ;; pane before switching, it will be regenerated when we - ;; ;; ;; edit the TeX file. - ;; ;; (when (lpp/window-containing-preview) - ;; ;; (delete-window (lpp/window-containing-preview)))) - ;; - ;; ;; (add-to-list 'eyebrowse-pre-window-switch-hook - ;; ;; #'my/close-latex-preview-pane-before-eyebrowse-switch) - ;; - ;; ;; (my/set-menu-key "[" #'my/eyebrowse-new-window-config) - ;; ;; (my/set-menu-key ";" #'eyebrowse-prev-window-config) - ;; ;; (my/set-menu-key "'" #'eyebrowse-next-window-config) - ;; ;; (my/set-menu-key "]" #'eyebrowse-close-window-config) - ;; ;; (my/set-menu-key "\\" #'eyebrowse-rename-window-config) - ;; ) - ;; ) + (use-package eyebrowse + :ensure t + :diminish eyebrowse-mode + :init (setq eyebrowse-keymap-prefix (kbd "C-c e")) + :config (progn + (setq eyebrowse-wrap-around t) + (eyebrowse-mode t) + + (defun my/eyebrowse-new-window-config () + (interactive) + (let ((done nil)) + (dotimes (i 10) + ;; start at 1 run till 0 + (let ((j (mod (+ i 1) 10))) + (when (and (not done) + (not (eyebrowse--window-config-present-p j))) + (eyebrowse-switch-to-window-config j) + (call-interactively 'eyebrowse-rename-window-config2 j) + (setq done t) + )) + ))) + + ;; I don't use latex-preview-pane + ;; (require 'latex-preview-pane) + ;; (defun my/close-latex-preview-pane-before-eyebrowse-switch () + ;; ;; latex-preview-pane uses window-parameters which are + ;; ;; not preserved by eyebrowse, so we close the preview + ;; ;; pane before switching, it will be regenerated when we + ;; ;; edit the TeX file. + ;; (when (lpp/window-containing-preview) + ;; (delete-window (lpp/window-containing-preview)))) + + ;; (add-to-list 'eyebrowse-pre-window-switch-hook + ;; #'my/close-latex-preview-pane-before-eyebrowse-switch) + + ;; (my/set-menu-key "[" #'my/eyebrowse-new-window-config) + ;; (my/set-menu-key ";" #'eyebrowse-prev-window-config) + ;; (my/set-menu-key "'" #'eyebrowse-next-window-config) + ;; (my/set-menu-key "]" #'eyebrowse-close-window-config) + ;; (my/set-menu-key "\\" #'eyebrowse-rename-window-config) + ) + ) #+END_SRC ** Window handling @@ -308,11 +354,9 @@ value, scrolling continues until there is no more output. #+BEGIN_SRC emacs-lisp ;; load tinyprocmail (use-package tinyprocmail - :ensure f - :config (with-library 'tinyprocmail - ;; (setq tinyprocmail--procmail-version "v3.22") - (add-hook 'tinyprocmail--load-hook 'tinyprocmail-install)) - ) + :load-path "~/lib/emacs_el/tiny-tools/lisp/tiny" + :mode (".procmailrc" . turn-on-tinyprocmail-mode) + ) #+END_SRC ** Magit @@ -322,25 +366,17 @@ value, scrolling continues until there is no more output. :bind (("C-x g" . magit-status) ("C-x C-g" . magit-status)) :config - ;; don't verify where we are pushing - (setq magit-push-always-verify nil) ;; refine diffs always (hilight words) (setq magit-diff-refine-hunk nil) - ;; load magit-annex - (setq load-path - (append '("~/lib/emacs_el/magit-annex") - load-path)) - ;; load magit-vcsh - (setq load-path - (append '("~/lib/emacs_el/magit-vcsh") - load-path)) ) (use-package magit-annex :ensure t - ) + :load-path "~/lib/emacs_el/magit-annex/" + ) (use-package magit-vcsh :ensure f ; currently not in melpa, so don't try to install - ) + :load-path "~/lib/emacs_el/magit-vcsh/" + ) #+END_SRC ** Perl @@ -371,17 +407,107 @@ value, scrolling continues until there is no more output. )) #+END_SRC +** Markdown mode +#+BEGIN_SRC emacs-lisp + (use-package markdown-mode + :ensure t + :mode (("\\.md\\'" . markdown-mode) + ("\\.mdwn\\'" . markdown-mode) + ("README\\.md\\'" . gfm-mode) + ) + :config + (setq markdown-enable-math t) + (setq markdown-follow-wiki-link-on-enter nil) + (bind-key "M-." #'markdown-jump markdown-mode-map) + (add-hook 'markdown-mode-hook #'flyspell-mode) + (add-hook 'markdown-mode-hook #'outline-minor-mode) + (bind-key "C-" #'outline-cycle markdown-mode-map) + ) + +#+END_SRC +** SQL mode +#+BEGIN_SRC emacs-lisp + ; load sql-indent when sql is loaded +(use-package sql + :mode (("\\.sql\\'" . sql-mode)) + :config + (require sql-indent)) +#+END_SRC +** Ediff +#+BEGIN_SRC emacs-lisp + (use-package ediff + :commands ediff ediff3 + :ensure f + :config + ;; ediff configuration + ;; don't use the multi-window configuration + (setq ediff-window-setup-function 'ediff-setup-windows-plain) + ) +#+END_SRC +** VCL --editing varnish configuration files +#+BEGIN_SRC emacs-lisp + (use-package vcl-mode + :ensure t + :mode "\\.vcl\\'" + ) + +#+END_SRC ** Helm #+BEGIN_SRC emacs-lisp + (defun malb/helm-omni (&rest arg) + ;; just in case someone decides to pass an argument, helm-omni won't fail. + (interactive) + (unless helm-source-buffers-list + (setq helm-source-buffers-list + (helm-make-source "Buffers" 'helm-source-buffers))) + (helm-other-buffer + (append + + (if (projectile-project-p) + '(helm-source-projectile-buffers-list + helm-source-buffers-list) + '(helm-source-buffers-list)) ;; list of all open buffers + + `(((name . "Virtual Workspace") + (candidates . ,(--map (cons (eyebrowse-format-slot it) (car it)) + (eyebrowse--get 'window-configs))) + (action . (lambda (candidate) + (eyebrowse-switch-to-window-config candidate))))) + + (if (projectile-project-p) + '(helm-source-projectile-recentf-list + helm-source-recentf) + '(helm-source-recentf)) ;; all recent files + + ;; always make some common files easily accessible + ;;'(((name . "Common Files") + ;; (candidates . malb/common-file-targets) + ;; (action . (("Open" . (lambda (x) (find-file (eval x)))))))) + + '(helm-source-files-in-current-dir + helm-source-locate + helm-source-bookmarks + helm-source-buffer-not-found ;; ask to create a buffer otherwise + )) + "*Helm all the things*")) (use-package helm - :ensure t + :ensure helm + :diminish helm-mode + :bind (("M-x" . helm-M-x) + ("C-x C-f" . helm-find-files) + ("C-x b" . helm-buffers-list) ; malb/helm-omni) + ("C-x C-b" . helm-buffers-list) ; malb/helm-omni) + ("C-c " . helm-all-mark-rings)) :config + (require 'helm-config) + (require 'helm-for-files) + (require 'helm-bookmark) + (helm-mode 1) (define-key global-map [remap find-file] 'helm-find-files) (define-key global-map [remap occur] 'helm-occur) (define-key global-map [remap list-buffers] 'helm-buffers-list) (define-key global-map [remap dabbrev-expand] 'helm-dabbrev) - (global-set-key (kbd "M-x") 'helm-M-x) (unless (boundp 'completion-in-region-function) (define-key lisp-interaction-mode-map [remap completion-at-point] 'helm-lisp-completion-at-point) (define-key emacs-lisp-mode-map [remap completion-at-point] 'helm-lisp-completion-at-point)) @@ -416,48 +542,50 @@ value, scrolling continues until there is no more output. ;;; stolen from https://github.com/malb/emacs.d/blob/master/malb.org (defun malb/helm-swoop-pre-fill () (thing-at-point 'symbol)) - (setq malb/helm-swoop-ignore-major-mode '(dired-mode - paradox-menu-mode doc-view-mode pdf-view-mode - mu4e-headers-mode org-mode markdown-mode latex-mode - ein:notebook-multilang-mode)) + (defvar malb/helm-swoop-ignore-major-mode "List of major modes to ignore for helm-swoop") + (setq malb/helm-swoop-ignore-major-mode '(dired-mode + paradox-menu-mode doc-view-mode pdf-view-mode + mu4e-headers-mode org-mode markdown-mode latex-mode + ein:notebook-multilang-mode)) - (defun malb/swoop-or-search () - (interactive) - (if (or (> (buffer-size) 1048576) ;; helm-swoop can be slow on big buffers - (memq major-mode malb/helm-swoop-ignore-major-mode)) - (isearch-forward) - (helm-swoop))) + (defun malb/swoop-or-search () + (interactive) + (if (or (> (buffer-size) 1048576) ;; helm-swoop can be slow on big buffers + (memq major-mode malb/helm-swoop-ignore-major-mode)) + (isearch-forward) + (helm-swoop))) + + (use-package helm-swoop + :ensure t + :commands helm-swoop + :bind (("C-c o" . helm-multi-swoop-org) + ("C-s" . malb/swoop-or-search) + ("C-M-s" . helm-multi-swoop-all)) + :config (progn + + (setq helm-swoop-pre-input-function #'malb/helm-swoop-pre-fill + helm-swoop-split-with-multiple-windows nil + helm-swoop-split-direction #'split-window-horizontally + helm-swoop-split-window-function 'helm-default-display-buffer + helm-swoop-speed-or-color t) + + ;; https://emacs.stackexchange.com/questions/28790/helm-swoop-how-to-make-it-behave-more-like-isearch + (defun malb/helm-swoop-C-s () + (interactive) + (if (boundp 'helm-swoop-pattern) + (if (equal helm-swoop-pattern "") + (previous-history-element 1) + (helm-next-line)) + (helm-next-line))) + + (bind-key "C-S-s" #'helm-swoop-from-isearch isearch-mode-map) + (bind-key "C-S-s" #'helm-multi-swoop-all-from-helm-swoop helm-swoop-map) + (bind-key "C-r" #'helm-previous-line helm-swoop-map) + (bind-key "C-s" #'malb/helm-swoop-C-s helm-swoop-map) + (bind-key "C-r" #'helm-previous-line helm-multi-swoop-map) + (bind-key "C-s" #'malb/helm-swoop-C-s helm-multi-swoop-map)) + ) - (use-package helm-swoop - :ensure t - :bind (("C-c o" . helm-multi-swoop-org) - ("C-s" . malb/swoop-or-search) - ("C-M-s" . helm-multi-swoop-all)) - :config (progn - - (setq helm-swoop-pre-input-function #'malb/helm-swoop-pre-fill - helm-swoop-split-with-multiple-windows nil - helm-swoop-split-direction #'split-window-horizontally - helm-swoop-split-window-function 'helm-default-display-buffer - helm-swoop-speed-or-color t) - - ;; https://emacs.stackexchange.com/questions/28790/helm-swoop-how-to-make-it-behave-more-like-isearch - (defun malb/helm-swoop-C-s () - (interactive) - (if (boundp 'helm-swoop-pattern) - (if (equal helm-swoop-pattern "") - (previous-history-element 1) - (helm-next-line)) - (helm-next-line))) - - (bind-key "C-S-s" #'helm-swoop-from-isearch isearch-mode-map) - (bind-key "C-S-s" #'helm-multi-swoop-all-from-helm-swoop helm-swoop-map) - (bind-key "C-r" #'helm-previous-line helm-swoop-map) - (bind-key "C-s" #'malb/helm-swoop-C-s helm-swoop-map) - (bind-key "C-r" #'helm-previous-line helm-multi-swoop-map) - (bind-key "C-s" #'malb/helm-swoop-C-s helm-multi-swoop-map)) - ) - #+END_SRC *** Helm Ag #+BEGIN_SRC emacs-lisp @@ -500,10 +628,148 @@ value, scrolling continues until there is no more output. ((equal arg 16) (helm-org-rifle-occur-agenda-files)) (t (helm-org-agenda-files-headings))))))) #+END_SRC +*** Helm Google +This can be used to link things pretty quickly if necessary +#+BEGIN_SRC emacs-lisp + (use-package helm-google + :ensure t + :bind ("C-c h g" . helm-google) + :config + (progn (add-to-list 'helm-google-actions + '("Copy URL" . (lambda (candidate) + (let ((url + (replace-regexp-in-string + "https://.*q=\\(.*\\)\&sa=.*" + "\\1" candidate))) + (kill-new url)))) + t + ) + + (add-to-list 'helm-google-actions + '("Org Store Link" . (lambda (candidate) + (let ((title (car (split-string candidate "[\n]+"))) + (url + (replace-regexp-in-string + "https://.*q=\\(.*\\)\&sa=.*" + "\\1" candidate))) + (push (list url title) org-stored-links)))) + t) + )) +#+END_SRC + +** Projectile -- Project management +#+begin_src emacs-lisp + (use-package projectile + :ensure t + :bind (("" . projectile-compile-project) + ("" . next-error)) + :config (progn + (use-package magit :ensure t) + (require 'helm-projectile) + (helm-projectile-on) + + (setq projectile-make-test-cmd "make check" + projectile-switch-project-action 'helm-projectile + projectile-mode-line '(:eval (format "»{%s}" (projectile-project-name)))) + (projectile-global-mode))) +#+end_src + +*** helm integration +#+begin_src emacs-lisp + (use-package helm-projectile + :ensure t + :config (progn + (defvar malb/helm-source-file-not-found + (helm-build-dummy-source + "Create file" + :action 'find-file)) + + (add-to-list + 'helm-projectile-sources-list + malb/helm-source-file-not-found t) + + (helm-delete-action-from-source + "Grep in projects `C-s'" + helm-source-projectile-projects) + + (helm-add-action-to-source + "Grep in projects `C-s'" + 'helm-do-ag helm-source-projectile-projects 4))) +#+end_src +** Zap to char +#+BEGIN_SRC emacs-lisp + (use-package avy-zap + :ensure t + :bind ("M-z" . avy-zap-up-to-char-dwim)) +#+END_SRC ** Hydra -#+BEGIN_SRC emacs-lisp :tangle don-configuration.el -(require 'don-hydra) +#+BEGIN_SRC emacs-lisp + (use-package hydra + :bind (("C-c 2" . my/hydra-orgmodes/body) + ("C-c @" . my/hydra-orgmodes/body) + ("C-c #" . my/hydra-outline/body) + ("C-c 3" . my/hydra-outline/body) + ) + :config + (defhydra my/hydra-orgmodes (:color blue :hint nil) + " + _n_: notes _c_: chaim _w_: wildman _o_: ool + _u_: uddin _s_: steve _r_: refile _f_: fh + _p_: read papers _R_: paper notes + _h_: hpcbio + _q_: quit + _z_: quit + " + ("n" (find-file "~/projects/org-notes/notes.org")) + ("c" (find-file "~/projects/org-notes/chaim.org")) + ("w" (find-file "~/projects/org-notes/wildman.org")) + ("u" (find-file "~/projects/org-notes/uddin.org")) + ("o" (find-file "~/projects/org-notes/ool.org")) + ("f" (find-file "~/projects/org-notes/fh.org")) + ("s" (find-file "~/projects/org-notes/sndservers.org")) + ("r" (find-file "~/projects/org-notes/refile.org")) + ("p" (find-file "~/projects/research/papers_to_read.org")) + ("R" (find-file "~/projects/research/paper_notes.org")) + ("h" (find-file "~/projects/org-notes/hpcbio.org")) + ("q" nil "quit") + ("z" nil "quit") + ) + + ;; from https://github.com/abo-abo/hydra/wiki/Emacs + (defhydra my/hydra-outline (:color pink :hint nil) + " + ^Hide^ ^Show^ ^Move + ^^^^^^------------------------------------------------------ + _q_: sublevels _a_: all _u_: up + _t_: body _e_: entry _n_: next visible + _o_: other _i_: children _p_: previous visible + _c_: entry _k_: branches _f_: forward same level + _l_: leaves _s_: subtree _b_: backward same level + _d_: subtree + + " + ;; Hide + ("q" outline-hide-sublevels) ; Hide everything but the top-level headings + ("t" outline-hide-body) ; Hide everything but headings (all body lines) + ("o" outline-hide-other) ; Hide other branches + ("c" outline-hide-entry) ; Hide this entry's body + ("l" outline-hide-leaves) ; Hide body lines in this entry and sub-entries + ("d" outline-hide-subtree) ; Hide everything in this entry and sub-entries + ;; Show + ("a" outline-show-all) ; Show (expand) everything + ("e" outline-show-entry) ; Show this heading's body + ("i" outline-show-children) ; Show this heading's immediate child sub-headings + ("k" outline-show-branches) ; Show all sub-headings under this heading + ("s" outline-show-subtree) ; Show (expand) everything in this heading & below + ;; Move + ("u" outline-up-heading) ; Up + ("n" outline-next-visible-heading) ; Next + ("p" outline-previous-visible-heading) ; Previous + ("f" outline-forward-same-level) ; Forward - same level + ("b" outline-backward-same-level) ; Backward - same level + ("z" nil "leave")) + ) #+END_SRC ** Tramp @@ -525,6 +791,17 @@ value, scrolling continues until there is no more output. (setq-default reftex-default-bibliography '("~/projects/research/references.bib"))) #+END_SRC +** BibTex +#+BEGIN_SRC emacs-lisp + (use-package bibtex + :config (setq bibtex-user-optional-fields + (quote (("annote" "Personal annotation (ignored)") + ("abstract" "") + ("pmid" "") + ("doi" "")))) + ) + +#+END_SRC ** LaTeX #+BEGIN_SRC emacs-lisp (use-package tex @@ -626,28 +903,20 @@ value, scrolling continues until there is no more output. ("fixme" "{")) ) ) + (setq font-latex-fontify-script nil) + (setq font-latex-fontify-sectioning (quote color)) + (setq font-latex-script-display (quote (nil))) ) #+END_SRC -*** Org-Gcal -#+BEGIN_SRC emacs-lisp - (use-package calfw - :ensure f - ) - (use-package calfw-org - :ensure f - ) - (use-package org-gcal - :ensure f - :config '((if (file-readable-p "~/.hide/org_gcal.el") - (load-file "~/.hide/org_gcal.el")) - ) - ) -#+END_SRC ** ESS #+BEGIN_SRC emacs-lisp (use-package ess :ensure t + :commands R + :mode "\\.R\\'" + :bind (:map ess-mode-map + ("C-c C-R" . dla/ess-region-remote-eval)) :config (defun ess-change-directory (path) "Set the current working directory to PATH for both *R* and Emacs." @@ -670,11 +939,11 @@ value, scrolling continues until there is no more output. ((looking-at "^[a-zA-Z0-9_\.]+ ?<- ?function(.*{") 3) (t 1000))) )) - (add-hook 'ess-mode-hook - '(lambda () - (local-set-key (kbd "C-c C-R") - 'dla/ess-region-remote-eval))) - + (defun dla/ess-region-remote-eval (start end) + "Evaluate region in a remote ESS instance" + (interactive "r") + (shell-command-on-region start end "eval_r" (get-buffer-create "***essregionremoteeval***")) + kill-buffer "***essregionremoteeval***") ;; Don't restore history or save workspace image '(inferior-R-args "--no-restore-history --no-save") ) @@ -733,7 +1002,8 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ** GhostText/Atomic Chrome #+BEGIN_SRC emacs-lisp (use-package atomic-chrome - :config (atomic-chrome-start-server) + :config + (ignore-errors (atomic-chrome-start-server)) (setq atomic-chrome-buffer-open-style 'full) ) #+END_SRC @@ -744,10 +1014,10 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori [[https://github.com/magnars/multiple-cursors.el][Multiple Cursors]] #+BEGIN_SRC emacs-lisp (use-package multiple-cursors - :bind (("C-;" . mc/mark-all-dwim) - ("C-<" . mc/mark-previous-like-this) - ("C->" . mc/mark-next-like-this) - ("C-S-c C-S-c" . mc/edit-lines)) + :bind* (("C-;" . mc/mark-all-dwim) + ("C-<" . mc/mark-previous-like-this) + ("C->" . mc/mark-next-like-this) + ("C-S-c C-S-c" . mc/edit-lines)) ) #+END_SRC ** Web Mode @@ -760,21 +1030,129 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori '(("template-toolkit" . "\\.tmpl\\'"))) ) #+END_SRC +** Spamassassin Mode +#+BEGIN_SRC emacs-lisp + (use-package spamassassin-mode + :defer + :ensure f + ) +#+END_SRC +** Password Store +#+BEGIN_SRC emacs-lisp + (use-package password-store + :ensure f + :commands password-store-edit password-store-create + ) +#+END_SRC +** CSS mode +#+BEGIN_SRC emacs-lisp + (use-package css + :mode "\\.css'" + :config + ;; fix up css mode to not be silly + ;; from http://www.stokebloke.com/wordpress/2008/03/21/css-mode-indent-buffer-fix/ + (setq cssm-indent-level 4) + (setq cssm-newline-before-closing-bracket t) + (setq cssm-indent-function #'cssm-c-style-indenter) + (setq cssm-mirror-mode nil)) +#+END_SRC +** Abbrev Mode +#+BEGIN_SRC emacs-lisp + (use-package abbrev + :diminish abbrev + :config + ;; load abbreviations from + (setq abbrev-file-name + "~/.emacs_abbrev_def") + + ;; read the abbrev file if it exists + (if (file-exists-p abbrev-file-name) + (quietly-read-abbrev-file)) + + ;; for now, use abbrev mode everywhere + (setq default-abbrev-mode t)) +#+END_SRC + +* Email +** Mutt +*** Message-mode +#+BEGIN_SRC emacs-lisp + (use-package message + :ensure f + :diminish (message "✉") + :mode ("muttng-[a-z0-9]+-[0-9]+-" . message-mode) + :mode ("mutt-[a-z0-9]+-[0-9]+-" . message-mode) + :hook 'my/message-mode-settings + :hook 'turn-on-flyspell + :bind (:map message-mode-map + ("C-c C-a" . my/post-attach-file)) + :delight (message-mode "✉") + :config + (defun my/message-mode-settings () + (font-lock-add-keywords nil + '(("^[ \t]*>[ \t]*>[ \t]*>.*$" + (0 'message-multiply-quoted-text-face)) + ("^[ \t]*>[ \t]*>.*$" + (0 'message-double-quoted-text-face)))) + ) + + (defun my/post-attach-file () + "Prompt for an attachment." + (interactive) + (let ((file (read-file-name "Attach file: " nil nil t nil))) + (my/header-attach-file file ""))) + + (defun my/header-attach-file (file description) + "Attach a FILE to the current message (works with Mutt). + Argument DESCRIPTION MIME description." + (interactive "fAttach file: \nsDescription: ") + (when (> (length file) 0) + (save-excursion + (save-match-data + (save-restriction + (widen) + (goto-char (point-min)) + (search-forward-regexp "^$") + (insert (concat "Attach: " (replace-regexp-in-string "\\([[:space:]\\]\\)" "\\\\\\1" (file-truename file)) " " + description "\n")) + (message (concat "Attached '" file "'.")) + (setq post-has-attachment t)))))) + + (setq mail-yank-prefix "> ") + ) +#+END_SRC +*** Muttrc mode +#+BEGIN_SRC emacs-lisp + (use-package muttrc-mode + :mode "muttngrc" + :mode "muttrc" + ) + +#+END_SRC +* Base emacs +** Reverting buffers +#+BEGIN_SRC emacs-lisp + (setq global-auto-revert-non-file-buffers t + global-auto-revert-ignore-modes '(pdf-view-mode) + auto-revert-verbose nil) + (global-auto-revert-mode 1) +#+END_SRC * Org Mode ** Use-package and load things #+BEGIN_SRC emacs-lisp (use-package org + :delight (org-mode "ø") :config #+END_SRC ** Agenda Configuration #+BEGIN_SRC emacs-lisp - ;; The following lines are always needed. Choose your own keys. - (add-to-list 'auto-mode-alist '("\\.\\(org\\|org_archive\\|txt\\)$" . org-mode)) - (global-set-key "\C-cl" 'org-store-link) - (global-set-key "\C-ca" 'org-agenda) - (global-set-key "\C-cb" 'org-iswitchb) + :mode ("\\.\\(org\\|org_archive\\|txt\\)\\'" . org-mode) + :bind (("C-c l" . org-store-link) + ("C-c a" . org-agenda) + ("C-c b" . org-iswitchb)) + :config (setq-default org-log-done 'time) (setq-default org-agenda-ndays 5) @@ -871,7 +1249,6 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori "~/projects/org-notes/wildman.org" "~/projects/org-notes/uddin.org" "~/projects/org-notes/reviews.org" - "~/projects/org-notes/hpcbio.org" "~/org-mode/from-mobile.org" "~/projects/org-notes/fh.org"))) @@ -890,17 +1267,11 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (with-temp-buffer (dolist (org-agenda-file org-agenda-files) (insert-file-contents org-agenda-file nil) - (end-of-buffer) + (goto-char (point-max)) (newline)) (write-file "/tmp/timeline.org") (org-agenda arg "L"))) (define-key org-mode-map (kbd "C-c t") 'org-agenda-timeline-all) - ;; add automatic reminders for appointments - (defadvice org-agenda-redo (after org-agenda-redo-add-appts) - "Pressing `r' on the agenda will also add appointments." - (progn - (setq appt-time-msg-list nil) - (org-agenda-to-appt))) #+END_SRC ** General config @@ -967,7 +1338,7 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ; org mode configuration from http://doc.norang.ca/org-mode.html ;; Custom Key Bindings (global-set-key (kbd "") 'org-agenda) - (global-set-key (kbd "") 'bh/org-todo) + ; (global-set-key (kbd "") 'bh/org-todo) (global-set-key (kbd "") 'bh/widen) (global-set-key (kbd "") 'bh/set-truncate-lines) (global-set-key (kbd "") 'org-cycle-agenda-files) @@ -1673,62 +2044,96 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (unless (bolp) (insert "\n")))))))))))) #+END_SRC -** End use-package +** Org-Gcal #+BEGIN_SRC emacs-lisp - ) + (use-package calfw + :ensure f + ) + (use-package calfw-org + :ensure f + ) + (use-package org-gcal + :ensure f + :config '((if (file-readable-p "~/.hide/org_gcal.el") + (load-file "~/.hide/org_gcal.el")) + ) + ) #+END_SRC -* Keybindings -** Override other things +** appt integration #+BEGIN_SRC emacs-lisp - ; apparently things like to step on C-;, so we'll use a hack from - ; http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 to fix this - - (defvar my-keys-minor-mode-map (make-keymap) "my-keys-minor-mode keymap.") - - ; use mc everywhere - (define-key my-keys-minor-mode-map (kbd "C-;") 'mc/mark-all-dwim) - ;; use outline mode keybindings everywhere - ;; (define-key my-keys-minor-mode-map (kbd "C-;") 'my/mydra-outline/body) - - (define-minor-mode my-keys-minor-mode - "A minor mode so that my key settings override annoying major modes." - t " my-keys" 'my-keys-minor-mode-map) + (use-package appt + :ensure f + :config + ;; Show notification 10 minutes before event + (setq appt-message-warning-time 10) + ;; Disable multiple reminders + (setq appt-display-interval appt-message-warning-time) + (setq appt-display-mode-line nil) + + ;; add automatic reminders for appointments + (defun my/org-agenda-to-appt () + (interactive) + (setq appt-time-msg-list nil) + (org-agenda-to-appt)) + ;; add reminders when starting emacs + (my/org-agenda-to-appt) + ;; when rebuilding the agenda + (defadvice org-agenda-redo (after org-agenda-redo-add-appts) + "Pressing `r' on the agenda will also add appointments." + (my/org-agenda-to-appt) + ) + ;; when saving all org buffers + (defadvice org-save-all-org-buffers (after org-save-all-org-buffers-add-appts) + "Re-add appts after saving all org buffers" + (my/org-agenda-to-appt)) + ;; Display appointments as a window manager notification + (setq appt-disp-window-function 'my/appt-display) + (setq appt-delete-window-function (lambda () t)) + + (setq my/appt-notification-app (concat (getenv "HOME") "/bin/appt_notification")) + + (defun my/appt-display (min-to-app new-time msg) + (if (atom min-to-app) + (start-process "my/appt-notification-app" nil my/appt-notification-app min-to-app msg) + (dolist (i (number-sequence 0 (1- (length min-to-app)))) + (start-process "my/appt-notification-app" nil my/appt-notification-app + (nth i min-to-app) (nth i msg)))) + ) + ) - (my-keys-minor-mode 1) - (defun my-minibuffer-setup-hook () - (my-keys-minor-mode 0)) - (add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook) - (defadvice load (after give-my-keybindings-priority) - "Try to ensure that my keybindings always have priority." - (if (not (eq (car (car minor-mode-map-alist)) 'my-keys-minor-mode)) - (let ((mykeys (assq 'my-keys-minor-mode minor-mode-map-alist))) - (assq-delete-all 'my-keys-minor-mode minor-mode-map-alist) - (add-to-list 'minor-mode-map-alist mykeys)))) - (ad-activate 'load) #+END_SRC +** End use-package +#+BEGIN_SRC emacs-lisp + ) +#+END_SRC +* Keybindings ** Goto line #+BEGIN_SRC emacs-lisp (global-unset-key "\M-g") (global-set-key (kbd "M-g l") 'goto-line) #+END_SRC +* Debian +** debian-changelog +#+BEGIN_SRC emacs-lisp + (use-package debian-changelog + :ensure f + :mode "debian/changelog" + :config + (setq debian-changelog-mailing-address "don@debian.org") + (setq debian-changelog-full-name "Don Armstrong")) +#+END_SRC * Misc (uncharacterized) #+BEGIN_SRC emacs-lisp - (setq bibtex-user-optional-fields (quote (("annote" "Personal annotation (ignored)") ("abstract" "") ("pmid" "") ("doi" "")))) - (setq calendar-latitude 40.11) - (setq calendar-longitude -88.24) + (setq calendar-latitude 38.6) + (setq calendar-longitude -121.5) (setq case-fold-search t) (setq confirm-kill-emacs (quote y-or-n-p)) (setq cperl-lazy-help-time nil) - (setq debian-changelog-mailing-address "don@debian.org") (display-time) (setq display-time-24hr-format t) (setq display-time-day-and-date t) (display-time-mode 1) - (setq font-latex-fontify-script nil) - (setq font-latex-fontify-sectioning (quote color)) - (setq font-latex-script-display (quote (nil))) - (global-auto-revert-mode 1) (global-font-lock-mode 1) (icomplete-mode 1) (setq log-edit-keep-buffer t) @@ -1736,10 +2141,6 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (setq markdown-enable-math t) (setq markdown-follow-wiki-link-on-enter nil) (setq mutt-alias-file-list (quote ("~/.mutt/aliases" "~/.mail_aliases"))) - (setq post-email-address "don@donarmstrong.com") - (setq post-kill-quoted-sig nil) - (setq post-mail-message "mutt\\(ng\\|\\)-[a-z0-9]+-[0-9]+-.*") - (setq post-uses-fill-mode nil) (setq ps-footer-font-size (quote (8 . 10))) (setq ps-header-font-size (quote (8 . 10))) (setq ps-header-title-font-size (quote (10 . 10))) @@ -1769,91 +2170,9 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (fset 'perl-mode 'cperl-mode) ;;(load-file "cperl-mode.el") - (require 'vcl-mode) - - (require 'tex-site) - ;;(require 'psvn) - ;;(require 'ecasound) - ;;(require 'emacs-wiki) - (require 'bibtex) - (require 'post) - ;;(require 'fixme) - ; (require 'google-weather) - ; (require 'org-google-weather) - ; (setq-default org-google-weather-format "%i %c, [%l,%h] %s %C") - - (global-set-key "\C-xp" 'server-edit) - - (setq-default auto-mode-alist (cons '("\.wml$" . - (lambda () (html-mode) (auto-fill-mode))) - auto-mode-alist)) - - - ; use markdown mode for mdwn files - (add-to-list 'auto-mode-alist '("\\.mdwn$" . markdown-mode)) - (add-to-list 'auto-mode-alist '("\\.md$" . markdown-mode)) - - ;; tramp configuration (setq tramp-use-ssh-controlmaster-options nil) - ; mail configuration - (add-to-list 'auto-mode-alist '("muttng-[a-z0-9]+-[0-9]+-" . message-mode)) - (add-to-list 'auto-mode-alist '("muttngrc" . muttrc-mode)) - - (add-to-list 'auto-mode-alist '("mutt-[a-z0-9]+-[0-9]+-" . message-mode)) - (add-to-list 'auto-mode-alist '("muttrc" . muttrc-mode)) - (defun my-message-mode-settings () - (font-lock-add-keywords nil - '(("^[ \t]*>[ \t]*>[ \t]*>.*$" - (0 'message-multiply-quoted-text-face)) - ("^[ \t]*>[ \t]*>.*$" - (0 'message-double-quoted-text-face)))) - (local-set-key (kbd "C-c C-a") 'my-post-attach-file) - ) - (add-hook 'message-mode-hook 'my-message-mode-settings) - - (defun my-post-attach-file () - "Prompt for an attachment." - (interactive) - (let ((file (read-file-name "Attach file: " nil nil t nil)) - (description (string-read "Description: "))) - (my-header-attach-file file description))) - - (symbol-function 'my-post-attach-file) - - (defun my-header-attach-file (file description) - "Attach a FILE to the current message (works with Mutt). - Argument DESCRIPTION MIME description." - (interactive "fAttach file: \nsDescription: ") - (when (> (length file) 0) - (save-excursion - (save-match-data - (save-restriction - (widen) - (goto-char (point-min)) - (search-forward-regexp "^$") - (insert (concat "Attach: " (replace-regexp-in-string "\\([[:space:]\\]\\)" "\\\\\\1" (file-truename file)) " " - description "\n")) - (message (concat "Attached '" file "'.")) - (setq post-has-attachment t)))))) - - - - (setq mail-yank-prefix "> ") - - ;; self-insert-command hack. - ;; Without this, "if" expands to - ;; if ( -!-) { - ;; } - ;; which really should be, - ;; if (-!-) { - ;; } - - - - ;(load-library "php-mode") - (setq-default c-indent-level 4) (setq-default c-brace-imaginary-offset 0) (setq-default c-brace-offset -4) @@ -1886,59 +2205,8 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ) (column-number-mode t) - - (server-start) - - ; (require 'mode-compile) - - (defadvice server-process-filter (after post-mode-message first activate) - "If the buffer is in post mode, overwrite the server-edit - message with a post-save-current-buffer-and-exit message." - (if (eq major-mode 'post-mode) - (message - (substitute-command-keys "Type \\[describe-mode] for help composing; \\[post-save-current-buffer-and-exit] when done.")))) - ; This is also needed to see the magic message. Set to a higher - ; number if you have a faster computer or read slower than me. - '(font-lock-verbose 1000) - ;(setq-default server-temp-file-regexp "mutt\(-\|ng-\)") - ; (add-hook 'server-switch-hook - ; (function (lambda() - ; (cond ((string-match "Post" mode-name) - ; (post-goto-body))) - ; set-buffer-file-coding-system 'utf-8 - ; ))) - ; - - (add-hook 'post-mode-hook - (auto-fill-mode nil) - ) - ; abbrev mode settings - ; load abbreviations from - (setq abbrev-file-name - "~/.emacs_abbrev_def") - - ; read the abbrev file if it exists - (if (file-exists-p abbrev-file-name) - (quietly-read-abbrev-file)) - - ; for now, use abbrev mode everywhere - (setq default-abbrev-mode t) - - - (defun insert-function-documentation () - "Insert function documentation" - (interactive) - (insert-file-contents "/home/don/lib/templates/perl_function_documentation" nil)) - (global-set-key "\M-f" 'insert-function-documentation) - - (eval-after-load "lilypond-mode" - '(progn - (load-library "lyqi-mode") - (define-key LilyPond-mode-map "\C-cq" 'lyqi-mode))) - - (autoload 'spamassassin-mode "spamassassin-mode" nil t) - - (desktop-load-default) + + (desktop-save-mode) (desktop-read) '(icomplete-mode on) (custom-set-faces @@ -1962,18 +2230,18 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ; Outline-minor-mode key map (define-prefix-command 'cm-map nil "Outline-") ; HIDE - (define-key cm-map "q" 'hide-sublevels) ; Hide everything but the top-level headings - (define-key cm-map "t" 'hide-body) ; Hide everything but headings (all body lines) - (define-key cm-map "o" 'hide-other) ; Hide other branches - (define-key cm-map "c" 'hide-entry) ; Hide this entry's body - (define-key cm-map "l" 'hide-leaves) ; Hide body lines in this entry and sub-entries - (define-key cm-map "d" 'hide-subtree) ; Hide everything in this entry and sub-entries + (define-key cm-map "q" 'outline-hide-sublevels) ; Hide everything but the top-level headings + (define-key cm-map "t" 'outline-hide-body) ; Hide everything but headings (all body lines) + (define-key cm-map "o" 'outline-hide-other) ; Hide other branches + (define-key cm-map "c" 'outline-hide-entry) ; Hide this entry's body + (define-key cm-map "l" 'outline-hide-leaves) ; Hide body lines in this entry and sub-entries + (define-key cm-map "d" 'outline-hide-subtree) ; Hide everything in this entry and sub-entries ; SHOW - (define-key cm-map "a" 'show-all) ; Show (expand) everything - (define-key cm-map "e" 'show-entry) ; Show this heading's body - (define-key cm-map "i" 'show-children) ; Show this heading's immediate child sub-headings - (define-key cm-map "k" 'show-branches) ; Show all sub-headings under this heading - (define-key cm-map "s" 'show-subtree) ; Show (expand) everything in this heading & below + (define-key cm-map "a" 'outline-show-all) ; Show (expand) everything + (define-key cm-map "e" 'outline-show-entry) ; Show this heading's body + (define-key cm-map "i" 'outline-show-children) ; Show this heading's immediate child sub-headings + (define-key cm-map "k" 'outline-show-branches) ; Show all sub-headings under this heading + (define-key cm-map "s" 'outline-show-subtree) ; Show (expand) everything in this heading & below ; MOVE (define-key cm-map "u" 'outline-up-heading) ; Up (define-key cm-map "n" 'outline-next-visible-heading) ; Next @@ -1981,51 +2249,6 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (define-key cm-map "f" 'outline-forward-same-level) ; Forward - same level (define-key cm-map "b" 'outline-backward-same-level) ; Backward - same level (global-set-key "\M-o" cm-map) - - - ; debian stuff - (setq-default debian-changelog-mailing-address "don@debian.org") - (setq-default debian-changelog-full-name "Don Armstrong") - - ; ediff configuration - ; don't use the multi-window configuration - (setq ediff-window-setup-function 'ediff-setup-windows-plain) - - ; fix up css mode to not be silly - ; from http://www.stokebloke.com/wordpress/2008/03/21/css-mode-indent-buffer-fix/ - (setq cssm-indent-level 4) - (setq cssm-newline-before-closing-bracket t) - (setq cssm-indent-function #'cssm-c-style-indenter) - (setq cssm-mirror-mode nil) - - (require 'multi-web-mode) - (setq mweb-default-major-mode 'html-mode) - (setq mweb-tags '((php-mode "<\\?php\\|<\\? \\|<\\?=" "\\?>") - (js-mode "") - (css-mode ""))) - (setq mweb-filename-extensions '("php" "htm" "html" "ctp" "phtml" "php4" "php5")) - (multi-web-global-mode 1) - - ;;; alias the new `flymake-report-status-slim' to - ;;; `flymake-report-status' - (defalias 'flymake-report-status 'flymake-report-status-slim) - (defun flymake-report-status-slim (e-w &optional status) - "Show \"slim\" flymake status in mode line." - (when e-w - (setq flymake-mode-line-e-w e-w)) - (when status - (setq flymake-mode-line-status status)) - (let* ((mode-line " Φ")) - (when (> (length flymake-mode-line-e-w) 0) - (setq mode-line (concat mode-line ":" flymake-mode-line-e-w))) - (setq mode-line (concat mode-line flymake-mode-line-status)) - (setq flymake-mode-line mode-line) - (force-mode-line-update))) - - ; load sql-indent when sql is loaded - (eval-after-load "sql" - '(load-library "sql-indent")) - ; fix up tmux xterm keys ; stolen from http://unix.stackexchange.com/questions/24414/shift-arrow-not-working-in-emacs-within-tmux (defun fix-up-tmux-keys () @@ -2121,11 +2344,6 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ) ; (add-hook 'tty-setup-hook 'fix-up-tmux-keys) - ; procmailmode configuration - (load "procmail_mode") - - (load "mode-line-cleaner") - (defadvice ask-user-about-supersession-threat (around ask-user-about-supersession-threat-if-necessary) "Call ask-user-about-supersession-threat only if the buffer is actually obsolete." (if (or (buffer-modified-p) @@ -2136,34 +2354,15 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (clear-visited-file-modtime) (not-modified))) (ad-activate 'ask-user-about-supersession-threat) +#+END_SRC - ; apparently things like to step on C-;, so we'll use a hack from - ; http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 to fix this - - (defvar my-keys-minor-mode-map (make-keymap) "my-keys-minor-mode keymap.") - - ; use iedit everywhere - (define-key my-keys-minor-mode-map (kbd "C-;") 'mc/mark-all-dwim) - - (define-minor-mode my-keys-minor-mode - "A minor mode so that my key settings override annoying major modes." - t " my-keys" 'my-keys-minor-mode-map) - - (my-keys-minor-mode 1) - (defun my-minibuffer-setup-hook () - (my-keys-minor-mode 0)) +* Server +#+BEGIN_SRC emacs-lisp + (unless (server-running-p) + (server-start)) +#+END_SRC - (add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook) - (defadvice load (after give-my-keybindings-priority) - "Try to ensure that my keybindings always have priority." - (if (not (eq (car (car minor-mode-map-alist)) 'my-keys-minor-mode)) - (let ((mykeys (assq 'my-keys-minor-mode minor-mode-map-alist))) - (assq-delete-all 'my-keys-minor-mode minor-mode-map-alist) - (add-to-list 'minor-mode-map-alist mykeys)))) - (ad-activate 'load) - (global-set-key "\M- " 'hippie-expand) -#+END_SRC * END #+BEGIN_SRC emacs-lisp