X-Git-Url: https://git.shemshak.org/~bandali/configs/blobdiff_plain/d568ebac45604213e874b6b653377f91dd58eafe..b1c000ddf5477b97116f151a5a0c79f8969215a0:/init.org?ds=inline diff --git a/init.org b/init.org index 3508f2d..800af12 100644 --- a/init.org +++ b/init.org @@ -41,11 +41,10 @@ then bootstrap Borg, tell Borg to retrieve package submodules, and byte-compiled the packages. Something along these lines should work: #+begin_src sh :tangle no -git clone https://github.com/aminb/dotfiles ~/.emacs.d +git clone https://git.sr.ht/~bandali/dotfiles ~/.emacs.d cd ~/.emacs.d make bootstrap-borg make bootstrap -make build #+end_src * Contents :toc_1:noexport: @@ -217,8 +216,11 @@ can then be managed with the help of Magit or other tools. user-emacs-directory (file-name-directory user-init-file)) (add-to-list 'load-path (expand-file-name "lib/borg" user-emacs-directory)) +;; Main engine start... (require 'borg) +;; Solid rocket booster ignition... (borg-initialize) +;; We have lift off! ;; (require 'borg-nix-shell) ;; (setq borg-build-shell-command 'borg-nix-shell-build-command) @@ -252,6 +254,8 @@ and without compromising on performance. debug-on-error t) (setq use-package-verbose nil use-package-expand-minimally t)) + +(setq use-package-always-defer t) #+end_src *** Epkg @@ -266,12 +270,12 @@ database, low-level functions for querying the database, and a #+begin_src emacs-lisp (use-package epkg - :defer t :bind (("C-c b d" . epkg-describe-package) ("C-c b p" . epkg-list-packages) ("C-c b u" . epkg-update)) :config + (eval-when-compile (defvar ivy-initial-inputs-alist)) (with-eval-after-load 'ivy (add-to-list 'ivy-initial-inputs-alist '(epkg-describe-package . "^") t))) @@ -444,6 +448,26 @@ Convenience macro for =setq='ing multiple variables to the same value: `(progn ,@(mapcar (lambda (x) (list 'setq x value)) vars))) #+end_src +The following process-related stuff from [[https://github.com/alezost/emacs-config][alezost's emacs-config]]. + +#+begin_src emacs-lisp +(defun a/start-process (program &rest args) + "Same as `start-process', but doesn't bother about name and buffer." + (let ((process-name (concat program "_process")) + (buffer-name (generate-new-buffer-name + (concat program "_output")))) + (apply #'start-process + process-name buffer-name program args))) + +(defun a/dired-start-process (program &optional args) + "Open current file with a PROGRAM." + ;; Shell command looks like this: "program [ARGS]... FILE" (ARGS can + ;; be nil, so remove it). + (apply #'a/start-process + program + (remove nil (list args (dired-get-file-for-visit))))) +#+end_src + * Core :PROPERTIES: :CUSTOM_ID: core @@ -653,6 +677,12 @@ for this. (setq-default cursor-type 'bar) #+end_src +*** Allow scrolling in Isearch + +#+begin_src emacs-lisp +(setq isearch-allow-scroll t) +#+end_src + ** Bindings #+begin_src emacs-lisp @@ -703,7 +733,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 @@ -727,13 +757,6 @@ In short, my favourite way of life. org-catch-invisible-edits 'show-and-error org-log-done 'time) (add-to-list 'org-structure-template-alist '("L" . "src emacs-lisp") t) - (font-lock-add-keywords - 'org-mode - '(("[ \t]*\\(#\\+\\(BEGIN\\|END\\|begin\\|end\\)_\\(\\S-+\\)\\)[ \t]*\\([^\n:]*\\)" - (1 '(:foreground "#5a5b5a" :background "#292b2b") t) ; directive - (3 '(:foreground "#81a2be" :background "#292b2b") t) ; kind - (4 '(:foreground "#c5c8c6") t))) ; title - t) :bind (:map org-mode-map ("M-L" . org-insert-last-stored-link)) :hook ((org-mode . org-indent-mode) (org-mode . auto-fill-mode) @@ -751,23 +774,15 @@ In short, my favourite way of life. (setq org-latex-listings 'listings ;; org-latex-prefer-user-labels t ) - (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}") + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") ("\\subsubsection{%s}" . "\\subsubsection*{%s}") - ("\\paragraph{%s}" . "\\paragraph*{%s}") - ("\\subparagraph{%s}" . "\\subparagraph*{%s}")) - t)) - -(use-package ox-beamer - :after ox) - -(use-package orgalist - :after message - :hook (message-mode . orgalist-mode)) + ("\\paragraph{%s}" . "\\paragraph*{%s}") + ("\\subparagraph{%s}" . "\\subparagraph*{%s}")) + t) + (require 'ox-beamer)) #+end_src **** asynchronous tangle @@ -787,6 +802,9 @@ file. (defvar a/async-tangle-post-compile "make ti" "If non-nil, pass to `compile' after successful tangle.") + (defvar a/async-tangle-byte-recompile nil + "If non-nil, byte-recompile the file on successful tangle.") + (defun a/async-babel-tangle () "Tangle org file asynchronously." (interactive) @@ -794,7 +812,7 @@ file. (file (buffer-file-name)) (file-nodir (file-name-nondirectory file)) ;; (async-quiet-switch "-q") - ) + (file-noext (file-name-sans-extension file))) (async-start `(lambda () (require 'org) @@ -803,6 +821,7 @@ file. `(lambda (result) (if result (progn + ;; (setq byte-compile-warnings '(not noruntime unresolved)) (message "Tangled %s%s" ,file-nodir (if a/show-async-tangle-time @@ -811,7 +830,9 @@ file. ',file-tangle-start-time))) "")) (when a/async-tangle-post-compile - (compile a/async-tangle-post-compile))) + (compile a/async-tangle-post-compile)) + (when a/async-tangle-byte-recompile + (byte-recompile-file (concat ,file-noext ".el")))) (message "Tangling %s failed" ,file-nodir)))))))) (add-to-list @@ -847,6 +868,30 @@ 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-package recentf + :defer 0.5 + :config + (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:") + (setq recentf-max-saved-items 40)) +#+end_src + +*** smex + +#+begin_quote +A smart M-x enhancement for Emacs. +#+end_quote + +Mostly because =counsel= needs it to remember history. + +#+begin_src emacs-lisp +(use-package smex) +#+end_src + *** [[https://github.com/abo-abo/swiper][Ivy]] (and friends) #+begin_quote @@ -881,6 +926,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))) @@ -891,6 +937,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) @@ -926,7 +973,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) @@ -943,7 +991,6 @@ There's no way I could top that, so I won't attempt to. #+begin_src emacs-lisp (use-package ibuffer - :defer t :bind (("C-x C-b" . ibuffer-other-window) :map ibuffer-mode-map @@ -1014,7 +1061,6 @@ There's no way I could top that, so I won't attempt to. #+begin_src emacs-lisp (use-package outline - :defer t :hook (prog-mode . outline-minor-mode) :bind (:map @@ -1032,96 +1078,159 @@ 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: +*** Dired + +#+begin_src emacs-lisp +(use-package ls-lisp + :custom (ls-lisp-dirs-first t)) + +(use-package dired + :config + (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 'dired-aux) + (defvar ediff-after-quit-hook-internal) + (let ((files (dired-get-marked-files)) + (wnd (current-window-configuration))) + (if (<= (length files) 2) + (let ((file1 (car files)) + (file2 (if (cdr files) + (cadr files) + (read-file-name + "file: " + (dired-dwim-target-directory))))) + (if (file-newer-than-file-p file1 file2) + (ediff-files file2 file1) + (ediff-files file1 file2)) + (add-hook 'ediff-after-quit-hook-internal + (lambda () + (setq ediff-after-quit-hook-internal nil) + (set-window-configuration wnd)))) + (error "no more than 2 files should be marked")))) + :bind (:map dired-mode-map + ("b" . dired-up-directory) + ("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 + +*** Help + +#+begin_src emacs-lisp +(use-package help + :config + (temp-buffer-resize-mode) + (setq help-window-select t)) +#+end_src -TODO: break this giant source block down into individual org sections. +*** Tramp + +#+begin_src emacs-lisp +(use-package tramp + :config + (add-to-list 'tramp-default-proxies-alist '(nil "\\`root\\'" "/ssh:%h:")) + (add-to-list 'tramp-default-proxies-alist '("localhost" nil nil)) + (add-to-list 'tramp-default-proxies-alist + (list (regexp-quote (system-name)) nil nil))) +#+end_src + +*** Dash #+begin_src emacs-lisp (use-package dash :config (dash-enable-font-lock)) +#+end_src + +* Editing +:PROPERTIES: +:CUSTOM_ID: editing +:END: + +** =diff-hl= + +Highlight uncommitted changes in the left fringe. +#+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)) + :hook (magit-post-refresh . diff-hl-magit-post-refresh)) +#+end_src -(use-package dired - :defer t - :config (setq dired-listing-switches "-alh")) +** ElDoc +Display Lisp objects at point in the echo area. + +#+begin_src emacs-lisp (use-package eldoc :when (version< "25" emacs-version) :config (global-eldoc-mode)) +#+end_src -(use-package help - :defer t - :config - (temp-buffer-resize-mode) - (setq help-window-select t)) - -(progn ; `isearch' - (setq isearch-allow-scroll t)) +** paren -(use-package lisp-mode - :config - (add-hook 'emacs-lisp-mode-hook 'outline-minor-mode) - (add-hook 'emacs-lisp-mode-hook 'reveal-mode) - (defun indent-spaces-mode () - (setq indent-tabs-mode nil)) - (add-hook 'lisp-interaction-mode-hook #'indent-spaces-mode)) - -(use-package man - :defer t - :config (setq Man-width 80)) +Highlight matching parens. +#+begin_src emacs-lisp (use-package paren + :demand :config (show-paren-mode)) +#+end_src -(use-package 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)) +** simple (for column numbers) -(use-package recentf - :defer 0.5 - :config - (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:") - (setq recentf-max-saved-items 40)) +#+begin_src emacs-lisp +(use-package simple + :config (column-number-mode)) +#+end_src + +** =savehist= +Save minibuffer history. + +#+begin_src emacs-lisp (use-package savehist :config (savehist-mode)) +#+end_src + +** =saveplace= + +Automatically save place in each file. +#+begin_src emacs-lisp (use-package saveplace :when (version< "25" emacs-version) :config (save-place-mode)) +#+end_src -(use-package simple - :config (column-number-mode)) +** =prog-mode= -(progn ; `text-mode' - (add-hook 'text-mode-hook #'indicate-buffer-boundaries-left) - (add-hook 'text-mode-hook #'abbrev-mode)) +#+begin_src emacs-lisp +(use-package 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)) +#+end_src -(use-package tramp - :defer t - :config - (add-to-list 'tramp-default-proxies-alist '(nil "\\`root\\'" "/ssh:%h:")) - (add-to-list 'tramp-default-proxies-alist '("localhost" nil nil)) - (add-to-list 'tramp-default-proxies-alist - (list (regexp-quote (system-name)) nil nil))) +** =text-mode= +#+begin_src emacs-lisp +(use-package text-mode + :hook ((text-mode . indicate-buffer-boundaries-left) + (text-mode . abbrev-mode))) #+end_src -* Editing -:PROPERTIES: -:CUSTOM_ID: editing -:END: - ** Company #+begin_src emacs-lisp @@ -1141,10 +1250,7 @@ TODO: break this giant source block down into individual org sections. (global-company-mode t)) #+end_src -* Syntax and spell checking -:PROPERTIES: -:CUSTOM_ID: syntax-spell-checking -:END: +** Flycheck #+begin_src emacs-lisp (use-package flycheck @@ -1193,11 +1299,22 @@ TODO: break this giant source block down into individual org sections. :CUSTOM_ID: programming-modes :END: +** Lisp + +#+begin_src emacs-lisp +(use-package lisp-mode + :config + (add-hook 'emacs-lisp-mode-hook 'outline-minor-mode) + (add-hook 'emacs-lisp-mode-hook 'reveal-mode) + (defun indent-spaces-mode () + (setq indent-tabs-mode nil)) + (add-hook 'lisp-interaction-mode-hook #'indent-spaces-mode)) +#+end_src + ** [[http://alloytools.org][Alloy]] (with [[https://github.com/dwwmmn/alloy-mode][alloy-mode]]) #+begin_src emacs-lisp (use-package alloy-mode - :defer t :config (setq alloy-basic-offset 2)) #+end_src @@ -1205,7 +1322,6 @@ TODO: break this giant source block down into individual org sections. #+begin_src emacs-lisp (use-package proof-site ; Proof General - :defer t :load-path "lib/proof-site/generic/") #+end_src @@ -1233,7 +1349,6 @@ TODO: break this giant source block down into individual org sections. #+begin_src emacs-lisp (use-package haskell-mode - :defer t :config (setq haskell-indentation-layout-offset 4 haskell-indentation-left-offset 4 @@ -1416,13 +1531,12 @@ instead. ("C-c l l" . hs-lint))) #+end_src -** Web dev +** Web *** SGML and HTML #+begin_src emacs-lisp (use-package sgml-mode - :defer t :config (setq sgml-basic-offset 2)) #+end_src @@ -1431,7 +1545,6 @@ instead. #+begin_src emacs-lisp (use-package css-mode - :defer t :config (setq css-indent-offset 2)) #+end_src @@ -1440,7 +1553,6 @@ instead. #+begin_src emacs-lisp (use-package web-mode - :defer t :mode "\\.html\\'" :config (a/setq-every 2 @@ -1565,6 +1677,13 @@ treemacs :CUSTOM_ID: emacs-enhancements :END: +** man + +#+begin_src emacs-lisp +(use-package man + :config (setq Man-width 80)) +#+end_src + ** [[https://github.com/justbur/emacs-which-key][which-key]] #+begin_quote @@ -1574,7 +1693,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 @@ -1588,6 +1751,7 @@ Emacs package that displays available keybindings in popup #+begin_src emacs-lisp (use-package smart-mode-line + :demand :config (sml/setup)) #+end_src @@ -1601,19 +1765,29 @@ Emacs package that displays available keybindings in popup ** theme helper functions #+begin_src emacs-lisp +(defvar a/org-mode-font-lock-keywords + '(("[ \t]*\\(#\\+\\(BEGIN\\|END\\|begin\\|end\\)_\\(\\S-+\\)\\)[ \t]*\\([^\n:]*\\)" + (1 '(:foreground "#5a5b5a" :background "#292b2b") t) ; directive + (3 '(:foreground "#81a2be" :background "#292b2b") t) ; kind + (4 '(:foreground "#c5c8c6") t)))) ; title + (defun a/lights-on () "Enable my favourite light theme." (interactive) (mapc #'disable-theme custom-enabled-themes) (load-theme 'tangomod t) - (sml/apply-theme 'automatic)) + (sml/apply-theme 'automatic) + (font-lock-remove-keywords + 'org-mode a/org-mode-font-lock-keywords)) (defun a/lights-off () "Go dark." (interactive) (mapc #'disable-theme custom-enabled-themes) (load-theme 'doom-tomorrow-night t) - (sml/apply-theme 'automatic)) + (sml/apply-theme 'automatic) + (font-lock-add-keywords + 'org-mode a/org-mode-font-lock-keywords t)) (bind-keys ("s-t d" . a/lights-off) @@ -1649,7 +1823,6 @@ Emacs package that displays available keybindings in popup #+begin_src emacs-lisp (use-package projectile - :defer t :bind-keymap ("C-c p" . projectile-command-map) :config (projectile-mode) @@ -1732,6 +1905,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 @@ -1755,11 +1936,9 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. #+begin_src emacs-lisp (use-package shrink-path + :defer 2 :after eshell :config - (setq eshell-prompt-regexp "\\(.*\n\\)*λ " - eshell-prompt-function #'+eshell/prompt) - (defun +eshell/prompt () (let ((base/dir (shrink-path-prompt default-directory))) (concat (propertize (car base/dir) @@ -1779,14 +1958,17 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. collect match)))) (if (not (eq branch nil)) (concat " " (substring branch 2)) - "")))) + ""))) + (setq eshell-prompt-regexp "\\(.*\n\\)*λ " + eshell-prompt-function #'+eshell/prompt)) #+end_src ** [[https://github.com/peterwvj/eshell-up][eshell-up]] #+begin_src emacs-lisp (use-package eshell-up - :after eshell) + :after eshell + :commands eshell-up) #+end_src ** multi-term @@ -1794,8 +1976,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 @@ -1840,6 +2021,20 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. :bind ("C-=" . er/expand-region)) #+end_src +** 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 + * Email :PROPERTIES: :CUSTOM_ID: email @@ -1860,9 +2055,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 @@ -2054,7 +2247,8 @@ Convenient footnotes in =message-mode=. #+begin_src emacs-lisp (use-package ebdb - :defer 1 + :defer 2 + :after gnus :bind (:map gnus-group-mode-map ("e" . ebdb)) :config (setq ebdb-sources (no-littering-expand-var-file-name "ebdb")) @@ -2070,15 +2264,12 @@ Convenient footnotes in =message-mode=. ;; (ebdb-complete-enable)) (use-package company-ebdb - :after (:all company message) + :defer 2 :config - (defun company-ebdb--post-complete (_) nil) - :hook - (message-mode . (lambda () - (add-to-list (make-local-variable 'company-backends) - 'company-ebdb)))) + (defun company-ebdb--post-complete (_) nil)) (use-package ebdb-gnus + :defer 3 :after ebdb :custom (ebdb-gnus-window-configuration @@ -2090,6 +2281,7 @@ Convenient footnotes in =message-mode=. (ebdb-gnus 0.3)))))) (use-package ebdb-mua + :defer 3 :after ebdb ;; :custom (ebdb-mua-pop-up nil) ) @@ -2169,5 +2361,5 @@ 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: (typo-mode -1) +# eval: (when (featurep 'typo (typo-mode -1))) # End: