GNU bug report logs -
#62536
30.0.50; Can we add """ ... """ electric pair in elixir, just like python
Previous Next
Reported by: 牟 桐 <mou.tong <at> outlook.com>
Date: Thu, 30 Mar 2023 04:31:02 UTC
Severity: normal
Found in version 30.0.50
Done: Eli Zaretskii <eliz <at> gnu.org>
Bug is archived. No further changes may be made.
Full log
Message #86 received at 62536 <at> debbugs.gnu.org (full text, mbox):
> Wilhelm Kirschbaum <wkirschbaum <at> gmail.com> writes:
>
>>>> And in electric-layout-rules you _can_, I think, identify
>>>> triple quotes using a function as described in the last
>>>> paragraph of its docstring.
>>>>
>>> Yes, I tested this earlier and it does work.
>>>
>>
>> Even though it works, it does not play nice with the custom
>> psif,
>> because the layout rules seems to trigger before the hook.
>
> There could yet be a snag here, which I didn't anticipate, which
> is that
> rules in electric-layout-rules do not trigger if inside strings
> or
> comments, and that is hardcoded.
>
> Let's assume we got rid of the snag or had some mechanism to
> override
> it:
>
> diff --git a/lisp/electric.el b/lisp/electric.el
> index bac3f5a2b3c..cef5326852c 100644
> --- a/lisp/electric.el
> +++ b/lisp/electric.el
> @@ -409,9 +409,7 @@
> electric-layout-post-self-insert-function-1
> (goto-char pos)
> (funcall probe
> last-command-event))))
> (when res (throw 'done
> res))))))))))
> - (when (and rule
> - ;; Not in a string or comment.
> - (not (nth 8 (save-excursion (syntax-ppss
> pos)))))
> + (when rule
> (goto-char pos)
> (when (functionp rule) (setq rule (funcall rule)))
> (dolist (sym (if (symbolp rule) (list rule) rule))
>
>
> Then, the following simple patch seems to have good results in
> my tests.
>
> (defun joaot/looking-back-at-exactly-three-quotes-p ()
> (looking-back "\\(\\`\\|[^\"]\\)\"\"\"" (- (point) 4)))
>
> (defun joaot/triple-quotes ()
> (when (and (eq ?\" last-command-event)
> (joaot/looking-back-at-exactly-three-quotes-p))
> (save-excursion (insert "\"\"\"" ))))
>
> (defun joaot/layout-after-triple-quotes (inserted)
> (when (and (eq inserted ?\")
> (joaot/looking-back-at-exactly-three-quotes-p))
> '(after-stay after)))
>
> (defun joaot/setup-elixir-electricity ()
> (electric-layout-local-mode 1)
> (electric-pair-local-mode 1)
> (electric-indent-local-mode 1)
> (add-hook 'post-self-insert-hook
> 'joaot/super-quotes-and-newlines -05 t)
> (setq-local electric-layout-rules
> (list #'joaot/layout-after-triple-quotes)))
>
> (add-hook 'elixir-ts-mode-hook
> 'joaot/setup-elixir-electricity)
>
> João
Thanks, yes. I think this brings us closer. For some more fun,
and the
other part of the issue I have not mentioned is this scenario:
```elixir
def foo() do
~H"""
<foo class=
"""
end
```
then completing `class=""` jumps into the end of the template ,
which is
pretty annoying, more so that the current issue at hand.
The other patch in this thread will porpertize the `"""` as
`$` for a lack of a better syntax class, which then breaks it
again and
produces:
```
"""
|"
"""
```
the highlight the propertize function change:
@ -550,6 +552,22 @@ elixir-ts--defun-name
(_ nil))))
(_ nil)))
+(defvar elixir-ts--syntax-propertize-query
+ (when (treesit-available-p)
+ (treesit-query-compile
+ 'elixir
+ '(((["\"\"\""] @quoted-text))))))
+
+(defun elixir-ts--syntax-propertize (start end)
+ "Apply syntax text properties between START and END for
`elixir-ts-mode'."
+ (let ((captures
+ (treesit-query-capture 'elixir
elixir-ts--syntax-propertize-query start end)))
+ (pcase-dolist (`(,name . ,node) captures)
+ (pcase-exhaustive name
+ ('quoted-text
+ (put-text-property (1- (treesit-node-end node))
(treesit-node-end node)
+ 'syntax-table (string-to-syntax
"$")))))))
+
;;;###autoload
(define-derived-mode elixir-ts-mode prog-mode "Elixir"
"Major mode for editing Elixir, powered by tree-sitter."
@@ -630,7 +648,8 @@ elixir-ts-mode
( elixir-sigil elixir-string-escape
elixir-string-interpolation ))))
- (treesit-major-mode-setup)))
+ (treesit-major-mode-setup)
+ (setq-local syntax-propertize-function
#'elixir-ts--syntax-propertize)))
This bug report was last modified 2 years and 48 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.