From: john muhl via "Bug reports for GNU Emacs, the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
To: 68297@debbugs.gnu.org
Subject: bug#68297: [PATCH] Support indented continuation lines in lua-ts-mode
Date: Sat, 06 Jan 2024 16:57:57 -0600 [thread overview]
Message-ID: <875y06f4o1.fsf@pub.pink> (raw)
In-Reply-To: <87h6jqf5n6.fsf@pub.pink>
[-- Attachment #1: Type: text/plain, Size: 99 bytes --]
Ignore the previous. I accidentally made it from the wrong
branch. This one should apply cleanly.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Support-indented-continuation-lines-in-lua-ts-mode.patch --]
[-- Type: text/x-patch, Size: 4650 bytes --]
From 86b5bba1d3c2850151ff280be6df458d898cdf11 Mon Sep 17 00:00:00 2001
From: john muhl <jm@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 3b600f59521..714fab8e852 100644
--- a/lisp/progmodes/lua-ts-mode.el
+++ b/lisp/progmodes/lua-ts-mode.el
@@ -122,6 +122,28 @@ lua-ts-inferior-history
: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"
@@ -329,6 +351,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")
@@ -415,6 +448,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 9797467bbe5..a535c46f871 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)
@@ -677,3 +717,39 @@ function e (n, t)
end)(i(...))
end end end
=-=-=
+
+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
next prev parent reply other threads:[~2024-01-06 22:57 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-06 18:56 bug#68297: [PATCH] Support indented continuation lines in lua-ts-mode john muhl via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-01-06 22:37 ` john muhl via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-01-06 22:57 ` john muhl via Bug reports for GNU Emacs, the Swiss army knife of text editors [this message]
2024-01-07 0:39 ` john muhl via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-01-11 20:52 ` Stefan Kangas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=875y06f4o1.fsf@pub.pink \
--to=bug-gnu-emacs@gnu.org \
--cc=68297@debbugs.gnu.org \
--cc=jm@pub.pink \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.