From: Yuan Fu Date: Fri, 3 Feb 2023 02:23:21 +0000 (-0800) Subject: Make c-ts-mode indent tests side-effect-free X-Git-Tag: emacs-29.0.90~529 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=d963a8f1355a6d829af3f98182e66705c941e774;p=emacs.git Make c-ts-mode indent tests side-effect-free Running indent tests changes the global value of c-ts-mode-indent-style. That's not good. This change fixes that. I also refactored the indent style functions a bit. * lisp/progmodes/c-ts-mode.el: (c-ts-mode--prompt-for-style): New function. (c-ts-mode-set-local-style): New function. (c-ts-mode-set-style): Use c-ts-mode--prompt-for-style. Use derived-mode-p when testing for major mode. Remove check of current buffer's major mode since it doesn't matter. * test/lisp/progmodes/c-ts-mode-resources/indent-bsd.erts: * test/lisp/progmodes/c-ts-mode-resources/indent.erts: Use c-ts-mode-set-local-style to set the indent style locally. --- diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el index 00704337cd9..390f67a8e8c 100644 --- a/lisp/progmodes/c-ts-mode.el +++ b/lisp/progmodes/c-ts-mode.el @@ -100,12 +100,11 @@ the value of SYM in `c-ts-mode' and `c++-ts-mode' buffers to VAL." (setq-local treesit-simple-indent-rules (treesit--indent-rules-optimize (c-ts-mode--get-indent-style - (if (eq major-mode 'c-ts-mode) 'c 'cpp)))))) + (if (derived-mode-p 'c-ts-mode) 'c 'cpp)))))) res) (let ((buffer (car buffers))) (with-current-buffer buffer - ;; FIXME: Should we use `derived-mode-p' here? - (if (or (eq major-mode 'c-ts-mode) (eq major-mode 'c++-ts-mode)) + (if (derived-mode-p 'c-ts-mode 'c++-ts-mode) (loop (append res (list buffer)) (cdr buffers)) (loop res (cdr buffers)))))))) @@ -134,24 +133,33 @@ MODE is either `c' or `cpp'." (alist-get c-ts-mode-indent-style (c-ts-mode--indent-styles mode))))) `((,mode ,@style)))) -(defun c-ts-mode-set-style () - "Set the indent style of C/C++ modes globally. +(defun c-ts-mode--prompt-for-style () + "Prompt for a indent style and return the symbol for it." + (let ((mode (if (derived-mode-p 'c-ts-mode) 'c 'c++))) + (intern + (completing-read + "Style: " + (mapcar #'car (c-ts-mode--indent-styles mode)) + nil t nil nil "gnu")))) + +(defun c-ts-mode-set-style (style) + "Set the indent style of C/C++ modes globally to STYLE. This changes the current indent style of every C/C++ buffer and the default C/C++ indent style in this Emacs session." - (interactive) - ;; FIXME: Should we use `derived-mode-p' here? - (or (eq major-mode 'c-ts-mode) (eq major-mode 'c++-ts-mode) - (error "Buffer %s is not a c-ts-mode (c-ts-mode-set-style)" - (buffer-name))) - (c-ts-mode--indent-style-setter - 'c-ts-mode-indent-style - ;; NOTE: We can probably use the interactive form for this. - (intern - (completing-read - "Select style: " - (mapcar #'car (c-ts-mode--indent-styles (if (eq major-mode 'c-ts-mode) 'c 'cpp))) - nil t nil nil "gnu")))) + (interactive (list (c-ts-mode--prompt-for-style))) + (c-ts-mode--indent-style-setter 'c-ts-mode-indent-style style)) + +(defun c-ts-mode-set-local-style (style) + "Set the C/C++ indent style of the current buffer to STYLE." + (interactive (list (c-ts-mode--prompt-for-style))) + (if (not (derived-mode-p 'c-ts-mode 'c++-ts-mode)) + (user-error "The current buffer is not in `c-ts-mode' nor `c++-ts-mode'") + (setq-local c-ts-mode-indent-style style) + (setq treesit-simple-indent-rules + (treesit--indent-rules-optimize + (c-ts-mode--get-indent-style + (if (derived-mode-p 'c-ts-mode) 'c 'cpp)))))) ;;; Syntax table diff --git a/test/lisp/progmodes/c-ts-mode-resources/indent-bsd.erts b/test/lisp/progmodes/c-ts-mode-resources/indent-bsd.erts index 07698077ffc..ba4f854baf8 100644 --- a/test/lisp/progmodes/c-ts-mode-resources/indent-bsd.erts +++ b/test/lisp/progmodes/c-ts-mode-resources/indent-bsd.erts @@ -1,9 +1,9 @@ Code: (lambda () - (setq indent-tabs-mode nil) - (setq c-ts-mode-indent-offset 2) - (setq c-ts-mode-indent-style 'bsd) (c-ts-mode) + (setq-local indent-tabs-mode nil) + (setq-local c-ts-mode-indent-offset 2) + (c-ts-mode-set-local-style 'bsd) (indent-region (point-min) (point-max))) Point-Char: | diff --git a/test/lisp/progmodes/c-ts-mode-resources/indent.erts b/test/lisp/progmodes/c-ts-mode-resources/indent.erts index 0ecbf922b15..3704f06d2ae 100644 --- a/test/lisp/progmodes/c-ts-mode-resources/indent.erts +++ b/test/lisp/progmodes/c-ts-mode-resources/indent.erts @@ -1,9 +1,9 @@ Code: (lambda () - (setq indent-tabs-mode nil) - (setq c-ts-mode-indent-offset 2) - (setq c-ts-mode-indent-style 'gnu) (c-ts-mode) + (setq-local indent-tabs-mode nil) + (setq-local c-ts-mode-indent-offset 2) + (c-ts-mode-set-local-style 'gnu) (indent-region (point-min) (point-max))) Point-Char: | @@ -219,10 +219,10 @@ line 2 Code: (lambda () - (setq indent-tabs-mode nil) - (setq c-ts-mode-indent-offset 8) - (setq c-ts-mode-indent-style 'linux) (c-ts-mode) + (setq-local indent-tabs-mode nil) + (setq-local c-ts-mode-indent-offset 8) + (c-ts-mode-set-local-style 'linux) (indent-region (point-min) (point-max))) Name: Labels (Linux Style)