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

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

[nongnu] elpa/forth-mode c5e63e29f1 072/153: Basic indentation of contro


From: ELPA Syncer
Subject: [nongnu] elpa/forth-mode c5e63e29f1 072/153: Basic indentation of control structures
Date: Sat, 29 Jan 2022 08:02:18 -0500 (EST)

branch: elpa/forth-mode
commit c5e63e29f18cc642d263c9c41cbb85969e221f40
Author: Helmut Eller <eller.helmut@gmail.com>
Commit: Lars Brinkhoff <lars@nocrew.org>

    Basic indentation of control structures
---
 forth-mode.el |  2 ++
 forth-smie.el | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/forth-mode.el b/forth-mode.el
index 190ea925fd..abd8ace805 100644
--- a/forth-mode.el
+++ b/forth-mode.el
@@ -12,6 +12,7 @@
 ;;; Code:
 
 (require 'cl)
+(require 'forth-smie)
 
 (defvar forth-mode-map
   (let ((map (make-sparse-keymap)))
@@ -142,6 +143,7 @@
   (setq-local completion-at-point-functions '(forth-expand-symbol))
   (setq-local syntax-propertize-function #'forth--syntax-propertize)
   (setq-local parse-sexp-lookup-properties t)
+  (forth-smie-setup)
   (setq ;; font-lock-defaults
        comment-start-skip "\\((\\*?\\|\\\\\\) *"
        comment-start "("
diff --git a/forth-smie.el b/forth-smie.el
new file mode 100644
index 0000000000..20bf06cad8
--- /dev/null
+++ b/forth-smie.el
@@ -0,0 +1,34 @@
+;; SMIE based indentation
+
+(require 'smie)
+
+(defvar forth-smie--grammar
+  (smie-prec2->grammar
+   (smie-bnf->prec2
+    '((control
+       ("if" words "else" words "then")
+       ("if" words "then")
+       ("begin" words "while" words "repeat")
+       ("begin" words "until")
+       ("begin" words "again")
+       ("of" words "endof")
+       ("case" words "endcase")
+       ("?do" words "loop")
+       ("do" words "loop")
+       ("do" words "+loop")
+       ("begin-structure" words "end-structure")
+       ("{:" words ":}"))
+      (words)))))
+
+(defvar forth-smie--basic-indent 2)
+
+(defun forth-smie--indentation-rules (kind token)
+  (pcase (cons kind token)
+    (`(:elem . basic) forth-smie--basic-indent)
+    (`(:elem . args) 0)
+    (`(:list-intro . ,_) forth-smie--basic-indent)))
+
+(defun forth-smie-setup ()
+  (smie-setup forth-smie--grammar #'forth-smie--indentation-rules))
+
+(provide 'forth-smie)



reply via email to

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