emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/raku-mode 95382a81fb 057/253: Merge pull request #1 from a


From: ELPA Syncer
Subject: [nongnu] elpa/raku-mode 95382a81fb 057/253: Merge pull request #1 from andreoss/indentation
Date: Sat, 29 Jan 2022 08:28:42 -0500 (EST)

branch: elpa/raku-mode
commit 95382a81fb611538ff17831faa83bfdf4b0169d8
Merge: 4917b2c270 0673f007b0
Author: Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
Commit: Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>

    Merge pull request #1 from andreoss/indentation
    
    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)
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]