Commit 3f89e71053c8

Vincent Demeester <vincent@sbr.pm>
2021-01-06 18:02:53
tools/emacs: experimenting with lightweight…
… emacs configuration. Signed-off-by: Vincent Demeester <vincent@sbr.pm>
1 parent d05ed09
Changed files (5)
tools/emacs/lisp/init-func.el
@@ -1,6 +1,6 @@
 ;;; init-func.el --- -*- lexical-binding: t -*-
 ;;
-;; OrgIncludeAuto
+
 ;; https://endlessparentheses.com/updating-org-mode-include-statements-on-the-fly.html
 (defun save-and-update-includes ()
   "Update the line numbers of #+INCLUDE:s in current buffer.
@@ -45,7 +45,6 @@ BEGIN and END are regexps which define the line range to use."
           (search-forward-regexp end)
           (setq r (1+ (line-number-at-pos (match-end 0)))))
         (format "%s-%s" (+ l 1) (- r 1)))))) ;; Exclude wrapper
-;; -OrgIncludeAuto
 
 (provide 'init-func)
 ;;; init-func.el ends here
tools/emacs/foo.el
@@ -0,0 +1,174 @@
+
+(require 'package)
+
+(setq package-archives
+      '(("melpa" . "http://melpa.org/packages/")
+        ("org" . "https://orgmode.org/elpa/")
+        ("gnu" . "https://elpa.gnu.org/packages/")))
+
+(setq package-archive-priorities
+      '(("melpa" .  3)
+        ("org" . 2)
+        ("gnu" . 1)))
+
+(require 'tls)
+
+;; From https://github.com/hlissner/doom-emacs/blob/5dacbb7cb1c6ac246a9ccd15e6c4290def67757c/core/core-packages.el#L102
+(setq gnutls-verify-error (not (getenv "INSECURE")) ; you shouldn't use this
+      tls-checktrust gnutls-verify-error
+      tls-program (list "gnutls-cli --x509cafile %t -p %p %h"
+                        ;; compatibility fallbacks
+                        "gnutls-cli -p %p %h"
+                        "openssl s_client -connect %h:%p -no_ssl2 -no_ssl3 -ign_eof"))
+
+;; Initialise the packages, avoiding a re-initialisation.
+(unless (bound-and-true-p package--initialized)
+  (setq package-enable-at-startup nil)
+  (package-initialize))
+
+(setq load-prefer-newer t)              ; Always load newer compiled files
+(setq ad-redefinition-action 'accept)   ; Silence advice redefinition warnings
+
+;; Init `delight'
+(unless (package-installed-p 'delight)
+  (package-refresh-contents)
+  (package-install 'delight))
+
+;; Configure `use-package' prior to loading it.
+(eval-and-compile
+  (setq use-package-always-ensure nil)
+  (setq use-package-always-defer nil)
+  (setq use-package-always-demand nil)
+  (setq use-package-expand-minimally nil)
+  (setq use-package-enable-imenu-support t))
+
+(unless (package-installed-p 'use-package)
+  (package-refresh-contents)
+  (package-install 'use-package))
+
+(eval-when-compile
+  (require 'use-package))
+
+(use-package orderless
+  :unless noninteractive
+  :config
+  (setq orderless-regexp-separator " +")
+  (setq orderless-matching-styles
+        '(orderless-flex
+	  orderless-strict-leading-initialism
+          orderless-regexp
+          orderless-prefixes
+          orderless-literal))
+
+  (defun prot/orderless-literal-dispatcher (pattern _index _total)
+    (when (string-suffix-p "=" pattern)
+      `(orderless-literal . ,(substring pattern 0 -1))))
+
+  (defun prot/orderless-initialism-dispatcher (pattern _index _total)
+    (when (string-suffix-p "," pattern)
+      `(orderless-strict-leading-initialism . ,(substring pattern 0 -1))))
+
+  (setq orderless-style-dispatchers '(prot/orderless-literal-dispatcher
+                                      prot/orderless-initialism-dispatcher))
+  :bind (:map minibuffer-local-completion-map
+              ("SPC" . nil)))         ; space should never complete
+(use-package marginalia
+   :config
+   (marginalia-mode 1)
+   (setq marginalia-annotators '(marginalia-annotators-heavy
+                                 marginalia-annotators-light))
+   ;;:bind (:map minibuffer-local-completion-map
+   ;;            ("C-i" . marginalia-cycle-annotators))
+   )
+
+(use-package minibuffer
+  :config
+  (setq completion-styles '(orderless partial-completion))
+  (setq completion-category-defaults nil)
+  (setq completion-cycle-threshold 3)
+  (setq completion-flex-nospace nil)
+  (setq completion-pcm-complete-word-inserts-delimiters t)
+  (setq completion-pcm-word-delimiters "-_./:| ")
+  (setq completion-show-help nil)
+  (setq completion-ignore-case t)
+  (setq-default case-fold-search nil)   ; For general regexp
+
+  ;; The following two are updated in Emacs 28.  They concern the
+  ;; *Completions* buffer.
+  (setq completions-format 'one-column)
+  (setq completions-detailed t)
+
+  (setq read-buffer-completion-ignore-case t)
+  (setq read-file-name-completion-ignore-case t)
+
+  (setq enable-recursive-minibuffers t)
+  (setq read-answer-short t)
+  (setq resize-mini-windows t)
+  (setq minibuffer-eldef-shorten-default t)
+
+  (file-name-shadow-mode 1)
+  (minibuffer-depth-indicate-mode 1)
+  (minibuffer-electric-default-mode 1)
+
+  ;; Defines, among others, aliases for common minibuffer commands to
+  ;; Super-KEY.  Normally these should go in individual package
+  ;; declarations, but their grouping here makes things easier to
+  ;; understand.  Besides, they are related to the minibuffer.
+  :bind (("s-b" . switch-to-buffer)
+         ("s-B" . switch-to-buffer-other-window)
+         ("s-f" . find-file)
+         ("s-F" . find-file-other-window)
+         ("s-d" . dired)
+         ("s-D" . dired-other-window)
+         :map completion-list-mode-map
+         ("n" . next-line)
+         ("p" . previous-line)
+         ("f" . next-completion)
+         ("b" . previous-completion)))
+(use-package consult
+  :config
+  (setq consult-line-numbers-widen t)
+  (setq consult-preview-buffer nil)
+  (setq consult-preview-grep t)
+  (setq consult-preview-mark t)
+  (setq consult-preview-line t)
+  (setq consult-preview-outline nil)
+  (setq completion-in-region-function #'consult-completion-in-region)
+  (setq consult-async-input-debounce 0.5)
+  (setq consult-async-input-throttle 0.8)
+  (consult-preview-mode 1)
+  :bind (("M-X" . consult-mode-command)
+         ("M-s i" . consult-imenu)
+         ("M-s s" . consult-outline)    ; M-s o is `occur'
+         ("M-s M-s" . consult-outline)
+         ("M-s m" . consult-mark)
+         ("M-s l" . consult-line)
+         :map minibuffer-local-completion-map
+         ("<tab>" . minibuffer-force-complete)))
+
+(use-package embark
+	     :ensure t
+  :after minibuffer
+  :config
+  (setq embark-occur-initial-view-alist '((t . zebra)))
+  (setq embark-occur-minibuffer-completion t)
+  (setq embark-live-occur-update-delay 0.5)
+  (setq embark-live-occur-initial-delay 0.8)
+  (setq embark-annotator-alist '((t . embark-annotation-function-metadatum)))
+  :hook (minibuffer-setup-hook . embark-live-occur-after-input)
+  :bind (("C-," . embark-act)
+         :map minibuffer-local-completion-map
+         ("C-," . embark-act)
+         ("C-." . embark-act-noexit)
+         ("M-q" . embark-occur-toggle-view) ; parallel of `fill-paragraph'
+         ("M-o" . embark-export) ; falls back to `embark-occur'
+         ("C-o" . embark-export)
+         ("M-v" . embark-switch-to-live-occur)
+         :map embark-occur-mode-map
+         ("," . embark-act)
+         ("M-o" . embark-export)
+         ("C-o" . embark-export)
+         ("M-t" . toggle-truncate-lines)
+         ("M-q" . embark-occur-toggle-view)
+         ;; ("M-v" . prot-minibuffer-focus-mini) ; from `prot-minibuffer.el'
+         ("M-q" . embark-occur-toggle-view)))
tools/emacs/init.el
@@ -102,13 +102,13 @@
        load-path))
 
 (defun vde/el-load-dir (dir)
-  "Load el files from the given folder"
+  "Load el files from the given folder `DIR'."
   (let ((files (directory-files dir nil "\.el$")))
     (while files
       (load-file (concat dir (pop files))))))
 
 (defun vde/short-hostname ()
-  "Return hostname in short (aka wakasu.local -> wakasu)"
+  "Return hostname in short (aka wakasu.local -> wakasu)."
   (string-match "[0-9A-Za-z-]+" system-name)
   (substring system-name (match-beginning 0) (match-end 0)))
 
@@ -127,7 +127,7 @@
   "Are you a ROOT user?")
 (defconst *nix*
   (executable-find "nix")
-  "Do we have nix? (aka are we running in NixOS or a system using nixpkgs)")
+  "Do we have nix? (aka are we running in NixOS or a system using nixpkgs).")
 (defconst *rg*
   (executable-find "rg")
   "Do we have ripgrep?")
tools/emacs/small-init.el
@@ -0,0 +1,130 @@
+(defconst emacs-start-time (current-time))
+
+(let ((minver 26))
+  (unless (>= emacs-major-version minver)
+    (error "Your Emacs is too old -- this configuration requires v%s or higher" minver)))
+
+;; load early-init.el before Emacs 27.0
+(unless (>= emacs-major-version 27)
+  (message "Early init: Emacs Version < 27.0")
+  (load (expand-file-name "early-init.el" user-emacs-directory)))
+
+(setq inhibit-default-init t)           ; Disable the site default settings
+
+(setq inhibit-startup-message t
+      inhibit-startup-screen t)
+
+(setq confirm-kill-emacs #'y-or-n-p)
+(setq initial-major-mode 'fundamental-mode
+      initial-scratch-message nil)
+
+(prefer-coding-system 'utf-8)
+(set-default-coding-systems 'utf-8)
+(set-language-environment 'utf-8)
+(set-selection-coding-system 'utf-8)
+(set-terminal-coding-system 'utf-8)
+
+(require 'package)
+
+(setq package-archives
+      '(("melpa" . "http://melpa.org/packages/")
+        ("org" . "https://orgmode.org/elpa/")
+        ("gnu" . "https://elpa.gnu.org/packages/")))
+
+(setq package-archive-priorities
+      '(("melpa" .  3)
+        ("org" . 2)
+        ("gnu" . 1)))
+
+(require 'tls)
+
+;; From https://github.com/hlissner/doom-emacs/blob/5dacbb7cb1c6ac246a9ccd15e6c4290def67757c/core/core-packages.el#L102
+(setq gnutls-verify-error (not (getenv "INSECURE")) ; you shouldn't use this
+      tls-checktrust gnutls-verify-error
+      tls-program (list "gnutls-cli --x509cafile %t -p %p %h"
+                        ;; compatibility fallbacks
+                        "gnutls-cli -p %p %h"
+                        "openssl s_client -connect %h:%p -no_ssl2 -no_ssl3 -ign_eof"))
+
+;; Initialise the packages, avoiding a re-initialisation.
+(unless (bound-and-true-p package--initialized)
+  (setq package-enable-at-startup nil)
+  (package-initialize))
+
+(setq load-prefer-newer t)              ; Always load newer compiled files
+(setq ad-redefinition-action 'accept)   ; Silence advice redefinition warnings
+
+;; Init `delight'
+(unless (package-installed-p 'delight)
+  (package-refresh-contents)
+  (package-install 'delight))
+
+;; Configure `use-package' prior to loading it.
+(eval-and-compile
+  (setq use-package-always-ensure nil)
+  (setq use-package-always-defer nil)
+  (setq use-package-always-demand nil)
+  (setq use-package-expand-minimally nil)
+  (setq use-package-enable-imenu-support t))
+
+(unless (package-installed-p 'use-package)
+  (package-refresh-contents)
+  (package-install 'use-package))
+
+(eval-when-compile
+  (require 'use-package))
+
+(defconst vde/custom-file (locate-user-emacs-file "custom.el")
+  "File used to store settings from Customization UI.")
+
+(use-package cus-edit
+  :config
+  (setq
+   custom-file vde/custom-file
+   custom-buffer-done-kill nil          ; Kill when existing
+   custom-buffer-verbose-help nil       ; Remove redundant help text
+   custom-unlispify-tag-names nil       ; Show me the real variable name
+   custom-unlispify-menu-entries nil)
+  (unless (file-exists-p custom-file)
+    (write-region "" nil custom-file))
+
+  (load vde/custom-file 'no-error 'no-message))
+
+;; Remove built-in org-mode
+(require 'cl-seq)
+(setq load-path
+      (cl-remove-if
+       (lambda (x)
+         (string-match-p "org$" x))
+       load-path))
+
+(defun vde/el-load-dir (dir)
+  "Load el files from the given folder `DIR'."
+  (let ((files (directory-files dir nil "\.el$")))
+    (while files
+      (load-file (concat dir (pop files))))))
+
+(defun vde/short-hostname ()
+  "Return hostname in short (aka wakasu.local -> wakasu)."
+  (string-match "[0-9A-Za-z-]+" system-name)
+  (substring system-name (match-beginning 0) (match-end 0)))
+
+(add-to-list 'load-path (concat user-emacs-directory "lisp/"))
+(add-to-list 'load-path (concat user-emacs-directory "lisp/vorg"))
+(require 'init-func)
+;; (vde/el-load-dir (concat user-emacs-directory "/config/"))
+;;
+;; (if (file-exists-p (downcase (concat user-emacs-directory "/hosts/" (vde/short-hostname) ".el")))
+;;     (load-file (downcase (concat user-emacs-directory "/hosts/" (vde/short-hostname) ".el"))))
+
+(let ((elapsed (float-time (time-subtract (current-time)
+                                          emacs-start-time))))
+  (message "Loading %s...done (%.3fs)" load-file-name elapsed))
+
+(add-hook 'after-init-hook
+          `(lambda ()
+             (let ((elapsed
+                    (float-time
+                     (time-subtract (current-time) emacs-start-time))))
+               (message "Loading %s...done (%.3fs) [after-init]"
+                        ,load-file-name elapsed))) t)
users/vincent/dev/emacs.nix
@@ -7,10 +7,6 @@ let
     #!${pkgs.stdenv.shell}
     emacsclient -n -F '((name . "capture") (width . 150) (height . 90))' -e '(org-capture)'
   '';
-  e = pkgs.writeScriptBin "e" ''
-    #!${pkgs.stdenv.shell}
-    emacs --dump-file=~/.config/emacs/emacs.pdmp $@
-  '';
   et = pkgs.writeScriptBin "et" ''
     #!${pkgs.stdenv.shell}
     emacsclient --tty $@
@@ -31,6 +27,7 @@ let
     company
     company-emoji
     company-go
+    consult
     dash
     delight
     diredfl
@@ -42,6 +39,7 @@ let
     dumb-jump
     easy-kill
     edit-indirect
+    embark
     envrc
     esh-autosuggest
     eshell-prompt-extras
@@ -73,6 +71,7 @@ let
     magit
     magit-annex
     magit-popup
+    marginalia
     markdown-mode
     minions
     modus-operandi-theme