From 31c43cdceb5d1390246414d9f081ef9ffe02416c Mon Sep 17 00:00:00 2001 From: Troy Brown Date: Fri, 19 Sep 2025 00:45:15 -0400 Subject: [PATCH] fix(ada): use gpr-specific modes and indent properly GNAT Project modes (`gpr-mode` and `gpr-ts-mode`) exist to handle .gpr files. These modes are now used instead of the Ada major mode. Lines may need to be re-indented when RET is pressed. This is to handle cases of incomplete syntax and ambiguity in what may be entered when an empty line is initially indented. Re-indenting after text has been entered corrects incorrectly guessed initial indentation. To accommodate this scenario, RET is remapped to `reindent-then-newline-and-indent`. Also updates documentation to reflect these changes. --- modules/lang/ada/README.org | 6 ++++-- modules/lang/ada/config.el | 29 ++++++++++++++++++++++++++++- modules/lang/ada/packages.el | 3 +++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/modules/lang/ada/README.org b/modules/lang/ada/README.org index 78b4ddb2f..2ec693aa8 100644 --- a/modules/lang/ada/README.org +++ b/modules/lang/ada/README.org @@ -20,8 +20,8 @@ This module adds support for the Ada and SPARK programming languages. ** Module flags # Flags should be in alphanumerical order. - +lsp :: - Enable LSP support for ~ada-mode~ / ~ada-ts-mode~. Requires [[doom-module::tools lsp]] - and a langserver (supports [[https://github.com/AdaCore/ada_language_server][ada_language_server]]). + Enable LSP support for ~ada-mode~ / ~ada-ts-mode~, ~gpr-mode~ / ~gpr-ts-mode~. + Requires [[doom-module::tools lsp]] and a langserver (supports [[https://github.com/AdaCore/ada_language_server][ada_language_server]]). - +tree-sitter :: Leverages tree-sitter for better syntax highlighting and structural text editing. Requires [[doom-module::tools tree-sitter]] and Emacs 29.1+. @@ -29,6 +29,8 @@ This module adds support for the Ada and SPARK programming languages. ** Packages - [[doom-package:ada-mode]] - [[doom-package:ada-ts-mode]] if [[doom-module:+tree-sitter]] +- [[doom-package:gpr-mode]] +- [[doom-package:gpr-ts-mode]] if [[doom-module:+tree-sitter]] ** Hacks - ~ada-ts-mode~ has been advised not to set ~treesit-language-source-alist~ and diff --git a/modules/lang/ada/config.el b/modules/lang/ada/config.el index 106e85adc..45d7c1a7c 100644 --- a/modules/lang/ada/config.el +++ b/modules/lang/ada/config.el @@ -8,14 +8,25 @@ (add-hook (intern (format "%s-local-vars-hook" mode)) #'lsp! 'append)) (map! :map ,(intern (format "%s-map" mode)) + [remap newline] #'reindent-then-newline-and-indent ; Non-Evil + :i "RET" #'reindent-then-newline-and-indent ; Evil :localleader :desc "Build Alire Project" "b" #'+ada/alr-build :desc "Run Alire Project" "r" #'+ada/alr-run :desc "Clean Alire Project" "c" #'+ada/alr-clean)) +(defun +gpr-common-config (mode) + (when (modulep! +lsp) + (add-hook (intern (format "%s-local-vars-hook" mode)) #'lsp! 'append)) + + (map! :map ,(intern (format "%s-map" mode)) + [remap newline] #'reindent-then-newline-and-indent ; Non-Evil + :i "RET" #'reindent-then-newline-and-indent)) ; Evil + + (use-package! ada-mode - :mode "\\.gpr\\'" + :defer t :config (+ada-common-config 'ada-mode)) @@ -42,3 +53,19 @@ :after #'ada-ts-mode (kill-local-variable 'treesit-language-source-alist) (kill-local-variable 'eglot-server-programs))) + + +(use-package! gpr-mode + :defer t + :config + (+gpr-common-config 'gpr-mode)) + + +(use-package! gpr-ts-mode + :when (modulep! +tree-sitter) + :defer t + :init + (set-tree-sitter! 'gpr-mode 'gpr-ts-mode + '((gpr :url "https://github.com/brownts/tree-sitter-gpr"))) + :config + (+gpr-common-config 'gpr-ts-mode)) diff --git a/modules/lang/ada/packages.el b/modules/lang/ada/packages.el index f00714251..5a1da5623 100644 --- a/modules/lang/ada/packages.el +++ b/modules/lang/ada/packages.el @@ -4,3 +4,6 @@ (package! ada-mode :pin "ce8a2dfebc2b738f32b61dbe2668f7acb885db93") (when (and (modulep! +tree-sitter) (treesit-available-p)) (package! ada-ts-mode :pin "d0c1c124b236b402b884188948cb1f3502ef8779")) +(package! gpr-mode :pin "03141c6b9a39c31a6e759b594b41617b97b02753") +(when (and (modulep! +tree-sitter) (treesit-available-p)) + (package! gpr-ts-mode :pin "b8aeca2c8fd5ed370dad0676da8f380627c916d5"))