branch: elpa/forth-mode
commit c5e63e29f18cc642d263c9c41cbb85969e221f40
Author: Helmut Eller <[email protected]>
Commit: Lars Brinkhoff <[email protected]>
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)