From: Juanma Barranquero <lekktu@gmail.com>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: Ted Zlatanov <tzz@lifelogs.com>, Emacs developers <emacs-devel@gnu.org>
Subject: Re: Interface of prog-prettification
Date: Tue, 18 Jun 2013 01:08:13 +0200 [thread overview]
Message-ID: <CAAeL0SSwe_uwKF3S673wC7xAiBW_6_LBtAntrzVjWBPUP1fN5Q@mail.gmail.com> (raw)
In-Reply-To: <jwva9mor9gx.fsf-monnier+emacs@gnu.org>
On Mon, Jun 17, 2013 at 6:27 PM, Stefan Monnier
<monnier@iro.umontreal.ca> wrote:
> Accident, mostly. Feel free to make it into a minor mode.
>
> The important part is that the actual symbols to handle vary
> between languages (e.g. mapping \ to λ makes sense for Haskell, but not
> for most other languages).
On Mon, Jun 17, 2013 at 9:13 PM, Ted Zlatanov <tzz@lifelogs.com> wrote:
> But it would work as a
> minor mode, sure. If you'd like to implement it that way, feel free.
> Just remove the old defcustom and whatever else you don't need anymore.
Without ChangeLogs (and prettify-symbols-mode is still in
prog-mode.el, though it is not really prog-mode specific).
=== modified file 'etc/NEWS'
--- etc/NEWS 2013-06-17 15:28:22 +0000
+++ etc/NEWS 2013-06-17 22:33:14 +0000
@@ -2873,10 +2873,9 @@
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 mode, `prettify-symbols-mode', lets 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.
=== modified file 'lisp/emacs-lisp/lisp-mode.el'
--- lisp/emacs-lisp/lisp-mode.el 2013-06-15 09:16:49 +0000
+++ lisp/emacs-lisp/lisp-mode.el 2013-06-17 22:53:23 +0000
@@ -231,7 +231,7 @@
(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 prettify-symbols-alist lisp--prettify-symbols-alist))
(defun lisp-outline-level ()
"Lisp mode `outline-level' function."
=== modified file 'lisp/progmodes/cfengine.el'
--- lisp/progmodes/cfengine.el 2013-06-05 17:48:50 +0000
+++ lisp/progmodes/cfengine.el 2013-06-17 22:53:51 +0000
@@ -547,7 +547,7 @@
(setq font-lock-defaults
'(cfengine3-font-lock-keywords
nil nil nil beginning-of-defun))
- (prog-prettify-install cfengine3--prettify-symbols-alist)
+ (setq prettify-symbols-alist cfengine3--prettify-symbols-alist)
;; Use defuns as the essential syntax block.
(set (make-local-variable 'beginning-of-defun-function)
=== modified file 'lisp/progmodes/perl-mode.el'
--- lisp/progmodes/perl-mode.el 2013-06-05 17:48:50 +0000
+++ lisp/progmodes/perl-mode.el 2013-06-17 22:52:38 +0000
@@ -658,7 +658,7 @@
nil nil ((?\_ . "w")) nil
(font-lock-syntactic-face-function
. perl-font-lock-syntactic-face-function)))
- (prog-prettify-install perl--prettify-symbols-alist)
+ (setq 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)
=== modified file 'lisp/progmodes/prog-mode.el'
--- lisp/progmodes/prog-mode.el 2013-06-17 01:09:13 +0000
+++ lisp/progmodes/prog-mode.el 2013-06-17 23:07:03 +0000
@@ -54,21 +54,14 @@
(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,48 @@
;; 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)
+
+(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 use this mode, you should
+enable it in the major mode hook, and optionally extend the default
+set of prettifications, like this:
+
+ (add-hook 'emacs-lisp-mode-hook
+ (lambda ()
+ (push '(\"<=\" . ?≤) prettify-symbols-alist)
+ (prettify-symbols-mode 1)))"
+ :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))))))
;;;###autoload
(define-derived-mode prog-mode fundamental-mode "Prog"
next prev parent reply other threads:[~2013-06-17 23:08 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-16 1:56 Interface of prog-prettification Juanma Barranquero
2013-06-16 9:24 ` Ted Zlatanov
2013-06-16 9:58 ` Juanma Barranquero
2013-06-16 22:58 ` Stefan Monnier
2013-06-16 23:41 ` Juanma Barranquero
2013-06-17 1:00 ` Stefan Monnier
2013-06-17 6:25 ` Ted Zlatanov
2013-06-16 23:46 ` Juanma Barranquero
2013-06-17 6:27 ` Ted Zlatanov
2013-06-17 14:31 ` Stefan Monnier
2013-06-17 16:04 ` Juanma Barranquero
2013-06-17 16:27 ` Stefan Monnier
2013-06-17 23:08 ` Juanma Barranquero [this message]
2013-06-18 1:00 ` Stefan Monnier
2013-06-18 1:38 ` Juanma Barranquero
2013-06-18 15:02 ` Ted Zlatanov
2013-06-18 19:17 ` Stefan Monnier
2013-06-18 19:42 ` Juanma Barranquero
2013-06-18 20:26 ` Stefan Monnier
2013-06-17 19:13 ` Ted Zlatanov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAAeL0SSwe_uwKF3S673wC7xAiBW_6_LBtAntrzVjWBPUP1fN5Q@mail.gmail.com \
--to=lekktu@gmail.com \
--cc=emacs-devel@gnu.org \
--cc=monnier@iro.umontreal.ca \
--cc=tzz@lifelogs.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.