X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=emacs_el%2Fconfiguration%2Fdon-configuration.org;h=ac3af192a217f90bb7fb380d424135f0aaeb93b5;hb=72a65433503ca7e2b431b500943ff4478c5c0b11;hp=142fd79b1454f9dc430fc01fc4fddf264b204b98;hpb=af05c4931b4e623cad9c1a3a6638d1e04de521f6;p=lib.git diff --git a/emacs_el/configuration/don-configuration.org b/emacs_el/configuration/don-configuration.org index 142fd79..ac3af19 100644 --- a/emacs_el/configuration/don-configuration.org +++ b/emacs_el/configuration/don-configuration.org @@ -1,4 +1,11 @@ #+PROPERTY: header-args:emacs-lisp :tangle don-configuration.el +#+OPTIONS: auto-id:f + +* General Notes + +** Delight +To look up options for symbols for delight, check out https://en.wikipedia.org/wiki/Emoji#Unicode_blocks + * Load debugger # if for some reason, things get pear-shaped, we want to be able to @@ -6,110 +13,90 @@ #+BEGIN_SRC emacs-lisp (setq debug-on-event 'siguser2) +#+END_SRC +* Paths +** Update PATH +#+BEGIN_SRC emacs-lisp +(add-to-list 'exec-path '"/usr/local/bin") +(add-to-list 'exec-path '"~/bin/") +#+END_SRC +** Add library paths +#+BEGIN_SRC emacs-lisp +(let ((default-directory "~/lib/emacs_el/")) + (normal-top-level-add-subdirs-to-load-path)) +;; (eval-and-compile +;; (let ((default-directory "~/var/emacs/elpa")) +;; (normal-top-level-add-subdirs-to-load-path)) +;; ) +(add-to-list 'load-path '"~/lib/emacs_el") +(setq package-user-dir "~/var/emacs/elpa") + #+END_SRC * Initial startup stuff ** Disable startup screen #+BEGIN_SRC emacs-lisp - (setq inhibit-startup-screen t) +(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)) +; (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)) +(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 - (eval-and-compile - ;; add /etc/ssl/ca-global/ca-certificates.crt so that we can - ;; download packages when we're on Debian hosts which chop down the - ;; list of available certificates - (require 'gnutls) - (add-to-list 'gnutls-trustfiles "/etc/ssl/ca-global/ca-certificates.crt") - (setq package-enable-at-startup nil) - (setq package--init-file-ensured t) - (setq package-user-dir "~/var/emacs/elpa") - (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/") - ("melpa" . "https://melpa.org/packages/") - ("org" . "http://orgmode.org/elpa/"))) - (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)))))) - - ;;; fix up info paths for packages - (with-eval-after-load "info" - (info-initialize) - (dolist (dir (directory-files package-user-dir)) - (let ((fdir (concat (file-name-as-directory package-user-dir) dir))) - (unless (or (member dir '("." ".." "archives" "gnupg")) - (not (file-directory-p fdir)) - (not (file-exists-p (concat (file-name-as-directory fdir) "dir")))) - (add-to-list 'Info-directory-list fdir))))) - - - (eval-when-compile - (require 'use-package)) - (require 'bind-key) - (require 'diminish) +** Bootstrap straight.el +#+BEGIN_SRC emacs-lisp +(defvar bootstrap-version) +(setq straight-base-dir '"~/var/emacs/") +(let ((bootstrap-file + (expand-file-name "straight/repos/straight.el/bootstrap.el" straight-base-dir)) + (bootstrap-version 6)) + (unless (file-exists-p bootstrap-file) + (with-current-buffer + (url-retrieve-synchronously + "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el" + 'silent 'inhibit-cookies) + (goto-char (point-max)) + (eval-print-last-sexp))) + (load bootstrap-file nil 'nomessage)) #+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) - (setq paradox-github-token t) ; I don't want to be prompted about this integration - ) -#+END_SRC -* Paths -** Update PATH +** package repositories and package manager #+BEGIN_SRC emacs-lisp - (add-to-list 'exec-path '"/usr/local/bin") - (add-to-list 'exec-path '"~/bin/") +(straight-use-package 'use-package) +(setq straight-use-package-by-default t) +(setq use-package-verbose (not (bound-and-true-p byte-compile-current-file))) +(require 'gnutls) +(add-to-list 'gnutls-trustfiles "/etc/ssl/ca-global/ca-certificates.crt") #+END_SRC -** Add library paths - +** Paradox #+BEGIN_SRC emacs-lisp - (add-to-list 'load-path '"~/lib/emacs_el/") - (add-to-list 'load-path '"~/lib/emacs_el/magit-annex") +(use-package paradox + ;:ensure paradox + :commands (paradox-upgrade-packages paradox-list-packages) + :config + (setq paradox-execute-asynchronously t) + (setq paradox-github-token t) ; I don't want to be prompted about this integration + ) #+END_SRC * Disable custom-vars #+BEGIN_SRC emacs-lisp - ;; Set the custom file to /dev/null and don't bother to load it - (setq custom-file "/dev/null") +;; Set the custom file to /dev/null and don't bother to load it +(setq custom-file "/dev/null") #+END_SRC * Misc functions ** with-library #+BEGIN_SRC emacs-lisp ;; From http://www.emacswiki.org/emacs/LoadingLispFiles ;; execute conditional code when loading libraries -(defmacro with-library (symbol &rest body) - `(when (require ,symbol nil t) - ,@body)) -(put 'with-library 'lisp-indent-function 1) +; (defmacro with-library (symbol &rest body) +; `(when (require ,symbol nil t) +; ,@body)) +; (put 'with-library 'lisp-indent-function 1) #+END_SRC * Variables @@ -126,54 +113,136 @@ load [[https://github.com/jwiegley/use-package/][use-package]] even faster #+END_SRC * Memory #+BEGIN_SRC emacs-lisp - (setq global-mark-ring-max 128 - mark-ring-max 128 - kill-ring-max 128) +(setq global-mark-ring-max 128 + mark-ring-max 128 + kill-ring-max 128) - (defun don/minibuffer-setup-hook () - (setq gc-cons-threshold most-positive-fixnum)) +(defun don/minibuffer-setup-hook () + (setq gc-cons-threshold most-positive-fixnum)) - (defun don/minibuffer-exit-hook () - (setq gc-cons-threshold 1048576)) +(defun don/minibuffer-exit-hook () + (setq gc-cons-threshold 1048576)) - (add-hook 'minibuffer-setup-hook #'don/minibuffer-setup-hook) - (add-hook 'minibuffer-exit-hook #'don/minibuffer-exit-hook) +(add-hook 'minibuffer-setup-hook #'don/minibuffer-setup-hook) +(add-hook 'minibuffer-exit-hook #'don/minibuffer-exit-hook) #+END_SRC * Modules +** Tree sitter +#+BEGIN_SRC emacs-lisp +(use-package tree-sitter + :defer t + :config + (global-tree-sitter-mode) + ) +(use-package tree-sitter-langs + :ensure t + :defer 1 + :after tree-sitter +; :config +; (defun dla/python-function-at-point () +; "Return a list of function arguments +; +; Borrowed from https://xenodium.com/emacs-generate-a-swift-initializer/ +; " +; (interactive) +; (cl-assert (seq-contains-p local-minor-modes 'tree-sitter-mode) "tree-sitter-mode not enabled") +; (let* ((node (tree-sitter-node-at-point 'function_definition) +; ) +; (args) +; (arg) +; (ret)) +; (unless node +; (error "Not in function")) +; (mapc +; (lambda (item) +; (cond ((eq 'func_name +; (car item)) +; ; (when arg +; ; (setq args (append args (list arg))) +; ; ) +; (setq arg (list (cons 'function (tsc-node-text +; (cdr item)))))) +; ((eq 'ident +; (car item)) +; (setq arg (map-insert arg 'ident (tsc-node-text +; (cdr item))))) +; ((eq 'ident_type +; (car item)) +; (setq arg (map-insert arg 'ident_type (tsc-node-text +; (cdr item))))) +; ((eq 'ret_type +; (car item)) +; (setq arg (map-insert arg 'ret_type (tsc-node-text +; (cdr item))))) +; )) +; (tsc-query-captures +; (tsc-make-query tree-sitter-language +; "(function_definition (identifier) @func_name (parameters [(identifier) @ident (typed_parameter (identifier) @ident (type) @ident_type)]) (type)? @ret_type)") +; (tree-sitter-node-at-point 'function_definition) nil)) +; (when arg +; (setq args (append args (list arg)))) +; args)) + +) +#+END_SRC ** Spacemacs theme #+BEGIN_SRC emacs-lisp -(use-package spacemacs-common - :ensure spacemacs-theme +(use-package spacemacs-theme :config (load-theme 'spacemacs-dark t) ) #+END_SRC ** Hippie Expand #+BEGIN_SRC emacs-lisp - (use-package hippie-exp - :bind* (("M-" . hippie-expand)) - ) +(use-package hippie-exp + :bind* (("M-" . hippie-expand)) + ) #+END_SRC ** Flyspell 🐝 #+BEGIN_SRC emacs-lisp - (use-package flyspell - :ensure t - :diminish flyspell-mode 🐝 - :config - (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) - (add-hook 'tcl-mode-hook 'flyspell-prog-mode) - :init - (setq ispell-program-name "ispell") - ) - +(use-package flyspell + ; :delight flyspell-mode 🐝 + :config + (setq flyspell-mode-line-string " 🐝") + (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) + (add-hook 'tcl-mode-hook 'flyspell-prog-mode) + :init + (setq ispell-program-name "ispell") + ) #+END_SRC -** Flymake + +** Flycheck #+begin_src emacs-lisp :tangle yes +(use-package flycheck + :delight 🦋 + :if (version<= "24.4" emacs-version) + :commands flycheck-mode + :hook ((prog-mode . flycheck-mode) + ) +) +;; Other pkgs +(use-package flycheck-tip + :commands 'flycheck-tip-cycle + :after flycheck + :bind (:map flycheck-mode-map + ("C-c C-n" . flycheck-tip-cycle))) + +(use-package flycheck-package) + +(use-package flycheck-checkpatch + :config (flycheck-checkpatch-setup) + :config (setq flycheck-checkers (delete 'checkpatch + flycheck-checkers)) + :config (add-to-list 'flycheck-checkers 'checkpatch t)) +#+end_src + +** Flymake +#+BEGIN_SRC emacs-lisp (use-package flymake - :diminish "Φ") -#+end_src + :delight "Φ") +#+END_SRC ** Winnermode #+BEGIN_SRC emacs-lisp @@ -184,7 +253,7 @@ load [[https://github.com/jwiegley/use-package/][use-package]] even faster #+BEGIN_SRC emacs-lisp (use-package eyebrowse :ensure t - :diminish eyebrowse-mode + :delight eyebrowse-mode :init (setq eyebrowse-keymap-prefix (kbd "C-c e")) :config (progn (setq eyebrowse-wrap-around t) @@ -310,16 +379,10 @@ value, scrolling continues until there is no more output. #+END_SRC ** Mode line cleaning -*** Diminish -#+BEGIN_SRC emacs-lisp - (use-package diminish - :ensure t) -#+END_SRC - *** Delight #+BEGIN_SRC emacs-lisp - (use-package delight - :ensure t) +(use-package delight + :demand t) #+END_SRC ** Jumping @@ -363,7 +426,7 @@ value, scrolling continues until there is no more output. #+BEGIN_SRC emacs-lisp (use-package yasnippet :ensure t - :diminish yas-minor-mode + :delight yas-minor-mode :config (progn (yas-global-mode) (setq yas-verbosity 1) @@ -380,709 +443,630 @@ value, scrolling continues until there is no more output. #+END_SRC *** Auto-YASnippet #+BEGIN_SRC emacs-lisp - (use-package auto-yasnippet - :ensure t - :bind (("H-w" . aya-create) - ("H-y" . aya-expand) - ) - ) -#+END_SRC -** Company -#+BEGIN_SRC emacs-lisp -(use-package company +(use-package auto-yasnippet :ensure t - :bind (("M-/" . company-complete)) - :config - (setq company-echo-delay 0 ; remove blinking - company-show-numbers t ; show numbers for easy selection - company-selection-wrap-around t - company-require-match nil - company-dabbrev-ignore-case t - company-dabbrev-ignore-invisible t - company-dabbrev-other-buffers t - company-dabbrev-downcase nil - company-dabbrev-code-everywhere t - company-tooltip-align-annotations t - company-minimum-prefix-length 1 - company-global-modes '(not) - company-lighter-base "(C)") - (global-company-mode 1) - :bind (:map company-active-map - ("C-n" . company-select-next) - ("C-p" . company-select-previous) - ("M-?" . company-show-doc-buffer) - ("M-." . company-show-location) - ) + :bind (("H-w" . aya-create) + ("H-y" . aya-expand) + ) ) #+END_SRC -*** C/C++ +** Treemacs: Tree file viewer #+BEGIN_SRC emacs-lisp - (use-package company-c-headers - :ensure t - :config (progn - (defun malb/ede-object-system-include-path () - "Return the system include path for the current buffer." - (when ede-object - (ede-system-include-path ede-object))) - - (setq company-c-headers-path-system - #'malb/ede-object-system-include-path) +;; Provides workspaces with file browsing (tree file viewer) +;; and project management when coupled with `projectile`. - (add-to-list 'company-backends #'company-c-headers))) +; (use-package treemacs +; :ensure t +; :defer t +; :config +; (setq treemacs-no-png-images t +; treemacs-width 24) +; :bind ("C-c t" . treemacs)) #+END_SRC -*** Python +** LSP mode #+BEGIN_SRC emacs-lisp -(use-package company-anaconda - :ensure t - :config (add-to-list 'company-backends #'company-anaconda)) -#+END_SRC -*** Perl -#+BEGIN_SRC emacs-lisp - (use-package company-plsense - :ensure t - ) +(use-package lsp-mode + :defer t + :commands (lsp lsp-deferred) + :init (setq lsp-keymap-prefix "C-c l") + (defun my/orderless-dispatch-flex-first (_pattern index _total) + (and (eq index 0) 'orderless-flex)) + + (defun my/lsp-mode-setup-completion () + (setf (alist-get 'styles (alist-get 'lsp-capf completion-category-defaults)) + '(orderless))) + + ;; Optionally configure the first word as flex filtered. + (add-hook 'orderless-style-dispatchers #'my/orderless-dispatch-flex-first nil 'local) + + ;; Optionally configure the cape-capf-buster. + ; (setq-local completion-at-point-functions (list (cape-capf-buster #'lsp-completion-at-point))) + + :hook (python-mode . lsp-deferred) + (cperl-mode . lsp-deferred) + (lsp-completion-mode . my/lsp-mode-setup-completion) + :custom + (lsp-completion-provider :none) ;; we use Corfu! + :config + (add-to-list 'lsp-file-watch-ignored-directories "[/\\\\]venv\\'") +) #+END_SRC -*** LaTeX +** LSP mode #+BEGIN_SRC emacs-lisp - (use-package company-math - :ensure t) +;; provides visual help in the buffer +;; for example definitions on hover. +;; the `imenu` lets me browse definitions quickly. +(use-package lsp-ui + :defer t + :after lsp-mode + :config + (setq lsp-ui-sideline-enable t + lsp-ui-doc-delay 2) + :hook (lsp-mode . lsp-ui-mode) + :bind (:map lsp-ui-mode-map + ("C-c i" . lsp-ui-imenu))) #+END_SRC +*** LSP Pyright -- Python language server #+BEGIN_SRC emacs-lisp - (use-package company-auctex - :ensure t - :config (progn - (defun company-auctex-labels (command &optional arg &rest ignored) - "company-auctex-labels backend" - (interactive (list 'interactive)) - (case command - (interactive (company-begin-backend 'company-auctex-labels)) - (prefix (company-auctex-prefix "\\\\.*ref{\\([^}]*\\)\\=")) - (candidates (company-auctex-label-candidates arg)))) - - (add-to-list 'company-backends - '(company-auctex-macros - company-auctex-environments - company-math-symbols-unicode - company-math-symbols-latex)) - - (add-to-list 'company-backends #'company-auctex-labels) - (add-to-list 'company-backends #'company-auctex-bibs) +;; language server for python +;; read the docs for the different variables set in the config. +(use-package lsp-pyright + :defer t + :config + (setq lsp-clients-python-library-directories '("/usr/")) + (setq lsp-pyright-disable-language-service nil + lsp-pyright-disable-organize-imports nil + lsp-pyright-auto-import-completions t + lsp-pyright-use-library-code-for-types t + lsp-pyright-venv-path "venv") + :hook ((python-mode . (lambda () + (require 'lsp-pyright) (lsp-deferred))))) +#+END_SRC +** Corfu +#+BEGIN_SRC emacs-lisp +(use-package corfu + ;; Optional customizations + :custom + (corfu-cycle t) ;; Enable cycling for `corfu-next/previous' + (corfu-auto t) ;; Enable auto completion + (corfu-separator ?\s) ;; Orderless field separator + (corfu-quit-at-boundary t) + (corfu-quit-no-match 'separator) + (corfu-preview-current nil) ;; Disable current candidate preview + (corfu-preselect 'prompt) ;; Preselect the prompt + (corfu-on-exact-match nil) ;; Configure handling of exact matches + (corfu-scroll-margin 5) ;; Use scroll margin + + :bind ( + :map corfu-map + ("M-m" . corfu-move-to-minibuffer) ) - ) + :init + (global-corfu-mode) + (setq completion-cycle-threshold 3) + (setq tab-always-indent 'complete) + :config + (defun corfu-move-to-minibuffer () + (interactive) + (when completion-in-region--data + (let ((completion-extra-properties corfu--extra) + completion-cycle-threshold completion-cycling) + (apply #'consult-completion-in-region completion-in-region--data)))) + (add-to-list 'corfu-continue-commands #'corfu-move-to-minibuffer) + ) #+END_SRC +** Dabbrv #+BEGIN_SRC emacs-lisp - (use-package company-bibtex - :ensure t - ) -#+END_SRC -*** Shell - - #+BEGIN_SRC emacs-lisp - (use-package company-shell - :ensure t - :config (progn - (setq company-shell-modes '(sh-mode shell-mode)) - (add-to-list 'company-backends 'company-shell))) - #+END_SRC - -*** YaSnippet - - Add YasSippet support for all company backends. ([[https://github.com/syl20bnr/spacemacs/pull/179][source]]) - - *Note:* Do this at the end of =company-mode= config. - - #+BEGIN_SRC emacs-lisp - (defvar malb/company-mode/enable-yas t - "Enable yasnippet for all backends.") - - (defun malb/company-mode/backend-with-yas (backend) - (if (or (not malb/company-mode/enable-yas) - (and (listp backend) - (member 'company-yasnippet backend))) - backend - (append (if (consp backend) backend (list backend)) - '(:with company-yasnippet)))) - - (setq company-backends - (mapcar #'malb/company-mode/backend-with-yas company-backends)) - #+END_SRC - -*** All the words - - Enable/disable company completion from ispell dictionaries ([[https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-company.el][source]]) - - #+BEGIN_SRC emacs-lisp - (defun malb/toggle-company-ispell () - (interactive) - (cond - ((member '(company-ispell :with company-yasnippet) company-backends) - (setq company-backends (delete '(company-ispell :with company-yasnippet) company-backends)) - (add-to-list 'company-backends '(company-dabbrev :with company-yasnippet) t) - (message "company-ispell disabled")) - (t - (setq company-backends (delete '(company-dabbrev :with company-yasnippet) company-backends)) - (add-to-list 'company-backends '(company-ispell :with company-yasnippet) t) - (message "company-ispell enabled!")))) - - (defun malb/company-ispell-setup () - ;; @see https://github.com/company-mode/company-mode/issues/50 - (when (boundp 'company-backends) - (make-local-variable 'company-backends) - (setq company-backends (delete '(company-dabbrev :with company-yasnippet) company-backends)) - (add-to-list 'company-backends '(company-ispell :with company-yasnippet) t) - ;; https://github.com/redguardtoo/emacs.d/issues/473 - (if (and (boundp 'ispell-alternate-dictionary) - ispell-alternate-dictionary) - (setq company-ispell-dictionary ispell-alternate-dictionary)))) - #+END_SRC - -*** Tab DWIM - - 1. =yas-expand= is run first and does what it has to, then it calls =malb/indent-fold-or-complete=. - - 2. This function then hopefully does what I want: - - a. if a region is active, just indent - b. if we’re looking at a space after a non-whitespace character, we try some company-expansion - c. If =hs-minor-mode= or =outline-minor-mode= is active, try those next - d. otherwise call whatever would have been called otherwise. - - ([[http://emacs.stackexchange.com/q/21182/8930][source]], [[http://emacs.stackexchange.com/q/7908/8930][source]]) - -#+BEGIN_SRC emacs-lisp -(defun malb/indent-fold-or-complete (&optional arg) - (interactive "P") - (cond - ;; if a region is active, indent - ((use-region-p) - (indent-region (region-beginning) - (region-end))) - ;; if the next char is space or eol, but prev char not whitespace - ((and (not (active-minibuffer-window)) - (or (looking-at " ") - (looking-at "$")) - (looking-back "[^[:space:]]") - (not (looking-back "^"))) - - (cond (company-mode (company-complete-common)) - (auto-complete-mode (auto-complete)))) - - ;; no whitespace anywhere - ((and (not (active-minibuffer-window)) - (looking-at "[^[:space:]]") - (looking-back "[^[:space:]]") - (not (looking-back "^"))) - (cond - ((bound-and-true-p hs-minor-mode) - (save-excursion (end-of-line) (hs-toggle-hiding))) - ((bound-and-true-p outline-minor-mode) - (save-excursion (outline-cycle))))) - - ;; by default just call whatever was bound - (t - (let ((fn (or (if (current-local-map) (lookup-key (current-local-map) (kbd "TAB"))) - 'indent-for-tab-command))) - (if (not (called-interactively-p 'any)) - (fn arg) - (setq this-command fn) - (call-interactively fn)))))) - -(defun malb/toggle-fold () - (interactive) - (cond ((eq major-mode 'org-mode) - (org-force-cycle-archived)) - ((bound-and-true-p hs-minor-mode) - (save-excursion - (end-of-line) - (hs-toggle-hiding))) - - ((bound-and-true-p outline-minor-mode) - (save-excursion - (outline-cycle))))) - -(bind-key "" #'malb/indent-fold-or-complete) -(bind-key "C-" #'malb/toggle-fold) +(use-package dabbrev + :ensure t + ;; Swap M-/ and C-M-/ + :bind (("M-/" . dabbrev-completion) + ("C-M-/" . dabbrev-expand)) + ;; Other useful Dabbrev configurations. + :custom + (dabbrev-ignored-buffer-regexps '("\\.\\(?:pdf\\|jpe?g\\|png\\)\\'"))) #+END_SRC ** Tinyprocmail #+BEGIN_SRC emacs-lisp - ;; load tinyprocmail - (use-package tinyprocmail - :load-path "~/lib/emacs_el/tiny-tools/lisp/tiny" - :mode (".procmailrc" . turn-on-tinyprocmail-mode) - ) +;; load tinyprocmail +(use-package tinyprocmail + :straight (tinytools :type git :type git :host github :repo "jaalto/project--emacs-tiny-tools") + ; :load-path "~/lib/emacs_el/tiny-tools/lisp/tiny" + :mode (".procmailrc" . turn-on-tinyprocmail-mode) + ) #+END_SRC ** Magit -#+BEGIN_SRC emacs-lisp :tangle don-configuration.el - (use-package magit - :ensure t - :bind (("C-x g" . magit-status) - ("C-x C-g" . magit-status)) - :config - ;; refine diffs always (hilight words) - (setq magit-diff-refine-hunk nil) - ) - (use-package magit-annex - :ensure t - :load-path "~/lib/emacs_el/magit-annex/" - ) - (use-package magit-vcsh - :ensure t - ) +#+BEGIN_SRC emacs-lisp +(use-package magit + :defer t + :bind (("C-x g" . magit-status) + ("C-x C-g" . magit-status)) + :config + ;; refine diffs always (hilight words) + (setq magit-diff-refine-hunk nil) + ) +(use-package magit-annex + :defer t + :after magit + ) +(use-package magit-vcsh + :defer t + :after magit + ) +#+END_SRC + +*** Forge (github/gitlab) +#+BEGIN_SRC emacs-lisp +(use-package forge + :defer t + :after magit + ) #+END_SRC ** Perl #+BEGIN_SRC emacs-lisp - (use-package cperl-mode - :config - (progn - ;; Use c-mode for perl .xs files - (add-to-list 'auto-mode-alist '("\\.xs\\'" . c-mode)) - (add-to-list 'auto-mode-alist '("\\.\\([pP][Llm]\\|al\\)\\'" . cperl-mode)) - (add-to-list 'interpreter-mode-alist '("perl" . cperl-mode)) - (add-to-list 'interpreter-mode-alist '("perl5" . cperl-mode)) - (add-to-list 'interpreter-mode-alist '("miniperl" . cperl-mode)) - (setq cperl-hairy t - cperl-indent-level 4 - cperl-auto-newline nil - cperl-auto-newline-after-colon nil - cperl-continued-statement-offset 4 - cperl-brace-offset -1 - cperl-continued-brace-offset 0 - cperl-label-offset -4 - cperl-highlight-variables-indiscriminately t - cperl-electric-lbrace-space nil - cperl-indent-parens-as-block nil - cperl-close-paren-offset -1 - cperl-tab-always-indent t) - ;;(add-hook 'cperl-mode-hook (lambda () (cperl-set-style "PerlStyle"))) - )) +(use-package cperl-mode + :mode ("\\.pl'" . cperl-mode) + ("\\.perl5\\'" . cperl-mode) + ("\\.perl\\'" . cperl-mode) + ("\\.miniperl\\'" . cperl-mode) + ("\\.\\([Pp][Llm]\\|al\\)\\'" . cperl-mode) + ;; use c-mode for perl .xs files + ("\\.xs\\'" . c-mode) + :config + (setq cperl-hairy t + cperl-indent-level 4 + cperl-auto-newline nil + cperl-auto-newline-after-colon nil + cperl-continued-statement-offset 4 + cperl-brace-offset -1 + cperl-continued-brace-offset 0 + cperl-label-offset -4 + cperl-highlight-variables-indiscriminately t + cperl-electric-lbrace-space nil + cperl-indent-parens-as-block nil + cperl-close-paren-offset -1 + cperl-tab-always-indent t) + (setq cperl-lazy-help-time nil) + ;;(add-hook 'cperl-mode-hook (lambda () (cperl-set-style "PerlStyle"))) +) #+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) - ) +(use-package markdown-mode + :defer 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 +; load sql-indent when sql is loaded +(use-package sql-indent + :after sql + :hook sql-mode + ) (use-package sql + :commands (sql-mode) :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) - ) +(use-package ediff + :commands ediff ediff3 + :config + ;; ediff configuration + ;; don't use the multi-window configuration + (setq ediff-window-setup-function 'ediff-setup-windows-plain) +) #+END_SRC ** Do the Right Thing Indenting Attempts to automatically identify the right indentation for a file #+BEGIN_SRC emacs-lisp (use-package dtrt-indent - :ensure t ) #+END_SRC ** VCL --editing varnish configuration files #+BEGIN_SRC emacs-lisp - (use-package vcl-mode - :ensure t - :mode "\\.vcl\\'" - ) - +(use-package vcl-mode + :mode "\\.vcl\\'" + ) #+END_SRC -** Helm +** Vertico #+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 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) - (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)) - (add-hook 'kill-emacs-hook #'(lambda () (and (file-exists-p "$TMP") (delete-file "$TMP")))) +(use-package vertico + :demand t + :config + (vertico-mode) + ; (define-key vertico-map "\r" #'vertico-directory-enter) + ; (define-key vertico-map "\d" #'vertico-directory-delete-char) + ; (define-key vertico-map "\M-\d" #'vertico-directory-delete-word) + ; (add-hook 'rfn-eshadow-update-overlay-hook #'vertico-directory-tidy) + + ;; Different scroll margin + ;; (setq vertico-scroll-margin 0) + + ;; Show more candidates + ;; (setq vertico-count 20) + + ;; Grow and shrink the Vertico minibuffer + ;; (setq vertico-resize t) + + ;; Optionally enable cycling for `vertico-next' and `vertico-previous'. + ;; (setq vertico-cycle t) + :custom + (vertico-grid-separator " ") + (vertico-grid-lookahead 50) +) +(use-package vertico-multiform + :straight nil + :load-path "~/var/emacs/straight/build/vertico/extensions/" + :after vertico + :config + (setq vertico-multiform-categories + '((file reverse) + (consult-grep buffer) + (consult-location) + (imenu buffer) + (library reverse indexed) + (org-roam-node reverse indexed) + ; (t reverse) + ) + ) + (setq vertico-multiform-commands + '(("flyspell-correct-*" grid reverse) + (org-refile grid reverse indexed) + (consult-yank-pop indexed) + (consult-flycheck) + (consult-lsp-diagnostics) + ) + ) + (vertico-multiform-mode) ) -#+END_SRC -*** Helm Flx - - [[https://github.com/PythonNut/helm-flx][helm-flx]] implements intelligent helm fuzzy sorting, provided by [[https://github.com/lewang/flx][flx]]. - - #+BEGIN_SRC emacs-lisp - (use-package helm-flx - :ensure t - :config (progn - ;; these are helm configs, but they kind of fit here nicely - (setq helm-M-x-fuzzy-match t - helm-bookmark-show-location t - helm-buffers-fuzzy-matching t - helm-completion-in-region-fuzzy-match t - helm-file-cache-fuzzy-match t - helm-imenu-fuzzy-match t - helm-mode-fuzzy-match t - helm-locate-fuzzy-match nil - helm-quick-update t - helm-recentf-fuzzy-match nil - helm-semantic-fuzzy-match t) - (helm-flx-mode +1))) - #+END_SRC -*** Helm Swoop -#+BEGIN_SRC emacs-lisp - - ;;; stolen from https://github.com/malb/emacs.d/blob/master/malb.org - (defun malb/helm-swoop-pre-fill () - (thing-at-point 'symbol)) - (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))) - - (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)) - ) -#+END_SRC -*** Helm Ag -#+BEGIN_SRC emacs-lisp -(use-package helm-ag - :ensure t - :config (setq helm-ag-base-command "ag --nocolor --nogroup" - helm-ag-command-option "--all-text" - helm-ag-insert-at-point 'symbol - helm-ag-fuzzy-match t - helm-ag-use-temp-buffer t - helm-ag-use-grep-ignore-list t - helm-ag-use-agignore t)) -#+END_SRC -*** Helm Descbinds -#+BEGIN_SRC emacs-lisp - (use-package helm-descbinds - :ensure t - :bind ("C-h b" . helm-descbinds) - :init (fset 'describe-bindings 'helm-descbinds)) -#+END_SRC +(use-package vertico-grid + :straight nil + :after vertico + ) +(use-package vertico-reverse + :straight nil + :after vertico + ) +(use-package vertico-indexed + :straight nil + :after vertico + ) +(use-package vertico-buffer + :straight nil + :after vertico + ) -*** Helm YaSnippet -#+BEGIN_SRC emacs-lisp - (use-package helm-c-yasnippet - :ensure t - :bind ("C-c h y" . helm-yas-complete) - :config (progn - (setq helm-yas-space-match-any-greedy t))) -#+END_SRC -*** Helm Org Rifle -#+BEGIN_SRC emacs-lisp - (use-package helm-org-rifle - :ensure t - :config (progn - (defun malb/helm-org-rifle-agenda-files (arg) - (interactive "p") - (let ((current-prefix-arg nil)) - (cond - ((equal arg 4) (call-interactively #'helm-org-rifle-agenda-files nil)) - ((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 +;; Persist history over Emacs restarts. Vertico sorts by history position. +(use-package savehist + :demand t + :config + (savehist-mode)) + +#+END_SRC +** Orderless: advanced completion style #+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) +(use-package orderless + :init + ;; Configure a custom style dispatcher (see the Consult wiki) + ;; (setq orderless-style-dispatchers '(+orderless-dispatch) + ;; orderless-component-separator #'orderless-escapable-split-on-space) + (setq completion-styles '(orderless basic) + completion-category-defaults nil + completion-category-overrides '((file (styles partial-completion))))) +#+end_src +** Marginalia: Rich annotations in the minibuffer +#+begin_src emacs-lisp +(use-package marginalia + :demand t + :bind (:map minibuffer-local-map + ("M-A" . marginalia-cycle)) + :config + (marginalia-mode) + ) +#+end_src +** Embark: Minibuffer actions and context menu +#+begin_src emacs-lisp +(use-package embark + :bind + (("C-." . embark-act) ;; pick some comfortable binding + ("C-;" . embark-dwim) ;; good alternative: M-. + ("C-h B" . embark-bindings)) ;; alternative for `describe-bindings' - (setq projectile-make-test-cmd "make check" - projectile-switch-project-action 'helm-projectile - projectile-mode-line '(:eval (format "»{%s}" (projectile-project-name)))) + :init - (projectile-global-mode))) -#+end_src + ;; Optionally replace the key help with a completing-read interface + (setq prefix-help-command #'embark-prefix-help-command) + + :config + + ;; Hide the mode line of the Embark live/completions buffers + (add-to-list 'display-buffer-alist + '("\\`\\*Embark Collect \\(Live\\|Completions\\)\\*" + nil + (window-parameters (mode-line-format . none))))) -*** helm integration +(use-package embark-consult + :hook + (embark-collect-mode . consult-preview-at-point-mode)) +#+end_src +** which-key (show possible completions of a key combination) +#+BEGIN_SRC emacs-lisp +(use-package which-key + :demand t + ) +#+END_SRC +** Consult #+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))) +(use-package consult + ;; Replace bindings. Lazily loaded due by `use-package'. + :bind (;; C-c bindings in `mode-specific-map' + ("C-c M-x" . consult-mode-command) + ("C-c h" . consult-history) + ("C-c k" . consult-kmacro) + ("C-c m" . consult-man) + ("C-c i" . consult-info) + ([remap Info-search] . consult-info) + ;; C-x bindings in `ctl-x-map' + ("C-x M-:" . consult-complex-command) ;; orig. repeat-complex-command + ("C-x b" . consult-buffer) ;; orig. switch-to-buffer + ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window + ("C-x 5 b" . consult-buffer-other-frame) ;; orig. switch-to-buffer-other-frame + ("C-x r b" . consult-bookmark) ;; orig. bookmark-jump + ("C-x p b" . consult-project-buffer) ;; orig. project-switch-to-buffer + ;; Custom M-# bindings for fast register access + ("M-#" . consult-register-load) + ("M-'" . consult-register-store) ;; orig. abbrev-prefix-mark (unrelated) + ("C-M-#" . consult-register) + ;; Other custom bindings + ("M-y" . consult-yank-pop) ;; orig. yank-pop + ;; M-g bindings in `goto-map' + ("M-g e" . consult-compile-error) + ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck + ("M-g g" . consult-goto-line) ;; orig. goto-line + ("M-g M-g" . consult-goto-line) ;; orig. goto-line + ("M-g o" . consult-outline) ;; Alternative: consult-org-heading + ("M-g m" . consult-mark) + ("M-g k" . consult-global-mark) + ("M-g i" . consult-imenu) + ("M-g I" . consult-imenu-multi) + ;; M-s bindings in `search-map' + ("M-s d" . consult-find) + ("M-s D" . consult-locate) + ("M-s g" . consult-grep) + ("M-s G" . consult-git-grep) + ("M-s r" . consult-ripgrep) + ("M-s l" . consult-line) + ("M-s L" . consult-line-multi) + ("M-s k" . consult-keep-lines) + ("M-s u" . consult-focus-lines) + ;; Isearch integration + ("M-s e" . consult-isearch-history) + :map isearch-mode-map + ("M-e" . consult-isearch-history) ;; orig. isearch-edit-string + ("M-s e" . consult-isearch-history) ;; orig. isearch-edit-string + ("M-s l" . consult-line) ;; needed by consult-line to detect isearch + ("M-s L" . consult-line-multi) ;; needed by consult-line to detect isearch + ;; Minibuffer history + :map minibuffer-local-map + ("M-s" . consult-history) ;; orig. next-matching-history-element + ("M-r" . consult-history)) ;; orig. previous-matching-history-element + + ;; Enable automatic preview at point in the *Completions* buffer. This is + ;; relevant when you use the default completion UI. + :hook (completion-list-mode . consult-preview-at-point-mode) + + :commands (consult-xref) + + ;; The :init configuration is always executed (Not lazy) + :init + + ;; Optionally configure the register formatting. This improves the register + ;; preview for `consult-register', `consult-register-load', + ;; `consult-register-store' and the Emacs built-ins. + (setq register-preview-delay 0.5 + register-preview-function #'consult-register-format) + + ;; Optionally tweak the register preview window. + ;; This adds thin lines, sorting and hides the mode line of the window. + (advice-add #'register-preview :override #'consult-register-window) + + ;; Use Consult to select xref locations with preview + (setq xref-show-xrefs-function #'consult-xref + xref-show-definitions-function #'consult-xref) + + ;; Configure other variables and modes in the :config section, + ;; after lazily loading the package. + :config + ;; Optionally configure preview. The default value + ;; is 'any, such that any key triggers the preview. + ;; (setq consult-preview-key 'any) + ;; (setq consult-preview-key "M-.") + ;; (setq consult-preview-key '("S-" "S-")) + ;; For some commands and buffer sources it is useful to configure the + ;; :preview-key on a per-command basis using the `consult-customize' macro. + (consult-customize + consult-theme :preview-key '(:debounce 0.2 any) + consult-ripgrep consult-git-grep consult-grep + consult-bookmark consult-recent-file consult-xref + consult--source-bookmark consult--source-file-register + consult--source-recent-file consult--source-project-recent-file + ;; :preview-key "M-." + :preview-key '(:debounce 0.4 any)) + + ;; Optionally configure the narrowing key. + ;; Both < and C-+ work reasonably well. + (setq consult-narrow-key "<") ;; "C-+" + + ;; Optionally make narrowing help available in the minibuffer. + ;; You may want to use `embark-prefix-help-command' or which-key instead. + ;; (define-key consult-narrow-map (vconcat consult-narrow-key "?") #'consult-narrow-help) + + ;; By default `consult-project-function' uses `project-root' from project.el. + ;; Optionally configure a different project root function. + ;;;; 1. project.el (the default) + ;; (setq consult-project-function #'consult--default-project--function) + ;;;; 2. vc.el (vc-root-dir) + ;; (setq consult-project-function (lambda (_) (vc-root-dir))) + ;;;; 3. locate-dominating-file + ;; (setq consult-project-function (lambda (_) (locate-dominating-file "." ".git"))) + ;;;; 4. projectile.el (projectile-project-root) + ;; (autoload 'projectile-project-root "projectile") + ;; (setq consult-project-function (lambda (_) (projectile-project-root))) + ;;;; 5. No project support + ;; (setq consult-project-function nil) +) #+end_src +** Projectile -- Project management +#+begin_src emacs-lisp +(use-package projectile + :bind (("" . projectile-compile-project) + ("" . next-error)) + :config (projectile-global-mode)) +#+end_src + ** Zap to char #+BEGIN_SRC emacs-lisp - (use-package avy-zap - :ensure t - :bind ("M-z" . avy-zap-up-to-char-dwim)) +(use-package avy-zap + :bind ("M-z" . avy-zap-up-to-char-dwim)) #+END_SRC ** 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 +(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" (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 my/org-refile-file)) - ("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 +_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 my/org-refile-file)) + ("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 - ("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")) - ) +^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 #+BEGIN_SRC emacs-lisp - (use-package tramp - :config - (add-to-list 'tramp-methods '("vcsh" - (tramp-login-program "vcsh") - (tramp-login-args - (("enter") - ("%h"))) - (tramp-remote-shell "/bin/sh") - (tramp-remote-shell-args - ("-c"))))) +(use-package tramp + :demand t + ; use the built in tramp + :straight nil + :config + (setq tramp-use-ssh-controlmaster-options nil) + (add-to-list 'tramp-methods '("vcsh" + (tramp-login-program "vcsh") + (tramp-login-args + (("enter") + ("%h"))) + (tramp-remote-shell "/bin/sh") + (tramp-remote-shell-args + ("-c"))))) #+END_SRC ** Reftex #+BEGIN_SRC emacs-lisp - (use-package reftex - :ensure t - :config - (setq-default reftex-default-bibliography - '("~/projects/research/references.bib"))) +(use-package reftex + :hook ((LaTeX-mode latex-mode) . reftex-mode) + :config + (setq-default reftex-default-bibliography + '("~/projects/research/references.bib")) + (setq-default reftex-plug-into-AUCTeX t) + ) #+END_SRC ** BibTex #+BEGIN_SRC emacs-lisp - (use-package bibtex - :config (setq bibtex-user-optional-fields - (quote (("annote" "Personal annotation (ignored)") - ("abstract" "") - ("pmid" "") - ("doi" "")))) - ) +(use-package bibtex + :mode "\\.bib\\'" + :config (setq bibtex-user-optional-fields + (quote (("annote" "Personal annotation (ignored)") + ("abstract" "") + ("pmid" "") + ("doi" "")))) + ) #+END_SRC ** LaTeX #+BEGIN_SRC emacs-lisp (use-package tex - :defer t - :ensure auctex + :straight auctex + :mode ("\\.tex\\'" . LaTeX-mode) :config ; (add-to-list 'TeX-style-path '"/home/don/lib/emacs_el/auctex/style") - ;; REFTEX (much enhanced management of cross-ref, labels, etc) - ;; http://www.strw.leidenuniv.nl/~dominik/Tools/reftex/ - ; (autoload 'reftex-mode "reftex" "RefTeX Minor Mode" t) - ; (autoload 'turn-on-reftex "reftex" "RefTeX Minor Mode" nil) - ; (autoload 'reftex-citation "reftex-cite" "Make citation" nil) - ; (autoload 'reftex-index-phrase-mode "reftex-index" "Phrase mode" t) - (add-hook 'LaTeX-mode-hook 'turn-on-reftex) ; with AUCTeX LaTeX mode - (add-hook 'latex-mode-hook 'turn-on-reftex) ; with Emacs latex mode (add-hook 'LaTeX-mode-hook 'outline-minor-mode) ; with AUCTeX LaTeX mode (add-hook 'latex-mode-hook 'outline-minor-mode) ; with Emacs latex mode - (setq-default reftex-plug-into-AUCTeX t) ;; support fake section headers (setq TeX-outline-extra '(("%chapter" 1) @@ -1142,31 +1126,28 @@ This can be used to link things pretty quickly if necessary "latex" '(add-to-list 'LaTeX-fill-excluded-macros '("Sexpr"))) - - (use-package font-latex - :config - (setq font-latex-match-reference-keywords - '( - ("fref" "{") - ("Fref" "{") - ("citep" "{") - ("citet" "{") - ("acs" "{") - ("acsp" "{") - ("ac" "{") - ("acp" "{") - ("acl" "{") - ("aclp" "{") - ("acsu" "{") - ("aclu" "{") - ("acused" "{") - ("DLA" "{") - ("RZ" "{") - ("OM" "{") - ("DL" "{") - ("fixme" "{")) - ) - ) + + (setq font-latex-match-reference-keywords + '( + ("fref" "{") + ("Fref" "{") + ("citep" "{") + ("citet" "{") + ("acs" "{") + ("acsp" "{") + ("ac" "{") + ("acp" "{") + ("acl" "{") + ("aclp" "{") + ("acsu" "{") + ("aclu" "{") + ("acused" "{") + ("DLA" "{") + ("RZ" "{") + ("OM" "{") + ("DL" "{") + ("fixme" "{")) + ) (setq font-latex-fontify-script nil) (setq font-latex-fontify-sectioning (quote color)) (setq font-latex-script-display (quote (nil))) @@ -1175,236 +1156,319 @@ This can be used to link things pretty quickly if necessary #+END_SRC ** ESS #+BEGIN_SRC emacs-lisp - (use-package ess - :ensure t - :commands R - :mode ("\\.R\\'" . ess-r-mode) - :bind (:map ess-mode-map - ("C-c C-R" . dla/ess-region-remote-eval)) - :init - (autoload 'ess-r-mode "ess-site" nil t) - (autoload 'R "ess-site" nil t) - :config - ; actually load the rest of ess - (require 'ess-site) - (defun ess-change-directory (path) - "Set the current working directory to PATH for both *R* and Emacs." - (interactive "Directory to change to: ") - - (when (file-exists-p path) - (ess-command (concat "setwd(\"" path "\")\n")) - ;; use file-name-as-directory to ensure it has trailing / - (setq default-directory (file-name-as-directory path)))) - (add-hook 'ess-mode-hook 'flyspell-prog-mode) - ;; outlining support for ess modes - (add-hook - 'ess-mode-hook - '(lambda () - (outline-minor-mode) - (setq outline-regexp "\\(^#\\{4,5\\} \\)\\|\\(^[a-zA-Z0-9_\.]+ ?<- ?function\\)") - (defun outline-level () - (cond ((looking-at "^##### ") 1) - ((looking-at "^#### ") 2) - ((looking-at "^[a-zA-Z0-9_\.]+ ?<- ?function(.*{") 3) - (t 1000))) - )) - (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***") nil nil nil) - (kill-buffer "***essregionremoteeval***")) - ;; Don't restore history or save workspace image - '(inferior-R-args "--no-restore-history --no-save") - ) +(use-package ess + :commands R + :mode ("\\.R\\'" . ess-r-mode) + :bind (:map ess-mode-map + ("C-c C-R" . dla/ess-region-remote-eval)) + :init + (autoload 'ess-r-mode "ess-site" nil t) + (autoload 'R "ess-site" nil t) + :config + ; actually load the rest of ess + (require 'ess-site) + (defun ess-change-directory (path) + "Set the current working directory to PATH for both *R* and Emacs." + (interactive "Directory to change to: ") + + (when (file-exists-p path) + (ess-command (concat "setwd(\"" path "\")\n")) + ;; use file-name-as-directory to ensure it has trailing / + (setq default-directory (file-name-as-directory path)))) + (add-hook 'ess-mode-hook 'flyspell-prog-mode) + ;; outlining support for ess modes + (add-hook + 'ess-mode-hook + '(lambda () + (outline-minor-mode) + (setq outline-regexp "\\(^#\\{4,5\\} \\)\\|\\(^[a-zA-Z0-9_\.]+ ?<- ?function\\)") + (defun outline-level () + (cond ((looking-at "^##### ") 1) + ((looking-at "^#### ") 2) + ((looking-at "^[a-zA-Z0-9_\.]+ ?<- ?function(.*{") 3) + (t 1000))) + )) + (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***") nil nil nil) + (kill-buffer "***essregionremoteeval***")) + ;; Don't restore history or save workspace image + '(inferior-R-args "--no-restore-history --no-save") + ) #+END_SRC ** Rainbowmode From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colorizes color strings #+BEGIN_SRC emacs-lisp - (use-package rainbow-mode - ;; add ess to the x major mode - :config (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[S]) - (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[R]) - ) +(use-package rainbow-mode + :hook ((LaTeX-mode ess-mode python-mode cperl-mode) . rainbow-mode) + :delight 🌈 + ;; add ess to the x major mode + :config (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[S]) + (add-to-list 'rainbow-x-colors-major-mode-list 'ESS[R]) +) #+END_SRC ** YAML Mode #+BEGIN_SRC emacs-lisp - (use-package yaml-mode - ;; add ess to the x major mode - :mode ("\\.\\(yaml|yml\\)\\'" . yaml-mode) - ) +(use-package yaml-mode + ;; add ess to the x major mode + :mode ("\\.\\(yaml|yml\\)\\'" . yaml-mode) +) #+END_SRC ** Polymode #+BEGIN_SRC emacs-lisp (use-package poly-noweb - :ensure t :after polymode ) (use-package poly-markdown - :ensure t :after polymode ) (use-package poly-R - :ensure t :after (:all polymode poly-markdown poly-noweb) - ; :mode ("\\.Snw" . poly-noweb+r-mode) - ; :mode ("\\.Rnw" . poly-noweb+r-mode) - ; :mode ("\\.Rmd" . poly-markdown+r-mode) + :mode ("\\.Snw" . poly-noweb+r-mode) + :mode ("\\.Rnw" . poly-noweb+r-mode) + :mode ("\\.Rmd" . poly-markdown+r-mode) ) (use-package polymode - :ensure t + :defer t ) #+END_SRC ** Outlining -*** Outline magic -#+BEGIN_SRC emacs-lisp - (use-package outline-magic) +*** outline minor mode +#+BEGIN_SRC emacs-lisp +(use-package outline + :straight nil + :delight + :init + ; (setq outline-minor-mode-prefix nil) + :config + (define-prefix-command 'cm-map nil "Outline-") + (global-set-key "\M-o" cm-map) + ; Outline-minor-mode key map +; HIDE +(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" '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 +(define-key cm-map "p" 'outline-previous-visible-heading) ; Previous +(define-key cm-map "f" 'outline-forward-same-level) ; Forward - same level +(define-key cm-map "b" 'outline-backward-same-level) ; Backward - same level + +) #+END_SRC -*** Outline mode +*** outshine (outlining) integration #+BEGIN_SRC emacs-lisp -;; change the outline mode prefix from C-c @ to C-c C-2 -(setq outline-minor-mode-prefix "C-c C-2") -;;(add-hook 'outline-minor-mode-hook -;; (lambda () (local-set-key (kbd "C-c C-2") -;; outline-mode-prefix-map))) - +; (use-package outshine +; :after outline +; :hook (outline-minor-mode . outshine-mode) +; ) #+END_SRC ** Writeroom Mode #+BEGIN_SRC emacs-lisp - (use-package writeroom-mode - :config - (defun my/writing-mode () - "Start my writing mode; enable visual-line-mode and auto-fill-mode" - (interactive) - (if writeroom-mode - (progn - (writeroom-mode -1) - (visual-line-mode -1) - (auto-fill-mode -1) - (visual-fill-column-mode -1) - ) - (visual-line-mode 1) - (auto-fill-mode 1) - (visual-fill-column-mode 1) - (writeroom-mode 1)) - ) +(use-package writeroom-mode + :commands (writeroom-mode) + :config + (defun my/writing-mode () + "Start my writing mode; enable visual-line-mode and auto-fill-mode" + (interactive) + (if writeroom-mode + (progn + (writeroom-mode -1) + (visual-line-mode -1) + (auto-fill-mode -1) + (visual-fill-column-mode -1) + ) + (visual-line-mode 1) + (auto-fill-mode 1) + (visual-fill-column-mode 1) + (writeroom-mode 1)) ) + ) #+END_SRC ** GhostText/Atomic Chrome #+BEGIN_SRC emacs-lisp - (use-package atomic-chrome - :config - (ignore-errors (atomic-chrome-start-server)) - (setq atomic-chrome-buffer-open-style 'full) - ) +(use-package atomic-chrome + :config + (ignore-errors (atomic-chrome-start-server)) + (setq atomic-chrome-buffer-open-style 'full) + ) #+END_SRC ** Edit Server #+BEGIN_SRC emacs-lisp - (use-package edit-server - :ensure t - :commands edit-server-start - :init (if after-init-time - (edit-server-start) - (add-hook 'after-init-hook - #'(lambda() (edit-server-start)))) - :config (setq edit-server-new-frame-alist - '((name . "Edit with Emacs FRAME") - (top . 200) - (left . 200) - (width . 80) - (height . 25) - (minibuffer . t) - (menu-bar-lines . t) - (window-system . x))) - ) +(use-package edit-server + :commands edit-server-start + :init (if after-init-time + (edit-server-start) + (add-hook 'after-init-hook + #'(lambda() (edit-server-start)))) + :config (setq edit-server-new-frame-alist + '((name . "Edit with Emacs FRAME") + (top . 200) + (left . 200) + (width . 80) + (height . 25) + (minibuffer . t) + (menu-bar-lines . t) + (window-system . x))) + ) #+END_SRC ** Multiple Cursors - :PROPERTIES: - :ID: 6fcf218b-a762-4c37-9339-a8202ddeb544 - :END: [[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)) - ) +(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)) + ) #+END_SRC ** Web Mode #+BEGIN_SRC emacs-lisp - (use-package web-mode - :load-path "/home/don/projects/web-mode/" - :mode ("\\.\\(tx|tmpl\\)\\'" . web-mode) - :config - (add-to-list 'auto-mode-alist '("\\.tmpl\\'" . web-mode)) - (setq web-mode-enable-engine-detection t) - (setq web-mode-engines-alist - '(("template-toolkit" . "\\.tmpl\\'"))) - ) +(use-package web-mode + :mode ("\\.\\(tx|tmpl\\)\\'" . web-mode) + :config + (add-to-list 'auto-mode-alist '("\\.tmpl\\'" . web-mode)) + (setq web-mode-enable-engine-detection t) + (setq web-mode-engines-alist + '(("template-toolkit" . "\\.tmpl\\'"))) + ) #+END_SRC ** Spamassassin Mode #+BEGIN_SRC emacs-lisp - (use-package spamassassin-mode - :commands spamassassin-mode - :ensure f - ) +(use-package spamassassin-mode + :straight nil + :load-path "~/lib/emacs_el" + :commands spamassassin-mode + ) #+END_SRC ** Password Store #+BEGIN_SRC emacs-lisp - (use-package password-store - :ensure f - :commands password-store-edit password-store-generate - ) +(use-package password-store + :commands password-store-edit password-store-generate + :config + (defun dla/password-store-edit (entry) + "Edit password for ENTRY which doesn't require it to already exist" + (interactive (list (password-store--completing-read nil))) + (password-store--run-edit entry)) + (advice-add 'password-store-edit :override #'dla/password-store-edit) + ) #+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)) +(use-package css + :straight css-mode + :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-mode - :config - ;; load abbreviations from - (setq abbrev-file-name - "~/.emacs_abbrev_def") +(use-package abbrev + :straight nil + :delight abbrev-mode + :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)) + ;; 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)) + ;; for now, use abbrev mode everywhere + :init + (setq default-abbrev-mode t)) #+END_SRC +** Debugging (realgud) +#+BEGIN_SRC emacs-lisp +(use-package realgud + :commands (realgud:pdb realgud:gdb) + ) +#+END_SRC ** Python Programming #+BEGIN_SRC emacs-lisp - (use-package elpy - :ensure t - :init - (elpy-enable) - ) +(use-package python-mode + :delight Py 🐍 + :hook + (python-mode . pyvenv-mode) + (python-mode . flycheck-mode) + (python-mode . blacken-mode) + (python-mode . yas-minor-mode) + (python-mode . anaconda-mode) + ) +(use-package pyvenv + :delight + :after python-mode + ) +(use-package blacken + :delight + :after python-mode + :commands (blacken-buffer) + :config + (setq-default blacken-fast-unsafe t) +) +#+END_SRC +*** Black +#+begin_src emacs-lisp :tangle yes +(use-package python-black + :delight + :commands (python-black-buffer python-black-statement) + :after python) +#+end_src +*** Sphinx Documentation +#+begin_src emacs-lisp :tangle yes +(use-package numpydoc + :after python + :bind (:map python-mode-map + ("C-c C-n" . numpydoc-generate))) +(use-package sphinx-doc + :delight 🐈 + :config + (setq sphinx-doc-include-types t) + :after python + :hook (python-mode . sphinx-doc-mode) + ) +(use-package python-docstring + :delight + :after python + :hook (python-mode . python-docstring-mode) + ) +#+end_src +*** Anaconda Mode (Documentation lookup and completion) +#+BEGIN_SRC emacs-lisp +(use-package anaconda-mode + :delight + :after python +) #+END_SRC - ** Go language #+BEGIN_SRC emacs-lisp (use-package go-mode - :diminish "go" + :delight "go" :mode "\\.go" ) #+END_SRC @@ -1426,26 +1490,47 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ** Beancount #+BEGIN_SRC emacs-lisp (use-package beancount + :straight (beancount + :type git + :host github + :repo "cnsunyour/beancount.el") :load-path "~/lib/emacs_el/beancount-mode/" - :ensure f - :mode "\\.beancount\\'" + :mode "\\.bean\\(?:count\\)?\\'" ) #+END_SRC +** Apache +#+BEGIN_SRC emacs-lisp +(use-package apache-mode + :delight 🪶 + :mode "apache\\.conf\\'" + ) +#+END_SRC +** ELDoc +#+BEGIN_SRC emacs-lisp +(use-package eldoc + :delight + :commands eldoc-mode + :straight nil + ) +#+END_SRC + * Email ** Mutt *** Message-mode #+BEGIN_SRC emacs-lisp (use-package message - :ensure f - :diminish (message "✉") + :straight nil + :delight (message "✉") + :delight (message-mode "✉") :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 "✉") + ("C-c C-a" . my/post-attach-file) + ("C-x p" . my/message-kill-buffer) + ) :config (defun my/message-mode-settings () (font-lock-add-keywords nil @@ -1454,7 +1539,10 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ("^[ \t]*>[ \t]*>.*$" (0 'message-double-quoted-text-face)))) ) - + (defun my/message-kill-buffer () + (interactive) + (kill-buffer nil) + ) (defun my/post-attach-file () "Prompt for an attachment." (interactive) @@ -1483,33 +1571,39 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori #+END_SRC *** Muttrc mode #+BEGIN_SRC emacs-lisp - (use-package muttrc-mode - :mode "muttngrc" - :mode "muttrc" - ) - +(use-package mutt-mode + :mode "muttngrc" + :mode "muttrc" + :config + (setq mutt-alias-file-list (quote ("~/.mutt/aliases" "~/.mail_aliases"))) +) +#+END_SRC +*** Set mail User agent +#+BEGIN_SRC emacs-lisp +(setq mail-user-agent (quote sendmail-user-agent)) #+END_SRC * Base emacs ** Reverting buffers #+BEGIN_SRC emacs-lisp - (use-package autorevert - :diminish auto-revert-mode - :config - (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)) +(use-package autorevert + :delight auto-revert-mode + :demand t + :config + (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 "ø") - :mode ("\\.\\(org\\|org_archive\\|txt\\)\\'" . org-mode) - :bind (("C-c l" . org-store-link) - ("C-c a" . org-agenda) - ("C-c b" . org-iswitchb)) +(use-package org + :delight (org-mode "ø") + :mode ("\\.\\(org\\|org_archive\\|txt\\)\\'" . org-mode) + :bind (("C-c l l" . org-store-link) + ("C-c a" . org-agenda) + ("C-c b" . org-iswitchb)) #+END_SRC ** Agenda Configuration #+BEGIN_SRC emacs-lisp @@ -1638,16 +1732,16 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (set-register ?R (cons 'file "~/projects/reviews/reviews.org")) (set-register ?d (cons 'file "~/projects/org-notes/diary.org")) ; from https://emacs.stackexchange.com/questions/909/how-can-i-have-an-agenda-timeline-view-of-multiple-files - (defun org-agenda-timeline-all (&optional arg) - (interactive "P") - (with-temp-buffer - (dolist (org-agenda-file org-agenda-files) - (insert-file-contents org-agenda-file nil) - (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) + ; (defun org-agenda-timeline-all (&optional arg) + ; (interactive "P") + ; (with-temp-buffer + ; (dolist (org-agenda-file org-agenda-files) + ; (insert-file-contents org-agenda-file nil) + ; (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) #+END_SRC ** General config @@ -1753,52 +1847,57 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori #+END_SRC ** Utility Functions #+BEGIN_SRC emacs-lisp - (defun bh/hide-other () - (interactive) - (save-excursion - (org-back-to-heading 'invisible-ok) - (outline-hide-other) - (org-cycle) - (org-cycle) - (org-cycle))) - - (defun bh/set-truncate-lines () - "Toggle value of truncate-lines and refresh window display." - (interactive) - (setq truncate-lines (not truncate-lines)) - ;; now refresh window display (an idiom from simple.el): - (save-excursion - (set-window-start (selected-window) - (window-start (selected-window))))) +(defun bh/hide-other () + (interactive) + (save-excursion + (org-back-to-heading 'invisible-ok) + (outline-hide-other) + (org-cycle) + (org-cycle) + (org-cycle))) + +(defun bh/set-truncate-lines () + "Toggle value of truncate-lines and refresh window display." + (interactive) + (setq truncate-lines (not truncate-lines)) + ;; now refresh window display (an idiom from simple.el): + (save-excursion + (set-window-start (selected-window) + (window-start (selected-window))))) - (defun bh/switch-to-scratch () - (interactive) - (switch-to-buffer "*scratch*")) +(defun bh/switch-to-scratch () + (interactive) + (switch-to-buffer "*scratch*")) - (setq org-use-fast-todo-selection t) - (setq org-treat-S-cursor-todo-selection-as-state-change nil) +(setq org-use-fast-todo-selection t) +(setq org-treat-S-cursor-todo-selection-as-state-change nil) - ; create function to create headlines in file. This comes from - ; http://stackoverflow.com/questions/13340616/assign-ids-to-every-entry-in-org-mode - (defun my/org-add-ids-to-headlines-in-file () - "Add ID properties to all headlines in the current file which - do not already have one." - (interactive) - (org-map-entries 'org-id-get-create)) - (defun dla/org-update-ids-to-headlines-in-file () - "Add or replace ID properties to all headlines in the current file - (or narrowed region)." - (interactive) - (org-map-entries '(lambda () (org-id-get-create t)))) - ; if we wanted to do this to every buffer, do the following: - ; (add-hook 'org-mode-hook - ; (lambda () - ; (add-hook 'before-save-hook 'my/org-add-ids-to-headlines-in-file nil 'local))) +; create function to create headlines in file. This comes from +; http://stackoverflow.com/questions/13340616/assign-ids-to-every-entry-in-org-mode +(defun my/org-add-ids-to-headlines-in-file () + "Add ID properties to all headlines in the current file which +do not already have one." + (interactive) + (save-excursion + (widen) + (goto-char (point-min)) + (when (not (re-search-forward "^#\\+OPTIONS:.*auto-id:f" (point-max) t)) + (org-map-entries 'org-id-get-create)))) +(defun dla/org-update-ids-to-headlines-in-file () + "Add or replace ID properties to all headlines in the current file +(or narrowed region)." + (interactive) + + (org-map-entries '(lambda () (org-id-get-create t)))) +; if we wanted to do this to every buffer, do the following: +(add-hook 'org-mode-hook + (lambda () + (add-hook 'before-save-hook 'my/org-add-ids-to-headlines-in-file nil 'local))) #+END_SRC ** Org ID locations #+BEGIN_SRC emacs-lisp (use-package find-lisp - :ensure t) + :demand t) (setq org-agenda-text-search-extra-files (append '(agenda-archives) (find-lisp-find-files "~/projects/org-notes" "\.org$") @@ -2045,14 +2144,14 @@ Maildir, or by Message-ID." #+END_SRC ** LaTeX configuration - :PROPERTIES: - :ID: 7135ba17-6a50-4eed-84ca-b90afa5b12f8 - :END: #+BEGIN_SRC emacs-lisp -(use-package ox-extra +(use-package org-contrib + :no-require t + :after org :config - (ox-extras-activate '(ignore-headlines))) -(require 'ox-latex) + (require 'ox-extra) + (ox-extras-activate '(latex-header-blocks ignore-headlines)) + (require 'ox-latex) (add-to-list 'org-latex-classes '("memarticle" "\\documentclass[11pt,oneside,article]{memoir}\n" @@ -2170,6 +2269,7 @@ Maildir, or by Message-ID." ;; keep latex logfiles (setq org-latex-remove-logfiles nil) +) ;; Resume clocking task when emacs is restarted (org-clock-persistence-insinuate) @@ -2270,7 +2370,7 @@ as the default task." ;; We're in the agenda ;; (let* ((marker (org-get-at-bol 'org-hd-marker)) - (tags (org-with-point-at marker (org-get-tags-at)))) + (tags (org-with-point-at marker (org-get-tags)))) (if (and (eq arg 4) tags) (org-agenda-clock-in '(16)) (bh/clock-in-organization-task-as-default))) @@ -2452,54 +2552,47 @@ same directory as the org-buffer and insert a link to this file." #+END_SRC ** appt integration #+BEGIN_SRC emacs-lisp - (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 +(use-package appt + :straight nil + :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 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)))) - ) ) + ;; 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)))) + ) + ) -#+END_SRC -** outshine (outlining) integration -#+BEGIN_SRC emacs-lisp -(use-package outshine - :ensure t - :hook (outline-minor-mode . outshine-hook-function) -) #+END_SRC ** End use-package #+BEGIN_SRC emacs-lisp @@ -2513,17 +2606,18 @@ same directory as the org-buffer and insert a link to this file." #+END_SRC ** Goto line #+BEGIN_SRC emacs-lisp - (global-unset-key "\M-g") - (global-set-key (kbd "M-g l") 'goto-line) + ; (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-mode - :mode "debian/changelog" - :config - (setq debian-changelog-mailing-address "don@debian.org") - (setq debian-changelog-full-name "Don Armstrong")) +(use-package debian-changelog-mode + :mode "debian/changelog" + :ensure debian-el + :config + (setq debian-changelog-mailing-address "don@debian.org") + (setq debian-changelog-full-name "Don Armstrong")) #+END_SRC * Misc (uncharacterized) #+BEGIN_SRC emacs-lisp @@ -2531,18 +2625,11 @@ same directory as the org-buffer and insert a link to this file." (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) + #+END_SRC -** Turn on fontlock and icomplete +** Turn on fontlock #+BEGIN_SRC emacs-lisp (global-font-lock-mode 1) - (icomplete-mode 1) - (setq log-edit-keep-buffer t) -#+END_SRC -** Set mail User agent -#+BEGIN_SRC emacs-lisp - (setq mail-user-agent (quote sendmail-user-agent)) - (setq mutt-alias-file-list (quote ("~/.mutt/aliases" "~/.mail_aliases"))) #+END_SRC ** PS Printing #+BEGIN_SRC emacs-lisp @@ -2574,233 +2661,183 @@ same directory as the org-buffer and insert a link to this file." #+END_SRC ** Use primary selection on unix machines #+BEGIN_SRC emacs-lisp - ;; switch back to the old primary selection method - (if (or (string-equal system-type "darwin") - (string-equal system-type "windows") - ) - (progn - (setq x-select-enable-clipboard t) - (setq x-select-enable-primary nil) +;; switch back to the old primary selection method +(if (or (string-equal system-type "darwin") + (string-equal system-type "windows") ) (progn - (setq x-select-enable-clipboard nil) - (setq x-select-enable-primary t) - )) - ; (setq mouse-drag-copy-region t) - - (fset 'perl-mode 'cperl-mode) - ;;(load-file "cperl-mode.el") - - ;; tramp configuration - (setq tramp-use-ssh-controlmaster-options nil) - - (setq-default c-indent-level 4) - (setq-default c-brace-imaginary-offset 0) - (setq-default c-brace-offset -4) - (setq-default c-argdecl-indent 4) - (setq-default c-label-offset -4) - (setq-default c-continued-statement-offset 4) - ; tabs are annoying - (setq-default indent-tabs-mode nil) - (setq-default tab-width 4) - - - ;; (autoload 'php-mode "php-mode" "PHP editing mode" t) - ;; (add-to-list 'auto-mode-alist '("\\.php3?\\'" . php-mode)) - ;; (add-to-list 'auto-mode-alist '("\\.phtml?\\'" . php-mode)) - ;; (add-to-list 'auto-mode-alist '("\\.php?\\'" . php-mode)) - ;; (add-to-list 'auto-mode-alist '("\\.php4?\\'" . php-mode)) - + (setq select-enable-clipboard t) + (setq select-enable-primary nil) + ) + (progn + (setq select-enable-clipboard nil) + (setq select-enable-primary t) + )) +; (setq mouse-drag-copy-region t) + +(setq-default c-indent-level 4) +(setq-default c-brace-imaginary-offset 0) +(setq-default c-brace-offset -4) +(setq-default c-argdecl-indent 4) +(setq-default c-label-offset -4) +(setq-default c-continued-statement-offset 4) +; tabs are annoying +(setq-default indent-tabs-mode nil) +(setq-default tab-width 4) + +(defun insert-date () + "Insert date at point." + (interactive) + (insert (format-time-string "%A, %B %e, %Y %k:%M:%S %Z"))) +(global-set-key "\C-[d" 'insert-date) + +(defun unfill-paragraph (arg) + "Pull this whole paragraph up onto one line." + (interactive "*p") + (let ((fill-column 10000)) + (fill-paragraph arg)) + ) - (defun insert-date () - "Insert date at point." - (interactive) - (insert (format-time-string "%A, %B %e, %Y %k:%M:%S %Z"))) - (global-set-key "\C-[d" 'insert-date) - - (defun unfill-paragraph (arg) - "Pull this whole paragraph up onto one line." - (interactive "*p") - (let ((fill-column 10000)) - (fill-paragraph arg)) - ) +(column-number-mode t) - (column-number-mode t) - #+END_SRC ** Desktop-save-mode If the envvar EMACS_SERVER_NAME is set, consider this a separate emacs, and use a different desktop file to restore history #+BEGIN_SRC emacs-lisp - (use-package desktop - :demand - :config - (setq desktop-base-file-name - (convert-standard-filename - (concat ".emacs" - (or (getenv "EMACS_SERVER_NAME") - "") - ".desktop") - )) - (setq desktop-base-lock-name - (convert-standard-filename - (concat desktop-base-file-name - ".lock"))) - (setq desktop-auto-save-timeout 60) - (setq desktop-restore-eager 5) - (setq desktop-lazy-verbose nil) - (desktop-save-mode 1) - ; (desktop-read) - ) +(use-package desktop + :demand + :config + (setq desktop-base-file-name + (convert-standard-filename + (concat ".emacs" + (or (getenv "EMACS_SERVER_NAME") + "") + ".desktop") + )) + (setq desktop-base-lock-name + (convert-standard-filename + (concat desktop-base-file-name + ".lock"))) + (setq desktop-auto-save-timeout 60) + (setq desktop-restore-eager 5) + (setq desktop-lazy-verbose nil) + (desktop-save-mode 1) + ; (desktop-read) +) #+END_SRC ** Misc (Uncharacterized) #+BEGIN_SRC emacs-lisp - '(icomplete-mode on) - (custom-set-faces - ;; custom-set-faces was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. - '(menu ((((type x-toolkit)) (:background "black" :foreground "grey90"))))) - - - (put 'upcase-region 'disabled nil) - (put 'downcase-region 'disabled nil) - (put 'narrow-to-region 'disabled nil) - - ; (defun turn-on-flyspell () - ; "Force flyspell-mode on using a positive arg. For use in hooks." - ; (interactive) - ; (flyspell-mode 1)) - - ; Outline-minor-mode key map - (define-prefix-command 'cm-map nil "Outline-") - ; HIDE - (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" '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 - (define-key cm-map "p" 'outline-previous-visible-heading) ; Previous - (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) - ; 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 () - "Fix up tmux xterm keys" - (if (getenv "TMUX") - (progn - (let ((x 2) (tkey "")) - (while (<= x 8) - ;; shift - (if (= x 2) - (setq tkey "S-")) - ;; alt - (if (= x 3) - (setq tkey "M-")) - ;; alt + shift - (if (= x 4) - (setq tkey "M-S-")) - ;; ctrl - (if (= x 5) - (setq tkey "C-")) - ;; ctrl + shift - (if (= x 6) - (setq tkey "C-S-")) - ;; ctrl + alt - (if (= x 7) - (setq tkey "C-M-")) - ;; ctrl + alt + shift - (if (= x 8) - (setq tkey "C-M-S-")) - - ;; arrows - (define-key key-translation-map (kbd (format "M-[ 1 ; %d A" x)) (kbd (format "%s" tkey))) - (define-key key-translation-map (kbd (format "M-[ 1 ; %d B" x)) (kbd (format "%s" tkey))) - (define-key key-translation-map (kbd (format "M-[ 1 ; %d C" x)) (kbd (format "%s" tkey))) - (define-key key-translation-map (kbd (format "M-[ 1 ; %d D" x)) (kbd (format "%s" tkey))) - ;; home - (define-key key-translation-map (kbd (format "M-[ 1 ; %d H" x)) (kbd (format "%s" tkey))) - ;; end - (define-key key-translation-map (kbd (format "M-[ 1 ; %d F" x)) (kbd (format "%s" tkey))) - ;; page up - (define-key key-translation-map (kbd (format "M-[ 5 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; page down - (define-key key-translation-map (kbd (format "M-[ 6 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; insert - (define-key key-translation-map (kbd (format "M-[ 2 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; delete - (define-key key-translation-map (kbd (format "M-[ 3 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f1 - (define-key key-translation-map (kbd (format "M-[ 1 ; %d P" x)) (kbd (format "%s" tkey))) - ;; f2 - (define-key key-translation-map (kbd (format "M-[ 1 ; %d Q" x)) (kbd (format "%s" tkey))) - ;; f3 - (define-key key-translation-map (kbd (format "M-[ 1 ; %d R" x)) (kbd (format "%s" tkey))) - ;; f4 - (define-key key-translation-map (kbd (format "M-[ 1 ; %d S" x)) (kbd (format "%s" tkey))) - ;; f5 - (define-key key-translation-map (kbd (format "M-[ 15 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f6 - (define-key key-translation-map (kbd (format "M-[ 17 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f7 - (define-key key-translation-map (kbd (format "M-[ 18 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f8 - (define-key key-translation-map (kbd (format "M-[ 19 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f9 - (define-key key-translation-map (kbd (format "M-[ 20 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f10 - (define-key key-translation-map (kbd (format "M-[ 21 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f11 - (define-key key-translation-map (kbd (format "M-[ 23 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f12 - (define-key key-translation-map (kbd (format "M-[ 24 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f13 - (define-key key-translation-map (kbd (format "M-[ 25 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f14 - (define-key key-translation-map (kbd (format "M-[ 26 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f15 - (define-key key-translation-map (kbd (format "M-[ 28 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f16 - (define-key key-translation-map (kbd (format "M-[ 29 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f17 - (define-key key-translation-map (kbd (format "M-[ 31 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f18 - (define-key key-translation-map (kbd (format "M-[ 32 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f19 - (define-key key-translation-map (kbd (format "M-[ 33 ; %d ~" x)) (kbd (format "%s" tkey))) - ;; f20 - (define-key key-translation-map (kbd (format "M-[ 34 ; %d ~" x)) (kbd (format "%s" tkey))) - - (setq x (+ x 1)) - )) - ) - ) +(put 'upcase-region 'disabled nil) +(put 'downcase-region 'disabled nil) +(put 'narrow-to-region 'disabled nil) + +; 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 () + "Fix up tmux xterm keys" + (if (getenv "TMUX") + (progn + (let ((x 2) (tkey "")) + (while (<= x 8) + ;; shift + (if (= x 2) + (setq tkey "S-")) + ;; alt + (if (= x 3) + (setq tkey "M-")) + ;; alt + shift + (if (= x 4) + (setq tkey "M-S-")) + ;; ctrl + (if (= x 5) + (setq tkey "C-")) + ;; ctrl + shift + (if (= x 6) + (setq tkey "C-S-")) + ;; ctrl + alt + (if (= x 7) + (setq tkey "C-M-")) + ;; ctrl + alt + shift + (if (= x 8) + (setq tkey "C-M-S-")) + + ;; arrows + (define-key key-translation-map (kbd (format "M-[ 1 ; %d A" x)) (kbd (format "%s" tkey))) + (define-key key-translation-map (kbd (format "M-[ 1 ; %d B" x)) (kbd (format "%s" tkey))) + (define-key key-translation-map (kbd (format "M-[ 1 ; %d C" x)) (kbd (format "%s" tkey))) + (define-key key-translation-map (kbd (format "M-[ 1 ; %d D" x)) (kbd (format "%s" tkey))) + ;; home + (define-key key-translation-map (kbd (format "M-[ 1 ; %d H" x)) (kbd (format "%s" tkey))) + ;; end + (define-key key-translation-map (kbd (format "M-[ 1 ; %d F" x)) (kbd (format "%s" tkey))) + ;; page up + (define-key key-translation-map (kbd (format "M-[ 5 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; page down + (define-key key-translation-map (kbd (format "M-[ 6 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; insert + (define-key key-translation-map (kbd (format "M-[ 2 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; delete + (define-key key-translation-map (kbd (format "M-[ 3 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f1 + (define-key key-translation-map (kbd (format "M-[ 1 ; %d P" x)) (kbd (format "%s" tkey))) + ;; f2 + (define-key key-translation-map (kbd (format "M-[ 1 ; %d Q" x)) (kbd (format "%s" tkey))) + ;; f3 + (define-key key-translation-map (kbd (format "M-[ 1 ; %d R" x)) (kbd (format "%s" tkey))) + ;; f4 + (define-key key-translation-map (kbd (format "M-[ 1 ; %d S" x)) (kbd (format "%s" tkey))) + ;; f5 + (define-key key-translation-map (kbd (format "M-[ 15 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f6 + (define-key key-translation-map (kbd (format "M-[ 17 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f7 + (define-key key-translation-map (kbd (format "M-[ 18 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f8 + (define-key key-translation-map (kbd (format "M-[ 19 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f9 + (define-key key-translation-map (kbd (format "M-[ 20 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f10 + (define-key key-translation-map (kbd (format "M-[ 21 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f11 + (define-key key-translation-map (kbd (format "M-[ 23 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f12 + (define-key key-translation-map (kbd (format "M-[ 24 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f13 + (define-key key-translation-map (kbd (format "M-[ 25 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f14 + (define-key key-translation-map (kbd (format "M-[ 26 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f15 + (define-key key-translation-map (kbd (format "M-[ 28 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f16 + (define-key key-translation-map (kbd (format "M-[ 29 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f17 + (define-key key-translation-map (kbd (format "M-[ 31 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f18 + (define-key key-translation-map (kbd (format "M-[ 32 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f19 + (define-key key-translation-map (kbd (format "M-[ 33 ; %d ~" x)) (kbd (format "%s" tkey))) + ;; f20 + (define-key key-translation-map (kbd (format "M-[ 34 ; %d ~" x)) (kbd (format "%s" tkey))) + + (setq x (+ x 1)) + )) + ) ) - ; (add-hook 'tty-setup-hook 'fix-up-tmux-keys) - - (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) - (verify-visited-file-modtime) - (< (* 8 1024 1024) (buffer-size)) - (/= 0 (call-process-region 1 (+ 1 (buffer-size)) "diff" nil nil nil "-q" (buffer-file-name) "-"))) - ad-do-it - (clear-visited-file-modtime) - (not-modified))) - (ad-activate 'ask-user-about-supersession-threat) + ) +; (add-hook 'tty-setup-hook 'fix-up-tmux-keys) + +(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) + (verify-visited-file-modtime) + (< (* 8 1024 1024) (buffer-size)) + (/= 0 (call-process-region 1 (+ 1 (buffer-size)) "diff" nil nil nil "-q" (buffer-file-name) "-"))) + ad-do-it + (clear-visited-file-modtime) + (not-modified))) +(ad-activate 'ask-user-about-supersession-threat) #+END_SRC * Start Server @@ -2811,13 +2848,11 @@ emacs, and use a different desktop file to restore history (or (getenv "EMACS_SERVER_NAME") "server")) (unless (server-running-p) - (global-set-key "\C-xp" 'server-edit) + ; (global-set-key "\C-xp" 'server-edit) (server-start))) #+END_SRC - - * END #+BEGIN_SRC emacs-lisp - (provide 'don-configuration) +(provide 'don-configuration) #+END_SRC