[rc] update my gnu address once more
[~bandali/configs] / init.org
index 9cb58ac..d54b9af 100644 (file)
--- a/init.org
+++ b/init.org
@@ -234,8 +234,8 @@ can then be managed with the help of Magit or other tools.
 (require 'borg)
 (borg-initialize)
 
-(require 'borg-nix-shell)
-(setq borg-build-shell-command 'borg-nix-shell-build-command)
+;; (require 'borg-nix-shell)
+;; (setq borg-build-shell-command 'borg-nix-shell-build-command)
 
 (with-eval-after-load 'bind-key
   (bind-keys
@@ -369,12 +369,12 @@ See [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.htm
 Font stack with better unicode support, around =Ubuntu Mono= and
 =Hack=.
 
-#+begin_src emacs-lisp
+#+begin_src emacs-lisp :tangle no
 (dolist (ft (fontset-list))
   (set-fontset-font
    ft
    'unicode
-   (font-spec :name "Ubuntu Mono"))
+   (font-spec :name "Source Code Pro" :size 14))
   (set-fontset-font
    ft
    'unicode
@@ -402,6 +402,12 @@ Font stack with better unicode support, around =Ubuntu Mono= and
    'prepend))
 #+end_src
 
+** Gentler font resizing
+
+#+begin_src emacs-lisp
+(setq text-scale-mode-step 1.05)
+#+end_src
+
 ** Libraries
 
 #+begin_src emacs-lisp
@@ -444,6 +450,15 @@ compilation."
                `(after! (:all ,@features) ,@body)))))
 #+end_src
 
+Convenience macro for =setq='ing multiple variables to the same value:
+
+#+begin_src emacs-lisp
+(defmacro setq-every! (value &rest vars)
+  "Set all the variables from VARS to value VALUE."
+  (declare (indent defun) (debug t))
+  `(progn ,@(mapcar (lambda (x) (list 'setq x value)) vars)))
+#+end_src
+
 * Core
 :PROPERTIES:
 :CUSTOM_ID: core
@@ -626,8 +641,8 @@ Enable =winner-mode=.
 
 #+begin_src emacs-lisp
 (bind-keys
- ("C-c b B" . ibuffer-list-buffers)
  ("C-c b k" . kill-this-buffer)
+ ("C-c s s" . save-buffer)
  ("C-c b s" . save-buffer)
  ("C-c S"   . save-buffer)
  ("C-c o"   . other-window)
@@ -673,11 +688,30 @@ In short, my favourite way of life.
   :config
   (setq org-src-tab-acts-natively t
         org-src-preserve-indentation nil
-        org-edit-src-content-indentation 0)
-  :hook (org-mode . org-indent-mode))
+        org-edit-src-content-indentation 0
+        org-log-done 'time)
+  :hook (org-mode . org-indent-mode)
+  :custom
+  (org-latex-packages-alist '(("" "listings") ("" "color"))))
+
+(use-package ox-latex
+  :config
+  (setq org-latex-listings 'listings)
+  (add-to-list 'org-latex-packages-alist '("" "listings"))
+  (add-to-list 'org-latex-packages-alist '("" "color"))
+  (add-to-list 'org-latex-classes
+               '("IEEEtran" "\\documentclass[11pt]{IEEEtran}"
+                 ("\\section{%s}" . "\\section*{%s}")
+                 ("\\subsection{%s}" . "\\subsection*{%s}")
+                 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
+                 ("\\paragraph{%s}" . "\\paragraph*{%s}")
+                 ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
+               t))
 
 (use-package org-notmuch
   :after (:any org notmuch))
+
+(use-package orgalist)
 #+end_src
 
 **** asynchronous tangle
@@ -843,6 +877,87 @@ There's no way I could top that, so I won't attempt to.
   :hook (eshell-mode . amin|eshell-setup))
 #+end_src
 
+*** Ibuffer
+
+#+begin_src emacs-lisp
+(use-package ibuffer
+  :bind
+  (("C-x C-b" . ibuffer-other-window)
+   ("C-c b B" . ibuffer-other-window)
+   :map ibuffer-mode-map
+   ("P"   . ibuffer-backward-filter-group)
+   ("N"   . ibuffer-forward-filter-group)
+   ("M-p" . ibuffer-do-print)
+   ("M-n" . ibuffer-do-shell-command-pipe-replace))
+  :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) 100000) (format "%7.0fk" (/ (buffer-size) 1000.0)))
+     ((> (buffer-size) 1000) (format "%7.1fk" (/ (buffer-size) 1000.0)))
+     (t (format "%8d" (buffer-size)))))
+  :custom
+  (ibuffer-saved-filter-groups
+   '(("default"
+      ("dired" (mode . dired-mode))
+      ("org"   (name . "^.*org$"))
+      ("web"
+       (or
+        (mode . web-mode)
+        (mode . css-mode)
+        (mode . scss-mode)
+        (mode . js2-mode)))
+      ("shell"
+       (or
+        (mode . eshell-mode)
+        (mode . shell-mode)))
+      ("notmuch" (name . "\*notmuch\*"))
+      ("programming"
+       (or
+        (mode . python-mode)
+        (mode . c++-mode)
+        (mode . emacs-lisp-mode)))
+      ("emacs"
+       (or
+        (name . "^\\*scratch\\*$")
+        (name . "^\\*Messages\\*$"))))))
+  (ibuffer-formats
+   '((mark modified read-only locked " "
+           (name 18 18 :left :elide)
+           " "
+           (size-h 9 -1 :right)
+           " "
+           (mode 16 16 :left :elide)
+           " " filename-and-process)
+     (mark " "
+           (name 16 -1)
+           " " filename)))
+  :hook (ibuffer . (lambda () (ibuffer-switch-to-saved-filter-groups "default"))))
+#+end_src
+
+*** Outline
+
+#+begin_src emacs-lisp
+(use-package outline
+  :hook (prog-mode . outline-minor-mode)
+  :bind
+  (:map
+   outline-minor-mode-map
+   ("<s-tab>"  . outline-toggle-children)
+   ("s-p"      . outline-previous-visible-heading)
+   ("s-n"      . outline-next-visible-heading)
+   :prefix-map amin--outline-prefix-map
+   :prefix "s-o"
+   ("TAB" . outline-toggle-children)
+   ("a"   . outline-hide-body)
+   ("H"   . outline-hide-body)
+   ("S"   . outline-show-all)
+   ("h"   . outline-hide-subtree)
+   ("s"   . outline-show-subtree)))
+#+end_src
+
 * Borg's =layer/essentials=
 
 TODO: break this giant source block down into individual org sections.
@@ -895,7 +1010,9 @@ TODO: break this giant source block down into individual org sections.
 
 (use-package recentf
   :demand t
-  :config (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:"))
+  :config
+  (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:")
+  (setq recentf-max-saved-items 40))
 
 (use-package savehist
   :config (savehist-mode))
@@ -942,6 +1059,8 @@ TODO: break this giant source block down into individual org sections.
   (company-minimum-prefix-length 1)
   (company-selection-wrap-around t)
   (company-dabbrev-char-regexp "\\sw\\|\\s_\\|[-_]")
+  (company-dabbrev-downcase nil)
+  (company-dabbrev-ignore-case nil)
   :config
   (global-company-mode t))
 #+end_src
@@ -1167,6 +1286,56 @@ instead.
   :bind (:map haskell-mode-map
               ("C-c l l" . hs-lint)))
 #+end_src
+
+** Web dev
+
+*** SGML and HTML
+
+#+begin_src emacs-lisp
+(use-package sgml-mode
+  :config
+  (setq sgml-basic-offset 2))
+#+end_src
+
+*** CSS and SCSS
+
+#+begin_src emacs-lisp
+(use-package css-mode
+  :config
+  (setq css-indent-offset 2))
+#+end_src
+
+*** Web mode
+
+#+begin_src emacs-lisp
+(use-package web-mode
+  :mode "\\.html\\'"
+  :config
+  (setq-every! 2
+    web-mode-code-indent-offset
+    web-mode-css-indent-offset
+    web-mode-markup-indent-offset))
+#+end_src
+
+*** Emmet mode
+
+#+begin_src emacs-lisp
+(use-package emmet-mode
+  :bind* (("C-)" . emmet-next-edit-point)
+          ("C-(" . emmet-prev-edit-point))
+  :config
+  (unbind-key "C-j" emmet-mode-keymap)
+  (setq emmet-move-cursor-between-quotes t)
+  :hook (web-mode css-mode html-mode sgml-mode))
+#+end_src
+
+** Nix
+
+#+begin_src emacs-lisp
+(use-package nix-mode
+  :mode "\\.nix\\'")
+#+end_src
+
 * Emacs Enhancements
 
 ** [[https://github.com/justbur/emacs-which-key][which-key]]
@@ -1320,43 +1489,56 @@ Make =*scratch*= and =*Messages*= unkillable.
 
 Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 
-* Email
-** [[https://notmuchmail.org][notmuch]]
+** [[https://github.com/DarthFennec/highlight-indent-guides][highlight-indent-guides]]
 
-See [[notmuch:id:87muuqsvci.fsf@fencepost.gnu.org][bug follow-up]].
+#+begin_src emacs-lisp
+(use-package highlight-indent-guides
+  :demand t
+  :hook ((prog-mode . highlight-indent-guides-mode)
+         (org-mode  . highlight-indent-guides-mode))
+  :config
+  (setq highlight-indent-guides-character ?\|)
+  (setq highlight-indent-guides-auto-enabled nil)
+  (setq highlight-indent-guides-method 'character)
+  (setq highlight-indent-guides-responsive 'top)
+  (set-face-foreground 'highlight-indent-guides-character-face "gainsboro")
+  (set-face-foreground 'highlight-indent-guides-top-character-face "grey40")) ; grey13 is nice too
+#+end_src
+
+* Email
 
 #+begin_src emacs-lisp
-(defvar amin-maildir "~/mail")
+(defvar amin-maildir (expand-file-name "~/mail/"))
+(after! recentf
+  (add-to-list 'recentf-exclude amin-maildir))
+#+end_src
+
+** sendmail
 
+#+begin_src emacs-lisp
 (use-package sendmail
-  ;; :ensure nil
   :config
   (setq sendmail-program "/usr/bin/msmtp"
-        ; message-sendmail-extra-arguments '("-v" "-d")
+        ;; message-sendmail-extra-arguments '("-v" "-d")
         mail-specify-envelope-from t
         mail-envelope-from 'header))
+#+end_src
 
+** message
+
+#+begin_src emacs-lisp
 (use-package message
-  ;; :ensure nil
   :config
   (setq message-kill-buffer-on-exit t
         message-send-mail-function 'message-send-mail-with-sendmail
         message-sendmail-envelope-from 'header
-        message-directory "drafts"
+        ;; message-directory "drafts"
         message-user-fqdn "aminb.org")
   (add-hook 'message-mode-hook
             (lambda () (setq fill-column 65
                         message-fill-column 65)))
   (add-hook 'message-mode-hook
             #'flyspell-mode)
-  ;; (add-hook 'notmuch-message-mode-hook #'+doom-modeline|set-special-modeline)
-  ;; TODO: is there a way to only run this when replying and not composing?
-  ;; (add-hook 'notmuch-message-mode-hook
-  ;;           (lambda () (progn
-  ;;                   (newline)
-  ;;                   (newline)
-  ;;                   (forward-line -1)
-  ;;                   (forward-line -1))))
   ;; (add-hook 'message-setup-hook
   ;;           #'mml-secure-message-sign-pgpmime)
   )
@@ -1364,7 +1546,13 @@ See [[notmuch:id:87muuqsvci.fsf@fencepost.gnu.org][bug follow-up]].
 (after! mml-sec
   (setq mml-secure-openpgp-encrypt-to-self t
         mml-secure-openpgp-sign-with-sender t))
+#+end_src
+
+** [[https://notmuchmail.org][notmuch]]
+
+See [[notmuch:id:87muuqsvci.fsf@fencepost.gnu.org][bug follow-up]].
 
+#+begin_src emacs-lisp
 (defun amin/notmuch ()
   "Delete other windows, then launch `notmuch'."
   (interactive)
@@ -1373,7 +1561,7 @@ See [[notmuch:id:87muuqsvci.fsf@fencepost.gnu.org][bug follow-up]].
 
 (use-package notmuch
   :commands notmuch
-  :bind ("C-c m" . amin/notmuch)
+  :bind ("C-c n" . amin/notmuch)
   :custom (notmuch-always-prompt-for-sender t)
   :config
   (setq notmuch-hello-sections
@@ -1483,9 +1671,6 @@ See [[notmuch:id:87muuqsvci.fsf@fencepost.gnu.org][bug follow-up]].
 
 (after! notmuch-crypto
   (setq notmuch-crypto-process-mime t))
-
-(after! recentf
-  (add-to-list 'recentf-exclude (expand-file-name amin-maildir)))
 #+end_src
 
 ** supercite
@@ -1545,6 +1730,9 @@ nil))
 #+begin_src emacs-lisp
 (use-package ox-hugo
   :after ox)
+
+(use-package ox-hugo-auto-export
+  :load-path "lib/ox-hugo")
 #+end_src
 
 * Post initialization