From 8e2cde800da8d6a694a3626d255fd0d9952e1e8f Mon Sep 17 00:00:00 2001 From: Randy Taylor Date: Sat, 28 Jan 2023 21:21:29 -0500 Subject: [PATCH] Fix dockerfile-ts-mode line continuation indentation Without this rule, line continuations are only indented after entering the contents for the line and hitting TAB or RET. For example: ``` EXPOSE 1 \ ``` After hitting RET to go to the next line, point would end up at BOL instead of lining up with the previous entry, like so: ``` EXPOSE 1 \ 2 ``` The new rule will indent it as so: ``` EXPOSE 1 \ 2 ``` * lisp/progmodes/dockerfile-ts-mode.el (dockerfile-ts-mode--indent-rules): New rule. (dockerfile-ts-mode--line-continuation-p) (dockerfile-ts-mode--line-continuation-anchor): New functions. --- lisp/progmodes/dockerfile-ts-mode.el | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/lisp/progmodes/dockerfile-ts-mode.el b/lisp/progmodes/dockerfile-ts-mode.el index 2a295e885b0..f2f30cf2617 100644 --- a/lisp/progmodes/dockerfile-ts-mode.el +++ b/lisp/progmodes/dockerfile-ts-mode.el @@ -51,9 +51,27 @@ dockerfile-ts-mode--indent-rules ((parent-is "expose_instruction") (nth-sibling 1) 0) ((parent-is "label_instruction") (nth-sibling 1) 0) ((parent-is "shell_command") first-sibling 0) - ((parent-is "string_array") first-sibling 1))) + ((parent-is "string_array") first-sibling 1) + ((dockerfile-ts-mode--line-continuation-p) dockerfile-ts-mode--line-continuation-anchor 0))) "Tree-sitter indent rules.") +(defun dockerfile-ts-mode--line-continuation-p () + "Return t if the current node is a line continuation node." + (lambda (node _ _ &rest _) + (string= (treesit-node-type node) "\n"))) + +(defun dockerfile-ts-mode--line-continuation-anchor (_ _ &rest _) + "This anchor is used to align any nodes that are part of a line +continuation to the previous entry." + (save-excursion + (forward-line -1) + (let ((prev-node (treesit-node-at (point)))) + (if (string= (treesit-node-type prev-node) "\\\n") + (back-to-indentation) + (forward-word) + (forward-char)) + (+ 1 (- (point) (pos-bol)))))) + (defvar dockerfile-ts-mode--keywords '("ADD" "ARG" "AS" "CMD" "COPY" "CROSS_BUILD" "ENTRYPOINT" "ENV" "EXPOSE" "FROM" "HEALTHCHECK" "LABEL" "MAINTAINER" "ONBUILD" "RUN" -- 2.39.1