[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/raku-mode 0673f007b0 056/253: SMIE indenation ported from
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/raku-mode 0673f007b0 056/253: SMIE indenation ported from css-mode |
Date: |
Sat, 29 Jan 2022 08:28:42 -0500 (EST) |
branch: elpa/raku-mode
commit 0673f007b0175ed0ff746175f5c6977c6d87aa76
Author: Andrei Osipov <andreoss@sdf.org>
Commit: Andrei Osipov <andreoss@sdf.org>
SMIE indenation ported from css-mode
---
perl6-mode.el | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 65 insertions(+), 1 deletion(-)
diff --git a/perl6-mode.el b/perl6-mode.el
index f30a446d21..825657443c 100644
--- a/perl6-mode.el
+++ b/perl6-mode.el
@@ -41,6 +41,65 @@
(require 'perl6-detect)
(require 'perl6-font-lock)
+
+(require 'smie)
+
+(defconst perl6-smie-grammar
+ (smie-prec2->grammar
+ (smie-precs->prec2 '((assoc ";") (assoc ",") (left ":")))))
+
+(defun perl6-smie--not-interpolation-p ()
+ (save-excursion
+ (forward-char -1)
+ (or (zerop (skip-chars-backward "-[:alnum:]"))
+ (not (looking-back "#{\\$" (- (point) 3))))))
+
+
+
+(defun perl6-smie--forward-token ()
+ (cond
+ ((and (eq (char-before) ?\})
+ (perl6-smie--not-interpolation-p)
+ ;; FIXME: If the next char is not whitespace, what should we do?
+ (or (memq (char-after) '(?\s ?\t ?\n))
+ (looking-at comment-start-skip)))
+ (if (memq (char-after) '(?\s ?\t ?\n))
+ (forward-char 1) (forward-comment 1))
+ ";")
+ ((progn (forward-comment (point-max))
+ (looking-at "[;,:]"))
+ (forward-char 1) (match-string 0))
+ (t (smie-default-forward-token))))
+
+(defun perl6-smie--backward-token ()
+ (let ((pos (point)))
+ (forward-comment (- (point)))
+ (cond
+ ;; FIXME: If the next char is not whitespace, what should we do?
+ ((and (eq (char-before) ?\}) (perl6-smie--not-interpolation-p)
+ (> pos (point))) ";")
+ ((memq (char-before) '(?\; ?\, ?\:))
+ (forward-char -1) (string (char-after)))
+ (t (smie-default-backward-token)))))
+
+(defun perl6-smie-rules (kind token)
+ (pcase (cons kind token)
+ (`(:elem . basic) perl6-indent-offset)
+ (`(:elem . arg) 0)
+ (`(:list-intro . ,(or `";" `"")) t) ;"" stands for BOB (bug#15467).
+ (`(:before . "{")
+ (when (smie-rule-hanging-p)
+ (smie-backward-sexp ";")
+ (smie-indent-virtual)))
+ (`(:before . ,(or "{" "("))
+ (if (smie-rule-hanging-p) (smie-rule-parent 0)))))
+
+(defcustom perl6-indent-offset 4
+ "Basic size of one indentation step."
+ :version "22.2"
+ :type 'integer)
+
+
;;;###autoload
(define-derived-mode perl6-mode prog-mode "Perl6"
"Major mode for editing Perl 6 code."
@@ -53,7 +112,12 @@
(setq-local comment-start "#")
(setq-local comment-start-skip "#+ *")
(setq-local comment-use-syntax t)
- (setq-local comment-end ""))
+ (setq-local comment-end "")
+ (smie-setup perl6-smie-grammar #'perl6-smie-rules
+ :forward-token #'perl6-smie--forward-token
+ :backward-token #'perl6-smie--backward-token)
+
+ )
(provide 'perl6-mode)
- [nongnu] elpa/raku-mode 8fd6683e06 041/253: defvar -> defconst, (continued)
- [nongnu] elpa/raku-mode 8fd6683e06 041/253: defvar -> defconst, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode c0978dcf65 054/253: Suggest (package-refresh-contents) since this package is new, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode 11891356c0 061/253: Highliht bare sigils, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode 04988356e8 065/253: Don't highlight type constraints inside strings/comments, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode af61f78377 011/253: Never look at more than 4k when detecting Perl 6, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode b111c81c75 031/253: Move set operator regex into perl6-rx, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode 1ef289eb4d 012/253: Consider 4096 be eof when looking for the next line, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode 2257deb15a 013/253: Simplify the magic matching logic, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode a94d11b812 017/253: Complete support for embedded/multiline comments, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode 29b821fc44 075/253: Rename function to be more descriptive, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode 0673f007b0 056/253: SMIE indenation ported from css-mode,
ELPA Syncer <=
- [nongnu] elpa/raku-mode 1ff189c6e7 060/253: TIL about `point-at-bol', ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode 3e55db2507 069/253: Avoid highlighting X::Foo as a metaoperator, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode ae9843c53e 121/253: Actually save the syntax context with the font lock hint, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode 8643c07c42 108/253: Improve highlighting of postfix hyper operators, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode 3cf99d162f 088/253: Treat backslashes outside strings as punctuation, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode 81c13d03ea 174/253: Be even more verbose, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode 8e7d64a73f 025/253: Apply 'syntax-multiline to the whole term, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode 3b781c2ded 042/253: Highlight version literals, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode bb7219afc4 043/253: Highlight autoquoted strings, ELPA Syncer, 2022/01/29
- [nongnu] elpa/raku-mode 98e3cbfabf 053/253: Always use a limit with `looking-back', ELPA Syncer, 2022/01/29