changeset 34: | 882a5c1e7b9f |
parent: | e3b0ec661dfa |
child: | 519ab3f9f548 |
author: | ellis <ellis@rwest.io> |
date: | Sun, 05 Nov 2023 00:33:48 -0400 |
permissions: | -rw-r--r-- |
description: | emacs config ellis.el example custom config file removed vc utils (site-specific) keys/defaults |
21 | 1 | ;;; std/util.el --- standard utils -*- lexical-binding: t -*- |
2 | ||
3 | ;;; Code: |
|
4 | (require 'cl-lib) |
|
5 | ||
31 | 6 | ;;; Helpers |
26 | 7 | (defun group (source n) |
8 | "This is Paul Graham's group utility from 'On Lisp'. |
|
9 | ||
10 | Group a list of arguments SOURCE by any provided grouping amount |
|
11 | N. |
|
12 | ||
13 | For example: |
|
14 | (group '(foo 2 bar 4) 2) ;=> ((foo 2) (bar 4)) |
|
15 | (group '(a b c d e f) 3) ;=> ((a b c) (d e f)) |
|
16 | " |
|
17 | (when (zerop n) (error "zero length")) |
|
18 | (cl-labels ((rec (source acc) |
|
19 | (let ((rest (nthcdr n source))) |
|
20 | (if (consp rest) |
|
21 | (rec rest (cons |
|
22 | (cl-subseq source 0 n) |
|
23 | acc)) |
|
24 | (nreverse |
|
25 | (cons source acc)))))) |
|
26 | (when source (rec source nil)))) |
|
27 | ||
28 | (defun flatten (x) |
|
29 | "Paul Graham's flatten utility from 'On Lisp'. |
|
30 | ||
31 | Given a tree X, return all the 'leaves' of the tree." |
|
32 | (cl-labels ((rec (x acc) |
|
33 | (cond ((null x) acc) |
|
34 | ((atom x) (cons x acc)) |
|
35 | (t (rec |
|
36 | (car x) |
|
37 | (rec (cdr x) acc)))))) |
|
38 | (rec x nil))) |
|
39 | ||
40 | (defun mkstr (&rest args) |
|
41 | "Paul Graham's mkstr utility from 'On Lisp'. |
|
42 | ||
43 | Coerce ARGS into a single string and return it." |
|
44 | (let* ((s "")) |
|
45 | (dolist (a args) |
|
46 | (cond |
|
47 | ((null a) nil) |
|
48 | ((sequencep a) (setq s (concat s a))) |
|
49 | ((numberp a) (setq s(concat s (number-to-string a)))) |
|
50 | ((symbolp a) (setq s(concat s (symbol-name a)))))) |
|
51 | s)) |
|
52 | ||
53 | (defun symb (&rest args) |
|
54 | "Paul Graham's symb utility from 'On Lisp'. |
|
55 | ||
56 | Concat ARGS and return a newly interned symbol." |
|
57 | (intern (apply #'mkstr args))) |
|
58 | ||
33 | 59 | ;;; Config |
21 | 60 | (defun add-to-load-path (&rest paths) |
61 | "Add PATHS to `load-path'." |
|
62 | (mapc (lambda (x) |
|
63 | (cond |
|
64 | ((listp x) (mapc #'add-to-load-path x)) |
|
65 | ('_ (cl-pushnew x load-path)))) |
|
66 | paths)) |
|
67 | ||
31 | 68 | (defmacro add-packages (&rest pkgs) |
69 | "add list of packages PKGS to `package-selected-packages'" |
|
70 | `(mapc (lambda (x) (add-to-list 'package-selected-packages x)) ',pkgs)) |
|
71 | ||
72 | ;;; OS |
|
73 | (defmacro when-sys= (name body) |
|
74 | "(when (string= (system-name) NAME) BODY)" |
|
75 | `(when ,(string= (system-name) name) ,body)) |
|
76 | ||
21 | 77 | (defun join-paths (root &rest dirs) |
78 | "helper function for joining strings to a path." |
|
79 | (let ((result root)) |
|
80 | (cl-loop for dir in dirs do |
|
81 | (setq result (concat (file-name-as-directory result) dir))) |
|
82 | result)) |
|
83 | ||
31 | 84 | (defun wc (&optional start end) |
85 | "Return a 3-element list with lines, words and characters in |
|
86 | region or whole buffer." |
|
87 | (interactive) |
|
88 | (let ((n 0) |
|
89 | (start (if mark-active (region-beginning) (point-min))) |
|
90 | (end (if mark-active (region-end) (point-max)))) |
|
91 | (save-excursion |
|
92 | (goto-char start) |
|
93 | (while (< (point) end) (if (forward-word 1) (setq n (1+ n))))) |
|
94 | (list (count-lines start end) n (- end start)))) |
|
95 | ||
96 | ;;; Regexps |
|
97 | (defvar default-line-regexp-alist |
|
98 | '((empty . "[\s\t]*$") |
|
99 | (indent . "^[\s\t]+") |
|
100 | (non-empty . "^.+$") |
|
101 | (list . "^\\([\s\t#*+]+\\|[0-9]+[^\s]?[).]+\\)") |
|
102 | (heading . "^[=-]+")) |
|
103 | "Alist of regexp types used by `default-line-regexp-p'.") |
|
104 | ||
105 | (defun default-line-regexp-p (type &optional n) |
|
106 | "Test for TYPE on line. |
|
107 | TYPE is the car of a cons cell in |
|
108 | `default-line-regexp-alist'. It matches a regular |
|
109 | expression. |
|
110 | With optional N, search in the Nth line from point." |
|
111 | (save-excursion |
|
112 | (goto-char (point-at-bol)) |
|
113 | (and (not (bobp)) |
|
114 | (or (beginning-of-line n) t) |
|
115 | (save-match-data |
|
116 | (looking-at |
|
117 | (alist-get type default-line-regexp-alist)))))) |
|
118 | ||
119 | ;;; Time |
|
120 | (defun format-iso-week-number (&optional date) |
|
121 | "format DATE as ISO week number with week days starting on |
|
122 | Monday. If DATE is nil use current date." |
|
123 | (let* ((week (format-time-string "%W" date)) |
|
124 | (prefix (if (= (length week) 1) |
|
125 | "w0" "w"))) |
|
126 | (concat prefix week))) |
|
127 | ||
128 | (defun last-day-of-year (&optional date) |
|
129 | "Return the last day of the year as time." |
|
130 | (encode-time 0 0 0 31 12 (nth 5 (decode-time |
|
131 | (or date (current-time)))))) |
|
132 | ||
133 | (defun last-day-of-month (&optional date) |
|
134 | "Return the last day of month as time." |
|
135 | (let* ((now (decode-time (or date (current-time)))) |
|
136 | (month (nth 4 now)) |
|
137 | (year (nth 5 now)) |
|
138 | (last-day-of-month (calendar-last-day-of-month month year))) |
|
139 | (encode-time 0 0 0 last-day-of-month month year))) |
|
140 | ||
141 | (defun last-day-of-week (&optional date) |
|
142 | "Return the last day of the week as time." |
|
143 | (let* ((now (or date (current-time))) |
|
144 | (datetime (decode-time now)) |
|
145 | (dow (nth 6 datetime))) |
|
146 | (time-add now (days-to-time (- 7 dow))))) |
|
147 | ||
148 | (defun first-day-of-week (&optional date) |
|
149 | "Return the first day of the week as time." |
|
150 | (let* ((now (or date (current-time))) |
|
151 | (datetime (decode-time now)) |
|
152 | (dow (nth 6 datetime))) |
|
153 | (time-subtract now (days-to-time dow)))) |
|
154 | ||
155 | ;;; Server |
|
156 | ;;;###autoload |
|
157 | (defun kill-emacs-restart (&optional arg) |
|
158 | (interactive) |
|
159 | (kill-emacs arg t)) |
|
28 | 160 | |
34 | 161 | |
26 | 162 | (provide 'util) |
27 | 163 | ;; util.el ends here |