Commit a9b94619c0c1

Vincent Demeester <vincent@sbr.pm>
2020-04-07 11:48:00
emacs: bankrupcy ๐Ÿ˜›
โ€ฆ as disabling most of the configuration, and re-enabling when I need it. Signed-off-by: Vincent Demeester <vincent@sbr.pm>
1 parent 9b859d3
docs/emacs.org
@@ -498,7 +498,7 @@
 the =Ubuntu= font are not available on the system, I am just letting Emacs start with its
 default font.
 
-#+INCLUDE: "../tools/emacs/config/setup-style.el" src emacs-lisp :range-begin "TypeFaceConfiguration" :range-end "-TypeFaceConfiguration" :lines "7-47"
+#+INCLUDE: "../tools/emacs/config/appearance.el" src emacs-lisp :range-begin "TypeFaceConfiguration" :range-end "-TypeFaceConfiguration" :lines "6-45"
 
 ** Typeface suitability test
 :PROPERTIES:
@@ -580,6 +580,11 @@
 :CUSTOM_ID: h:5fb80d63-6c5b-4d2d-9755-ffe48c851b73
 :END:
 
+ The minibuffer is the locus of extended command interaction. Whether it is about offering
+ input to a prompt, performing a search, executing a function by its name, the minibuffer
+ remains at the epicentre. The default experience is far more powerful than it seems to
+ be. It can get even better by tweaking the available customisation options and defining
+ our own extensions.
 * TODO Directory, buffer and window management
 :PROPERTIES:
 :CUSTOM_ID: h:88c7f450-bb9d-41f6-a8f9-3082a32d3179
@@ -1197,16 +1202,16 @@
 :CUSTOM_ID: h:8cd8c972-ba38-40c2-b30f-68a4233593d6
 :END:
 
-#+INCLUDE: "../tools/emacs/config/setup-mails.el" src emacs-lisp :range-begin "SendmailCfg" :range-end "-SendmailCfg" :lines "22-36"
+#+INCLUDE: "../tools/emacs/config/setup-mails.el" src emacs-lisp :range-begin "SendmailCfg" :range-end "-SendmailCfg" :lines "22-38"
 
-#+INCLUDE: "../tools/emacs/config/setup-mails.el" src emacs-lisp :range-begin "MessageCfg" :range-end "-MessageCfg" :lines "39-50"
+#+INCLUDE: "../tools/emacs/config/setup-mails.el" src emacs-lisp :range-begin "MessageCfg" :range-end "-MessageCfg" :lines "41-52"
 
 *** TODO ~notmuch~ configuration
 :PROPERTIES:
 :CUSTOM_ID: h:b67b377e-0fbc-4237-857c-641cdf2de1cf
 :END:
 
-#+INCLUDE: "../tools/emacs/config/setup-mails.el" src emacs-lisp :range-begin "Notmuch" :range-end "-Notmuch" :lines "53-70"
+#+INCLUDE: "../tools/emacs/config/setup-mails.el" src emacs-lisp :range-begin "Notmuch" :range-end "-Notmuch" :lines "55-72"
 
 * User interface and interactions
 :PROPERTIES:
