Highlighting correctly in an emacs major mode

前端 未结 1 982
名媛妹妹
名媛妹妹 2021-02-15 15:42

I am developing an emacs major mode for a language (aka mydsl). However, using the techniques on xahlee\'s site doesn\'t seem to be working for some reason (possibly ol

相关标签:
1条回答
  • 2021-02-15 15:56

    You have a couple of syntactic problems in your code, but you got it nearly correct. Here's my edited version which appears to do the right thing for a buffer in mydsl-mode:

    ; No changes to the simple vars
    (defvar mydsl-events
      '("reservedword1"  
        "reservedword2"))
    
    (defvar mydsl-keywords
      '("other-keyword" "another-keyword"))
    
    ;; I'd probably put in a default that you want, as opposed to nil
    (defvar mydsl-tab-width nil "Width of a tab for MYDSL mode")
    
    ;; Two small edits.
    ;; First is to put an extra set of parens () around the list
    ;; which is the format that font-lock-defaults wants
    ;; Second, you used ' (quote) at the outermost level where you wanted ` (backquote)
    ;; you were very close
    (defvar mydsl-font-lock-defaults
      `((
         ;; stuff between "
         ("\"\\.\\*\\?" . font-lock-string-face)
         ;; ; : , ; { } =>  @ $ = are all special elements
         (":\\|,\\|;\\|{\\|}\\|=>\\|@\\|$\\|=" . font-lock-keyword-face)
         ( ,(regexp-opt mydsl-keywords 'words) . font-lock-builtin-face)
         ( ,(regexp-opt mydsl-events 'words) . font-lock-constant-face)
         )))
    
    (define-derived-mode mydsl-mode fundamental-mode "MYDSL script"
      "MYDSL mode is a major mode for editing MYDSL  files"
    
      ;; fundamental-mode kills all local variables, no need to do it again
      (setq mode-name "MYDSL script")
    
      ;; you again used quote when you had '((mydsl-hilite))
      ;; I just updated the variable to have the proper nesting (as noted above)
      ;; and use the value directly here
      (setq font-lock-defaults mydsl-font-lock-defaults)
    
      ;; when there's an override, use it
      ;; otherwise it gets the default value
      (when mydsl-tab-width
        (setq tab-width mydsl-tab-width))
    
      ;; for comments
      ;; overriding these vars gets you what (I think) you want
      ;; they're made buffer local when you set them
      (setq comment-start "#")
      (setq comment-end "")
    
      (modify-syntax-entry ?# "< b" mydsl-mode-syntax-table)
      (modify-syntax-entry ?\n "> b" mydsl-mode-syntax-table)
      ;;A gnu-correct program will have some sort of hook call here.
      )
    
    (provide 'mydsl-mode)
    
    0 讨论(0)
提交回复
热议问题