X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=emacs_el%2Fconfiguration%2Fdon-configuration.org;h=003a8188062e24dbba26cc85a0113b40fe1087f5;hb=c9d730116fd2a1cfef245800207e18af05c9c112;hp=043acfea8ba2dac5ffaf18a6a030d39686fa41ae;hpb=1954f0d0224cb0c769161fa88a9f6cc45d95b747;p=lib.git diff --git a/emacs_el/configuration/don-configuration.org b/emacs_el/configuration/don-configuration.org index 043acfe..003a818 100644 --- a/emacs_el/configuration/don-configuration.org +++ b/emacs_el/configuration/don-configuration.org @@ -1,4 +1,5 @@ #+PROPERTY: header-args:emacs-lisp :tangle don-configuration.el +#+OPTIONS: auto-id:f * Load debugger # if for some reason, things get pear-shaped, we want to be able to @@ -7,6 +8,25 @@ #+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 +(eval-when-compile + (let ((default-directory "~/var/emacs/elpa")) + (normal-top-level-add-subdirs-to-load-path)) + ) +(add-to-list 'load-path '"~/lib/emacs_el/") +(let ((default-directory "~/lib/emacs_el/")) + (normal-top-level-add-subdirs-to-load-path)) +(let ((default-directory "~/var/emacs/elpa")) + (normal-top-level-add-subdirs-to-load-path)) +(setq package-user-dir "~/var/emacs/elpa") +#+END_SRC * Initial startup stuff ** Disable startup screen #+BEGIN_SRC emacs-lisp @@ -25,69 +45,29 @@ #+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) +#+BEGIN_SRC emacs-lisp + (require 'use-package) +(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))) + #+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) + :config + (setq paradox-execute-asynchronously t) + (setq paradox-github-token t) ; I don't want to be prompted about this integration ) #+END_SRC -* Add library paths - -#+BEGIN_SRC emacs-lisp - (add-to-list 'load-path '"~/lib/emacs_el/") - (add-to-list 'load-path '"~/lib/emacs_el/magit-annex") -#+END_SRC * Disable custom-vars #+BEGIN_SRC emacs-lisp ;; Set the custom file to /dev/null and don't bother to load it @@ -98,10 +78,10 @@ load [[https://github.com/jwiegley/use-package/][use-package]] even faster #+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 @@ -150,7 +130,7 @@ load [[https://github.com/jwiegley/use-package/][use-package]] even faster #+BEGIN_SRC emacs-lisp (use-package flyspell :ensure t - :diminish flyspell-mode 🐝 + :delight flyspell-mode 🐝 :config (add-hook 'text-mode-hook 'turn-on-flyspell) (add-hook 'c-mode-common-hook 'flyspell-prog-mode) @@ -161,10 +141,40 @@ load [[https://github.com/jwiegley/use-package/][use-package]] even faster ) #+END_SRC + +** Flycheck +#+begin_src emacs-lisp :tangle yes +(use-package flycheck + :ensure t + :delight 🦋 + :if (version<= "24.4" emacs-version) + :commands flycheck-mode + :hook ((prog-mode . flycheck-mode) + ) +) +;; Other pkgs +(use-package flycheck-tip + :ensure t + :commands 'flycheck-tip-cycle + :after flycheck + :bind (:map flycheck-mode-map + ("C-c C-n" . flycheck-tip-cycle))) + +(use-package flycheck-package + :ensure t) + +(use-package flycheck-checkpatch + :ensure t + :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 :tangle yes (use-package flymake - :diminish "Φ") + :delight "Φ") #+end_src ** Winnermode @@ -176,7 +186,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) @@ -302,9 +312,9 @@ value, scrolling continues until there is no more output. #+END_SRC ** Mode line cleaning -*** Diminish +*** Delight #+BEGIN_SRC emacs-lisp - (use-package diminish + (use-package delight :ensure t) #+END_SRC @@ -355,7 +365,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) @@ -379,6 +389,54 @@ value, scrolling continues until there is no more output. ) ) #+END_SRC +** Treemacs: Tree file viewer +#+BEGIN_SRC emacs-lisp +;; Provides workspaces with file browsing (tree file viewer) +;; and project management when coupled with `projectile`. + +(use-package treemacs + :ensure t + :defer t + :config + (setq treemacs-no-png-images t + treemacs-width 24) + :bind ("C-c t" . treemacs)) +#+END_SRC +** LSP mode +#+BEGIN_SRC emacs-lisp +(use-package lsp-mode + :ensure t + :defer t + :commands (lsp lsp-deferred) + :init (setq lsp-keymap-prefix "C-c l") + :hook (python-mode . lsp-deferred)) +;; Provides visual help in the buffer +;; For example definitions on hover. +;; The `imenu` lets me browse definitions quickly. +(use-package lsp-ui + :ensure t + :defer t + :config + (setq lsp-ui-sideline-enable nil + lsp-ui-doc-delay 2) + :hook (lsp-mode . lsp-ui-mode) + :bind (:map lsp-ui-mode-map + ("C-c i" . lsp-ui-imenu))) +;; Language server for Python +;; Read the docs for the different variables set in the config. +(use-package lsp-pyright + :ensure t + :defer t + :config + (setq lsp-clients-python-library-directories '("/usr/" "~/miniconda3/pkgs")) + (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 "~/miniconda3/envs") + :hook ((python-mode . (lambda () + (require 'lsp-pyright) (lsp-deferred))))) +#+END_SRC ** Company #+BEGIN_SRC emacs-lisp (use-package company @@ -398,6 +456,19 @@ value, scrolling continues until there is no more output. company-minimum-prefix-length 1 company-global-modes '(not) company-lighter-base "(C)") + (setq company-backends '(company-capf + company-keywords + company-semantic + company-files + company-etags + company-elisp + company-clang + company-irony-c-headers + company-irony + company-jedi + company-cmake + company-ispell + company-yasnippet)) (global-company-mode 1) :bind (:map company-active-map ("C-n" . company-select-next) @@ -409,24 +480,25 @@ value, scrolling continues until there is no more output. #+END_SRC *** C/C++ #+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) +(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))) - (add-to-list 'company-backends #'company-c-headers))) + (setq company-c-headers-path-system + #'malb/ede-object-system-include-path))) #+END_SRC *** Python #+BEGIN_SRC emacs-lisp -(use-package company-anaconda +(use-package company-jedi :ensure t - :config (add-to-list 'company-backends #'company-anaconda)) + :hook (python-mode . 'jedi:setup) + :config + (setq jedi:complete-on-dot t) + ) #+END_SRC *** Perl #+BEGIN_SRC emacs-lisp @@ -462,6 +534,7 @@ value, scrolling continues until there is no more output. ) ) #+END_SRC +**** Bibtex #+BEGIN_SRC emacs-lisp (use-package company-bibtex :ensure t @@ -469,64 +542,64 @@ value, scrolling continues until there is no more output. #+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 +#+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]]) +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. +*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.") +#+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)))) +(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 +(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]]) +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 +#+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 @@ -624,9 +697,18 @@ value, scrolling continues until there is no more output. ) #+END_SRC +*** Forge (github/gitlab) +#+BEGIN_SRC emacs-lisp +(use-package forge + :ensure t + :after magit + ) +#+END_SRC + ** Perl #+BEGIN_SRC emacs-lisp (use-package cperl-mode + :ensure t :config (progn ;; Use c-mode for perl .xs files @@ -672,11 +754,15 @@ value, scrolling continues until there is no more output. #+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 + :ensure t + :hook sql-mode + ) (use-package sql + :ensure t :mode (("\\.sql\\'" . sql-mode)) - :config - (require sql-indent)) + ) #+END_SRC ** Ediff #+BEGIN_SRC emacs-lisp @@ -704,251 +790,216 @@ Attempts to automatically identify the right indentation for a file ) #+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 + :ensure t + :init + (vertico-mode) + + ;; 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) + :config + (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 ) -#+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 +;; Persist history over Emacs restarts. Vertico sorts by history position. +(use-package savehist :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 + :init + (savehist-mode)) -*** 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 +** 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 + :ensure t + :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 + :ensure t + :bind (("M-A" . marginalia-cycle) + :map minibuffer-local-map + ("M-A" . marginalia-cycle)) + :init + (marginalia-mode) + ) +#+end_src +** Embark: Minibuffer actions and context menu +#+begin_src emacs-lisp +(use-package embark + :ensure t + + :bind + (("C-." . embark-act) ;; pick some comfortable binding + ("C-;" . embark-dwim) ;; good alternative: M-. + ("C-h B" . embark-bindings)) ;; alternative for `describe-bindings' + + :init - (setq projectile-make-test-cmd "make check" - projectile-switch-project-action 'helm-projectile - projectile-mode-line '(:eval (format "»{%s}" (projectile-project-name)))) + ;; Optionally replace the key help with a completing-read interface + (setq prefix-help-command #'embark-prefix-help-command) - (projectile-global-mode))) + :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))))) + +(use-package embark-consult + :ensure t + :hook + (embark-collect-mode . consult-preview-at-point-mode)) #+end_src +** Consult +#+begin_src emacs-lisp +(use-package consult + ;; Replace bindings. Lazily loaded due by `use-package'. + :bind (;; C-c bindings (mode-specific-map) + ("C-c h" . consult-history) + ("C-c m" . consult-mode-command) + ("C-c k" . consult-kmacro) + ;; C-x bindings (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 (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 (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) + + ;; 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 -*** helm integration + ;; Optionally configure preview. The default value + ;; is 'any, such that any key triggers the preview. + ;; (setq consult-preview-key 'any) + ;; (setq consult-preview-key (kbd "M-.")) + ;; (setq consult-preview-key (list (kbd "") (kbd ""))) + ;; 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 (kbd "M-.") + :preview-key '(:debounce 0.4 any)) + + ;; Optionally configure the narrowing key. + ;; Both < and C-+ work reasonably well. + (setq consult-narrow-key "<") ;; (kbd "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. + ;; There are multiple reasonable alternatives to chose from. + ;;;; 1. project.el (the default) + ;; (setq consult-project-function #'consult--default-project--function) + ;;;; 2. projectile.el (projectile-project-root) + ;; (autoload 'projectile-project-root "projectile") + ;; (setq consult-project-function (lambda (_) (projectile-project-root))) + ;;;; 3. vc.el (vc-root-dir) + ;; (setq consult-project-function (lambda (_) (vc-root-dir))) + ;;;; 4. locate-dominating-file + ;; (setq consult-project-function (lambda (_) (locate-dominating-file "." ".git"))) +) +#+end_src +** Projectile -- Project management #+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 projectile + :ensure t + :bind (("" . projectile-compile-project) + ("" . next-error)) + :config (progn + (use-package magit :ensure t) + (projectile-global-mode))) #+end_src + ** Zap to char #+BEGIN_SRC emacs-lisp (use-package avy-zap @@ -1203,8 +1254,8 @@ This can be used to link things pretty quickly if necessary (defun dla/ess-region-remote-eval (start end) "Evaluate region in a remote ESS instance" (interactive "r") - (shell-command-on-region start end "eval_r" (get-buffer-create "***essregionremoteeval***")) - kill-buffer "***essregionremoteeval***") + (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") ) @@ -1256,7 +1307,8 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ** Outlining *** Outline magic #+BEGIN_SRC emacs-lisp - (use-package outline-magic) +; this package doesn't really do exactly what we want it to do +; (use-package outline-magic) #+END_SRC *** Outline mode #+BEGIN_SRC emacs-lisp @@ -1296,10 +1348,27 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (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))) + ) +#+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 @@ -1325,13 +1394,13 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori #+BEGIN_SRC emacs-lisp (use-package spamassassin-mode :commands spamassassin-mode - :ensure f + :ensure t ) #+END_SRC ** Password Store #+BEGIN_SRC emacs-lisp (use-package password-store - :ensure f + :ensure t :commands password-store-edit password-store-generate ) #+END_SRC @@ -1350,7 +1419,7 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori ** Abbrev Mode #+BEGIN_SRC emacs-lisp (use-package abbrev - :diminish abbrev-mode + :delight abbrev-mode :config ;; load abbreviations from (setq abbrev-file-name @@ -1364,10 +1433,67 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (setq default-abbrev-mode t)) #+END_SRC +** Debugging (realgud) +#+BEGIN_SRC emacs-lisp +(use-package realgud + :ensure t + ) +#+END_SRC +** Python Programming +#+BEGIN_SRC emacs-lisp +(use-package python-mode + :delight 🐍 + :hook + (python-mode . pyenv-mode) + (python-mode . flycheck-mode) + (python-mode . company-mode) + (python-mode . blacken-mode) + (python-mode . yas-minor-mode) + (python-mode . anaconda-mode) + ) +(use-package pyenv + :ensure t + ) +(use-package blacken + :delight ⚑ + :init + (setq-default blacken-fast-unsafe t) + ; (setq-default blacken-line-length 80) + :ensure t) +(use-package anaconda-mode + :ensure t + ) + +(use-package elpy + :ensure t + :init + (elpy-enable) + ) +#+END_SRC +*** Black +#+begin_src emacs-lisp :tangle yes + (use-package python-black + :demand t + :after python) +#+end_src +*** Sphinx Documentation +#+begin_src emacs-lisp :tangle yes + (use-package numpydoc + :ensure t + :after python + :bind (:map python-mode-map + ("C-c C-n" . numpydoc-generate))) + (use-package sphinx-doc + :ensure t + :config + (sphinx-doc-mode t) + (setq sphinx-doc-include-types t) + :after python) +#+end_src ** Go language #+BEGIN_SRC emacs-lisp (use-package go-mode - :diminish "go" + :delight "go" :mode "\\.go" ) #+END_SRC @@ -1401,7 +1527,7 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori #+BEGIN_SRC emacs-lisp (use-package message :ensure f - :diminish (message "✉") + :delight (message "✉") :mode ("muttng-[a-z0-9]+-[0-9]+-" . message-mode) :mode ("mutt-[a-z0-9]+-[0-9]+-" . message-mode) :hook 'my/message-mode-settings @@ -1720,7 +1846,7 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (interactive) (save-excursion (org-back-to-heading 'invisible-ok) - (hide-other) + (outline-hide-other) (org-cycle) (org-cycle) (org-cycle))) @@ -1741,22 +1867,27 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori (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 @@ -2008,9 +2139,6 @@ 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 :config @@ -2233,7 +2361,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))) @@ -2529,16 +2657,28 @@ same directory as the org-buffer and insert a link to this file." (show-paren-mode 1) (setq show-paren-delay 0.2) +#+END_SRC +** My Username +#+BEGIN_SRC emacs-lisp (setq user-mail-address "don@donarmstrong.com") +#+END_SRC +** Use primary selection on unix machines +#+BEGIN_SRC emacs-lisp ;; switch back to the old primary selection method - (setq x-select-enable-clipboard nil) - (setq x-select-enable-primary t) + (if (or (string-equal system-type "darwin") + (string-equal system-type "windows") + ) + (progn + (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) - (fset 'perl-mode 'cperl-mode) - ;;(load-file "cperl-mode.el") - ;; tramp configuration (setq tramp-use-ssh-controlmaster-options nil)