tools/emacs/config/00-environments.el
@@ -1,4 +1,5 @@
 (use-package exec-path-from-shell       ; Set up environment variables
+  :disabled
   :if (display-graphic-p)
   :unless (or (eq system-type 'windows-nt) (eq system-type 'gnu/linux))
   :config
tools/emacs/config/02-help.el
@@ -0,0 +1,15 @@
+;;; 02-help.el --- -*- lexical-binding: t -*-
+;;; Commentary:
+;;; help and info mode setup
+;;; Code:
+(use-package helpful
+  :unless noninteractive
+  :bind (("C-h f" . helpful-callable)
+         ("C-h F" . helpful-function)
+         ("C-h M" . helpful-macro)
+         ("C-c h S" . helpful-at-point)
+         ("C-h k" . helpful-key)
+         ("C-h v" . helpful-variable)
+         ("C-h C" . helpful-command)))
+
+;;; 02-help.el ends here
tools/emacs/config/appearance.el
@@ -0,0 +1,146 @@
+;;; appearance.el --- -*- lexical-binding: t -*-
+;;; Commentary:
+;;; Appearance configuration
+;;; Code:
+;; TypeFaceConfiguration
+(use-package emacs
+  :bind ("C-c f r" . mu-reset-fonts)
+  :config
+;;; ยฏ\_(ใƒ„)_/ยฏ
+  (defconst font-height 130
+    "Default font-height to use.")
+  ;; Middle/Near East: ืฉืœื•ื, ุงู„ุณู‘ู„ุงู… ุนู„ูŠูƒู…
+  (when (member "Noto Sans Arabic" (font-family-list))
+    (set-fontset-font t 'arabic "Noto Sans Arabic"))
+  (when (member "Noto Sans Hebrew" (font-family-list))
+    (set-fontset-font t 'arabic "Noto Sans Hebrew"))
+  ;; Africa: แˆ แˆ‹แˆ
+  (when (member "Noto Sans Ethiopic" (font-family-list))
+    (set-fontset-font t 'ethiopic "Noto Sans Ethiopic"))
+
+  ;; Default font is Ubuntu Mono (and Ubuntu Sans for variable-pitch)
+  ;; If Ubuntu Mono or Ubuntu Sans are not available, use the default Emacs face
+  (when (member "Ubuntu Mono" (font-family-list))
+    (set-face-attribute 'default nil
+                        :family "Ubuntu Mono"
+                        :height font-height))
+  (when (member "Ubuntu Sans" (font-family-list))
+    (set-face-attribute 'variable-pitch nil
+                        :family "Ubuntu Sans"
+                        :height font-height
+                        :weight 'regular))
+
+  (defun mu-reset-fonts ()
+    "Reset fonts to my preferences."
+    (interactive)
+    (when when (member "Ubuntu Mono" (font-family-list))
+          (set-face-attribute 'default nil
+                              :family "Ubuntu Mono"
+                              :height font-height))
+    (when when (member "Ubuntu Sans" (font-family-list))
+          (set-face-attribute 'variable-pitch nil
+                              :family "Ubuntu Sans"
+                              :height font-height
+                              :weight 'regular))))
+;; -TypeFaceConfiguration
+
+(use-package emacs
+  :config
+  (setq-default use-file-dialog nil
+                use-dialog-box nil
+                echo-keystrokes 0.1
+                line-number-display-limit-width 10000
+                display-time-world-list '(("Europe/London" "London")
+                                          ("Europe/Paris" "Paris")
+                                          ("America/New_York" "Boston")
+                                          ("America/Los_Angeles" "San-Francisco")
+                                          ("Asia/Calcutta" "Bangalore")
+                                          ("Australia/Brisbane" "Brisbane")))
+  (line-number-mode 1)
+  (column-number-mode 1)
+  (global-hl-line-mode 1)
+  (global-unset-key (kbd "C-z"))
+  (global-unset-key (kbd "C-x C-z"))
+  (global-unset-key (kbd "C-h h")))
+
+;;; Theme
+(setq custom-safe-themes t)    ; Treat themes as safe
+
+(use-package shortbrain-light-theme
+  :config
+  (load-theme 'shortbrain-light))
+
+
+(use-package moody
+  :config
+  (setq-default x-underline-at-descent-line t
+                ;; Show buffer position percentage starting from top
+                mode-line-percent-position '(-3 "%o"))
+
+  (defvar mu-eyebrowse-mode-line
+    '(:propertize
+      (:eval
+       (when (bound-and-true-p eyebrowse-mode)
+         (let* ((num (eyebrowse--get 'current-slot))
+                (tag (when num
+                       (nth 2 (assoc num (eyebrowse--get 'window-configs)))))
+                (str (concat
+                      " "
+                      (if (and tag (< 0 (length tag)))
+                          tag
+                        (when num (int-to-string num)))
+                      " ")))
+           str)))
+      face (:background "#81a2be" :foreground "#373b41"))
+    "Mode line format for Eyebrowse.")
+
+  (put 'mu-eyebrowse-mode-line 'risky-local-variable t)
+
+  (setq-default mode-line-format
+                '("%e"
+                  my-eyebrowse-mode-line
+                  mode-line-front-space
+                  mode-line-client
+                  mode-line-modified
+                  mode-line-remote
+                  mode-line-frame-identification
+                  mode-line-buffer-identification " " mode-line-position
+                  (vc-mode vc-mode)
+                  (multiple-cursors-mode mc/mode-line)
+                  " " mode-line-modes
+                  mode-line-end-spaces))
+
+  (use-package minions
+    :ensure t
+    :config
+    (setq-default minions-mode-line-lighter "ฮป="
+                  minions-mode-line-delimiters '("" . "")
+                  minions-direct '(flycheck-mode))
+    (minions-mode +1))
+
+  (use-package time
+    :config
+    (setq-default display-time-24hr-format t
+                  display-time-day-and-date t
+                  display-time-world-list '(("Europe/Paris" "Paris")
+                                            ("Europe/London" "London")
+                                            ("America/New_York" "Boston")
+                                            ("America/Los_Angeles" "San Francisco")
+                                            ("Asia/Calcutta" "Bangalore")
+                                            ("Australia/Brisbane" "Brisbane"))
+                  display-time-string-forms
+                  '((format "%s %s %s, %s:%s"
+                            dayname
+                            monthname day
+                            24-hours minutes)))
+    (display-time))
+
+  (setq-default global-mode-string (remove 'display-time-string global-mode-string)
+                mode-line-end-spaces
+                (list (propertize " " 'display '(space :align-to (- right 19)))
+                      'display-time-string))
+
+  (moody-replace-mode-line-buffer-identification)
+  (moody-replace-vc-mode))
+
+;;; appearance.el ends here
tools/emacs/config/setup-buffers.el
@@ -1,153 +1,143 @@
 ;;; -*- lexical-binding: t; -*-
-;; Don't let the cursor go into minibuffer prompt
-(let ((default (eval (car (get 'minibuffer-prompt-properties 'standard-value))))
-      (dont-touch-prompt-prop '(cursor-intangible t)))
-  (setq minibuffer-prompt-properties
-        (append default dont-touch-prompt-prop))
-  (add-hook 'minibuffer-setup-hook #'cursor-intangible-mode))
 
-;; Allow to read from minibuffer while in minibuffer.
-(setq enable-recursive-minibuffers t)
+(when nil
+  (progn
+    ;; Show the minibuffer depth (when larger than 1)
+    (use-package savehist                   ; Save minibuffer history
+      :init (savehist-mode t)
+      :config
+      (setq-default history-length 1000
+                    savehist-save-minibuffer-history t
+                    savehist-autosave-interval 180)
+      (savehist-mode 1))
 
-;; Show the minibuffer depth (when larger than 1)
-(minibuffer-depth-indicate-mode 1)
+    (use-package emacs
+      :init
+      ;; Configure `display-buffer' behaviour for some special buffers
+      (setq display-buffer-alist
+            '(;; bottom side window
+              ("\\*e?shell.*"
+               (display-buffer-in-side-window)
+               (window-height . 0.25)
+               (side . bottom)
+               (slot . -1))
+              ("\\*v?term.*"
+               (display-buffer-in-side-window)
+               (window-height . 0.25)
+               (side . bottom)
+               (slot . -1))
+              ("\\*\\(Backtrace\\|Warnings\\|Compile-Log\\|[Hh]elp\\|Messages\\)\\*"
+               (display-buffer-in-side-window)
+               (window-height . 0.25)
+               (side . bottom)
+               (slot . 0))
+              ("\\*\\(helpful\\).*"
+               (display-buffer-in-side-window)
+               (window-height . 0.25)
+               (side . bottom)
+               (slot . 0))
+              ("\\*\\(compilation\\|go test\\).*"
+               (display-buffer-in-side-window)
+               (window-height . 0.25)
+               (side . bottom)
+               (slot . 0))
+              ("\\*\\(ielm\\).*"
+               (display-buffer-in-side-window)
+               (window-height . 0.25)
+               (side . bottom)
+               (slot . 1))
+              ;; right side window
+              ("\\*wclock*"
+               (display-buffer-in-side-window)
+               (window-width . 0.20)
+               (side . right)
+               (slot . -1))
+              ("\\*undo-tree*"
+               (display-buffer-in-side-window)
+               (window-width . 0.20)
+               (side . right)
+               (slot . -1))
+              ("\\*\\(Flycheck\\|Package-Lint\\).*"
+               (display-buffer-in-side-window)
+               (window-width . 0.20)
+               (side . right)
+               (slot . 0)
+               (window-parameters . ((no-other-window . t)
+                                     (mode-line-format . (" "
+                                                          mode-line-buffer-identification)))))
+              ("\\*Faces\\*"
+               (display-buffer-in-side-window)
+               (window-width . 0.20)
+               (side . right)
+               (slot . 1)
+               (window-parameters . ((no-other-window . t)
+                                     (mode-line-format . (" "
+                                                          mode-line-buffer-identification)))))
+              ("\\*Custom.*"
+               (display-buffer-in-side-window)
+               (window-width . 0.20)
+               (side . right)
+               (slot . 2))))
+      (setq window-sides-vertical nil)
+      (setq window-combination-resize t) ; Size new windows proportionally
+      :bind (("C-x +" . balance-windows-area)
+             ("<f7>" . window-toggle-side-windows)))
 
-(use-package savehist                   ; Save minibuffer history
-  :init (savehist-mode t)
-  :custom
-  (history-length 1000)
-  (savehist-save-minibuffer-history t)
-  (savehist-autosave-interval 180)
-  :config
-  (savehist-mode 1))
+    (use-package uniquify
+      :config
+      (setq-default uniquify-buffer-name-style 'post-forward
+                    uniquify-separator ":"
+                    uniquify-ignore-buffers-re "^\\*"
+                    uniquify-after-kill-buffer-p t))
 
-(use-package emacs
-  :init
-  ;; Configure `display-buffer' behaviour for some special buffers
-  (setq display-buffer-alist
-        '(;; bottom side window
-          ("\\*e?shell.*"
-           (display-buffer-in-side-window)
-           (window-height . 0.25)
-           (side . bottom)
-           (slot . -1))
-          ("\\*v?term.*"
-           (display-buffer-in-side-window)
-           (window-height . 0.25)
-           (side . bottom)
-           (slot . -1))
-          ("\\*\\(Backtrace\\|Warnings\\|Compile-Log\\|[Hh]elp\\|Messages\\)\\*"
-           (display-buffer-in-side-window)
-           (window-height . 0.25)
-           (side . bottom)
-           (slot . 0))
-          ("\\*\\(helpful\\).*"
-           (display-buffer-in-side-window)
-           (window-height . 0.25)
-           (side . bottom)
-           (slot . 0))
-          ("\\*\\(compilation\\|go test\\).*"
-           (display-buffer-in-side-window)
-           (window-height . 0.25)
-           (side . bottom)
-           (slot . 0))
-          ("\\*\\(ielm\\).*"
-           (display-buffer-in-side-window)
-           (window-height . 0.25)
-           (side . bottom)
-           (slot . 1))
-          ;; right side window
-          ("\\*wclock*"
-           (display-buffer-in-side-window)
-           (window-width . 0.20)
-           (side . right)
-           (slot . -1))
-          ("\\*undo-tree*"
-           (display-buffer-in-side-window)
-           (window-width . 0.20)
-           (side . right)
-           (slot . -1))
-          ("\\*\\(Flycheck\\|Package-Lint\\).*"
-           (display-buffer-in-side-window)
-           (window-width . 0.20)
-           (side . right)
-           (slot . 0)
-           (window-parameters . ((no-other-window . t)
-                                 (mode-line-format . (" "
-                                                      mode-line-buffer-identification)))))
-          ("\\*Faces\\*"
-           (display-buffer-in-side-window)
-           (window-width . 0.20)
-           (side . right)
-           (slot . 1)
-           (window-parameters . ((no-other-window . t)
-                                 (mode-line-format . (" "
-                                                      mode-line-buffer-identification)))))
-          ("\\*Custom.*"
-           (display-buffer-in-side-window)
-           (window-width . 0.20)
-           (side . right)
-           (slot . 2))))
-  (setq window-sides-vertical nil)
-  (setq window-combination-resize t) ; Size new windows proportionally
-  :bind (("C-x +" . balance-windows-area)
-         ("<f7>" . window-toggle-side-windows)))
+    (use-package ibuf-ext                   ; Extensions for Ibuffer
+      :config
+      ;; Do not show empty groups
+      (setq-default ibuffer-show-empty-filter-groups nil))
 
-(use-package uniquify                   ; Unique buffer names
-  :custom
-  (uniquify-buffer-name-style 'post-forward)
-  (uniquify-separator ":")
-  (uniquify-ignore-buffers-re "^\\*")
-  (uniquify-after-kill-buffer-p t))
+    (use-package ibuffer                    ; Buffer management
+      :bind (("C-x C-b" . ibuffer)
+             ([remap list-buffers] . ibuffer))
+      :config
+      (setq-default ibuffer-expert t
+                    ibuffer-filter-group-name-face 'font-lock-doc-face
+                    ibuffer-default-sorting-mode 'filename/process
+                    ibuffer-use-header-line t)
+      ;; Use human readable Size column instead of original one
+      (define-ibuffer-column size-h
+        (:name "Size" :inline t)
+        (cond
+         ((> (buffer-size) 1000000) (format "%7.1fM" (/ (buffer-size) 1000000.0)))
+         ((> (buffer-size) 1000) (format "%7.1fk" (/ (buffer-size) 1000.0)))
+         (t (format "%8d" (buffer-size)))))
 
-(use-package ibuf-ext                   ; Extensions for Ibuffer
-  :config
-  ;; Do not show empty groups
-  (setq ibuffer-show-empty-filter-groups nil))
+      (setq ibuffer-formats
+            '((mark modified read-only " "
+                    (name 18 18 :left :elide)
+                    " "
+                    (size-h 9 -1 :right)
+                    " "
+                    (mode 16 16 :left :elide)
+                    " "
+                    filename-and-process)
+              (mark modified read-only " "
+                    (name 18 18 :left :elide)
+                    " "
+                    (size 9 -1 :right)
+                    " "
+                    (mode 16 16 :left :elide)
+                    " "
+                    (vc-status 16 16 :left)
+                    " "
+                    filename-and-process))))
 
-(use-package ibuffer                    ; Buffer management
-  :custom
-  (ibuffer-expert t)
-  (ibuffer-filter-group-name-face 'font-lock-doc-face)
-  (ibuffer-default-sorting-mode 'filename/process)
-  (ibuffer-use-header-line t)
-  :bind (("C-x C-b" . ibuffer)
-         ([remap list-buffers] . ibuffer))
-  :config
-  ;; Use human readable Size column instead of original one
-  (define-ibuffer-column size-h
-    (:name "Size" :inline t)
-    (cond
-     ((> (buffer-size) 1000000) (format "%7.1fM" (/ (buffer-size) 1000000.0)))
-     ((> (buffer-size) 1000) (format "%7.1fk" (/ (buffer-size) 1000.0)))
-     (t (format "%8d" (buffer-size)))))
-
-  (setq ibuffer-formats
-        '((mark modified read-only " "
-                (name 18 18 :left :elide)
-                " "
-                (size-h 9 -1 :right)
-                " "
-                (mode 16 16 :left :elide)
-                " "
-                filename-and-process)
-          (mark modified read-only " "
-                (name 18 18 :left :elide)
-                " "
-                (size 9 -1 :right)
-                " "
-                (mode 16 16 :left :elide)
-                " "
-                (vc-status 16 16 :left)
-                " "
-                filename-and-process))))
-
-(use-package ibuffer-vc                 ; Group buffers by VC project and status
-  :defer 2
-  :init (add-hook 'ibuffer-hook
-                  (lambda ()
-                    (ibuffer-vc-set-filter-groups-by-vc-root)
-                    (unless (eq ibuffer-sorting-mode 'filename/process)
-                      (ibuffer-do-sort-by-filename/process)))))
+    (use-package ibuffer-vc                 ; Group buffers by VC project and status
+      :defer 2
+      :init (add-hook 'ibuffer-hook
+                      (lambda ()
+                        (ibuffer-vc-set-filter-groups-by-vc-root)
+                        (unless (eq ibuffer-sorting-mode 'filename/process)
+                          (ibuffer-do-sort-by-filename/process)))))
 
+    ))
 (provide 'setup-buffers)
tools/emacs/config/setup-compile.el
@@ -1,63 +1,64 @@
 ;;; -*- lexical-binding: t; -*-
-(use-package compile
-  :defer 2
-  :config
-  (progn
-    ;; http://stackoverflow.com/a/13408008/1219634
-    (setq
-     compilation-scroll-output t
-     ;; I'm not scared of saving everything.
-     compilation-ask-about-save nil
-     ;; Automatically scroll and jump to the first error
-     compilation-scroll-output 'next-error
-     ;; compilation-scroll-output 'first-error
-     ;; compilation-auto-jump-to-first-error t
-     ;; Skip over warnings and info messages in compilation
-     compilation-skip-threshold 2
-     ;; Don't freeze when process reads from stdin
-     compilation-disable-input t
-     ;; Show three lines of context around the current message
-     compilation-context-lines 3)
-    (require 'ansi-color)
-    (defun vde/colorize-compilation-buffer ()
-      (unless (or (derived-mode-p 'grep-mode) ;Don't mess up colors in Grep/Ag results buffers
-                  (derived-mode-p 'ag-mode))
-        (ansi-color-apply-on-region compilation-filter-start (point))))
-    (add-hook 'compilation-filter-hook #'vde/colorize-compilation-buffer)
+(when nil
+  (progn (use-package compile
+           :defer 2
+           :config
+           (progn
+             ;; http://stackoverflow.com/a/13408008/1219634
+             (setq-default compilation-scroll-output t
+                           ;; I'm not scared of saving everything.
+                           compilation-ask-about-save nil
+                           ;; Automatically scroll and jump to the first error
+                           compilation-scroll-output 'next-error
+                           ;; compilation-scroll-output 'first-error
+                           ;; compilation-auto-jump-to-first-error t
+                           ;; Skip over warnings and info messages in compilation
+                           compilation-skip-threshold 2
+                           ;; Don't freeze when process reads from stdin
+                           compilation-disable-input t
+                           ;; Show three lines of context around the current message
+                           compilation-context-lines 3)
+             (require 'ansi-color)
+             (defun vde/colorize-compilation-buffer ()
+               (unless (or (derived-mode-p 'grep-mode) ;Don't mess up colors in Grep/Ag results buffers
+                           (derived-mode-p 'ag-mode))
+                 (ansi-color-apply-on-region compilation-filter-start (point))))
+             (add-hook 'compilation-filter-hook #'vde/colorize-compilation-buffer)
 
-    (defun vde/mark-compilation-window-as-dedicated ()
-      "Setup the *compilation* window with custom settings."
-      (when (string-prefix-p "*compilation: " (buffer-name))
-        (save-selected-window
-          (save-excursion
-            (let* ((w (get-buffer-window (buffer-name))))
-              (when w
-                (select-window w)
-                (switch-to-buffer (buffer-name))
-                (set-window-dedicated-p w t)))))))
-    (add-hook 'compilation-mode-hook 'vde/mark-compilation-window-as-dedicated)))
+             (defun vde/mark-compilation-window-as-dedicated ()
+               "Setup the *compilation* window with custom settings."
+               (when (string-prefix-p "*compilation: " (buffer-name))
+                 (save-selected-window
+                   (save-excursion
+                     (let* ((w (get-buffer-window (buffer-name))))
+                       (when w
+                         (select-window w)
+                         (switch-to-buffer (buffer-name))
+                         (set-window-dedicated-p w t)))))))
+             (add-hook 'compilation-mode-hook 'vde/mark-compilation-window-as-dedicated)))
 
-(use-package flycheck
-  :if (not (eq system-type 'windows-nt))
-  :defer 4
-  :commands (flycheck-mode
-             flycheck-next-error
-             flycheck-previous-error)
-  :init
-  (dolist (where '((emacs-lisp-mode-hook . emacs-lisp-mode-map)
-                   (haskell-mode-hook    . haskell-mode-map)
-                   (js2-mode-hook        . js2-mode-map)
-                   (go-mode-hook         . go-mode-map)
-                   (c-mode-common-hook   . c-mode-base-map)))
-    (add-hook (car where)
-              `(lambda ()
-                 (bind-key "M-n" #'flycheck-next-error ,(cdr where))
-                 (bind-key "M-p" #'flycheck-previous-error ,(cdr where)))
-              t))
-  :config
-  (add-hook 'prog-mode-hook 'flycheck-mode)
-  (defalias 'show-error-at-point-soon
-    'flycheck-show-error-at-point)
-  (setq flycheck-idle-change-delay 1.2))
+         (use-package flycheck
+           :if (not (eq system-type 'windows-nt))
+           :defer 4
+           :commands (flycheck-mode
+                      flycheck-next-error
+                      flycheck-previous-error)
+           :init
+           (dolist (where '((emacs-lisp-mode-hook . emacs-lisp-mode-map)
+                            (haskell-mode-hook    . haskell-mode-map)
+                            (js2-mode-hook        . js2-mode-map)
+                            (go-mode-hook         . go-mode-map)
+                            (c-mode-common-hook   . c-mode-base-map)))
+             (add-hook (car where)
+                       `(lambda ()
+                          (bind-key "M-n" #'flycheck-next-error ,(cdr where))
+                          (bind-key "M-p" #'flycheck-previous-error ,(cdr where)))
+                       t))
+           :config
+           (add-hook 'prog-mode-hook 'flycheck-mode)
+           (defalias 'show-error-at-point-soon
+             'flycheck-show-error-at-point)
+           (setq flycheck-idle-change-delay 1.2))
 
+         ))
 (provide 'setup-compile)
tools/emacs/config/setup-completion.el
@@ -1,12 +1,203 @@
-;;; -*- lexical-binding: t; -*-
+;;; setup-completion.el --- -*- lexical-binding: t -*-
+;;; Commentary:
+;;; Setup completion framework
+;;; Code
+(use-package minibuffer
+  :config
+  (setq completion-cycle-threshold 3)
+  (setq completion-flex-nospace nil)
+  (setq completion-pcm-complete-word-inserts-delimiters t)
+  (setq completion-pcm-word-delimiters "-_./:| ")
+  ;; NOTE: flex completion is introduced in Emacs 27
+  (setq completion-show-help nil)
+  (setq completion-styles '(partial-completion substring initials flex))
+  (setq completion-category-overrides
+        '((file (styles initials basic))
+          (buffer (styles initials basic))
+          (info-menu (styles basic))))
+  (setq completions-format 'vertical)   ; *Completions* buffer
+  (setq enable-recursive-minibuffers t)
+  (setq read-answer-short t)
+  (setq read-buffer-completion-ignore-case t)
+  (setq read-file-name-completion-ignore-case t)
+  (setq resize-mini-windows t)
+
+  (file-name-shadow-mode 1)
+  (minibuffer-depth-indicate-mode 1)
+  (minibuffer-electric-default-mode 1)
+
+  (defun vde/focus-minibuffer ()
+    "Focus the active minibuffer.
+
+Bind this to `completion-list-mode-map' to M-v to easily jump
+between the list of candidates present in the \\*Completions\\*
+buffer and the minibuffer (because by default M-v switches to the
+completions if invoked from inside the minibuffer."
+    (interactive)
+    (let ((mini (active-minibuffer-window)))
+      (when mini
+        (select-window mini))))
+
+  (defun vde/focus-minibuffer-or-completions ()
+    "Focus the active minibuffer or the \\*Completions\\*.
+
+If both the minibuffer and the Completions are present, this
+command will first move per invocation to the former, then the
+latter, and then continue to switch between the two.
+
+The continuous switch is essentially the same as running
+`vde/focus-minibuffer' and `switch-to-completions' in
+succession."
+    (interactive)
+    (let* ((mini (active-minibuffer-window))
+           (completions (get-buffer-window "*Completions*")))
+      (cond ((and mini
+                  (not (minibufferp)))
+             (select-window mini nil))
+            ((and completions
+                  (not (eq (selected-window)
+                           completions)))
+             (select-window completions nil)))))
+
+  ;; Technically, this is not specific to the minibuffer, but I define
+  ;; it here so that you can see how it is also used from inside the
+  ;; "Completions" buffer
+  (defun vde/describe-symbol-at-point (&optional arg)
+    "Get help (documentation) for the symbol at point.
+
+With a prefix argument, switch to the *Help* window.  If that is
+already focused, switch to the most recently used window
+instead."
+    (interactive "P")
+    (let ((symbol (symbol-at-point)))
+      (when symbol
+        (describe-symbol symbol)))
+    (when current-prefix-arg
+      (let ((help (get-buffer-window "*Help*")))
+        (when help
+          (if (not (eq (selected-window) help))
+              (select-window help)
+            (select-window (get-mru-window)))))))
+
+  ;; Defines, among others, aliases for common actions to Super-KEY.
+  ;; Normally these should go in individual package declarations, but
+  ;; their grouping here makes things easier to understand.
+  :bind (("M-v" . vde/focus-minibuffer-or-completions)
+         :map completion-list-mode-map
+         ("h" . vde/describe-symbol-at-point)
+         ("n" . next-line)
+         ("p" . previous-line)
+         ("f" . next-completion)
+         ("b" . previous-completion)
+         ("M-v" . vde/focus-minibuffer)))
+
+(use-package icomplete
+  :demand
+  :after minibuffer                     ; Read that section as well
+  :config
+  (setq icomplete-delay-completions-threshold 0)
+  (setq icomplete-max-delay-chars 0)
+  (setq icomplete-compute-delay 0)
+  (setq icomplete-show-matches-on-no-input t)
+  (setq icomplete-hide-common-prefix nil)
+  (setq icomplete-prospects-height 1)
+  (setq icomplete-separator " ยท ")      ; mid dot, not full stop
+  (setq icomplete-with-completion-tables t)
+  (setq icomplete-in-buffer t)
+
+  (fido-mode -1)                        ; Emacs 27.1
+  (icomplete-mode 1)
+
+  (defun vde/icomplete-force-complete-and-exit ()
+    "Complete the current `icomplete' match and exit the minibuffer.
+
+Contrary to `icomplete-force-complete-and-exit', this will
+confirm your choice without complaining about incomplete matches.
+
+Those incomplete matches can block you from performing legitimate
+actions, such as defining a new tag in an `org-capture' prompt.
+
+In my testing, this is necessary when the variable
+`icomplete-with-completion-tables' is non-nil, because then
+`icomplete' will be activated practically everywhere it can."
+    (interactive)
+    (icomplete-force-complete)
+    (exit-minibuffer))
+
+  (defun vde/icomplete-kill-ring-save (&optional arg)
+    "Expand and save current `icomplete' match to the kill ring.
+
+With a prefix argument, insert the match to the point in the
+current buffer and switch focus back to the minibuffer."
+    (interactive "*P")
+    (when (and (minibufferp)
+               (bound-and-true-p icomplete-mode))
+      (icomplete-force-complete)
+      (kill-new (field-string-no-properties))
+      (when current-prefix-arg
+        (kill-new (field-string-no-properties))
+        (select-window (get-mru-window))
+        (insert (car kill-ring))
+        (vde/focus-minibuffer))))
+
+  (defun vde/icomplete-toggle-completion-styles (&optional arg)
+    "Toggle between flex and prefix matching.
+
+With pregix ARG use basic completion instead.  These styles are
+described in `completion-styles-alist'.
+
+Bind this function in `icomplete-minibuffer-map'."
+    (interactive "*P")
+    (when (and (minibufferp)
+               (bound-and-true-p icomplete-mode))
+      (let* ((completion-styles-original completion-styles)
+             (basic '(emacs22 basic))
+             (flex '(flex initials substring partial-completion))
+             (prefix '(partial-completion substring initials flex)))
+        (if current-prefix-arg
+            (progn
+              (setq-local completion-styles basic)
+              (message "%s" (propertize "Prioritising BASIC matching" 'face 'highlight)))
+          (if (not (eq (car completion-styles) 'flex))
+              (progn
+                (setq-local completion-styles flex)
+                (message "%s" (propertize "Prioritising FLEX matching" 'face 'highlight)))
+            (setq-local completion-styles prefix)
+            (message "%s" (propertize "Prioritising PREFIX matching" 'face 'highlight)))))))
+
+  (defun vde/switch-buffer (arg)
+    "Custom switch to buffer.
+With universal argument ARG or when not in project, rely on
+`switch-to-buffer'.
+Otherwise, use `projectile-switch-to-project'."
+    (interactive "P")
+    (if (or arg (not (projectile-project-p)))
+        (switch-to-buffer)
+      (projectile-switch-to-buffer)))
+
+  :bind (:map icomplete-minibuffer-map
+              ("C-m" . minibuffer-complete-and-exit) ; force current input
+              ("C-n" . icomplete-forward-completions)
+              ("<right>" . icomplete-forward-completions)
+              ("<down>" . icomplete-forward-completions)
+              ("C-p" . icomplete-backward-completions)
+              ("<left>" . icomplete-backward-completions)
+              ("<up>" . icomplete-backward-completions)
+              ("<return>" . vde/icomplete-force-complete-and-exit)
+              ("M-o w" . vde/icomplete-kill-ring-save)
+              ("M-o i" . (lambda ()
+                           (interactive)
+                           (let ((current-prefix-arg t))
+                             (vde/icomplete-kill-ring-save))))
+              ("C-M-," . vde/icomplete-toggle-completion-styles)
+              ("C-M-." . (lambda ()
+                           (interactive)
+                           (let ((current-prefix-arg t))
+                             (vde/icomplete-toggle-completion-styles))))))
+
 (use-package ivy
-  :delight
-  :bind (("C-x b" . vde/switch-buffer)
-         ("C-x B" . ivy-switch-buffer)
-         ("M-u" . ivy-resume)    ;Override the default binding for `upcase-word'
-         ("C-c C-w p" . ivy-push-view) ;Push window configuration to `ivy-views'
-         ("C-c C-w P" . ivy-pop-view)  ;Remove window configuration from `ivy-views'
-         ("C-c C-w s" . ivy-switch-view) ; Switch window configuration to `ivy-views'
+  :disabled
+  :bind (("C-x B" . ivy-switch-buffer)
          :map ivy-occur-mode-map
          ("f" . forward-char)
          ("b" . backward-char)
@@ -30,27 +221,10 @@
         )
   (ivy-set-occur 'ivy-switch-buffer 'ivy-switch-buffer-occur)
   (ivy-set-occur 'swiper 'swiper-occur)
-  (ivy-set-occur 'swiper-isearch 'swiper-occur)
-  (ivy-mode 1)
-  (progn
-    (defun vde/switch-buffer (arg)
-      "Custom switch to buffer.
-With universal argument ARG or when not in project, rely on
-`ivy-switch-buffer'.
-Otherwise, use `counsel-projectile-switch-project'."
-      (interactive "P")
-      (if (or arg
-              (not (projectile-project-p)))
-          (ivy-switch-buffer)
-        (counsel-projectile-switch-to-buffer)))
-    ;; Disable ido
-    (with-eval-after-load 'ido
-      (ido-mode -1)
-      ;; Enable ivy
-      (ivy-mode 1))
-    ))
+  (ivy-set-occur 'swiper-isearch 'swiper-occur))
 
 (use-package counsel
+  :disabled
   :after ivy
   :bind (("M-i" . counsel-semantic-or-imenu)
          ("C-x C-r" . counsel-recentf)
@@ -59,35 +233,15 @@ Otherwise, use `counsel-projectile-switch-project'."
          ("C-h S" . counsel-info-lookup-symbol)
          ("C-c u" . counsel-unicode-char)
          ("C-c C" . counsel-colors-emacs) ;Alternative to `list-colors-display'
-         ([remap execute-extended-command] . counsel-M-x)
-         ([remap bookmark-jump] . counsel-bookmark) ;Jump to book or set it if it doesn't exist, C-x r b
-         ([remap bookmark-set] . counsel-bookmark)  ;C-x r m
-         ([remap find-file]  . counsel-find-file)
-         ([remap describe-bindings] . counsel-descbinds)
-         ([remap finder-by-keyword] . counsel-package) ;C-h p
-         ([remap describe-variable] . counsel-describe-variable)
-         ([remap describe-function] . counsel-describe-function)
          ("M-s r" . counsel-rg)
          ("M-s g" . counsel-git-grep)
-         ("M-s z" . prot/counsel-fzf-rg-files)
          :map ivy-minibuffer-map
          ("C-r" . counsel-minibuffer-history)
          ("C-SPC" . ivy-restrict-to-matches))
   :config
   (setq counsel-yank-pop-preselect-last t
         counsel-yank-pop-separator "\nโ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”\n"
-        counsel-describe-function-function 'helpful-function
-        counsel-describe-variable-function 'helpful-variable
-        counsel-find-file-at-point t
-        counsel-find-file-ignore-regexp
-        ;; Note that `ivy-extra-directories' should also not contain the "../" and
-        ;; "./" elements if you don't want to see those in the `counsel-find-file'
-        ;; completion list.
-        (concat
-         ;; file names beginning with # or .
-         "\\(?:\\`[#.]\\)"
-         ;; file names ending with # or ~
-         "\\|\\(?:[#~]\\'\\)"))
+        counsel-find-file-at-point t)
   (progn
     (ivy-set-actions
      'counsel-find-file
@@ -110,8 +264,8 @@ Otherwise, use `counsel-projectile-switch-project'."
                                         ;https://github.com/abo-abo/swiper/issues/427
                   ))))
 
-
 (use-package company
+  :disabled
   :commands global-company-mode
   :init
   (add-hook 'after-init-hook #'global-company-mode)
@@ -146,7 +300,8 @@ Otherwise, use `counsel-projectile-switch-project'."
           company-keywords)))
 
 (use-package company-emoji
-  :ensure company
+  :disabled
+  :after company
   :config
   (add-to-list 'company-backends 'company-emoji))
 
tools/emacs/config/setup-docker.el
@@ -1,5 +1,6 @@
 ;;; -*- lexical-binding: t; -*-
 (use-package dockerfile-mode            ; Edit docker's Dockerfiles
+  :disabled
   :unless *sys/full*
   :mode ("Dockerfile\\'" . dockerfile-mode))
 
tools/emacs/config/setup-editing.el
@@ -1,5 +1,6 @@
 ;;; -*- lexical-binding: t; -*-
-(setq enable-remote-dir-locals t)
+(setq-default enable-remote-dir-locals t)
+
 (use-package aggressive-indent          ; Automatically indent code
   :bind ("C-c e i" . aggressive-indent-mode)
   :hook ((lisp-mode       . aggressive-indent-mode)
@@ -12,17 +13,18 @@
 (use-package undo-tree                  ; Show buffer changes as a tree
   :defer 1
   :init (global-undo-tree-mode)
-  :config (setq undo-tree-visualizer-timestamps t
+  :config
+  (setq-default undo-tree-visualizer-timestamps t
                 undo-tree-enable-undo-in-region t))
 
 (use-package whitespace
-  :defer 1
   :hook ((prog-mode . whitespace-mode))
   :config
-  (setq whitespace-style '(face tabs spaces trailing space-before-tab newline indentation empty space-after-tab space-mark tab-mark newline-mark)))
+  (setq-default whitespace-style '(face tabs spaces trailing space-before-tab newline indentation empty space-after-tab space-mark tab-mark newline-mark)))
 
 (use-package smartparens
   :defer 1
+  :disabled
   :init
   (progn
     (use-package smartparens-config)
@@ -47,6 +49,7 @@
          ("C--". er/contract-region)))
 
 (use-package iedit
+  :disabled
   :defines hydra-iedit/body
   :bind* (:map global-map
                ("C-*" . iedit-mode)
@@ -97,20 +100,17 @@
   (global-set-key [remap kill-ring-save] 'easy-kill)
   (global-set-key [remap mark-sexp] 'easy-mark))
 
-(use-package define-word)
-
 (setq display-line-numbers-type 'relative)
 (add-hook 'prog-mode-hook
           'display-line-numbers-mode)
 (add-hook 'prog-mode-hook 'toggle-truncate-lines)
 
 (use-package newcomment
-  :custom
-  (comment-empty-lines t)
-  (comment-fill-column nil)
-  (comment-multi-line t)
-  (comment-style 'multi-line)
   :config
+  (setq-default comment-empty-lines t
+                comment-fill-column nil
+                comment-multi-line t
+                comment-style 'multi-line)
   (defun prot/comment-dwim (&optional arg)
     "Alternative to `comment-dwim': offers a simple wrapper
 around `comment-line' and `comment-dwim'.
@@ -158,25 +158,24 @@ Else toggle the comment status of the line at point."
               ([remap flyspell-correct-word-before-point] . flyspell-correct-previous-word-generic)))
 
 (use-package electric
-  :custom
-  (electric-pair-inhibit-predicate 'electric-pair-default-inhibit)
-  (electric-pair-pairs '((8216 . 8217)
-                         (8220 . 8221)
-                         (171 . 187)))
-  (electric-pair-skip-self 'electric-pair-default-skip-self)
-  (electric-quote-context-sensitive t)
-  (electric-quote-paragraph t)
-  (electric-quote-string nil)
   :config
+  (setq-default electric-pair-inhibit-predicate 'electric-pair-default-inhibit
+                electric-pair-pairs '((8216 . 8217)
+                                      (8220 . 8221)
+                                      (171 . 187))
+                electric-pair-skip-self 'electric-pair-default-skip-self
+                electric-quote-context-sensitive t
+                electric-quote-paragraph t
+                electric-quote-string nil)
   (electric-indent-mode 1)
   (electric-pair-mode 1)
   (electric-quote-mode -1))
 
 (use-package emacs
   :init
-  (setq-default tab-always-indent 'complete)
-  (setq-default tab-width 4)
-  (setq-default indent-tabs-mode nil))
+  (setq-default tab-always-indent 'complete
+                tab-width 4
+                indent-tabs-mode nil))
 
 (use-package emacs
   :hook (before-save . delete-trailing-whitespace))
tools/emacs/config/setup-files.el
@@ -1,26 +1,27 @@
 ;;; -*- lexical-binding: t; -*-
-(use-package files                      ; Core commands for files
+(use-package files
+  :disabled
   :bind (("<f5>" . revert-buffer)))
 
-(use-package ripgrep
-  :defer 2)
-
-(setq view-read-only t)                 ; View read-only
+(setq-default view-read-only t)                 ; View read-only
 
 (use-package direnv
-  :custom
-  (direnv-always-show-summary t)
-  (direnv-show-paths-in-summary nil)
+  :disabled
   :config
+  (setq-default direnv-always-show-summary t
+                direnv-show-paths-in-summary nil)
   (direnv-mode))
 
-(use-package hardhat                    ; Protect user-writable files
+(use-package hardhat
+  :disabled
   :init (global-hardhat-mode))
 
-(use-package image-file                 ; Visit images as images
+(use-package image-file
+  :disabled
   :init (auto-image-file-mode))
 
-(use-package markdown-mode              ; Edit markdown files
+(use-package markdown-mode
+  :disabled
   :mode ("\\.md\\'" . markdown-mode)
   :config
   (setq markdown-fontify-code-blocks-natively t)
@@ -41,19 +42,21 @@
   (add-hook 'markdown-mode-hook #'auto-fill-mode))
 
 (use-package highlight-indentation
+  :disabled
   :config
   (set-face-background 'highlight-indentation-face "#e3e3d3")
   (set-face-background 'highlight-indentation-current-column-face "#c3b3b3"))
 
 (use-package yaml-mode
+  :disabled
   :mode "\\.ya?ml\\'"
   :hook ((yaml-mode . highlight-indentation-mode)
          (yaml-mode . highlight-indentation-current-column-mode)))
 
 (use-package toml-mode
+  :disabled
   :mode "\\.to?ml\\'")
 
-;;;###autoload
 (defun vde/delete-this-file ()
   "Delete the current file, and kill the buffer."
   (interactive)
@@ -63,7 +66,6 @@
     (delete-file (buffer-file-name))
     (kill-this-buffer)))
 
-;;;###autoload
 (defun vde/rename-this-file-and-buffer (new-name)
   "Renames both current buffer and file it's visiting to NEW-NAME."
   (interactive "sNew name: ")
tools/emacs/config/setup-go.el
@@ -1,5 +1,6 @@
 ;;; -*- lexical-binding: t; -*-
 (use-package go-mode
+  :disabled
   :mode "\\.go$"
   :interpreter "go"
   :config
@@ -16,13 +17,16 @@
            "go build -v && go test -v && go vet")))
 
 (use-package flycheck-golangci-lint
+  :disabled
   :hook (go-mode . flycheck-golangci-lint-setup)
   :config (setq flycheck-golangci-lint-tests t))
 
 (use-package gotest
+  :disabled
   :after go-mode)
 
 (use-package gotest-ui
+  :disabled
   :after (go-mode gotest)
   :bind (:map go-mode-map
               ("C-c t t" . gotest-ui-current-test)
tools/emacs/config/setup-hydras.el
@@ -1,38 +1,40 @@
 ;;; -*- lexical-binding: t; -*-
-(defhydra hydra-goto-line (goto-map "")
-  "goto-line"
-  ("g" goto-line "go")
-  ("m" set-mark-command "mark" :bind nil)
-  ("q" nil "quit"))
+(when nil
+  (progn
+    (defhydra hydra-goto-line (goto-map "")
+      "goto-line"
+      ("g" goto-line "go")
+      ("m" set-mark-command "mark" :bind nil)
+      ("q" nil "quit"))
 
-(defhydra hydra-yank-pop ()
-  "yank"
-  ("C-y" yank nil)
-  ("M-y" yank-pop nil)
-  ("y" (yank-pop 1) "next")
-  ("Y" (yank-pop -1) "prev"))   ; or browse-kill-ring
+    (defhydra hydra-yank-pop ()
+      "yank"
+      ("C-y" yank nil)
+      ("M-y" yank-pop nil)
+      ("y" (yank-pop 1) "next")
+      ("Y" (yank-pop -1) "prev"))   ; or browse-kill-ring
 
-(defhydra hydra-zoom (global-map "<f2>")
-  "zoom"
-  ("g" text-scale-increase "in")
-  ("l" text-scale-decrease "out")
-  ("r" (text-scale-set 0) "reset")
-  ("0" (text-scale-set 0) :bind nil :exit t)
-  ("1" (text-scale-set 0) nil :bind nil :exit t))
+    (defhydra hydra-zoom (global-map "<f2>")
+      "zoom"
+      ("g" text-scale-increase "in")
+      ("l" text-scale-decrease "out")
+      ("r" (text-scale-set 0) "reset")
+      ("0" (text-scale-set 0) :bind nil :exit t)
+      ("1" (text-scale-set 0) nil :bind nil :exit t))
 
-;; Better shrink/enlarge windows
-(defhydra hydra-resize (global-map "<f2>")
-  "resize windows"
-  ("<up>" enlarge-window "enlarge")
-  ("<down>" shrink-window "shrink")
-  ("<left>" shrink-window-horizontally "shrink horizontaly")
-  ("<right>" enlarge-window-horizontally "enlarge horizontaly"))
+    ;; Better shrink/enlarge windows
+    (defhydra hydra-resize (global-map "<f2>")
+      "resize windows"
+      ("<up>" enlarge-window "enlarge")
+      ("<down>" shrink-window "shrink")
+      ("<left>" shrink-window-horizontally "shrink horizontaly")
+      ("<right>" enlarge-window-horizontally "enlarge horizontaly"))
 
-(defvar hide-mode-line-mode nil)
-(defvar whitespace-mode nil)
-(defvar subword-mode nil)
-(defhydra hydra-toggle (:color pink :hint nil)
-  "
+    (defvar hide-mode-line-mode nil)
+    (defvar whitespace-mode nil)
+    (defvar subword-mode nil)
+    (defhydra hydra-toggle (:color pink :hint nil)
+      "
 _a_ abbrev-mode:          %`abbrev-mode
 _b_ subword-mode:         %`subword-mode
 _d_ debug-on-error:       %`debug-on-error
@@ -45,22 +47,23 @@ _w_ whitespace-mode:      %`whitespace-mode
 _s_ smartparens-strict:   %`smartparens-strict-mode
 _V_ visible-mode:         %`visible-mode
 "
-  ("a" abbrev-mode             nil)
-  ("b" subword-mode            nil)
-  ("d" toggle-debug-on-error   nil)
-  ("f" auto-fill-mode          nil)
-  ("h" hide-mode-line-mode     nil)
-  ("r" dired-toggle-read-only  nil)
-  ("t" toggle-truncate-lines   nil)
-  ("v" visual-line-mode        nil)
-  ("V" visible-mode            nil)
-  ("w" whitespace-mode         nil)
-  ("s" smartparens-strict-mode nil)
-  ("q" nil "quit"))
+      ("a" abbrev-mode             nil)
+      ("b" subword-mode            nil)
+      ("d" toggle-debug-on-error   nil)
+      ("f" auto-fill-mode          nil)
+      ("h" hide-mode-line-mode     nil)
+      ("r" dired-toggle-read-only  nil)
+      ("t" toggle-truncate-lines   nil)
+      ("v" visual-line-mode        nil)
+      ("V" visible-mode            nil)
+      ("w" whitespace-mode         nil)
+      ("s" smartparens-strict-mode nil)
+      ("q" nil "quit"))
 
-(global-set-key (kbd "C-c C-v") 'hydra-toggle/body)
+    (global-set-key (kbd "C-c C-v") 'hydra-toggle/body)
 
-(bind-key "M-y" #'hydra-yank-pop/yank-pop)
-(bind-key "C-y" #'hydra-yank-pop/yank)
+    (bind-key "M-y" #'hydra-yank-pop/yank-pop)
+    (bind-key "C-y" #'hydra-yank-pop/yank)
+    ))
 
 (provide 'setup-hydras)
tools/emacs/config/setup-keybindings.el
@@ -1,4 +1,5 @@
 (use-package which-key
+  :disabled
   :init (which-key-mode)
   :custom
   (which-key-idle-delay 2)
@@ -15,26 +16,6 @@
   (add-to-list 'which-key-replacement-alist '(("DEL" . nil) . ("โ‡ค" . nil)))
   (add-to-list 'which-key-replacement-alist '(("SPC" . nil) . ("โฃ" . nil))))
 
-(use-package region-bindings-mode
-  :config
-  ;; Do not activate `region-bindings-mode' in Special modes like `dired' and
-  ;; `ibuffer'. Single-key bindings like 'm' are useful in those modes even
-  ;; when a region is selected.
-  (setq region-bindings-mode-disabled-modes '(dired-mode ibuffer-mode))
-
-  (region-bindings-mode-enable)
-
-  (defun vde/disable-rbm-deactivate-mark ()
-    "Disable `region-bindings-mode' and deactivate mark."
-    (interactive)
-    (region-bindings-mode -1)
-    (deactivate-mark)
-    (message "Mark deactivated"))
-
-  (bind-keys
-   :map region-bindings-mode-map
-   ("<C-SPC>" . vde/disable-rbm-deactivate-mark)))
-
 ;; Disable C-x C-n to avoid the disabled command buffer
 (unbind-key "C-x C-n" global-map)
 
tools/emacs/config/setup-mails.el
@@ -20,6 +20,8 @@
 
 ;; SendmailCfg
 (use-package smtpmail
+  :defer t
+  ;;:commands (mail-mode mail-text)
   :config
   (setq message-send-mail-function 'message-send-mail-with-sendmail)
   (setq sendmail-program "msmtp")
@@ -28,7 +30,7 @@
 
 (use-package sendmail
   :defer t
-  :commands (mail-mode mail-text)
+  ;;:commands (mail-mode mail-text)
   :defines (send-mail-function)
   :config
   (setq send-mail-function 'sendmail-send-it
tools/emacs/config/setup-multiple-cursors.el
@@ -1,4 +1,26 @@
+(use-package region-bindings-mode
+  :disabled
+  :config
+  ;; Do not activate `region-bindings-mode' in Special modes like `dired' and
+  ;; `ibuffer'. Single-key bindings like 'm' are useful in those modes even
+  ;; when a region is selected.
+  (setq region-bindings-mode-disabled-modes '(dired-mode ibuffer-mode))
+
+  (region-bindings-mode-enable)
+
+  (defun vde/disable-rbm-deactivate-mark ()
+    "Disable `region-bindings-mode' and deactivate mark."
+    (interactive)
+    (region-bindings-mode -1)
+    (deactivate-mark)
+    (message "Mark deactivated"))
+
+  (bind-keys
+   :map region-bindings-mode-map
+   ("<C-SPC>" . vde/disable-rbm-deactivate-mark)))
+
 (use-package multiple-cursor
+  :disabled
   :bind (:map region-bindings-mode-map
               ("a" . mc/mark-all-like-this)
               ("p" . mc/mark-previous-like-this)
tools/emacs/config/setup-navigating.el
@@ -1,25 +1,20 @@
-(use-package avy                   ; Jump to characters in buffers
+(use-package avy
+  :disabled
   :bind (("C-c j"   . avy-goto-word-1)
          ("C-c n b" . avy-pop-mark)
          ("C-c n j" . avy-goto-char-2)
          ("C-c n t" . avy-goto-char-timer)
          ("C-c n w" . avy-goto-word-1)))
 
-(use-package helpful
-  :unless noninteractive
-  :bind (("C-c h F" . helpful-function)
-         ("C-c h C" . helpful-command)
-         ("C-c h M" . helpful-macro)
-         ("C-c h L" . helpful-callable)
-         ("C-c h S" . helpful-at-point)
-         ("C-c h V" . helpful-variable)))
 (use-package winner
+  :disabled
   :unless noninteractive
   :defer 5
   :config
   (winner-mode 1))
 
 (use-package hideshow
+  :disabled
   :defer 5
   :bind (("C-c @ a" . hs-show-all)
          ("C-c @ c" . hs-toggle-hiding)
@@ -28,6 +23,7 @@
          ("C-c @ l" . hs-hide-level)))
 
 (use-package mwim
+  :disabled
   :bind (:map prog-mode-map
               ("C-a" . mwim-beginning-of-code-or-line)
               ("C-e" . mwim-end-of-code-or-line)))
tools/emacs/config/setup-projectile.el
@@ -1,6 +1,6 @@
 ;;; -*- lexical-binding: t; -*-
 (use-package projectile
-  :defer t
+  :disabled
   :commands
   (projectile-ack
    projectile-ag
@@ -33,7 +33,6 @@
   (setq
    ;; Custom compilation buffer name function
    compilation-buffer-name-function (lambda (mode) (concat "*" (downcase mode) ": " (projectile-project-name) "*"))
-   projectile-completion-system 'ivy
    projectile-find-dir-includes-top-level t
    projectile-switch-project-action #'projectile-commander
    projectile-create-missing-test-files t
@@ -45,11 +44,4 @@
     "Run `compile' in the project"
     (projectile-compile-project nil)))
 
-(use-package counsel-projectile         ; Ivy integration for Projectile
-  :commands (counsel-projectile-switch-project)
-  :bind (:map projectile-command-map
-              ("p" . counsel-projectile-switch-project)
-              ("r" . counsel-projectile-rg))
-  :config (counsel-projectile-mode))
-
 (provide 'setup-projectile)
tools/emacs/config/setup-search.el
@@ -7,21 +7,13 @@
 
 ;; Truncate lines during grep
 (add-hook 'grep-mode-hook #'toggle-truncate-lines)
-(use-package isearch
-  :custom
-  (search-whitespace-regexp ".*?")
-  (isearch-lax-whitespace t)
-  (isearch-regexp-lax-whitespace nil)
-  :config
-  (defun prot/isearch-mark-and-exit ()
-    "Marks the current search string.  Can be used as a building
-block for a more complex chain, such as to kill a region, or
-place multiple cursors."
-    (interactive)
-    (push-mark isearch-other-end t 'activate)
-    (setq deactivate-mark nil)
-    (isearch-done))
 
+(use-package isearch
+  :disabled
+  :config
+  (setq-default search-whitespace-regexp ".*?"
+                isearch-lax-whitespace t
+                isearch-regexp-lax-whitespace nil)
   (defun stribb/isearch-region (&optional not-regexp no-recursive-edit)
     "If a region is active, make this the isearch default search
 pattern."
@@ -58,11 +50,11 @@ confines of word boundaries (e.g. multiple words)."
     (when isearch-other-end (goto-char isearch-other-end)))
   :bind (("M-s M-o" . multi-occur)
          :map isearch-mode-map
-         ("C-SPC" . prot/isearch-mark-and-exit)
          ("DEL" . contrib/isearchp-remove-failed-part-or-last-char)
          ("<C-return>" . contrib/isearch-done-opposite-end)))
 
 (use-package anzu
+  :disabled
   :ensure t
   :delight
   :custom
@@ -79,6 +71,7 @@ confines of word boundaries (e.g. multiple words)."
   ("M-s %" . anzu-query-replace-at-cursor))
 
 (use-package swiper
+  :disabled
   :after ivy
   :custom
   (swiper-action-recenter t)
@@ -91,17 +84,15 @@ confines of word boundaries (e.g. multiple words)."
          ("M-y" . yank)
          ("C-." . swiper-avy)))
 
-(use-package wgrep                      ; Editable grep buffer
+(use-package wgrep
+  :disabled
   :defer 2
   :custom
   (wgrep-auto-save-buffer t)
   (wgrep-change-readonly-file t))
 
-(use-package visual-regexp              ; Regexp replace with in-buffer display
-  :bind (("C-c s r" . vr/query-replace)
-         ("C-c s R" . vr/replace)))
-
 (use-package rg
+  :disabled
   :hook (after-init . rg-enable-default-binding))
 
 (provide 'setup-search)
tools/emacs/config/setup-shells.el
@@ -1,17 +1,17 @@
 ;;; -*- lexical-binding: t; -*-
-(use-package shell                 ; Specialized comint.el for running the shell
-  :custom
-                                        ;(ansi-color-for-comint-mode 'filter)
-  (explicit-shell-file-name "zsh")
-  (shell-file-name "zsh")
+(use-package shell
+  :disabled
   :bind (("<f1>"      . shell)
          (:map shell-mode-map
                ("<tab>" . completion-at-point)))
   :config
+  (setq-default explicit-shell-file-name "zsh"
+                shell-file-name "zsh")
   (unbind-key "C-c C-l" shell-mode-map)
   (bind-key "C-c C-l" #'counsel-shell-history shell-mode-map))
 
-(use-package eshell                     ; Emacs command shell
+(use-package eshell
+  :disabled
   :bind* ("C-x m t" . eshell-here)
   :config
   (defun eshell-here ()
@@ -85,7 +85,9 @@ The EShell is renamed to match that directory to make multiple windows easier."
 
   (add-hook 'eshell-mode-hook #'with-editor-export-editor))
 
-(use-package em-prompt                  ; EShell command prompts
+(use-package em-prompt
+  :disabled
+  :after eshell
   :defer 2
   :config
   (defun vde/eshell-quit-or-delete-char (arg)
@@ -101,19 +103,42 @@ The EShell is renamed to match that directory to make multiple windows easier."
               (bind-key "C-d"
                         #'vde/eshell-quit-or-delete-char eshell-mode-map))))
 
-(use-package esh-mode                   ; EShell UI customizations
-  :ensure eshell
-  :config (setq eshell-scroll-to-bottom-on-input 'all))
+(use-package esh-mode
+  :disabled
+  :after eshell
+  :bind (:map eshell-mode-map
+              ("<tab>" . vde/esh-mode-completion-at-point))
+  :config
+  (setq-default eshell-scroll-to-bottom-on-input 'all)
+  (defun vde/esh-mode-completion-at-point ()
+    "Same as `completion-at-point' except for some commands."
+    (interactive)
+    ;; unbinding pcomplete/make gives a chance to `bash-completion'
+    ;; to complete make rules. Bash-completion is indeed more
+    ;; powerfull than `pcomplete-make'.
+    (cl-letf (((symbol-function 'pcomplete/make) nil))
+      (completion-at-point))))
 
 (use-package em-smart
-  :ensure eshell)
+  :disabled
+  :after eshell)
 (use-package em-dirs
-  :ensure eshell)
+  :disabled
+  :after eshell)
 
-(use-package em-cmpl                    ; EShell TAB completion
-  :ensure eshell
+(use-package em-cmpl
+  :disabled
+  :after eshell
+  :hook (eshell-mode . eshell-cmpl-initialize)
   :config
-  (add-hook 'eshell-mode-hook #'eshell-cmpl-initialize)
+  (defun my/eshell-bash-completion ()
+    (let ((bash-completion-nospace t))
+      (while (pcomplete-here
+              (nth 2 (bash-completion-dynamic-complete-nocomint
+                      (save-excursion (eshell-bol) (point))
+                      (point)))))))
+  (when (require 'bash-completion nil t)
+    (setq eshell-default-completion-function #'my/eshell-bash-completion))
 
   (add-to-list 'eshell-command-completions-alist
                '("gunzip" "gz\\'"))
@@ -121,11 +146,13 @@ The EShell is renamed to match that directory to make multiple windows easier."
                '("tar" "\\(\\.tar|\\.tgz\\|\\.tar\\.gz\\)\\'")))
 
 (use-package em-hist                    ; EShell History management
-  :ensure eshell
+  :disabled
+  :after eshell
   :config (setq eshell-hist-ignoredups t))
 
 (use-package em-term                    ; Handle visual commands in EShell
-  :ensure eshell
+  :disabled
+  :after eshell
   :config
   (add-to-list 'eshell-visual-commands "ssh")
   (add-to-list 'eshell-visual-commands "htop")
@@ -135,7 +162,8 @@ The EShell is renamed to match that directory to make multiple windows easier."
   (add-to-list 'eshell-visual-commands "ncdu"))
 
 (use-package em-banner
-  :ensure eshell
+  :disabled
+  :after eshell
   :config
   (setq eshell-banner-message "
   Welcome to the Emacs
@@ -148,13 +176,15 @@ The EShell is renamed to match that directory to make multiple windows easier."
 
 "))
 
-(use-package fish-completion            ; Add Fish completion to EShell
+(use-package fish-completion
+  :disabled
   :defer 2
   :when (executable-find "fish")
   :config (add-hook 'eshell-mode-hook #'fish-completion-mode))
 
 (use-package eshell-prompt-extras
-  :defer 1
+  :disabled
+  :after eshell
   :custom
   (eshell-highlight-prompt nil)
   (eshell-prompt-function 'vde-theme-lambda)
@@ -209,9 +239,12 @@ using either KUBECONFIG or ~/.kube/config"
 
 (use-package esh-autosuggest
   :defer 1
+  :disabled
   :hook (eshell-mode . esh-autosuggest-mode))
 
 (use-package xterm-color
+  :disabled
+  :after eshell
   :init
   (setq comint-output-filter-functions
         (remove 'ansi-color-process-output comint-output-filter-functions))
@@ -248,6 +281,7 @@ using either KUBECONFIG or ~/.kube/config"
 (add-hook 'term-mode-hook 'toggle-truncate-lines)
 
 (use-package tramp
+  :defer t
   :config
   (add-to-list 'tramp-remote-path "/run/current-system/sw/bin")
   (add-to-list 'tramp-remote-path "~/.nix-profile/bin")
tools/emacs/config/setup-style.el
@@ -3,203 +3,101 @@
 ;;; Setup of the style, from font faces to themes
 ;;; Code:
 
-;; TypeFaceConfiguration
-;;; ยฏ\_(ใƒ„)_/ยฏ
-(defconst font-height 130
-  "Default font-height to use.")
+(when nil
+  (progn
+    ;;; Interface
+    (use-package frame                      ; Frames
+      :bind ("C-c w f" . toggle-frame-fullscreen)
+      :init
+      ;; Kill `suspend-frame'
+      (unbind-key "C-x C-z")
+      :config (add-to-list 'initial-frame-alist '(fullscreen . maximized)))
 
-(use-package emacs
-  :bind ("C-c f r" . mu-reset-fonts)
-  :config
-  ;; Middle/Near East: ืฉืœื•ื, ุงู„ุณู‘ู„ุงู… ุนู„ูŠูƒู…
-  (when (member "Noto Sans Arabic" (font-family-list))
-    (set-fontset-font t 'arabic "Noto Sans Arabic"))
-  (when (member "Noto Sans Hebrew" (font-family-list))
-    (set-fontset-font t 'arabic "Noto Sans Hebrew"))
-  ;; Africa: แˆ แˆ‹แˆ
-  (when (member "Noto Sans Ethiopic" (font-family-list))
-    (set-fontset-font t 'ethiopic "Noto Sans Ethiopic"))
+    ;; Show buffer position percentage starting from top
 
-  ;; Default font is Ubuntu Mono (and Ubuntu Sans for variable-pitch)
-  ;; If Ubuntu Mono or Ubuntu Sans are not available, use the default Emacs face
-  (when (member "Ubuntu Mono" (font-family-list))
-    (set-face-attribute 'default nil
-                        :family "Ubuntu Mono"
-                        :height font-height))
-  (when (member "Ubuntu Sans" (font-family-list))
-    (set-face-attribute 'variable-pitch nil
-                        :family "Ubuntu Sans"
-                        :height font-height
-                        :weight 'regular))
 
-  (defun mu-reset-fonts ()
-    "Reset fonts to my preferences."
-    (interactive)
-    (when when (member "Ubuntu Mono" (font-family-list))
-          (set-face-attribute 'default nil
-                              :family "Ubuntu Mono"
-                              :height font-height))
-    (when when (member "Ubuntu Sans" (font-family-list))
-          (set-face-attribute 'variable-pitch nil
-                              :family "Ubuntu Sans"
-                              :height font-height
-                              :weight 'regular))))
-;; -TypeFaceConfiguration
+    (setq-default mode-line-format
+                  '("%e"
+                    mu-eyebrowse-mode-line
+                    mode-line-front-space
+                    mode-line-mule-info
+                    mode-line-client
+                    mode-line-modified
+                    mode-line-remote
+                    mode-line-frame-identification
+                    mode-line-buffer-identification " " mode-line-position
+                    (vc-mode vc-mode)
+                    (multiple-cursors-mode mc/mode-line)
+                    " " mode-line-modes
+                    mode-line-end-spaces))
 
-;;; Interface
-(use-package frame                      ; Frames
-  :bind ("C-c w f" . toggle-frame-fullscreen)
-  :init
-  ;; Kill `suspend-frame'
-  (unbind-key "C-x C-z")
-  :config (add-to-list 'initial-frame-alist '(fullscreen . maximized)))
+    (defmacro rename-modeline (package-name mode new-name)
+      "Rename PACKAGE-NAME with MODE into NEW-NAME in the mode line."
+      `(eval-after-load ,package-name
+         '(defadvice ,mode (after rename-modeline activate)
+            (setq mode-name ,new-name))))
 
-(use-package emacs
-  :custom
-  (use-file-dialog nil)
-  (use-dialog-box nil)
-  (echo-keystrokes 0.1) ; Faster echo keystrokes
-  (line-number-display-limit-width 10000) ;; Avoid showing ?? in the mode line when we have long lines.
-  (display-time-world-list '(("Europe/London" "London")
-                             ("Europe/Paris" "Paris")
-                             ("America/New_York" "Boston")
-                             ("America/Los_Angeles" "San-Francisco")
-                             ("Asia/Calcutta" "Bangalore")
-                             ("Australia/Brisbane" "Brisbane")))
-  :config
-  (line-number-mode 1)
-  (column-number-mode 1)
-  (global-hl-line-mode 1)
-  (global-unset-key (kbd "C-z"))
-  (global-unset-key (kbd "C-x C-z"))
-  (global-unset-key (kbd "C-h h")))
+    (defun generic-term-init ()
+      (visual-line-mode -1)
+      (setq-local global-hl-line-mode nil)
+      (setq-local scroll-margin 0))
 
-;;; Theme
-(setq custom-safe-themes t)    ; Treat themes as safe
+    (add-hook 'term-mode-hook #'generic-term-init)
+    (add-hook 'shell-mode-hook #'generic-term-init)
+    (add-hook 'eshell-mode-hook #'generic-term-init)
 
-(use-package shortbrain-light-theme
-  :config
-  (load-theme 'shortbrain-light))
+    (setq-default indicate-buffer-boundaries 'left)
+    (setq-default indicate-empty-lines +1)
 
-;; Show buffer position percentage starting from top
-(setq mode-line-percent-position '(-3 "%o"))
-(defvar mu-eyebrowse-mode-line
-  '(:propertize
-    (:eval
-     (when (bound-and-true-p eyebrowse-mode)
-       (let* ((num (eyebrowse--get 'current-slot))
-              (tag (when num
-                     (nth 2 (assoc num (eyebrowse--get 'window-configs)))))
-              (str (concat
-                    " "
-                    (if (and tag (< 0 (length tag)))
-                        tag
-                      (when num (int-to-string num)))
-                    " ")))
-         str)))
-    face (:background "#81a2be" :foreground "#373b41"))
-  "Mode line format for Eyebrowse.")
+    (use-package highlight-numbers
+      :hook (prog-mode . highlight-numbers-mode))
 
-(put 'mu-eyebrowse-mode-line 'risky-local-variable t)
+    (use-package symbol-overlay
+      :defer 4
+      :bind
+      ("M-s h ." . symbol-overlay-put)
+      ("M-s h n" . symbol-overlay-jump-next)
+      ("M-s h p" . symbol-overlay-jump-prev)
+      :hook (prog-mode . symbol-overlay-mode)
+      :config
+      (setq symbol-overlay-idle-time 0.2))
 
-(setq-default mode-line-format
-              '("%e"
-                mu-eyebrowse-mode-line
-                mode-line-front-space
-                mode-line-mule-info
-                mode-line-client
-                mode-line-modified
-                mode-line-remote
-                mode-line-frame-identification
-                mode-line-buffer-identification " " mode-line-position
-                (vc-mode vc-mode)
-                (multiple-cursors-mode mc/mode-line)
-                " " mode-line-modes
-                mode-line-end-spaces))
+    (use-package rainbow-delimiters
+      :hook (prog-mode . rainbow-delimiters-mode))
 
-(defmacro rename-modeline (package-name mode new-name)
-  "Rename PACKAGE-NAME with MODE into NEW-NAME in the mode line."
-  `(eval-after-load ,package-name
-     '(defadvice ,mode (after rename-modeline activate)
-        (setq mode-name ,new-name))))
+    (use-package rainbow-mode
+      :commands rainbow-mode
+      :hook (prog-mode . rainbow-mode))
 
-(defun generic-term-init ()
-  (visual-line-mode -1)
-  (setq-local global-hl-line-mode nil)
-  (setq-local scroll-margin 0))
+    (use-package visual-fill-column
+      :commands visual-fill-column-mode)
 
-(add-hook 'term-mode-hook #'generic-term-init)
-(add-hook 'shell-mode-hook #'generic-term-init)
-(add-hook 'eshell-mode-hook #'generic-term-init)
+    (use-package hide-mode-line-mode
+      :commands hide-mode-line-mode)
 
-(use-package moody
-  :config
-  (setq x-underline-at-descent-line t)
-  (moody-replace-mode-line-buffer-identification)
-  (moody-replace-vc-mode))
+    (defun set-light-theme ()
+      "Set the light theme with some customization if needed."
+      (interactive)
+      (use-package shortbrain-light-theme
+        :config
+        (load-theme 'shortbrain-light t)))
 
-(use-package minions                    ; A minor-mode menu for the mode line
-  :init (minions-mode)
-  :config
-  (setq
-   minions-mode-line-lighter "ฮป="
-   minions-direct '(flycheck-mode)))
+    (defun set-dark-theme ()
+      "Set the dark theme with some customization if needed."
+      (interactive)
+      (use-package shortbrain-theme
+        :config
+        (load-theme 'shortbrain t)))
 
-(setq-default indicate-buffer-boundaries 'left)
-(setq-default indicate-empty-lines +1)
+    (defun theme-switcher ()
+      (interactive)
+      (let ((current-hour (string-to-number (format-time-string "%H"))))
+        (if (and (> current-hour 6) (< current-hour 20))
+            (set-light-theme)
+          (set-dark-theme))))
 
-(use-package highlight
-  :ensure t
-  :pin melpa)
-
-(use-package highlight-numbers
-  :hook (prog-mode . highlight-numbers-mode))
-
-(use-package symbol-overlay
-  :defer 4
-  :bind
-  ("M-s h ." . symbol-overlay-put)
-  ("M-s h n" . symbol-overlay-jump-next)
-  ("M-s h p" . symbol-overlay-jump-prev)
-  :hook (prog-mode . symbol-overlay-mode)
-  :config
-  (setq symbol-overlay-idle-time 0.2))
-
-(use-package rainbow-delimiters
-  :hook (prog-mode . rainbow-delimiters-mode))
-
-(use-package rainbow-mode
-  :commands rainbow-mode
-  :hook (prog-mode . rainbow-mode))
-
-(use-package visual-fill-column
-  :commands visual-fill-column-mode)
-
-(use-package hide-mode-line-mode
-  :commands hide-mode-line-mode)
-
-(defun set-light-theme ()
-  "Set the light theme with some customization if needed."
-  (interactive)
-  (use-package shortbrain-light-theme
-    :config
-    (load-theme 'shortbrain-light t)))
-
-(defun set-dark-theme ()
-  "Set the dark theme with some customization if needed."
-  (interactive)
-  (use-package shortbrain-theme
-    :config
-    (load-theme 'shortbrain t)))
-
-(defun theme-switcher ()
-  (interactive)
-  (let ((current-hour (string-to-number (format-time-string "%H"))))
-    (if (and (> current-hour 6) (< current-hour 20))
-        (set-light-theme)
-      (set-dark-theme))))
-
-;; Run at every 3600 seconds, after 0s delay
-;;ย (run-with-timer 0 3600 'theme-switcher)
+    ;; Run at every 3600 seconds, after 0s delay
+    ;;ย (run-with-timer 0 3600 'theme-switcher)
+    ))
 
 (provide 'setup-style)
tools/emacs/config/setup-vcs.el
@@ -1,12 +1,14 @@
 ;;; -*- lexical-binding: t; -*-
 (use-package vc-hooks                   ; Simple version control
+  :disabled
   :bind (("S-<f5>" . vc-revert)
          ("C-c v r" . vc-refresh-state))
   :config
   ;; Always follow symlinks to files in VCS repos
-  (setq vc-follow-symlinks t))
+  (setq-default vc-follow-symlinks t))
 
 (use-package magit                      ; The best Git client out there
+  :disabled
   :bind (("C-c v c" . magit-clone)
          ("C-c v C" . magit-checkout)
          ("C-c v d" . magit-dispatch-popup)
@@ -15,13 +17,11 @@
          ("C-c v p" . magit-pull)
          ("C-c v v" . magit-status))
   :config
-  (setq
-   magit-save-repository-buffers 'dontask
-   magit-refs-show-commit-count 'all
-   magit-branch-prefer-remote-upstream '("master")
-   magit-display-buffer-function #'magit-display-buffer-traditional
-   magit-completing-read-function 'ivy-completing-read
-   )
+  (setq-default magit-save-repository-buffers 'dontask
+                magit-refs-show-commit-count 'all
+                magit-branch-prefer-remote-upstream '("master")
+                magit-display-buffer-function #'magit-display-buffer-traditional
+                magit-completing-read-function 'ivy-completing-read)
 
   (magit-define-popup-option 'magit-rebase-popup
     ?S "Sign using gpg" "--gpg-sign=" #'magit-read-gpg-secret-key)
@@ -34,10 +34,6 @@
                           'magit-insert-unpushed-to-upstream-or-recent
                           'replace)
 
-  (use-package magit-files
-    :config
-    (global-magit-file-mode))
-
   ;; Show refined hunks during diffs
   (set-default 'magit-diff-refine-hunk t)
 
@@ -50,14 +46,9 @@
   ;; Free C-c C-w for Eyebrowse
   (unbind-key "C-c C-w" git-commit-mode-map)  )
 (put 'magit-diff-edit-hunk-commit 'disabled nil)
-(use-package magit-repos
-  :after magit
-  :commands magit-list-repositories
-  :config
-  (setq magit-repository-directories
-        '(("~/src" . 3))))
 
 (use-package git-commit                 ; Git commit message mode
+  :disabled
   :defer 2
   :init (global-git-commit-mode)
   :config
@@ -78,20 +69,25 @@
                #'git-commit-check-style-conventions))
 
 (use-package gitconfig-mode             ; Git configuration mode
+  :disabled
   :defer 2)
 
 (use-package gitignore-mode             ; .gitignore mode
+  :disabled
   :defer 2)
 
 (use-package gitattributes-mode         ; Git attributes mode
+  :disabled
   :defer 2)
 
 (use-package dired-git-info
+  :disabled
   :bind (:map dired-mode-map
               (")" . dired-git-info-mode))
   :defer 2)
 
 (use-package ediff
+  :disabled
   :config
   (setq ediff-window-setup-function 'ediff-setup-windows-plain)
   (setq ediff-split-window-function 'split-window-horizontally)
tools/emacs/config/setup-windows.el
@@ -1,6 +1,5 @@
 ;;; -*- lexical-binding: t; -*-
 
-;;;###autoload
 (defun vde/window-split-toggle ()
   "Toggle between horizontal and vertical split with two windows."
   (interactive)
@@ -17,21 +16,8 @@
 
 (bind-key "C-c w t" #'vde/window-split-toggle)
 
-(defvar vde/saved-window-configuration nil)
-
-(defun vde/save-wins-then-call (func &optional args)
-  "Save current window configuration, then call FUNC optionally with ARGS."
-  (interactive)
-  (push (current-window-configuration) vde/saved-window-configuration)
-  (cond
-   ;; We have arguments for the function
-   ((bound-and-true-p args) (funcall func args))
-   ;; The function expects exactly one argument, and we want it to be nil
-   ((equal args "nil") (funcall func nil))
-   ;; The function does not expect arguments
-   (t (funcall func))))
-
 (use-package eyebrowse                  ; Easy workspaces creation and switching
+  :disabled
   :init (eyebrowse-mode t)
   :config
   (setq
@@ -41,6 +27,7 @@
    eyebrowse-wrap-around t))
 
 (use-package ace-window                 ; Better movements between windows
+  :disabled
   :custom
   (aw-keys '(?a ?u ?i ?e ?, ?c ?t ?r ?m))
   (aw-scope 'frame)
@@ -59,6 +46,7 @@
          ("C-c w s" . ace-swap-window)))
 
 (use-package windmove
+  :disabled
   :bind (("M-<left>" . windmove-left)
          ("M-<down>" . windmove-down)
          ("M-<up>" . windmove-up)