branch: elpa/forth-mode
commit 67a9d94c18a9fa3e1d732653fa1d40cfe584d579
Author: Lars Brinkhoff <[email protected]>
Commit: Lars Brinkhoff <[email protected]>
Minor mode to display stack comments.
---
parse.el | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 56 insertions(+)
diff --git a/parse.el b/parse.el
new file mode 100644
index 0000000000..2082df6fd6
--- /dev/null
+++ b/parse.el
@@ -0,0 +1,56 @@
+(defvar forth-stack-comments (make-hash-table :test 'equal))
+
+(defun forth-parse-colon-definition ()
+ (forward-char)
+ (re-search-forward "[[:graph:]]")
+ (backward-char)
+ (let ((start (point)))
+ (re-search-forward "[^[:graph:]]")
+ (let ((name (buffer-substring start (1- (point)))))
+ (when (looking-at "(")
+ (forward-char 2)
+ (let ((start (point)))
+ (search-forward ")")
+ (setf (gethash name forth-stack-comments)
+ (buffer-substring start (1- (point)))))))))
+
+(defun forth-parse-definition ()
+ (cond ((looking-at ":") (forth-parse-colon-definition))
+ ((looking-at "create") t)
+ ((looking-at "variable") t)
+ ((looking-at "2variable") t)
+ ((looking-at "defer") t)
+ ((looking-at "code") t)))
+
+(defun forth-parse-buffer (&optional buffer)
+ (setq buffer (or buffer (current-buffer)))
+ (save-excursion
+ (beginning-of-buffer)
+ (end-of-defun)
+ (beginning-of-defun)
+ (while t
+ (forth-parse-definition)
+ (end-of-defun)
+ (end-of-defun)
+ (beginning-of-defun))))
+
+(defun forth-word-at-point ()
+ (if (looking-at "[^[:graph:]]")
+ nil
+ (save-excursion
+ (re-search-backward "[^[:graph:]]")
+ (forward-char)
+ (let ((start (point)))
+ (re-search-forward "[^[:graph:]]")
+ (buffer-substring start (1- (point)))))))
+
+(defun forth-stack-comment ()
+ (let ((word (forth-word-at-point)))
+ (when word
+ (let ((stack-comment (gethash word forth-stack-comments)))
+ (when stack-comment
+ (message "%s" stack-comment))))))
+
+(defun forth-stack-comments-mode ()
+ (interactive)
+ (add-hook 'post-command-hook 'forth-stack-comment nil t))