X-Git-Url: https://git.shemshak.org/~bandali/configs/blobdiff_plain/957c8db6ad44f3f91163e5e65ebe66661bbe1cbc..9502dced4eaf80a57484abd409afd4d600423a3c:/init.org?ds=inline diff --git a/init.org b/init.org index 5dacc59..cfbeea8 100644 --- 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 @@ -761,7 +795,8 @@ Not just how I do git, but /the/ way to do git. (magit-add-section-hook 'magit-status-sections-hook 'magit-insert-modules 'magit-insert-stashes - 'append)) + 'append) + :custom-face (magit-diff-file-heading ((t (:weight normal))))) #+end_src *** [[https://github.com/abo-abo/swiper][Ivy]] (and friends) @@ -787,7 +822,11 @@ There's no way I could top that, so I won't attempt to. ("DEL" . ivy-backward-delete-char)) :config (setq ivy-wrap t) - (ivy-mode 1)) + (ivy-mode 1) + :custom-face + (ivy-minibuffer-match-face-2 ((t (:background "#e99ce8" :weight semi-bold)))) + (ivy-minibuffer-match-face-3 ((t (:background "#bbbbff" :weight semi-bold)))) + (ivy-minibuffer-match-face-4 ((t (:background "#ffbbff" :weight semi-bold))))) #+end_src **** Swiper @@ -843,6 +882,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" (mode . org-mode)) + ("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 + ("" . 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 +1015,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 +1064,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 +1291,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]] @@ -1190,17 +1364,10 @@ Emacs package that displays available keybindings in popup :hook (after-init . doom-modeline-init)) #+end_src -** [[https://github.com/11111000000/tao-theme-emacs][tao-theme]] - -#+begin_src emacs-lisp :tangle no -(use-package tao-theme - :demand t - :config (load-theme 'tao-yang t)) -#+end_src - ** [[https://github.com/maio/eink-emacs][eink-theme]] #+begin_src emacs-lisp +(setq doom-modeline-bar-width 5) (load-theme 'eink t) #+end_src @@ -1249,25 +1416,6 @@ Emacs package that displays available keybindings in popup :after #'my-projectile-invalidate-cache)))) #+end_src -** [[https://github.com/wasamasa/shackle][shackle]] - -#+begin_src emacs-lisp -(use-package shackle - :demand t - :commands shackle-mode - :config - (shackle-mode 1) - (setq shackle-rules - '(("*Help*" :align right :select t :size 0.5) - ("\\`\\*helm.*?\\*\\'" :regexp t :align t) - ((compilation-mode "\\`\\*magit-diff: .*?\\'") :regexp t :noselect t) - ("*magit-dispatch-popup*" :align below) - ((inferior-scheme-mode "*shell*" "*eshell*") :popup t)) - shackle-default-rule '(:select t) - shackle-default-size 0.4 - shackle-inhibit-window-quit-on-same-windows t)) -#+end_src - ** [[https://github.com/Wilfred/helpful][helpful]] #+begin_src emacs-lisp @@ -1285,8 +1433,6 @@ Emacs package that displays available keybindings in popup #+begin_src emacs-lisp (use-package shell-pop - :config - (add-to-list 'shackle-rules '("\\*eshell\\*" :regexp t :same t)) :custom (shell-pop-universal-key "C-c e") (shell-pop-shell-type '("eshell" "*eshell*" (lambda nil (eshell))))) @@ -1341,51 +1487,72 @@ 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) - ) + :custom-face + (message-header-subject ((t (:foreground "navy blue" :weight semi-bold)))) + (message-header-to ((t (:foreground "MidnightBlue" :weight semi-bold))))) (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) @@ -1394,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 @@ -1409,9 +1576,10 @@ See [[notmuch:id:87muuqsvci.fsf@fencepost.gnu.org][bug follow-up]]. notmuch-hello-thousands-separator "," notmuch-fcc-dirs '(("amin@aminb.org" . "amin/Sent") - ("amin@gnu.org" . "gnu/Sent") + ("bandali@gnu.org" . "gnu/Sent") ("abandali@uwaterloo.ca" . "\"uwaterloo/Sent Items\"") ("mab@gnu.org" . "gnu/Sent") + ("amin@gnu.org" . "gnu/Sent") ("aminb@gnu.org" . "gnu/Sent") (".*" . "sent")) notmuch-search-result-format @@ -1436,6 +1604,7 @@ See [[notmuch:id:87muuqsvci.fsf@fencepost.gnu.org][bug follow-up]]. ;; (set! :evil-state 'notmuch-message-mode 'insert) ;; (advice-add #'notmuch-bury-or-kill-this-buffer ;; :override #'kill-this-buffer) + :hook (notmuch-message-mode . doom-modeline-set-special-modeline) :bind (:map notmuch-hello-mode-map ("u" . (lambda () @@ -1497,16 +1666,16 @@ See [[notmuch:id:87muuqsvci.fsf@fencepost.gnu.org][bug follow-up]]. "Mark message as spam" (interactive) (notmuch-tree-tag '("-unread" "-inbox" "-webmasters" "+spam")) - (notmuch-tree-next-message))))) + (notmuch-tree-next-message)))) + :custom-face + (notmuch-search-unread-face ((t (:weight semi-bold)))) + (notmuch-tag-face ((t (:foreground "navy blue" :weight semi-bold))))) (use-package counsel-notmuch :bind ("C-c s m" . counsel-notmuch)) (after! notmuch-crypto (setq notmuch-crypto-process-mime t)) - -(after! recentf - (add-to-list 'recentf-exclude (expand-file-name amin-maildir))) #+end_src ** supercite @@ -1566,6 +1735,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