GNU bug report logs - #68297
[PATCH] Support indented continuation lines in lua-ts-mode

Previous Next

Package: emacs;

Reported by: john muhl <jm <at> pub.pink>

Date: Sat, 6 Jan 2024 22:03:01 UTC

Severity: wishlist

Tags: patch

Done: Stefan Kangas <stefankangas <at> gmail.com>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 68297 in the body.
You can then email your comments to 68297 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#68297; Package emacs. (Sat, 06 Jan 2024 22:03:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to john muhl <jm <at> pub.pink>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Sat, 06 Jan 2024 22:03:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: john muhl <jm <at> pub.pink>
To: bug-gnu-emacs <at> gnu.org
Subject: [PATCH] Support indented continuation lines in lua-ts-mode
Date: Sat, 06 Jan 2024 12:56:17 -0600
Add rules for indenting multi-line variables and if/elseif
statements, e.g.:

  local very_long_variable_name =
      "ABC"..
      "XYZ"
  local v = 123 *
      456 +
      789

  if a
      and b
      or c then
      print(1)
  elseif b
      and c
      or a then
      print(0)
  end

The lua-ts-indent-continuation-lines option can be set to nil to
keep if statements flush left:

  if a
  and b
  or c then
      print(1)
  elseif b
  and c
  or a then
      print(0)
  end

The option controlling this behavior in the EmmyLua code
formatter does not affect multi-line variables so neither does
lua-ts-indent-continuation-lines.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#68297; Package emacs. (Sat, 06 Jan 2024 22:40:01 GMT) Full text and rfc822 format available.

Message #8 received at 68297 <at> debbugs.gnu.org (full text, mbox):

From: john muhl <jm <at> pub.pink>
To: 68297 <at> debbugs.gnu.org
Subject: Re: bug#68297: [PATCH] Support indented continuation lines in
 lua-ts-mode
Date: Sat, 06 Jan 2024 16:37:55 -0600
[0001-Support-indented-continuation-lines-in-lua-ts-mode.patch (text/x-patch, attachment)]
From 8e73025f048bcd5c405a19fc090f7c58cb728c5a Mon Sep 17 00:00:00 2001
From: john muhl <jm <at> pub.pink>
Date: Sat, 6 Jan 2024 09:36:33 -0600
Subject: [PATCH] Support indented continuation lines in lua-ts-mode

* lisp/progmodes/lua-ts-mode.el (lua-ts--simple-indent-rules):
Add a rule to indent multi-line assignments and if statements.
(lua-ts-indent-continuation-lines): New user option.
* test/lisp/progmodes/lua-ts-mode-resources/indent.erts: Add
tests.  (bug#68279)
---
 lisp/progmodes/lua-ts-mode.el                 | 47 ++++++++++++
 .../lua-ts-mode-resources/indent.erts         | 76 +++++++++++++++++++
 2 files changed, 123 insertions(+)

diff --git a/lisp/progmodes/lua-ts-mode.el b/lisp/progmodes/lua-ts-mode.el
index e9ffb47cdb2..63a33a14ed7 100644
--- a/lisp/progmodes/lua-ts-mode.el
+++ b/lisp/progmodes/lua-ts-mode.el
@@ -150,6 +150,28 @@ lua-ts-align-params-and-props
   :group 'lua-ts
   :version "30.1")
 
