[emacs][wip] define use-feature for use-package without straight.el
[~bandali/configs] / init.org
index d148363..6f38d73 100644 (file)
--- a/init.org
+++ b/init.org
@@ -184,9 +184,9 @@ but for now I've decided to keep them enabled. See documentation for
 
 *** No =package.el=
 
-I can do all my package management things with Borg, and don't need
-Emacs' built-in =package.el=. Emacs 27 lets us disable =package.el= in
-the =early-init-file= (see [[https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=24acb31c04b4048b85311d794e600ecd7ce60d3b][here]]).
+I can do all my package management things with =straight.el=, and
+don't need Emacs' built-in =package.el=.  Emacs 27 lets us disable
+=package.el= in the =early-init-file= (see [[https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=24acb31c04b4048b85311d794e600ecd7ce60d3b][here]]).
 
 #+begin_src emacs-lisp :tangle early-init.el
 (setq package-enable-at-startup nil)
@@ -197,12 +197,56 @@ right now), and even when released it'll be long before most distros
 ship in their repos, I'll still put the old workaround with the
 commented call to ~package-initialize~ here anyway.
 
-#+begin_src emacs-lisp
+#+begin_src emacs-lisp :tangle no
 (setq package-enable-at-startup nil)
 ;; (package-initialize)
 #+end_src
 
