[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

How do I do syntax highlighting when writing a major mode

From: John Massingham
Subject: How do I do syntax highlighting when writing a major mode
Date: Fri, 23 May 2003 16:04:33 +0100

If I am going to be flamed please do it quickly....
I am trying to write my own major mode and pretty much the most important thing at the moment is syntax highlighting, I will get round to indentation later...
I have set up some key words to parse on and they get set in their given colours but I want to have the equivilent to the C mode whereby
int abc;
the "int" gets the font-lock-keyword-face and the "abc" gets the font-lock-variable-name-face
I have a number of key words (equivilent to int / char / etc) and it is quite a limited list
These I can search for and set in the keyword face but I am unsure how to find the second word, whatever it may be, and I obviously dont want to highlight every second word!!
I dont know lisp, I am just hacking about, looking at various modes, perl, make, etc and cutting and pasting untill it seems to work! However I suspec a syntax table or something has to be built up but with my lack of lisp knowledge I cant follow whats actually going on
can anyone help?
PS. Dont laugh, but here is a copy what I have done so far
;; Here we define some variables that all major modes should define
(defvar tie-mode-hook nil)
(defvar tie-mode-map  nil
  "Keymap for TIE major mode")

;; Here we're defining a default keymap if the user doesn't already have one
(if tie-mode-map nil
  (setq tie-mode-map (make-keymap)))

;; Here, we append a definition to auto-mode-alist.
;; This tells emacs that when a buffer with a name ending with .tie is opened,
;; then tie-mode should be started in that buffer
(setq auto-mode-alist
\\.tie\\'" . tie-mode))

;; Here we have defined our minimal set of keywords for emacs to highlight
;; TIE keywords...
;; coprocessor ctype field iclass interface opcode operand proto reference regfile
;; schedule semantic state table user_register
;; Because font-lock is so resource-intensive, providing optimized regexps to
;; font-lock should provide a boost in performance. Not done here as it is still in the
;; "get it working phase!"
(defconst tie-font-lock-keywords-1
   ;;'("^;.*$" . font-lock-preprocessor-face)
   '("^//.*$" . font-lock-comment-face)
   '("[^$]//.*$" . font-lock-comment-face)
\\<\\(coprocessor\\|ctype\\|def\\|field\\|interface\\|opcode\\|operand\\|proto\\|regfile\\|state\\|table\\|use\\|user_register\\)\\>" . font-lock-keyword-face)
\\<\\(iclass\\|reference\\|schedule\\|semantic\\)\\>" . font-lock-preprocessor-face)
\\|state\\)[_A-Za-z0-9]*" . font-lock-function-name-face)  ;; PUTS EVERYTHING IN BLUE
\\(state\\|opcode\\)\\b[_A-Za-z0-9]+\\b" . font-lock-function-name-face)
   ;;'("state\b[_A-Za-z0-9]*\b" . font-lock-function-name-face)
   ;;'("state[\t\s\w]*[_A-Za-z0-9]+" . font-lock-function-name-face)
   ;;'("state [_A-Za-z0-9]+" . font-lock-function-name-face)
\\(state\\)[_A-Za-z0-9]+[ \t]*\+?=" . font-lock-function-name-face)
\\|state\\)[_A-Za-z0-9]+\?\\sw+\\" . font-lock-function-name-face)
  "Minimal highlighting expressions for TIE mode")
;; Now I've defined the second level of highlighting. Note that the second level is appended to the first level,
;; resulting in a single keyword variable that matches everything in both levels.
;; More TIE key words
;; assign in inout out wire
;; TIEadd TIEaddn TIEcmp TIEcsa TIEmac TIEmul TIEmulpp TIEmux TIEpsel TIEsel
(defconst tie-font-lock-keywords-2
  (append tie-font-lock-keywords-1
\\<\\(assign\\|in\\|inout\\|out\\|wire\\)\\>" . font-lock-type-face)
\\<\\(TIE\\(add\\|addn\\|cmp\\|csa\\|mac\\|mul\\|mulpp\\|mux\\|psel\\|sel\\)\\)\\>" . font-lock-string-face)
  "Additional Keywords to highlight in TIE mode")

;; I've now defined more TIE constants. This completes the list of TIE keywords.
;; Even more TIE key words
;; VAddr MemDataIn8 MemDataIn16 MemDataIn32 MemDataIn64 MemDataIn128
;; MemDataOut8 MemDataOut16 MemDataOut32 MemDataOut64 MemDataOut128
;; LoadByteDisable StoreByteDisable
(defconst tie-font-lock-keywords-3
  (append tie-font-lock-keywords-2
\\<\\(VAddr\\|MemDataIn\\(8\\|16\\|32\\|64\\|128\\)\\|MemDataOut\\(8\\|16\\|32\\|64\\|128\\)\\|LoadByteDisable\\|StoreByteDisable\\)\\>" . font-lock-variable-name-face)
  "All-out highlighting in TIE mode")

;; Here I've defined the default level of highlighting to be the maximum which is my preference - and it is my mode!!
(defvar tie-font-lock-keywords tie-font-lock-keywords-3
  "Default highlighting expressions for TIE mode")

(defconst tie-comment-start-regexp "//\\|/\\*"
  "Dual comment value for `comment-start-regexp'.")
;; And now to launch the major mode....
(defun tie-mode ()
  "Major mode for editing TIE files."
  (make-local-variable 'font-lock-defaults)
  (setq font-lock-defaults
  (setq major-mode 'tie-mode)
  (setq mode-name "Tie")
  (run-hooks 'tie-mode-hooks))
(provide 'tie-mode)

Attachment: John W Massingham (E-mail).vcf
Description: Vcard

reply via email to

[Prev in Thread] Current Thread [Next in Thread]