+(defcustom lua-ts-indent-continuation-lines t
+  "Controls how multi-line if/else statements are aligned.
+
+If t, then continuation lines are indented by `lua-ts-indent-offset':
+
+  if a
+      and b then
+      print(1)
+  end
+
+If nil, then continuation lines are aligned with the beginning of
+the statement:
+
+  if a
+  and b then
+      print(1)
+  end"
+  :type 'boolean
+  :safe 'booleanp
+  :group 'lua-ts
+  :version "30.1")
+
 (defvar lua-ts--builtins
   '("assert" "bit32" "collectgarbage" "coroutine" "debug" "dofile"
     "error" "getmetatable" "io" "ipairs" "load" "loadfile"
@@ -362,6 +384,17 @@ lua-ts--simple-indent-rules
      ((or (match "end" "function_definition")
           (node-is "end"))
       standalone-parent 0)
+     ((n-p-gp "expression_list" "assignment_statement" "variable_declaration")
+      lua-ts--variable-declaration-continuation-anchor
+      lua-ts-indent-offset)
+     ((and (parent-is "binary_expression")
+           lua-ts--variable-declaration-continuation)
+      lua-ts--variable-declaration-continuation-anchor
+      lua-ts-indent-offset)
+     ((and (lambda (&rest _) lua-ts-indent-continuation-lines)
+           (parent-is "binary_expression"))
+      standalone-parent lua-ts-indent-offset)
+     ((parent-is "binary_expression") standalone-parent 0)
      ((or (parent-is "function_declaration")
           (parent-is "function_definition")
           (parent-is "do_statement")
@@ -448,6 +481,20 @@ lua-ts--nested-function-last-function-matcher
          (treesit-induce-sparse-tree parent #'lua-ts--function-definition-p)))
     (= 1 (length (cadr sparse-tree)))))
 
+(defun lua-ts--variable-declaration-continuation (node &rest _)
+  "Matches if NODE is part of a multi-line variable declaration."
+  (treesit-parent-until node
+                        (lambda (p)
+                          (equal "variable_declaration"
+                                 (treesit-node-type p)))))
+
+(defun lua-ts--variable-declaration-continuation-anchor (node &rest _)
+  "Return the start position of the variable declaration for NODE."
+  (save-excursion
+    (goto-char (treesit-node-start
+                (lua-ts--variable-declaration-continuation node)))
+    (line-beginning-position)))
+
 (defvar lua-ts--syntax-table
   (let ((table (make-syntax-table)))
     (modify-syntax-entry ?+  "."    table)
diff --git a/test/lisp/progmodes/lua-ts-mode-resources/indent.erts b/test/lisp/progmodes/lua-ts-mode-resources/indent.erts
index 5e6ce7935f8..2e7384cac88 100644
--- a/test/lisp/progmodes/lua-ts-mode-resources/indent.erts
+++ b/test/lisp/progmodes/lua-ts-mode-resources/indent.erts
@@ -529,6 +529,46 @@ local Other = {
 }
 =-=-=
 
+Name: Continuation Indent
+
+=-=
+local very_long_variable_name =
+"ok"..
+      "ok"
+local n = a +
+b *
+c /
+1
+local x = "A"..
+"B"
+.."C"
+if a
+     and b
+           and c then
+elseif a
+     or b
+    or c then
+end
+=-=
+local very_long_variable_name =
+  "ok"..
+  "ok"
+local n = a +
+  b *
+  c /
+  1
+local x = "A"..
+  "B"
+  .."C"
+if a
+  and b
+  and c then
+elseif a
+  or b
+  or c then
+end
+=-=-=
+
 Code:
   (lambda ()
     (setq indent-tabs-mode nil)
@@ -711,3 +751,39 @@ tbl = {1,2,
   3,4,
   5,6}
 =-=-=
+
+Code:
+  (lambda ()
+    (setq indent-tabs-mode nil)
+    (setq lua-ts-indent-continuation-lines nil)
+    (setq lua-ts-indent-offset 2)
+    (lua-ts-mode)
+    (indent-region (point-min) (point-max)))
+
+Name: Unaligned Continuation Indent
+
+=-=
+local n = a +
+  b *
+  c /
+  1
+if a
+     and b
+and c then
+elseif a
+       or b
+          or c then
+end
+=-=
+local n = a +
+  b *
+  c /
+  1
+if a
+and b
+and c then
+elseif a
+or b
+or c then
+end
+=-=-=
-- 
2.41.0





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#68297; Package emacs. (Sat, 06 Jan 2024 23:01:02 GMT) Full text and rfc822 format available.

Message #11 received at 68297 <at> debbugs.gnu.org (full text, mbox):

From: john muhl <jm <at> pub.pink>
To: 68297 <at> debbugs.gnu.org
Subject: Re: bug#68297: [PATCH] Support indented continuation lines in
 lua-ts-mode
Date: Sat, 06 Jan 2024 16:57:57 -0600
[Message part 1 (text/plain, inline)]
Ignore the previous. I accidentally made it from the wrong
branch. This one should apply cleanly.

[0001-Support-indented-continuation-lines-in-lua-ts-mode.patch (text/x-patch, attachment)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#68297; Package emacs. (Sun, 07 Jan 2024 00:44:02 GMT) Full text and rfc822 format available.

Message #14 received at submit <at> debbugs.gnu.org (full text, mbox):

From: john muhl <jm <at> pub.pink>
To: john muhl <jm <at> pub.pink>
Cc: bug-gnu-emacs <at> gnu.org
Subject: Re: [PATCH] Support indented continuation lines in lua-ts-mode
Date: Sat, 06 Jan 2024 18:39:30 -0600
[Message part 1 (text/plain, inline)]
...and now I see that only handled top-level statements. This
one works with nested ifs and variables too.

[0001-Support-indented-continuation-lines-in-lua-ts-mode.patch (text/x-patch, attachment)]

Severity set to 'wishlist' from 'normal' Request was from Stefan Kangas <stefankangas <at> gmail.com> to control <at> debbugs.gnu.org. (Thu, 11 Jan 2024 20:50:02 GMT) Full text and rfc822 format available.

Reply sent to Stefan Kangas <stefankangas <at> gmail.com>:
You have taken responsibility. (Thu, 11 Jan 2024 20:53:02 GMT) Full text and rfc822 format available.

Notification sent to john muhl <jm <at> pub.pink>:
bug acknowledged by developer. (Thu, 11 Jan 2024 20:53:02 GMT) Full text and rfc822 format available.

Message #21 received at 68297-done <at> debbugs.gnu.org (full text, mbox):

From: Stefan Kangas <stefankangas <at> gmail.com>
To: john muhl <jm <at> pub.pink>
Cc: 68297-done <at> debbugs.gnu.org
Subject: Re: bug#68297: [PATCH] Support indented continuation lines in
 lua-ts-mode
Date: Thu, 11 Jan 2024 12:52:23 -0800
john muhl <jm <at> pub.pink> writes:

> ...and now I see that only handled top-level statements. This
> one works with nested ifs and variables too.

Thanks, installed on master (43b4993d73b).




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Fri, 09 Feb 2024 12:24:20 GMT) Full text and rfc822 format available.

This bug report was last modified 1 year and 224 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.