1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-05 11:45:45 +00:00

* lisp/progmodes/cl-font-lock.el: Fix header and make it a minor mode

Change copyright to FSF and licence to GPLv3+.
Tweak Commentary (the code doesn't seem to provide the lambda
prettification mentioned).

(cl-font-lock-add-regexes): Remove macro.
(cl-font-lock-built-in-keywords): New variable.
(cl-font-lock-built-in-mode): New minor mode.
This commit is contained in:
Stefan Monnier 2020-04-11 13:55:52 -04:00
parent 5084fdb83e
commit 38166443c0

View File

@ -1,52 +1,59 @@
;;; cl-font-lock.el --- Pretty Common Lisp font locking -*- lexical-binding: t; -*-
;; Copyright (C) 2019 Yue Daian
;; Author: Yue Daian
;; Copyright (C) 2019-2020 Free Software Foundation, Inc.
;; Author: Yue Daian <sheepduke@gmail.com>
;; Maintainer: Spenser Truex <web@spensertruex.com>
;; Created: 2019-06-16
;; Version: 0.3.0
;; Old-Version: 0.3.0
;; Package-Requires: ((emacs "24.5"))
;; Keywords: lisp wp files convenience
;; URL: https://github.com/cl-font-lock/cl-font-lock
;; Homepage: https://github.com/cl-font-lock/cl-font-lock
;; This file is not part of GNU Emacs, but you want to use GNU Emacs to run it.
;; This file is very free software.
;; This is free and unencumbered software released into the public domain.
;; This file is part of GNU Emacs
;; Anyone is free to copy, modify, publish, use, compile, sell, or
;; distribute this software, either in source code form or as a compiled
;; binary, for any purpose, commercial or non-commercial, and by any
;; means.
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; In jurisdictions that recognize copyright laws, the author or authors
;; of this software dedicate any and all copyright interest in the
;; software to the public domain. We make this dedication for the benefit
;; of the public at large and to the detriment of our heirs and
;; successors. We intend this dedication to be an overt act of
;; relinquishment in perpetuity of all present and future rights to this
;; software under copyright law.
;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
;; IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
;; OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
;; ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
;; OTHER DEALINGS IN THE SOFTWARE.
;; For more information, please refer to <http://unlicense.org/>.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; Highlight all the symbols in the Common Lisp ANSI Standard, and prettify
;; lambda to display the greek letter.
;;
;; Highlight all the symbols in the Common Lisp ANSI Standard.
;; Adds font-lock regexes to lisp-mode.
;;;; Todo:
;; - Integrate better into `lisp-mode' (e.g. enable it by default).
;; - Distinguish functions from macros like `pushnew'.
;;; Code:
(require 'cl-lib)
;; The list of built-in functions and variables was actually not
;; extracted from the standard, but from SBCL with the following
;; (Common Lisp) code:
;; (defvar *functions* nil)
;; (defvar *symbols* nil)
;; (defvar *types* nil)
;; (let ((pack (find-package :common-lisp)))
;; (do-all-symbols (sym)
;; (cond
;; ((not (eql pack (symbol-package sym))) nil)
;; ((fboundp sym) (pushnew sym *functions*))
;; ((find-class sym nil) (pushnew sym *types*))
;; (t (pushnew sym *symbols*)))))
(defvar cl-font-lock-built-in--functions
'("+" "-" "/" "/=" "<" "<=" "=" ">" ">=" "*" "1-" "1+" "abs" "acons" "acos"
"acosh" "add-method" "adjoin" "adjustable-array-p" "adjust-array"
@ -256,28 +263,26 @@
(defvar cl-font-lock--character-names
'("newline" "space" "rubout" "page" "tab" "backspace" "return" "linefeed"))
(defmacro cl-font-lock-add-regexes (fn mode &rest symbol-face)
"Expand to more than one call to font-lock.
Argument FN is the function used to send off the regex. Commonly
`font-lock-add-keywords' or `font-lock-remove-keywords'. Argument
MODE is the mode where the regexes are sent.
Optional argument SYMBOL-FACE dotted-pair of (regex-var . font-face)."
`(progn
,@(cl-loop for s in symbol-face
collect
`(,fn
',mode
`((,(regexp-opt ,(car s) 'symbols)
. ,(cdr ',s)))))))
(defvar cl-font-lock-built-in-keywords
(mapcar (lambda (s)
`(,(regexp-opt (symbol-value (car s)) 'symbols)
. ,(cdr s)))
'((cl-font-lock-built-in--functions . font-lock-function-name-face)
(cl-font-lock-built-in--variables . font-lock-variable-name-face)
(cl-font-lock-built-in--types . font-lock-type-face)
(cl-font-lock-built-in--symbols . font-lock-builtin-face)
(cl-font-lock--character-names . font-lock-variable-name-face))))
(cl-font-lock-add-regexes
font-lock-add-keywords
lisp-mode
(cl-font-lock-built-in--functions . font-lock-function-name-face)
(cl-font-lock-built-in--variables . font-lock-variable-name-face)
(cl-font-lock-built-in--types . font-lock-type-face)
(cl-font-lock-built-in--symbols . font-lock-builtin-face)
(cl-font-lock--character-names . font-lock-variable-name-face))
;;;###autoload
(define-minor-mode cl-font-lock-built-in-mode
"Highlight built-in functions, variables, and types in `lisp-mode'."
:global t
(funcall
(if cl-font-lock-built-in-mode
#'font-lock-add-keywords
#'font-lock-remove-keywords)
'lisp-mode
cl-font-lock-built-in-keywords))
(provide 'cl-font-lock)