]> git.eshelyaron.com Git - emacs.git/commitdiff
ruby-method-params-indent: New user option
authorDmitry Gutov <dgutov@yandex.ru>
Mon, 19 Dec 2022 19:01:27 +0000 (21:01 +0200)
committerDmitry Gutov <dgutov@yandex.ru>
Mon, 19 Dec 2022 19:06:07 +0000 (21:06 +0200)
* lisp/progmodes/ruby-mode.el (ruby-method-params-indent):
New option (bug#60110).

(ruby-smie-rules): Use it.

* etc/NEWS: Mention it.

* test/lisp/progmodes/ruby-mode-resources/ruby.rb:
Ensure the var's value is default.

* test/lisp/progmodes/ruby-mode-resources/ruby-method-params-indent.rb:
New file.

* test/lisp/progmodes/ruby-mode-tests.el (ruby-deftest-indent):
New macro, use it to run the indentation test using the new file.
Disable the :expensive-test tag, because neither runs for "longer
than some few seconds", both take significantly below 1s.

etc/NEWS
lisp/progmodes/ruby-mode.el
test/lisp/progmodes/ruby-mode-resources/ruby-method-params-indent.rb [new file with mode: 0644]
test/lisp/progmodes/ruby-mode-resources/ruby.rb
test/lisp/progmodes/ruby-mode-tests.el

index 017fd850b4efb5b4c976695e7b99a246d976a2c2..0e84459634706e670985f756d9b83db91339da1a 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2761,6 +2761,9 @@ project-dedicated or global) is specified by the new
 ---
 *** Support for endless methods.
 
+---
+*** New user option 'ruby-method-params-indent'.
+
 ** Eshell
 
 +++
index d7efe982870bcd3613eeb7124a700af3adebaebf..2b813dfcbcc8c6522e4a78dd4b4365429df12d05 100644 (file)
@@ -268,6 +268,23 @@ Only has effect when `ruby-use-smie' is t."
   :safe 'booleanp
   :version "24.4")
 
+(defcustom ruby-method-params-indent t
+  "Indentation  of multiline method parameters.
+
+When t, the parameters list is indented to the method name.
+
+When a number, indent the parameters list this many columns
+against the beginning of the method (the \"def\" keyword).
+
+The value nil means the same as 0.
+
+Only has effect when `ruby-use-smie' is t."
+  :type '(choice (const :tag "Indent to the method name" t)
+                 (number :tag "Indent specified number of columns against def")
+                 (const :tag "Indent to def" nil))
+  :safe (lambda (val) (or (memq val '(t nil)) (numberp val)))
+  :version 29.1)
+
 (defcustom ruby-deep-arglist t
   "Deep indent lists in parenthesis when non-nil.
 Also ignores spaces after parenthesis when `space'.
@@ -660,9 +677,12 @@ This only affects the output of the command `ruby-toggle-block'."
        (unless (or (eolp) (forward-comment 1))
          (cons 'column (current-column)))))
     ('(:before . " @ ")
-     (save-excursion
-       (skip-chars-forward " \t")
-       (cons 'column (current-column))))
+     (if (or (eq ruby-method-params-indent t)
+             (not (smie-rule-parent-p "def" "def=")))
+         (save-excursion
+           (skip-chars-forward " \t")
+           (cons 'column (current-column)))
+       (smie-rule-parent (or ruby-method-params-indent 0))))
     ('(:before . "do") (ruby-smie--indent-to-stmt))
     ('(:before . ".")
      (if (smie-rule-sibling-p)
diff --git a/test/lisp/progmodes/ruby-mode-resources/ruby-method-params-indent.rb b/test/lisp/progmodes/ruby-mode-resources/ruby-method-params-indent.rb
new file mode 100644 (file)
index 0000000..2b66579
--- /dev/null
@@ -0,0 +1,18 @@
+class C
+  def self.foo(
+    baz,
+    bar
+  ) =
+    what
+
+  def foo=(
+    baz,
+    bar
+  )
+    hello
+  end
+end
+
+# Local Variables:
+# ruby-method-params-indent: 0
+# End:
index 2451edaee223c78e84405d02d58599db4ec63019..6a69d9db78ac48cd28e524f814f741242fdf633a 100644 (file)
@@ -538,3 +538,7 @@ class Bar
     baz
   end
 end
+
+# Local Variables:
+# ruby-method-params-indent: t
+# End:
index 9be01dc78f9014185f6d3df68a2aee7a6113ada3..560f780285a174700481219510b6552ed5aeeefe 100644 (file)
@@ -943,16 +943,20 @@ VALUES-PLIST is a list with alternating index and value elements."
                      "Blub#bye"
                      "Blub#hiding")))))
 
-(ert-deftest ruby--indent/converted-from-manual-test ()
-  :tags '(:expensive-test)
-  ;; Converted from manual test.
-  (let ((buf (find-file-noselect (ert-resource-file "ruby.rb"))))
-    (unwind-protect
-        (with-current-buffer buf
-          (let ((orig (buffer-string)))
-            (indent-region (point-min) (point-max))
-            (should (equal (buffer-string) orig))))
-      (kill-buffer buf))))
+(defmacro ruby-deftest-indent (file)
+  `(ert-deftest ,(intern (format "ruby-indent-test/%s" file)) ()
+     ;; :tags '(:expensive-test)
+     (let ((buf (find-file-noselect (ert-resource-file ,file))))
+       (unwind-protect
+           (with-current-buffer buf
+             (let ((orig (buffer-string)))
+               ;; Indent and check that we get the original text.
+               (indent-region (point-min) (point-max))
+               (should (equal (buffer-string) orig))))
+         (kill-buffer buf)))))
+
+(ruby-deftest-indent "ruby.rb")
+(ruby-deftest-indent "ruby-method-params-indent.rb")
 
 (ert-deftest ruby--test-chained-indentation ()
   (with-temp-buffer