Convert symbol prettification into minor mode and global minor mode.
* etc/NEWS: Document new Prettify Symbols mode. * lisp/progmodes/prog-mode.el (prettify-symbols-alist): Rename from `prog-prettify-symbols', and make a local defvar instead of defcustom. (prettify-symbols--keywords): Rename from `prog-prettify-symbols-alist' and make a local defvar. (prettify-symbols--compose-symbol): Rename from `prog--prettify-font-lock-compose-symbol'. (prettify-symbols--make-keywords): Rename from `prog-prettify-font-lock-symbols-keywords' and simplify. (prog-prettify-install): Remove. (prettify-symbols-mode): New minor mode, based on `prog-prettify-install'. (turn-on-prettify-symbols-mode): New function. (global-prettify-symbols-mode): New globalized minor mode. * lisp/emacs-lisp/lisp-mode.el (lisp-mode-variables): * lisp/progmodes/cfengine.el (cfengine3-mode): * lisp/progmodes/perl-mode.el (perl-mode): Don't call `prog-prettify-install'; set `prettify-symbols-alist' instead.
This commit is contained in:
parent
ec9295aeaa
commit
14dd22d2ce
7 changed files with 92 additions and 40 deletions
|
@ -1,3 +1,7 @@
|
|||
2013-06-18 Juanma Barranquero <lekktu@gmail.com>
|
||||
|
||||
* NEWS: Document new Prettify Symbols mode.
|
||||
|
||||
2013-06-14 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* NEWS (utf-8 for el): Move to the incompatible section.
|
||||
|
|
8
etc/NEWS
8
etc/NEWS
|
@ -2873,10 +2873,10 @@ should be derived.
|
|||
modes, e.g. (add-hook 'prog-mode-hook 'flyspell-prog-mode) to enable
|
||||
on-the-fly spell checking for comments and strings.
|
||||
|
||||
**** New option, `prog-prettify-symbols' lets the user control symbol
|
||||
prettify (replacing a string like "lambda" with the Greek lambda
|
||||
character). The mode derived from `prog-mode' must call
|
||||
`prog-prettify-install' with its own custom alist, which can be empty.
|
||||
**** New minor modes `prettify-symbols-mode' and
|
||||
`global-prettify-symbols-mode' let the user enable symbol
|
||||
prettification (replacing a string like "lambda" with the Greek lambda
|
||||
character).
|
||||
|
||||
*** New hook `change-major-mode-after-body-hook', run by
|
||||
`run-mode-hooks' just before any other mode hooks.
|
||||
|
|
|
@ -1,3 +1,26 @@
|
|||
2013-06-18 Juanma Barranquero <lekktu@gmail.com>
|
||||
|
||||
Convert symbol prettification into minor mode and global minor mode.
|
||||
|
||||
* progmodes/prog-mode.el (prettify-symbols-alist): Rename from
|
||||
`prog-prettify-symbols', and make a local defvar instead of defcustom.
|
||||
(prettify-symbols--keywords): Rename from
|
||||
`prog-prettify-symbols-alist' and make a local defvar.
|
||||
(prettify-symbols--compose-symbol): Rename from
|
||||
`prog--prettify-font-lock-compose-symbol'.
|
||||
(prettify-symbols--make-keywords): Rename from
|
||||
`prog-prettify-font-lock-symbols-keywords' and simplify.
|
||||
(prog-prettify-install): Remove.
|
||||
(prettify-symbols-mode): New minor mode, based on
|
||||
`prog-prettify-install'.
|
||||
(turn-on-prettify-symbols-mode): New function.
|
||||
(global-prettify-symbols-mode): New globalized minor mode.
|
||||
|
||||
* emacs-lisp/lisp-mode.el (lisp-mode-variables):
|
||||
* progmodes/cfengine.el (cfengine3-mode):
|
||||
* progmodes/perl-mode.el (perl-mode): Don't call
|
||||
`prog-prettify-install'; set `prettify-symbols-alist' instead.
|
||||
|
||||
2013-06-18 Juri Linkov <juri@jurta.org>
|
||||
|
||||
* files-x.el (modify-file-local-variable-message): New function.
|
||||
|
|
|
@ -231,7 +231,7 @@ font-lock keywords will not be case sensitive."
|
|||
(font-lock-mark-block-function . mark-defun)
|
||||
(font-lock-syntactic-face-function
|
||||
. lisp-font-lock-syntactic-face-function)))
|
||||
(prog-prettify-install lisp--prettify-symbols-alist))
|
||||
(setq-local prettify-symbols-alist lisp--prettify-symbols-alist))
|
||||
|
||||
(defun lisp-outline-level ()
|
||||
"Lisp mode `outline-level' function."
|
||||
|
|
|
@ -547,7 +547,7 @@ to the action header."
|
|||
(setq font-lock-defaults
|
||||
'(cfengine3-font-lock-keywords
|
||||
nil nil nil beginning-of-defun))
|
||||
(prog-prettify-install cfengine3--prettify-symbols-alist)
|
||||
(setq-local prettify-symbols-alist cfengine3--prettify-symbols-alist)
|
||||
|
||||
;; Use defuns as the essential syntax block.
|
||||
(set (make-local-variable 'beginning-of-defun-function)
|
||||
|
|
|
@ -658,7 +658,7 @@ Turning on Perl mode runs the normal hook `perl-mode-hook'."
|
|||
nil nil ((?\_ . "w")) nil
|
||||
(font-lock-syntactic-face-function
|
||||
. perl-font-lock-syntactic-face-function)))
|
||||
(prog-prettify-install perl--prettify-symbols-alist)
|
||||
(setq-local prettify-symbols-alist perl--prettify-symbols-alist)
|
||||
(setq-local syntax-propertize-function #'perl-syntax-propertize-function)
|
||||
(add-hook 'syntax-propertize-extend-region-functions
|
||||
#'syntax-propertize-multiline 'append 'local)
|
||||
|
|
|
@ -54,21 +54,14 @@ instead."
|
|||
(end (progn (forward-sexp 1) (point))))
|
||||
(indent-region start end nil))))
|
||||
|
||||
(defvar prog-prettify-symbols-alist nil)
|
||||
(defvar-local prettify-symbols-alist nil
|
||||
"Alist of symbol prettifications.
|
||||
Each element looks like (SYMBOL . CHARACTER), where the symbol
|
||||
matching SYMBOL (a string, not a regexp) will be shown as
|
||||
CHARACTER instead.")
|
||||
|
||||
(defcustom prog-prettify-symbols nil
|
||||
"Whether symbols should be prettified.
|
||||
When set to an alist in the form `((STRING . CHARACTER)...)' it
|
||||
will augment the mode's native prettify alist."
|
||||
:type '(choice
|
||||
(const :tag "No thanks" nil)
|
||||
(const :tag "Mode defaults" t)
|
||||
(alist :tag "Mode defaults augmented with your own list"
|
||||
:key-type string :value-type character))
|
||||
:version "24.4")
|
||||
|
||||
(defun prog--prettify-font-lock-compose-symbol (alist)
|
||||
"Compose a sequence of ascii chars into a symbol.
|
||||
(defun prettify-symbols--compose-symbol (alist)
|
||||
"Compose a sequence of characters into a symbol.
|
||||
Regexp match data 0 points to the chars."
|
||||
;; Check that the chars should really be composed into a symbol.
|
||||
(let* ((start (match-beginning 0))
|
||||
|
@ -88,28 +81,60 @@ Regexp match data 0 points to the chars."
|
|||
;; Return nil because we're not adding any face property.
|
||||
nil)
|
||||
|
||||
(defun prog-prettify-font-lock-symbols-keywords ()
|
||||
(when prog-prettify-symbols
|
||||
(let ((alist (append prog-prettify-symbols-alist
|
||||
(if (listp prog-prettify-symbols)
|
||||
prog-prettify-symbols
|
||||
nil))))
|
||||
`((,(regexp-opt (mapcar 'car alist) t)
|
||||
(0 (prog--prettify-font-lock-compose-symbol ',alist)))))))
|
||||
(defun prettify-symbols--make-keywords ()
|
||||
(if prettify-symbols-alist
|
||||
`((,(regexp-opt (mapcar 'car prettify-symbols-alist) t)
|
||||
(0 (prettify-symbols--compose-symbol ',prettify-symbols-alist))))
|
||||
nil))
|
||||
|
||||
(defun prog-prettify-install (alist)
|
||||
"Install prog-mode support to prettify symbols according to ALIST.
|
||||
(defvar-local prettify-symbols--keywords nil)
|
||||
|
||||
ALIST is in the format `((STRING . CHARACTER)...)' like
|
||||
`prog-prettify-symbols'.
|
||||
;;;###autoload
|
||||
(define-minor-mode prettify-symbols-mode
|
||||
"Toggle Prettify Symbols mode.
|
||||
With a prefix argument ARG, enable Prettify Symbols mode if ARG is
|
||||
positive, and disable it otherwise. If called from Lisp, enable
|
||||
the mode if ARG is omitted or nil.
|
||||
|
||||
Internally, `font-lock-add-keywords' is called."
|
||||
(setq-local prog-prettify-symbols-alist alist)
|
||||
(let ((keywords (prog-prettify-font-lock-symbols-keywords)))
|
||||
(when keywords
|
||||
(font-lock-add-keywords nil keywords)
|
||||
(setq-local font-lock-extra-managed-props
|
||||
(cons 'composition font-lock-extra-managed-props)))))
|
||||
When Prettify Symbols mode and font-locking are enabled, symbols are
|
||||
prettified (displayed as composed characters) according to the rules
|
||||
in `prettify-symbols-alist' (which see), which are locally defined
|
||||
by major modes supporting prettifying. To add further customizations
|
||||
for a given major mode, you can modify `prettify-symbols-alist' thus:
|
||||
|
||||
(add-hook 'emacs-lisp-mode-hook
|
||||
(lambda ()
|
||||
(push '(\"<=\" . ?≤) prettify-symbols-alist)))
|
||||
|
||||
You can enable this mode locally in desired buffers, or use
|
||||
`global-prettify-symbols-mode' to enable it for all modes that
|
||||
support it."
|
||||
:init-value nil
|
||||
(if prettify-symbols-mode
|
||||
;; Turn on
|
||||
(when (setq prettify-symbols--keywords (prettify-symbols--make-keywords))
|
||||
(font-lock-add-keywords nil prettify-symbols--keywords)
|
||||
(setq-local font-lock-extra-managed-props
|
||||
(cons 'composition font-lock-extra-managed-props))
|
||||
(font-lock-fontify-buffer))
|
||||
;; Turn off
|
||||
(when prettify-symbols--keywords
|
||||
(font-lock-remove-keywords nil prettify-symbols--keywords)
|
||||
(setq prettify-symbols--keywords nil))
|
||||
(when (memq 'composition font-lock-extra-managed-props)
|
||||
(setq font-lock-extra-managed-props (delq 'composition
|
||||
font-lock-extra-managed-props))
|
||||
(with-silent-modifications
|
||||
(remove-text-properties (point-min) (point-max) '(composition nil))))))
|
||||
|
||||
(defun turn-on-prettify-symbols-mode ()
|
||||
(when (and (not prettify-symbols-mode)
|
||||
(local-variable-p 'prettify-symbols-alist))
|
||||
(prettify-symbols-mode 1)))
|
||||
|
||||
;;;###autoload
|
||||
(define-globalized-minor-mode global-prettify-symbols-mode
|
||||
prettify-symbols-mode turn-on-prettify-symbols-mode)
|
||||
|
||||
;;;###autoload
|
||||
(define-derived-mode prog-mode fundamental-mode "Prog"
|
||||
|
|
Loading…
Add table
Reference in a new issue