X-Git-Url: https://git.shemshak.org/~bandali/configs/blobdiff_plain/cb0c13d0b54257e02bdb611fec6c5c3b5c77f1c3..f8e11b0e6f2d8dfe7a65d407288576f556241708:/init.org?ds=sidebyside diff --git a/init.org b/init.org index d148363..c341674 100644 --- 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,12 +870,8 @@ 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 - :after message - :hook (message-mode . orgalist-mode)) #+end_src **** asynchronous tangle @@ -868,6 +951,18 @@ Not just how I do git, but /the/ way to do git. :custom-face (magit-diff-file-heading ((t (:weight normal))))) #+end_src +*** recentf + +Recently opened files. + +#+begin_src emacs-lisp +(use-feature recentf + :defer 0.5 + :config + (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:") + (setq recentf-max-saved-items 40)) +#+end_src + *** [[https://github.com/abo-abo/swiper][Ivy]] (and friends) #+begin_quote @@ -881,7 +976,7 @@ There's no way I could top that, so I won't attempt to. #+begin_src emacs-lisp (use-package ivy - :defer 1 + :defer 0.6 :bind (:map ivy-minibuffer-map ([escape] . keyboard-escape-quit) @@ -902,6 +997,7 @@ There's no way I could top that, so I won't attempt to. #+begin_src emacs-lisp (use-package swiper + :after ivy :bind (("C-s" . swiper) ("C-r" . swiper) ("C-S-s" . isearch-forward))) @@ -911,7 +1007,7 @@ There's no way I could top that, so I won't attempt to. #+begin_src emacs-lisp (use-package counsel - :defer 1 + :after ivy :bind (([remap execute-extended-command] . counsel-M-x) ([remap find-file] . counsel-find-file) ("s-r" . counsel-recentf) @@ -927,7 +1023,7 @@ There's no way I could top that, so I won't attempt to. *** eshell #+begin_src emacs-lisp -(use-package eshell +(use-feature eshell :defer 1 :commands eshell :bind ("C-c a s e" . eshell) @@ -947,7 +1043,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) @@ -963,7 +1060,7 @@ There's no way I could top that, so I won't attempt to. *** Ibuffer #+begin_src emacs-lisp -(use-package ibuffer +(use-feature ibuffer :defer t :bind (("C-x C-b" . ibuffer-other-window) @@ -1034,7 +1131,7 @@ There's no way I could top that, so I won't attempt to. *** Outline #+begin_src emacs-lisp -(use-package outline +(use-feature outline :defer t :hook (prog-mode . outline-minor-mode) :bind @@ -1053,33 +1150,23 @@ There's no way I could top that, so I won't attempt to. ("s" . outline-show-subtree))) #+end_src -* Borg's =layer/essentials= -:PROPERTIES: -:CUSTOM_ID: borg-essentials -:END: - -TODO: break this giant source block down into individual org sections. +*** Dired #+begin_src emacs-lisp -(use-package dash - :config (dash-enable-font-lock)) - -(use-package diff-hl - :config - (setq diff-hl-draw-borders nil) - (global-diff-hl-mode) - (add-hook 'magit-post-refresh-hook 'diff-hl-magit-post-refresh t)) +(use-feature ls-lisp + :custom (ls-lisp-dirs-first t)) -(use-package dired +(use-feature 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,17 +1185,43 @@ 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)) +#+end_src + +*** =diff-hl= + +Highlight uncommitted changes in the left fringe. -(use-package eldoc +#+begin_src emacs-lisp +(use-package diff-hl + :config + (setq diff-hl-draw-borders nil) + (global-diff-hl-mode) + (add-hook 'magit-post-refresh-hook 'diff-hl-magit-post-refresh t)) +#+end_src + +*** Borg's =layer/essentials= +:PROPERTIES: +:CUSTOM_ID: borg-essentials +:END: + +TODO: break this giant source block down into individual org sections. + +#+begin_src emacs-lisp +(use-package dash + :config (dash-enable-font-lock)) + +(use-feature eldoc :when (version< "25" emacs-version) :config (global-eldoc-mode)) -(use-package help +(use-feature help :defer t :config (temp-buffer-resize-mode) @@ -1117,7 +1230,7 @@ TODO: break this giant source block down into individual org sections. (progn ; `isearch' (setq isearch-allow-scroll t)) -(use-package lisp-mode +(use-feature lisp-mode :config (add-hook 'emacs-lisp-mode-hook 'outline-minor-mode) (add-hook 'emacs-lisp-mode-hook 'reveal-mode) @@ -1125,40 +1238,27 @@ TODO: break this giant source block down into individual org sections. (setq indent-tabs-mode nil)) (add-hook 'lisp-interaction-mode-hook #'indent-spaces-mode)) -(use-package man +(use-feature man :defer t :config (setq Man-width 80)) -(use-package paren +(use-feature paren :config (show-paren-mode)) -(use-package prog-mode +(use-feature prog-mode :config (global-prettify-symbols-mode) (defun indicate-buffer-boundaries-left () (setq indicate-buffer-boundaries 'left)) (add-hook 'prog-mode-hook #'indicate-buffer-boundaries-left)) -(use-package recentf - :defer 0.5 - :config - (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:") - (setq recentf-max-saved-items 40)) - -(use-package savehist - :config (savehist-mode)) - -(use-package saveplace - :when (version< "25" emacs-version) - :config (save-place-mode)) - -(use-package simple +(use-feature simple :config (column-number-mode)) (progn ; `text-mode' (add-hook 'text-mode-hook #'indicate-buffer-boundaries-left) (add-hook 'text-mode-hook #'abbrev-mode)) -(use-package tramp +(use-feature tramp :defer t :config (add-to-list 'tramp-default-proxies-alist '(nil "\\`root\\'" "/ssh:%h:")) @@ -1173,7 +1273,26 @@ TODO: break this giant source block down into individual org sections. :CUSTOM_ID: editing :END: -** Company +** =savehist= + +Save minibuffer history. + +#+begin_src emacs-lisp +(use-feature savehist + :config (savehist-mode)) +#+end_src + +** =saveplace= + +Automatically save place in each file. + +#+begin_src emacs-lisp +(use-feature saveplace + :when (version< "25" emacs-version) + :config (save-place-mode)) +#+end_src + +** COMMENT Company #+begin_src emacs-lisp (use-package company @@ -1192,7 +1311,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 +1358,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 +1730,7 @@ treemacs :load-path "lib/guix/elisp") #+end_src -* Emacs enhancements +* COMMENT Emacs enhancements :PROPERTIES: :CUSTOM_ID: emacs-enhancements :END: @@ -1625,7 +1744,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 @@ -1783,6 +1946,14 @@ Make =*scratch*= and =*Messages*= unkillable. Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. +** orgalist + +#+begin_src emacs-lisp +(use-package orgalist + :after message + :hook (message-mode . orgalist-mode)) +#+end_src + ** typo.el #+begin_src emacs-lisp @@ -1845,8 +2016,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 +2061,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-" . 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 +2095,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 +2362,7 @@ Convenient footnotes in =message-mode=. (gnus-harvest-install))) #+end_src -* Blogging +* COMMENT Blogging :PROPERTIES: :CUSTOM_ID: blogging :END: @@ -2219,6 +2401,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: