branch: elpa/forth-mode
commit 3fa933d556d7b09f5940af9b66724581b4ce6acd
Author: Helmut Eller <[email protected]>
Commit: Helmut Eller <[email protected]>
Test comment-region
* forth-mode.el (forth-comment-region): New. Use \ for commenting
regions. ( also worked, but it seems nicer to \ for "block comments"
and ( ) for stack comments.
(forth-mode-syntax-table): Change syntax table again so that comments
work a bit better in Emacs23.
(forth-mode): Setup comment-region-function.
Also fix comment-start-skip. (Allthough it's not clear why
we need to set this at all.)
* test/tests.el (forth-comment-dwim): Add tests with active region.
(forth-should-region-before/after): New helper.
(forth-paren-comment-font-lock): Fixing comment-start-skip changed
the faces back again.
* forth-syntax.el (forth-syntax--parse-comment): Use "!" (i.e. generic
comment) here so that the syntax table can use "<" and ">".
---
forth-mode.el | 16 +++++++++++-----
forth-syntax.el | 4 ++--
test/tests.el | 45 +++++++++++++++++++++++++++++++++++++++++----
3 files changed, 54 insertions(+), 11 deletions(-)
diff --git a/forth-mode.el b/forth-mode.el
index 82e98f2035..0799f96b79 100644
--- a/forth-mode.el
+++ b/forth-mode.el
@@ -40,9 +40,9 @@
(defvar forth-mode-syntax-table
(let ((table (make-syntax-table)))
(modify-syntax-entry ?\\ "<" table)
- (modify-syntax-entry ?\n " " table)
- (modify-syntax-entry ?\( "!" table)
- (modify-syntax-entry ?\) "_" table)
+ (modify-syntax-entry ?\n ">" table)
+ (modify-syntax-entry ?\( "<1b" table)
+ (modify-syntax-entry ?\) ">4b" table)
(modify-syntax-entry ?* "_23n" table)
(modify-syntax-entry ?\{ "_" table)
(modify-syntax-entry ?\} "_" table)
@@ -112,10 +112,15 @@
(defun forth-fill-paragraph (&rest args)
(let ((fill-paragraph-function nil)
(fill-paragraph-handle-comment t)
- (comment-start "\ ")
+ (comment-start "\\ ")
(comment-end ""))
(apply #'fill-paragraph args)))
+(defun forth-comment-region (&rest args)
+ (let ((comment-start "\\ ")
+ (comment-end ""))
+ (apply #'comment-region-default args)))
+
(defun forth-beginning-of-defun (arg)
(and (re-search-backward "^\\s *: \\_<" nil t (or arg 1))
(beginning-of-line)))
@@ -141,9 +146,10 @@
(forth-smie-setup)
(setq-local fill-paragraph-function #'forth-fill-paragraph)
(setq-local beginning-of-defun-function #'forth-beginning-of-defun)
- (setq-local comment-start-skip "\\(?:(\\*\\|\\\\\\) *")
+ (setq-local comment-start-skip "\\(?:([*]?\\|\\\\\\) *")
(setq-local comment-start "(")
(setq-local comment-end ")")
+ (setq-local comment-region-function #'forth-comment-region)
(setq imenu-generic-expression
'(("Words"
"^\\s-*\\(:\\|code\\|defer\\)\\s-+\\(\\(\\sw\\|\\s_\\)+\\)" 2)
diff --git a/forth-syntax.el b/forth-syntax.el
index d88068ec93..f77ca819dc 100644
--- a/forth-syntax.el
+++ b/forth-syntax.el
@@ -139,10 +139,10 @@ SYNTAX must be a valid argument for `string-to-syntax'."
(defun forth-syntax--parse-comment (backward-regexp forward-regexp)
(let ((pos (point)))
(re-search-backward backward-regexp)
- (forth-syntax--set-syntax (point) (1+ (point)) "<")
+ (forth-syntax--set-syntax (point) (1+ (point)) "!")
(goto-char pos)
(cond ((re-search-forward forward-regexp nil t)
- (forth-syntax--set-syntax (1- (point)) (point) ">")
+ (forth-syntax--set-syntax (1- (point)) (point) "!")
#'forth-syntax--state-normal)
(t
(goto-char (point-max))
diff --git a/test/tests.el b/test/tests.el
index 0b6015e7da..db6b49638e 100644
--- a/test/tests.el
+++ b/test/tests.el
@@ -88,13 +88,24 @@ The whitespace before and including \"|\" on each line is
removed."
(should (string= after (substring-no-properties (buffer-string))))
(should (= (point) point-after))))))
+(defun forth-should-region-before/after (before after fun)
+ (destructuring-bind (before start1 end1) (forth-strip-|-and-¹² before)
+ (destructuring-bind (after point-after) (forth-strip-|-and-→ after)
+ (forth-with-temp-buffer before
+ (set-mark start1)
+ (goto-char end1)
+ (activate-mark)
+ (funcall fun)
+ (should (string= after (substring-no-properties (buffer-string))))
+ (should (= (point) point-after))))))
+
(ert-deftest forth-paren-comment-font-lock ()
- (forth-assert-face "→( )" font-lock-comment-face)
+ (forth-assert-face "→( )" font-lock-comment-delimiter-face)
(forth-assert-face "→.( )" font-lock-comment-face)
(forth-assert-face "( →)" font-lock-comment-delimiter-face)
- (forth-assert-face " →( )" font-lock-comment-face)
- (forth-assert-face "\t→( )" font-lock-comment-face)
- (forth-assert-face "→(\t)" font-lock-comment-face)
+ (forth-assert-face " →( )" font-lock-comment-delimiter-face)
+ (forth-assert-face "\t→( )" font-lock-comment-delimiter-face)
+ (forth-assert-face "→(\t)" font-lock-comment-delimiter-face)
(forth-assert-face "(fo→o) " nil)
(forth-assert-face "(fo→o)" nil)
(forth-assert-face "(→) " nil)
@@ -279,5 +290,31 @@ The whitespace before and including \"|\" on each line is
removed."
| begin ( x y )
| swap (→)
| again ;"
+ (lambda ()
+ (call-interactively #'comment-dwim)))
+ (forth-should-region-before/after
+ "²: frob
+ | begin ( x y )
+ | swap
+ | again ;
+ |¹"
+ "→\\ : frob
+ |\\ begin ( x y )
+ |\\ swap
+ |\\ again ;
+ |"
+ (lambda ()
+ (call-interactively #'comment-dwim)))
+ (forth-should-region-before/after
+ "¹\\ : frob
+ |\\ begin ( x y )
+ |\\ swap
+ |\\ again ;
+ |²"
+ ": frob
+ | begin ( x y )
+ | swap
+ | again ;
+ |→"
(lambda ()
(call-interactively #'comment-dwim))))