summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS3
-rw-r--r--snakemake-mode.el52
2 files changed, 40 insertions, 15 deletions
diff --git a/NEWS b/NEWS
index bc2fc12..8b7e817 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,9 @@ NEWS -- history of user-visible changes -*- mode: org; -*-
- The 'multiext' built-in (new in Snakemake v5.8.2) is now recognized.
+- The font-lock handling has been updated to be compatible with
+ python.el changes in Emacs 27.
+
* v1.6.0
- Checkpoints (new in Snakemake v5.4) are now recognized.
diff --git a/snakemake-mode.el b/snakemake-mode.el
index e0299c2..255985c 100644
--- a/snakemake-mode.el
+++ b/snakemake-mode.el
@@ -431,20 +431,42 @@ embedded R, you need to set mmm-global-mode to a non-nil value such as 'maybe.")
;;; Mode
-(defvar snakemake-font-lock-keywords
- `((,snakemake-rule-or-subworkflow-re
- (1 font-lock-keyword-face nil 'lax)
- (2 font-lock-function-name-face nil 'lax)
- (3 font-lock-keyword-face nil 'lax))
- (,(snakemake-rx line-start (one-or-more space)
- (group field-key)
- (zero-or-more space) ":")
- 1 font-lock-type-face)
- (,(snakemake-rx line-start (zero-or-more space)
- (group sm-command)
- (zero-or-more space) ":")
- 1 font-lock-keyword-face)
- (,(snakemake-rx (group sm-builtin)) 1 font-lock-builtin-face)))
+(defvar snakemake--font-lock-keywords
+ `((,snakemake-rule-or-subworkflow-re
+ (1 font-lock-keyword-face nil 'lax)
+ (2 font-lock-function-name-face nil 'lax)
+ (3 font-lock-keyword-face nil 'lax))
+ (,(snakemake-rx line-start (one-or-more space)
+ (group field-key)
+ (zero-or-more space) ":")
+ 1 font-lock-type-face)
+ (,(snakemake-rx line-start (zero-or-more space)
+ (group sm-command)
+ (zero-or-more space) ":")
+ 1 font-lock-keyword-face)
+ (,(snakemake-rx (group sm-builtin)) 1 font-lock-builtin-face)))
+
+(if (bound-and-true-p python-font-lock-keywords-level-1)
+ (with-no-warnings
+ ;; In Emacs 27 `python-font-lock-keywords' was split up into
+ ;; different decoration levels.
+ (defvar snakemake-font-lock-keywords-level-1
+ (append snakemake--font-lock-keywords
+ python-font-lock-keywords-level-1))
+ (defvar snakemake-font-lock-keywords-level-2
+ (append snakemake--font-lock-keywords
+ python-font-lock-keywords-level-2))
+ (defvar snakemake-font-lock-keywords-maximum-decoration
+ (append snakemake--font-lock-keywords
+ python-font-lock-keywords-maximum-decoration))
+ (defvar snakemake-font-lock-keywords
+ ;; Mirrors `python-font-lock-keywords'.
+ '(snakemake-font-lock-keywords-level-1
+ snakemake-font-lock-keywords-level-1
+ snakemake-font-lock-keywords-level-2
+ snakemake-font-lock-keywords-maximum-decoration)))
+ (defvar snakemake-font-lock-keywords
+ (append snakemake--font-lock-keywords python-font-lock-keywords)))
;;;###autoload
(define-derived-mode snakemake-mode python-mode "Snakemake"
@@ -462,7 +484,7 @@ embedded R, you need to set mmm-global-mode to a non-nil value such as 'maybe.")
#'snakemake-block-or-defun-name)
(set (make-local-variable 'font-lock-defaults)
- `(,(append snakemake-font-lock-keywords python-font-lock-keywords))))
+ (cons snakemake-font-lock-keywords (cdr font-lock-defaults))))
;;;###autoload
(add-to-list 'auto-mode-alist '("Snakefile\\'" . snakemake-mode))