diff options
-rw-r--r-- | init.el | 125 | ||||
-rw-r--r-- | lisp/acdw-apheleia.el | 25 | ||||
-rw-r--r-- | lisp/acdw-circe.el | 15 | ||||
-rw-r--r-- | lisp/acdw-modeline.el | 11 | ||||
-rw-r--r-- | lisp/acdw-re.el | 4 | ||||
-rw-r--r-- | lisp/acdw-setup.el | 11 | ||||
-rw-r--r-- | lisp/acdw.el | 25 | ||||
-rw-r--r-- | lisp/chd.el | 49 |
8 files changed, 161 insertions, 104 deletions
diff --git a/init.el b/init.el index a1d0f14..fff1782 100644 --- a/init.el +++ b/init.el | |||
@@ -85,41 +85,7 @@ | |||
85 | 85 | ||
86 | (when-let ((default-directory | 86 | (when-let ((default-directory |
87 | (expand-file-name-exists-p "pkg/" user-emacs-directory))) | 87 | (expand-file-name-exists-p "pkg/" user-emacs-directory))) |
88 | (normal-top-level-add-subdirs-to-load-path)) | 88 | (normal-top-level-add-subdirs-to-load-path))) |
89 | |||
90 | (defun acdw/sort-setups () | ||
91 | "Sort `setup' forms in the current buffer. | ||
92 | Actually sorts all forms, but based on the logic of `setup'. | ||
93 | In short, DO NOT USE THIS FUNCTION!!!" | ||
94 | (save-excursion | ||
95 | (sort-sexps | ||
96 | (point-min) (point-max) | ||
97 | ;; Key function | ||
98 | nil | ||
99 | ;; Sort function | ||
100 | (lambda (s1 s2) ; oh god, this is worse. | ||
101 | (let* ((s1 (cdr s1)) (s2 (cdr s2)) ; for the strings themselves | ||
102 | (require-regexp (rx bos (* nonl) ":require")) | ||
103 | (straight-regexp (rx bos (* nonl) ":straight")) | ||
104 | (s1-require (string-match require-regexp s1)) | ||
105 | (s2-require (string-match require-regexp s2)) | ||
106 | (s1-straight (string-match straight-regexp s1)) | ||
107 | (s2-straight (string-match straight-regexp s2))) | ||
108 | (cond | ||
109 | ;; Straight forms require some weirdness | ||
110 | ((and s1-straight s2-straight) | ||
111 | (let* ((r (rx ":straight" (? "-if") (* space) (? "("))) | ||
112 | (s1 (replace-regexp-in-string r "" s1)) | ||
113 | (s2 (replace-regexp-in-string r "" s2))) | ||
114 | (string< s1 s2))) | ||
115 | ;; requires should go first | ||
116 | ((and s1-require (not s2-require)) t) | ||
117 | ((and (not s1-require) s2-require) nil) | ||
118 | ;; straights should go last | ||
119 | ((and s1-straight (not s2-straight)) nil) | ||
120 | ((and (not s1-straight) s2-straight) t) | ||
121 | ;; else, just sort em. | ||
122 | (t (string< s1 s2))))))))) | ||
123 | 89 | ||
124 | (setup autorevert | 90 | (setup autorevert |
125 | (:option global-auto-revert-non-file-buffers t | 91 | (:option global-auto-revert-non-file-buffers t |
@@ -756,10 +722,7 @@ specific to most general, they are these: | |||
756 | 722 | ||
757 | (defun prog-mode@auto-fill () | 723 | (defun prog-mode@auto-fill () |
758 | (setq-local comment-auto-fill-only-comments t) | 724 | (setq-local comment-auto-fill-only-comments t) |
759 | (turn-on-auto-fill))) | 725 | (turn-on-auto-fill)))) |
760 | |||
761 | (add-hook 'after-save-hook | ||
762 | #'executable-make-buffer-file-executable-if-script-p)) | ||
763 | 726 | ||
764 | (setup repeat | 727 | (setup repeat |
765 | ;; new for Emacs 28! | 728 | ;; new for Emacs 28! |
@@ -1001,30 +964,26 @@ specific to most general, they are these: | |||
1001 | (setup (:straight (apheleia | 964 | (setup (:straight (apheleia |
1002 | :host github | 965 | :host github |
1003 | :repo "raxod502/apheleia")) | 966 | :repo "raxod502/apheleia")) |
1004 | 967 | ||
1005 | (apheleia-global-mode +1) | 968 | (:also-load acdw-apheleia) |
1006 | 969 | (add-hook 'before-save-hook #'apheleia-dumb-auto-format) | |
1007 | ;; Use a dumb formatter on modes that `apheleia' doesn't work for. | 970 | |
1008 | (add-hook 'before-save-hook | 971 | ;; Aphelia can't find prettier on Windows (though I |
1009 | (defun before-save@dumb-auto-format () | 972 | ;; installed it, I think), and it keeps trying to start |
1010 | (setq stupid-modes '(makefile-mode | 973 | ;; new processes until Emacs runs out of subprocess space. |
1011 | org-mode)) | 974 | ;; So I just enable it at home. |
1012 | ;; If there's no apheleia formatter for the mode, just indent the | 975 | (unless (acdw/system :work) |
1013 | ;; buffer. | 976 | (apheleia-global-mode +1))) |
1014 | (unless (or (apply #'derived-mode-p stupid-modes) | ||
1015 | (and (fboundp 'apheleia--get-formatter-command) | ||
1016 | (apheleia--get-formatter-command))) | ||
1017 | (indent-region (point-min) (point-max)))))) | ||
1018 | 977 | ||
1019 | (setup (:straight async) | 978 | (setup (:straight async) |
1020 | (dired-async-mode +1)) | 979 | (dired-async-mode +1)) |
1021 | 980 | ||
1022 | (setup (:straight avy) | 981 | (setup (:straight avy) |
1023 | (:global "C-'" #'avy-goto-char-timer | 982 | (:global "M-j" #'avy-goto-char-timer |
1024 | "C-c C-j" #'avy-resume) | 983 | "C-c C-j" #'avy-resume) |
1025 | 984 | ||
1026 | (:with-feature isearch | 985 | (:with-feature isearch |
1027 | (:bind "C-'" #'avy-isearch))) | 986 | (:bind "M-j" #'avy-isearch))) |
1028 | 987 | ||
1029 | (setup (:straight circe) | 988 | (setup (:straight circe) |
1030 | (require 'circe) | 989 | (require 'circe) |
@@ -1085,7 +1044,8 @@ specific to most general, they are these: | |||
1085 | ((t (:inherit (modus-themes-slant)))))) | 1044 | ((t (:inherit (modus-themes-slant)))))) |
1086 | 1045 | ||
1087 | (:bind "C-c C-p" #'circe-command-PART | 1046 | (:bind "C-c C-p" #'circe-command-PART |
1088 | "C-l" #'lui-track-jump-to-indicator) | 1047 | "C-l" #'lui-track-jump-to-indicator |
1048 | "<C-return>" #'circe-chat@set-prompt) | ||
1089 | 1049 | ||
1090 | (:advise circe-command-PART :after #'circe-part@kill-buffer | 1050 | (:advise circe-command-PART :after #'circe-part@kill-buffer |
1091 | circe-command-QUIT :after #'circe-quit@kill-buffer | 1051 | circe-command-QUIT :after #'circe-quit@kill-buffer |
@@ -1096,15 +1056,7 @@ specific to most general, they are these: | |||
1096 | #'enable-circe-color-nicks | 1056 | #'enable-circe-color-nicks |
1097 | ;; #'enable-circe-display-images | 1057 | ;; #'enable-circe-display-images |
1098 | #'enable-circe-new-day-notifier | 1058 | #'enable-circe-new-day-notifier |
1099 | (defun circe-chat@set-prompt () | 1059 | #'circe-chat@set-prompt)) |
1100 | (lui-set-prompt | ||
1101 | (concat | ||
1102 | (propertize | ||
1103 | (acdw-irc/margin-format (buffer-name) " " "> ") | ||
1104 | 'face 'circe-prompt-face | ||
1105 | 'read-only t | ||
1106 | 'intangible t | ||
1107 | 'cursor-intangible t)))))) | ||
1108 | 1060 | ||
1109 | (autoload 'circe-nick-color-reset "circe-color-nicks") | 1061 | (autoload 'circe-nick-color-reset "circe-color-nicks") |
1110 | (add-hook 'modus-themes-after-load-theme-hook | 1062 | (add-hook 'modus-themes-after-load-theme-hook |
@@ -1125,7 +1077,8 @@ specific to most general, they are these: | |||
1125 | word-wrap t | 1077 | word-wrap t |
1126 | wrap-prefix (repeat-string acdw-irc/left-margin " ") | 1078 | wrap-prefix (repeat-string acdw-irc/left-margin " ") |
1127 | line-number-mode nil | 1079 | line-number-mode nil |
1128 | column-number-mode nil) | 1080 | column-number-mode nil |
1081 | file-percentage-mode nil) | ||
1129 | 1082 | ||
1130 | (:hook #'enable-lui-track))) | 1083 | (:hook #'enable-lui-track))) |
1131 | 1084 | ||
@@ -1296,9 +1249,8 @@ specific to most general, they are these: | |||
1296 | "Display tooltips for the current word" t) | 1249 | "Display tooltips for the current word" t) |
1297 | (autoload 'global-dictionary-tooltip-mode "dictionary" | 1250 | (autoload 'global-dictionary-tooltip-mode "dictionary" |
1298 | "Enable/disable dictionary-tooltip-mode for all buffers" t) | 1251 | "Enable/disable dictionary-tooltip-mode for all buffers" t) |
1299 | 1252 | ||
1300 | (:with-map lookup-map | 1253 | (define-key lookup-map "d" #'dictionary-search)) |
1301 | (:bind "d" #'dictionary-search))) | ||
1302 | 1254 | ||
1303 | (setup (:straight (dogears | 1255 | (setup (:straight (dogears |
1304 | :host github | 1256 | :host github |
@@ -1311,9 +1263,7 @@ specific to most general, they are these: | |||
1311 | elfeed-show-mode | 1263 | elfeed-show-mode |
1312 | elfeed-search-mode)) | 1264 | elfeed-search-mode)) |
1313 | (:option (append dogears-ignore-modes) mode))) | 1265 | (:option (append dogears-ignore-modes) mode))) |
1314 | (:global "M-g d" dogears-go | 1266 | (:global "M-g d" dogears-go) |
1315 | "M-g M-b" dogears-back | ||
1316 | "M-g M-f" dogears-forward) | ||
1317 | (:autoload dogears-mode) | 1267 | (:autoload dogears-mode) |
1318 | (dogears-mode +1)) | 1268 | (dogears-mode +1)) |
1319 | 1269 | ||
@@ -1500,6 +1450,11 @@ specific to most general, they are these: | |||
1500 | (:hook-into emacs-lisp-mode | 1450 | (:hook-into emacs-lisp-mode |
1501 | lisp-interaction-mode)) | 1451 | lisp-interaction-mode)) |
1502 | 1452 | ||
1453 | (setup executable | ||
1454 | (:option executable-prefix-env t) | ||
1455 | (add-hook 'after-save-hook | ||
1456 | #'executable-make-buffer-file-executable-if-script-p)) | ||
1457 | |||
1503 | (setup (:straight-if exec-path-from-shell | 1458 | (setup (:straight-if exec-path-from-shell |
1504 | (acdw/system :home)) | 1459 | (acdw/system :home)) |
1505 | (when (daemonp) | 1460 | (when (daemonp) |
@@ -1677,23 +1632,14 @@ When PREFIX is non-nil, open links with | |||
1677 | (link-hint--multiple (if prefix :open-secondary :open)))) | 1632 | (link-hint--multiple (if prefix :open-secondary :open)))) |
1678 | 1633 | ||
1679 | (:option link-hint-avy-style 'post) | 1634 | (:option link-hint-avy-style 'post) |
1680 | (:global "C-;" | 1635 | (:global "C-j" |
1681 | (defun acdw/link-hint-open-link (arg) | 1636 | (defun acdw/link-hint-open-link (arg) |
1682 | "Open a link using `link-hint-open-link', prefix-aware. | 1637 | "Open a link using `link-hint-open-link', prefix-aware. |
1683 | That is, a prefix argument (\\[universal-argument]) will open the | 1638 | That is, a prefix argument (\\[universal-argument]) will open the |
1684 | browser defined in `browse-url-secondary-browser-function'." | 1639 | browser defined in `browse-url-secondary-browser-function'." |
1685 | (interactive "P") | 1640 | (interactive "P") |
1686 | (avy-with link-hint-open-link | 1641 | (avy-with link-hint-open-link |
1687 | (link-hint--one (if arg :open-secondary :open))))) | 1642 | (link-hint--one (if arg :open-secondary :open)))))) |
1688 | |||
1689 | ;; Setup for different modes. | ||
1690 | ;; There has /got/ to be an easier way here! | ||
1691 | (dolist (key '(";" "o")) | ||
1692 | (:with-mode special-mode (:bind key #'link-hint-open-link)) | ||
1693 | (:with-mode help-mode (:bind key #'link-hint-open-link)) | ||
1694 | (:with-feature helpful (:bind key #'link-hint-open-link)) | ||
1695 | (:with-mode Info-mode (:bind key #'link-hint-open-link)) | ||
1696 | (:with-feature reading (:bind key #'link-hint-open-link)))) | ||
1697 | 1643 | ||
1698 | (setup (:straight lua-mode) | 1644 | (setup (:straight lua-mode) |
1699 | (:file-match (rx ".lua" eos))) | 1645 | (:file-match (rx ".lua" eos))) |
@@ -1901,7 +1847,8 @@ browser defined in `browse-url-secondary-browser-function'." | |||
1901 | "C-c C-p" #'acdw/org-previous-heading-widen | 1847 | "C-c C-p" #'acdw/org-previous-heading-widen |
1902 | "C-x n t" #'org-narrow-to-task) | 1848 | "C-x n t" #'org-narrow-to-task) |
1903 | 1849 | ||
1904 | (:unbind "C-'") | 1850 | (:unbind "C-j" ; org-return-and-maybe-indent |
1851 | "M-j") | ||
1905 | 1852 | ||
1906 | (with-eval-after-load 'org-export | 1853 | (with-eval-after-load 'org-export |
1907 | (:option (append org-export-filter-final-output-functions) | 1854 | (:option (append org-export-filter-final-output-functions) |
@@ -2025,13 +1972,15 @@ the default is \"/\"." | |||
2025 | (global-page-break-lines-mode +1)) | 1972 | (global-page-break-lines-mode +1)) |
2026 | 1973 | ||
2027 | (setup (:straight paredit) | 1974 | (setup (:straight paredit) |
2028 | ;; I don't use paredit-splice-sexp much, and it stomps on isearch. | ||
2029 | (:unbind "M-s") | ||
2030 | |||
2031 | (:bind "DEL" #'paredit-backward-delete | 1975 | (:bind "DEL" #'paredit-backward-delete |
2032 | "C-M-;" #'comment-or-uncomment-sexp | 1976 | "C-M-;" #'comment-or-uncomment-sexp |
2033 | "C-<backspace>" #'paredit-backward-kill-word | 1977 | "C-<backspace>" #'paredit-backward-kill-word |
2034 | "M-w" #'paredit-copy-as-kill) | 1978 | "M-w" #'paredit-copy-as-kill |
1979 | "RET" #'paredit-newline) | ||
1980 | |||
1981 | (:unbind "M-s" ; paredit-splice-sexp | ||
1982 | "C-j" ; paredit-newline (rebound to RET) | ||
1983 | ) | ||
2035 | 1984 | ||
2036 | (:hook-into emacs-lisp-mode | 1985 | (:hook-into emacs-lisp-mode |
2037 | ielm-mode sly-repl-mode | 1986 | ielm-mode sly-repl-mode |
diff --git a/lisp/acdw-apheleia.el b/lisp/acdw-apheleia.el new file mode 100644 index 0000000..1b646ef --- /dev/null +++ b/lisp/acdw-apheleia.el | |||
@@ -0,0 +1,25 @@ | |||
1 | ;;; acdw-apheleia.el --- bespoke apheleia junk -*- lexical-binding: t -*- | ||
2 | |||
3 | ;;; Commentary: | ||
4 | |||
5 | ;;; Code: | ||
6 | |||
7 | (require 'apheleia) | ||
8 | |||
9 | (defcustom apheleia-stupid-modes '(makefile-mode | ||
10 | org-mode) | ||
11 | "List of stupid modes to not use `apheleia-global-mode' on." | ||
12 | :type '(repeat function) | ||
13 | :group 'apheleia) | ||
14 | |||
15 | (defun apheleia-dumb-auto-format () | ||
16 | "Format a buffer dumbly." | ||
17 | ;; If there's no apheleia formatter for the mode, just indent the | ||
18 | ;; buffer. | ||
19 | (unless (or (apply #'derived-mode-p apheleia-stupid-modes) | ||
20 | (and (fboundp 'apheleia--get-formatter-command) | ||
21 | (apheleia--get-formatter-command))) | ||
22 | (indent-region (point-min) (point-max)))) | ||
23 | |||
24 | (provide 'acdw-apheleia) | ||
25 | ;;; acdw-apheleia ends here | ||
diff --git a/lisp/acdw-circe.el b/lisp/acdw-circe.el index 69b10be..e85587b 100644 --- a/lisp/acdw-circe.el +++ b/lisp/acdw-circe.el | |||
@@ -17,6 +17,21 @@ | |||
17 | (let ((short-url (0x0-shorten-uri (0x0--choose-server) url))) | 17 | (let ((short-url (0x0-shorten-uri (0x0--choose-server) url))) |
18 | (circe-command-SAY short-url))) | 18 | (circe-command-SAY short-url))) |
19 | 19 | ||
20 | ;;; Hooks | ||
21 | |||
22 | (defun circe-chat@set-prompt () | ||
23 | "Set the prompt to the buffer name, shortening it." | ||
24 | (interactive) ; set interactive to unfuck the prompt when need be | ||
25 | (lui-set-prompt | ||
26 | (propertize | ||
27 | (concat | ||
28 | (acdw-irc/margin-format (buffer-name) "" ">") | ||
29 | " ") | ||
30 | 'face 'circe-prompt-face | ||
31 | 'read-only t | ||
32 | 'intangible t | ||
33 | 'cursor-intangible t))) | ||
34 | |||
20 | ;;; Advices | 35 | ;;; Advices |
21 | 36 | ||
22 | (defun circe-part@kill-buffer (&rest _) | 37 | (defun circe-part@kill-buffer (&rest _) |
diff --git a/lisp/acdw-modeline.el b/lisp/acdw-modeline.el index 25502ec..9963309 100644 --- a/lisp/acdw-modeline.el +++ b/lisp/acdw-modeline.el | |||
@@ -125,6 +125,10 @@ indicator in the mode-line." | |||
125 | 'mouse-2 #'mode-line-widen)) | 125 | 'mouse-2 #'mode-line-widen)) |
126 | 'mouse-face 'mode-line-highlight)))) | 126 | 'mouse-face 'mode-line-highlight)))) |
127 | 127 | ||
128 | (define-minor-mode file-percentage-mode | ||
129 | "Toggle the percentage display in the mode line (File Percentage Mode)." | ||
130 | :init-value t :global t :group 'mode-line) | ||
131 | |||
128 | (defun acdw-modeline/position () | 132 | (defun acdw-modeline/position () |
129 | "Displays the current cursor position in the mode-line. | 133 | "Displays the current cursor position in the mode-line. |
130 | 134 | ||
@@ -140,7 +144,10 @@ is, if point < mark." | |||
140 | ((column-number-mode | 144 | ((column-number-mode |
141 | (column-number-indicator-zero-based | 145 | (column-number-indicator-zero-based |
142 | (5 " C%c") | 146 | (5 " C%c") |
143 | (5 " C%C"))))) | 147 | (5 " C%C"))) |
148 | " ")) | ||
149 | (file-percentage-mode | ||
150 | (7 "%p%% ")) | ||
144 | ,(if (region-active-p) | 151 | ,(if (region-active-p) |
145 | (propertize (format "%s%-5d" | 152 | (propertize (format "%s%-5d" |
146 | (if (and (mark) | 153 | (if (and (mark) |
@@ -183,7 +190,7 @@ is, if point < mark." | |||
183 | (defun acdw-modeline/wc () | 190 | (defun acdw-modeline/wc () |
184 | "Display current `wc-buffer-stats'." | 191 | "Display current `wc-buffer-stats'." |
185 | (when (bound-and-true-p wc-mode) | 192 | (when (bound-and-true-p wc-mode) |
186 | (or wc-buffer-stats "[w]"))) | 193 | (or wc-buffer-stats " [w]"))) |
187 | 194 | ||
188 | (defun acdw-modeline/winum () | 195 | (defun acdw-modeline/winum () |
189 | "Show the `winum' number of the current window in the modeline. | 196 | "Show the `winum' number of the current window in the modeline. |
diff --git a/lisp/acdw-re.el b/lisp/acdw-re.el index db46af1..1fc0a9c 100644 --- a/lisp/acdw-re.el +++ b/lisp/acdw-re.el | |||
@@ -17,6 +17,10 @@ | |||
17 | ;; Pulled mostly from karthinks: | 17 | ;; Pulled mostly from karthinks: |
18 | ;; https://karthinks.com/software/bridging-islands-in-emacs-1/ | 18 | ;; https://karthinks.com/software/bridging-islands-in-emacs-1/ |
19 | 19 | ||
20 | ;; UPDATED CODE: | ||
21 | ;; https://github.com/karthink/.emacs.d/blob/master/init.el#L981 | ||
22 | ;; https://github.com/karthink/.emacs.d/blob/master/lisp/reb-fix.el | ||
23 | |||
20 | ;;; Code: | 24 | ;;; Code: |
21 | 25 | ||
22 | (defvar acdw/re-builder-positions nil | 26 | (defvar acdw/re-builder-positions nil |
diff --git a/lisp/acdw-setup.el b/lisp/acdw-setup.el index e271faa..eb4d12b 100644 --- a/lisp/acdw-setup.el +++ b/lisp/acdw-setup.el | |||
@@ -87,5 +87,16 @@ package. This macro is not repeatable." | |||
87 | (let ((recipe (cadr sexp))) | 87 | (let ((recipe (cadr sexp))) |
88 | (if (consp recipe) (car recipe) recipe)))) | 88 | (if (consp recipe) (car recipe) recipe)))) |
89 | 89 | ||
90 | ;; https://www.emacswiki.org/emacs/SetupEl | ||
91 | (setup-define :load-after | ||
92 | (lambda (&rest features) | ||
93 | (let ((body `(require ',(setup-get 'feature)))) | ||
94 | (dolist (feature (if (listp features) | ||
95 | (nreverse features) | ||
96 | (list features))) | ||
97 | (setq body `(with-eval-after-load ',feature ,body))) | ||
98 | body)) | ||
99 | :documentation "Load the current feature after FEATURES.") | ||
100 | |||
90 | (provide 'acdw-setup) | 101 | (provide 'acdw-setup) |
91 | ;;; acdw-setup.el ends here | 102 | ;;; acdw-setup.el ends here |
diff --git a/lisp/acdw.el b/lisp/acdw.el index 86443a1..792b9ef 100644 --- a/lisp/acdw.el +++ b/lisp/acdw.el | |||
@@ -93,7 +93,7 @@ features." | |||
93 | (let* ((this (car features)) | 93 | (let* ((this (car features)) |
94 | (rest (cdr features))) | 94 | (rest (cdr features))) |
95 | `(with-eval-after-load ',this | 95 | `(with-eval-after-load ',this |
96 | (with-eval-after-all ,rest ,@body))))) | 96 | (with-eval-after-loads ,rest ,@body))))) |
97 | 97 | ||
98 | (defmacro with-message (message &rest body) | 98 | (defmacro with-message (message &rest body) |
99 | "Execute BODY, messaging 'MESSAGE...' before and 'MESSAGE... Done.' after." | 99 | "Execute BODY, messaging 'MESSAGE...' before and 'MESSAGE... Done.' after." |
@@ -338,26 +338,23 @@ In short, DO NOT USE THIS FUNCTION!!!" | |||
338 | (save-excursion | 338 | (save-excursion |
339 | (sort-sexps | 339 | (sort-sexps |
340 | (point-min) (point-max) | 340 | (point-min) (point-max) |
341 | (lambda (sexp) | 341 | ;; Key function |
342 | (format "%S" (cadr sexp))) | 342 | nil |
343 | ;; Sort function | ||
343 | (lambda (s1 s2) ; oh god, this is worse. | 344 | (lambda (s1 s2) ; oh god, this is worse. |
344 | (let* ((s1 (cdr s1)) (s2 (cdr s2)) ; for the strings themselves | 345 | (let* ((s1 (cdr s1)) (s2 (cdr s2)) ; for the strings themselves |
345 | (s1-require (string-match ":require" s1)) | 346 | (require-regexp (rx bos (* nonl) ":require")) |
346 | (s2-require (string-match ":require" s2)) | 347 | (straight-regexp (rx bos (* nonl) ":straight")) |
347 | (s1-straight (string-match ":straight" s1)) | 348 | (s1-require (string-match require-regexp s1)) |
348 | (s2-straight (string-match ":straight" s2)) | 349 | (s2-require (string-match require-regexp s2)) |
349 | (s1-bare (not (or s1-require s1-straight))) | 350 | (s1-straight (string-match straight-regexp s1)) |
350 | (s2-bare (not (or s2-require s2-straight)))) | 351 | (s2-straight (string-match straight-regexp s2))) |
351 | (cond | 352 | (cond |
352 | ;; if both are the same, sort regular style | 353 | ;; Straight forms require some weirdness |
353 | ((or (and s1-require s2-require) | ||
354 | (and s1-bare s2-bare)) | ||
355 | (string< s1 s2)) | ||
356 | ((and s1-straight s2-straight) | 354 | ((and s1-straight s2-straight) |
357 | (let* ((r (rx ":straight" (? "-if") (* space) (? "("))) | 355 | (let* ((r (rx ":straight" (? "-if") (* space) (? "("))) |
358 | (s1 (replace-regexp-in-string r "" s1)) | 356 | (s1 (replace-regexp-in-string r "" s1)) |
359 | (s2 (replace-regexp-in-string r "" s2))) | 357 | (s2 (replace-regexp-in-string r "" s2))) |
360 | (message "'%S' '%S'" s1 s2) | ||
361 | (string< s1 s2))) | 358 | (string< s1 s2))) |
362 | ;; requires should go first | 359 | ;; requires should go first |
363 | ((and s1-require (not s2-require)) t) | 360 | ((and s1-require (not s2-require)) t) |
diff --git a/lisp/chd.el b/lisp/chd.el new file mode 100644 index 0000000..697c134 --- /dev/null +++ b/lisp/chd.el | |||
@@ -0,0 +1,49 @@ | |||
1 | ;;; chd.el --- CHD customizations -*- lexical-binding: t -*- | ||
2 | |||
3 | (require 'acdw-org) | ||
4 | (require 'org) | ||
5 | |||
6 | (defun chd/narrow-to-task (&optional point) | ||
7 | "Narrow the buffer to the task POINT is in." | ||
8 | (interactive "d") | ||
9 | (when point (goto-char point)) | ||
10 | (if (called-interactively-p 'interactive) | ||
11 | (save-excursion | ||
12 | (while (not (org-entry-is-todo-p)) | ||
13 | (acdw/org-previous-heading-widen 1)) | ||
14 | (org-narrow-to-subtree)) | ||
15 | ;; well this is dumb... | ||
16 | (while (not (org-entry-is-todo-p)) | ||
17 | (acdw/org-previous-heading-widen 1)) | ||
18 | (org-narrow-to-subtree))) | ||
19 | |||
20 | (defun chd/clock-in () | ||
21 | "Clock in to the current task." | ||
22 | (save-excursion | ||
23 | (chd/narrow-to-task) | ||
24 | (org-clock-in))) | ||
25 | |||
26 | (defun chd/do-the-thing () | ||
27 | "Copy the plain version of the current task and open its link." | ||
28 | (interactive) | ||
29 | (chd/narrow-to-task) | ||
30 | (save-excursion | ||
31 | ;; Prepare buffer | ||
32 | (acdw/flyspell-correct-f7) ; This is defined... elsewhere. | ||
33 | |||
34 | ;; Export the buffer and copy it | ||
35 | (pcase (org-entry-get (point-min) "EXPORTAS" t) | ||
36 | ("html" (acdw/org-export-copy-html)) | ||
37 | (_ (acdw/org-export-copy))) | ||
38 | |||
39 | ;; Open the link to the doc | ||
40 | (org-back-to-heading) | ||
41 | (org-open-at-point))) | ||
42 | |||
43 | ;;; NOTES | ||
44 | ;; org-protocol: https://orgmode.org/worg/org-contrib/org-protocol.html | ||
45 | ;; the bit i wanna pull from TaskIQ: 'document.getElementById("preview") | ||
46 | |||
47 | |||
48 | (provide 'chd) | ||
49 | ;;; chd.el ends here | ||