diff options
| author | Jim Fehrle | 2019-06-01 01:43:09 -0700 |
|---|---|---|
| committer | Jim Fehrle | 2019-06-03 03:45:06 -0700 |
| commit | 7f1821cee8801a0f248aef492b9c1541e85a4880 (patch) | |
| tree | c9885900631fddc3fa1e2f78adfe9bfbce5b748b | |
| parent | 0afe38adf55608b26f04a77f312d4805ce568da6 (diff) | |
Process tags in the buffer rather than in strings
| -rw-r--r-- | coq/coq-diffs.el | 78 | ||||
| -rw-r--r-- | coq/coq.el | 6 | ||||
| -rw-r--r-- | generic/pg-response.el | 4 |
3 files changed, 47 insertions, 41 deletions
diff --git a/coq/coq-diffs.el b/coq/coq-diffs.el index 67d2fcc7..ff71634a 100644 --- a/coq/coq-diffs.el +++ b/coq/coq-diffs.el @@ -15,12 +15,15 @@ ;;; Code: -(defun coq-insert-with-face (str face) - (let ((start (point))) - (insert str) - (if face - ;; FIXME: Why not (put-text-property start (point) 'face face)? - (overlay-put (span-make start (point)) 'face face)))) +(defun coq-highlight-with-face (end face) + (if face + ;; (put-text-property (point) end 'face face) doesn't work + (overlay-put (span-make (point) end) 'face face)) + (goto-char end)) + +(defun coq-search (regex limit) + (save-excursion + (re-search-forward regex limit t))) (defun coq-insert-tagged-text (str) "Insert text into the current buffer applying faces specified by tags. @@ -37,37 +40,42 @@ and applies the appropriate face. ;; that looks like a tag. Unknown tags such as "<foo>" are ;; shown as-is. The user can turn off diffs in this very unlikely case. - (let* ((len (length str)) - (off 0) - (fstack) - (rhs)) - ;; FIXME: It would likely be better to insert `str' into the buffer - ;; and then work in the buffer instead of manipulating strings. - (while (< off len) - (string-match "^\\([ \t]*\\)\\(.*\n?\\)" str off) - (setq off (match-end 0)) - (insert (match-string 1 str)) ;; begin-line white space - (setq rhs (match-string 2 str)) - (string-match "[ \t\n]*\\'" rhs) - (let* ((end-white (match-string 0 rhs)) ;; end-line white space - (line (substring rhs 0 (- (length rhs) (length end-white)))) - (llen (length line)) - (loff 0)) - (while (and (< loff llen) - (string-match "<\\(/\\)?\\([a-zA-Z\\.]+\\)>" line loff)) - (let* ((end-mark (match-beginning 1)) - (tag (match-string 2 line)) - (face (cdr (assoc tag coq-tag-map))) - (start (match-beginning 0)) - (end (match-end 0))) - (coq-insert-with-face (substring line loff start) (car fstack)) - (setq loff end) + (let* ((fstack) + (start (point)) + (strend) + (lend) + (end-white-begin)) + (insert str) + (setq strend (copy-marker (point))) + (goto-char start) + (while (< (point) strend) + (coq-search "^\\([ \t]*\\).*\\(\n\\)?" strend) + (setq lend (copy-marker (match-end 0))) + (if (match-end 1) + (goto-char (match-end 1))) ;; begin-line white space + (let* ((nl (if (match-string 2) 1 0)) + (end-white-len ;; length of end-line white space + (if (coq-search "[ \t\n]*\\'" lend) + (- (match-end 0) (match-beginning 0)) + 0))) + (setq end-white-begin (copy-marker (- (- lend end-white-len) nl))) + + (while (and (< (point) lend) + (coq-search "<\\(/\\)?\\([a-zA-Z\\.]+\\)>" lend)) + (let* ((close-tag (match-beginning 1)) + (tag (match-string 2)) + (face (cdr (assoc tag coq-tag-map))) + (start (match-beginning 0)) + (end (match-end 0))) + (coq-highlight-with-face start (car fstack)) ;; text before tag (if face - (setq fstack (if end-mark (cdr fstack) (cons face fstack))) + (progn + (replace-match "") + (setq fstack (if close-tag (cdr fstack) (cons face fstack)))) ;; Unknown tag, show as-is! - (coq-insert-with-face (substring line start end) (car fstack))))) - (coq-insert-with-face (substring line loff) (car fstack)) - (insert end-white))))) ; end-line white space + (coq-highlight-with-face end (car fstack))))) + (coq-highlight-with-face end-white-begin (car fstack)) ;; text after last tag + (goto-char lend))))) ;; end-line white space (provide 'coq-diffs) @@ -58,10 +58,7 @@ (require 'coq-abbrev) ; abbrev and coq specific menu (require 'coq-seq-compile) ; sequential compilation of Requires (require 'coq-par-compile) ; parallel compilation of Requires - -;; set hook for diff highlighting routine from non-Coq code -(require 'coq-diffs) -(setq pg-insert-text-function 'coq-insert-tagged-text) +(require 'coq-diffs) ; highlight proof diffs (defvar prettify-symbols-alist) @@ -2086,6 +2083,7 @@ at `proof-assistant-settings-cmds' evaluation time.") (defun coq-diffs () "Return string for setting Coq Diffs. Return the empty string if the version of Coq < 8.10." + (setq pg-insert-text-function #'coq-insert-tagged-text) (if (coq--post-v810) (format "Set Diffs \"%s\". " (symbol-name coq-diffs)) "")) diff --git a/generic/pg-response.el b/generic/pg-response.el index 7f36fc6f..37f629af 100644 --- a/generic/pg-response.el +++ b/generic/pg-response.el @@ -31,8 +31,8 @@ (require 'pg-assoc) (require 'span) -;; hook for coq diffs highlighting routine -(defvar pg-insert-text-function 'insert) +(defvar pg-insert-text-function #'insert + "hook for coq diffs highlighting routine") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
