203 lines
9.7 KiB
EmacsLisp
203 lines
9.7 KiB
EmacsLisp
;;; clojure-mode-extra-font-locking.el --- Extra font-locking for Clojure mode
|
|
|
|
;; Copyright © 2014-2017 Bozhidar Batsov
|
|
;;
|
|
;; Author: Bozhidar Batsov <bozhidar@batsov.com>
|
|
;; URL: http://github.com/clojure-emacs/clojure-mode
|
|
;; Package-Version: 20170303.2310
|
|
;; Version: 3.0.0
|
|
;; Keywords: languages, lisp
|
|
;; Package-Requires: ((clojure-mode "3.0"))
|
|
|
|
;; This file is not part of GNU Emacs.
|
|
|
|
;;; Commentary:
|
|
|
|
;; Provides additional font-locking for clojure-mode.
|
|
|
|
;;; License:
|
|
|
|
;; This program 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.
|
|
;;
|
|
;; This program 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; see the file COPYING. If not, write to the
|
|
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
;; Boston, MA 02110-1301, USA.
|
|
|
|
;;; Code:
|
|
|
|
(require 'clojure-mode)
|
|
|
|
(defvar clojure-built-in-vars
|
|
'(;; clojure.core
|
|
"accessor" "aclone"
|
|
"agent" "agent-errors" "aget" "alength" "alias"
|
|
"all-ns" "alter" "alter-meta!" "alter-var-root" "amap"
|
|
"ancestors" "apply" "areduce" "array-map" "as->"
|
|
"aset" "aset-boolean" "aset-byte" "aset-char" "aset-double"
|
|
"aset-float" "aset-int" "aset-long" "aset-short" "assert"
|
|
"assoc" "assoc!" "assoc-in" "associative?" "atom"
|
|
"await" "await-for" "await1" "bases" "bean"
|
|
"bigdec" "bigint" "bit-and" "bit-and-not"
|
|
"bit-clear" "bit-flip" "bit-not" "bit-or" "bit-set"
|
|
"bit-shift-left" "bit-shift-right" "bit-test" "bit-xor" "boolean"
|
|
"boolean-array" "booleans" "bound-fn" "bound-fn*" "bound?" "butlast"
|
|
"byte" "byte-array" "bytes" "cast" "char"
|
|
"char-array" "char-escape-string" "char-name-string" "char?" "chars"
|
|
"chunk" "chunk-append" "chunk-buffer" "chunk-cons" "chunk-first"
|
|
"chunk-next" "chunk-rest" "chunked-seq?" "class" "class?"
|
|
"clear-agent-errors" "clojure-version" "coll?" "comment" "commute"
|
|
"comp" "comparator" "compare" "compare-and-set!" "compile"
|
|
"complement" "concat" "conj"
|
|
"conj!" "cons" "constantly" "construct-proxy" "contains?"
|
|
"count" "counted?" "create-ns" "create-struct" "cycle"
|
|
"dec" "decimal?" "delay" "delay?" "deliver" "denominator" "deref"
|
|
"derive" "descendants" "destructure" "disj" "disj!"
|
|
"dissoc" "dissoc!" "distinct" "distinct?"
|
|
"doc"
|
|
"double" "double-array" "doubles" "drop"
|
|
"drop-last" "drop-while" "empty" "empty?" "ensure"
|
|
"enumeration-seq" "error-handler" "error-mode" "eval" "even?" "every?"
|
|
"every-pred" "extend" "extend-protocol" "extend-type" "extends?"
|
|
"extenders" "ex-info" "ex-data"
|
|
"false?" "ffirst" "file-seq" "filter" "filterv" "find" "find-doc"
|
|
"find-ns" "find-keyword" "find-var" "first" "flatten" "float" "float-array"
|
|
"float?" "floats" "flush" "fn?"
|
|
"fnext" "force" "format" "frequencies" "future"
|
|
"future-call" "future-cancel" "future-cancelled?" "future-done?" "future?"
|
|
"gen-interface" "gensym" "get" "get-in"
|
|
"get-method" "get-proxy-class" "get-thread-bindings" "get-validator"
|
|
"group-by" "hash" "hash-map" "hash-ordered-coll" "hash-set"
|
|
"hash-unordered-coll" "identical?" "identity" "ifn?" "inc"
|
|
"init-proxy" "instance?" "int" "int-array" "integer?"
|
|
"interleave" "intern" "interpose" "into" "into-array"
|
|
"ints" "io!" "isa?" "iterate" "iterator-seq"
|
|
"juxt" "keep" "keep-indexed" "key" "keys" "keyword" "keyword?"
|
|
"last" "lazy-cat" "lazy-seq"
|
|
"line-seq" "list" "list*" "list?"
|
|
"load-file" "load-reader" "load-string" "loaded-libs" "locking"
|
|
"long" "long-array" "longs" "macroexpand"
|
|
"macroexpand-1" "make-array" "make-hierarchy" "map" "mapv" "map?"
|
|
"map-indexed" "mapcat" "max" "max-key" "memfn" "memoize"
|
|
"merge" "merge-with" "meta" "method-sig" "methods"
|
|
"min" "min-key" "mix-collection-hash" "mod" "name" "namespace"
|
|
"neg?" "newline" "next" "nfirst" "nil?"
|
|
"nnext" "not" "not-any?" "not-empty" "not-every?"
|
|
"not=" "ns-aliases" "ns-imports" "ns-interns"
|
|
"ns-map" "ns-name" "ns-publics" "ns-refers" "ns-resolve"
|
|
"ns-unalias" "ns-unmap" "nth" "nthnext" "nthrest" "num"
|
|
"number?" "numerator" "object-array" "odd?" "parents" "partial"
|
|
"partition" "partition-all" "partition-by" "pcalls" "peek" "persistent!"
|
|
"pmap" "pop" "pop!" "pop-thread-bindings" "pos?" "pr"
|
|
"pr-str" "prefer-method" "prefers" "primitives-classnames" "print"
|
|
"print-ctor" "print-doc" "print-dup" "print-method" "print-namespace-doc"
|
|
"print-simple" "print-special-doc" "print-str" "printf" "println"
|
|
"println-str" "prn" "prn-str" "promise" "proxy"
|
|
"proxy-call-with-super" "proxy-mappings" "proxy-name" "proxy-super"
|
|
"push-thread-bindings" "pvalues" "quot" "rand" "rand-int" "rand-nth" "range"
|
|
"ratio?" "rational?" "rationalize" "re-find" "re-groups"
|
|
"re-matcher" "re-matches" "re-pattern" "re-seq" "read"
|
|
"read-line" "read-string" "realized?" "record?" "reduce" "reduce-kv"
|
|
"reduced" "reduced?" "reductions" "reify" "ref" "ref-history-count"
|
|
"ref-max-history" "ref-min-history" "ref-set" "refer-clojure"
|
|
"release-pending-sends" "rem" "remove" "remove-all-methods"
|
|
"remove-method" "remove-ns" "remove-watch"
|
|
"repeat" "repeatedly" "replace" "replicate"
|
|
"require" "restart-agent" "reset!" "reset-meta!" "resolve" "rest"
|
|
"resultset-seq" "reverse" "reversible?" "rseq" "rsubseq"
|
|
"satisfies?" "second" "select-keys" "send" "send-off" "send-via" "seq"
|
|
"seq?" "seque" "sequence" "sequential?" "set"
|
|
"set-agent-send-executor!" "set-agent-send-off-executor!"
|
|
"set-error-handler!" "set-error-mode!" "set-validator!" "set?" "short"
|
|
"short-array" "shorts" "shuffle"
|
|
"shutdown-agents" "slurp" "some" "some->" "some->>" "some-fn" "some?"
|
|
"sort" "sort-by" "sorted-map" "sorted-map-by" "sorted-set" "sorted-set-by"
|
|
"sorted?" "special-form-anchor" "special-symbol?" "specify" "specify!"
|
|
"spit" "split-at" "split-with" "str"
|
|
"stream?" "string?" "struct" "struct-map" "subs"
|
|
"subseq" "subvec" "supers" "swap!" "symbol"
|
|
"symbol?" "sync" "syntax-symbol-anchor" "take" "take-last"
|
|
"take-nth" "take-while" "test" "the-ns" "thread-bound?" "time"
|
|
"to-array" "to-array-2d" "trampoline" "transient" "tree-seq"
|
|
"true?" "type" "unchecked-add" "unchecked-add-int" "unchecked-byte"
|
|
"unchecked-char" "unchecked-dec" "unchecked-dec-int" "unchecked-divide"
|
|
"unchecked-divide-int" "unchecked-double" "unchecked-float"
|
|
"unchecked-inc" "unchecked-inc-int" "unchecked-long" "unchecked-multiply"
|
|
"unchecked-multiply-int" "unchecked-negate" "unchecked-negate-int"
|
|
"unchecked-remainder" "unchecked-remainder-int" "unchecked-short"
|
|
"unchecked-subtract-int" "unchecked-subtract"
|
|
"underive" "unsigned-bit-shift-right" "unquote" "unquote-splicing"
|
|
"update" "update-in" "update-proxy" "use" "val" "vals" "var-get" "var-set"
|
|
"var?" "vary-meta" "vec" "vector" "vector?" "vector-of" "while"
|
|
"with-bindings" "with-bindings*" "with-in-str" "with-loading-context"
|
|
"with-meta" "with-out-str" "with-precision"
|
|
"xml-seq" "zero?" "zipmap"
|
|
;; clojure.inspector
|
|
"atom?" "collection-tag" "get-child" "get-child-count" "inspect"
|
|
"inspect-table" "inspect-tree" "is-leaf" "list-model" "list-provider"
|
|
;; clojure.main
|
|
"load-script" "main" "repl" "repl-caught" "repl-exception"
|
|
"repl-prompt" "repl-read" "skip-if-eol" "skip-whitespace" "with-bindings"
|
|
;; clojure.set
|
|
"difference" "index" "intersection" "join" "map-invert"
|
|
"project" "rename" "rename-keys" "select" "union"
|
|
;; clojure.stacktrace
|
|
"e" "print-cause-trace" "print-stack-trace" "print-throwable"
|
|
"print-trace-element"
|
|
;; clojure.template
|
|
"do-template" "apply-template"
|
|
;; clojure.test
|
|
"are" "assert-any" "assert-expr"
|
|
"assert-predicate" "compose-fixtures" "deftest" "deftest-" "file-position"
|
|
"function?" "get-possibly-unbound-var" "inc-report-counter" "is"
|
|
"join-fixtures" "report" "run-all-tests" "run-tests" "set-test"
|
|
"successful?" "test-all-vars" "test-ns" "test-var" "test-vars" "testing"
|
|
"testing-contexts-str" "testing-vars-str" "try-expr" "use-fixtures"
|
|
"with-test" "with-test-out"
|
|
;; clojure.walk
|
|
"keywordize-keys" "macroexpand-all" "postwalk" "postwalk-demo"
|
|
"postwalk-replace" "prewalk" "prewalk-demo" "prewalk-replace"
|
|
"stringify-keys" "walk"
|
|
;; clojure.xml
|
|
"attrs"
|
|
"content" "content-handler" "element" "emit" "emit-element"
|
|
;; clojure.zip
|
|
"append-child" "branch?" "children" "down" "edit"
|
|
"end?" "insert-child" "insert-left" "insert-right" "left"
|
|
"leftmost" "lefts" "make-node" "next" "node"
|
|
"path" "prev" "remove" "replace" "right"
|
|
"rightmost" "rights" "root" "seq-zip" "up"
|
|
))
|
|
|
|
(defvar clojure-built-in-dynamic-vars
|
|
'(;; clojure.test
|
|
"*initial-report-counters*" "*load-tests*" "*report-counters*"
|
|
"*stack-trace-depth*" "*test-out*" "*testing-contexts*" "*testing-vars*"
|
|
;; clojure.xml
|
|
"*current*" "*sb*" "*stack*" "*state*"
|
|
))
|
|
|
|
(font-lock-add-keywords 'clojure-mode
|
|
`((,(concat "(\\(?:\.*/\\)?"
|
|
(regexp-opt clojure-built-in-vars t)
|
|
"\\>")
|
|
1 font-lock-builtin-face)))
|
|
|
|
(font-lock-add-keywords 'clojure-mode
|
|
`((,(concat "\\<"
|
|
(regexp-opt clojure-built-in-dynamic-vars t)
|
|
"\\>")
|
|
0 font-lock-builtin-face)))
|
|
|
|
(provide 'clojure-mode-extra-font-locking)
|
|
|
|
;;; clojure-mode-extra-font-locking.el ends here
|