* Interface of prog-prettification
@ 2013-06-16 1:56 Juanma Barranquero
2013-06-16 9:24 ` Ted Zlatanov
0 siblings, 1 reply; 20+ messages in thread
From: Juanma Barranquero @ 2013-06-16 1:56 UTC (permalink / raw)
To: Emacs developers
A few questions about the new prog-prettification.
- prog--prettify-font-lock-compose-symbol's docstring says:
"Compose a sequence of ascii chars into a symbol."
It is really true that it must be a sequence of ASCII characters? Why?
- Docstring of prog-prettify-symbols says:
"When set to an alist in the form `((STRING . CHARACTER)...)'"
But in fact, instead of CHARACTER you can use a string, and its
characters will be "composed" (stacked) together.
- I don't fully understand how the user is supposed to extend the
default modes' prog-prettification. What is the expected interface?
Customizing prog-prettify-symbols sets the value for all prog-derived
modes, but what if I want to use different prettifications for
different modes?
I tried adding (set (make-local-variable 'prog-prettify-symbols)
'(("my-symbol" . ?MYCHAR))) to the relevant mode-hook, but that does
not work.
pushing '("my-symbol" . ?MYCHAR) to the corresponding mode-specific
alist (lisp--prettify-symbols-alist,
cfengine3--prettify-symbols-alist, perl--prettify-symbols-alist, etc.)
works, but on one hand, these are internal, non-documented constants;
on the other hand, that does not help to separate lisp-mode from
emacs-lisp-mode, which are initialized from the same alist.
Juanma
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
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
0 siblings, 2 replies; 20+ messages in thread
From: Ted Zlatanov @ 2013-06-16 9:24 UTC (permalink / raw)
To: emacs-devel
On Sun, 16 Jun 2013 03:56:12 +0200 Juanma Barranquero <lekktu@gmail.com> wrote:
JB> A few questions about the new prog-prettification.
JB> - prog--prettify-font-lock-compose-symbol's docstring says:
JB> "Compose a sequence of ascii chars into a symbol."
JB> It is really true that it must be a sequence of ASCII characters? Why?
The original `perl-mode' implementation of the above said that.
JB> - Docstring of prog-prettify-symbols says:
JB> "When set to an alist in the form `((STRING . CHARACTER)...)'"
JB> But in fact, instead of CHARACTER you can use a string, and its
JB> characters will be "composed" (stacked) together.
Yes. Handa-san explained how composition works in that case and I
intend to document it, but it's neither explained nor supported right
now. I think (as already suggested here) that an arbitrary string
should also be supported.
JB> - I don't fully understand how the user is supposed to extend the
JB> default modes' prog-prettification. What is the expected interface?
The user is not supposed to extend it. I had that originally IIRC but
for simplicity we decided to make it one setting for all prog-modes.
The assumption is that if you like to prettify lambdas as symbols, you
won't mind it everywhere.
JB> Customizing prog-prettify-symbols sets the value for all prog-derived
JB> modes, but what if I want to use different prettifications for
JB> different modes?
JB> I tried adding (set (make-local-variable 'prog-prettify-symbols)
JB> '(("my-symbol" . ?MYCHAR))) to the relevant mode-hook, but that does
JB> not work.
Maybe a mode load hook call to `prog-prettify-install'? I think
complicating the defcustom might be less user-friendly. Suggestions
welcome.
JB> pushing '("my-symbol" . ?MYCHAR) to the corresponding mode-specific
JB> alist (lisp--prettify-symbols-alist,
JB> cfengine3--prettify-symbols-alist, perl--prettify-symbols-alist, etc.)
JB> works, but on one hand, these are internal, non-documented constants;
JB> on the other hand, that does not help to separate lisp-mode from
JB> emacs-lisp-mode, which are initialized from the same alist.
Right. I think these complications, especially the inheritance aspect,
indicate it's better to let the user decide in the load hook than to try
to provide it in a more complicated data structure.
Ted
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-16 9:24 ` Ted Zlatanov
@ 2013-06-16 9:58 ` Juanma Barranquero
2013-06-16 22:58 ` Stefan Monnier
1 sibling, 0 replies; 20+ messages in thread
From: Juanma Barranquero @ 2013-06-16 9:58 UTC (permalink / raw)
To: Emacs developers
On Sun, Jun 16, 2013 at 11:24 AM, Ted Zlatanov <tzz@lifelogs.com> wrote:
> The original `perl-mode' implementation of the above said that.
Well, I haven't tried having a non-ASCII keyword and prettifying it,
but I would be very surprised if it didn't work.
> I think (as already suggested here) that an arbitrary string
> should also be supported.
Yes.
> The user is not supposed to extend it. I had that originally IIRC but
> for simplicity we decided to make it one setting for all prog-modes.
> The assumption is that if you like to prettify lambdas as symbols, you
> won't mind it everywhere.
That's a strange assumption for an Emacs feature ;-)
> Maybe a mode load hook call to `prog-prettify-install'? I think
> complicating the defcustom might be less user-friendly. Suggestions
> welcome.
Do you mean a hook run from prog-prettify-install? Yes, that would work.
As for defcustom, agreed.
> Right. I think these complications, especially the inheritance aspect,
> indicate it's better to let the user decide in the load hook than to try
> to provide it in a more complicated data structure.
Yes. Though having these variables as user options (not necessarily
defcustoms, but at the very least non-internal) would be nice.
Thanks,
J
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
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
` (2 more replies)
1 sibling, 3 replies; 20+ messages in thread
From: Stefan Monnier @ 2013-06-16 22:58 UTC (permalink / raw)
To: emacs-devel
> now. I think (as already suggested here) that an arbitrary string
> should also be supported.
I'd wait until a concrete use case comes up for it, tho.
JB> - I don't fully understand how the user is supposed to extend the
JB> default modes' prog-prettification. What is the expected interface?
There is no interface for it.
> The assumption is that if you like to prettify lambdas as symbols, you
> won't mind it everywhere.
Oh, I hadn't noticed you made prog-prettify-symbols into a defcustom.
I think that's a mistake.
Stefan
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-16 22:58 ` Stefan Monnier
@ 2013-06-16 23:41 ` Juanma Barranquero
2013-06-17 1:00 ` Stefan Monnier
2013-06-16 23:46 ` Juanma Barranquero
2013-06-17 6:27 ` Ted Zlatanov
2 siblings, 1 reply; 20+ messages in thread
From: Juanma Barranquero @ 2013-06-16 23:41 UTC (permalink / raw)
To: Stefan Monnier; +Cc: Emacs developers
On Mon, Jun 17, 2013 at 12:58 AM, Stefan Monnier
<monnier@iro.umontreal.ca> wrote:
> There is no interface for it.
Fair enough, though the docstring of prog-prettify-symbols suggests otherwise:
"Whether symbols should be prettified.
When set to an alist in the form `((STRING . CHARACTER)...)' it
will augment the mode's native prettify alist."
> Oh, I hadn't noticed you made prog-prettify-symbols into a defcustom.
> I think that's a mistake.
Agreed about defcustom, but allowing the user to extend it (via lisp
code) seems useful.
J
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-16 22:58 ` Stefan Monnier
2013-06-16 23:41 ` Juanma Barranquero
@ 2013-06-16 23:46 ` Juanma Barranquero
2013-06-17 6:27 ` Ted Zlatanov
2 siblings, 0 replies; 20+ messages in thread
From: Juanma Barranquero @ 2013-06-16 23:46 UTC (permalink / raw)
To: Stefan Monnier; +Cc: Emacs developers
On Mon, Jun 17, 2013 at 12:58 AM, Stefan Monnier
<monnier@iro.umontreal.ca> wrote:
> There is no interface for it.
Fair enough, though the docstring of prog-prettify-symbols suggests otherwise:
"Whether symbols should be prettified.
When set to an alist in the form `((STRING . CHARACTER)...)' it
will augment the mode's native prettify alist."
> Oh, I hadn't noticed you made prog-prettify-symbols into a defcustom.
> I think that's a mistake.
Agreed about defcustom, but allowing the user to extend it seems useful.
J
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-16 23:41 ` Juanma Barranquero
@ 2013-06-17 1:00 ` Stefan Monnier
2013-06-17 6:25 ` Ted Zlatanov
0 siblings, 1 reply; 20+ messages in thread
From: Stefan Monnier @ 2013-06-17 1:00 UTC (permalink / raw)
To: Juanma Barranquero; +Cc: Emacs developers
>> Oh, I hadn't noticed you made prog-prettify-symbols into a defcustom.
>> I think that's a mistake.
> Agreed about defcustom, but allowing the user to extend it (via lisp
> code) seems useful.
That would be OK, indeed. Maybe prog-prettify-install should add to
prog-prettify-symbols-alist rather than just set it.
Or maybe we should just throw away prog-prettify-symbols-alist and pass
the alist to prog-prettify-font-lock-symbols-keywords instead.
Stefan
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-17 1:00 ` Stefan Monnier
@ 2013-06-17 6:25 ` Ted Zlatanov
0 siblings, 0 replies; 20+ messages in thread
From: Ted Zlatanov @ 2013-06-17 6:25 UTC (permalink / raw)
To: emacs-devel
On Sun, 16 Jun 2013 21:00:03 -0400 Stefan Monnier <monnier@iro.umontreal.ca> wrote:
>>> Oh, I hadn't noticed you made prog-prettify-symbols into a defcustom.
>>> I think that's a mistake.
>> Agreed about defcustom, but allowing the user to extend it (via lisp
>> code) seems useful.
SM> That would be OK, indeed. Maybe prog-prettify-install should add to
SM> prog-prettify-symbols-alist rather than just set it.
SM> Or maybe we should just throw away prog-prettify-symbols-alist and pass
SM> the alist to prog-prettify-font-lock-symbols-keywords instead.
Perhaps it's for lack of coffee, but I am not sure what you're
suggesting. Could you show the user-level interface (defcustom or
whatever) and an example of how `emacs-lisp-mode' would use the
facility?
Ted
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-16 22:58 ` Stefan Monnier
2013-06-16 23:41 ` Juanma Barranquero
2013-06-16 23:46 ` Juanma Barranquero
@ 2013-06-17 6:27 ` Ted Zlatanov
2013-06-17 14:31 ` Stefan Monnier
2 siblings, 1 reply; 20+ messages in thread
From: Ted Zlatanov @ 2013-06-17 6:27 UTC (permalink / raw)
To: emacs-devel
On Sun, 16 Jun 2013 18:58:16 -0400 Stefan Monnier <monnier@iro.umontreal.ca> wrote:
>> now. I think (as already suggested here) that an arbitrary string
>> should also be supported.
SM> I'd wait until a concrete use case comes up for it, tho.
I have 3 concrete use cases: Tassilo, Juanma, and my own.
My use case is that I like "TODO" and "README" to have special treatment
in all programming buffers.
Ted
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-17 6:27 ` Ted Zlatanov
@ 2013-06-17 14:31 ` Stefan Monnier
2013-06-17 16:04 ` Juanma Barranquero
0 siblings, 1 reply; 20+ messages in thread
From: Stefan Monnier @ 2013-06-17 14:31 UTC (permalink / raw)
To: emacs-devel
> I have 3 concrete use cases: Tassilo, Juanma, and my own.
> My use case is that I like "TODO" and "README" to have special treatment
> in all programming buffers.
That is a claim that 3 people have a use case for it and that one of
those use cases involves the words TODO and README.
But I don't see any description of a concrete use case here.
Stefan
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-17 14:31 ` Stefan Monnier
@ 2013-06-17 16:04 ` Juanma Barranquero
2013-06-17 16:27 ` Stefan Monnier
2013-06-17 19:13 ` Ted Zlatanov
0 siblings, 2 replies; 20+ messages in thread
From: Juanma Barranquero @ 2013-06-17 16:04 UTC (permalink / raw)
To: Stefan Monnier; +Cc: Emacs developers
On Mon, Jun 17, 2013 at 4:31 PM, Stefan Monnier
<monnier@iro.umontreal.ca> wrote:
> That is a claim that 3 people have a use case for it and that one of
> those use cases involves the words TODO and README.
>
> But I don't see any description of a concrete use case here.
Truth be told, I don't have a use case, and Ted's comment about my
position is a misunderstanding, I think. I just pointed out that
composition can compose to strings, not just characters (but that is
not the same that substituting one string of chars by another one).
That said, a facility for making that ("visually" replacing one string
by another) could be useful (via composition, display specs, or
whatever) but I don't think it is something specifically related to
prog mode or symbol prettification. Seems like some sort of
as-yet-unimplemented minor mode to me.
Speaking of which... Why is this symbol prettification some
semi-obscure feature of programming modes, instead of a minor mode to
be enabled by the user however he sees fit?
J
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-17 16:04 ` Juanma Barranquero
@ 2013-06-17 16:27 ` Stefan Monnier
2013-06-17 23:08 ` Juanma Barranquero
2013-06-17 19:13 ` Ted Zlatanov
1 sibling, 1 reply; 20+ messages in thread
From: Stefan Monnier @ 2013-06-17 16:27 UTC (permalink / raw)
To: Juanma Barranquero; +Cc: Emacs developers
> Speaking of which... Why is this symbol prettification some
> semi-obscure feature of programming modes, instead of a minor mode to
> be enabled by the user however he sees fit?
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).
Stefan
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-17 16:04 ` Juanma Barranquero
2013-06-17 16:27 ` Stefan Monnier
@ 2013-06-17 19:13 ` Ted Zlatanov
1 sibling, 0 replies; 20+ messages in thread
From: Ted Zlatanov @ 2013-06-17 19:13 UTC (permalink / raw)
To: emacs-devel
On Mon, 17 Jun 2013 18:04:40 +0200 Juanma Barranquero <lekktu@gmail.com> wrote:
JB> On Mon, Jun 17, 2013 at 4:31 PM, Stefan Monnier
JB> <monnier@iro.umontreal.ca> wrote:
>> That is a claim that 3 people have a use case for it and that one of
>> those use cases involves the words TODO and README.
>>
>> But I don't see any description of a concrete use case here.
JB> a facility for ["visually" replacing one string by another]) could
JB> be useful (via composition, display specs, or whatever) but I don't
JB> think it is something specifically related to prog mode or symbol
JB> prettification. Seems like some sort of as-yet-unimplemented minor
JB> mode to me.
OK.
JB> Speaking of which... Why is this symbol prettification some
JB> semi-obscure feature of programming modes, instead of a minor mode to
JB> be enabled by the user however he sees fit?
Because most non-programming modes don't deal with symbols, and all the
use cases I knew were for programming modes. 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.
Ted
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-17 16:27 ` Stefan Monnier
@ 2013-06-17 23:08 ` Juanma Barranquero
2013-06-18 1:00 ` Stefan Monnier
0 siblings, 1 reply; 20+ messages in thread
From: Juanma Barranquero @ 2013-06-17 23:08 UTC (permalink / raw)
To: Stefan Monnier; +Cc: Ted Zlatanov, Emacs developers
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"
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-17 23:08 ` Juanma Barranquero
@ 2013-06-18 1:00 ` Stefan Monnier
2013-06-18 1:38 ` Juanma Barranquero
0 siblings, 1 reply; 20+ messages in thread
From: Stefan Monnier @ 2013-06-18 1:00 UTC (permalink / raw)
To: Juanma Barranquero; +Cc: Ted Zlatanov, Emacs developers
> +**** New minor mode, `prettify-symbols-mode', lets the user enable
> +symbol prettification (replacing a string like "lambda" with the Greek
> +lambda character).
Looks OK, but a major motivation of the move to prog-mode was to provide
a global setting for it, so we need a global minor mode for it.
Stefan
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-18 1:00 ` Stefan Monnier
@ 2013-06-18 1:38 ` Juanma Barranquero
2013-06-18 15:02 ` Ted Zlatanov
0 siblings, 1 reply; 20+ messages in thread
From: Juanma Barranquero @ 2013-06-18 1:38 UTC (permalink / raw)
To: Stefan Monnier; +Cc: Ted Zlatanov, Emacs developers
On Tue, Jun 18, 2013 at 3:00 AM, Stefan Monnier
<monnier@iro.umontreal.ca> wrote:
> Looks OK, but a major motivation of the move to prog-mode was to provide
> a global setting for it, so we need a global minor mode for it.
=== modified file 'etc/NEWS'
--- etc/NEWS 2013-06-17 15:28:22 +0000
+++ etc/NEWS 2013-06-18 01:37:01 +0000
@@ -2873,10 +2873,10 @@
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.
=== 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-18 01:13:12 +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-18 01:13:12 +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-18 01:13:12 +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-18 01:35:48 +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,60 @@
;; 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"
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-18 1:38 ` Juanma Barranquero
@ 2013-06-18 15:02 ` Ted Zlatanov
2013-06-18 19:17 ` Stefan Monnier
0 siblings, 1 reply; 20+ messages in thread
From: Ted Zlatanov @ 2013-06-18 15:02 UTC (permalink / raw)
To: emacs-devel
On Tue, 18 Jun 2013 03:38:56 +0200 Juanma Barranquero <lekktu@gmail.com> wrote:
JB> === modified file 'lisp/emacs-lisp/lisp-mode.el'
JB> + (setq prettify-symbols-alist lisp--prettify-symbols-alist))
JB> === modified file 'lisp/progmodes/cfengine.el'
JB> + (setq prettify-symbols-alist cfengine3--prettify-symbols-alist)
JB> === modified file 'lisp/progmodes/perl-mode.el'
JB> + (setq prettify-symbols-alist perl--prettify-symbols-alist)
Looks good to me.
Ted
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-18 15:02 ` Ted Zlatanov
@ 2013-06-18 19:17 ` Stefan Monnier
2013-06-18 19:42 ` Juanma Barranquero
0 siblings, 1 reply; 20+ messages in thread
From: Stefan Monnier @ 2013-06-18 19:17 UTC (permalink / raw)
To: emacs-devel
JB> + (setq prettify-symbols-alist lisp--prettify-symbols-alist))
JB> + (setq prettify-symbols-alist cfengine3--prettify-symbols-alist)
JB> + (setq prettify-symbols-alist perl--prettify-symbols-alist)
BTW, I'd use setq-local because I can't be bothered to try and remember
which vars were made buffer-local and which ones weren't and which var's
definining package is known to be already loaded and which one isn't.
Stefan
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-18 19:17 ` Stefan Monnier
@ 2013-06-18 19:42 ` Juanma Barranquero
2013-06-18 20:26 ` Stefan Monnier
0 siblings, 1 reply; 20+ messages in thread
From: Juanma Barranquero @ 2013-06-18 19:42 UTC (permalink / raw)
To: Stefan Monnier; +Cc: Emacs developers
> JB> + (setq prettify-symbols-alist lisp--prettify-symbols-alist))
> JB> + (setq prettify-symbols-alist cfengine3--prettify-symbols-alist)
> JB> + (setq prettify-symbols-alist perl--prettify-symbols-alist)
>
> BTW, I'd use setq-local because I can't be bothered to try and remember
> which vars were made buffer-local and which ones weren't and which var's
> definining package is known to be already loaded and which one isn't.
Yeah, that's a good idea. I'll change it.
I'm assuming that you don't have any more comments and it's OK to install it.
J
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: Interface of prog-prettification
2013-06-18 19:42 ` Juanma Barranquero
@ 2013-06-18 20:26 ` Stefan Monnier
0 siblings, 0 replies; 20+ messages in thread
From: Stefan Monnier @ 2013-06-18 20:26 UTC (permalink / raw)
To: Juanma Barranquero; +Cc: Emacs developers
> I'm assuming that you don't have any more comments and it's OK to install it.
Rightly so,
Stefan
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2013-06-18 20:26 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
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
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.