;; -*- coding: utf-8; lexical-binding: t; -*- ;; 2024-11-15 ;; dion-refactor-mode ;; I want the code in the EXECUTE block to be highlighted with Python mode syntax highlighting ;; file name: dion-test.refx ;; 2024-11-17 ;; ++PRAGMAS ;; --java-syntax ;; --variable-indent ;; --ignore-comments ;; --PRAGMAS ;; ++EXECUTE ;; import string ;; IS_CASE_START = lambda s: s in ("case ", "default") ;; IS_CASE_CLOSE = lambda s: is_case_start(s) or s=="}" ;; IS_STRING = lambda s: 2<=len(s) and s[0]+s[1] in ('""',"''") ;; IS_NUMBER = lambda s: s.replace('.','',1).isdigit() ;; IS_SYMBOL = lambda s: s[0] in string.ascii_letters+"_" and set(s[1:]) in set(string.ascii_letters+string.digits+"_") ;; IS_CASE_SPECIFIER = lambda s: any(IS_STRING(s), IS_NUMBER(s), IS_SYMBOL(s)) ;; --EXECUTE ;; ++PATTERN ;; case [$ case_specifier:IS_CASE_SPECIFIER $]: ;; [$ case_logic $] ;; break; ;; --PATTERN ;; ++REPLACE ;; case [$ case_specifier $] -> { ;; [$ case_logic $] ;; } ;; --REPLACE (require 'org-src) (defvar block-types nil "block type keywords") (setq block-types '("PRAGMAS" "REPLACE" "PATTERN" "EXECUTE")) (defvar refactor-fontlock nil "list for font-lock defaults") (setq refactor-fontlock (let (block-types-regex) ;; generate regex for each category of keywords (setq block-types-regex (regexp-opt block-types 'words)) (list (cons block-types-regex 'font-lock-type-face)))) (defun refactor-color-python-block () "color the region by python-mode color. Created: 2024-11-15" (interactive) (save-excursion (let (xbeg xend) (goto-char (point-min)) (when (and (setq xbeg (search-forward "++EXECUTE" nil t)) (setq xend (progn (search-forward "--EXECUTE" nil t) (line-beginning-position)))) (message "xbeg xend %s %s" xbeg xend) (org-src-font-lock-fontify-block "python" xbeg xend))))) (define-derived-mode dion-refactor-mode fundamental-mode "refactor" "major mode for editing refactor.py files." ;; (refactor-color-python-block) ;; (setq font-lock-defaults '(refactor-fontlock)) (refactor-color-python-block) ) (add-to-list 'auto-mode-alist '("\\.refx\\'" . dion-refactor-mode)) (provide 'dion-refactor-mode)