fedora-csb-system-manager
  1;;; config-programming.el --- -*- lexical-binding: t; -*-
  2;;; Commentary:
  3;;; Configure general programming
  4;;; Code:
  5
  6(declare-function vde-project--project-root-or-default-directory "proj-func")
  7
  8(defun my-recompile (args)
  9  (interactive "P")
 10  (cond
 11   ((eq major-mode #'emacs-lisp-mode)
 12    (call-interactively 'eros-eval-defun))
 13   ((bound-and-true-p my-vterm-command)
 14    (my-vterm-execute-region-or-current-line my-vterm-command))
 15   ((get-buffer "*compilation*")
 16    (with-current-buffer"*compilation*"
 17      (recompile)))
 18   ((get-buffer "*Go Test*")
 19    (with-current-buffer "*Go Test*"
 20      (recompile)))
 21   ((and (eq major-mode #'go-mode)
 22         buffer-file-name
 23         (string-match
 24          "_test\\'" (file-name-sans-extension buffer-file-name)))
 25    (my-gotest-maybe-ts-run))
 26   ((and (get-buffer "*cargo-test*")
 27         (boundp 'my-rustic-current-test-compile)
 28         my-rustic-current-test-compile)
 29    (with-current-buffer "*cargo-test*"
 30      (rustic-cargo-test-run my-rustic-current-test-compile)))
 31   ((get-buffer "*cargo-run*")
 32    (with-current-buffer "*cargo-run*"
 33      (rustic-cargo-run-rerun)))
 34   ((get-buffer "*pytest*")
 35    (with-current-buffer "*pytest*"
 36      (recompile)))
 37   ((eq major-mode #'python-mode)
 38    (compile (concat python-shell-interpreter " " (buffer-file-name))))
 39   ((call-interactively 'compile))))
 40
 41(defun run-command-recipes-make--commands (makefile)
 42  "Return the list of commands names that was defined in MAKEFILE."
 43  (let ((s (f-read makefile))
 44        (commands nil)
 45        (pos 0))
 46    (while (string-match "^\\([^ \n]+\\):" s pos)
 47      (push (match-string 1 s) commands)
 48      (setq pos (match-end 0)))
 49    commands))
 50
 51;; TODO github run-command: if remote is github.com, add a gh create pr command, and other "goodies"…
 52;; TODO tektoncd run-command: if project is tektoncd
 53;; TODO redhat run-command: if it's a redhat project
 54;; TODO local run-command: figure out how it works
 55
 56(use-package run-command
 57  :bind ("C-c c" . run-command)
 58  :config
 59  (defun run-command-recipe-make()
 60    "Returns a dynamic list of commands based of a Makefile.
 61
 62This is condition to the following:
 63- `make' executable found
 64- `Makefile' file present in project root *or* the default directory."
 65    (let* ((dir (vde-project--project-root-or-default-directory))
 66	   (makefile (expand-file-name "Makefile" dir)))
 67    (when (and
 68	   (executable-find "make")
 69	   (file-exists-p makefile))
 70      (message "Makefile present")
 71      (let ((targets (run-command-recipes-make--commands makefile)))
 72	(mapcar (lambda (target)
 73		  (unless (or (string-prefix-p "." target)
 74			      (string-prefix-p "$" target)
 75			      (string= "FORCE" target))
 76		    (list :command-line (concat "make " target)
 77			  :command-name target
 78			  :working-dir dir
 79			  :runner 'run-command-runner-compile)))
 80		targets)))))
 81  (defun run-command-recipe-hack ()
 82    "Returns a dynamic list of commands based of the presence of an `hack' folder
 83in the project root *or* the default-directory."
 84    (let* ((dir (vde-project--project-root-or-default-directory))
 85	   (hack-dir (expand-file-name "hack" dir))
 86	   (files (or (ignore-errors (directory-files hack-dir)) [])))
 87      (when (file-accessible-directory-p hack-dir)
 88	(mapcar (lambda (file)
 89		  (let ((hack-file (expand-file-name file hack-dir)))
 90		    (when (and (file-regular-p hack-file)
 91			       (file-executable-p hack-file))
 92		      (list :command-line hack-file
 93			    :command-name file
 94			    :working-dir dir
 95			    :runner 'run-command-runner-compile))))
 96		files))))
 97  (add-to-list 'run-command-recipes 'run-command-recipe-hack)
 98  (add-to-list 'run-command-recipes 'run-command-recipe-make))
 99
100(defvar highlight-codetags-keywords
101  '(("\\<\\(TODO\\|FIXME\\|BUG\\|XXX\\)\\>" 1 font-lock-warning-face prepend)
102    ("\\<\\(NOTE\\|HACK\\)\\>" 1 font-lock-doc-face prepend)))
103
104(define-minor-mode highlight-codetags-local-mode
105  "Highlight codetags like TODO, FIXME..."
106  :global nil
107  (if highlight-codetags-local-mode
108      (font-lock-add-keywords nil highlight-codetags-keywords)
109    (font-lock-remove-keywords nil highlight-codetags-keywords))
110
111  ;; Fontify the current buffer
112  (when (bound-and-true-p font-lock-mode)
113    (if (fboundp 'font-lock-flush)
114        (font-lock-flush)
115      (with-no-warnings (font-lock-fontify-buffer)))))
116
117(add-hook 'prog-mode-hook #'highlight-codetags-local-mode)
118
119(provide 'config-programming)
120;;; config-programming.el ends here