Commit 14dd22d2 authored by Juanma Barranquero's avatar Juanma Barranquero

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.
parent ec9295ae
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.
......
......@@ -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.
......
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)
(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.
(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.")
(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 prog-prettify-install (alist)
"Install prog-mode support to prettify symbols according to ALIST.
ALIST is in the format `((STRING . CHARACTER)...)' like
`prog-prettify-symbols'.
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)))))
(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))
(defvar-local prettify-symbols--keywords nil)
;;;###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.
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"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment