From d4eea37a8f406cf62eb6e59b04267f5d846af457 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Wed, 2 Feb 2022 13:36:37 -0800 Subject: [PATCH] [oni-csharp] Add csharp-solution-mode major mode This major mode will be for viewing and editing the solution file. Right now it just parses the solution file and displays some of the project names instead of the GUIDs to make it more human readable. --- oni-csharp/oni-csharp.el | 108 +++++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 49 deletions(-) diff --git a/oni-csharp/oni-csharp.el b/oni-csharp/oni-csharp.el index 11c1dcf..02b1cd7 100644 --- a/oni-csharp/oni-csharp.el +++ b/oni-csharp/oni-csharp.el @@ -4,7 +4,7 @@ ;; Author: Tom Willemse ;; Keywords: local -;; Version: 2022.0105.161232 +;; Version: 2022.0202.115001 ;; Package-Requires: (csharp-mode oni-company oni-flycheck oni-yasnippet oni-hydra oni-lsp oni-smartparens) ;; This program is free software; you can redistribute it and/or modify @@ -78,54 +78,6 @@ _cs_: Solution (let ((compile-command (concat oni-csharp-devenv-executable " /Build Debug " (oni-csharp-locate-dominating-file-wildcard "*.sln") " /project " (oni-csharp-locate-dominating-file-wildcard "*.csproj")))) (compile compile-command))) -(defun oni-csharp-collect-project-names () - "Go through the current buffer and collect all the project names." - (interactive) - (clrhash oni-csharp--projects) - (save-excursion - (goto-char (point-min)) - (while (re-search-forward - (rx bol - "Project(\"{" - (group (minimal-match (1+ (or alphanumeric "-")))) - "}\") = \"" - (group (minimal-match (1+ any))) - "\", \"" - (minimal-match (1+ any)) - "\", \"{" - (group (minimal-match (1+ any))) - "}\"" - eol) - nil - :noerror) - (puthash (match-string-no-properties 3) - (match-string-no-properties 2) - oni-csharp--projects)))) - -(defun oni-csharp-display-project-names () - "Display the project names in the current buffer." - (interactive) - (save-excursion - (goto-char (point-min)) - (remove-overlays (point-min) (point-max) 'oni-csharp--overlayp t) - (while (re-search-forward - (rx bol - (zero-or-more whitespace) - "{" - (group (minimal-match (one-or-more (or alphanumeric "-")))) - "} = {" - (group (minimal-match (one-or-more (or alphanumeric "-")))) - "}" - eol) - nil - :noerror) - (let ((current-overlay (make-overlay (line-beginning-position) (line-end-position)))) - (overlay-put current-overlay 'after-string - (propertize (format " => %s" (gethash (match-string 1) oni-csharp--projects)) - 'face '(:foreground "#808080"))) - (overlay-put current-overlay 'oni-csharp--overlayp t) - (overlay-put current-overlay 'evaporate t))))) - (defun oni-csharp--auto-fill-mode () "Enable ‘auto-fill-mode’ only for comments." (setq-local comment-auto-fill-only-comments t) @@ -203,5 +155,63 @@ _cs_: Solution (with-eval-after-load 'yasnippet (oni-csharp-snippets-initialize))) +;;; Solution mode + +(defun oni-csharp-collect-project-names () + "Go through the current buffer and collect all the project names." + (interactive) + (clrhash oni-csharp--projects) + (save-excursion + (goto-char (point-min)) + (while (re-search-forward + (rx bol + "Project(\"{" + (group (minimal-match (1+ (or alphanumeric "-")))) + "}\") = \"" + (group (minimal-match (1+ any))) + "\", \"" + (minimal-match (1+ any)) + "\", \"{" + (group (minimal-match (1+ any))) + "}\"" + eol) + nil + :noerror) + (puthash (match-string-no-properties 3) + (match-string-no-properties 2) + oni-csharp--projects)))) + +(defun oni-csharp-display-project-names () + "Display the project names in the current buffer." + (interactive) + (save-excursion + (goto-char (point-min)) + (remove-overlays (point-min) (point-max) 'oni-csharp--overlayp t) + (while (re-search-forward + (rx bol + (zero-or-more whitespace) + "{" + (group (minimal-match (one-or-more (or alphanumeric "-")))) + "} = {" + (group (minimal-match (one-or-more (or alphanumeric "-")))) + "}" + eol) + nil + :noerror) + (let ((current-overlay (make-overlay (line-beginning-position) (line-end-position)))) + (overlay-put current-overlay 'after-string + (propertize (format " => %s" (gethash (match-string 1) oni-csharp--projects)) + 'face '(:foreground "#808080"))) + (overlay-put current-overlay 'oni-csharp--overlayp t) + (overlay-put current-overlay 'evaporate t))))) + +(define-derived-mode csharp-solution-mode prog-mode "Sln" + "A major mode for viewing and editing C# ‘.sln’ files." + (oni-csharp-collect-project-names) + (oni-csharp-display-project-names)) + +;;;###autoload +(add-to-list 'auto-mode-alist `(,(rx ".sln" eos) . csharp-solution-mode)) + (provide 'oni-csharp) ;;; oni-csharp.el ends here