diff options
-rw-r--r-- | early-init.el | 2 | ||||
-rw-r--r-- | init.el | 152 | ||||
-rw-r--r-- | lisp/+browse-url.el | 6 | ||||
-rw-r--r-- | lisp/+consult.el | 2 | ||||
-rw-r--r-- | lisp/+dired.el | 23 | ||||
-rw-r--r-- | lisp/+init.el | 9 | ||||
-rw-r--r-- | lisp/+jabber.el | 12 | ||||
-rw-r--r-- | lisp/+key.el | 6 | ||||
-rw-r--r-- | lisp/+modeline.el | 35 | ||||
-rw-r--r-- | lisp/+org.el | 13 | ||||
-rw-r--r-- | lisp/+setup.el | 80 | ||||
-rw-r--r-- | lisp/+straight.el | 1 | ||||
-rw-r--r-- | lisp/acdw.el | 23 | ||||
-rw-r--r-- | lisp/find-script.el | 36 |
14 files changed, 250 insertions, 150 deletions
diff --git a/early-init.el b/early-init.el index d2097b3..0f729c8 100644 --- a/early-init.el +++ b/early-init.el | |||
@@ -140,7 +140,7 @@ See `no-littering' for examples.") | |||
140 | 140 | ||
141 | ;; Setup `setup' | 141 | ;; Setup `setup' |
142 | 142 | ||
143 | (add-to-list 'setup-modifier-list 'setup-wrap-to-demote-errors) | 143 | (add-to-list 'setup-modifier-list '+setup-wrap-to-demote-errors) |
144 | (unless (memq debug-on-error '(nil init)) | 144 | (unless (memq debug-on-error '(nil init)) |
145 | (define-advice setup (:around (fn head &rest args) +setup-report) | 145 | (define-advice setup (:around (fn head &rest args) +setup-report) |
146 | (+with-progress ((format "[Setup] %S..." head)) | 146 | (+with-progress ((format "[Setup] %S..." head)) |
diff --git a/init.el b/init.el index 172787c..2d907a0 100644 --- a/init.el +++ b/init.el | |||
@@ -14,6 +14,14 @@ | |||
14 | ;; - Be kind to yourself. | 14 | ;; - Be kind to yourself. |
15 | ;; - Make good choices. | 15 | ;; - Make good choices. |
16 | 16 | ||
17 | ;;; Commentary | ||
18 | |||
19 | ;; My init.el. There are many like it, but this one is mine. | ||
20 | |||
21 | ;; Ideas: | ||
22 | ;; [[https://emacs.stackexchange.com/questions/17278/truncate-only-certain-lines-and-use-continuation-lines-elsewhere][Truncate org-mode headings]] | ||
23 | ;; [[https://emacs.stackexchange.com/questions/7432/make-visual-line-mode-more-compatible-with-org-mode][another link that might be useful for truncating]] | ||
24 | |||
17 | ;;; Code: | 25 | ;;; Code: |
18 | 26 | ||
19 | (let ((early-features `((early-init . ,(locate-user-emacs-file "early-init")) | 27 | (let ((early-features `((early-init . ,(locate-user-emacs-file "early-init")) |
@@ -104,6 +112,8 @@ | |||
104 | (:with-mode Custom-mode | 112 | (:with-mode Custom-mode |
105 | (:local-set imenu-generic-expression +cus-edit-imenu-generic-expression))) | 113 | (:local-set imenu-generic-expression +cus-edit-imenu-generic-expression))) |
106 | 114 | ||
115 | (setup (:require find-script)) | ||
116 | |||
107 | (setup (:require goto-addr) | 117 | (setup (:require goto-addr) |
108 | (if (fboundp #'global-goto-address-mode) | 118 | (if (fboundp #'global-goto-address-mode) |
109 | (global-goto-address-mode) | 119 | (global-goto-address-mode) |
@@ -242,17 +252,15 @@ | |||
242 | (:option +browse-url-transformations `((,(rx (or "youtube.com" | 252 | (:option +browse-url-transformations `((,(rx (or "youtube.com" |
243 | "youtu.be")) | 253 | "youtu.be")) |
244 | . ,+invidious-host) | 254 | . ,+invidious-host) |
245 | ("twitter\\.com" | 255 | ("twitter\\.com" . "nitter.net") |
246 | . "nitter.net") | 256 | ("instagram\\.com" . "bibilogram.art") |
247 | ("instagram\\.com" | ||
248 | . "bibilogram.art") | ||
249 | (,(rx (or "reddit.com" | 257 | (,(rx (or "reddit.com" |
250 | "old.reddit.com")) | 258 | "old.reddit.com")) |
251 | . "teddit.net") | 259 | . "teddit.net") |
252 | ("medium\\.com" | 260 | ("medium\\.com" . "scribe.rip") |
253 | . "scribe.rip") | 261 | ("www\\.npr\\.org" . "text.npr.org") |
254 | ("www\\.npr\\.org" | 262 | ;;TODO: Various paste sites |
255 | . "text.npr.org"))) | 263 | )) |
256 | (+browse-url-transform-url-global-mode +1)) | 264 | (+browse-url-transform-url-global-mode +1)) |
257 | 265 | ||
258 | (setup calendar | 266 | (setup calendar |
@@ -294,7 +302,7 @@ | |||
294 | #'lin-mode | 302 | #'lin-mode |
295 | #'+dired-dim-git-ignores) | 303 | #'+dired-dim-git-ignores) |
296 | (+with-ensure-after-init ; Necessary because jabber loads later | 304 | (+with-ensure-after-init ; Necessary because jabber loads later |
297 | (:+key "C-x C-j" #'dired-jump)) | 305 | (:+key "C-x C-j" #'dired-jump)) |
298 | (dolist (refresh-after-func '(dired-do-flagged-delete)) | 306 | (dolist (refresh-after-func '(dired-do-flagged-delete)) |
299 | (advice-add refresh-after-func :after #'revert-buffer)) | 307 | (advice-add refresh-after-func :after #'revert-buffer)) |
300 | (with-eval-after-load 'frowny | 308 | (with-eval-after-load 'frowny |
@@ -308,10 +316,12 @@ | |||
308 | (:also-load +elisp) | 316 | (:also-load +elisp) |
309 | (:option eval-expression-print-length nil | 317 | (:option eval-expression-print-length nil |
310 | eval-expression-print-level nil) | 318 | eval-expression-print-level nil) |
311 | (:with-map (emacs-lisp-mode-map lisp-interaction-mode-map) | 319 | (:with-mode emacs-lisp-mode |
312 | (:bind "C-c C-c" #'eval-defun | 320 | (:hook #'checkdoc-minor-mode)) |
313 | "C-c C-k" #'+elisp-eval-region-or-buffer | 321 | (:bind-into (emacs-lisp-mode-map lisp-interaction-mode-map) |
314 | "C-c C-z" #'ielm)) | 322 | "C-c C-c" #'eval-defun |
323 | "C-c C-k" #'+elisp-eval-region-or-buffer | ||
324 | "C-c C-z" #'ielm) | ||
315 | (advice-add #'eval-region :around #'+eval-region@pulse)) | 325 | (advice-add #'eval-region :around #'+eval-region@pulse)) |
316 | 326 | ||
317 | (setup eshell | 327 | (setup eshell |
@@ -362,7 +372,7 @@ | |||
362 | ;; Bind keys | 372 | ;; Bind keys |
363 | (dolist (binding '(("C-d" . +eshell-quit-or-delete-char))) | 373 | (dolist (binding '(("C-d" . +eshell-quit-or-delete-char))) |
364 | (define-key eshell-mode-map | 374 | (define-key eshell-mode-map |
365 | (kbd (car binding)) (cdr binding))) | 375 | (kbd (car binding)) (cdr binding))) |
366 | ;; Environment variables | 376 | ;; Environment variables |
367 | (dolist (environment '(("PAGER" . "cat"))) | 377 | (dolist (environment '(("PAGER" . "cat"))) |
368 | (setenv (car environment) (cdr environment))))) | 378 | (setenv (car environment) (cdr environment))))) |
@@ -461,7 +471,8 @@ | |||
461 | '(context-menu-ffap | 471 | '(context-menu-ffap |
462 | context-menu-region | 472 | context-menu-region |
463 | context-menu-undo | 473 | context-menu-undo |
464 | context-menu-dictionary)) | 474 | ;; context-menu-dictionary |
475 | )) | ||
465 | (context-menu-mode +1)) | 476 | (context-menu-mode +1)) |
466 | (dolist (click '(;; Fix scrolling in the margin | 477 | (dolist (click '(;; Fix scrolling in the margin |
467 | wheel-down double-wheel-down triple-wheel-down | 478 | wheel-down double-wheel-down triple-wheel-down |
@@ -470,9 +481,25 @@ | |||
470 | (global-set-key (vector 'left-margin click) 'mwheel-scroll))) | 481 | (global-set-key (vector 'left-margin click) 'mwheel-scroll))) |
471 | 482 | ||
472 | (setup net-utils | 483 | (setup net-utils |
484 | (:needs "traceroute") | ||
473 | (:require +finger) ; fixes `finger' to use var below | 485 | (:require +finger) ; fixes `finger' to use var below |
474 | (:option finger-X.500-host-regexps '(".") ; only send username | 486 | (:option finger-X.500-host-regexps '(".") ; only send username |
475 | )) | 487 | ) |
488 | (require 'transient) | ||
489 | (transient-define-prefix net-utils () | ||
490 | "Networking utilities" | ||
491 | ["Actions" | ||
492 | ("p" "Ping" ping) | ||
493 | ("i" "Ifconfig" ifconfig) | ||
494 | ("w" "Iwconfig" iwconfig) | ||
495 | ("n" "Netstat" netstat) | ||
496 | ("a" "Arp" arp) | ||
497 | ("r" "Route" route) | ||
498 | ("h" "Nslookup host" nslookup-host) | ||
499 | ("d" "Dig" dig) | ||
500 | ("s" "Smb Client" smbclient) | ||
501 | ("t" "Traceroute" traceroute)]) | ||
502 | (:+key "C-z M-n" #'net-utils)) | ||
476 | 503 | ||
477 | (setup notmuch | 504 | (setup notmuch |
478 | (:load-from "~/usr/share/emacs/site-lisp/") | 505 | (:load-from "~/usr/share/emacs/site-lisp/") |
@@ -561,7 +588,7 @@ | |||
561 | org-fontify-done-headline t | 588 | org-fontify-done-headline t |
562 | org-fontify-quote-and-verse-blocks t | 589 | org-fontify-quote-and-verse-blocks t |
563 | org-fontify-whole-heading-line t | 590 | org-fontify-whole-heading-line t |
564 | org-hide-emphasis-markers t | 591 | org-hide-emphasis-markers nil |
565 | org-html-coding-system 'utf-8-unix | 592 | org-html-coding-system 'utf-8-unix |
566 | org-image-actual-width (list (* (window-font-width) | 593 | org-image-actual-width (list (* (window-font-width) |
567 | (- fill-column 8))) | 594 | (- fill-column 8))) |
@@ -620,11 +647,20 @@ | |||
620 | "C-c C-p" #'+org-previous-heading-widen | 647 | "C-c C-p" #'+org-previous-heading-widen |
621 | "C-c C-o" #'+org-open-at-point-dwim | 648 | "C-c C-o" #'+org-open-at-point-dwim |
622 | "`" #'+org-insert-tilde | 649 | "`" #'+org-insert-tilde |
623 | "~" #'+org-insert-backtick) | 650 | "~" #'+org-insert-backtick |
651 | "C-c C-x l" #'org-toggle-link-display | ||
652 | "C-c C-x m" (lambda () (interactive) | ||
653 | (setq-local org-hide-emphasis-markers | ||
654 | (not org-hide-emphasis-markers)) | ||
655 | (font-lock-update)) | ||
656 | "C-c C-x r" #'+org-drawer-list-add-resource | ||
657 | "C-M-k" #'kill-paragraph | ||
658 | "C-M-t" #'transpose-paragraphs) | ||
624 | (:global [f8] #'org-clock-in | 659 | (:global [f8] #'org-clock-in |
625 | [f9] #'org-clock-out | 660 | [f9] #'org-clock-out |
626 | "C-c l" #'org-store-link) | 661 | "C-c l" #'org-store-link) |
627 | (:hook #'variable-pitch-mode | 662 | (:hook #'variable-pitch-mode |
663 | #'visual-fill-column-mode | ||
628 | #'turn-off-auto-fill | 664 | #'turn-off-auto-fill |
629 | #'org-indent-mode | 665 | #'org-indent-mode |
630 | #'prettify-symbols-mode | 666 | #'prettify-symbols-mode |
@@ -632,6 +668,12 @@ | |||
632 | (:local-set prettify-symbols-alist '(("DEADLINE:" . ?→) | 668 | (:local-set prettify-symbols-alist '(("DEADLINE:" . ?→) |
633 | ("SCHEDULED:" . ?↷) | 669 | ("SCHEDULED:" . ?↷) |
634 | ("CLOSED:" . ?✓)) | 670 | ("CLOSED:" . ?✓)) |
671 | ;; electric-pair-pairs | ||
672 | ;; (append electric-pair-pairs | ||
673 | ;; (mapcar (lambda (emph) | ||
674 | ;; (let ((ch (string-to-char (car emph)))) | ||
675 | ;; (cons ch ch))) | ||
676 | ;; org-emphasis-alist)) | ||
635 | ;;+modeline-position-function #'+org-count-words-stupidly | 677 | ;;+modeline-position-function #'+org-count-words-stupidly |
636 | ) | 678 | ) |
637 | (:local-hook user-save-hook #'+org-before-save@prettify-buffer) | 679 | (:local-hook user-save-hook #'+org-before-save@prettify-buffer) |
@@ -649,6 +691,9 @@ | |||
649 | (org-link-set-parameters "sms" :follow #'+org-sms-open) | 691 | (org-link-set-parameters "sms" :follow #'+org-sms-open) |
650 | (setf (alist-get "\\.x?html?\\'" org-file-apps nil nil #'equal) | 692 | (setf (alist-get "\\.x?html?\\'" org-file-apps nil nil #'equal) |
651 | #'+org-open-html)) | 693 | #'+org-open-html)) |
694 | (:face 'org-done '((t (:inherit (modus-themes-subtle-green)))) | ||
695 | 'org-tag '((t (:inherit (secondary-selection)))) | ||
696 | 'org-todo '((t (:inherit (modus-themes-subtle-red))))) | ||
652 | ;; Extra keywords | 697 | ;; Extra keywords |
653 | (font-lock-add-keywords | 698 | (font-lock-add-keywords |
654 | 'org-mode | 699 | 'org-mode |
@@ -1167,10 +1212,6 @@ | |||
1167 | (:hook #'visual-line-mode | 1212 | (:hook #'visual-line-mode |
1168 | #'enable-lui-track | 1213 | #'enable-lui-track |
1169 | #'visual-fill-column-mode | 1214 | #'visual-fill-column-mode |
1170 | (defun +disable-electric-pair-mode () | ||
1171 | "Disable `electric-pair-mode' in the current buffer." | ||
1172 | (interactive) | ||
1173 | (electric-pair-local-mode -1)) | ||
1174 | #'enable-lui-autopaste) | 1215 | #'enable-lui-autopaste) |
1175 | (:local-set fringes-outside-margins t | 1216 | (:local-set fringes-outside-margins t |
1176 | right-margin-width (length lui-time-stamp-format) | 1217 | right-margin-width (length lui-time-stamp-format) |
@@ -1187,6 +1228,7 @@ | |||
1187 | (setf (alist-get 'lui-next-button-or-complete vertico-multiform-commands) | 1228 | (setf (alist-get 'lui-next-button-or-complete vertico-multiform-commands) |
1188 | '(flat)))) | 1229 | '(flat)))) |
1189 | 1230 | ||
1231 | (tracking-mode +1) | ||
1190 | (:with-mode tracking-mode | 1232 | (:with-mode tracking-mode |
1191 | (:option tracking-position 'before-modes) | 1233 | (:option tracking-position 'before-modes) |
1192 | (:bind "C-c C-SPC" (lambda () (interactive) | 1234 | (:bind "C-c C-SPC" (lambda () (interactive) |
@@ -1304,19 +1346,20 @@ | |||
1304 | (with-eval-after-load 'vertico-multiform | 1346 | (with-eval-after-load 'vertico-multiform |
1305 | (setf (alist-get 'consult-buffer vertico-multiform-commands) '(flat)) | 1347 | (setf (alist-get 'consult-buffer vertico-multiform-commands) '(flat)) |
1306 | (dolist (buf-cmd '(consult-find | 1348 | (dolist (buf-cmd '(consult-find |
1307 | consult-yank-pop | 1349 | consult-flymake |
1308 | consult-locate | 1350 | consult-focus-lines |
1309 | consult-grep | ||
1310 | consult-git-grep | 1351 | consult-git-grep |
1311 | consult-ripgrep | 1352 | consult-grep |
1353 | consult-imenu | ||
1354 | consult-imenu-multi | ||
1355 | consult-keep-lines | ||
1312 | consult-line | 1356 | consult-line |
1313 | consult-line-multi | 1357 | consult-line-multi |
1358 | consult-locate | ||
1314 | consult-multi-occur | 1359 | consult-multi-occur |
1315 | consult-keep-lines | 1360 | consult-outline |
1316 | consult-focus-lines | 1361 | consult-ripgrep |
1317 | consult-imenu | 1362 | consult-yank-pop)) |
1318 | consult-imenu-multi | ||
1319 | consult-outline)) | ||
1320 | (setf (alist-get buf-cmd vertico-multiform-commands) nil))))) | 1363 | (setf (alist-get buf-cmd vertico-multiform-commands) nil))))) |
1321 | 1364 | ||
1322 | (setup (:straight consult-dir) | 1365 | (setup (:straight consult-dir) |
@@ -1514,6 +1557,11 @@ | |||
1514 | (add-hook 'embark-collect-mode-hook #'consult-preview-at-point-mode)) | 1557 | (add-hook 'embark-collect-mode-hook #'consult-preview-at-point-mode)) |
1515 | 1558 | ||
1516 | (setup (:straight embrace) | 1559 | (setup (:straight embrace) |
1560 | (dolist (mode '(LaTeX-mode org-mode ruby-mode)) | ||
1561 | (add-hook (intern (format "%s-hook" mode)) | ||
1562 | (intern (format "embrace-%s-hook" mode)))) | ||
1563 | (:face 'embrace-help-pair-face '((t ( :inverse-video nil | ||
1564 | :inherit font-lock-keyword-face)))) | ||
1517 | (:+key "C-," #'embrace-commander)) | 1565 | (:+key "C-," #'embrace-commander)) |
1518 | 1566 | ||
1519 | (setup (:straight (ement | 1567 | (setup (:straight (ement |
@@ -1619,7 +1667,7 @@ | |||
1619 | (setup (:straight (forge | 1667 | (setup (:straight (forge |
1620 | :host github :repo "magit/forge") | 1668 | :host github :repo "magit/forge") |
1621 | (eq system-type 'gnu/linux)) | 1669 | (eq system-type 'gnu/linux)) |
1622 | (require 'forge) | 1670 | (:quit) ; XXX: Somehow missing compat-26 |
1623 | (add-to-list 'forge-alist | 1671 | (add-to-list 'forge-alist |
1624 | '("tildegit.org" "tildegit.org/api/v1" "tildegit.org" | 1672 | '("tildegit.org" "tildegit.org/api/v1" "tildegit.org" |
1625 | forge-gitea-repository))) | 1673 | forge-gitea-repository))) |
@@ -1632,6 +1680,7 @@ | |||
1632 | (setup (:straight (frowny | 1680 | (setup (:straight (frowny |
1633 | :host github | 1681 | :host github |
1634 | :repo "duckwork/frowny.el")) | 1682 | :repo "duckwork/frowny.el")) |
1683 | (:option frowny-eyes (rx (any ":=") (opt "'") (? "-"))) | ||
1635 | (global-frowny-mode +1)) | 1684 | (global-frowny-mode +1)) |
1636 | 1685 | ||
1637 | (setup (:straight gcmh) | 1686 | (setup (:straight gcmh) |
@@ -1759,9 +1808,6 @@ | |||
1759 | :fork ( :host nil | 1808 | :fork ( :host nil |
1760 | :repo "https://codeberg.org/acdw/emacs-jabber"))) | 1809 | :repo "https://codeberg.org/acdw/emacs-jabber"))) |
1761 | (:also-load +jabber) | 1810 | (:also-load +jabber) |
1762 | (defvar +jabber-ws-prefix 0 "Width to pad left side of chats.") | ||
1763 | (defvar +jabber-pre-prompt "\n" | ||
1764 | "String to show before a prompt.") | ||
1765 | (:option jabber-account-list '(("acdw@hmm.st")) | 1811 | (:option jabber-account-list '(("acdw@hmm.st")) |
1766 | jabber-groupchat-buffer-format "%n" | 1812 | jabber-groupchat-buffer-format "%n" |
1767 | jabber-chat-buffer-format "%n" | 1813 | jabber-chat-buffer-format "%n" |
@@ -1770,7 +1816,7 @@ | |||
1770 | jabber-muc-decorate-presence-patterns | 1816 | jabber-muc-decorate-presence-patterns |
1771 | '(("\\( enters the room ([^)]+)\\| has left the chatroom\\)$") | 1817 | '(("\\( enters the room ([^)]+)\\| has left the chatroom\\)$") |
1772 | ("." . jabber-muc-presence-dim)) | 1818 | ("." . jabber-muc-presence-dim)) |
1773 | jabber-muc-colorize-foreign t | 1819 | jabber-muc-colorize-foreign nil ; colorizing doesn't match my color theme |
1774 | jabber-chat-foreign-prompt-format (concat +jabber-pre-prompt | 1820 | jabber-chat-foreign-prompt-format (concat +jabber-pre-prompt |
1775 | "[%t] %n\n" | 1821 | "[%t] %n\n" |
1776 | (make-string +jabber-ws-prefix | 1822 | (make-string +jabber-ws-prefix |
@@ -1804,7 +1850,6 @@ | |||
1804 | jabber-console-mode)) | 1850 | jabber-console-mode)) |
1805 | (let ((hook (intern (format "%s-hook" mode)))) | 1851 | (let ((hook (intern (format "%s-hook" mode)))) |
1806 | (add-hook hook #'visual-fill-column-mode))) | 1852 | (add-hook hook #'visual-fill-column-mode))) |
1807 | (add-hook 'jabber-activity-mode-hook #'tracking-mode) | ||
1808 | (with-eval-after-load 'tracking | 1853 | (with-eval-after-load 'tracking |
1809 | (add-to-list 'tracking-ignored-buffers "discuss@conference.soprani.ca")) | 1854 | (add-to-list 'tracking-ignored-buffers "discuss@conference.soprani.ca")) |
1810 | (:with-mode jabber-chat-mode | 1855 | (:with-mode jabber-chat-mode |
@@ -1816,7 +1861,10 @@ | |||
1816 | wrap-prefix (make-string +jabber-ws-prefix ?\ ))) | 1861 | wrap-prefix (make-string +jabber-ws-prefix ?\ ))) |
1817 | (:+leader "C-j" jabber-global-keymap) | 1862 | (:+leader "C-j" jabber-global-keymap) |
1818 | (advice-add 'jabber-activity-add :after #'+jabber-tracking-add) | 1863 | (advice-add 'jabber-activity-add :after #'+jabber-tracking-add) |
1819 | (advice-add 'jabber-activity-add-muc :after #'+jabber-tracking-add-muc)) | 1864 | (advice-add 'jabber-activity-add-muc :after #'+jabber-tracking-add-muc) |
1865 | ;;; Alerting hooks --- remove echo messages | ||
1866 | (remove-hook 'jabber-alert-muc-hooks 'jabber-muc-echo) | ||
1867 | (remove-hook 'jabber-alert-presence-hooks 'jabber-presence-echo)) | ||
1820 | 1868 | ||
1821 | (setup (:straight (keepassxc-shim | 1869 | (setup (:straight (keepassxc-shim |
1822 | :host github :repo "duckwork/keepassxc-shim.el")) | 1870 | :host github :repo "duckwork/keepassxc-shim.el")) |
@@ -1899,6 +1947,7 @@ | |||
1899 | 1947 | ||
1900 | (setup (:straight mastodon) | 1948 | (setup (:straight mastodon) |
1901 | (:option mastodon-instance-url "https://tiny.tilde.website" | 1949 | (:option mastodon-instance-url "https://tiny.tilde.website" |
1950 | mastodon-active-user "acdw" | ||
1902 | mastodon-client--token-file (.etc "mastodon.plstore") | 1951 | mastodon-client--token-file (.etc "mastodon.plstore") |
1903 | mastodon-auth-source-file (seq-some (lambda (i) | 1952 | mastodon-auth-source-file (seq-some (lambda (i) |
1904 | (when (and (stringp i) | 1953 | (when (and (stringp i) |
@@ -1950,8 +1999,8 @@ | |||
1950 | (,(intern (format "modus-themes-heading-%s" facen)) | 1999 | (,(intern (format "modus-themes-heading-%s" facen)) |
1951 | fixed-pitch)) | 2000 | fixed-pitch)) |
1952 | :now))))) | 2001 | :now))))) |
1953 | (:face 'modus-themes-tab-active '((t :bold nil)) | 2002 | (:face 'modus-themes-tab-active '((t ( :bold nil))) |
1954 | 'modus-themes-tab-inactive '((t :italic t))) | 2003 | 'modus-themes-tab-inactive '((t ( :italic t)))) |
1955 | 2004 | ||
1956 | (define-advice modus-themes--current-theme (:around (fn &rest r)) | 2005 | (define-advice modus-themes--current-theme (:around (fn &rest r)) |
1957 | "Fix a \"nil is not a Modus theme\" error." | 2006 | "Fix a \"nil is not a Modus theme\" error." |
@@ -2027,7 +2076,7 @@ | |||
2027 | (:option completion-styles '(substring orderless basic) | 2076 | (:option completion-styles '(substring orderless basic) |
2028 | completion-category-defaults nil | 2077 | completion-category-defaults nil |
2029 | completion-category-overrides | 2078 | completion-category-overrides |
2030 | '((file (styles partial-completion)) | 2079 | '((file (styles basic partial-completion)) |
2031 | (command (styles +orderless-with-initialism)) | 2080 | (command (styles +orderless-with-initialism)) |
2032 | (variable (styles +orderless-with-initialism)) | 2081 | (variable (styles +orderless-with-initialism)) |
2033 | (symbol (styles +orderless-with-initialism))) | 2082 | (symbol (styles +orderless-with-initialism))) |
@@ -2067,6 +2116,7 @@ | |||
2067 | (local-set-key (kbd "C-c M-o") 'org-mime-org-buffer-htmlize)))) | 2116 | (local-set-key (kbd "C-c M-o") 'org-mime-org-buffer-htmlize)))) |
2068 | 2117 | ||
2069 | (setup (:straight org-modern) | 2118 | (setup (:straight org-modern) |
2119 | (:quit "I think I can do most of this myself.") | ||
2070 | (:option org-modern-hide-stars nil | 2120 | (:option org-modern-hide-stars nil |
2071 | org-modern-star nil | 2121 | org-modern-star nil |
2072 | org-modern-list nil | 2122 | org-modern-list nil |
@@ -2092,7 +2142,9 @@ | |||
2092 | (org-visibility-enable-hooks)) | 2142 | (org-visibility-enable-hooks)) |
2093 | 2143 | ||
2094 | (setup (:straight orglink) | 2144 | (setup (:straight orglink) |
2095 | (global-orglink-mode +1)) | 2145 | (:option orglink-activate-in-modes '(text-mode prog-mode)) |
2146 | (global-orglink-mode +1) | ||
2147 | (global-goto-address-mode -1)) | ||
2096 | 2148 | ||
2097 | (setup (:straight package-lint)) | 2149 | (setup (:straight package-lint)) |
2098 | 2150 | ||
@@ -2211,9 +2263,7 @@ | |||
2211 | ",") | 2263 | ",") |
2212 | +modeline-input-method | 2264 | +modeline-input-method |
2213 | +modeline-position | 2265 | +modeline-position |
2214 | ,(+modeline-concat | 2266 | +modeline-major-mode |
2215 | '(+modeline-minions | ||
2216 | +modeline-major-mode)) | ||
2217 | +modeline-file-percentage | 2267 | +modeline-file-percentage |
2218 | ))) | 2268 | ))) |
2219 | (simple-modeline-mode +1)) | 2269 | (simple-modeline-mode +1)) |
@@ -2222,6 +2272,8 @@ | |||
2222 | (:also-load +slack) | 2272 | (:also-load +slack) |
2223 | (:option slack-prefer-current-team t | 2273 | (:option slack-prefer-current-team t |
2224 | slack-buffer-emojify t | 2274 | slack-buffer-emojify t |
2275 | slack-thread-also-send-to-room nil | ||
2276 | slack-typing-visibility 'buffer | ||
2225 | slack-buffer-create-on-notify t | 2277 | slack-buffer-create-on-notify t |
2226 | slack-enable-wysiwyg t | 2278 | slack-enable-wysiwyg t |
2227 | slack-file-dir (xdg-user-dir "DOWNLOAD") | 2279 | slack-file-dir (xdg-user-dir "DOWNLOAD") |
@@ -2255,9 +2307,15 @@ | |||
2255 | (sophomore-enable #'narrow-to-region) | 2307 | (sophomore-enable #'narrow-to-region) |
2256 | (sophomore-disable ; These are mostly annoying commands | 2308 | (sophomore-disable ; These are mostly annoying commands |
2257 | #'view-hello-file | 2309 | #'view-hello-file |
2258 | #'describe-gnu-project) | 2310 | #'describe-gnu-project |
2311 | #'suspend-frame) | ||
2259 | (sophomore-mode +1)) | 2312 | (sophomore-mode +1)) |
2260 | 2313 | ||
2314 | (setup (:straight (spongebob-case | ||
2315 | :host github | ||
2316 | :repo "duckwork/spongebob-case.el")) | ||
2317 | (define-key +casing-map (kbd "M-s") #'spongebob-case-dwim)) | ||
2318 | |||
2261 | (setup (:straight ssh-config-mode) | 2319 | (setup (:straight ssh-config-mode) |
2262 | (:file-match (rx "/.ssh/config" eos) | 2320 | (:file-match (rx "/.ssh/config" eos) |
2263 | (rx "/ssh" (? "d") "_config" eos)) | 2321 | (rx "/ssh" (? "d") "_config" eos)) |
@@ -2269,7 +2327,7 @@ | |||
2269 | (setup (:straight super-save) | 2327 | (setup (:straight super-save) |
2270 | (:option auto-save-default nil | 2328 | (:option auto-save-default nil |
2271 | super-save-auto-save-when-idle t | 2329 | super-save-auto-save-when-idle t |
2272 | super-save-idle-duration 60 | 2330 | super-save-idle-duration 30 |
2273 | super-save-exclude '(".gpg") | 2331 | super-save-exclude '(".gpg") |
2274 | super-save-remote-files nil) | 2332 | super-save-remote-files nil) |
2275 | (auto-save-visited-mode -1) | 2333 | (auto-save-visited-mode -1) |
diff --git a/lisp/+browse-url.el b/lisp/+browse-url.el index dbbfef2..fc479e4 100644 --- a/lisp/+browse-url.el +++ b/lisp/+browse-url.el | |||
@@ -120,9 +120,9 @@ ARGS are ignored here, but passed on for later processing." | |||
120 | ;; along with the rest of the args, in a list to the original caller (probably | 120 | ;; along with the rest of the args, in a list to the original caller (probably |
121 | ;; `browse-url'.) | 121 | ;; `browse-url'.) |
122 | (apply 'list | 122 | (apply 'list |
123 | (cl-loop with url = (substring-no-properties | 123 | (cl-loop with url = (substring-no-properties |
124 | (if (consp url) (car url) url)) | 124 | (if (consp url) (car url) url)) |
125 | for (regex . transformation) in +browse-url-transformations | 125 | for (regex . transformation) in +browse-url-transformations |
126 | if (string-match regex url) | 126 | if (string-match regex url) |
127 | return (replace-match transformation nil nil url) | 127 | return (replace-match transformation nil nil url) |
128 | ;; else | 128 | ;; else |
diff --git a/lisp/+consult.el b/lisp/+consult.el index dc06ad5..21c2565 100644 --- a/lisp/+consult.el +++ b/lisp/+consult.el | |||
@@ -5,7 +5,7 @@ | |||
5 | (defun +consult-project-root () | 5 | (defun +consult-project-root () |
6 | "Return either the current project, or the VC root, of current file." | 6 | "Return either the current project, or the VC root, of current file." |
7 | (if (and (functionp 'project-current) | 7 | (if (and (functionp 'project-current) |
8 | (project-current)) | 8 | (project-current)) |
9 | (car (project-roots (project-current))) | 9 | (car (project-roots (project-current))) |
10 | (vc-root-dir))) | 10 | (vc-root-dir))) |
11 | 11 | ||
diff --git a/lisp/+dired.el b/lisp/+dired.el index 9a2e01a..2e42c19 100644 --- a/lisp/+dired.el +++ b/lisp/+dired.el | |||
@@ -2,18 +2,17 @@ | |||
2 | 2 | ||
3 | ;;; Code: | 3 | ;;; Code: |
4 | 4 | ||
5 | (require 'vertico) | 5 | (with-eval-after-load 'vertico |
6 | 6 | (defun +dired-goto-file (file) | |
7 | (defun +dired-goto-file (file) | 7 | "ADVICE for `dired-goto-file' to make RET call `vertico-exit'." |
8 | "ADVICE for `dired-goto-file' to make RET call `vertico-exit'." | 8 | (interactive ; stolen from `dired-goto-file' |
9 | (interactive ; stolen from `dired-goto-file' | 9 | (prog1 |
10 | (prog1 | 10 | (list (dlet ((vertico-map (copy-keymap vertico-map))) |
11 | (list (dlet ((vertico-map (copy-keymap vertico-map))) | 11 | (define-key vertico-map (kbd "RET") #'vertico-exit) |
12 | (define-key vertico-map (kbd "RET") #'vertico-exit) | 12 | (expand-file-name (read-file-name "Goto file: " |
13 | (expand-file-name (read-file-name "Goto file: " | 13 | (dired-current-directory))))) |
14 | (dired-current-directory))))) | 14 | (push-mark))) |
15 | (push-mark))) | 15 | (dired-goto-file file))) |
16 | (dired-goto-file file)) | ||
17 | 16 | ||
18 | ;;; [[https://www.reddit.com/r/emacs/comments/u2lf9t/weekly_tips_tricks_c_thread/i4n9aoa/?context=3][Dim files in .gitignore]] | 17 | ;;; [[https://www.reddit.com/r/emacs/comments/u2lf9t/weekly_tips_tricks_c_thread/i4n9aoa/?context=3][Dim files in .gitignore]] |
19 | 18 | ||
diff --git a/lisp/+init.el b/lisp/+init.el index 8f999f9..a3f680b 100644 --- a/lisp/+init.el +++ b/lisp/+init.el | |||
@@ -72,11 +72,10 @@ are sorted lexigraphically." | |||
72 | ;; otherwise, sort lexigraphically | 72 | ;; otherwise, sort lexigraphically |
73 | (t (string< s1 s2))))))))) | 73 | (t (string< s1 s2))))))))) |
74 | ;; Return to original point relative to the defun we were in | 74 | ;; Return to original point relative to the defun we were in |
75 | (goto-char (point-min)) | 75 | (ignore-errors (goto-char (point-min)) |
76 | (re-search-forward current-defun-re) | 76 | (re-search-forward current-defun-re) |
77 | (beginning-of-defun) | 77 | (beginning-of-defun) |
78 | (goto-char (+ (point) defun-point)) | 78 | (goto-char (+ (point) defun-point))))) |
79 | )) | ||
80 | 79 | ||
81 | (defun +init-sort-then-save () | 80 | (defun +init-sort-then-save () |
82 | "Sort init.el, then save it." | 81 | "Sort init.el, then save it." |
diff --git a/lisp/+jabber.el b/lisp/+jabber.el index c5d568c..e018b0c 100644 --- a/lisp/+jabber.el +++ b/lisp/+jabber.el | |||
@@ -10,6 +10,18 @@ | |||
10 | (require 'jabber) | 10 | (require 'jabber) |
11 | (require 'tracking) | 11 | (require 'tracking) |
12 | 12 | ||
13 | (defgroup +jabber nil | ||
14 | "Extra jabber.el customizations." | ||
15 | :group 'jabber) | ||
16 | |||
17 | (defcustom +jabber-ws-prefix 0 | ||
18 | "Width to pad left side of chats." | ||
19 | :type 'string) | ||
20 | |||
21 | (defcustom +jabber-pre-prompt "\n" | ||
22 | "String to put before the prompt." | ||
23 | :type 'string) | ||
24 | |||
13 | (defvar +jabber-tracking-show-p #'jabber-activity-show-p-default | 25 | (defvar +jabber-tracking-show-p #'jabber-activity-show-p-default |
14 | "Function that checks if the given JID should be shown in the mode line. | 26 | "Function that checks if the given JID should be shown in the mode line. |
15 | This does the same as `jabber-activity-show-p', but for the | 27 | This does the same as `jabber-activity-show-p', but for the |
diff --git a/lisp/+key.el b/lisp/+key.el index ad3b215..a217dad 100644 --- a/lisp/+key.el +++ b/lisp/+key.el | |||
@@ -19,9 +19,9 @@ | |||
19 | 19 | ||
20 | ;; I need to define this map before the proper mode map. | 20 | ;; I need to define this map before the proper mode map. |
21 | (defvar +key-leader-map (let ((map (make-sparse-keymap)) | 21 | (defvar +key-leader-map (let ((map (make-sparse-keymap)) |
22 | (c-z (global-key-binding "\C-z"))) | 22 | (c-z (global-key-binding "\C-z"))) |
23 | (define-key map "\C-z" c-z) | 23 | ;;(define-key map "\C-z" c-z) |
24 | map) | 24 | map) |
25 | "A leader keymap under the \"C-z\" bind.") | 25 | "A leader keymap under the \"C-z\" bind.") |
26 | 26 | ||
27 | ;; http://xahlee.info/emacs/emacs/emacs_menu_app_keys.html and | 27 | ;; http://xahlee.info/emacs/emacs/emacs_menu_app_keys.html and |
diff --git a/lisp/+modeline.el b/lisp/+modeline.el index e5b5bc6..df9d504 100644 --- a/lisp/+modeline.el +++ b/lisp/+modeline.el | |||
@@ -126,9 +126,18 @@ and appended with `truncate-string-ellipsis'." | |||
126 | (propertize ;; (+string-truncate (format-mode-line mode-name) 16) | 126 | (propertize ;; (+string-truncate (format-mode-line mode-name) 16) |
127 | (format-mode-line mode-name) | 127 | (format-mode-line mode-name) |
128 | 'face 'font-lock-keyword-face | 128 | 'face 'font-lock-keyword-face |
129 | 'keymap mode-line-major-mode-keymap | 129 | 'keymap (let ((map (make-sparse-keymap))) |
130 | 'help-echo (concat (format-mode-line mode-name) | 130 | (bindings--define-key map [mode-line down-mouse-1] |
131 | " mode\nmouse-1: show menu.") | 131 | `(menu-item "Menu Bar" ignore |
132 | :filter ,(lambda (_) (mouse-menu-major-mode-map)))) | ||
133 | (define-key map [mode-line mouse-2] 'describe-mode) | ||
134 | (bindings--define-key map [mode-line down-mouse-3] | ||
135 | `(menu-item "Minions" minions-minor-modes-menu)) | ||
136 | map) | ||
137 | 'help-echo (+concat (list (format-mode-line mode-name) " mode") | ||
138 | "mouse-1: show menu" | ||
139 | "mouse-2: describe mode" | ||
140 | "mouse-3: display minor modes") | ||
132 | 'mouse-face 'mode-line-highlight))) | 141 | 'mouse-face 'mode-line-highlight))) |
133 | 142 | ||
134 | (defcustom +modeline-modified-icon-alist '((ephemeral . "*") | 143 | (defcustom +modeline-modified-icon-alist '((ephemeral . "*") |
@@ -302,9 +311,10 @@ The order of elements matters: whichever one matches first is applied." | |||
302 | 311 | ||
303 | (defun +modeline-line-column (&optional spacer) ; adapted from `simple-modeline' | 312 | (defun +modeline-line-column (&optional spacer) ; adapted from `simple-modeline' |
304 | "Display the current cursor line and column depending on modes." | 313 | "Display the current cursor line and column depending on modes." |
305 | (funcall (+modeline-concat '(+modeline-line | 314 | (concat (or spacer +modeline-default-spacer) |
306 | +modeline-column) | 315 | (+modeline-line "") |
307 | "|"))) | 316 | "|" |
317 | (+modeline-column ""))) | ||
308 | 318 | ||
309 | (defcustom +modeline-position-function nil | 319 | (defcustom +modeline-position-function nil |
310 | "Function to use instead of `+modeline-position' in modeline." | 320 | "Function to use instead of `+modeline-position' in modeline." |
@@ -312,17 +322,16 @@ The order of elements matters: whichever one matches first is applied." | |||
312 | function) | 322 | function) |
313 | :local t) | 323 | :local t) |
314 | 324 | ||
315 | (defun +modeline-position (&optional _) | 325 | (defun +modeline-position (&optional spacer) |
316 | "Display the current cursor position. | 326 | "Display the current cursor position. |
317 | See `line-number-mode', `column-number-mode', and | 327 | See `line-number-mode', `column-number-mode', and |
318 | `file-percentage-mode'. If `+modeline-position-function' is set | 328 | `file-percentage-mode'. If `+modeline-position-function' is set |
319 | to a function in the current buffer, call that function instead." | 329 | to a function in the current buffer, call that function instead." |
320 | (funcall (if +modeline-position-function | 330 | (concat (or spacer +modeline-default-spacer) |
321 | +modeline-position-function | 331 | (if +modeline-position-function |
322 | (+modeline-concat '(+modeline-region | 332 | (funcall +modeline-position-function) |
323 | +modeline-line-column | 333 | (concat (+modeline-region) |
324 | ;; +modeline-file-percentage | 334 | (+modeline-line-column))))) |
325 | ))))) | ||
326 | 335 | ||
327 | (defun +modeline-vc (&optional spacer) | 336 | (defun +modeline-vc (&optional spacer) |
328 | "Display the version control branch of the current buffer in the modeline." | 337 | "Display the version control branch of the current buffer in the modeline." |
diff --git a/lisp/+org.el b/lisp/+org.el index 252ee55..6075b60 100644 --- a/lisp/+org.el +++ b/lisp/+org.el | |||
@@ -588,19 +588,6 @@ and POST-PROCESS are passed to `org-export-to-file'." | |||
588 | ("—" "---")))) | 588 | ("—" "---")))) |
589 | (replace-match replace nil nil))))) | 589 | (replace-match replace nil nil))))) |
590 | 590 | ||
591 | ;;; Toggle org-hide-emphasis-markers | ||
592 | |||
593 | (define-minor-mode +org-show-mode | ||
594 | "Show emphasis markers and full links in `org-mode'." | ||
595 | :lighter "/*/" | ||
596 | (setq org-hide-emphasis-markers (not +org-show-mode) | ||
597 | org-link-descriptive (not +org-show-mode)) | ||
598 | (funcall (if +org-show-mode | ||
599 | #'remove-from-invisibility-spec | ||
600 | #'add-to-invisibility-spec) | ||
601 | '(org-link)) | ||
602 | (font-lock-update)) | ||
603 | |||
604 | ;;; go forward and backward in the tree, ~ cleanly ~ | 591 | ;;; go forward and backward in the tree, ~ cleanly ~ |
605 | ;; https://stackoverflow.com/a/25201697/10756297 | 592 | ;; https://stackoverflow.com/a/25201697/10756297 |
606 | 593 | ||
diff --git a/lisp/+setup.el b/lisp/+setup.el index db59223..919e312 100644 --- a/lisp/+setup.el +++ b/lisp/+setup.el | |||
@@ -29,23 +29,37 @@ | |||
29 | "Warn the user that something bad happened in `setup'." | 29 | "Warn the user that something bad happened in `setup'." |
30 | (display-warning 'setup (format message args))) | 30 | (display-warning 'setup (format message args))) |
31 | 31 | ||
32 | (defun +setup-wrap-to-demote-errors (body name) | ||
33 | "Wrap BODY in a `with-demoted-errors' block. | ||
34 | This behavior is prevented if `setup-attributes' contains the | ||
35 | symbol `without-error-demotion'. | ||
36 | |||
37 | This function differs from `setup-wrap-to-demote-errors' in that | ||
38 | it includes the NAME of the setup form in the warning output." | ||
39 | (if (memq 'without-error-demotion setup-attributes) | ||
40 | body | ||
41 | `(with-demoted-errors ,(format "Error in setup form on line %d (%s): %%S" | ||
42 | (line-number-at-pos) | ||
43 | name) | ||
44 | ,body))) | ||
45 | |||
32 | (setup-define :quit | 46 | (setup-define :quit |
33 | 'setup-quit | 47 | 'setup-quit |
34 | :documentation "Quit the current `setup' form. | 48 | :documentation "Quit the current `setup' form. |
35 | Good for commenting.") | 49 | Good for commenting.") |
36 | 50 | ||
37 | (setup-define :face | 51 | (setup-define :face |
38 | (lambda (face spec) | 52 | (lambda (face spec) |
39 | `(custom-set-faces (list ,face ,spec 'now "Customized by `setup'."))) | 53 | `(custom-set-faces (list ,face ,spec 'now "Customized by `setup'."))) |
40 | :documentation "Customize FACE with SPEC using `custom-set-faces'." | 54 | :documentation "Customize FACE with SPEC using `custom-set-faces'." |
41 | :repeatable t) | 55 | :repeatable t) |
42 | 56 | ||
43 | (setup-define :load-after | 57 | (setup-define :load-after |
44 | (lambda (&rest features) | 58 | (lambda (&rest features) |
45 | (let ((body `(require ',(setup-get 'feature)))) | 59 | (let ((body `(require ',(setup-get 'feature)))) |
46 | (dolist (feature (nreverse features)) | 60 | (dolist (feature (nreverse features)) |
47 | (setq body `(with-eval-after-load ',feature ,body))) | 61 | (setq body `(with-eval-after-load ',feature ,body))) |
48 | body)) | 62 | body)) |
49 | :documentation "Load the current feature after FEATURES.") | 63 | :documentation "Load the current feature after FEATURES.") |
50 | 64 | ||
51 | (setup-define :load-from | 65 | (setup-define :load-from |
@@ -88,50 +102,7 @@ If PATH does not exist, abort the evaluation." | |||
88 | ',recipe) | 102 | ',recipe) |
89 | ,(setup-quit)) | 103 | ,(setup-quit)) |
90 | (:success t))) | 104 | (:success t))) |
91 | (defun setup--straight-handle-arg (arg var) | 105 | ,(setup-quit)))) |
92 | (cond | ||
93 | ((and (boundp var) (symbol-value var)) t) | ||
94 | ((keywordp arg) (set var t)) | ||
95 | ((functionp arg) (set var nil) (funcall arg)) | ||
96 | ((listp arg) (set var nil) (eval arg :lexical)))) | ||
97 | |||
98 | (setup-define :straight | ||
99 | (lambda (recipe &rest predicates) | ||
100 | (let* ((skp (make-symbol "straight-keyword-p")) | ||
101 | (straight-use-p | ||
102 | (cl-every (lambda (f) (setup--straight-handle-arg f skp)) | ||
103 | predicates)) | ||
104 | (form `(unless (and ,straight-use-p | ||
105 | (condition-case e | ||
106 | (straight-use-package ',recipe) | ||
107 | (error | ||
108 | (+setup-warn ":straight error: %S" | ||
109 | ',recipe) | ||
110 | ,(setup-quit)) | ||
111 | (:success t))) | ||
112 | ,(setup-quit)))) | ||
113 | ;; Keyword arguments --- :quit is special and should short-circuit | ||
114 | (if (memq :quit predicates) | ||
115 | (setq form `,(setup-quit)) | ||
116 | ;; Otherwise, handle the rest of them ... | ||
117 | (when-let ((after (cadr (memq :after predicates)))) | ||
118 | (setq form `(with-eval-after-load ,(if (eq after t) | ||
119 | (setup-get 'feature) | ||
120 | after) | ||
121 | ,form)))) | ||
122 | ;; Finally ... | ||
123 | form)) | ||
124 | :documentation "Install RECIPE with `straight-use-package'. | ||
125 | If PREDICATES are given, only install RECIPE if all of them return non-nil. | ||
126 | The following keyword arguments are also recognized: | ||
127 | - :quit --- immediately stop evaluating. Good for commenting. | ||
128 | - :after FEATURE --- only install RECIPE after FEATURE is loaded. | ||
129 | If FEATURE is t, install RECIPE after the current feature." | ||
130 | :repeatable nil | ||
131 | :indent 1 | ||
132 | :shorthand (lambda (sexp) | ||
133 | (let ((recipe (cadr sexp))) | ||
134 | (or (car-safe recipe) recipe)))) ,(setup-quit)))) | ||
135 | ;; Keyword arguments --- :quit is special and should short-circuit | 106 | ;; Keyword arguments --- :quit is special and should short-circuit |
136 | (if (memq :quit predicates) | 107 | (if (memq :quit predicates) |
137 | (setq form `,(setup-quit)) | 108 | (setq form `,(setup-quit)) |
@@ -155,6 +126,13 @@ The following keyword arguments are also recognized: | |||
155 | (let ((recipe (cadr sexp))) | 126 | (let ((recipe (cadr sexp))) |
156 | (or (car-safe recipe) recipe))))) | 127 | (or (car-safe recipe) recipe))))) |
157 | 128 | ||
129 | (setup-define :needs | ||
130 | (lambda (executable) | ||
131 | `(unless (executable-find ,executable) | ||
132 | ,(setup-quit))) | ||
133 | :documentation "If EXECUTABLE is not in the path, stop here." | ||
134 | :repeatable 1) | ||
135 | |||
158 | 136 | ||
159 | ;;; Redefines of `setup' forms | 137 | ;;; Redefines of `setup' forms |
160 | 138 | ||
diff --git a/lisp/+straight.el b/lisp/+straight.el index d00ad9a..cba6c96 100644 --- a/lisp/+straight.el +++ b/lisp/+straight.el | |||
@@ -34,6 +34,7 @@ all of them, for reasons that should be obvious. | |||
34 | 34 | ||
35 | With a prefix argument, it also pulls the packages FROM-UPSTREAM." | 35 | With a prefix argument, it also pulls the packages FROM-UPSTREAM." |
36 | (interactive "P") | 36 | (interactive "P") |
37 | (straight-pull-recipe-repositories) | ||
37 | (straight-pull-all from-upstream) | 38 | (straight-pull-all from-upstream) |
38 | (straight-rebuild-all)) | 39 | (straight-rebuild-all)) |
39 | 40 | ||
diff --git a/lisp/acdw.el b/lisp/acdw.el index 7ef745d..6707e76 100644 --- a/lisp/acdw.el +++ b/lisp/acdw.el | |||
@@ -138,6 +138,10 @@ active, or else the entire buffer." | |||
138 | (= (line-beginning-position) (line-end-position))) | 138 | (= (line-beginning-position) (line-end-position))) |
139 | (insert "\n"))))) | 139 | (insert "\n"))))) |
140 | 140 | ||
141 | (defcustom +open-paragraph-ignore-modes '(special-mode lui-mode comint-mode) | ||
142 | "Modes in which `+open-paragraph' makes no sense." | ||
143 | :type '(repeat function)) | ||
144 | |||
141 | (defun +open-paragraph (&optional arg) | 145 | (defun +open-paragraph (&optional arg) |
142 | "Open a paragraph after paragraph at point. | 146 | "Open a paragraph after paragraph at point. |
143 | A paragraph is defined as continguous non-empty lines of text | 147 | A paragraph is defined as continguous non-empty lines of text |
@@ -148,7 +152,7 @@ Called with prefix ARG, open a paragraph before point." | |||
148 | ;; TODO: Take an integer as ARG, allowing for skipping paragraphs up and down. | 152 | ;; TODO: Take an integer as ARG, allowing for skipping paragraphs up and down. |
149 | (interactive "*P") | 153 | (interactive "*P") |
150 | ;; TODO: add `+open-paragraph-ignore-modes' | 154 | ;; TODO: add `+open-paragraph-ignore-modes' |
151 | (unless (derived-mode-p 'special-mode 'lui-mode 'comint-mode) | 155 | (unless (apply #'derived-mode-p +open-paragraph-ignore-modes) |
152 | ;; Go to next blank line. This /isn't/ `end-of-paragraph-text' because | 156 | ;; Go to next blank line. This /isn't/ `end-of-paragraph-text' because |
153 | ;; that's weird with org, and I'm guessing other modes too. | 157 | ;; that's weird with org, and I'm guessing other modes too. |
154 | (unless (looking-at "^$") (forward-line (if arg -1 +1))) | 158 | (unless (looking-at "^$") (forward-line (if arg -1 +1))) |
@@ -426,5 +430,22 @@ This calls `indent-rigidly' and passes ARG to it." | |||
426 | (goto-char (line-end-position))) | 430 | (goto-char (line-end-position))) |
427 | (call-interactively #'indent-rigidly)) | 431 | (call-interactively #'indent-rigidly)) |
428 | 432 | ||
433 | (defun +sort-lines (reverse beg end) | ||
434 | "Sort lines in region, ignoring leading whitespace. | ||
435 | REVERSE non-nil means descending order; interactively, REVERSE is | ||
436 | the prefix argument, and BEG and END are the region. The | ||
437 | variable `sort-fold-case' determines whether case affects the | ||
438 | sort order." | ||
439 | (interactive "P\nr") | ||
440 | (save-excursion | ||
441 | (save-restriction | ||
442 | (narrow-to-region beg end) | ||
443 | (goto-char (point-min)) | ||
444 | (let ((inhibit-field-text-motion t)) | ||
445 | (sort-subr reverse | ||
446 | #'forward-line | ||
447 | #'end-of-line | ||
448 | #'beginning-of-line-text))))) | ||
449 | |||
429 | (provide 'acdw) | 450 | (provide 'acdw) |
430 | ;;; acdw.el ends here | 451 | ;;; acdw.el ends here |
diff --git a/lisp/find-script.el b/lisp/find-script.el new file mode 100644 index 0000000..9e3633a --- /dev/null +++ b/lisp/find-script.el | |||
@@ -0,0 +1,36 @@ | |||
1 | ;;; find-script.el --- Find a script in $PATH -*- lexical-binding: t; -*- | ||
2 | |||
3 | ;;; Commentary: | ||
4 | |||
5 | ;; This package makes it easier to find a script to edit in $PATH. The initial | ||
6 | ;; `rehash-exes' is slow, but it's stored in `*exes*' as a caching mechanism. | ||
7 | ;; However, I'm sure it could be improved. | ||
8 | |||
9 | ;; In addition, `*exes*' currently contains /all/ executables in $PATH, which | ||
10 | ;; ... maybe only the ones stored in some text format should be shown. | ||
11 | |||
12 | ;;; Code: | ||
13 | |||
14 | (defvar *exes* nil | ||
15 | "All the exectuables in $PATH. | ||
16 | Run `rehash-exes' to refresh this variable.") | ||
17 | |||
18 | (defun rehash-exes () | ||
19 | "List all the executables in $PATH. | ||
20 | Also sets `*exes*' parameter." | ||
21 | (setq *exes* | ||
22 | (cl-loop for dir in exec-path | ||
23 | append (file-expand-wildcards (concat dir "*")) | ||
24 | into exes | ||
25 | finally return exes))) | ||
26 | |||
27 | ;;;###autoload | ||
28 | (defun find-script (script) | ||
29 | "Find a file in $PATH." | ||
30 | (interactive | ||
31 | (list (let ((exes (or *exes* (rehash-exes)))) | ||
32 | (completing-read "Script> " exes nil t)))) | ||
33 | (find-file script)) | ||
34 | |||
35 | (provide 'find-script) | ||
36 | ;;; find-script.el ends here | ||