unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
From: "John Massingham" <johnm@tensilica.com>
Subject: How do I do syntax highlighting when writing a major mode
Date: Fri, 23 May 2003 16:04:33 +0100	[thread overview]
Message-ID: <006701c3213c$9f638640$050d10ac@johnm> (raw)


[-- Attachment #1.1: Type: text/plain, Size: 5101 bytes --]

Hi

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

iclass
reference
schedule
semantic

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?

cheers

John

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
      (append
       '(("\\.tie\\'" . tie-mode))
       auto-mode-alist))


;;
;; 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
  (list
   ;;'("^;.*$" . 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
   (list
    '("\\<\\(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
   (list

'("\\<\\(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."
  (interactive)
  (kill-all-local-variables)
  (make-local-variable 'font-lock-defaults)
  (setq font-lock-defaults
 '(tie-font-lock-keywords))

  (setq major-mode 'tie-mode)
  (setq mode-name "Tie")
  (run-hooks 'tie-mode-hooks))

(provide 'tie-mode)



[-- Attachment #1.2: Type: text/html, Size: 12472 bytes --]

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: John W Massingham (E-mail).vcf --]
[-- Type: text/x-vcard; name="John W Massingham (E-mail).vcf", Size: 497 bytes --]

BEGIN:VCARD
VERSION:2.1
N:Massingham;John
FN:John W Massingham (E-mail)
ORG:Tensilica
TITLE:European FAE
TEL;WORK;VOICE:+44 (0) 1844 355612
TEL;CELL;VOICE:+44 (0) 7748 938303
ADR;WORK;ENCODING=QUOTED-PRINTABLE:;;Sanderum House=0D=0AOakley Road;Chinnor;Oxfordshire;OX9 4TW;United Kingdom
LABEL;WORK;ENCODING=QUOTED-PRINTABLE:Sanderum House=0D=0AOakley Road=0D=0AChinnor, Oxfordshire OX9 4TW=0D=0AUnite=
d Kingdom
EMAIL;PREF;INTERNET:johnm@tensilica.com
REV:20000904T084229Z
END:VCARD

[-- Attachment #3: Type: text/plain, Size: 151 bytes --]

_______________________________________________
Help-gnu-emacs mailing list
Help-gnu-emacs@gnu.org
http://mail.gnu.org/mailman/listinfo/help-gnu-emacs

             reply	other threads:[~2003-05-23 15:04 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-05-23 15:04 John Massingham [this message]
     [not found] <mailman.6644.1053703895.21513.help-gnu-emacs@gnu.org>
2003-05-23 17:07 ` How do I do syntax highlighting when writing a major mode Oliver Scholz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='006701c3213c$9f638640$050d10ac@johnm' \
    --to=johnm@tensilica.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).