system-manager-wakasu
1;;; programming-config.el --- -*- lexical-binding: t -*-
2;;; Commentary:
3;;; Configuration files mode configuration
4;;; Code:
5
6(defconst src-dir "~/src/"
7 "Where all my sources are.")
8(set-register ?s `(file . ,src-dir))
9
10(use-package symbol-overlay
11 :custom
12 (symbol-overlay-idle-time 0.2)
13 :bind
14 ("M-s s i" . symbol-overlay-put)
15 ("M-N" . symbol-overlay-jump-next)
16 ("M-P" . symbol-overlay-jump-prev)
17 ("M-s s r" . symbol-overlay-rename)
18 ("M-s s c" . symbol-overlay-remove-all)
19 :hook
20 (prog-mode . symbol-overlay-mode))
21
22(use-package devdocs
23 :commands (devdocs-lookup devdocs-install vde/install-devdocs)
24 :bind (("C-h D" . devdocs-lookup))
25 :config
26 (defun vde/install-devdocs ()
27 "Install the devdocs I am using the most."
28 (interactive)
29 (dolist (docset '("bash"
30 "c"
31 "click"
32 "cpp"
33 "css"
34 "elisp"
35 "flask"
36 "git"
37 "gnu_make"
38 "go"
39 "html"
40 "htmx"
41 "http"
42 "javascript"
43 "jq"
44 "jquery"
45 "kubectl"
46 "kubernetes"
47 "lua~5.4"
48 "nix"
49 "python~3.13"
50 "python~3.12"
51 "requests"
52 "sqlite"
53 "terraform"
54 "werkzeug"
55 "zig"))
56 (devdocs-install docset))))
57
58(use-package yaml-ts-mode
59 :mode "\\.ya?ml\\'"
60 :hook ((yaml-ts-mode . display-line-numbers-mode)
61 (yaml-ts-mode . outline-minor-mode)
62 (yaml-ts-mode . electric-pair-local-mode))
63 :config
64 (setq-local outline-regexp "^ *\\([A-Za-z0-9_-]*: *[>|]?$\\|-\\b\\)")
65 (font-lock-add-keywords
66 'yaml-ts-mode
67 '(("\\($(\\(workspaces\\|context\\|params\\)\.[^)]+)\\)" 1 'font-lock-constant-face prepend)
68 ("kind:\s*\\(.*\\)\n" 1 'font-lock-keyword-face prepend))))
69
70;; TODO https://github.com/zkry/yaml-pro?tab=readme-ov-file#easy-movement-with-repeat-map
71;; FIXME it currently gets in the way…
72;; (use-package yaml-pro
73;; :after yaml-ts-mode
74;; :hook (yaml-ts-mode . yaml-pro-ts-mode))
75
76(use-package consult-flymake
77 :after (consult)
78 :bind
79 ("M-s M-d" . consult-flymake)
80 :config
81 ;; (general-leader
82 ;; "sd" #'(consult-flymake :which-key "Flymake diagnostics"))
83 )
84
85(use-package flymake-yamllint
86 :after yaml-ts-mode
87 :hook
88 (yaml-ts-mode . flymake-yamllint-setup))
89
90(use-package conf-mode
91 :mode ("\\.to?ml\\'" . conf-toml-mode))
92
93(use-package adoc-mode
94 :mode ("\\.adoc\\'" . conf-toml-mode))
95
96(defun repeatize (keymap)
97 "Add `repeat-mode' support to a KEYMAP."
98 (map-keymap
99 (lambda (_key cmd)
100 (when (symbolp cmd)
101 (put cmd 'repeat-map keymap)))
102 (symbol-value keymap)))
103
104(defvar flymake-repeat-map
105 (let ((map (make-sparse-keymap)))
106 (define-key map (kbd "n") 'flymake-goto-next-error)
107 (define-key map (kbd "p") 'flymake-goto-prev-error)
108 (define-key map (kbd "f") 'attrap-flymake)
109 (define-key map (kbd "M-n") 'flymake-goto-next-error)
110 (define-key map (kbd "M-p") 'flymake-goto-prev-error)
111 map))
112
113(use-package flymake
114 :defer t
115 :bind
116 (("C-c f e" . flymake-show-project-diagnostics))
117 (:map flymake-mode-map
118 ("M-n" . flymake-goto-next-error)
119 ("M-p" . flymake-goto-prev-error))
120 (
121 :map flymake-diagnostics-buffer-mode-map
122 ("p" .
123 (lambda()(interactive)
124 (previous-line)
125 (save-excursion
126 (flymake-show-diagnostic(point)))))
127 ("n" .
128 (lambda()(interactive)
129 (next-line)
130 (save-excursion
131 (flymake-show-diagnostic(point)))))
132 (
133 :map flymake-project-diagnostics-mode-map
134 ("p" .
135 (lambda()(interactive)
136 (previous-line)
137 (save-excursion
138 (flymake-show-diagnostic(point)))))
139 ("n" .
140 (lambda()(interactive)
141 (next-line)
142 (save-excursion
143 (flymake-show-diagnostic(point)))))))
144 :config
145 (repeatize 'flymake-repeat-map)
146 :hook
147 ;; (prog-mode . flyspell-prog-mode) rebind flyspell-auto-correct-previous-word
148 (prog-mode . flymake-mode))
149
150(defun my-gotest-get-current-test()
151 "Get the current test name, if we have a subtest (starting with name) then use it."
152 (interactive)
153 (require 'which-func)
154 (let ((subtest (when-let* ((subtest
155 (progn
156 (save-excursion
157 (goto-char (line-beginning-position))
158 (re-search-forward "name:[[:blank:]]*\"\\([^\"]*\\)\"" (line-end-position) t)))))
159 (if subtest
160 (shell-quote-argument (replace-regexp-in-string " " "_" (match-string-no-properties 1))))))
161 (gotest (when-let* ((test-name (which-function)))
162 (if test-name test-name
163 (error "No test selected")))))
164 (concat (format "^%s%s$" gotest (if subtest (concat "/" subtest) "")))))
165
166(use-package dape
167 :commands (my-dape-go-test-at-point)
168 :after go-ts-mode
169 :bind
170 (:map go-ts-mode-map
171 ("<f5>" . (lambda()(interactive)
172 (if (dape--live-connections)
173 (call-interactively 'dape-continue)
174 (call-interactively 'dape))))
175 ("S-<f5>" . dape-stop)
176 ("C-S-<f5>" . dape-restart)
177 ("<f9>" . dape-breakpoint-toggle)
178 ("<f10>" . dape-next)
179 ("<f11>" . dape-step-in)
180 ("S-<f11>" . dape-step-out))
181 :hook
182 (go-ts-mode . (lambda()
183 (interactive)
184 (if (string-suffix-p "_test.go" (buffer-name))
185 (setq-local dape-command '(delve-unit-test)))))
186 :config
187 (defun my-dape-go-test-at-point ()
188 (interactive)
189 (dape (dape--config-eval-1
190 `(modes (go-mode go-ts-mode)
191 ensure dape-ensure-command
192 fn dape-config-autoport
193 command "dlv"
194 command-args ("dap" "--listen" "127.0.0.1::autoport")
195 command-cwd dape-cwd-fn
196 port :autoport
197 :type "debug"
198 :request "launch"
199 :mode "test"
200 :cwd dape-cwd-fn
201 :program (lambda () (concat "./" (file-relative-name default-directory (funcall dape-cwd-fn))))
202 :args (lambda ()
203 (when-let* ((test-name (my-gotest-get-current-test)))
204 (if test-name `["-test.run" ,test-name]
205 (error "No test selected")))))))))
206
207(defconst markdown-regex-italic
208 "\\(?:^\\|[^\\]\\)\\(?1:\\(?2:[_]\\)\\(?3:[^ \n\t\\]\\|[^ \n\t]\\(?:.\\|\n[^\n]\\)[^\\ ]\\)\\(?4:\\2\\)\\)")
209;; and/or
210(defconst markdown-regex-gfm-italic
211 "\\(?:^\\|[^\\]\\)\\(?1:\\(?2:[_]\\)\\(?3:[^ \\]\\2\\|[^ ]\\(?:.\\|\n[^\n]\\)\\)\\(?4:\\2\\)\\)")
212
213(use-package markdown-mode
214 :commands (markdown-mode gfm-mode)
215 :mode (("README\\.md\\'" . gfm-mode)
216 ("\\.md\\'" . markdown-mode)
217 ("\\.markdown\\'" . markdown-mode))
218 :hook ((markdown-mode . visual-line-mode)
219 (gfm-mode . visual-line-mode)))
220
221(use-package orgalist
222 :commands (orgalist-mode)
223 :hook ((markdown-mode . orgalist-mode)
224 (gfm-mode . orgalist-mode)))
225
226(provide 'programming-config)
227;;; programming-config.el ends here