Function: prolog-font-lock-keywords
prolog-font-lock-keywords is a byte-compiled function defined in
prolog.el.gz.
Signature
(prolog-font-lock-keywords)
Documentation
Set up font lock keywords for the current Prolog system.
Probably introduced at or before Emacs version 22.1.
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/prolog.el.gz
;; Set everything up
(defun prolog-font-lock-keywords ()
"Set up font lock keywords for the current Prolog system."
;; Define Prolog faces
(defface prolog-redo-face
'((((class grayscale)) (:slant italic))
(((class color)) (:foreground "darkorchid"))
(t (:slant italic)))
"Prolog mode face for highlighting redo trace lines."
:group 'prolog-faces)
(defface prolog-exit-face
'((((class grayscale)) (:underline t))
(((class color) (background dark)) (:foreground "green"))
(((class color) (background light)) (:foreground "ForestGreen"))
(t (:underline t)))
"Prolog mode face for highlighting exit trace lines."
:group 'prolog-faces)
(defface prolog-exception-face
'((((class grayscale)) (:weight bold :slant italic :underline t))
(((class color)) (:weight bold :foreground "black" :background "Khaki"))
(t (:weight bold :slant italic :underline t)))
"Prolog mode face for highlighting exception trace lines."
:group 'prolog-faces)
(defface prolog-warning-face
'((((class grayscale)) (:underline t))
(((class color) (background dark)) (:foreground "blue"))
(((class color) (background light)) (:foreground "MidnightBlue"))
(t (:underline t)))
"Face name to use for compiler warnings."
:group 'prolog-faces)
(define-obsolete-face-alias 'prolog-warning-face
'font-lock-warning-face "28.1")
(defface prolog-builtin-face
'((((class color) (background light)) (:foreground "Purple"))
(((class color) (background dark)) (:foreground "Cyan"))
(((class grayscale) (background light))
:foreground "LightGray" :weight bold)
(((class grayscale) (background dark)) (:foreground "DimGray" :weight bold))
(t (:weight bold)))
"Face name to use for compiler warnings."
:group 'prolog-faces)
(define-obsolete-face-alias 'prolog-builtin-face
'font-lock-builtin-face "28.1")
(defvar prolog-warning-face 'font-lock-warning-face
"Face name to use for built in predicates.")
(defvar prolog-builtin-face 'font-lock-builtin-face
"Face name to use for built in predicates.")
(defvar prolog-redo-face 'prolog-redo-face
"Face name to use for redo trace lines.")
(defvar prolog-exit-face 'prolog-exit-face
"Face name to use for exit trace lines.")
(defvar prolog-exception-face 'prolog-exception-face
"Face name to use for exception trace lines.")
;; Font Lock Patterns
(let (
;; "Native" Prolog patterns
(head-predicates
(list (format "^\\(%s\\)\\((\\|[ \t]*:-\\)" prolog-atom-regexp)
1 'font-lock-function-name-face))
;(list (format "^%s" prolog-atom-regexp)
; 0 font-lock-function-name-face))
(head-predicates-1
(list (format "\\.[ \t]*\\(%s\\)" prolog-atom-regexp)
1 'font-lock-function-name-face))
(variables
'("\\<\\([_A-Z][a-zA-Z0-9_]*\\)"
1 font-lock-variable-name-face))
(important-elements
(list (if (eq prolog-system 'mercury)
"[][}{;|]\\|\\\\[+=]\\|<?=>?"
"[][}{!;|]\\|\\*->")
0 'font-lock-keyword-face))
(important-elements-1
'("[^-*]\\(->\\)" 1 font-lock-keyword-face))
(predspecs ; module:predicate/cardinality
(list (format "\\<\\(%s:\\|\\)%s/[0-9]+"
prolog-atom-regexp prolog-atom-regexp)
0 'font-lock-function-name-face 'prepend))
(keywords ; directives (queries)
(list
(if (eq prolog-system 'mercury)
(concat
"\\<\\("
(regexp-opt prolog-keywords-i)
"\\|"
(regexp-opt
prolog-determinism-specificators-i)
"\\)\\>")
(concat
"^[?:]- *\\("
(regexp-opt prolog-keywords-i)
"\\)\\>"))
1 prolog-builtin-face))
;; SICStus specific patterns
(sicstus-object-methods
(if (eq prolog-system 'sicstus)
'(prolog-font-lock-object-matcher
1 font-lock-function-name-face)))
;; Mercury specific patterns
(types
(if (eq prolog-system 'mercury)
(list
(regexp-opt prolog-types-i 'words)
0 'font-lock-type-face)))
(modes
(if (eq prolog-system 'mercury)
(list
(regexp-opt prolog-mode-specificators-i 'words)
0 'font-lock-constant-face)))
(directives
(if (eq prolog-system 'mercury)
(list
(regexp-opt prolog-directives-i 'words)
0 'prolog-warning-face)))
;; Inferior mode specific patterns
(prompt
;; FIXME: Should be handled by comint already.
(list (prolog-prompt-regexp) 0 'font-lock-keyword-face))
(trace-exit
;; FIXME: Add to compilation-error-regexp-alist instead.
(cond
((eq prolog-system 'sicstus)
'("[ \t]*[0-9]+[ \t]+[0-9]+[ \t]*\\(Exit\\):"
1 prolog-exit-face))
((eq prolog-system 'swi)
'("[ \t]*\\(Exit\\):[ \t]*([ \t0-9]*)" 1 prolog-exit-face))
(t nil)))
(trace-fail
;; FIXME: Add to compilation-error-regexp-alist instead.
(cond
((eq prolog-system 'sicstus)
'("[ \t]*[0-9]+[ \t]+[0-9]+[ \t]*\\(Fail\\):"
1 prolog-warning-face))
((eq prolog-system 'swi)
'("[ \t]*\\(Fail\\):[ \t]*([ \t0-9]*)" 1 prolog-warning-face))
(t nil)))
(trace-redo
;; FIXME: Add to compilation-error-regexp-alist instead.
(cond
((eq prolog-system 'sicstus)
'("[ \t]*[0-9]+[ \t]+[0-9]+[ \t]*\\(Redo\\):"
1 prolog-redo-face))
((eq prolog-system 'swi)
'("[ \t]*\\(Redo\\):[ \t]*([ \t0-9]*)" 1 prolog-redo-face))
(t nil)))
(trace-call
;; FIXME: Add to compilation-error-regexp-alist instead.
(cond
((eq prolog-system 'sicstus)
'("[ \t]*[0-9]+[ \t]+[0-9]+[ \t]*\\(Call\\):"
1 font-lock-function-name-face))
((eq prolog-system 'swi)
'("[ \t]*\\(Call\\):[ \t]*([ \t0-9]*)"
1 font-lock-function-name-face))
(t nil)))
(trace-exception
;; FIXME: Add to compilation-error-regexp-alist instead.
(cond
((eq prolog-system 'sicstus)
'("[ \t]*[0-9]+[ \t]+[0-9]+[ \t]*\\(Exception\\):"
1 prolog-exception-face))
((eq prolog-system 'swi)
'("[ \t]*\\(Exception\\):[ \t]*([ \t0-9]*)"
1 prolog-exception-face))
(t nil)))
(error-message-identifier
;; FIXME: Add to compilation-error-regexp-alist instead.
(cond
((eq prolog-system 'sicstus)
'("{\\([A-Z]* ?ERROR:\\)" 1 prolog-exception-face prepend))
((eq prolog-system 'swi)
'("^[[]\\(WARNING:\\)" 1 prolog-builtin-face prepend))
(t nil)))
(error-whole-messages
;; FIXME: Add to compilation-error-regexp-alist instead.
(cond
((eq prolog-system 'sicstus)
'("{\\([A-Z]* ?ERROR:.*\\)}[ \t]*$"
1 font-lock-comment-face append))
((eq prolog-system 'swi)
'("^[[]WARNING:[^]]*[]]$" 0 font-lock-comment-face append))
(t nil)))
(error-warning-messages
;; FIXME: Add to compilation-error-regexp-alist instead.
;; Mostly errors that SICStus asks the user about how to solve,
;; such as "NAME CLASH:" for example.
(cond
((eq prolog-system 'sicstus)
'("^[A-Z ]*[A-Z]+:" 0 prolog-warning-face))
(t nil)))
(warning-messages
;; FIXME: Add to compilation-error-regexp-alist instead.
(cond
((eq prolog-system 'sicstus)
'("\\({ ?\\(Warning\\|WARNING\\) ?:.*}\\)[ \t]*$"
2 prolog-warning-face prepend))
(t nil))))
;; Make font lock list
(delq
nil
(cond
((derived-mode-p 'prolog-mode)
(list
head-predicates
head-predicates-1
variables
important-elements
important-elements-1
predspecs
keywords
sicstus-object-methods
types
modes
directives))
((eq major-mode 'prolog-inferior-mode)
(list
prompt
error-message-identifier
error-whole-messages
error-warning-messages
warning-messages
predspecs
trace-exit
trace-fail
trace-redo
trace-call
trace-exception))
((eq major-mode 'compilation-mode)
(list
error-message-identifier
error-whole-messages
error-warning-messages
warning-messages
predspecs))))
))