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