[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/cobol-mode 7413c81 4/8: * cobol-mode/cobol-mode.el: Twe
From: |
Stefan Monnier |
Subject: |
[elpa] externals/cobol-mode 7413c81 4/8: * cobol-mode/cobol-mode.el: Tweak syntax-propertize and use cl-lib |
Date: |
Sat, 28 Nov 2020 00:16:40 -0500 (EST) |
branch: externals/cobol-mode
commit 7413c81e44c4774b9fd0d58d2272d21d6bbc46ef
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>
* cobol-mode/cobol-mode.el: Tweak syntax-propertize and use cl-lib
Use cl-lib instead of cl.
(cobol--fixed-format-p): Use memq.
(cobol--syntax-propertize-sequence-area): Rename to
cobol--font-lock-sequence-area, adjust for use in font-lock rather than
syntax-propertize. Fix docstring's use of "program name".
(cobol--syntax-propertize-indicator-area)
(cobol--syntax-propertize-program-name-area)
(cobol--syntax-propertize-page-directive): Turn into defconsts, using
syntax-propertize-precompile-rules.
(cobol--syntax-propertize-adjacent-quotes): Rewrite as a defconst using
syntax-propertize-precompile-rules. Use syntax-ppss i.s.o in-string-p.
(cobol--syntax-propertize-function): Use syntax-propertize-rule here so
that we perform a single traversal of the text.
(cobol-font-lock-defaults): Use cobol--font-lock-sequence-area.
(cobol--search-back): Adjust to cl-lib.
(cobol--no-instances-of): Let Elisp do most of the parsing.
---
cobol-mode.el | 172 +++++++++++++++++++++++++++++-----------------------------
1 file changed, 85 insertions(+), 87 deletions(-)
diff --git a/cobol-mode.el b/cobol-mode.el
index dd1a772..aed0370 100644
--- a/cobol-mode.el
+++ b/cobol-mode.el
@@ -7,6 +7,7 @@
;; Version: 1.0.0
;; Created: 9 November 2013
;; Keywords: languages
+;; Package-Requires: ((cl-lib "0.5"))
;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -40,11 +41,11 @@
;; To automatically load cobol-mode.el upon opening COBOL files, add this:
;; (setq auto-mode-alist
-;; (append
-;; '(("\\.cob\\'" . cobol-mode)
-;; ("\\.cbl\\'" . cobol-mode)
-;; ("\\.cpy\\'" . cobol-mode))
-;; auto-mode-alist))
+;; (append
+;; '(("\\.cob\\'" . cobol-mode)
+;; ("\\.cbl\\'" . cobol-mode)
+;; ("\\.cpy\\'" . cobol-mode))
+;; auto-mode-alist))
;; Finally, I strongly suggest installing auto-complete-mode, which makes
typing
;; long keywords and variable names a thing of the past. See
@@ -71,8 +72,7 @@
;;; Code:
-(eval-when-compile
- (require 'cl))
+(eval-when-compile (require 'cl-lib))
(defgroup cobol nil
"Major mode for editing COBOL code."
@@ -2261,8 +2261,7 @@ Note that this matches DECLARATIVES.")
(defun cobol--fixed-format-p ()
"Return whether the current source format is fixed."
- (or (eq cobol-source-format 'fixed-85)
- (eq cobol-source-format 'fixed-2002)))
+ (memq cobol-source-format '(fixed-85 'fixed-2002)))
;; This is required for indentation to function, because the initial sequence
;; area is marked as a comment, not whitespace.
@@ -2278,78 +2277,78 @@ Code copied from the Emacs source."
;; Move back over chars that have whitespace syntax but have the p flag.
(backward-prefix-chars))
-(defun cobol--syntax-propertize-sequence-area (beg end)
- "Mark text in the program name area as comments from the lines at/after BEG
up
-to END."
- (goto-char beg)
- (while (and (< (point) end)
- (re-search-forward "^.\\{1,6\\}" end t))
- (add-text-properties (line-beginning-position) (point)
- '(font-lock-face
- font-lock-comment-face))
- ;; Remove face from text previously in sequence area.
- (remove-text-properties (point) (line-end-position)
- '(font-lock-face nil))))
-
-(defun cobol--syntax-propertize-indicator-area (beg end)
- "Mark fixed-form comments as comments between points BEG and END."
- (funcall
- (syntax-propertize-rules
- (cobol--fixed-form-comment-re (1 "<"))
- (cobol--continuation-or-debugging-indicator-re (1 ".")))
- beg end))
-
-(defun cobol--syntax-propertize-program-name-area (beg end)
- "Mark text in the program name area as comments from the lines at/after BEG
up
-to END."
- (funcall
- (syntax-propertize-rules
- ;; TODO: Override open strings
- ("^.\\{72\\}\\(.\\)" (1 "<")))
- beg end))
-
-(defun cobol--syntax-propertize-page-directive (beg end)
- "Mark text after >>PAGE as a comment between points BEG and END."
- (funcall
- (syntax-propertize-rules
- ((cobol--with-opt-whitespace-line cobol--directive-indicator-re
- "PAGE\\([ ]\\)")
- (1 "<")))
- beg end))
+(defun cobol--font-lock-sequence-area (end)
+ "Mark text in the sequence area as comments from point up to END."
+ (when (cobol--fixed-format-p)
+ (while (and (< (point) end)
+ (re-search-forward "^.\\{1,6\\}" end t))
+ (put-text-property (match-beginning 0) (point)
+ 'face font-lock-comment-face)))
+ nil)
-(defun cobol--syntax-propertize-adjacent-quotes (beg end)
- "Mark the first of adjacent quotes, e.g. \"\" or '', as an escape character
-between points BEG and END."
- (goto-char beg)
- (while (and (< (point) end)
- (re-search-forward "\\(\"\"\\|''\\)" end t))
- ;; Move to first quote.
- (backward-char 2)
- (if (in-string-p) ;FIXME: Use (nth 3 (syntax-ppss))?
- (progn
- (put-text-property (point) (1+ (point))
- 'syntax-table (string-to-syntax "\\"))
- ;; Move back to past the escaped quotes.
- (forward-char 2))
- ;; If the first quote began a string, then the next quote may be the
- ;; first character in another escaped quote sequence.
- (forward-char 1))))
+(eval-when-compile
+ (defconst cobol--syntax-propertize-indicator-area
+ (syntax-propertize-precompile-rules
+ (cobol--fixed-form-comment-re (1 "<"))
+ (cobol--continuation-or-debugging-indicator-re (1 ".")))
+ "Syntax rules to mark fixed-form comments as comments.")
+
+ (defconst cobol--syntax-propertize-program-name-area
+ (syntax-propertize-precompile-rules
+ ;; TODO: Override open strings
+ ("^.\\{72\\}\\(.\\)" (1 "<")))
+ "Syntax rule to mark text in the program name area as comments.")
+
+ (defconst cobol--syntax-propertize-page-directive
+ (syntax-propertize-precompile-rules
+ ((cobol--with-opt-whitespace-line cobol--directive-indicator-re
+ "PAGE\\([ ]\\)")
+ (1 "<")))
+ "Syntax rule to mark text after >>PAGE as a comment.")
+
+ (defconst cobol--syntax-propertize-adjacent-quotes
+ (syntax-propertize-precompile-rules
+ ("\"\"\\|''"
+ (0 (ignore
+ ;; Move to first quote.
+ (backward-char 2)
+ (if (nth 3 (syntax-ppss))
+ (progn
+ (put-text-property (point) (1+ (point))
+ 'syntax-table (string-to-syntax "\\"))
+ ;; Move back to past the escaped quotes.
+ (forward-char 2))
+ ;; If the first quote began a string, then the next quote may be
the
+ ;; first character in another escaped quote sequence.
+ (forward-char 1))))))
+ "Syntax rule to mark the first of adjacent quotes, e.g. \"\" or '', as an
escape character."))
(defun cobol--syntax-propertize-function (beg end)
"Syntax propertize awkward COBOL features (fixed-form comments, indicators
and ignored areas) between points BEG and END."
;; TO-DO: Propertize continuation lines.
- (when (cobol--fixed-format-p)
- (cobol--syntax-propertize-sequence-area beg end)
- (cobol--syntax-propertize-indicator-area beg end))
- (when (eq cobol-source-format 'fixed-85)
- (cobol--syntax-propertize-program-name-area beg end))
- (cobol--syntax-propertize-page-directive beg end)
- (cobol--syntax-propertize-adjacent-quotes beg end))
-
-;; Chnage to defconst so it reloads on something?
+ (funcall
+ (pcase cobol-source-format
+ (`fixed-85 (syntax-propertize-rules
+ cobol--syntax-propertize-indicator-area
+ cobol--syntax-propertize-program-name-area
+ cobol--syntax-propertize-page-directive
+ cobol--syntax-propertize-adjacent-quotes))
+ (`fixed-2002 (syntax-propertize-rules
+ cobol--syntax-propertize-indicator-area
+ cobol--syntax-propertize-page-directive
+ cobol--syntax-propertize-adjacent-quotes))
+ (_ (syntax-propertize-rules
+ cobol--syntax-propertize-page-directive
+ cobol--syntax-propertize-adjacent-quotes)))
+ beg end))
+
+;; Change to defconst so it reloads on something?
(defvar cobol-font-lock-defaults
- `((;; Directives
+ `((;; Sequence area
+ (cobol--font-lock-sequence-area)
+
+ ;; Directives
( ,(concat cobol--directive-indicator-re
"\\(" (regexp-opt cobol-directives) "\\>\\)")
. font-lock-preprocessor-face)
@@ -2669,7 +2668,7 @@ sequence area."
"Go back a line at a time, calling FN each time.
If the car of the return value is non-nil, return the cdr."
(save-excursion
- (do ((ret nil (funcall fn)))
+ (cl-do ((ret nil (funcall fn)))
((car ret) (cdr ret))
(forward-line -1))))
@@ -2876,18 +2875,17 @@ lines."
(bobp))
(cons t nil)))))))
-(defmacro cobol--no-instances-of (&rest clauses)
- "CLAUSES must be in the form 're AFTER re-2 IN division' where AFTER and IN
-are symbols. Return whether there are no instances of things matched by re
-between point and the previous instance of re-2. Return nil if point is
-not in division or if nothing is found."
- (assert (and (eq (length clauses) 5)
- (eq (nth 1 clauses) 'after)
- (eq (nth 3 clauses) 'in))
- nil
- "Clauses should be in the form 're AFTER re-2 IN division'.")
- `(cobol--no-instances-of-after-in-division ,(first clauses) ,(nth 2 clauses)
- ,(nth 4 clauses)))
+(defmacro cobol--no-instances-of (re after re2 in division)
+ "Return non-nil if there are no instances of things matched by RE
+between point and the previous instance of RE2.
+Return nil if point is not in DIVISION or if nothing is found.
+Arguments must be in the form 'RE after RE2 in DIVISION' where
+`after' and `in' stand for themselves."
+ (cl-assert (and (eq after 'after)
+ (eq in 'in))
+ nil
+ "Clauses should be in the form 're AFTER re-2 IN division'.")
+ `(cobol--no-instances-of-after-in-division ,re ,re2 ,division))
(defun cobol--in-file-control-p ()
"Return whether point is in the FILE-CONTROL paragraph."
- [elpa] branch externals/cobol-mode created (now 5290d35), Stefan Monnier, 2020/11/28
- [elpa] externals/cobol-mode f6839ca 1/8: * packages/cobol-mode/cobol-mode.el: Fix copyright and maintainer, Stefan Monnier, 2020/11/28
- [elpa] externals/cobol-mode 3cc627e 5/8: * copyright_exceptions: Update for new uni-confusables/gen-confusables.el, Stefan Monnier, 2020/11/28
- [elpa] externals/cobol-mode 5290d35 8/8: * cobol-mode.el: Fix misrepresenting variable, Stefan Monnier, 2020/11/28
- [elpa] externals/cobol-mode 7413c81 4/8: * cobol-mode/cobol-mode.el: Tweak syntax-propertize and use cl-lib,
Stefan Monnier <=
- [elpa] externals/cobol-mode 1f5f80f 6/8: * cobol-mode.el (cobol--fixed-comment-indicators-re): Clarify regexp, Stefan Monnier, 2020/11/28
- [elpa] externals/cobol-mode f9718ac 2/8: * cobol-mode/cobol-mode.el: Fix compilation and heed the warnings, Stefan Monnier, 2020/11/28
- [elpa] externals/cobol-mode 56da646 3/8: * cobol-mode/cobol-mode.el: Misc tweaks; some from checkdoc, Stefan Monnier, 2020/11/28
- [elpa] externals/cobol-mode 7133670 7/8: * packages/cobol-mode/cobol-mode.el: Fix last change, Stefan Monnier, 2020/11/28