diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2f2e174f..e1e813e3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,6 +12,8 @@ jobs: emacs-version: - 27.2 - 28.1 + - snapshot + steps: - uses: actions/checkout@v2 diff --git a/README.md b/README.md index 39f90f37..6b5dad89 100644 --- a/README.md +++ b/README.md @@ -136,6 +136,29 @@ additional [installation instructions](https://github.crookster.org/switching-to-straight.el-from-emacs-26-builtin-package.el/) for moving your package management from package.el to straight. +## treesitter + +You can try the new native treesitter mode `rust-ts-mode` with: + +```elisp +(use-package rustic + :init + (setq rustic-treesitter-derive t)) +``` + +In case you want to use treesitter but can't use emacs master, 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 + :config + (require 'tree-sitter-langs) + (global-tree-sitter-mode) + (add-hook 'tree-sitter-after-on-hook #'tree-sitter-hl-mode)) +``` + ## remote rustfmt and most of the common cargo commands should work remotely. diff --git a/rustic-rust-mode.el b/rustic-rust-mode.el new file mode 100644 index 00000000..291928a5 --- /dev/null +++ b/rustic-rust-mode.el @@ -0,0 +1,34 @@ +;;; rustic-comint.el --- Cargo and comint facilities -*-lexical-binding: t-*- +;;; Commentary: + +;; Deprecated code related to rust-mode + +;;; Code: + +(setq rust-load-optional-libraries nil) +(setq rust-before-save-hook #'rustic-before-save-hook) +(setq rust-after-save-hook #'rustic-after-save-hook) +(require 'rust-mode) + +;;; Define aliases for removed rustic functions + +(defvaralias 'rustic-indent-offset 'rust-indent-offset) +(defvaralias 'rustic-indent-method-chain 'rust-indent-method-chain) +(defvaralias 'rustic-indent-where-clause 'rust-indent-where-clause) +(defvaralias 'rustic-match-angle-brackets 'rust-match-angle-brackets) +(defvaralias 'rustic-indent-return-type-to-arguments 'rust-indent-return-type-to-arguments) +(defalias 'rustic-indent-line #'rust-mode-indent-line) +(defalias 'rustic-end-of-defun #'rust-end-of-defun) + +;;;###autoload +(define-derived-mode rustic-mode rust-mode "Rustic" + "Major mode for Rust code. + +\\{rustic-mode-map}" + :group 'rustic + + (when (bound-and-true-p rustic-cargo-auto-add-missing-dependencies) + (add-hook 'lsp-after-diagnostics-hook 'rustic-cargo-add-missing-dependencies-hook nil t))) + +(provide 'rustic-rust-mode) +;;; rustic-rust-mode.el ends here diff --git a/rustic-ts-mode.el b/rustic-ts-mode.el new file mode 100644 index 00000000..1e2ac0f8 --- /dev/null +++ b/rustic-ts-mode.el @@ -0,0 +1,22 @@ +;;; rustic-ts-mode.el --- use native rust-ts-mode -*-lexical-binding: t-*- +;;; Commentary: + +;; Derive from rust-ts-mode instead of rust-mode + +;;; Code: + +;;;###autoload +(define-derived-mode rustic-mode rust-ts-mode "Rustic" + "Major mode for Rust code. + +\\{rustic-mode-map}" + :group 'rustic + + (when (bound-and-true-p rustic-cargo-auto-add-missing-dependencies) + (add-hook 'lsp-after-diagnostics-hook 'rustic-cargo-add-missing-dependencies-hook nil t)) + + (add-hook 'before-save-hook 'rustic-before-save-hook nil t) + (add-hook 'after-save-hook 'rustic-after-save-hook nil t)) + +(provide 'rustic-ts-mode) +;;; rustic-ts-mode.el ends here diff --git a/rustic.el b/rustic.el index 9f76c0e9..6224c9b1 100644 --- a/rustic.el +++ b/rustic.el @@ -35,11 +35,6 @@ (require 'dash) -(setq rust-load-optional-libraries nil) -(setq rust-before-save-hook #'rustic-before-save-hook) -(setq rust-after-save-hook #'rustic-after-save-hook) -(require 'rust-mode) - ;;; Customization (defgroup rustic nil @@ -47,16 +42,6 @@ :link '(url-link "https://www.rustic-lang.org/") :group 'languages) -;;; Define aliases for removed rustic functions - -(defvaralias 'rustic-indent-offset 'rust-indent-offset) -(defvaralias 'rustic-indent-method-chain 'rust-indent-method-chain) -(defvaralias 'rustic-indent-where-clause 'rust-indent-where-clause) -(defvaralias 'rustic-match-angle-brackets 'rust-match-angle-brackets) -(defvaralias 'rustic-indent-return-type-to-arguments 'rust-indent-return-type-to-arguments) -(defalias 'rustic-indent-line #'rust-mode-indent-line) -(defalias 'rustic-end-of-defun #'rust-end-of-defun) - ;;; Workspace (defvar-local rustic--buffer-workspace nil @@ -111,6 +96,13 @@ this variable." :type 'function :group 'rustic) +(defcustom rustic-treesitter-derive nil + "Whether rustic should derive from the new treesitter mode `rust-ts-mode' +instead of `rust-mode'. This option requires emacs29+." + :version "29.1" + :type 'boolean + :group 'rustic) + ;;; Mode (defvar rustic-mode-map @@ -145,24 +137,13 @@ this variable." map) "Keymap for `rustic-mode'.") -;;;###autoload -(define-derived-mode rustic-mode rust-mode "Rustic" - "Major mode for Rust code. - -\\{rustic-mode-map}" - :group 'rustic - - (when (bound-and-true-p rustic-cargo-auto-add-missing-dependencies) - (add-hook 'lsp-after-diagnostics-hook 'rustic-cargo-add-missing-dependencies-hook nil t))) +(if (and (version<= "29.1" emacs-version) rustic-treesitter-derive) + (require 'rustic-ts-mode) + (require 'rustic-rust-mode)) ;;;###autoload (add-to-list 'auto-mode-alist '("\\.rs\\'" . rustic-mode)) -;; remove rust-mode from `auto-mode-alist' -(let ((mode '("\\.rs\\'" . rust-mode))) - (when (member mode auto-mode-alist) - (setq auto-mode-alist (remove mode auto-mode-alist)))) - ;;; _ (defun rustic-reload ()