From 394a62109e8acd7184ff5ceecf46b1771df51ae7 Mon Sep 17 00:00:00 2001 From: Case Duckworth Date: Tue, 12 Jan 2021 18:34:17 -0600 Subject: Change indentation --- LICENSE | 2 +- README.md | 145 ++-- config.org | 2176 +++++++++++++++++++++++++++++++----------------------------- 3 files changed, 1201 insertions(+), 1122 deletions(-) diff --git a/LICENSE b/LICENSE index 9c31dda..de537e6 100644 --- a/LICENSE +++ b/LICENSE @@ -11,4 +11,4 @@ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. You just DO WHAT THE FUCK YOU WANT TO. +0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/README.md b/README.md index 9450ea5..bde17e1 100644 --- a/README.md +++ b/README.md @@ -393,17 +393,27 @@ helper function, though, to add things to the whitelist. (cuss calendar-latitude 30.4515) (cuss calendar-longitude -91.1871) - ;; sunrise - (run-at-time (nth 1 (split-string (sunrise-sunset))) - (* 60 60 24) - (lambda () - (modus-themes-load-operandi))) - - ;; sunset - (run-at-time (nth 4 (split-string (sunrise-sunset))) - (* 60 60 24) - (lambda () - (modus-themes-load-vivendi))) + (defun acdw/run-with-sun (sunrise-command sunset-command) + "Run commands at sunrise and sunset." + (let* ((times-regex (rx (* nonl) + (: (any ?s ?S) "unrise") " " + (group (repeat 1 2 digit) ":" + (repeat 1 2 digit) + (: (any ?a ?A ?p ?P) (any ?m ?M))) + (* nonl) + (: (any ?s ?S) "unset") " " + (group (repeat 1 2 digit) ":" + (repeat 1 2 digit) + (: (any ?a ?A ?p ?P) (any ?m ?M))) + (* nonl))) + (ss (sunrise-sunset)) + (m_ (string-match times-regex ss)) + (sunrise-time (match-string 1 ss)) + (sunset-time (match-string 2 ss))) + (run-at-time sunrise-time (* 60 60 24) sunrise-command) + (run-at-time sunset-time (* 60 60 24) sunset-command))) + + (acdw/run-with-sun #'modus-themes-load-operandi #'modus-themes-load-vivendi) ### Fonts @@ -430,19 +440,24 @@ helper function, though, to add things to the whitelist. ;; fixed-pitch /is/ the default (set-face-from-alternatives face nil '(:family "Input Mono" + :slant normal :weight normal :height 110) '(:family "Go Mono" + :slant normal :weight normal :height 100) '(:family "Consolas" + :slant normal :weight normal :height 100))) ;; variable-pitch is different (set-face-from-alternatives 'variable-pitch nil '(:family "Input Sans" + :slant normal :weight normal) '(:family "Georgia" + :slant normal :weight normal))) ;; remove myself from the hook @@ -524,15 +539,11 @@ helper function, though, to add things to the whitelist. (straight-use-package '(consult :host github - :repo "minad/consult")) + :repo "minad/consult" + :files (:defaults "consult-pkg.el"))) (require 'consult) - (straight-use-package '(consult-selectrum - :host github - :repo "minad/consult")) - (require 'consult-selectrum) - - (with-eval-after-load 'consult + (with-eval-after-load 'consult (define-key ctl-x-map "b" #'consult-buffer) (define-key ctl-x-map (kbd "C-r") #'consult-buffer) (define-key ctl-x-map "4b" #'consult-buffer-other-window) @@ -724,12 +735,20 @@ from [u/TheFrenchPoulp](https://www.reddit.com/r/emacs/comments/km9by4/weekly_ti #### UTF-8 - (set-language-environment "UTF-8") - (set-terminal-coding-system 'utf-8) - (cuss locale-coding-system 'utf-8) - (set-default-coding-systems 'utf-8) - (set-selection-coding-system 'utf-8) +from [Mastering Emacs](https://www.masteringemacs.org/article/working-coding-systems-unicode-emacs). + (prefer-coding-system 'utf-8) + (set-default-coding-systems 'utf-8) + (set-terminal-coding-system 'utf-8) + (set-keyboard-coding-system 'utf-8) + ;; backwards compatibility: + ;; `default-buffer-file-coding-system' is deprecated in 23.2. + (if (boundp 'buffer-file-coding-system) + (setq-default buffer-file-coding-system 'utf-8) + (setq default-buffer-file-coding-system 'utf-8)) + + ;; Treat clipboard as UTF-8 string first; compound text next, etc. + (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)) #### Convert all files to UNIX-style line endings @@ -885,14 +904,14 @@ I’ve pretty much cribbed this from [recentf-remove-sudo-tramp-prefix](https:// #### Replace with Anzu - (straight-use-package 'anzu) - (require 'anzu) + (straight-use-package 'anzu) + (require 'anzu) - ;; show search count in the modeline - (global-anzu-mode +1) + ;; show search count in the modeline + (global-anzu-mode +1) - (cuss anzu-replace-to-string-separator " → " - "What to separate the search from the replacement.") + (cuss anzu-replace-to-string-separator " → " + "What to separate the search from the replacement.") (global-set-key [remap query-replace] #'anzu-query-replace) (global-set-key [remap query-replace-regexp] #'anzu-query-replace-regexp) @@ -1028,7 +1047,9 @@ I’ve pretty much cribbed this from [recentf-remove-sudo-tramp-prefix](https:// (straight-use-package 'janet-mode) (require 'janet-mode) - (straight-use-package 'inf-janet-mode) + (straight-use-package '(inf-janet + :host github + :repo "velkyel/inf-janet")) (add-hook 'janet-mode-hook #'inf-janet-minor-mode) @@ -1180,8 +1201,7 @@ I’ve put org mode under Applications, as opposed to Writing, because it’s m ### Basics - (straight-use-package '(org - :repo "https://code.orgmode.org/bzg/org-mode.git")) + (straight-use-package 'org) (with-eval-after-load 'org (require 'org-tempo) @@ -1226,8 +1246,8 @@ I’ve put org mode under Applications, as opposed to Writing, because it’s m (defun acdw/org-mode-prettify () "Prettify `org-mode'." (dolist (cell '(("[ ]" . ?□) ("[X]" . ?☑) ("[-]" . ?◐) - ("#+begin_src" . ?✎) ("#+BEGIN_SRC" . ?✎) - ("#+end_src" . ?■) ("#+END_SRC" . ?■))) + ("#+begin_src" . ?✎) ("#+begin_src" . ?✎) + ("#+end_src" . ?■) ("#+end_src" . ?■))) (add-to-list 'prettify-symbols-alist cell :append)) (prettify-symbols-mode +1)) @@ -1391,6 +1411,12 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#ensure-blank-lin (add-hook 'before-save-hook #'cribbed/org-mode-fix-blank-lines) +### Org Templates (`org-tempo`) + + (add-to-list 'org-structure-template-alist + '("el" . "src emacs-lisp")) + + ### Org Agenda (cuss org-agenda-files @@ -1405,12 +1431,13 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#ensure-blank-lin (cuss org-todo-keywords '((sequence "RECUR(r)" "TODO(t)" "|" "DONE(d)") + (sequence "APPT(a)") (sequence "|" "CANCELLED(c)"))) (cuss org-agenda-skip-scheduled-if-done t) (cuss org-agenda-skip-deadline-if-done t) - (cuss org-deadline-warning-days 4 - "Warn of a deadline beginning four days before.") + (cuss org-deadline-warning-days 0 + "Don't warn of an impending deadline.") ### TODO Capture @@ -1479,10 +1506,10 @@ I’m only enabling this at home for now, since it requires building stuff. (visual-fill-column-mode -1)) (at-home - (straight-use-package 'pdf-tools) - (pdf-loader-install) + (straight-use-package 'pdf-tools) + (pdf-loader-install) - (add-hook 'pdf-view-mode-hook #'acdw/disable-visual-fill-column-mode)) + (add-hook 'pdf-view-mode-hook #'acdw/disable-visual-fill-column-mode)) ## E-book tools @@ -1729,12 +1756,12 @@ I’m only enabling this at home for now, since it requires building stuff. ### Exec path from shell (at-home - (straight-use-package 'exec-path-from-shell) - (defvar acdw/exec-path-from-shell-initialized nil - "Stores whether we've initialized or not.") - (unless acdw/exec-path-from-shell-initialized - (exec-path-from-shell-initialize) - (setq acdw/exec-path-from-shell-initialized (current-time)))) + (straight-use-package 'exec-path-from-shell) + (defvar acdw/exec-path-from-shell-initialized nil + "Stores whether we've initialized or not.") + (unless acdw/exec-path-from-shell-initialized + (exec-path-from-shell-initialize) + (setq acdw/exec-path-from-shell-initialized (current-time)))) # Appendices @@ -1820,8 +1847,6 @@ I’m only enabling this at home for now, since it requires building stuff. ### emacsdc -:header-args: :tangle bin/emacsdc :tangle-mode (identity #o755) - Here's a wrapper script that'll start `emacs --daemon` if there isn't one, and then launch `emacsclient` with the arguments. I'd recommend installing with either `ln -s bin/emacsdc $HOME/.local/bin/`, or @@ -1835,14 +1860,24 @@ adding `$HOME/.local/bin` to your `$PATH`. ### Emacs.cmd -Here's a wrapper script that'll run Emacs on Windows, with a custom `$HOME`. I have -mine setup like this: Emacs is downloaded from [the GNU mirror](https://mirrors.tripadvisor.com/gnu/emacs/windows/emacs-27/emacs-27.1-x86_64.zip) and unzipped to -`~/Downloads/emacs/`. For some reason, Emacs by default sets `$HOME` to `%APPDATA%`, -which doesn’t make a lot of sense to me. I change it to `%USERPROFILE%`, and then run -Emacs with the supplied arguments. +Here's a wrapper script that'll run Emacs on Windows, with a +custom `$HOME`. I have mine setup like this: Emacs is downloaded +from [the GNU mirror](https://mirrors.tripadvisor.com/gnu/emacs/windows/emacs-27/emacs-27.1-x86_64.zip) and unzipped to `~/Downloads/emacs/`. For +some reason, Emacs by default sets `$HOME` to `%APPDATA%`, which +doesn’t make a lot of sense to me. I change it to +`%USERPROFILE%\Downloads\home`, and then run Emacs with the +supplied arguments. - set HOME=%USERPROFILE% - set EMACS="%USERPROFILE%\Downloads\emacs\bin\runemacs.exe" +As far as creating a shortcut to the Desktop, you’ll have to do +that yourself – *apparently* Windows doesn’t have a built-in +shortcut-creating software >:(. + + REM Set variables + set HOME=%USERPROFILE%\Downloads\home + set EMACS=%USERPROFILE%\Downloads\emacs\bin\runemacs.exe + + REM Change the directory + chdir %HOME% REM Run "Quick Mode" REM "%EMACS%" -Q %* @@ -1873,7 +1908,7 @@ following source block, for details. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. You just DO WHAT THE FUCK YOU WANT TO. + 0. You just DO WHAT THE FUCK YOU WANT TO. ### Note on the license diff --git a/config.org b/config.org index d926c32..fb78c55 100644 --- a/config.org +++ b/config.org @@ -5,7 +5,7 @@ #+EXPORT_FILE_NAME: README.md #+OPTIONS: toc:nil #+BANKRUPTCY_COUNT: 3.2 -#+Time-stamp: <2021-01-10 21:37:08 acdw> +#+Time-stamp: <2021-01-12 17:49:44 aduckworth> * Basics @@ -19,117 +19,117 @@ ** About me -#+BEGIN_SRC emacs-lisp -(setq user-full-name "Case Duckworth" - user-mail-address "acdw@acdw.net") -#+END_SRC + #+begin_src emacs-lisp + (setq user-full-name "Case Duckworth" + user-mail-address "acdw@acdw.net") + #+end_src ** Correct =exec-path= -Straight depends on Git, so I need to tell Emacs where different paths are. - -#+BEGIN_SRC emacs-lisp -(let ((win-downloads "c:/Users/aduckworth/Downloads")) - (dolist (path (list - ;; Linux - (expand-file-name "bin" - user-emacs-directory) - (expand-file-name "~/bin") - (expand-file-name "~/.local/bin") - (expand-file-name "~/Scripts") - ;; Windows - (expand-file-name "emacs/bin" - win-downloads) - (expand-file-name "m/usr/bin" - win-downloads) - (expand-file-name "m/mingw64/bin" - win-downloads) - (expand-file-name "PortableGit/bin" - win-downloads) - (expand-file-name "PortableGit/usr/bin" - win-downloads))) - (when (file-exists-p path) - (add-to-list 'exec-path path)))) -#+END_SRC + Straight depends on Git, so I need to tell Emacs where different paths are. + + #+begin_src emacs-lisp + (let ((win-downloads "c:/Users/aduckworth/Downloads")) + (dolist (path (list + ;; Linux + (expand-file-name "bin" + user-emacs-directory) + (expand-file-name "~/bin") + (expand-file-name "~/.local/bin") + (expand-file-name "~/Scripts") + ;; Windows + (expand-file-name "emacs/bin" + win-downloads) + (expand-file-name "m/usr/bin" + win-downloads) + (expand-file-name "m/mingw64/bin" + win-downloads) + (expand-file-name "PortableGit/bin" + win-downloads) + (expand-file-name "PortableGit/usr/bin" + win-downloads))) + (when (file-exists-p path) + (add-to-list 'exec-path path)))) + #+end_src ** Package management *** Straight.el -Straight can't bootstrap itself on Windows, so I've wrapped the -bootstrap code from straight's repo in a function. - -#+BEGIN_SRC emacs-lisp -(defun acdw/bootstrap-straight () - "Bootstrap straight.el." - (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 - (concat - "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))) -#+END_SRC - -Now, I'll /try/ running it regular-style, ignoring the errors. If it -doesn't work, I'll call git directly and clone the repo myself. - -#+BEGIN_SRC emacs-lisp - (unless (ignore-errors (acdw/bootstrap-straight)) - (message "%s" "Straight.el didn't bootstrap correctly. Cloning directly...") - (call-process "git" nil - (get-buffer-create "*bootstrap-straight-messages*") nil - "clone" - "https://github.com/raxod502/straight.el" - (expand-file-name "straight/repos/straight.el" - user-emacs-directory)) - (acdw/bootstrap-straight)) -#+END_SRC + Straight can't bootstrap itself on Windows, so I've wrapped the + bootstrap code from straight's repo in a function. + + #+begin_src emacs-lisp + (defun acdw/bootstrap-straight () + "Bootstrap straight.el." + (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 + (concat + "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))) + #+end_src + + Now, I'll /try/ running it regular-style, ignoring the errors. If it + doesn't work, I'll call git directly and clone the repo myself. + + #+begin_src emacs-lisp + (unless (ignore-errors (acdw/bootstrap-straight)) + (message "%s" "Straight.el didn't bootstrap correctly. Cloning directly...") + (call-process "git" nil + (get-buffer-create "*bootstrap-straight-messages*") nil + "clone" + "https://github.com/raxod502/straight.el" + (expand-file-name "straight/repos/straight.el" + user-emacs-directory)) + (acdw/bootstrap-straight)) + #+end_src ** Ease-of-configuring functions *** Emulate use-package’s =:custom= -#+BEGIN_SRC emacs-lisp -(defmacro cuss (var val &optional docstring) - "Basically, `:custom' from `use-package', but without `use-package'." - (declare (doc-string 3) - (indent 2)) - `(funcall (or (get ',var 'custom-set) #'set-default) - ',var ,val)) -#+END_SRC + #+begin_src emacs-lisp + (defmacro cuss (var val &optional docstring) + "Basically, `:custom' from `use-package', but without `use-package'." + (declare (doc-string 3) + (indent 2)) + `(funcall (or (get ',var 'custom-set) #'set-default) + ',var ,val)) + #+end_src *** Emulate use-package’s =:custom-face=, but better -#+begin_src emacs-lisp - (defvar acdw--custom-faces () - "List of custom faces to run through acdw/set-custom-faces.") - - (defun acdw/set-custom-faces () - "Run `customize-set-faces' on `acdw--custom-faces'." - (message "%s" "Customizing faces...") - (apply #'custom-set-faces acdw--custom-faces)) - - (defun cussface (spec) - "Add SPEC to `acdw--custom-faces', and add a hook to run - `acdw/set-custom-faces' after init." - (add-to-list 'acdw--custom-faces spec) - (add-hook 'after-init-hook #'acdw/set-custom-faces)) -#+end_src + #+begin_src emacs-lisp + (defvar acdw--custom-faces () + "List of custom faces to run through acdw/set-custom-faces.") + + (defun acdw/set-custom-faces () + "Run `customize-set-faces' on `acdw--custom-faces'." + (message "%s" "Customizing faces...") + (apply #'custom-set-faces acdw--custom-faces)) + + (defun cussface (spec) + "Add SPEC to `acdw--custom-faces', and add a hook to run + `acdw/set-custom-faces' after init." + (add-to-list 'acdw--custom-faces spec) + (add-hook 'after-init-hook #'acdw/set-custom-faces)) + #+end_src *** Determine whether any Emacs frame is focused or not -This comes in handy when I want to garbage collect, say, or save recent files. + This comes in handy when I want to garbage collect, say, or save recent files. #+begin_src emacs-lisp (defun acdw/when-unfocused (func &rest args) @@ -140,144 +140,144 @@ This comes in handy when I want to garbage collect, say, or save recent files. *** Determine where I am -I use Emacs at home, with Linux, and at work, with Windows. - -#+begin_src emacs-lisp - (defmacro at-work (&rest commands) - "Only do COMMANDS when at work." - (declare (indent defun)) - `(when (memq system-type '(ms-dos windows-nt)) - ,@commands)) + I use Emacs at home, with Linux, and at work, with Windows. - (defmacro at-home (&rest commands) - "Only do COMMANDS when at home." - (declare (indent defun)) - `(when (memq system-type '(gnu gnu/linux gnu/kfreebsd)) - ,@commands)) -#+end_src + #+begin_src emacs-lisp + (defmacro at-work (&rest commands) + "Only do COMMANDS when at work." + (declare (indent defun)) + `(when (memq system-type '(ms-dos windows-nt)) + ,@commands)) + + (defmacro at-home (&rest commands) + "Only do COMMANDS when at home." + (declare (indent defun)) + `(when (memq system-type '(gnu gnu/linux gnu/kfreebsd)) + ,@commands)) + #+end_src ** Clean =.emacs.d= -#+BEGIN_SRC emacs-lisp -(straight-use-package 'no-littering) -(require 'no-littering) -#+END_SRC + #+begin_src emacs-lisp + (straight-use-package 'no-littering) + (require 'no-littering) + #+end_src *** Don’t clutter =init.el= with customizations -#+begin_src emacs-lisp - (with-eval-after-load 'no-littering - (cuss custom-file (no-littering-expand-etc-file-name "custom.el"))) -#+end_src + #+begin_src emacs-lisp + (with-eval-after-load 'no-littering + (cuss custom-file (no-littering-expand-etc-file-name "custom.el"))) + #+end_src ** Look and feel *** Cursor -#+BEGIN_SRC emacs-lisp -(cuss cursor-type 'bar - "Show a vertical bar for the cursor.") + #+begin_src emacs-lisp + (cuss cursor-type 'bar + "Show a vertical bar for the cursor.") -(cuss cursor-in-non-selected-windows 'hbar - "Show an empty box in inactive windows.") + (cuss cursor-in-non-selected-windows 'hbar + "Show an empty box in inactive windows.") -;; Don't blink the cursor -(blink-cursor-mode -1) -#+END_SRC + ;; Don't blink the cursor + (blink-cursor-mode -1) + #+end_src *** Tool Bars **** Tool bars and menu bars -#+BEGIN_SRC emacs-lisp - (menu-bar-mode -1) - (tool-bar-mode -1) -#+END_SRC + #+begin_src emacs-lisp + (menu-bar-mode -1) + (tool-bar-mode -1) + #+end_src **** Scroll bars -#+BEGIN_SRC emacs-lisp - (scroll-bar-mode -1) - (horizontal-scroll-bar-mode -1) -#+END_SRC + #+begin_src emacs-lisp + (scroll-bar-mode -1) + (horizontal-scroll-bar-mode -1) + #+end_src *** Dialogs -#+BEGIN_SRC emacs-lisp -(cuss use-dialog-box nil - "Don't use dialog boxes to ask questions.") -#+END_SRC + #+begin_src emacs-lisp + (cuss use-dialog-box nil + "Don't use dialog boxes to ask questions.") + #+end_src **** Yes or no questions -#+BEGIN_SRC emacs-lisp -(fset 'yes-or-no-p #'y-or-n-p) -#+END_SRC + #+begin_src emacs-lisp + (fset 'yes-or-no-p #'y-or-n-p) + #+end_src **** The Bell -from [[https://www.emacswiki.org/emacs/AlarmBell#h5o-3][EmacsWiki]]. + from [[https://www.emacswiki.org/emacs/AlarmBell#h5o-3][EmacsWiki]]. -#+BEGIN_SRC emacs-lisp - (setq visible-bell nil - ring-bell-function 'flash-mode-line) + #+begin_src emacs-lisp + (setq visible-bell nil + ring-bell-function 'flash-mode-line) - (defun flash-mode-line () - (invert-face 'mode-line) - (run-with-timer 0.1 nil #'invert-face 'mode-line)) -#+END_SRC + (defun flash-mode-line () + (invert-face 'mode-line) + (run-with-timer 0.1 nil #'invert-face 'mode-line)) + #+end_src *** Frames **** Fringes -#+BEGIN_SRC emacs-lisp -(cuss indicate-empty-lines t - "Show an indicator on the left fringe of empty lines past the -end of the buffer.") -(cuss indicate-buffer-boundaries 'right - "Indicate the beginning and end of the buffer and whether it - scrolls off-window in the right fringe.") -#+END_SRC + #+begin_src emacs-lisp + (cuss indicate-empty-lines t + "Show an indicator on the left fringe of empty lines past the + end of the buffer.") + (cuss indicate-buffer-boundaries 'right + "Indicate the beginning and end of the buffer and whether it + scrolls off-window in the right fringe.") + #+end_src **** Minibuffer -#+BEGIN_SRC emacs-lisp -(cuss minibuffer-prompt-properties - '(read-only t cursor-intangible t face minibuffer-prompt) - "Keep the cursor away from the minibuffer prompt.") -#+END_SRC + #+begin_src emacs-lisp + (cuss minibuffer-prompt-properties + '(read-only t cursor-intangible t face minibuffer-prompt) + "Keep the cursor away from the minibuffer prompt.") + #+end_src **** Tabs -#+BEGIN_SRC emacs-lisp -(cuss tab-bar-tab-name-function - #'tab-bar-tab-name-current-with-count - "Show the tab name as the name of the current buffer, plus a - count of the windows in the tab.") + #+begin_src emacs-lisp + (cuss tab-bar-tab-name-function + #'tab-bar-tab-name-current-with-count + "Show the tab name as the name of the current buffer, plus a + count of the windows in the tab.") -(cuss tab-bar-show 1 - "Show the tab bar, when there's more than one tab.") -#+END_SRC + (cuss tab-bar-show 1 + "Show the tab bar, when there's more than one tab.") + #+end_src *** Windows **** Winner mode -#+BEGIN_SRC emacs-lisp -(when (fboundp 'winner-mode) - (winner-mode +1)) -#+END_SRC + #+begin_src emacs-lisp + (when (fboundp 'winner-mode) + (winner-mode +1)) + #+end_src **** Switch windows -#+BEGIN_SRC emacs-lisp -(global-set-key (kbd "M-o") #'other-window) -#+END_SRC + #+begin_src emacs-lisp + (global-set-key (kbd "M-o") #'other-window) + #+end_src **** Pop-up windows - #+BEGIN_SRC emacs-lisp + #+begin_src emacs-lisp (straight-use-package 'popwin) (popwin-mode +1) #+end_src @@ -286,56 +286,56 @@ end of the buffer.") **** Uniquify buffers -#+BEGIN_SRC emacs-lisp -(require 'uniquify) -(cuss uniquify-buffer-name-style 'forward - "Uniquify buffers' names by going up the path trees until they -become unique.") -#+END_SRC + #+begin_src emacs-lisp + (require 'uniquify) + (cuss uniquify-buffer-name-style 'forward + "Uniquify buffers' names by going up the path trees until they + become unique.") + #+end_src **** Startup buffers -#+BEGIN_SRC emacs-lisp -(cuss inhibit-startup-screen t - "Don't show Emacs' startup buffer.") + #+begin_src emacs-lisp + (cuss inhibit-startup-screen t + "Don't show Emacs' startup buffer.") -(cuss initial-buffer-choice t - "Start with *scratch*.") + (cuss initial-buffer-choice t + "Start with *scratch*.") -(cuss initial-scratch-message "" - "Empty *scratch* buffer.") -#+END_SRC + (cuss initial-scratch-message "" + "Empty *scratch* buffer.") + #+end_src **** COMMENT Focus and move buffers directionally -Commented for now because I really need to figure out the keybindings I want to use for this. The real issue is the collisions between Org-mode, Windows, and Emacs’ normal bindings. - -#+begin_src emacs-lisp - ;; change focus - ;; for more on `ignore-error-wrapper', see - ;; https://www.emacswiki.org/emacs/WindMove#h5o-3 - (defun ignore-error-wrapper (fn) - "Funtion return new function that ignore errors. - The function wraps a function with `ignore-errors' macro." - (lexical-let ((fn fn)) - (lambda () - (interactive) - (ignore-errors - (funcall fn))))) + Commented for now because I really need to figure out the keybindings I want to use for this. The real issue is the collisions between Org-mode, Windows, and Emacs’ normal bindings. - (global-set-key [S-left] (ignore-error-wrapper 'windmove-left)) - (global-set-key [S-right] (ignore-error-wrapper 'windmove-right)) - (global-set-key [S-up] (ignore-error-wrapper 'windmove-up)) - (global-set-key [S-down] (ignore-error-wrapper 'windmove-down)) - - ;; shift buffers - (straight-use-package 'buffer-move) - - (global-set-key (kbd "") 'buf-move-up) - (global-set-key (kbd "") 'buf-move-down) - (global-set-key (kbd "") 'buf-move-left) - (global-set-key (kbd "") 'buf-move-right) -#+end_src + #+begin_src emacs-lisp + ;; change focus + ;; for more on `ignore-error-wrapper', see + ;; https://www.emacswiki.org/emacs/WindMove#h5o-3 + (defun ignore-error-wrapper (fn) + "Funtion return new function that ignore errors. + The function wraps a function with `ignore-errors' macro." + (lexical-let ((fn fn)) + (lambda () + (interactive) + (ignore-errors + (funcall fn))))) + + (global-set-key [S-left] (ignore-error-wrapper 'windmove-left)) + (global-set-key [S-right] (ignore-error-wrapper 'windmove-right)) + (global-set-key [S-up] (ignore-error-wrapper 'windmove-up)) + (global-set-key [S-down] (ignore-error-wrapper 'windmove-down)) + + ;; shift buffers + (straight-use-package 'buffer-move) + + (global-set-key (kbd "") 'buf-move-up) + (global-set-key (kbd "") 'buf-move-down) + (global-set-key (kbd "") 'buf-move-left) + (global-set-key (kbd "") 'buf-move-right) + #+end_src **** Kill the current buffer @@ -386,160 +386,175 @@ Commented for now because I really need to figure out the keybindings I want to **** Smart mode line - #+BEGIN_SRC emacs-lisp - (straight-use-package 'smart-mode-line) + #+begin_src emacs-lisp + (straight-use-package 'smart-mode-line) - (cuss sml/no-confirm-load-theme t - "Pass the NO-CONFIRM flag to `load-theme'.") + (cuss sml/no-confirm-load-theme t + "Pass the NO-CONFIRM flag to `load-theme'.") - (sml/setup) - #+END_SRC + (sml/setup) + #+end_src **** Rich minority - Since this /comes/ with smart mode line, I’m just going to use it, - instead of =diminish= or another package. I do have to write this - helper function, though, to add things to the whitelist. + Since this /comes/ with smart mode line, I’m just going to use it, + instead of =diminish= or another package. I do have to write this + helper function, though, to add things to the whitelist. - #+BEGIN_SRC emacs-lisp - (defun rm/whitelist-add (regexp) - "Add a REGEXP to the whitelist for `rich-minority'." - (if (listp 'rm--whitelist-regexps) - (add-to-list 'rm--whitelist-regexps regexp) - (setq rm--whitelist-regexps `(,regexp))) - (setq rm-whitelist - (mapconcat 'identity rm--whitelist-regexps "\\|"))) + #+begin_src emacs-lisp + (defun rm/whitelist-add (regexp) + "Add a REGEXP to the whitelist for `rich-minority'." + (if (listp 'rm--whitelist-regexps) + (add-to-list 'rm--whitelist-regexps regexp) + (setq rm--whitelist-regexps `(,regexp))) + (setq rm-whitelist + (mapconcat 'identity rm--whitelist-regexps "\\|"))) - (straight-use-package 'rich-minority) + (straight-use-package 'rich-minority) - (rm/whitelist-add "^$") - #+END_SRC + (rm/whitelist-add "^$") + #+end_src *** Theme **** Modus Themes -#+BEGIN_SRC emacs-lisp -(straight-use-package 'modus-themes) - -(cuss modus-themes-slanted-constructs t - "Use more slanted constructs.") -(cuss modus-themes-bold-constructs t - "Use more bold constructs.") - -(cuss modus-themes-region 'bg-only - "Only highlight the background of the selected region.") - -(cuss modus-themes-org-blocks 'grayscale - "Show org-blocks with a grayscale background.") -(cuss modus-themes-headings - '((1 . line) - (t . t)) - "Highlight top headings with `line' style, and others by default.") - -(cuss modus-themes-scale-headings t - "Scale headings by the ratios below.") -(cuss modus-themes-scale-1 1.1) -(cuss modus-themes-scale-2 1.15) -(cuss modus-themes-scale-3 1.21) -(cuss modus-themes-scale-4 1.27) -(cuss modus-themes-scale-5 1.33) - -(load-theme 'modus-operandi t) -#+END_SRC + #+begin_src emacs-lisp + (straight-use-package 'modus-themes) + + (cuss modus-themes-slanted-constructs t + "Use more slanted constructs.") + (cuss modus-themes-bold-constructs t + "Use more bold constructs.") + + (cuss modus-themes-region 'bg-only + "Only highlight the background of the selected region.") + + (cuss modus-themes-org-blocks 'grayscale + "Show org-blocks with a grayscale background.") + (cuss modus-themes-headings + '((1 . line) + (t . t)) + "Highlight top headings with `line' style, and others by default.") + + (cuss modus-themes-scale-headings t + "Scale headings by the ratios below.") + (cuss modus-themes-scale-1 1.1) + (cuss modus-themes-scale-2 1.15) + (cuss modus-themes-scale-3 1.21) + (cuss modus-themes-scale-4 1.27) + (cuss modus-themes-scale-5 1.33) + + (load-theme 'modus-operandi t) + #+end_src **** Change themes based on time of day -#+BEGIN_SRC emacs-lisp - (cuss calendar-latitude 30.4515) - (cuss calendar-longitude -91.1871) - - ;; sunrise - (run-at-time (nth 1 (split-string (sunrise-sunset))) - (* 60 60 24) - (lambda () - (modus-themes-load-operandi))) - - ;; sunset - (run-at-time (nth 4 (split-string (sunrise-sunset))) - (* 60 60 24) - (lambda () - (modus-themes-load-vivendi))) -#+END_SRC + #+begin_src emacs-lisp + (cuss calendar-latitude 30.4515) + (cuss calendar-longitude -91.1871) + + (defun acdw/run-with-sun (sunrise-command sunset-command) + "Run commands at sunrise and sunset." + (let* ((times-regex (rx (* nonl) + (: (any ?s ?S) "unrise") " " + (group (repeat 1 2 digit) ":" + (repeat 1 2 digit) + (: (any ?a ?A ?p ?P) (any ?m ?M))) + (* nonl) + (: (any ?s ?S) "unset") " " + (group (repeat 1 2 digit) ":" + (repeat 1 2 digit) + (: (any ?a ?A ?p ?P) (any ?m ?M))) + (* nonl))) + (ss (sunrise-sunset)) + (m_ (string-match times-regex ss)) + (sunrise-time (match-string 1 ss)) + (sunset-time (match-string 2 ss))) + (run-at-time sunrise-time (* 60 60 24) sunrise-command) + (run-at-time sunset-time (* 60 60 24) sunset-command))) + + (acdw/run-with-sun #'modus-themes-load-operandi #'modus-themes-load-vivendi) + #+end_src *** Fonts **** Define fonts -#+BEGIN_SRC emacs-lisp - (defun set-face-from-alternatives (face frame &rest fontspecs) - "Set FACE on FRAME from first available spec from FONTSPECS. - FACE and FRAME work the same as with `set-face-attribute.'" - (catch :return - (dolist (spec fontspecs) - (when-let ((found (find-font (apply #'font-spec spec)))) - (set-face-attribute face frame :font found) - (throw :return found))))) - - (defun acdw/setup-fonts () - "Setup fonts. This has to happen after the frame is setup for - the first time, so it should be added to `window-setup-hook'. It - removes itself from that hook." - (interactive) - (when (display-graphic-p) - (dolist (face '(default fixed-pitch)) - ;; fixed-pitch /is/ the default - (set-face-from-alternatives face nil - '(:family "Input Mono" - :weight normal - :height 110) - '(:family "Go Mono" - :weight normal - :height 100) - '(:family "Consolas" - :weight normal - :height 100))) - ;; variable-pitch is different - (set-face-from-alternatives 'variable-pitch nil - '(:family "Input Sans" - :weight normal) - '(:family "Georgia" - :weight normal))) - - ;; remove myself from the hook - (remove-function after-focus-change-function #'acdw/setup-fonts)) - - (add-function :before after-focus-change-function #'acdw/setup-fonts) -#+END_SRC + #+begin_src emacs-lisp + (defun set-face-from-alternatives (face frame &rest fontspecs) + "Set FACE on FRAME from first available spec from FONTSPECS. + FACE and FRAME work the same as with `set-face-attribute.'" + (catch :return + (dolist (spec fontspecs) + (when-let ((found (find-font (apply #'font-spec spec)))) + (set-face-attribute face frame :font found) + (throw :return found))))) + + (defun acdw/setup-fonts () + "Setup fonts. This has to happen after the frame is setup for + the first time, so it should be added to `window-setup-hook'. It + removes itself from that hook." + (interactive) + (when (display-graphic-p) + (dolist (face '(default fixed-pitch)) + ;; fixed-pitch /is/ the default + (set-face-from-alternatives face nil + '(:family "Input Mono" + :slant normal + :weight normal + :height 110) + '(:family "Go Mono" + :slant normal + :weight normal + :height 100) + '(:family "Consolas" + :slant normal + :weight normal + :height 100))) + ;; variable-pitch is different + (set-face-from-alternatives 'variable-pitch nil + '(:family "Input Sans" + :slant normal + :weight normal) + '(:family "Georgia" + :slant normal + :weight normal))) + + ;; remove myself from the hook + (remove-function after-focus-change-function #'acdw/setup-fonts)) + + (add-function :before after-focus-change-function #'acdw/setup-fonts) + #+end_src **** Custom faces -#+begin_src emacs-lisp - (cussface '(font-lock-comment-face - ((t (:inherit (custom-comment italic variable-pitch)))))) -#+end_src + #+begin_src emacs-lisp + (cussface '(font-lock-comment-face + ((t (:inherit (custom-comment italic variable-pitch)))))) + #+end_src **** Line spacing -#+BEGIN_SRC emacs-lisp -(cuss line-spacing 0.1 - "Add 10% extra space below each line.") -#+END_SRC + #+begin_src emacs-lisp + (cuss line-spacing 0.1 + "Add 10% extra space below each line.") + #+end_src **** Underlines -#+begin_src emacs-lisp - (cuss x-underline-at-descent-line t - "Draw the underline at the same place as the descent line.") -#+end_src + #+begin_src emacs-lisp + (cuss x-underline-at-descent-line t + "Draw the underline at the same place as the descent line.") + #+end_src **** Unicode Fonts - #+BEGIN_SRC emacs-lisp - (straight-use-package 'unicode-fonts) - (require 'unicode-fonts) - (unicode-fonts-setup) - #+END_SRC + #+begin_src emacs-lisp + (straight-use-package 'unicode-fonts) + (require 'unicode-fonts) + (unicode-fonts-setup) + #+end_src ** Interactivity @@ -547,173 +562,169 @@ Commented for now because I really need to figure out the keybindings I want to **** Shadow file names in =completing-read=. - #+BEGIN_SRC emacs-lisp - (cuss file-name-shadow-properties '(invisible t)) + #+begin_src emacs-lisp + (cuss file-name-shadow-properties '(invisible t)) - (file-name-shadow-mode +1) - #+END_SRC + (file-name-shadow-mode +1) + #+end_src **** Ignore case in =completing-read= - #+BEGIN_SRC emacs-lisp - (cuss completion-ignore-case t) - (cuss read-buffer-completion-ignore-case t) - (cuss read-file-name-completion-ignore-case t) - #+END_SRC + #+begin_src emacs-lisp + (cuss completion-ignore-case t) + (cuss read-buffer-completion-ignore-case t) + (cuss read-file-name-completion-ignore-case t) + #+end_src **** Minibuffer recursivity -#+begin_src emacs-lisp - (cuss enable-recursive-minibuffers t) - (minibuffer-depth-indicate-mode +1) -#+end_src + #+begin_src emacs-lisp + (cuss enable-recursive-minibuffers t) + (minibuffer-depth-indicate-mode +1) + #+end_src **** Selectrum - #+BEGIN_SRC emacs-lisp - (straight-use-package 'selectrum) - (require 'selectrum) - (selectrum-mode +1) - #+END_SRC + #+begin_src emacs-lisp + (straight-use-package 'selectrum) + (require 'selectrum) + (selectrum-mode +1) + #+end_src **** Prescient - #+BEGIN_SRC emacs-lisp - (straight-use-package 'prescient) - (require 'prescient) - (prescient-persist-mode +1) + #+begin_src emacs-lisp + (straight-use-package 'prescient) + (require 'prescient) + (prescient-persist-mode +1) - (straight-use-package 'selectrum-prescient) - (require 'selectrum-prescient) - (selectrum-prescient-mode +1) - #+END_SRC + (straight-use-package 'selectrum-prescient) + (require 'selectrum-prescient) + (selectrum-prescient-mode +1) + #+end_src **** Consult - #+BEGIN_SRC emacs-lisp - (straight-use-package '(consult - :host github - :repo "minad/consult")) - (require 'consult) - - (straight-use-package '(consult-selectrum - :host github - :repo "minad/consult")) - (require 'consult-selectrum) - - (with-eval-after-load 'consult - (define-key ctl-x-map "b" #'consult-buffer) - (define-key ctl-x-map (kbd "C-r") #'consult-buffer) - (define-key ctl-x-map "4b" #'consult-buffer-other-window) - (define-key ctl-x-map "5b" #'consult-buffer-other-frame) - - (define-key goto-map "o" #'consult-outline) - (define-key goto-map "g" #'consult-line) - (define-key goto-map (kbd "M-g") #'consult-line) - (define-key goto-map "l" #'consult-line) - (define-key goto-map "m" #'consult-mark) - (define-key goto-map "i" #'consult-imenu) - (define-key goto-map "e" #'consult-error) - - (global-set-key (kbd "M-y") #'consult-yank-pop) - - (define-key help-map "a" #'consult-apropos) - - (fset 'multi-occur #'consult-multi-occur)) - #+END_SRC + #+begin_src emacs-lisp + (straight-use-package '(consult + :host github + :repo "minad/consult" + :files (:defaults "consult-pkg.el"))) + (require 'consult) + + (with-eval-after-load 'consult + (define-key ctl-x-map "b" #'consult-buffer) + (define-key ctl-x-map (kbd "C-r") #'consult-buffer) + (define-key ctl-x-map "4b" #'consult-buffer-other-window) + (define-key ctl-x-map "5b" #'consult-buffer-other-frame) + + (define-key goto-map "o" #'consult-outline) + (define-key goto-map "g" #'consult-line) + (define-key goto-map (kbd "M-g") #'consult-line) + (define-key goto-map "l" #'consult-line) + (define-key goto-map "m" #'consult-mark) + (define-key goto-map "i" #'consult-imenu) + (define-key goto-map "e" #'consult-error) + + (global-set-key (kbd "M-y") #'consult-yank-pop) + + (define-key help-map "a" #'consult-apropos) + + (fset 'multi-occur #'consult-multi-occur)) + #+end_src **** Marginalia - #+BEGIN_SRC emacs-lisp - (straight-use-package '(marginalia - :host github - :repo "minad/marginalia" - :branch "main")) + #+begin_src emacs-lisp + (straight-use-package '(marginalia + :host github + :repo "minad/marginalia" + :branch "main")) - (cuss marginalia-annotators - '(marginalia-annotators-heavy - marginalia-annotators-light)) + (cuss marginalia-annotators + '(marginalia-annotators-heavy + marginalia-annotators-light)) - (marginalia-mode +1) - #+END_SRC + (marginalia-mode +1) + #+end_src **** COMMENT Ido -[[https://wandersoncferreira.github.io/blog/ido/][Let’s try this out]]. - -#+begin_src emacs-lisp - (defun ido-choose-from-recentf () - "Use ido to select recently visited files." - (interactive) - (find-file (ido-completing-read "Open file: " recentf-list nil t))) - - (defun bk/go-straight-home () - (interactive) - (cond - ((looking-back "~/") (insert "projects/")) - ((looking-back "/") (insert "~/")) - (:else (call-interactively 'self-insert-command)))) - - (defun ido-disable-line-truncation () - (set (make-local-variable 'truncate-lines) nil)) - - (defun ido-define-keys () - (define-key ido-completion-map (kbd "C-n") 'ido-next-match) - (define-key ido-completion-map (kbd "C-p") 'ido-prev-match)) - - (setq ido-enable-flex-matching t - ido-use-filename-at-point nil - ido-create-new-buffer 'always - confirm-nonexistent-file-or-buffer nil - completion-ignored-extensions (cons "*.aux" completion-ignored-extensions) - max-mini-window-height 0.5 - ido-enable-tramp-completion t - ido-auto-merge-work-directories-length -1 - ido-confirm-unique-completion t - ido-default-file-method 'selected-window - ido-case-fold t - ido-show-dot-for-dired t - ido-everywhere t - ido-ignore-buffers (list (rx (or (and bos " ") - (and bos - (or "*Completions*" - "*Compile-Log*" - "*Ido Completions*" - "*Shell Command Output*" - "*vc-diff*") - eos)))) - ido-decorations (quote ("\n-> " "" "\n " "\n ..." "[" "]" " - [No match]" " [Matched]" " [Not readable]" " [Too big]" " - [Confirm]"))) - - (with-eval-after-load 'ido - (define-key ido-common-completion-map (kbd "M-SPC") 'just-one-space) - (define-key ido-common-completion-map (kbd "SPC") 'self-insert-command) - (define-key ido-file-completion-map (kbd "~") 'bk/go-straight-home) - - (add-hook 'ido-setup-hook 'ido-define-keys) - - (add-hook 'ido-minibuffer-setup-hook 'ido-disable-line-truncation) - - (set-default 'imenu-auto-rescan t) - - (add-to-list 'ido-ignore-directories "target") - (add-to-list 'ido-ignore-directories "node_modules") - ) - - (defun setup-ido-mode () - (require 'ido) - (ido-mode +1) - (ido-everywhere +1)) - - (add-hook 'after-init-hook #'setup-ido-mode) -#+end_src + [[https://wandersoncferreira.github.io/blog/ido/][Let’s try this out]]. + + #+begin_src emacs-lisp + (defun ido-choose-from-recentf () + "Use ido to select recently visited files." + (interactive) + (find-file (ido-completing-read "Open file: " recentf-list nil t))) + + (defun bk/go-straight-home () + (interactive) + (cond + ((looking-back "~/") (insert "projects/")) + ((looking-back "/") (insert "~/")) + (:else (call-interactively 'self-insert-command)))) + + (defun ido-disable-line-truncation () + (set (make-local-variable 'truncate-lines) nil)) + + (defun ido-define-keys () + (define-key ido-completion-map (kbd "C-n") 'ido-next-match) + (define-key ido-completion-map (kbd "C-p") 'ido-prev-match)) + + (setq ido-enable-flex-matching t + ido-use-filename-at-point nil + ido-create-new-buffer 'always + confirm-nonexistent-file-or-buffer nil + completion-ignored-extensions (cons "*.aux" completion-ignored-extensions) + max-mini-window-height 0.5 + ido-enable-tramp-completion t + ido-auto-merge-work-directories-length -1 + ido-confirm-unique-completion t + ido-default-file-method 'selected-window + ido-case-fold t + ido-show-dot-for-dired t + ido-everywhere t + ido-ignore-buffers (list (rx (or (and bos " ") + (and bos + (or "*Completions*" + "*Compile-Log*" + "*Ido Completions*" + "*Shell Command Output*" + "*vc-diff*") + eos)))) + ido-decorations (quote ("\n-> " "" "\n " "\n ..." "[" "]" " + [No match]" " [Matched]" " [Not readable]" " [Too big]" " + [Confirm]"))) + + (with-eval-after-load 'ido + (define-key ido-common-completion-map (kbd "M-SPC") 'just-one-space) + (define-key ido-common-completion-map (kbd "SPC") 'self-insert-command) + (define-key ido-file-completion-map (kbd "~") 'bk/go-straight-home) + + (add-hook 'ido-setup-hook 'ido-define-keys) + + (add-hook 'ido-minibuffer-setup-hook 'ido-disable-line-truncation) + + (set-default 'imenu-auto-rescan t) + + (add-to-list 'ido-ignore-directories "target") + (add-to-list 'ido-ignore-directories "node_modules") + ) + + (defun setup-ido-mode () + (require 'ido) + (ido-mode +1) + (ido-everywhere +1)) + + (add-hook 'after-init-hook #'setup-ido-mode) + #+end_src *** Completion -#+begin_src emacs-lisp - (global-set-key (kbd "M-/") #'hippie-expand) -#+end_src + #+begin_src emacs-lisp + (global-set-key (kbd "M-/") #'hippie-expand) + #+end_src *** Garbage collection @@ -734,23 +745,23 @@ Commented for now because I really need to figure out the keybindings I want to *** =ESC= cancels all -#+BEGIN_SRC emacs-lisp -(global-set-key (kbd "") #'keyboard-escape-quit) -#+END_SRC + #+begin_src emacs-lisp + (global-set-key (kbd "") #'keyboard-escape-quit) + #+end_src *** Personal prefix key: =C-z= -#+BEGIN_SRC emacs-lisp -(defvar acdw/map - (let ((map (make-sparse-keymap)) - (c-z (global-key-binding "\C-z"))) - (global-unset-key "\C-z") - (define-key global-map "\C-z" map) - (define-key map "\C-z" c-z) - map)) - -(run-hooks 'acdw/map-defined-hook) -#+END_SRC + #+begin_src emacs-lisp + (defvar acdw/map + (let ((map (make-sparse-keymap)) + (c-z (global-key-binding "\C-z"))) + (global-unset-key "\C-z") + (define-key global-map "\C-z" map) + (define-key map "\C-z" c-z) + map)) + + (run-hooks 'acdw/map-defined-hook) + #+end_src *** Show keybindings @@ -763,107 +774,107 @@ Commented for now because I really need to figure out the keybindings I want to *** Preserve screen position when scrolling with the mouse wheel -from [[https://www.reddit.com/r/emacs/comments/km9by4/weekly_tipstricketc_thread/ghg2c9d/][u/TheFrenchPoulp]]. + from [[https://www.reddit.com/r/emacs/comments/km9by4/weekly_tipstricketc_thread/ghg2c9d/][u/TheFrenchPoulp]]. -#+BEGIN_SRC emacs-lisp - (advice-add 'mwheel-scroll :around #'me/mwheel-scroll) + #+begin_src emacs-lisp + (advice-add 'mwheel-scroll :around #'me/mwheel-scroll) - (defun me/mwheel-scroll (original &rest arguments) - "Like `mwheel-scroll' but preserve screen position. - See `scroll-preserve-screen-position'." - (let ((scroll-preserve-screen-position :always)) - (apply original arguments))) -#+end_src + (defun me/mwheel-scroll (original &rest arguments) + "Like `mwheel-scroll' but preserve screen position. + See `scroll-preserve-screen-position'." + (let ((scroll-preserve-screen-position :always)) + (apply original arguments))) + #+end_src ** Persistence *** Minibuffer history -#+BEGIN_SRC emacs-lisp -(require 'savehist) + #+begin_src emacs-lisp + (require 'savehist) -(cuss savehist-additional-variables - '(kill-ring - search-ring - regexp-search-ring) - "Other variables to save alongside the minibuffer history.") + (cuss savehist-additional-variables + '(kill-ring + search-ring + regexp-search-ring) + "Other variables to save alongside the minibuffer history.") -(cuss history-length t - "Don't truncate history.") + (cuss history-length t + "Don't truncate history.") -(cuss history-delete-duplicates t - "Delete history duplicates.") + (cuss history-delete-duplicates t + "Delete history duplicates.") -(savehist-mode +1) -#+END_SRC + (savehist-mode +1) + #+end_src *** File places -#+BEGIN_SRC emacs-lisp -(require 'saveplace) ; this isn't required, but ... I like having it here + #+begin_src emacs-lisp + (require 'saveplace) ; this isn't required, but ... I like having it here -(cuss save-place-forget-unreadable-files t - "Don't check if files are readable or not.") + (cuss save-place-forget-unreadable-files t + "Don't check if files are readable or not.") -(save-place-mode +1) -#+END_SRC + (save-place-mode +1) + #+end_src *** Recent files -#+BEGIN_SRC emacs-lisp - (require 'recentf) + #+begin_src emacs-lisp + (require 'recentf) - (cuss recentf-max-menu-items 100 - "The maximum number of items in the recentf menu.") - (cuss recentf-max-saved-items nil - "Don't limit the number of recent files.") + (cuss recentf-max-menu-items 100 + "The maximum number of items in the recentf menu.") + (cuss recentf-max-saved-items nil + "Don't limit the number of recent files.") - (with-eval-after-load 'no-littering - (add-to-list 'recentf-exclude no-littering-var-directory) - (add-to-list 'recentf-exclude no-littering-etc-directory)) + (with-eval-after-load 'no-littering + (add-to-list 'recentf-exclude no-littering-var-directory) + (add-to-list 'recentf-exclude no-littering-etc-directory)) - (recentf-mode +1) + (recentf-mode +1) - ;; save recentf list when focusing away - (defun acdw/maybe-save-recentf () - "Save `recentf-file' when out of focus, but only if we haven't - in five minutes." - (defvar recentf-last-save (time-convert nil 'integer) - "How long it's been since we last saved the recentf list.") + ;; save recentf list when focusing away + (defun acdw/maybe-save-recentf () + "Save `recentf-file' when out of focus, but only if we haven't + in five minutes." + (defvar recentf-last-save (time-convert nil 'integer) + "How long it's been since we last saved the recentf list.") - (when (> (time-convert (time-since recentf-last-save) 'integer) - (* 60 5)) - (setq recentf-last-save (time-convert nil 'integer)) - (acdw/when-unfocused #'recentf-save-list))) + (when (> (time-convert (time-since recentf-last-save) 'integer) + (* 60 5)) + (setq recentf-last-save (time-convert nil 'integer)) + (acdw/when-unfocused #'recentf-save-list))) - (add-function :after after-focus-change-function - #'acdw/maybe-save-recentf) -#+END_SRC + (add-function :after after-focus-change-function + #'acdw/maybe-save-recentf) + #+end_src ** Undo -#+BEGIN_SRC emacs-lisp -(straight-use-package 'undo-fu) -(require 'undo-fu) + #+begin_src emacs-lisp + (straight-use-package 'undo-fu) + (require 'undo-fu) -(global-set-key (kbd "C-/") #'undo-fu-only-undo) -(global-set-key (kbd "C-?") #'undo-fu-only-redo) + (global-set-key (kbd "C-/") #'undo-fu-only-undo) + (global-set-key (kbd "C-?") #'undo-fu-only-redo) -(straight-use-package 'undo-fu-session) -(require 'undo-fu-session) + (straight-use-package 'undo-fu-session) + (require 'undo-fu-session) -(cuss undo-fu-session-incompatible-files - '("/COMMIT_EDITMSG\\'" - "/git-rebase-todo\\'") - "A list of files that are incompatible with the concept of undo sessions.") + (cuss undo-fu-session-incompatible-files + '("/COMMIT_EDITMSG\\'" + "/git-rebase-todo\\'") + "A list of files that are incompatible with the concept of undo sessions.") -(with-eval-after-load 'no-littering - (let ((dir (no-littering-expand-var-file-name "undos"))) - (make-directory dir 'parents) - (cuss undo-fu-session-directory dir))) + (with-eval-after-load 'no-littering + (let ((dir (no-littering-expand-var-file-name "undos"))) + (make-directory dir 'parents) + (cuss undo-fu-session-directory dir))) -(global-undo-fu-session-mode +1) -#+END_SRC + (global-undo-fu-session-mode +1) + #+end_src ** Files @@ -871,101 +882,109 @@ from [[https://www.reddit.com/r/emacs/comments/km9by4/weekly_tipstricketc_thread **** UTF-8 - #+BEGIN_SRC emacs-lisp - (set-language-environment "UTF-8") - (set-terminal-coding-system 'utf-8) - (cuss locale-coding-system 'utf-8) - (set-default-coding-systems 'utf-8) - (set-selection-coding-system 'utf-8) - (prefer-coding-system 'utf-8) - #+END_SRC + from [[https://www.masteringemacs.org/article/working-coding-systems-unicode-emacs][Mastering Emacs]]. + + #+begin_src emacs-lisp + (prefer-coding-system 'utf-8) + (set-default-coding-systems 'utf-8) + (set-terminal-coding-system 'utf-8) + (set-keyboard-coding-system 'utf-8) + ;; backwards compatibility: + ;; `default-buffer-file-coding-system' is deprecated in 23.2. + (if (boundp 'buffer-file-coding-system) + (setq-default buffer-file-coding-system 'utf-8) + (setq default-buffer-file-coding-system 'utf-8)) + + ;; Treat clipboard as UTF-8 string first; compound text next, etc. + (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)) + #+end_src **** Convert all files to UNIX-style line endings - from [[https://www.emacswiki.org/emacs/EndOfLineTips][Emacs Wiki]]. + from [[https://www.emacswiki.org/emacs/EndOfLineTips][Emacs Wiki]]. - #+BEGIN_SRC emacs-lisp - (defun ewiki/no-junk-please-were-unixish () - "Convert line endings to UNIX, dammit." - (let ((coding-str (symbol-name buffer-file-coding-system))) - (when (string-match "-\\(?:dos\\|mac\\)$" coding-str) - (set-buffer-file-coding-system 'unix)))) - #+END_SRC + #+begin_src emacs-lisp + (defun ewiki/no-junk-please-were-unixish () + "Convert line endings to UNIX, dammit." + (let ((coding-str (symbol-name buffer-file-coding-system))) + (when (string-match "-\\(?:dos\\|mac\\)$" coding-str) + (set-buffer-file-coding-system 'unix)))) + #+end_src - I add it to the ~find-file-hook~ /and/ ~before-save-hook~ because I - don't want to ever work with anything other than UNIX line endings - ever again. I just don't care. Even Microsoft Notepad can handle - UNIX line endings, so I don't want to hear it. + I add it to the ~find-file-hook~ /and/ ~before-save-hook~ because I + don't want to ever work with anything other than UNIX line endings + ever again. I just don't care. Even Microsoft Notepad can handle + UNIX line endings, so I don't want to hear it. - #+BEGIN_SRC emacs-lisp - (add-hook 'find-file-hook #'ewiki/no-junk-please-were-unixish) - (add-hook 'before-save-hook #'ewiki/no-junk-please-were-unixish) - #+END_SRC + #+begin_src emacs-lisp + (add-hook 'find-file-hook #'ewiki/no-junk-please-were-unixish) + (add-hook 'before-save-hook #'ewiki/no-junk-please-were-unixish) + #+end_src *** Backups -#+BEGIN_SRC emacs-lisp - (cuss backup-by-copying 1) - (cuss delete-old-versions -1) - (cuss version-control t) - (cuss vc-make-backup-files t) - - (with-eval-after-load 'no-littering - (let ((dir (no-littering-expand-var-file-name "backup"))) - (make-directory dir 'parents) - (cuss backup-directory-alist - `((".*" . ,dir))))) -#+END_SRC + #+begin_src emacs-lisp + (cuss backup-by-copying 1) + (cuss delete-old-versions -1) + (cuss version-control t) + (cuss vc-make-backup-files t) + + (with-eval-after-load 'no-littering + (let ((dir (no-littering-expand-var-file-name "backup"))) + (make-directory dir 'parents) + (cuss backup-directory-alist + `((".*" . ,dir))))) + #+end_src *** Auto-saves -#+BEGIN_SRC emacs-lisp - (with-eval-after-load 'no-littering - (let ((dir (no-littering-expand-var-file-name "autosaves"))) - (make-directory dir 'parents) - (cuss auto-save-file-name-transforms - `((".*" ,dir t)))) + #+begin_src emacs-lisp + (with-eval-after-load 'no-littering + (let ((dir (no-littering-expand-var-file-name "autosaves"))) + (make-directory dir 'parents) + (cuss auto-save-file-name-transforms + `((".*" ,dir t)))) - (auto-save-mode +1)) -#+END_SRC + (auto-save-mode +1)) + #+end_src *** Super-save -Because I like /overkill/, or at least … over-/saving/. + Because I like /overkill/, or at least … over-/saving/. -#+BEGIN_SRC emacs-lisp - (straight-use-package 'super-save) + #+begin_src emacs-lisp + (straight-use-package 'super-save) - (cuss super-save-remote-files nil - "Don't super-save remote files.") + (cuss super-save-remote-files nil + "Don't super-save remote files.") - (cuss super-save-exclude '(".gpg") - "Ignore these files when saving.") + (cuss super-save-exclude '(".gpg") + "Ignore these files when saving.") - (super-save-mode +1) -#+end_src + (super-save-mode +1) + #+end_src *** Auto-revert buffers to files on disk -#+BEGIN_SRC emacs-lisp -(global-auto-revert-mode +1) -#+END_SRC + #+begin_src emacs-lisp + (global-auto-revert-mode +1) + #+end_src *** Add a timestamp to files -#+BEGIN_SRC emacs-lisp -(add-hook 'before-save-hook #'time-stamp) -#+END_SRC + #+begin_src emacs-lisp + (add-hook 'before-save-hook #'time-stamp) + #+end_src *** Require a final new line -#+BEGIN_SRC emacs-lisp -(cuss require-final-newline t) -#+END_SRC + #+begin_src emacs-lisp + (cuss require-final-newline t) + #+end_src *** Edit files with =sudo= - #+BEGIN_SRC emacs-lisp + #+begin_src emacs-lisp (straight-use-package 'sudo-edit) (with-eval-after-load 'sudo-edit @@ -974,72 +993,72 @@ Because I like /overkill/, or at least … over-/saving/. **** Don’t add =/sudo:= files to =recentf=, though -I’ve pretty much cribbed this from [[https://github.com/ncaq/recentf-remove-sudo-tramp-prefix/][recentf-remove-sudo-tramp-prefix]] – it’s a small enough package that I can just include it completely here. - -#+BEGIN_SRC emacs-lisp - (defun recentf-remove-sudo-tramp-prefix (path) - "Remove sudo from PATH." - (require 'tramp) - (if (tramp-tramp-file-p path) - (let ((tx (tramp-dissect-file-name path))) - (if (string-equal "sudo" (tramp-file-name-method tx)) - (tramp-file-name-localname tx) - path)) - path)) - - (defun recentf-remove-sudo-tramp-prefix-from-recentf-list () - (require 'recentf) - (setq recentf-list - (mapcar #'recentf-remove-sudo-tramp-prefix recentf-list))) + I’ve pretty much cribbed this from [[https://github.com/ncaq/recentf-remove-sudo-tramp-prefix/][recentf-remove-sudo-tramp-prefix]] – it’s a small enough package that I can just include it completely here. - (advice-add 'recentf-cleanup - :before #'recentf-remove-sudo-tramp-prefix-from-recentf-list) -#+end_src + #+begin_src emacs-lisp + (defun recentf-remove-sudo-tramp-prefix (path) + "Remove sudo from PATH." + (require 'tramp) + (if (tramp-tramp-file-p path) + (let ((tx (tramp-dissect-file-name path))) + (if (string-equal "sudo" (tramp-file-name-method tx)) + (tramp-file-name-localname tx) + path)) + path)) + + (defun recentf-remove-sudo-tramp-prefix-from-recentf-list () + (require 'recentf) + (setq recentf-list + (mapcar #'recentf-remove-sudo-tramp-prefix recentf-list))) + + (advice-add 'recentf-cleanup + :before #'recentf-remove-sudo-tramp-prefix-from-recentf-list) + #+end_src ** Text editing *** Operate visually on lines -#+BEGIN_SRC emacs-lisp -(global-visual-line-mode +1) -#+END_SRC + #+begin_src emacs-lisp + (global-visual-line-mode +1) + #+end_src *** View long lines like filled lines in the beginning - #+BEGIN_SRC emacs-lisp + #+begin_src emacs-lisp (straight-use-package 'adaptive-wrap) (adaptive-wrap-prefix-mode +1) #+end_src *** Stay snappy with long-lined files -#+BEGIN_SRC emacs-lisp -(when (fboundp 'global-so-long-mode) - (global-so-long-mode +1)) -#+END_SRC + #+begin_src emacs-lisp + (when (fboundp 'global-so-long-mode) + (global-so-long-mode +1)) + #+end_src *** Killing & Yanking **** Replace selection when typing -#+BEGIN_SRC emacs-lisp -(delete-selection-mode +1) -#+END_SRC + #+begin_src emacs-lisp + (delete-selection-mode +1) + #+end_src **** Work better with the system clipboard -#+BEGIN_SRC emacs-lisp -(cuss save-interprogram-paste-before-kill t - "Save existing clipboard text into the kill ring before - replacing it.") + #+begin_src emacs-lisp + (cuss save-interprogram-paste-before-kill t + "Save existing clipboard text into the kill ring before + replacing it.") -(cuss yank-pop-change-selection t - "Update the X selection when rotating the kill ring.") -#+END_SRC + (cuss yank-pop-change-selection t + "Update the X selection when rotating the kill ring.") + #+end_src **** Don’t append the same thing twice to the kill-ring - #+BEGIN_SRC emacs-lisp + #+begin_src emacs-lisp (cuss kill-do-not-save-duplicates t) #+end_src @@ -1047,33 +1066,33 @@ I’ve pretty much cribbed this from [[https://github.com/ncaq/recentf-remove-su **** COMMENT Search with CtrlF -For right now, I’m /just/ using Anzu – I don’t like parts of =isearch= but … CtrlF doesn’t match with that sweet replace flow. + For right now, I’m /just/ using Anzu – I don’t like parts of =isearch= but … CtrlF doesn’t match with that sweet replace flow. -#+begin_src emacs-lisp - (straight-use-package 'ctrlf) - (ctrlf-mode +1) -#+end_src + #+begin_src emacs-lisp + (straight-use-package 'ctrlf) + (ctrlf-mode +1) + #+end_src **** Replace with Anzu -#+begin_src emacs-lisp - (straight-use-package 'anzu) - (require 'anzu) + #+begin_src emacs-lisp + (straight-use-package 'anzu) + (require 'anzu) - ;; show search count in the modeline - (global-anzu-mode +1) + ;; show search count in the modeline + (global-anzu-mode +1) - (cuss anzu-replace-to-string-separator " → " - "What to separate the search from the replacement.") + (cuss anzu-replace-to-string-separator " → " + "What to separate the search from the replacement.") - (global-set-key [remap query-replace] #'anzu-query-replace) - (global-set-key [remap query-replace-regexp] #'anzu-query-replace-regexp) + (global-set-key [remap query-replace] #'anzu-query-replace) + (global-set-key [remap query-replace-regexp] #'anzu-query-replace-regexp) - (define-key isearch-mode-map [remap isearch-query-replace] #'anzu-isearch-query-replace) - (define-key isearch-mode-map [remap isearch-query-replace-regexp] #'anzu-isearch-query-replace-regexp) + (define-key isearch-mode-map [remap isearch-query-replace] #'anzu-isearch-query-replace) + (define-key isearch-mode-map [remap isearch-query-replace-regexp] #'anzu-isearch-query-replace-regexp) -#+end_src + #+end_src *** Overwrite mode @@ -1122,41 +1141,41 @@ For right now, I’m /just/ using Anzu – I don’t like parts of =isearch= but ** Prettify symbols -#+begin_src emacs-lisp - (cuss prettify-symbols-unprettify-at-point 'right-edge - "Unprettify a symbol when inside it or next to it.") + #+begin_src emacs-lisp + (cuss prettify-symbols-unprettify-at-point 'right-edge + "Unprettify a symbol when inside it or next to it.") - (add-hook 'prog-mode-hook #'prettify-symbols-mode) -#+end_src + (add-hook 'prog-mode-hook #'prettify-symbols-mode) + #+end_src ** Parentheses *** Smart parentheses -#+BEGIN_SRC emacs-lisp -(straight-use-package 'smartparens) -(require 'smartparens-config) + #+begin_src emacs-lisp + (straight-use-package 'smartparens) + (require 'smartparens-config) -;; replace show-paren + ;; replace show-paren -(cuss sp-show-pair-delay 0 - "Don't delay before showing the pairs.") -(cuss sp-show-pair-from-inside t - "Highlight the enclosing pair when immediately inside.") + (cuss sp-show-pair-delay 0 + "Don't delay before showing the pairs.") + (cuss sp-show-pair-from-inside t + "Highlight the enclosing pair when immediately inside.") -(add-hook 'prog-mode-hook #'show-smartparens-mode +1) + (add-hook 'prog-mode-hook #'show-smartparens-mode +1) -;; enable strict smartparens in prog mode -(add-hook 'prog-mode-hook #'smartparens-strict-mode) -#+END_SRC + ;; enable strict smartparens in prog mode + (add-hook 'prog-mode-hook #'smartparens-strict-mode) + #+end_src ** Indent aggressively -#+BEGIN_SRC emacs-lisp -(straight-use-package 'aggressive-indent) + #+begin_src emacs-lisp + (straight-use-package 'aggressive-indent) -(global-aggressive-indent-mode +1) -#+END_SRC + (global-aggressive-indent-mode +1) + #+end_src ** Completion @@ -1198,27 +1217,29 @@ For right now, I’m /just/ using Anzu – I don’t like parts of =isearch= but *** Emacs lisp -#+BEGIN_SRC emacs-lisp -(cuss eval-expression-print-length nil - "Don't truncate printed expressions by length.") -(cuss eval-expression-print-level nil - "Don't truncate printed expressions by level.") -#+END_SRC + #+begin_src emacs-lisp + (cuss eval-expression-print-length nil + "Don't truncate printed expressions by length.") + (cuss eval-expression-print-level nil + "Don't truncate printed expressions by level.") + #+end_src *** Janet - #+BEGIN_SRC emacs-lisp + #+begin_src emacs-lisp (straight-use-package 'janet-mode) (require 'janet-mode) - (straight-use-package 'inf-janet-mode) + (straight-use-package '(inf-janet + :host github + :repo "velkyel/inf-janet")) (add-hook 'janet-mode-hook #'inf-janet-minor-mode) #+end_src *** INI - #+BEGIN_SRC emacs-lisp + #+begin_src emacs-lisp (straight-use-package 'ini-mode) (add-to-list 'auto-mode-alist @@ -1227,11 +1248,11 @@ For right now, I’m /just/ using Anzu – I don’t like parts of =isearch= but *** PHP -see also [[https://sasanidas.gitlab.io/f-site/php-development/][this post by Fermin M]], it looks really useful. + see also [[https://sasanidas.gitlab.io/f-site/php-development/][this post by Fermin M]], it looks really useful. -#+BEGIN_SRC emacs-lisp - (straight-use-package 'php-mode) -#+end_src + #+begin_src emacs-lisp + (straight-use-package 'php-mode) + #+end_src * Writing @@ -1239,64 +1260,64 @@ see also [[https://sasanidas.gitlab.io/f-site/php-development/][this post by Fer *** Fix scrolling in margins -This has to be done /before/ loading the package. It's included in =visual-fill-column=, too, but for some reason isn't loaded there. - -#+BEGIN_SRC emacs-lisp - (dolist (margin '(right-margin left-margin)) - (dolist (button '(mouse-1 mouse-2 mouse-3)) - (global-set-key (vector margin button) - (global-key-binding (vector button))))) + This has to be done /before/ loading the package. It's included in =visual-fill-column=, too, but for some reason isn't loaded there. - (mouse-wheel-mode +1) - - (when (bound-and-true-p mouse-wheel-mode) - (dolist (margin '(right-margin left-margin)) - (dolist (event '(mouse-wheel-down-event - mouse-wheel-up-event - wheel-down - wheel-up - mouse-4 - mouse-5)) - (global-set-key (vector margin event) #'mwheel-scroll)))) -#+END_SRC + #+begin_src emacs-lisp + (dolist (margin '(right-margin left-margin)) + (dolist (button '(mouse-1 mouse-2 mouse-3)) + (global-set-key (vector margin button) + (global-key-binding (vector button))))) + + (mouse-wheel-mode +1) + + (when (bound-and-true-p mouse-wheel-mode) + (dolist (margin '(right-margin left-margin)) + (dolist (event '(mouse-wheel-down-event + mouse-wheel-up-event + wheel-down + wheel-up + mouse-4 + mouse-5)) + (global-set-key (vector margin event) #'mwheel-scroll)))) + #+end_src *** Load the package -#+BEGIN_SRC emacs-lisp -(straight-use-package 'visual-fill-column) + #+begin_src emacs-lisp + (straight-use-package 'visual-fill-column) -(cuss visual-fill-column-center-text nil - "Whether to center the text in the frame.") + (cuss visual-fill-column-center-text nil + "Whether to center the text in the frame.") -(cuss fill-column 84 - "Width of fill-column, and thus, visual-fill-column.") + (cuss fill-column 84 + "Width of fill-column, and thus, visual-fill-column.") -(advice-add 'text-scale-adjust - :after #'visual-fill-column-adjust) + (advice-add 'text-scale-adjust + :after #'visual-fill-column-adjust) -(global-visual-fill-column-mode +1) -#+END_SRC + (global-visual-fill-column-mode +1) + #+end_src ** Typographical niceties *** Variable pitch in text-modes -#+begin_src emacs-lisp - (add-hook 'text-mode-hook #'variable-pitch-mode) -#+end_src + #+begin_src emacs-lisp + (add-hook 'text-mode-hook #'variable-pitch-mode) + #+end_src *** Typo mode -#+BEGIN_SRC emacs-lisp - (straight-use-package 'typo) + #+begin_src emacs-lisp + (straight-use-package 'typo) - (add-hook 'text-mode-hook #'typo-mode) + (add-hook 'text-mode-hook #'typo-mode) - ;; Disable `typo-mode' when inside an Org source block - (with-eval-after-load 'typo - (add-to-list 'typo-disable-electricity-functions - #'org-in-src-block-p)) -#+END_SRC + ;; Disable `typo-mode' when inside an Org source block + (with-eval-after-load 'typo + (add-to-list 'typo-disable-electricity-functions + #'org-in-src-block-p)) + #+end_src *** Show =^L= as a horizontal line @@ -1307,13 +1328,13 @@ This has to be done /before/ loading the package. It's included in =visual-fill ** Word count -#+BEGIN_SRC emacs-lisp - (straight-use-package 'wc-mode) + #+begin_src emacs-lisp + (straight-use-package 'wc-mode) - (add-hook 'text-mode-hook #'wc-mode) + (add-hook 'text-mode-hook #'wc-mode) - (rm/whitelist-add "WC") -#+end_src + (rm/whitelist-add "WC") + #+end_src * Applications @@ -1321,7 +1342,7 @@ This has to be done /before/ loading the package. It's included in =visual-fill *** Basic customization - #+BEGIN_SRC emacs-lisp + #+begin_src emacs-lisp ;; highlight the current line in dired. (add-hook 'dired-mode-hook #'hl-line-mode) @@ -1335,16 +1356,16 @@ This has to be done /before/ loading the package. It's included in =visual-fill *** Expand subtrees - #+BEGIN_SRC emacs-lisp - (straight-use-package 'dired-subtree) + #+begin_src emacs-lisp + (straight-use-package 'dired-subtree) - (with-eval-after-load 'dired - (define-key dired-mode-map "i" #'dired-subtree-toggle)) - #+end_src + (with-eval-after-load 'dired + (define-key dired-mode-map "i" #'dired-subtree-toggle)) + #+end_src *** Collapse singleton directories - #+BEGIN_SRC emacs-lisp + #+begin_src emacs-lisp (straight-use-package 'dired-collapse) (add-hook 'dired-mode-hook #'dired-collapse-mode) @@ -1352,66 +1373,65 @@ This has to be done /before/ loading the package. It's included in =visual-fill *** Kill dired buffers -from [[https://github.com/munen/emacs.d/][munen]]. + from [[https://github.com/munen/emacs.d/][munen]]. -#+BEGIN_SRC emacs-lisp - (defun kill-dired-buffers () - "Kill all open dired buffers." - (interactive) - (mapc (lambda (buffer) - (when (eq 'dired-mode (buffer-local-value 'major-mode buffer)) - (kill-buffer buffer))) - (buffer-list))) -#+end_src + #+begin_src emacs-lisp + (defun kill-dired-buffers () + "Kill all open dired buffers." + (interactive) + (mapc (lambda (buffer) + (when (eq 'dired-mode (buffer-local-value 'major-mode buffer)) + (kill-buffer buffer))) + (buffer-list))) + #+end_src ** Org mode -I’ve put org mode under Applications, as opposed to Writing, because it’s more generally-applicable than that. + I’ve put org mode under Applications, as opposed to Writing, because it’s more generally-applicable than that. *** Basics -#+BEGIN_SRC emacs-lisp - (straight-use-package '(org - :repo "https://code.orgmode.org/bzg/org-mode.git")) - - (with-eval-after-load 'org - (require 'org-tempo) - (require 'ox-md) - (define-key org-mode-map (kbd "M-n") #'outline-next-visible-heading) - (define-key org-mode-map (kbd "M-p") #'outline-previous-visible-heading)) - - (cuss org-hide-emphasis-markers t) - (cuss org-fontify-done-headline t) - (cuss org-fontify-whole-heading-line t) - (cuss org-fontify-quote-and-verse-blocks t) - (cuss org-pretty-entities t) - (cuss org-src-tab-acts-natively t) - (cuss org-src-fontify-natively t) - (cuss org-src-window-setup 'current-window) - (cuss org-confirm-babel-evaluate nil) - (cuss org-directory "~/Org") - (cuss org-ellipsis "…") - (cuss org-catch-invisible-edits 'show) - (cuss org-special-ctrl-a/e t) - (cuss org-special-ctrl-k t) - - (cuss org-export-headline-levels 8 - "Maximum level of headlines to export /as/ a headline.") -#+END_SRC + #+begin_src emacs-lisp + (straight-use-package 'org) + + (with-eval-after-load 'org + (require 'org-tempo) + (require 'ox-md) + (define-key org-mode-map (kbd "M-n") #'outline-next-visible-heading) + (define-key org-mode-map (kbd "M-p") #'outline-previous-visible-heading)) + + (cuss org-hide-emphasis-markers t) + (cuss org-fontify-done-headline t) + (cuss org-fontify-whole-heading-line t) + (cuss org-fontify-quote-and-verse-blocks t) + (cuss org-pretty-entities t) + (cuss org-src-tab-acts-natively t) + (cuss org-src-fontify-natively t) + (cuss org-src-window-setup 'current-window) + (cuss org-confirm-babel-evaluate nil) + (cuss org-directory "~/Org") + (cuss org-ellipsis "…") + (cuss org-catch-invisible-edits 'show) + (cuss org-special-ctrl-a/e t) + (cuss org-special-ctrl-k t) + + (cuss org-export-headline-levels 8 + "Maximum level of headlines to export /as/ a headline.") + #+end_src **** Tags -#+begin_src emacs-lisp - (cuss org-tags-column 0 - "Show tags directly after the headline. - This is the best-looking option with variable-pitch fonts.") - - (cussface - '(org-tag - ((t - (:height 0.8 :weight normal :slant italic :foreground "grey40" :inherit - (variable-pitch)))))) -#+end_src + #+begin_src emacs-lisp + (cuss org-tags-column 0 + "Show tags directly after the headline. + This is the best-looking option with variable-pitch fonts.") + + (cussface + '(org-tag + ((t + (:height 0.8 :weight normal :slant italic :foreground "grey40" :inherit + (variable-pitch)))))) + #+end_src **** Prettify @@ -1419,8 +1439,8 @@ I’ve put org mode under Applications, as opposed to Writing, because it’s m (defun acdw/org-mode-prettify () "Prettify `org-mode'." (dolist (cell '(("[ ]" . ?□) ("[X]" . ?☑) ("[-]" . ?◐) - ("#+begin_src" . ?✎) ("#+BEGIN_SRC" . ?✎) - ("#+end_src" . ?■) ("#+END_SRC" . ?■))) + ("#+begin_src" . ?✎) ("#+begin_src" . ?✎) + ("#+end_src" . ?■) ("#+end_src" . ?■))) (add-to-list 'prettify-symbols-alist cell :append)) (prettify-symbols-mode +1)) @@ -1431,7 +1451,7 @@ I’ve put org mode under Applications, as opposed to Writing, because it’s m **** [[https://github.com/alphapapa/unpackaged.el#org-return-dwim][Org Return: DWIM]] - #+BEGIN_SRC emacs-lisp + #+begin_src emacs-lisp (defun unpackaged/org-element-descendant-of (type element) "Return non-nil if ELEMENT is a descendant of TYPE. TYPE should be an element type, like `item' or `paragraph'. @@ -1531,89 +1551,97 @@ I’ve put org mode under Applications, as opposed to Writing, because it’s m (with-eval-after-load 'org (define-key org-mode-map (kbd "RET") #'unpackaged/org-return-dwim)) - #+END_SRC + #+end_src **** Insert blank lines around headers - from [[https://github.com/alphapapa/unpackaged.el#ensure-blank-lines-between-headings-and-before-contents][unpackaged.el]]. - - #+BEGIN_SRC emacs-lisp - ;;;###autoload - (defun unpackaged/org-fix-blank-lines (&optional prefix) - "Ensure that blank lines exist between headings and between headings and their contents. - With prefix, operate on whole buffer. Ensures that blank lines - exist after each headings's drawers." - (interactive "P") - (org-map-entries (lambda () - (org-with-wide-buffer - ;; `org-map-entries' narrows the buffer, which prevents us - ;; from seeing newlines before the current heading, so we - ;; do this part widened. - (while (not (looking-back "\n\n" nil)) - ;; Insert blank lines before heading. - (insert "\n"))) - (let ((end (org-entry-end-position))) - ;; Insert blank lines before entry content - (forward-line) - (while (and (org-at-planning-p) - (< (point) (point-max))) - ;; Skip planning lines - (forward-line)) - (while (re-search-forward org-drawer-regexp end t) - ;; Skip drawers. You might think that `org-at-drawer-p' - ;; would suffice, but for some reason it doesn't work - ;; correctly when operating on hidden text. This - ;; works, taken from `org-agenda-get-some-entry-text'. - (re-search-forward "^[ \t]*:END:.*\n?" end t) - (goto-char (match-end 0))) - (unless (or (= (point) (point-max)) - (org-at-heading-p) - (looking-at-p "\n")) - (insert "\n")))) - t (if prefix - nil - 'tree))) - #+END_SRC + from [[https://github.com/alphapapa/unpackaged.el#ensure-blank-lines-between-headings-and-before-contents][unpackaged.el]]. -***** Add a before-save-hook + #+begin_src emacs-lisp + ;;;###autoload + (defun unpackaged/org-fix-blank-lines (&optional prefix) + "Ensure that blank lines exist between headings and between headings and their contents. + With prefix, operate on whole buffer. Ensures that blank lines + exist after each headings's drawers." + (interactive "P") + (org-map-entries (lambda () + (org-with-wide-buffer + ;; `org-map-entries' narrows the buffer, which prevents us + ;; from seeing newlines before the current heading, so we + ;; do this part widened. + (while (not (looking-back "\n\n" nil)) + ;; Insert blank lines before heading. + (insert "\n"))) + (let ((end (org-entry-end-position))) + ;; Insert blank lines before entry content + (forward-line) + (while (and (org-at-planning-p) + (< (point) (point-max))) + ;; Skip planning lines + (forward-line)) + (while (re-search-forward org-drawer-regexp end t) + ;; Skip drawers. You might think that `org-at-drawer-p' + ;; would suffice, but for some reason it doesn't work + ;; correctly when operating on hidden text. This + ;; works, taken from `org-agenda-get-some-entry-text'. + (re-search-forward "^[ \t]*:END:.*\n?" end t) + (goto-char (match-end 0))) + (unless (or (= (point) (point-max)) + (org-at-heading-p) + (looking-at-p "\n")) + (insert "\n")))) + t (if prefix + nil + 'tree))) + #+end_src - #+BEGIN_SRC emacs-lisp - (defun cribbed/org-mode-fix-blank-lines () - (when (eq major-mode 'org-mode) - (let ((current-prefix-arg 4)) ; Emulate C-u - (call-interactively 'unpackaged/org-fix-blank-lines)))) +***** Add a before-save-hook - (add-hook 'before-save-hook #'cribbed/org-mode-fix-blank-lines) - #+END_SRC + #+begin_src emacs-lisp + (defun cribbed/org-mode-fix-blank-lines () + (when (eq major-mode 'org-mode) + (let ((current-prefix-arg 4)) ; Emulate C-u + (call-interactively 'unpackaged/org-fix-blank-lines)))) -*** Org Agenda + (add-hook 'before-save-hook #'cribbed/org-mode-fix-blank-lines) + #+end_src -#+BEGIN_SRC emacs-lisp - (cuss org-agenda-files - (let ((list)) - (dolist (file '(;; add more files to this list - "home.org" - "work.org") - list) - (push (expand-file-name file org-directory) list)))) +*** Org Templates (=org-tempo=) - (define-key acdw/map (kbd "C-a") #'org-agenda) + #+begin_src emacs-lisp + (add-to-list 'org-structure-template-alist + '("el" . "src emacs-lisp")) + #+end_src - (cuss org-todo-keywords - '((sequence "RECUR(r)" "TODO(t)" "|" "DONE(d)") - (sequence "|" "CANCELLED(c)"))) +*** Org Agenda - (cuss org-agenda-skip-scheduled-if-done t) - (cuss org-agenda-skip-deadline-if-done t) - (cuss org-deadline-warning-days 4 - "Warn of a deadline beginning four days before.") -#+END_SRC + #+begin_src emacs-lisp + (cuss org-agenda-files + (let ((list)) + (dolist (file '(;; add more files to this list + "home.org" + "work.org") + list) + (push (expand-file-name file org-directory) list)))) + + (define-key acdw/map (kbd "C-a") #'org-agenda) + + (cuss org-todo-keywords + '((sequence "RECUR(r)" "TODO(t)" "|" "DONE(d)") + (sequence "APPT(a)") + (sequence "|" "CANCELLED(c)"))) + + (cuss org-agenda-skip-scheduled-if-done t) + (cuss org-agenda-skip-deadline-if-done t) + (cuss org-deadline-warning-days 0 + "Don't warn of an impending deadline.") + #+end_src *** TODO Capture *** Include Org links in source code - #+BEGIN_SRC emacs-lisp + #+begin_src emacs-lisp (straight-use-package '(org-link-minor-mode :host github :repo "seanohalpin/org-link-minor-mode")) @@ -1624,11 +1652,11 @@ I’ve put org mode under Applications, as opposed to Writing, because it’s m ** Git -#+begin_src emacs-lisp - (straight-use-package 'magit) + #+begin_src emacs-lisp + (straight-use-package 'magit) - (define-key acdw/map "g" #'magit-status) -#+end_src + (define-key acdw/map "g" #'magit-status) + #+end_src *** Git file modes @@ -1642,24 +1670,24 @@ I’ve put org mode under Applications, as opposed to Writing, because it’s m ** Beancount mode -#+begin_src emacs-lisp - (straight-use-package '(beancount-mode - :host github - :repo "beancount/beancount-mode")) - (require 'beancount) + #+begin_src emacs-lisp + (straight-use-package '(beancount-mode + :host github + :repo "beancount/beancount-mode")) + (require 'beancount) - (add-to-list 'auto-mode-alist '("\\.beancount\\'" . beancount-mode)) + (add-to-list 'auto-mode-alist '("\\.beancount\\'" . beancount-mode)) - (defun acdw/disable-aggressive-indent () - "Turn `aggressive-indent-mode' off for a buffer." - (aggressive-indent-mode -1)) + (defun acdw/disable-aggressive-indent () + "Turn `aggressive-indent-mode' off for a buffer." + (aggressive-indent-mode -1)) - (add-hook 'beancount-mode-hook #'outline-minor-mode) - (add-hook 'beancount-mode-hook #'acdw/disable-aggressive-indent) + (add-hook 'beancount-mode-hook #'outline-minor-mode) + (add-hook 'beancount-mode-hook #'acdw/disable-aggressive-indent) - (define-key beancount-mode-map (kbd "M-n") #'outline-next-visible-heading) - (define-key beancount-mode-map (kbd "M-p") #'outline-previous-visible-heading) -#+end_src + (define-key beancount-mode-map (kbd "M-n") #'outline-next-visible-heading) + (define-key beancount-mode-map (kbd "M-p") #'outline-previous-visible-heading) + #+end_src *** Company integration with company-ledger @@ -1672,19 +1700,19 @@ I’ve put org mode under Applications, as opposed to Writing, because it’s m ** PDF Tools -I’m only enabling this at home for now, since it requires building stuff. + I’m only enabling this at home for now, since it requires building stuff. -#+begin_src emacs-lisp - (defun acdw/disable-visual-fill-column-mode () - "Disable `visual-fill-column-mode'." - (visual-fill-column-mode -1)) + #+begin_src emacs-lisp + (defun acdw/disable-visual-fill-column-mode () + "Disable `visual-fill-column-mode'." + (visual-fill-column-mode -1)) - (at-home - (straight-use-package 'pdf-tools) - (pdf-loader-install) + (at-home + (straight-use-package 'pdf-tools) + (pdf-loader-install) - (add-hook 'pdf-view-mode-hook #'acdw/disable-visual-fill-column-mode)) -#+end_src + (add-hook 'pdf-view-mode-hook #'acdw/disable-visual-fill-column-mode)) + #+end_src ** E-book tools @@ -1824,42 +1852,42 @@ I’m only enabling this at home for now, since it requires building stuff. *** Elpher - #+begin_src emacs-lisp - (straight-use-package '(elpher - :repo "git://thelambdalab.xyz/elpher.git")) - - (with-eval-after-load 'no-littering - (cuss elpher-certificate-directory - (no-littering-expand-var-file-name "elpher-certificates/"))) - - (cuss elpher-ipv4-always t) - - (cussface '(elpher-gemini-heading1 - ((t (:inherit (modus-theme-heading-1 variable-pitch)))))) - (cussface '(elpher-gemini-heading2 - ((t (:inherit (modus-theme-heading-2 variable-pitch)))))) - (cussface '(elpher-gemini-heading3 - ((t (:inherit (modus-theme-heading-3 variable-pitch)))))) - - (defun elpher:eww-browse-url (original url &optional new-window) - "Handle gemini/gopher links with eww." - (cond ((string-match-p "\\`\\(gemini\\|gopher\\)://" url) - (require 'elpher) - (elpher-go url)) - (t (funcall original url new-window)))) - (advice-add 'eww-browse-url :around 'elpher:eww-browse-url) - - (with-eval-after-load 'elpher - (define-key elpher-mode-map "n" #'elpher-next-link) - (define-key elpher-mode-map "p" #'elpher-prev-link) - (define-key elpher-mode-map "o" #'elpher-follow-current-link) - (define-key elpher-mode-map "G" #'elpher-go-current)) - - (add-hook 'elpher-mode-hook #'acdw/setup-smolweb) - - (autoload 'elpher-bookmarks "elpher") - (define-key acdw/map "e" #'elpher-bookmarks) - #+end_src + #+begin_src emacs-lisp + (straight-use-package '(elpher + :repo "git://thelambdalab.xyz/elpher.git")) + + (with-eval-after-load 'no-littering + (cuss elpher-certificate-directory + (no-littering-expand-var-file-name "elpher-certificates/"))) + + (cuss elpher-ipv4-always t) + + (cussface '(elpher-gemini-heading1 + ((t (:inherit (modus-theme-heading-1 variable-pitch)))))) + (cussface '(elpher-gemini-heading2 + ((t (:inherit (modus-theme-heading-2 variable-pitch)))))) + (cussface '(elpher-gemini-heading3 + ((t (:inherit (modus-theme-heading-3 variable-pitch)))))) + + (defun elpher:eww-browse-url (original url &optional new-window) + "Handle gemini/gopher links with eww." + (cond ((string-match-p "\\`\\(gemini\\|gopher\\)://" url) + (require 'elpher) + (elpher-go url)) + (t (funcall original url new-window)))) + (advice-add 'eww-browse-url :around 'elpher:eww-browse-url) + + (with-eval-after-load 'elpher + (define-key elpher-mode-map "n" #'elpher-next-link) + (define-key elpher-mode-map "p" #'elpher-prev-link) + (define-key elpher-mode-map "o" #'elpher-follow-current-link) + (define-key elpher-mode-map "G" #'elpher-go-current)) + + (add-hook 'elpher-mode-hook #'acdw/setup-smolweb) + + (autoload 'elpher-bookmarks "elpher") + (define-key acdw/map "e" #'elpher-bookmarks) + #+end_src *** Gemini-mode @@ -1936,163 +1964,179 @@ I’m only enabling this at home for now, since it requires building stuff. #+begin_src emacs-lisp (at-home - (straight-use-package 'exec-path-from-shell) - (defvar acdw/exec-path-from-shell-initialized nil - "Stores whether we've initialized or not.") - (unless acdw/exec-path-from-shell-initialized - (exec-path-from-shell-initialize) - (setq acdw/exec-path-from-shell-initialized (current-time)))) + (straight-use-package 'exec-path-from-shell) + (defvar acdw/exec-path-from-shell-initialized nil + "Stores whether we've initialized or not.") + (unless acdw/exec-path-from-shell-initialized + (exec-path-from-shell-initialize) + (setq acdw/exec-path-from-shell-initialized (current-time)))) #+end_src * Appendices + :PROPERTIES: + :header-args: :tangle LICENSE :comments no + :END: ** Emacs' files *** init.el - #+BEGIN_SRC emacs-lisp :tangle init.el :comments no - ;; init.el -*- lexical-binding: t -*- - - (setq load-prefer-newer t) - - (let* (;; Speed up init - (gc-cons-threshold most-positive-fixnum) - (file-name-handler-alist nil) - ;; Config file names - (conf (expand-file-name "config" - user-emacs-directory)) - (conf-el (concat conf ".el")) - (conf-org (concat conf ".org"))) - (unless (and (file-newer-than-file-p conf-el conf-org) - (load conf 'no-error)) - ;; A plain require here just loads the older `org' - ;; in Emacs' install dir. We need to add the newer - ;; one to the `load-path', hopefully that's all. - (add-to-list 'load-path (expand-file-name "straight/build/org" - user-emacs-directory)) - (require 'org) - (org-babel-load-file conf-org))) - #+END_SRC + #+begin_src emacs-lisp :tangle init.el + ;; init.el -*- lexical-binding: t -*- + + (setq load-prefer-newer t) + + (let* (;; Speed up init + (gc-cons-threshold most-positive-fixnum) + (file-name-handler-alist nil) + ;; Config file names + (conf (expand-file-name "config" + user-emacs-directory)) + (conf-el (concat conf ".el")) + (conf-org (concat conf ".org"))) + (unless (and (file-newer-than-file-p conf-el conf-org) + (load conf 'no-error)) + ;; A plain require here just loads the older `org' + ;; in Emacs' install dir. We need to add the newer + ;; one to the `load-path', hopefully that's all. + (add-to-list 'load-path (expand-file-name "straight/build/org" + user-emacs-directory)) + (require 'org) + (org-babel-load-file conf-org))) + #+end_src *** early-init.el -#+BEGIN_SRC emacs-lisp :tangle early-init.el :comments no - ;; early-init.el -*- no-byte-compile: t; -*- + #+begin_src emacs-lisp :tangle early-init.el + ;; early-init.el -*- no-byte-compile: t; -*- - ;; I use `straight.el' instead of `package.el'. - (setq package-enable-at-startup nil) + ;; I use `straight.el' instead of `package.el'. + (setq package-enable-at-startup nil) - ;; Don't resize the frame when loading fonts - (setq frame-inhibit-implied-resize t) - ;; Resize frame by pixels - (setq frame-resize-pixelwise t) -#+end_src + ;; Don't resize the frame when loading fonts + (setq frame-inhibit-implied-resize t) + ;; Resize frame by pixels + (setq frame-resize-pixelwise t) + #+end_src ** Ease tangling and loading of Emacs' init - #+BEGIN_SRC emacs-lisp - (defun refresh-emacs (&optional disable-load) - "Tangle `config.org', then byte-compile the resulting files. - Then, load the byte-compilations unless passed with a prefix argument." - (interactive "P") - (let ((config (expand-file-name "config.org" user-emacs-directory))) - (save-mark-and-excursion - (with-current-buffer (find-file config) - (let ((prog-mode-hook nil)) - ;; generate the readme - (when (file-newer-than-file-p config (expand-file-name - "README.md" - user-emacs-directory)) - (message "%s" "Exporting README.md...") - (require 'ox-md) - (with-demoted-errors "Problem exporting README.md: %S" - (org-md-export-to-markdown))) - ;; tangle config.org - (when (file-newer-than-file-p config (expand-file-name - "config.el" - user-emacs-directory)) - (message "%s" "Tangling config.org...") - (add-to-list 'load-path (expand-file-name "straight/build/org/" - user-emacs-directory)) - (require 'org) - (let ((inits (org-babel-tangle))) - ;; byte-compile resulting files - (message "%s" "Byte-compiling...") - (dolist (f inits) - (when (string-match "\\.el\\'" f) - (byte-compile-file f (not disable-load))))))))))) - #+END_SRC + #+begin_src emacs-lisp :tangle config.el + (defun refresh-emacs (&optional disable-load) + "Tangle `config.org', then byte-compile the resulting files. + Then, load the byte-compilations unless passed with a prefix argument." + (interactive "P") + (let ((config (expand-file-name "config.org" user-emacs-directory))) + (save-mark-and-excursion + (with-current-buffer (find-file config) + (let ((prog-mode-hook nil)) + ;; generate the readme + (when (file-newer-than-file-p config (expand-file-name + "README.md" + user-emacs-directory)) + (message "%s" "Exporting README.md...") + (require 'ox-md) + (with-demoted-errors "Problem exporting README.md: %S" + (org-md-export-to-markdown))) + ;; tangle config.org + (when (file-newer-than-file-p config (expand-file-name + "config.el" + user-emacs-directory)) + (message "%s" "Tangling config.org...") + (add-to-list 'load-path (expand-file-name "straight/build/org/" + user-emacs-directory)) + (require 'org) + (let ((inits (org-babel-tangle))) + ;; byte-compile resulting files + (message "%s" "Byte-compiling...") + (dolist (f inits) + (when (string-match "\\.el\\'" f) + (byte-compile-file f (not disable-load))))))))))) + #+end_src ** Ancillary scripts *** emacsdc -:PROPERTY: -:header-args: :tangle bin/emacsdc :tangle-mode (identity #o755) -:END: - -Here's a wrapper script that'll start =emacs --daemon= if there isn't -one, and then launch =emacsclient= with the arguments. I'd recommend -installing with either ~ln -s bin/emacsdc $HOME/.local/bin/~, or -adding =$HOME/.local/bin= to your =$PATH=. + :PROPERTIES: + :header-args: :mkdirp yes :tangle-mode (identity #o755) + :END: + + Here's a wrapper script that'll start =emacs --daemon= if there isn't + one, and then launch =emacsclient= with the arguments. I'd recommend + installing with either ~ln -s bin/emacsdc $HOME/.local/bin/~, or + adding =$HOME/.local/bin= to your =$PATH=. -#+BEGIN_SRC sh :shebang "#!/bin/sh" -if ! emacsclient -nc "$@" 2>/dev/null; then - emacs --daemon - emacsclient -nc "$@" -fi -#+END_SRC + #+begin_src sh :tangle bin/emacsdc :shebang "#!/bin/sh" + if ! emacsclient -nc "$@" 2>/dev/null; then + emacs --daemon + emacsclient -nc "$@" + fi + #+end_src *** Emacs.cmd - -Here's a wrapper script that'll run Emacs on Windows, with a custom =$HOME=. I have -mine setup like this: Emacs is downloaded from [[https://mirrors.tripadvisor.com/gnu/emacs/windows/emacs-27/emacs-27.1-x86_64.zip][the GNU mirror]] and unzipped to -=~/Downloads/emacs/=. For some reason, Emacs by default sets =$HOME= to =%APPDATA%=, -which doesn’t make a lot of sense to me. I change it to =%USERPROFILE%=, and then run -Emacs with the supplied arguments. - -#+begin_src bat :tangle bin/Emacs.cmd - set HOME=%USERPROFILE% - set EMACS="%USERPROFILE%\Downloads\emacs\bin\runemacs.exe" - - REM Run "Quick Mode" - REM "%EMACS%" -Q %* - - REM Regular - "%EMACS%" %* -#+end_src + :PROPERTIES: + :header-args: :mkdirp yes + :END: + + Here's a wrapper script that'll run Emacs on Windows, with a + custom =$HOME=. I have mine setup like this: Emacs is downloaded + from [[https://mirrors.tripadvisor.com/gnu/emacs/windows/emacs-27/emacs-27.1-x86_64.zip][the GNU mirror]] and unzipped to =~/Downloads/emacs/=. For + some reason, Emacs by default sets =$HOME= to =%APPDATA%=, which + doesn’t make a lot of sense to me. I change it to + =%USERPROFILE%\Downloads\home=, and then run Emacs with the + supplied arguments. + + As far as creating a shortcut to the Desktop, you’ll have to do + that yourself – /apparently/ Windows doesn’t have a built-in + shortcut-creating software >:(. + + #+begin_src bat :tangle bin/Emacs.cmd + REM Set variables + set HOME=%USERPROFILE%\Downloads\home + set EMACS=%USERPROFILE%\Downloads\emacs\bin\runemacs.exe + + REM Change the directory + chdir %HOME% + + REM Run "Quick Mode" + REM "%EMACS%" -Q %* + + REM Regular + "%EMACS%" %* + #+end_src ** License :PROPERTIES: :header-args: :tangle LICENSE :comments no :END: - Copyright © 2020 Case Duckworth + Copyright © 2020 Case Duckworth - This work is free. You can redistribute it and/or modify it under the - terms of the Do What the Fuck You Want To Public License, Version 2, - as published by Sam Hocevar. See the =LICENSE= file, tangled from the - following source block, for details. + This work is free. You can redistribute it and/or modify it under the + terms of the Do What the Fuck You Want To Public License, Version 2, + as published by Sam Hocevar. See the =LICENSE= file, tangled from the + following source block, for details. - #+BEGIN_SRC text - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + #+begin_src text + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - Version 2, December 2004 + Version 2, December 2004 - Copyright (C) 2004 Sam Hocevar + Copyright (C) 2004 Sam Hocevar - Everyone is permitted to copy and distribute verbatim or modified copies of - this license document, and changing it is allowed as long as the name is changed. + Everyone is permitted to copy and distribute verbatim or modified copies of + this license document, and changing it is allowed as long as the name is changed. - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. You just DO WHAT THE FUCK YOU WANT TO. - #+END_SRC + 0. You just DO WHAT THE FUCK YOU WANT TO. + #+end_src *** Note on the license - It's highly likely that the WTFPL is completely incompatible with the - GPL, for what should be fairly obvious reasons. To that, I say: + It's highly likely that the WTFPL is completely incompatible with the + GPL, for what should be fairly obvious reasons. To that, I say: - *SUE ME, RMS!* + *SUE ME, RMS!* -- cgit 1.4.1-21-gabe81