From 109c5ec9392f2f42003880ccb0e62e1c530d7bef Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Tue, 21 Jan 2025 14:37:05 -0800 Subject: [PATCH] Add pop-os-specific Emacs configuration file --- oni/home/config/pop-os.scm | 1 + oni/home/config/pop-os/emacs.el | 117 ++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 oni/home/config/pop-os/emacs.el diff --git a/oni/home/config/pop-os.scm b/oni/home/config/pop-os.scm index 5ac0ba9..864148e 100644 --- a/oni/home/config/pop-os.scm +++ b/oni/home/config/pop-os.scm @@ -96,6 +96,7 @@ (configurations (list (local-file "../services/emacs/init.el") + (local-file "pop-os/emacs.el") (mixed-text-file "init.el" "(with-eval-after-load 'project (require 'oni-project))\n" diff --git a/oni/home/config/pop-os/emacs.el b/oni/home/config/pop-os/emacs.el new file mode 100644 index 0000000..3154794 --- /dev/null +++ b/oni/home/config/pop-os/emacs.el @@ -0,0 +1,117 @@ +(defun snowball-reformat-chanced-file () + "Run the current buffer through Pint." + (interactive) + (let ((format-file-name (concat "fmt-" (file-name-nondirectory (buffer-file-name))))) + (unwind-protect + (progn + (write-region (point-min) (point-max) format-file-name) + (shell-command + (format "%s %s" + (expand-file-name "../chanced-scripts/format" (project-root (project-current))) + (file-relative-name format-file-name (project-root (project-current)))) + nil nil) + (let ((temp-buffer (find-file-noselect format-file-name))) + (unwind-protect + (replace-buffer-contents temp-buffer) + (kill-buffer temp-buffer)))) + (delete-file format-file-name)))) + +(defun tomwpunt:enable-directory-local-modes () + "Enable hooks and modes that are bound to specific directory." + (cond + ((string-suffix-p "src/social-api/" (or (and-let* ((project (project-current))) + (project-root project)) + "")) + (local-set-key (kbd "C-c c") #'artisan-transient) + (when (equal major-mode 'php-mode) + (add-hook 'before-save-hook 'snowball-reformat-chanced-file nil t))))) + +(add-hook 'find-file-hook 'tomwpunt:enable-directory-local-modes) + +(transient-define-prefix artisan-transient () + "A transient to run artisan commands." + ["Punt" + ["Composer" + ("pci" "Install" artisan-punt-composer-install)] + ["Artisan" + ("pac" "Run Command" artisan-punt-run-command) + ("pam" "Migrate" artisan-punt-migrate) + ("pat" "Test" artisan-punt-test)]] + ["Chanced" + ["Composer" + ("cci" "Install" artisan-chanced-composer-install)] + ["Artisan" + ("cac" "Run Command" artisan-chanced-run-command) + ("cam" "Migrate" artisan-chanced-migrate) + ("cat" "Test" artisan-chanced-test)]]) + +(defun artisan-punt-composer-install () + (interactive) + (let ((default-directory (expand-file-name "punt" (project-root (project-current))))) + (async-shell-command "docker exec -it punt-backend composer install"))) + +(defun artisan-chanced-composer-install () + (interactive) + (let ((default-directory (expand-file-name "chanced" (project-root (project-current))))) + (async-shell-command "docker exec -it chanced-backend composer install"))) + +(defun artisan-punt-run-command (command) + (interactive + (list + (read-string "Command: "))) + (let ((default-directory (expand-file-name "punt" (project-root (project-current))))) + (async-shell-command (format "docker exec -it punt-backend php artisan %s" command)))) + +(defun artisan-chanced-run-command (command) + (interactive + (list + (read-string "Command: "))) + (let ((default-directory (expand-file-name "chanced" (project-root (project-current))))) + (async-shell-command (format "docker exec -it chanced-backend php artisan %s" command)))) + +(defun artisan-punt-migrate () + (interactive) + (let ((default-directory (expand-file-name "punt" (project-root (project-current))))) + (async-shell-command "docker exec -it punt-backend php artisan migrate"))) + +(defun artisan-chanced-migrate () + (interactive) + (let ((default-directory (expand-file-name "chanced" (project-root (project-current))))) + (async-shell-command "docker exec -it chanced-backend php artisan migrate"))) + +(defun artisan-punt-test (pick) + (interactive "P") + (artisan--test-internal pick "punt" "chanced")) + +(defun artisan-chanced-test (pick) + (interactive "P") + (artisan--test-internal pick "chanced" "punt")) + +(defvar artisan--test-last-command nil + "The last testing commnand that was run in the test buffer. +This variable should always be buffer local and only set in test +buffers.") +(make-variable-buffer-local 'artisan--test-last-command) + +(defun artisan--test-internal (pick name ignore) + (let* ((default-directory (expand-file-name name (project-root (project-current)))) + (buffer-name (format "*%s Tests*" (capitalize name))) + (buffer (get-buffer-create buffer-name)) + (files (cons '("all" . "") + (mapcar (lambda (dir) (cons (file-name-nondirectory dir) dir)) + (directory-files-recursively "../" (rx "Test.php") nil (lambda (subdir) (not (or (string-suffix-p "vendor" subdir) (string-suffix-p ignore subdir)))))))) + (command (with-current-buffer buffer + (or (and (not pick) artisan--test-last-command) + (format "../../chanced-scripts/test %s %s" + name (map-elt files (completing-read "File: " files nil t)))))) + (compilation-scroll-output t)) + (cl-letf (((symbol-function 'compilation-buffer-name) + (lambda (&rest args) buffer-name))) + (compile command)) + (with-current-buffer buffer + (setq artisan--test-last-command command) + (local-set-key (kbd "g") + (lambda () + (interactive) + (artisan--test-internal nil name ignore))) + (local-set-key (kbd "q") #'bury-buffer))))