From 8e7b13c1059e001b8fd652fd5b1b2f87b866377a Mon Sep 17 00:00:00 2001 From: Duncan Date: Mon, 22 May 2023 13:55:22 -0500 Subject: Add accumulated Thinkpad changes --- config.org | 175 ++++++++++++++++++++++++++++++------- init.el | 284 ++++++++++++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 378 insertions(+), 81 deletions(-) diff --git a/config.org b/config.org index 7cb1184..46d33d7 100644 --- a/config.org +++ b/config.org @@ -52,8 +52,14 @@ Noto Emoji is the fallback here. (add-to-list 'default-frame-alist '(font . "Iosevka-10")) - (setf use-default-font-for-symbols nil) - (set-fontset-font t 'unicode "Noto Emoji" nil 'append) + (defun dnw/unicode-fonts () + (setf use-default-font-for-symbols nil) + (set-fontset-font t 'unicode "Noto Emoji" nil 'append) + (set-fontset-font t 'emoji "Noto Color Emoji")) + + (if (daemonp) + (add-hook 'server-after-make-frame-hook #'dnw/unicode-fonts) + (dnw/unicode-fonts)) #+end_src @@ -121,7 +127,7 @@ Declare which archives to use, syncing them on start. Always-ensure downloads ne (setq use-package-always-ensure t) - (add-to-list 'load-path "/home/dnw/Code/PHYTS/phits-mode") + (add-to-list 'load-path "/home/dnw/Code/PyPHITS/phits-mode") (require 'phits-mode) (add-to-list 'auto-mode-alist '("\\.inp\\'" . phits-mode)) @@ -536,32 +542,34 @@ Evaluation of code blocks & abbreviated syntax for generating them. #+begin_src emacs-lisp - (with-eval-after-load 'org - (org-babel-do-load-languages - 'org-babel-load-languages - '((emacs-lisp . t) - (python . t) - (fortran . t) - (gnuplot t) - (R . t) - (sqlite . t) - (haskell . t) - (lua . t))) - - (setq org-confirm-babel-evaluate nil) - - (require 'org-tempo) - - (add-to-list 'org-structure-template-alist '("sh" . "src shell")) - (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp")) - (add-to-list 'org-structure-template-alist '("py" . "src python")) - (add-to-list 'org-structure-template-alist '("ft" . "src fortran")) - (add-to-list 'org-structure-template-alist '("gp" . "src gnuplot")) - (add-to-list 'org-structure-template-alist '("sql" . "src sqlite")) - (add-to-list 'org-structure-template-alist '("r" . "src R")) - (add-to-list 'org-structure-template-alist '("hs" . "src haskell")) - (add-to-list 'org-structure-template-alist '("lu" . "src lua"))) - + (with-eval-after-load 'org + (org-babel-do-load-languages + 'org-babel-load-languages + '((emacs-lisp . t) + (python . t) + (fortran . t) + (gnuplot t) + (R . t) + (sqlite . t) + (haskell . t) + (lua . t) + (shell . t) + (C . t))) + + (setq org-confirm-babel-evaluate nil) + + (require 'org-tempo) + + (add-to-list 'org-structure-template-alist '("sh" . "src shell")) + (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp")) + (add-to-list 'org-structure-template-alist '("py" . "src python3")) + (add-to-list 'org-structure-template-alist '("ft" . "src fortran")) + (add-to-list 'org-structure-template-alist '("gp" . "src gnuplot")) + (add-to-list 'org-structure-template-alist '("sql" . "src sqlite")) + (add-to-list 'org-structure-template-alist '("r" . "src R")) + (add-to-list 'org-structure-template-alist '("hs" . "src haskell")) + (add-to-list 'org-structure-template-alist '("lu" . "src lua")) + (add-to-list 'org-structure-template-alist '("sys" . "src C"))) #+end_src @@ -818,7 +826,7 @@ Interact with PDFs from Emacs. Great for working with AUCTeX apparently. #+begin_src emacs-lisp ;; Done from Guix - (pdf-loader-install) + ;; (pdf-loader-install) ;; (use-package pdf-tools ;; :init ;; (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer) @@ -848,7 +856,52 @@ TODO ** Eshell -TODO +#+begin_src emacs-lisp + + (defun dnw/prompt-prefix () + (let ((guess (apply + 'concat + (-map + (lambda (x) + (if (string= x "dnw") + "~/" + (concat x "/"))) + (seq-subseq + ;; extra ""'s are to prevent slicing errors + (cons "" (cons "" (split-string (eshell/pwd) "/"))) + -2))))) + (if (string= guess "home/~/") + "~" + (string-remove-suffix "/" guess)))) + + (remove-hook 'eshell-output-filter-functions + 'eshell-postoutput-scroll-to-bottom) + + (defun dnw/prompt () + (concat + (propertize + (dnw/prompt-prefix) + 'font-lock-face '(:foreground "#4068A3")) + (propertize " ᛋ" 'font-lock-face '(:foreground "#CB77F9")) + (propertize " " 'font-lock-face "default"))) + + (setq eshell-prompt-regexp "^[^ᛋ\n]* ᛋ ") + + (setq eshell-highlight-prompt nil + eshell-prompt-function #'dnw/prompt) + + (setq eshell-banner-message "We will reinvent the wheel. They used triangles. 🗿\n\n") + + ;; (add-to-list eshell-visual-subcommands '("guix" "search")) + ;; (add-to-list eshell-visual-subcommands '("guix" "install")) + ;; (add-to-list eshell-visual-subcommands '("guix" "remove")) + + (setq eshell-destroy-buffer-when-process-dies t) + + (setq eshell-prefer-lisp-functions t) + (setq eshell-prefer-lisp-variables t) + +#+end_src * Mail @@ -1156,7 +1209,8 @@ Play audio and video. #+begin_src emacs-lisp (require 'exwm-xim) - ;;(require 'exwm-systemtray) + (require 'exwm-randr) + (require 'exwm-systemtray) (defun dnw/exwm-config () "My configuration of EXWM, adapted from the example." @@ -1167,6 +1221,12 @@ Play audio and video. (add-hook 'exwm-update-class-hook (lambda () (exwm-workspace-rename-buffer exwm-class-name))) + (setq exwm-randr-workspace-output-plist '(1 "VGA1" 2 "VGA1" 3 "VGA1")) + (add-hook 'exwm-randr-screen-change-hook + (lambda () + (start-process-shell-command + "xrandr" nil "xrandr --output VGA1 --left-of LVDS1 --auto"))) + ;; Global keybindings. (unless (get 'exwm-input-global-keys 'saved-value) (setq exwm-input-global-keys @@ -1213,6 +1273,8 @@ Play audio and video. ;; Enable EXWM (exwm-enable) (exwm-xim-enable) + (exwm-randr-enable) + (exwm-systemtray-enable) (push ?\C-\\ exwm-input-prefix-keys)) (use-package exwm @@ -1224,7 +1286,8 @@ Play audio and video. #+begin_src emacs-lisp - (use-package password-store) + (use-package password-store + :config (pinentry-start)) #+end_src @@ -1238,6 +1301,36 @@ Edit selected text in org-mode-style source block. It full-screens it at the mom #+end_src +* EWW + +Primary web browser + +#+begin_src emacs-lisp + + (use-package eww + :config + (setq browse-url-browser-function 'eww-browse-url) + (setq eww-search-prefix "https://librex.devol.it/search.php?q=") + (setq dnw/eww-auto-readable-blacklist '("https://librex.devol.it")) + + (defun dnw/eww-auto-readable () + (if (seq-some (lambda (bl) (string-prefix-p bl (eww-current-url))) + dnw/eww-auto-readable-blacklist) + nil + (eww-readable))) + + (defun dnw/eww-unreadable () + (interactive) + (let ((hook eww-after-render-hook)) + (setq eww-after-render-hook nil) + (eww-reload t) + (setq eww-after-render-hook hook)))) + + ;; (add-hook 'eww-after-render-hook #'dnw/eww-auto-readable) + ;; :hook (eww-after-render-hook . dnw/eww-auto-readable) this, for some reason, doesn't work + ;; :bind ("U" . dnw/eww-unreadable) + +#+end_src * Lean #+begin_src emacs-lisp @@ -1248,6 +1341,22 @@ Edit selected text in org-mode-style source block. It full-screens it at the mom #+end_src +* Racket + +#+begin_src emacs-lisp + + (use-package racket-mode) + +#+end_src + +* Guile +#+begin_src emacs-lisp + + (use-package geiser + :config (require 'geiser-guile)) + +#+end_src + * Disable Annoying Quail Buffer #+begin_src emacs-lisp diff --git a/init.el b/init.el index a971a1e..836d5bd 100644 --- a/init.el +++ b/init.el @@ -9,7 +9,7 @@ (add-hook 'emacs-startup-hook #'dnw/display-startup-time) -(server-start) +;;(server-start) (global-set-key (kbd "C->") 'indent-rigidly-right-to-tab-stop) (global-set-key (kbd "C-<") 'indent-rigidly-left-to-tab-stop) @@ -22,8 +22,14 @@ (add-to-list 'default-frame-alist '(font . "Iosevka-10")) -(setf use-default-font-for-symbols nil) -(set-fontset-font t 'unicode "Noto Emoji" nil 'append) +(defun dnw/unicode-fonts () + (setf use-default-font-for-symbols nil) + (set-fontset-font t 'unicode "Noto Emoji" nil 'append) + (set-fontset-font t 'emoji "Noto Color Emoji")) + +(if (daemonp) + (add-hook 'server-after-make-frame-hook #'dnw/unicode-fonts) + (dnw/unicode-fonts)) (setq inhibit-startup-message t) @@ -63,7 +69,7 @@ (setq use-package-always-ensure t) -(add-to-list 'load-path "/home/dnw/Code/PHYTS/phits-mode") +(add-to-list 'load-path "/home/dnw/Code/PyPHITS/phits-mode") (require 'phits-mode) (add-to-list 'auto-mode-alist '("\\.inp\\'" . phits-mode)) @@ -145,8 +151,17 @@ "\\usepackage[letterpaper]{geometry}\n" "\\usepackage{tgpagella}\n" "\\usepackage{amsmath}\n" + "\\usepackage{amssymb}\n" + "\\usepackage{amsthm}\n" + "\\usepackage{tikz}\n" + "\\usepackage{minted}\n" + "\\usepackage{physics}\n" "\\usepackage{siunitx}\n\n" + "\\sisetup{detect-all}\n" + "\\newtheorem{plm}{Problem}\n" + "\\renewcommand*{\\proofname}{Solution}\n\n" + "\\title{" (read-string "Title: ") "}\n" "\\author{Duncan Wilkie}\n" @@ -161,23 +176,31 @@ "\n\n\\end{document}")) ("Math" . (nil "\\documentclass{article}\n\n" - "\\usepackage[letterpaper]{geometry}\n" - "\\usepackage{tgpagella}\n" - "\\usepackage{amsmath}\n" - "\\usepackage{amssymb}\n" - "\\usepackage{amsthm}\n\n" + "\\usepackage[letterpaper]{geometry}\n" + "\\usepackage{tgpagella}\n" + "\\usepackage{amsmath}\n" + "\\usepackage{amssymb}\n" + "\\usepackage{amsthm}\n" + "\\usepackage{tikz}\n" + "\\usepackage{minted}\n" + "\\usepackage{physics}\n" + "\\usepackage{siunitx}\n\n" + + "\\sisetup{detect-all}\n" + "\\newtheorem{plm}{Problem}\n\n" + - "\\title{" (read-string "Title: ") "}\n" - "\\author{Duncan Wilkie}\n" - "\\date{" (dnw/prompt-date) "}\n\n" + "\\title{" (read-string "Title: ") "}\n" + "\\author{Duncan Wilkie}\n" + "\\date{" (dnw/prompt-date) "}\n\n" - "\\begin{document}\n\n" + "\\begin{document}\n\n" - "\\maketitle\n\n" + "\\maketitle\n\n" - - + - - "\n\n\\end{document}")) + "\n\n\\end{document}")) ("Default" . ("options, RET: " "\\documentclass[" str & 93 | -1 123 (read-string "class: ") "}\n" @@ -197,7 +220,7 @@ (assoc-delete-all 'latex-mode auto-insert-alist) (define-auto-insert 'latex-mode (lambda () - (let* ((presets (mapcar (lambda (pair)(car pair)) + (let* ((presets (mapcar (lambda (pair) (car pair)) dnw/autoinsert-latex-presets)) (choice (completing-read "Preset:" presets))) (skeleton-insert (assoc choice dnw/autoinsert-latex-presets)))))) @@ -311,16 +334,29 @@ 'org-babel-load-languages '((emacs-lisp . t) (python . t) - (fortran . t))) - -(setq org-confirm-babel-evaluate nil) - -(require 'org-tempo) - -(add-to-list 'org-structure-template-alist '("sh" . "src shell")) -(add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp")) -(add-to-list 'org-structure-template-alist '("py" . "src python")) -(add-to-list 'org-structure-template-alist '("ft" . "src fortran"))) + (fortran . t) + (gnuplot t) + (R . t) + (sqlite . t) + (haskell . t) + (lua . t) + (shell . t) + (C . t))) + + (setq org-confirm-babel-evaluate nil) + + (require 'org-tempo) + + (add-to-list 'org-structure-template-alist '("sh" . "src shell")) + (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp")) + (add-to-list 'org-structure-template-alist '("py" . "src python3")) + (add-to-list 'org-structure-template-alist '("ft" . "src fortran")) + (add-to-list 'org-structure-template-alist '("gp" . "src gnuplot")) + (add-to-list 'org-structure-template-alist '("sql" . "src sqlite")) + (add-to-list 'org-structure-template-alist '("r" . "src R")) + (add-to-list 'org-structure-template-alist '("hs" . "src haskell")) + (add-to-list 'org-structure-template-alist '("lu" . "src lua")) + (add-to-list 'org-structure-template-alist '("sys" . "src C"))) (defun dnw/org-babel-tangle-config () (when (string-equal (buffer-file-name) @@ -476,7 +512,7 @@ (setq TeX-electric-sub-and-superscript t)) ;; Done from Guix -(pdf-loader-install) +;; (pdf-loader-install) ;; (use-package pdf-tools ;; :init ;; (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer) @@ -490,6 +526,49 @@ (use-package eterm-256color :hook (term-mode . eterm-256color-mode)) +(defun dnw/prompt-prefix () + (let ((guess (apply + 'concat + (-map + (lambda (x) + (if (string= x "dnw") + "~/" + (concat x "/"))) + (seq-subseq + ;; extra ""'s are to prevent slicing errors + (cons "" (cons "" (split-string (eshell/pwd) "/"))) + -2))))) + (if (string= guess "home/~/") + "~" + (string-remove-suffix "/" guess)))) + +(remove-hook 'eshell-output-filter-functions + 'eshell-postoutput-scroll-to-bottom) + +(defun dnw/prompt () + (concat + (propertize + (dnw/prompt-prefix) + 'font-lock-face '(:foreground "#4068A3")) + (propertize " ᛋ" 'font-lock-face '(:foreground "#CB77F9")) + (propertize " " 'font-lock-face "default"))) + +(setq eshell-prompt-regexp "^[^ᛋ\n]* ᛋ ") + +(setq eshell-highlight-prompt nil + eshell-prompt-function #'dnw/prompt) + +(setq eshell-banner-message "We will reinvent the wheel. They used triangles. 🗿\n\n") + +;; (add-to-list eshell-visual-subcommands '("guix" "search")) +;; (add-to-list eshell-visual-subcommands '("guix" "install")) +;; (add-to-list eshell-visual-subcommands '("guix" "remove")) + +(setq eshell-destroy-buffer-when-process-dies t) + +(setq eshell-prefer-lisp-functions t) +(setq eshell-prefer-lisp-variables t) + ;; (use-package notmuch ;; :config ;; (setq mail-user-agent 'message-user-agent) @@ -627,14 +706,17 @@ ;; :quelpa (ement :fetcher github :repo "alphapapa/ement.el")) (defun dnw/elfeed-show-mode-visual-fill () - (setq visual-fill-column-width 130 - visual-fill-column-center-text t) - (visual-fill-column-mode 1)) + (setq visual-fill-column-width 130 + visual-fill-column-center-text t) + (visual-fill-column-mode 1)) +(defun dnw/render-latex () + (let ((current-prefix-arg '(2))) + (switch-to-buffer "*elfeed-entry*") + (call-interactively 'org-latex-preview))) (use-package elfeed - :hook elfeed - (elfeed-show-mode . dnw/elfeed-show-mode-visual-fill) + :hook ((elfeed-show-mode . dnw/elfeed-show-mode-visual-fill)) :config (setq elfeed-db-directory (expand-file-name "elfeed" user-emacs-directory) elfeed-show-entry-switch 'display-buffer) @@ -647,7 +729,11 @@ "https://www.ams.org/rss/jams.rss" "https://jaireetschahal.substack.com/feed" ;; Math - "https://golem.ph.utexas.edu/category/atom10.xml")) + "https://golem.ph.utexas.edu/category/atom10.xml" + "https://homotopytypetheory.org/feed/" + + "https://notrelated.xyz/rss" ;; Misc + )) :bind ("C-x w" . elfeed )) @@ -661,7 +747,8 @@ ;;(use-package bison-mode) (add-to-list 'auto-mode-alist '("\\.g4\\'" . c-mode)) -(use-package haskell-mode) ;; figure out how to defer loading until .hs is opened? +(use-package haskell-mode + :bind ("C-c C-h" . hoogle)) ;; figure out how to defer loading until .hs is opened? ;; TRAMP can't find necessary binaries on Guix machines without this after Emacs 28 (add-to-list 'tramp-remote-path "/run/current-system/profile/bin") @@ -673,6 +760,7 @@ (use-package emms :config (emms-all) + (add-to-list 'emms-player-list 'emms-player-mpd) :bind ("" . emms-start) ("" . emms-pause) @@ -681,17 +769,117 @@ (add-hook 'xhtml-mode-hook (lambda () (call-interactively 'shr-render-buffer))) +(use-package gnuplot) + +(require 'exwm-xim) +(require 'exwm-randr) +(require 'exwm-systemtray) + +(defun dnw/exwm-config () + "My configuration of EXWM, adapted from the example." + ;; Set the initial workspace number. + (unless (get 'exwm-workspace-number 'saved-value) + (setq exwm-workspace-number 4)) + ;; Make class name the buffer name + (add-hook 'exwm-update-class-hook + (lambda () + (exwm-workspace-rename-buffer exwm-class-name))) + (setq exwm-randr-workspace-output-plist '(1 "VGA1" 2 "VGA1" 3 "VGA1")) + (add-hook 'exwm-randr-screen-change-hook + (lambda () + (start-process-shell-command + "xrandr" nil "xrandr --output VGA1 --left-of LVDS1 --auto"))) + + ;; Global keybindings. + (unless (get 'exwm-input-global-keys 'saved-value) + (setq exwm-input-global-keys + `( + ;; 's-r': Reset (to line-mode). + ([?\s-r] . exwm-reset) + ;; 's-w': Switch workspace. + ([?\s-w] . exwm-workspace-switch) + ;; 's-p': Launch application. + ([?\s-p] . (lambda (command) + (interactive (list (read-shell-command "$ "))) + (start-process-shell-command command nil command))) + ;; 's-P': retrieve a password from password store + ([?\s-P] . password-store-copy) + ;; 's-N': Switch to certain workspace. + ,@(mapcar (lambda (i) + `(,(kbd (format "s-%d" i)) . + (lambda () + (interactive) + (exwm-workspace-switch-create ,i)))) + (number-sequence 0 9))))) + ;; Line-editing shortcuts + (unless (get 'exwm-input-simulation-keys 'saved-value) + (setq exwm-input-simulation-keys + '(([?\C-b] . [left]) + ([?\C-f] . [right]) + ([?\C-p] . [up]) + ([?\C-n] . [down]) + ([?\C-a] . [home]) + ([?\C-e] . [end]) + ([?\M-v] . [prior]) + ([?\C-v] . [next]) + ([?\C-s] . [C-f]) + ([?\C-d] . [delete]) + ([?\C-g] . [ESC]) + ([?\M-b] . [C-left]) + ([?\M-f] . [C-right]) + ([?\C-k] . [S-end delete]) + ([?\C-w] . [C-x]) + ([?\M-w] . [C-c]) + ([?\C-y] . [C-v]) + ([?\C-/] . [C-z]) + ([?\C-x ?h] . [C-a])))) + ;; Enable EXWM + (exwm-enable) + (exwm-xim-enable) + (exwm-randr-enable) + (exwm-systemtray-enable) + (push ?\C-\\ exwm-input-prefix-keys)) + +(use-package exwm + :config (dnw/exwm-config)) + +(use-package password-store + :config (pinentry-start)) + +(use-package exwm-edit) + +(use-package eww + :config + (setq browse-url-browser-function 'eww-browse-url) + (setq eww-search-prefix "https://librex.devol.it/search.php?q=") + (setq dnw/eww-auto-readable-blacklist '("https://librex.devol.it")) + + (defun dnw/eww-auto-readable () + (if (seq-some (lambda (bl) (string-prefix-p bl (eww-current-url))) + dnw/eww-auto-readable-blacklist) + nil + (eww-readable))) + + (defun dnw/eww-unreadable () + (interactive) + (let ((hook eww-after-render-hook)) + (setq eww-after-render-hook nil) + (eww-reload t) + (setq eww-after-render-hook hook)))) + + ;; (add-hook 'eww-after-render-hook #'dnw/eww-auto-readable) + ;; :hook (eww-after-render-hook . dnw/eww-auto-readable) this, for some reason, doesn't work + ;; :bind ("U" . dnw/eww-unreadable) + +(use-package lean-mode) + +(use-package company-lean) + +(use-package racket-mode) + +(use-package geiser + :config (require 'geiser-guile)) + +(with-eval-after-load 'quail (defun quail-completion ())) + (setq gc-cons-threshold (* 2 1000 1000)) -(custom-set-variables - ;; custom-set-variables was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. - '(package-selected-packages - '(ytel-show ytel elfeed-tube bluetooth ws-butler which-key vertico telega smartparens rainbow-delimiters quelpa-use-package pdf-tools org-roam org-present org-drill org-bullets org-appear orderless no-littering marginalia magit-popup magit lsp-ui hydra helpful haskell-mode geiser-guile flycheck exec-path-from-shell eterm-256color emms ement elfeed edit-indirect doom-themes doom-modeline dired-single diminish corfu consult company ccls bui auto-package-update auctex all-the-icons-dired))) -(custom-set-faces - ;; custom-set-faces was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. - ) -- cgit v1.2.3