-*** Borg
+Update: the above is not necessary, since =straight.el= automatically
+does that (and more).  See =straight-package-neutering-mode=.
+
+*** =straight.el=
+
+#+begin_quote
+Next-generation, purely functional package manager for the Emacs
+hacker.
+#+end_quote
+
+=straight.el= allows me to have a fully reproducible Emacs setup.
+
+#+begin_src emacs-lisp
+(setq straight-repository-branch "develop")
+
+(defvar bootstrap-version)
+(let ((bootstrap-file
+       (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
+      (bootstrap-version 5))
+  (unless (file-exists-p bootstrap-file)
+    (with-current-buffer
+        (url-retrieve-synchronously
+         "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
+         'silent 'inhibit-cookies)
+      (goto-char (point-max))
+      (eval-print-last-sexp)))
+  (load bootstrap-file nil 'nomessage))
+
+(setq straight-use-package-by-default t)
+#+end_src
+
+Since we enable =straight.el='s =straight-use-package-by-default=
+integration, we will define a =use-feature= for plain ole
+=use-package= without any of the =straight.el= stuff.
+
+#+begin_src emacs-lisp
+(defmacro use-feature (name &rest args)
+  "Like `use-package', but with `straight-use-package-by-default' disabled."
+  (declare (indent defun))
+  `(use-package ,name
+     :straight nil
+,@args))
+#+end_src
+
+*** COMMENT Borg
 
 #+begin_quote
 Assimilate Emacs packages as Git submodules
@@ -244,7 +288,7 @@ packages (in our case especially the latter) in a neatly organized way
 and without compromising on performance.
 
 #+begin_src emacs-lisp
-(require 'use-package)
+(straight-use-package 'use-package)
 (if nil  ; set to t when need to debug init
     (setq use-package-verbose t
           use-package-expand-minimally nil
@@ -254,7 +298,7 @@ and without compromising on performance.
         use-package-expand-minimally t))
 #+end_src
 
-*** Epkg
+*** COMMENT Epkg
 
 #+begin_quote
 Browse the Emacsmirror package database
@@ -306,7 +350,7 @@ definitely don't want it mixing with =init.el=. So, here; let's give
 it it's own file. While at it, treat themes as safe.
 
 #+begin_src emacs-lisp
-(use-package custom
+(use-feature custom
   :no-require t
   :config
   (setq custom-file (no-littering-expand-etc-file-name "custom.el"))
@@ -360,7 +404,7 @@ login; so starting the server from inside Emacs is good enough for me.
 See [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.html#Emacs-Server][Using Emacs as a Server]].
 
 #+begin_src emacs-lisp
-(use-package server
+(use-feature server
   :defer 1
   :config (or (server-running-p) (server-mode)))
 #+end_src
@@ -724,7 +768,7 @@ customizing it.
             'auto-compile-inhibit-compile-detached-git-head))
 #+end_src
 
-*** [[https://orgmode.org/][Org mode]]
+*** [[https://orgmode.org/][Org]]
 
 #+begin_quote
 Org mode is for keeping notes, maintaining TODO lists, planning
@@ -734,9 +778,52 @@ system.
 
 In short, my favourite way of life.
 
+First, we have to resort to a [[https://github.com/raxod502/straight.el#installing-org-with-straightel][hack]] to be able to use the correct
+latest version of Org from upstream.
+
 #+begin_src emacs-lisp
-(use-package org
-  :defer 1
+  (use-package git)
+
+  (defun org-git-version ()
+    "The Git version of org-mode.
+  Inserted by installing org-mode or when a release is made."
+    (require 'git)
+    (let ((git-repo (expand-file-name
+                     "straight/repos/org/" user-emacs-directory)))
+      (string-trim
+       (git-run "describe"
+                "--match=release\*"
+                "--abbrev=6"
+                "HEAD"))))
+
+  (defun org-release ()
+    "The release version of org-mode.
+  Inserted by installing org-mode or when a release is made."
+    (require 'git)
+    (let ((git-repo (expand-file-name
+                     "straight/repos/org/" user-emacs-directory)))
+      (string-trim
+       (string-remove-prefix
+        "release_"
+        (git-run "describe"
+                 "--match=release\*"
+                 "--abbrev=0"
+                 "HEAD")))))
+
+(provide 'org-version)
+#+end_src
+
+We will use the =org-plus-contrib= package to get the whole deal:
+
+#+begin_src emacs-lisp
+(straight-use-package 'org-plus-contrib)
+#+end_src
+
+And here's where my actual Org configurations begin:
+
+#+begin_src emacs-lisp
+(use-feature org
+  :defer 0.5
   :config
   (setq org-src-tab-acts-natively t
         org-src-preserve-indentation nil
@@ -766,7 +853,7 @@ In short, my favourite way of life.
   '(org-block ((t (:background "#1d1f21"))))
   '(org-latex-and-related ((t (:foreground "#b294bb")))))
 
-(use-package ox-latex
+(use-feature ox-latex
   :after ox
   :config
   (setq org-latex-listings 'listings
@@ -783,7 +870,7 @@ In short, my favourite way of life.
                  ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
                t))
 
-(use-package ox-beamer
+(use-feature ox-beamer
   :after ox)
 
 (use-package orgalist
@@ -868,7 +955,7 @@ Not just how I do git, but /the/ way to do git.
   :custom-face (magit-diff-file-heading ((t (:weight normal)))))
 #+end_src
 
-*** [[https://github.com/abo-abo/swiper][Ivy]] (and friends)
+*** COMMENT [[https://github.com/abo-abo/swiper][Ivy]] (and friends)
 
 #+begin_quote
 Ivy - a generic completion frontend for Emacs, Swiper - isearch with
@@ -924,7 +1011,7 @@ There's no way I could top that, so I won't attempt to.
   (defalias 'locate #'counsel-locate))
 #+end_src
 
-*** eshell
+*** COMMENT eshell
 
 #+begin_src emacs-lisp
 (use-package eshell
@@ -947,7 +1034,8 @@ There's no way I could top that, so I won't attempt to.
 
   (defun a/eshell-setup ()
     (make-local-variable 'company-idle-delay)
-    (defvar company-idle-delay nil)
+    (defvar company-idle-delay)
+    (setq company-idle-delay nil)
     (bind-keys :map eshell-mode-map
                ("C-d"   . a/eshell-quit-or-delete-char)
                ("C-S-l" . a/eshell-clear)
@@ -960,7 +1048,7 @@ There's no way I could top that, so I won't attempt to.
   (eshell-input-filter 'eshell-input-filter-initial-space))
 #+end_src
 
-*** Ibuffer
+*** COMMENT Ibuffer
 
 #+begin_src emacs-lisp
 (use-package ibuffer
@@ -1031,7 +1119,7 @@ There's no way I could top that, so I won't attempt to.
   :hook (ibuffer . (lambda () (ibuffer-switch-to-saved-filter-groups "default"))))
 #+end_src
 
-*** Outline
+*** COMMENT Outline
 
 #+begin_src emacs-lisp
 (use-package outline
@@ -1053,7 +1141,7 @@ There's no way I could top that, so I won't attempt to.
    ("s"   . outline-show-subtree)))
 #+end_src
 
-* Borg's =layer/essentials=
+* COMMENT Borg's =layer/essentials=
 :PROPERTIES:
 :CUSTOM_ID: borg-essentials
 :END:
@@ -1070,16 +1158,20 @@ TODO: break this giant source block down into individual org sections.
   (global-diff-hl-mode)
   (add-hook 'magit-post-refresh-hook 'diff-hl-magit-post-refresh t))
 
+(use-package ls-lisp
+  :custom (ls-lisp-dirs-first t))
+
 (use-package dired
   :defer t
   :config
-  (setq dired-listing-switches "-alh")
+  (setq dired-listing-switches "-alh"
+        ls-lisp-use-insert-directory-program nil)
 
   ;; easily diff 2 marked files
   ;; https://oremacs.com/2017/03/18/dired-ediff/
   (defun dired-ediff-files ()
     (interactive)
-    (require 'ediff)
+    (defvar ediff-after-quit-hook-internal)
     (let ((files (dired-get-marked-files))
           (wnd (current-window-configuration)))
       (if (<= (length files) 2)
@@ -1098,11 +1190,13 @@ TODO: break this giant source block down into individual org sections.
                         (set-window-configuration wnd))))
         (error "no more than 2 files should be marked"))))
   :bind (:map dired-mode-map
-              ("e" . dired-ediff-files)
-              ("E" . dired-toggle-read-only)
-              ("z" . (lambda ()
-                       (interactive)
-                       (a/dired-start-process "zathura")))))
+              ("e"  . dired-ediff-files)
+              ("E"  . dired-toggle-read-only)
+              ("\\" . dired-hide-details-mode)
+              ("z"  . (lambda ()
+                        (interactive)
+                        (a/dired-start-process "zathura"))))
+  :hook (dired-mode . dired-hide-details-mode))
 
 (use-package eldoc
   :when (version< "25" emacs-version)
@@ -1168,7 +1262,7 @@ TODO: break this giant source block down into individual org sections.
 
 #+end_src
 
-* Editing
+* COMMENT Editing
 :PROPERTIES:
 :CUSTOM_ID: editing
 :END:
@@ -1192,7 +1286,7 @@ TODO: break this giant source block down into individual org sections.
   (global-company-mode t))
 #+end_src
 
-* Syntax and spell checking
+* COMMENT Syntax and spell checking
 :PROPERTIES:
 :CUSTOM_ID: syntax-spell-checking
 :END:
@@ -1239,7 +1333,7 @@ TODO: break this giant source block down into individual org sections.
               #'endless/replace-quote))
 #+end_src
 
-* Programming modes
+* COMMENT Programming modes
 :PROPERTIES:
 :CUSTOM_ID: programming-modes
 :END:
@@ -1611,7 +1705,7 @@ treemacs
   :load-path "lib/guix/elisp")
 #+end_src
 
-* Emacs enhancements
+* COMMENT Emacs enhancements
 :PROPERTIES:
 :CUSTOM_ID: emacs-enhancements
 :END:
@@ -1625,7 +1719,51 @@ Emacs package that displays available keybindings in popup
 #+begin_src emacs-lisp
 (use-package which-key
   :defer 1
-  :config (which-key-mode))
+  :config
+  (which-key-add-key-based-replacements
+    ;; prefixes for global prefixes and minor modes
+    "C-c @"   "outline"
+    "C-c !"   "flycheck"
+    "C-c 8"   "typo"
+    "C-c 8 -" "typo/dashes"
+    "C-c 8 <" "typo/left-brackets"
+    "C-c 8 >" "typo/right-brackets"
+    "C-x 8"   "unicode"
+    "C-x a"   "abbrev/expand"
+    "C-x r"   "rectangle/register/bookmark"
+    "C-x v"   "version control"
+    ;; prefixes for my personal bindings
+    "C-c a"   "applications"
+    "C-c a s" "shells"
+    "C-c b"   "borg"
+    "C-c c"   "compile-and-comments"
+    "C-c e"   "eval"
+    "C-c f"   "files"
+    "C-c F"   "frames"
+    "C-S-h"   "help(ful)"
+    "C-c m"   "multiple-cursors"
+    "C-c p"   "projectile"
+    "C-c p s" "projectile/search"
+    "C-c p x" "projectile/execute"
+    "C-c p 4" "projectile/other-window"
+    "C-c q"   "boxquote"
+    "s-g"     "magit"
+    "s-o"     "outline"
+    "s-t"     "themes")
+
+  ;; prefixes for major modes
+  (which-key-add-major-mode-key-based-replacements 'message-mode
+    "C-c f"   "footnote")
+  (which-key-add-major-mode-key-based-replacements 'org-mode
+    "C-c C-v" "org-babel")
+  (which-key-add-major-mode-key-based-replacements 'web-mode
+    "C-c C-a" "web/attributes"
+    "C-c C-b" "web/blocks"
+    "C-c C-d" "web/dom"
+    "C-c C-e" "web/element"
+    "C-c C-t" "web/tags")
+
+  (which-key-mode))
 #+end_src
 
 ** theme
@@ -1845,8 +1983,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 #+begin_src emacs-lisp
 (use-package multi-term
   :defer 1
-  :bind (("C-c a s m m" . multi-term)
-         ("C-c a s m p" . multi-term-dedicated-toggle)
+  :bind (("C-c a s m" . multi-term-dedicated-toggle)
          :map term-mode-map
          ("C-c C-j" . term-char-mode)
          :map term-raw-map
@@ -1891,7 +2028,21 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
   :bind ("C-=" . er/expand-region))
 #+end_src
 
-* Email
+** multiple-cursors
+
+#+begin_src emacs-lisp
+(use-package multiple-cursors
+  :bind
+  (("C-S-<mouse-1>" . mc/add-cursor-on-click)
+   (:prefix-map a/mc-prefix-map
+               :prefix "C-c m"
+               ("c" . mc/edit-lines)
+               ("n" . mc/mark-next-like-this)
+               ("p" . mc/mark-previous-like-this)
+               ("a" . mc/mark-all-like-this))))
+#+end_src
+
+* COMMENT Email
 :PROPERTIES:
 :CUSTOM_ID: email
 :END:
@@ -1911,9 +2062,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
  read-mail-command 'gnus)
 
 (use-package gnus
-  :bind (("C-c m" . gnus)
-         ("C-c M" . gnus-unplugged)
-         ("s-m"   . gnus)
+  :bind (("s-m"   . gnus)
          ("s-M"   . gnus-unplugged))
   :init
   (setq
@@ -2180,7 +2329,7 @@ Convenient footnotes in =message-mode=.
     (gnus-harvest-install)))
 #+end_src
 
-* Blogging
+* COMMENT Blogging
 :PROPERTIES:
 :CUSTOM_ID: blogging
 :END:
@@ -2219,6 +2368,6 @@ Display how long it took to load the init file.
 
 * COMMENT Local Variables                                           :ARCHIVE:
 # Local Variables:
-# eval: (add-hook 'after-save-hook #'a/async-babel-tangle 'append 'local)
+# eval: ;; (add-hook 'after-save-hook #'a/async-babel-tangle 'append 'local)
 # eval: (typo-mode -1)
 # End: