Производный режим sh-mode типа макропеременных

Я создаю основной режим для некоторых файлов, которые я постоянно использую на работе, и у меня возникают проблемы с отображением макросов в другом цвете. Проблема в том, что макросы встречаются в строках, и они выделяются как строки, хотя я установил символ $ в качестве символа выражения. то есть "$(macro1)" выделяется как строка, а не как макрос

Здесь я пытаюсь установить символ $ в качестве синтаксиса для выражения, а также сортировать синтаксис комментария, а также:

(defvar test-syntax-table nil)
(defvar my-highlights nil)
(setq test-syntax-table
  (let ((synTable (make-syntax-table)))
    ;; bash style comment: “# …”
    (modify-syntax-entry ?# "< b" synTable)
    (modify-syntax-entry ?\n "> b" synTable)
    (modify-syntax-entry ?$ "'" synTable)
    synTable))
(setq my-highlights
  '(("record" . font-lock-function-name-face)
    ("field" . font-lock-keyword-face)
    ("$" . font-lock-variable-name-face)))

Здесь я установил синтаксическую таблицу и основные моменты:

;;;###autoload
(define-derived-mode test-mode fundamental-mode
  (setq font-lock-defaults '(my-highlights))
  (set-syntax-table test-syntax-table)
  (setq comment-start "#")
  (visual-line-mode 0)
  (setq truncate-lines t)
  (setq mode-name "test"))

изменения:

(defvar test-mode-syntax-table nil)
 (defvar my-highlights nil)
 (setq test-mode-syntax-table
       (let ((synTable (make-syntax-table)))
         ;; bash style comment: “# …”                                                                                                                                                                             
        (modify-syntax-entry ?# "< b" synTable)
        (modify-syntax-entry ?\n "> b" synTable)
        (modify-syntax-entry ?$ "'" synTable)
        synTable))
(setq my-highlights
  '(
    ("record" . font-lock-function-name-face)
    ("field" . font-lock-keyword-face)
    ("\\$" . (0 font-lock-variable-name-face override))
    ))



;;;###autoload                                                                                                                                                                                                   
(define-derived-mode test-mode fundamental-mode "test"
  (setq font-lock-defaults '(my-highlights))                                                                                                                                                                       
  (setq comment-start "#")
  (visual-line-mode 0)
  (setq truncate-lines t))

1 ответ

Вы назвали свой производный режим (setq font-lock-defaults '(my-highlights)), Должен сказать, это довольно странный выбор.

Итак, попробуйте переименовать test-syntax-table в test-mode-syntax-table как задумал бог, тогда удали set-syntax-table вызов, так как переименование сделало его избыточным, затем удалите (setq mode-name "test") и добавить "test" между аргументом родительского режима и настройкой font-lock-defaults,

Тогда вы можете попытаться исправить $ выделение с помощью чего-то вроде ("\\$" (0 font-lock-variable-name-face override)) поскольку $ соответствует концу строки, а не $ символ, и поскольку по умолчанию грани применяются только в тех случаях, когда ранее не было применено ни одного другого лица (и лица строк / комментариев применяются первыми).

Другие вопросы по тегам