diff --git a/lisp/progmodes/scheme.el b/lisp/progmodes/scheme.el index 67abab6913d..d1980463859 100644 --- a/lisp/progmodes/scheme.el +++ b/lisp/progmodes/scheme.el @@ -414,7 +414,10 @@ scheme-syntax-propertize (syntax-propertize-rules ("\\(#\\);" (1 (prog1 "< cn" (scheme-syntax-propertize-sexp-comment (point) end))))) - (point) end)) + (point) end) + (scheme-syntax-propertize-regexp-1 end) + (scheme-syntax-propertize-regexp-2 end) + ) (defun scheme-syntax-propertize-sexp-comment (_ end) (let ((state (syntax-ppss))) @@ -430,6 +433,87 @@ scheme-syntax-propertize-sexp-comment 'syntax-table (string-to-syntax "> cn"))) (scan-error (goto-char end)))))) +(defun scheme-match-regexp-start (limit) + (re-search-forward + (rx + (or + bol + space + (in "[('") + ) + (group "#") + "/" + ) + limit + t + ) + ) + +(defun scheme-match-regexp-end (limit) + (re-search-forward + (rx + (group "/") + ) + limit + t + ) + ) + +(defun scheme-syntax-propertize-regexp-1 (end) + (while (scheme-match-regexp-start end) + (let* ((state (save-excursion + (syntax-ppss (match-beginning 1)))) + (within-str (nth 3 state)) + (within-comm (nth 4 state))) + (if (and (not within-comm) (not within-str)) + (progn + (put-text-property + (match-beginning 1) + (1+ (match-beginning 1)) + 'syntax-table (string-to-syntax "|")) + (let ((end-found nil)) + (while + (and + (not end-found) + (scheme-match-regexp-end end)) + (if + (not (char-equal + (char-before (match-beginning 1)) + ?\\ )) + (progn + (put-text-property + (match-beginning 1) + (1+ (match-beginning 1)) + 'syntax-table (string-to-syntax "|")) + (setq end-found t) + ))))))))) + +(defun scheme-syntax-propertize-regexp-2 (end) + (let ((end-found nil)) + (while (scheme-match-regexp-end end) + (let* ((state (save-excursion + (syntax-ppss (match-beginning 1)))) + (within-str (nth 3 state)) + (within-comm (nth 4 state)) + (start-delim-pos (nth 8 state))) + (if (and (not within-comm) + within-str + (string= + (buffer-substring-no-properties + start-delim-pos + (1+ start-delim-pos)) + "#") + (not (char-equal + (char-before (match-beginning 1)) + ?\\ ))) + (progn + (put-text-property + (match-beginning 1) + (1+ (match-beginning 1)) + 'syntax-table (string-to-syntax "|")) + (setq end-found t) + )))))) + ;;;###autoload (define-derived-mode dsssl-mode scheme-mode "DSSSL" "Major mode for editing DSSSL code.