]> git.donarmstrong.com Git - lib.git/blobdiff - emacs_el/configuration/don-configuration.org
remove extraneous xb
[lib.git] / emacs_el / configuration / don-configuration.org
index 142fd79b1454f9dc430fc01fc4fddf264b204b98..2397bfacbb533bf90a6f79e914f67981952abfbb 100644 (file)
@@ -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
 #+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
@@ -84,18 +68,6 @@ load  [[https://github.com/jwiegley/use-package/][use-package]] even faster
     (setq paradox-github-token t) ; I don't want to be prompted about this integration
     )
 #+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
-  (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
@@ -106,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
@@ -169,6 +141,36 @@ 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
+  :diminish ðŸ¦‹
+  :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
@@ -387,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
@@ -632,9 +682,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
@@ -680,11 +739,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
@@ -712,251 +775,211 @@ 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 <SPC>" . 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"))))
-  )
-#+END_SRC
-*** Helm Flx
+(use-package vertico
+  :ensure t
+  :init
+  (vertico-mode)
 
- [[https://github.com/PythonNut/helm-flx][helm-flx]] implements intelligent helm fuzzy sorting, provided by [[https://github.com/lewang/flx][flx]].
+  ;; Different scroll margin
+  ;; (setq vertico-scroll-margin 0)
 
- #+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
+  ;; Show more candidates
+  ;; (setq vertico-count 20)
 
-  ;;; 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))
+  ;; Grow and shrink the Vertico minibuffer
+  ;; (setq vertico-resize t)
 
-    (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))
-      )
+  ;; Optionally enable cycling for `vertico-next' and `vertico-previous'.
+  ;; (setq vertico-cycle t)
+  )
 
-#+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 (("<f5>" . projectile-compile-project)
-           ("<f6>" . 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'
 
-              (setq projectile-make-test-cmd "make check"
-                    projectile-switch-project-action 'helm-projectile
-                    projectile-mode-line  '(:eval (format "»{%s}" (projectile-project-name))))
+  :init
+
+  ;; 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)))))
 
-              (projectile-global-mode)))
+(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 "<S-down>") (kbd "<S-up>")))
+  ;; 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 (("<f5>" . projectile-compile-project)
+         ("<f6>" . 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
@@ -1264,7 +1287,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
@@ -1325,9 +1349,6 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
     )
 #+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
@@ -1353,13 +1374,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
@@ -1392,15 +1413,71 @@ From http://julien.danjou.info/projects/emacs-packages#rainbow-mode, this colori
     (setq default-abbrev-mode t))
 #+END_SRC
 
-** Python Programming
+** Debugging (realgud)
 #+BEGIN_SRC emacs-lisp
-  (use-package elpy
-    :ensure t
-    :init
-    (elpy-enable)
-    )
+(use-package realgud
+  :ensure t
+  )
 #+END_SRC
+** Python Programming
+#+BEGIN_SRC emacs-lisp
+(use-package python-mode
+  :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
+  :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
+# *** Jedi
+# #+BEGIN_SRC emacs-lisp
+#   (use-package company-jedi
+#     :ensure t
+#     :hook (python-mode . (add-to-list 'company-backends 'company-jedi))
+#     :hook (python-mode  . 'jedi:setup)
+#     :config
+#     (setq jedi:complete-on-dot t)
+#     )
+# #+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
@@ -1778,22 +1855,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
@@ -2045,9 +2127,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
@@ -2270,7 +2349,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)))
@@ -2579,18 +2658,15 @@ same directory as the org-buffer and insert a link to this file."
           (string-equal system-type "windows")
           )
       (progn
-        (setq x-select-enable-clipboard t)
-        (setq x-select-enable-primary nil)
+        (setq select-enable-clipboard t)
+        (setq select-enable-primary nil)
         )
     (progn
-      (setq x-select-enable-clipboard nil)
-      (setq x-select-enable-primary t)
+      (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)