emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/rust-mode bff7bd3043 3/3: Merge pull request #482 from rus


From: ELPA Syncer
Subject: [nongnu] elpa/rust-mode bff7bd3043 3/3: Merge pull request #482 from rust-lang/treesitter
Date: Sat, 24 Feb 2024 07:00:49 -0500 (EST)

branch: elpa/rust-mode
commit bff7bd3043d70412a2abd840232b1251ae8c6226
Merge: 8bbe70b72f 08cea61390
Author: Sibi Prabakaran <sibi@psibi.in>
Commit: GitHub <noreply@github.com>

    Merge pull request #482 from rust-lang/treesitter
    
    provide alternative rust-mode that derives from rust-ts-mode
---
 README.md               | 17 +++++++++---
 rust-mode-treesitter.el | 22 ++++++++++++++++
 rust-mode.el            | 70 +++++++------------------------------------------
 rust-prog-mode.el       | 70 +++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 116 insertions(+), 63 deletions(-)

diff --git a/README.md b/README.md
index 01dc5e8505..2b77636efb 100644
--- a/README.md
+++ b/README.md
@@ -21,7 +21,7 @@
         - [Clippy](#clippy)
         - [Easy insertion of dbg!](#easy-insertion-of-dbg)
         - [More commands](#more-commands)
-    - [highlighting with tree-sitter](#highlighting-with-tree-sitter)
+    - [tree-sitter](#tree-sitter)
     - [LSP](#lsp)
         - [eglot](#eglot)
         - [lsp-mode](#lsp-mode)
@@ -191,9 +191,20 @@ This is bound to <kbd>C-c C-d</kbd> by default.
 
 - `rust-toggle-mutability` toggle mut for var defined at current line
 
-## highlighting with tree-sitter
+## tree-sitter
 
-You should take a look at 
[tree-sitter](https://github.com/emacs-tree-sitter/elisp-tree-sitter). When the 
dependencies are installed you can activate the feature with:
+You can try the new native treesitter mode `rust-ts-mode` with:
+
+```elisp
+(use-package rust-mode
+  :init
+  (setq rust-mode-treesitter-derive t))
+```
+
+In case you want to use treesitter but can't use Emacs 29.1, you can
+take a look at
+[tree-sitter](https://github.com/emacs-tree-sitter/elisp-tree-sitter). When
+the dependencies are installed you can activate the feature with:
 
 ```elisp
 (use-package tree-sitter
diff --git a/rust-mode-treesitter.el b/rust-mode-treesitter.el
new file mode 100644
index 0000000000..3c3bd57284
--- /dev/null
+++ b/rust-mode-treesitter.el
@@ -0,0 +1,22 @@
+;;; rust-mode-treesitter.el --- use native rust-ts-mode -*-lexical-binding: 
t-*-
+;;; Commentary:
+
+;; Derive from rust-ts-mode instead of prog-mode
+
+;;; Code:
+
+;;;###autoload
+(require 'treesit)
+(require 'rust-ts-mode)
+
+(define-derived-mode rust-mode rust-ts-mode "Rust"
+  "Major mode for Rust code.
+
+\\{rust-mode-map}"
+  :group 'rust-mode
+
+  (add-hook 'before-save-hook rust-before-save-hook nil t)
+  (add-hook 'after-save-hook rust-after-save-hook nil t))
+
+(provide 'rust-mode-treesitter)
+;;; rust-mode-treesitter.el ends here
diff --git a/rust-mode.el b/rust-mode.el
index 4bb1bcb67d..0c68c43ce7 100644
--- a/rust-mode.el
+++ b/rust-mode.el
@@ -88,6 +88,13 @@ to the function arguments.  When nil, `->' will be indented 
one level."
   :group 'rust-mode
   :safe #'booleanp)
 
+(defcustom rust-mode-treesitter-derive nil
+  "Whether rust-mode should derive from the new treesitter mode `rust-ts-mode'
+instead of `prog-mode'. This option requires emacs29+."
+  :version "29.1"
+  :type 'boolean
+  :group 'rustic)
+
 ;;; Faces
 
 (define-obsolete-face-alias 'rust-unsafe-face
@@ -250,66 +257,9 @@ See `prettify-symbols-compose-predicate'."
     map)
   "Keymap for Rust major mode.")
 
-;;;###autoload
-(define-derived-mode rust-mode prog-mode "Rust"
-  "Major mode for Rust code.
-
-\\{rust-mode-map}"
-  :group 'rust-mode
-  :syntax-table rust-mode-syntax-table
-
-  ;; Syntax
-  (setq-local syntax-propertize-function #'rust-syntax-propertize)
-
-  ;; Indentation
-  (setq-local indent-line-function 'rust-mode-indent-line)
-
-  ;; Fonts
-  (setq-local font-lock-defaults
-              '(rust-font-lock-keywords
-                nil nil nil nil
-                (font-lock-syntactic-face-function
-                 . rust-mode-syntactic-face-function)))
-
-  ;; Misc
-  (setq-local comment-start "// ")
-  (setq-local comment-end   "")
-  (setq-local open-paren-in-column-0-is-defun-start nil)
-
-  ;; Auto indent on }
-  (setq-local electric-indent-chars
-              (cons ?} (and (boundp 'electric-indent-chars)
-                            electric-indent-chars)))
-
-  ;; Allow paragraph fills for comments
-  (setq-local comment-start-skip "\\(?://[/!]*\\|/\\*[*!]?\\)[[:space:]]*")
-  (setq-local paragraph-start
-              (concat "[[:space:]]*\\(?:"
-                      comment-start-skip
-                      "\\|\\*/?[[:space:]]*\\|\\)$"))
-  (setq-local paragraph-separate paragraph-start)
-  (setq-local normal-auto-fill-function #'rust-do-auto-fill)
-  (setq-local fill-paragraph-function #'rust-fill-paragraph)
-  (setq-local fill-forward-paragraph-function #'rust-fill-forward-paragraph)
-  (setq-local adaptive-fill-function #'rust-find-fill-prefix)
-  (setq-local adaptive-fill-first-line-regexp "")
-  (setq-local comment-multi-line t)
-  (setq-local comment-line-break-function #'rust-comment-indent-new-line)
-  (setq-local imenu-generic-expression rust-imenu-generic-expression)
-  (setq-local imenu-syntax-alist '((?! . "w"))) ; For macro_rules!
-  (setq-local beginning-of-defun-function #'rust-beginning-of-defun)
-  (setq-local end-of-defun-function #'rust-end-of-defun)
-  (setq-local parse-sexp-lookup-properties t)
-  (setq-local electric-pair-inhibit-predicate
-              #'rust-electric-pair-inhibit-predicate-wrap)
-  (add-function :before-until (local 'electric-pair-skip-self)
-                #'rust-electric-pair-skip-self)
-  ;; Configure prettify
-  (setq prettify-symbols-alist rust-prettify-symbols-alist)
-  (setq prettify-symbols-compose-predicate #'rust--prettify-symbols-compose-p)
-
-  (add-hook 'before-save-hook rust-before-save-hook nil t)
-  (add-hook 'after-save-hook rust-after-save-hook nil t))
+(if (and (version<= "29.1" emacs-version) rust-mode-treesitter-derive)
+    (require 'rust-mode-treesitter)
+  (require 'rust-prog-mode))
 
 ;;;###autoload
 (add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-mode))
diff --git a/rust-prog-mode.el b/rust-prog-mode.el
new file mode 100644
index 0000000000..f443da86f4
--- /dev/null
+++ b/rust-prog-mode.el
@@ -0,0 +1,70 @@
+;;; rust-prog-mode.el --- old rust-mode without treesitter -*-lexical-binding: 
t-*-
+;;; Commentary:
+
+;; rust-mode code deriving from prog-mode instead of rust-ts-mode
+
+;;; Code:
+
+;;;###autoload
+(define-derived-mode rust-mode prog-mode "Rust"
+  "Major mode for Rust code.
+
+\\{rust-mode-map}"
+  :group 'rust-mode
+  :syntax-table rust-mode-syntax-table
+
+  ;; Syntax
+  (setq-local syntax-propertize-function #'rust-syntax-propertize)
+
+  ;; Indentation
+  (setq-local indent-line-function 'rust-mode-indent-line)
+
+  ;; Fonts
+  (setq-local font-lock-defaults
+              '(rust-font-lock-keywords
+                nil nil nil nil
+                (font-lock-syntactic-face-function
+                 . rust-mode-syntactic-face-function)))
+
+  ;; Misc
+  (setq-local comment-start "// ")
+  (setq-local comment-end   "")
+  (setq-local open-paren-in-column-0-is-defun-start nil)
+
+  ;; Auto indent on }
+  (setq-local electric-indent-chars
+              (cons ?} (and (boundp 'electric-indent-chars)
+                            electric-indent-chars)))
+
+  ;; Allow paragraph fills for comments
+  (setq-local comment-start-skip "\\(?://[/!]*\\|/\\*[*!]?\\)[[:space:]]*")
+  (setq-local paragraph-start
+              (concat "[[:space:]]*\\(?:"
+                      comment-start-skip
+                      "\\|\\*/?[[:space:]]*\\|\\)$"))
+  (setq-local paragraph-separate paragraph-start)
+  (setq-local normal-auto-fill-function #'rust-do-auto-fill)
+  (setq-local fill-paragraph-function #'rust-fill-paragraph)
+  (setq-local fill-forward-paragraph-function #'rust-fill-forward-paragraph)
+  (setq-local adaptive-fill-function #'rust-find-fill-prefix)
+  (setq-local adaptive-fill-first-line-regexp "")
+  (setq-local comment-multi-line t)
+  (setq-local comment-line-break-function #'rust-comment-indent-new-line)
+  (setq-local imenu-generic-expression rust-imenu-generic-expression)
+  (setq-local imenu-syntax-alist '((?! . "w"))) ; For macro_rules!
+  (setq-local beginning-of-defun-function #'rust-beginning-of-defun)
+  (setq-local end-of-defun-function #'rust-end-of-defun)
+  (setq-local parse-sexp-lookup-properties t)
+  (setq-local electric-pair-inhibit-predicate
+              #'rust-electric-pair-inhibit-predicate-wrap)
+  (add-function :before-until (local 'electric-pair-skip-self)
+                #'rust-electric-pair-skip-self)
+  ;; Configure prettify
+  (setq prettify-symbols-alist rust-prettify-symbols-alist)
+  (setq prettify-symbols-compose-predicate #'rust--prettify-symbols-compose-p)
+
+  (add-hook 'before-save-hook rust-before-save-hook nil t)
+  (add-hook 'after-save-hook rust-after-save-hook nil t))
+
+(provide 'rust-prog-mode)
+;;; rust-prog-mode.el ends here
\ No newline at end of file



reply via email to

[Prev in Thread] Current Thread [Next in Thread]