unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* A proposal for removing obsolete packages
@ 2016-01-11  3:09 Andrew Hyatt
  2016-01-11 14:41 ` Phillip Lord
                   ` (2 more replies)
  0 siblings, 3 replies; 128+ messages in thread
From: Andrew Hyatt @ 2016-01-11  3:09 UTC (permalink / raw)
  To: emacs-devel


I'd like to propose a policy for feature removal - I'll just start out
with the policy, and then give the rationalization, and discuss
alternatives.

Currently, obsolete elisp is moved to the obsolete subdir. Attempts to
load them are successful, but come with the warning message "<package>
is obsolete!" I propose that we leave them in the obsolete subdir for
one major version. At the start of every new major version, we remove
everything from that subdir package that has been there since the start
of last major version.

For example, a package that is declared obsolete during the development
of Emacs 25 would be moved to obsolete, and a message would be added to
say that "<package> is obsolete and will be removed in Emacs 27". It
couldn't be removed in Emacs 26 because it didn't start Emacs 25 in
obsolete.

In short, obsolete package added in the middle of a release will be
guaranteed to exist until the next major release, and then one more
major release.

The need for a policy arose while discussing with Eli and others what
should be done with a bug against the obsolete longlines-mode
(https://debbugs.gnu.org/cgi/bugreport.cgi?bug=1452). We have many bugs,
and it was a bit worrying that there was no way to remove a bug even
against functionality that was obsolete. Plus, there was no accepted way
to get anything out of obsolete. Where was the benefit, then, of putting
things in obsolete at all?

To me, it's clear that emacs would be well served by shedding some
little-used functionality. The amount of elisp is enormous, and it
mostly modifies a common user experience, so that each package can
potentially create problems for each other package. By removing the
obsolete packages, we can reduce the amount of potential issues.

What if someone relied on an obsolete package? Mostly, like
longlines-mode, better solutions have come along. Giving people an
entire major version to switch seems pretty reasonable to me. For most
obsolete functionality, we're talking years of existence in the obsolete
subdir. If not, anyone still interested can create an ELPA package that
they maintain on their favorite ELPA server - but not in gnu ELPA.

There might be even better solutions to this problem. I certainly have
not attempted to explore the entire space of solutions. Perhaps the
timing is too long as well - I wouldn't mind making things more
aggressive and instead removing all obsolete packages at the start of
each major version (meaning that an obsolete package would last one
major version or less). This probably would work itself out and obsolete
packages would tend to not be removed at the end of the major version
development cycle.

Please let me know what you think.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-11  3:09 A proposal for removing obsolete packages Andrew Hyatt
@ 2016-01-11 14:41 ` Phillip Lord
  2016-01-11 15:14 ` Eli Zaretskii
  2016-01-12  4:07 ` Richard Stallman
  2 siblings, 0 replies; 128+ messages in thread
From: Phillip Lord @ 2016-01-11 14:41 UTC (permalink / raw)
  To: Andrew Hyatt; +Cc: emacs-devel



Andrew Hyatt <ahyatt@gmail.com> writes:
> There might be even better solutions to this problem. I certainly have
> not attempted to explore the entire space of solutions. Perhaps the
> timing is too long as well - I wouldn't mind making things more
> aggressive and instead removing all obsolete packages at the start of
> each major version (meaning that an obsolete package would last one
> major version or less). This probably would work itself out and obsolete
> packages would tend to not be removed at the end of the major version
> development cycle.
>
> Please let me know what you think.


Having a policy that says "we can remove and will remove packages at the
beginning of each new major release, unless some one really objects"
would be a reasonable middle course.

This would also give people the incentive to make the jump -- I still
use longlines-mode, for example, because I haven't found a replacement
for M-x longlines-show-hard-newlines in visual-line-mode. If it's not
there, I could add it.

Phil



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-11  3:09 A proposal for removing obsolete packages Andrew Hyatt
  2016-01-11 14:41 ` Phillip Lord
@ 2016-01-11 15:14 ` Eli Zaretskii
  2016-01-12  4:24   ` Stefan Monnier
  2016-01-12  5:25   ` Andrew Hyatt
  2016-01-12  4:07 ` Richard Stallman
  2 siblings, 2 replies; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-11 15:14 UTC (permalink / raw)
  To: Andrew Hyatt; +Cc: emacs-devel

> From: Andrew Hyatt <ahyatt@gmail.com>
> Date: Sun, 10 Jan 2016 22:09:27 -0500
> 
> Currently, obsolete elisp is moved to the obsolete subdir. Attempts to
> load them are successful, but come with the warning message "<package>
> is obsolete!" I propose that we leave them in the obsolete subdir for
> one major version. At the start of every new major version, we remove
> everything from that subdir package that has been there since the start
> of last major version.
> 
> For example, a package that is declared obsolete during the development
> of Emacs 25 would be moved to obsolete, and a message would be added to
> say that "<package> is obsolete and will be removed in Emacs 27". It
> couldn't be removed in Emacs 26 because it didn't start Emacs 25 in
> obsolete.
> 
> In short, obsolete package added in the middle of a release will be
> guaranteed to exist until the next major release, and then one more
> major release.

That sounds good to me, thanks.

> There might be even better solutions to this problem. I certainly have
> not attempted to explore the entire space of solutions. Perhaps the
> timing is too long as well - I wouldn't mind making things more
> aggressive and instead removing all obsolete packages at the start of
> each major version (meaning that an obsolete package would last one
> major version or less). This probably would work itself out and obsolete
> packages would tend to not be removed at the end of the major version
> development cycle.

We've repeatedly seen reports from people who jump 2 major releases,
so I think removing sooner than after a full major release cycle is
not something we should start with.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-11  3:09 A proposal for removing obsolete packages Andrew Hyatt
  2016-01-11 14:41 ` Phillip Lord
  2016-01-11 15:14 ` Eli Zaretskii
@ 2016-01-12  4:07 ` Richard Stallman
  2016-01-12  5:25   ` Andrew Hyatt
  2 siblings, 1 reply; 128+ messages in thread
From: Richard Stallman @ 2016-01-12  4:07 UTC (permalink / raw)
  To: Andrew Hyatt; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > For example, a package that is declared obsolete during the development
  > of Emacs 25 would be moved to obsolete, and a message would be added to
  > say that "<package> is obsolete and will be removed in Emacs 27". It
  > couldn't be removed in Emacs 26 because it didn't start Emacs 25 in
  > obsolete.

I agree.  But we should not be rigit about deleting it in Emacs 27,
either.  Depending on how the feature is used, we might want to save
it longer.  Features used in Lisp code may need to remain longer.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-11 15:14 ` Eli Zaretskii
@ 2016-01-12  4:24   ` Stefan Monnier
  2016-01-19  5:28     ` John Wiegley
  2016-01-12  5:25   ` Andrew Hyatt
  1 sibling, 1 reply; 128+ messages in thread
From: Stefan Monnier @ 2016-01-12  4:24 UTC (permalink / raw)
  To: emacs-devel

> We've repeatedly seen reports from people who jump 2 major releases,
> so I think removing sooner than after a full major release cycle is
> not something we should start with.

Agreed.  And that matches our past behavior: we generally purge features
marked obsolete more than 2 major versions ago (tho the condition
shouldn't be based on counting major versions but on years, IMO).


        Stefan




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-12  4:07 ` Richard Stallman
@ 2016-01-12  5:25   ` Andrew Hyatt
  2016-01-12 21:49     ` Richard Stallman
  0 siblings, 1 reply; 128+ messages in thread
From: Andrew Hyatt @ 2016-01-12  5:25 UTC (permalink / raw)
  To: Richard Stallman; +Cc: emacs-devel

Richard Stallman <rms@gnu.org> writes:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > For example, a package that is declared obsolete during the development
>   > of Emacs 25 would be moved to obsolete, and a message would be added to
>   > say that "<package> is obsolete and will be removed in Emacs 27". It
>   > couldn't be removed in Emacs 26 because it didn't start Emacs 25 in
>   > obsolete.
>
> I agree.  But we should not be rigit about deleting it in Emacs 27,
> either.  Depending on how the feature is used, we might want to save
> it longer.  Features used in Lisp code may need to remain longer.

Could we instead not move things into obsolete if we didn't think they
were removable?

Also, can you give an example of something that is obsolete but
shouldn't be removed?  That might help me understand your concern.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-11 15:14 ` Eli Zaretskii
  2016-01-12  4:24   ` Stefan Monnier
@ 2016-01-12  5:25   ` Andrew Hyatt
  1 sibling, 0 replies; 128+ messages in thread
From: Andrew Hyatt @ 2016-01-12  5:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Andrew Hyatt <ahyatt@gmail.com>
>> Date: Sun, 10 Jan 2016 22:09:27 -0500
>> 
>> Currently, obsolete elisp is moved to the obsolete subdir. Attempts to
>> load them are successful, but come with the warning message "<package>
>> is obsolete!" I propose that we leave them in the obsolete subdir for
>> one major version. At the start of every new major version, we remove
>> everything from that subdir package that has been there since the start
>> of last major version.
>> 
>> For example, a package that is declared obsolete during the development
>> of Emacs 25 would be moved to obsolete, and a message would be added to
>> say that "<package> is obsolete and will be removed in Emacs 27". It
>> couldn't be removed in Emacs 26 because it didn't start Emacs 25 in
>> obsolete.
>> 
>> In short, obsolete package added in the middle of a release will be
>> guaranteed to exist until the next major release, and then one more
>> major release.
>
> That sounds good to me, thanks.
>
>> There might be even better solutions to this problem. I certainly have
>> not attempted to explore the entire space of solutions. Perhaps the
>> timing is too long as well - I wouldn't mind making things more
>> aggressive and instead removing all obsolete packages at the start of
>> each major version (meaning that an obsolete package would last one
>> major version or less). This probably would work itself out and obsolete
>> packages would tend to not be removed at the end of the major version
>> development cycle.
>
> We've repeatedly seen reports from people who jump 2 major releases,
> so I think removing sooner than after a full major release cycle is
> not something we should start with.

Sounds reasonable to me, thanks for the feedback.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-12  5:25   ` Andrew Hyatt
@ 2016-01-12 21:49     ` Richard Stallman
  2016-01-14  5:19       ` Andrew Hyatt
  2016-01-14 23:09       ` Phillip Lord
  0 siblings, 2 replies; 128+ messages in thread
From: Richard Stallman @ 2016-01-12 21:49 UTC (permalink / raw)
  To: Andrew Hyatt; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > >   > For example, a package that is declared obsolete during the development
  > >   > of Emacs 25 would be moved to obsolete, and a message would be added to
  > >   > say that "<package> is obsolete and will be removed in Emacs 27". It
  > >   > couldn't be removed in Emacs 26 because it didn't start Emacs 25 in
  > >   > obsolete.
  > >
  > > I agree.  But we should not be rigit about deleting it in Emacs 27,
  > > either.  Depending on how the feature is used, we might want to save
  > > it longer.  Features used in Lisp code may need to remain longer.

  > Could we instead not move things into obsolete if we didn't think they
  > were removable?

Moving them to 'obsolete' would be done at the first step, according to
that proposal.  The question I am raising is when to delete them entirely.

  > Also, can you give an example of something that is obsolete but
  > shouldn't be removed?  That might help me understand your concern.

defadvice might be a good example.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-12 21:49     ` Richard Stallman
@ 2016-01-14  5:19       ` Andrew Hyatt
  2016-01-17 22:53         ` Stefan Monnier
  2016-01-14 23:09       ` Phillip Lord
  1 sibling, 1 reply; 128+ messages in thread
From: Andrew Hyatt @ 2016-01-14  5:19 UTC (permalink / raw)
  To: Richard Stallman; +Cc: emacs-devel

Richard Stallman <rms@gnu.org> writes:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > >   > For example, a package that is declared obsolete during the development
>   > >   > of Emacs 25 would be moved to obsolete, and a message would be added to
>   > >   > say that "<package> is obsolete and will be removed in Emacs 27". It
>   > >   > couldn't be removed in Emacs 26 because it didn't start Emacs 25 in
>   > >   > obsolete.
>   > >
>   > > I agree.  But we should not be rigit about deleting it in Emacs 27,
>   > > either.  Depending on how the feature is used, we might want to save
>   > > it longer.  Features used in Lisp code may need to remain longer.
>
>   > Could we instead not move things into obsolete if we didn't think they
>   > were removable?
>
> Moving them to 'obsolete' would be done at the first step, according to
> that proposal.  The question I am raising is when to delete them entirely.
>
>   > Also, can you give an example of something that is obsolete but
>   > shouldn't be removed?  That might help me understand your concern.
>
> defadvice might be a good example.

OK, that sounds like a completely valid concern.  I agree that some
packages that are well used may need to stick around for longer, and
that it should be at the discretion of the maintainer.  I'd hope that
this would be very unusual, though.

One way to make it unusual (and allow things like advice to be placed in
obsolete and removed later) would be if elisp functionality such as
defadvice had their APIs maintained but implemented on top of newer
functionality. For example, a macro in nadvice.el could re-implement
defadvice on top of the replacement functions. That would allow us to
remove the old implementation safely. I haven't thought about this
example very deeply, though, perhaps it is not so easy.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-12 21:49     ` Richard Stallman
  2016-01-14  5:19       ` Andrew Hyatt
@ 2016-01-14 23:09       ` Phillip Lord
  2016-01-16  4:13         ` Andrew Hyatt
  1 sibling, 1 reply; 128+ messages in thread
From: Phillip Lord @ 2016-01-14 23:09 UTC (permalink / raw)
  To: Richard Stallman; +Cc: Andrew Hyatt, emacs-devel

Richard Stallman <rms@gnu.org> writes:
>   > Also, can you give an example of something that is obsolete but
>   > shouldn't be removed?  That might help me understand your concern.
>
> defadvice might be a good example.

Perhaps we need an intermediate directory, called "deprecated". Not
obsolete, should probably still autoload -- putting defadvice into
obsolete will break some packages for this reason alone, but should
produce warnings.

The intention would be that "deprecated" packages would move to
"obsolete" there after.

Phil



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-14 23:09       ` Phillip Lord
@ 2016-01-16  4:13         ` Andrew Hyatt
  2016-01-16 19:10           ` Richard Stallman
  2016-01-19 14:54           ` Phillip Lord
  0 siblings, 2 replies; 128+ messages in thread
From: Andrew Hyatt @ 2016-01-16  4:13 UTC (permalink / raw)
  To: Phillip Lord; +Cc: Richard Stallman, emacs-devel

phillip.lord@russet.org.uk (Phillip Lord) writes:

> Richard Stallman <rms@gnu.org> writes:
>>   > Also, can you give an example of something that is obsolete but
>>   > shouldn't be removed?  That might help me understand your concern.
>>
>> defadvice might be a good example.
>
> Perhaps we need an intermediate directory, called "deprecated". Not
> obsolete, should probably still autoload -- putting defadvice into
> obsolete will break some packages for this reason alone, but should
> produce warnings.
>
> The intention would be that "deprecated" packages would move to
> "obsolete" there after.

What would the difference be between deprecated and obsolete, then?  Is
it just that obsolete would definitely be deleted and deprecated only
might be?

>
> Phil



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-16  4:13         ` Andrew Hyatt
@ 2016-01-16 19:10           ` Richard Stallman
  2016-01-18 18:47             ` Andrew Hyatt
  2016-01-19 14:54           ` Phillip Lord
  1 sibling, 1 reply; 128+ messages in thread
From: Richard Stallman @ 2016-01-16 19:10 UTC (permalink / raw)
  To: Andrew Hyatt; +Cc: emacs-devel, phillip.lord

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

"Deprecated" is neither weaker nor stronger than "obsolete".  Rather,
they are different in quality.

"Obsolete" means "This was useful before, but not now, since the
context has changed."  "Deprecated" means "We disapprove of this."

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-14  5:19       ` Andrew Hyatt
@ 2016-01-17 22:53         ` Stefan Monnier
  0 siblings, 0 replies; 128+ messages in thread
From: Stefan Monnier @ 2016-01-17 22:53 UTC (permalink / raw)
  To: emacs-devel

> One way to make it unusual (and allow things like advice to be placed in
> obsolete and removed later) would be if elisp functionality such as
> defadvice had their APIs maintained but implemented on top of newer
> functionality. For example, a macro in nadvice.el could re-implement
> defadvice on top of the replacement functions.

FWIW: defadvice *is* implemented on top of nadvice already.
Emacs-23.4's advice.el is 170KB.
Emacs-24.5's advice.el is 139KB (+ 24KB of nadvice.el).

I originally intended to delay such "re-implementation" of advice.el to
some later time, but I quickly realized that it was not an option
because otherwise you can't mix defadvice and advice-add on the
same function.

The problem of a long transition (as is likely to occur for advice.el)
could be reduced in the following way:
- Rather than completely remove the obsolete package (after N years),
  move it to GNU ELPA.  So people can still get their old code working,
  tho it takes an extra step.
- Implement an nadvice.el forward compatibility package in GNU ELPA
  (probably implemented on top of defadvice), like I did for cl-lib and
  cl-generic, so external packages can start using nadvice.el without
  having to wait for Emacs-24.3 to be considered "too old to support".


        Stefan




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-16 19:10           ` Richard Stallman
@ 2016-01-18 18:47             ` Andrew Hyatt
  2016-01-19 13:51               ` Richard Stallman
  0 siblings, 1 reply; 128+ messages in thread
From: Andrew Hyatt @ 2016-01-18 18:47 UTC (permalink / raw)
  To: rms; +Cc: emacs-devel, phillip.lord

[-- Attachment #1: Type: text/plain, Size: 1027 bytes --]

On Sat, Jan 16, 2016 at 11:10 AM Richard Stallman <rms@gnu.org> wrote:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
> "Deprecated" is neither weaker nor stronger than "obsolete".  Rather,
> they are different in quality.
>
> "Obsolete" means "This was useful before, but not now, since the
> context has changed."  "Deprecated" means "We disapprove of this."
>

Sounds like it might not make sense to transition from deprecated to
obsolete then.

Given the state of the discussion, I can write this up somewhere in the
source - maybe a README in the osbsolete dir, or a note somewhere in admin
dir?  If anyone has any advice on where would be good, let me know.


>
> --
> Dr Richard Stallman
> President, Free Software Foundation (gnu.org, fsf.org)
> Internet Hall-of-Famer (internethalloffame.org)
> Skype: No way! See stallman.org/skype.html.
>
>

[-- Attachment #2: Type: text/html, Size: 1831 bytes --]

^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-12  4:24   ` Stefan Monnier
@ 2016-01-19  5:28     ` John Wiegley
  2016-01-20  2:54       ` Richard Stallman
  0 siblings, 1 reply; 128+ messages in thread
From: John Wiegley @ 2016-01-19  5:28 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 722 bytes --]

>>>>> Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> We've repeatedly seen reports from people who jump 2 major releases, so I
>> think removing sooner than after a full major release cycle is not
>> something we should start with.

> Agreed. And that matches our past behavior: we generally purge features
> marked obsolete more than 2 major versions ago (tho the condition shouldn't
> be based on counting major versions but on years, IMO).

I like this suggestion as well, and would like to delay purging until after a
full major release cycle.

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 629 bytes --]

^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-18 18:47             ` Andrew Hyatt
@ 2016-01-19 13:51               ` Richard Stallman
  0 siblings, 0 replies; 128+ messages in thread
From: Richard Stallman @ 2016-01-19 13:51 UTC (permalink / raw)
  To: Andrew Hyatt; +Cc: emacs-devel, phillip.lord

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

If we want to have two stages of obsolescence, we can find names for
them.  The real question is the substance: do we want two stages, and
if so, what do they mean?

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-16  4:13         ` Andrew Hyatt
  2016-01-16 19:10           ` Richard Stallman
@ 2016-01-19 14:54           ` Phillip Lord
  1 sibling, 0 replies; 128+ messages in thread
From: Phillip Lord @ 2016-01-19 14:54 UTC (permalink / raw)
  To: Andrew Hyatt; +Cc: Richard Stallman, emacs-devel

Andrew Hyatt <ahyatt@gmail.com> writes:

> phillip.lord@russet.org.uk (Phillip Lord) writes:
>
>> Richard Stallman <rms@gnu.org> writes:
>>>   > Also, can you give an example of something that is obsolete but
>>>   > shouldn't be removed?  That might help me understand your concern.
>>>
>>> defadvice might be a good example.
>>
>> Perhaps we need an intermediate directory, called "deprecated". Not
>> obsolete, should probably still autoload -- putting defadvice into
>> obsolete will break some packages for this reason alone, but should
>> produce warnings.
>>
>> The intention would be that "deprecated" packages would move to
>> "obsolete" there after.
>
> What would the difference be between deprecated and obsolete, then?  Is
> it just that obsolete would definitely be deleted and deprecated only
> might be?


Autoloads. Obsolete does not autoload. So, for example,

M-x longlines-mode

does not work in current emacs. You need to do

M-x load-library   longlines-mode

first. So, for example, making advice.el obsolete would break package
using defadvice unless advice.el were forceably loaded somewhere.

Phil



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-19  5:28     ` John Wiegley
@ 2016-01-20  2:54       ` Richard Stallman
  2016-01-20  7:25         ` John Wiegley
  0 siblings, 1 reply; 128+ messages in thread
From: Richard Stallman @ 2016-01-20  2:54 UTC (permalink / raw)
  To: John Wiegley; +Cc: monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > Agreed. And that matches our past behavior: we generally purge features
  > > marked obsolete more than 2 major versions ago (tho the condition shouldn't
  > > be based on counting major versions but on years, IMO).

  > I like this suggestion as well, and would like to delay purging until after a
  > full major release cycle.

I think we should state that as a lower bound, a minimum period to
wait, not as a default.  To have a default waiting period before
deleting obsolete features would lead us to act rigidly, rather than
considering in each case what is best for the users.



-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-20  2:54       ` Richard Stallman
@ 2016-01-20  7:25         ` John Wiegley
  2016-01-20 17:05           ` Andrew Hyatt
  0 siblings, 1 reply; 128+ messages in thread
From: John Wiegley @ 2016-01-20  7:25 UTC (permalink / raw)
  To: Richard Stallman; +Cc: monnier, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 813 bytes --]

>>>>> Richard Stallman <rms@gnu.org> writes:

> I think we should state that as a lower bound, a minimum period to wait, not
> as a default. To have a default waiting period before deleting obsolete
> features would lead us to act rigidly, rather than considering in each case
> what is best for the users.

I'm quite OK with being flexible about when we feel it's time to delete old
code.

To summarize the final position: Once code has been in "obsolete" for a
complete release cycle, removal may be recommended by those who feel it's time
for the code to go. Once it's truly gone, any bugs against it and remaining
documentation can follow.

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 629 bytes --]

^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-20  7:25         ` John Wiegley
@ 2016-01-20 17:05           ` Andrew Hyatt
  2016-01-20 17:49             ` Eli Zaretskii
  2016-01-21  3:02             ` Richard Stallman
  0 siblings, 2 replies; 128+ messages in thread
From: Andrew Hyatt @ 2016-01-20 17:05 UTC (permalink / raw)
  To: John Wiegley, Richard Stallman, monnier, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1798 bytes --]

On Tue, Jan 19, 2016 at 11:29 PM John Wiegley <jwiegley@gmail.com> wrote:

> >>>>> Richard Stallman <rms@gnu.org> writes:
>
> > I think we should state that as a lower bound, a minimum period to wait,
> not
> > as a default. To have a default waiting period before deleting obsolete
> > features would lead us to act rigidly, rather than considering in each
> case
> > what is best for the users.
>
> I'm quite OK with being flexible about when we feel it's time to delete old
> code.
>
> To summarize the final position: Once code has been in "obsolete" for a
> complete release cycle, removal may be recommended by those who feel it's
> time
> for the code to go. Once it's truly gone, any bugs against it and remaining
> documentation can follow.
>

I think that summary has one key difference to what we previously
discussed, and I think that difference is problematic.

My goal in starting this thread was to find a way for emacs to be able to
remove functionality.  But the proposal, as John puts it, would in effect
keep code around forever.  Someone will have to, at the right time, make an
argument that the code should be removed, and be willing to advocate for
it.  This is too high a burden for code that's been in obsolete for years.
I think the burden should be on people to advocate for it's continued
existence.

Specifically, we can, at the start of a major release, put out a list of
all obsolete functionality that the maintainer feels is safe to delete, and
ask if anyone has objections to deleting them.

Making the default to delete instead of keep will have a real difference on
how much code actually gets removed.


> --
> John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
> http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2
>

[-- Attachment #2: Type: text/html, Size: 2529 bytes --]

^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-20 17:05           ` Andrew Hyatt
@ 2016-01-20 17:49             ` Eli Zaretskii
  2016-01-20 19:52               ` John Wiegley
  2016-01-21  3:02             ` Richard Stallman
  1 sibling, 1 reply; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-20 17:49 UTC (permalink / raw)
  To: Andrew Hyatt; +Cc: johnw, emacs-devel, rms, monnier

> From: Andrew Hyatt <ahyatt@gmail.com>
> Date: Wed, 20 Jan 2016 17:05:01 +0000
> 
> Specifically, we can, at the start of a major release, put out a list of all
> obsolete functionality that the maintainer feels is safe to delete, and ask if
> anyone has objections to deleting them. 

I think all John (and Richard) are saying is that the person who puts
out that list should him/herself make judgment calls about the items,
and perhaps remove some of them from the list even without asking.

As long as the removal is not done by a program, but by humans, I
think considering each candidate before producing the list is a
reasonable compromise.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-20 17:49             ` Eli Zaretskii
@ 2016-01-20 19:52               ` John Wiegley
  2016-01-20 20:38                 ` Andrés Ramírez
  2016-01-23 21:22                 ` Andrew Hyatt
  0 siblings, 2 replies; 128+ messages in thread
From: John Wiegley @ 2016-01-20 19:52 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Andrew Hyatt, emacs-devel, rms, monnier

[-- Attachment #1: Type: text/plain, Size: 1292 bytes --]

>>>>> Eli Zaretskii <eliz@gnu.org> writes:

> As long as the removal is not done by a program, but by humans, I think
> considering each candidate before producing the list is a reasonable
> compromise.

Right. I imagine that even without such a list, the process will look
something like this:

  1. Core developer looks at bug.
  2. Sees it is in "obsolete" code.
  3. Sees it has been "obsolete" for a while.
  4. Asks list, "Hey, can I just delete this code and the bug?"
  5. Hears deafening applause of consent.
  6. Happiness is restored.

Our biggest complaint about obsolete code is not its existence, but having to
tend to it; and so, this new policy gives us a way to do decisively deal with
it after a certain period of time.

Likewise, if an obsolete file never has any bugs, I'm not opposed to letting
it stay in "obsolete" forever. And yet, if someone requests that it be removed
after the appropriate amount of time, that's OK too.

The point is that we get to decide, not a mechanistic process, in the case
that someone knows of a good reason to keep that code around for a few
releases more.

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 629 bytes --]

^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-20 19:52               ` John Wiegley
@ 2016-01-20 20:38                 ` Andrés Ramírez
  2016-01-20 20:46                   ` John Wiegley
  2016-01-20 20:52                   ` Eli Zaretskii
  2016-01-23 21:22                 ` Andrew Hyatt
  1 sibling, 2 replies; 128+ messages in thread
From: Andrés Ramírez @ 2016-01-20 20:38 UTC (permalink / raw)
  To: Eli Zaretskii, Andrew Hyatt, rms, monnier, emacs-devel

Hi.

What about byte-compilation.
Does obsolete packages should be byte-compiled when compiling emacs?

BR
On Wed, 20 Jan 2016 14:52:20 -0500,
John Wiegley wrote:
> 
> [1  <text/plain (quoted-printable)>]
> >>>>> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > As long as the removal is not done by a program, but by humans, I think
> > considering each candidate before producing the list is a reasonable
> > compromise.
> 
> Right. I imagine that even without such a list, the process will look
> something like this:
> 
>   1. Core developer looks at bug.
>   2. Sees it is in "obsolete" code.
>   3. Sees it has been "obsolete" for a while.
>   4. Asks list, "Hey, can I just delete this code and the bug?"
>   5. Hears deafening applause of consent.
>   6. Happiness is restored.
> 
> Our biggest complaint about obsolete code is not its existence, but having to
> tend to it; and so, this new policy gives us a way to do decisively deal with
> it after a certain period of time.
> 
> Likewise, if an obsolete file never has any bugs, I'm not opposed to letting
> it stay in "obsolete" forever. And yet, if someone requests that it be removed
> after the appropriate amount of time, that's OK too.
> 
> The point is that we get to decide, not a mechanistic process, in the case
> that someone knows of a good reason to keep that code around for a few
> releases more.
> 
> -- 
> John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
> http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2
> [2 signature.asc <application/pgp-signature (7bit)>]
> No public key for C144D8F4F19FE630 created at 2016-01-20T14:52:20-0500 using RSA



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-20 20:38                 ` Andrés Ramírez
@ 2016-01-20 20:46                   ` John Wiegley
  2016-01-20 20:52                   ` Eli Zaretskii
  1 sibling, 0 replies; 128+ messages in thread
From: John Wiegley @ 2016-01-20 20:46 UTC (permalink / raw)
  To: Andrés Ramírez
  Cc: Eli Zaretskii, emacs-devel, Andrew Hyatt, monnier, rms

>>>>> Andrés Ramírez <sunshavi@fastmail.fm> writes:

> What about byte-compilation.
> Does obsolete packages should be byte-compiled when compiling emacs?

One thing that doing so would tell us is whether the model even loads with the
current version of Emacs. If it doesn't even function, it would be somewhat
strange to include it in the distribution.

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-20 20:38                 ` Andrés Ramírez
  2016-01-20 20:46                   ` John Wiegley
@ 2016-01-20 20:52                   ` Eli Zaretskii
  2016-01-20 21:03                     ` Andrés Ramírez
  1 sibling, 1 reply; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-20 20:52 UTC (permalink / raw)
  To: Andrés Ramírez; +Cc: ahyatt, emacs-devel, rms, monnier

> From: Andrés Ramírez <sunshavi@fastmail.fm>
> Date: Wed, 20 Jan 2016 15:38:05 -0500
> 
> What about byte-compilation.
> Does obsolete packages should be byte-compiled when compiling emacs?

Why not?



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-20 20:52                   ` Eli Zaretskii
@ 2016-01-20 21:03                     ` Andrés Ramírez
  2016-01-21  3:35                       ` Eli Zaretskii
  0 siblings, 1 reply; 128+ messages in thread
From: Andrés Ramírez @ 2016-01-20 21:03 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: ahyatt, emacs-devel, rms, monnier

On Wed, 20 Jan 2016 15:52:32 -0500,
Eli Zaretskii wrote:
> 
> > From: Andrés Ramírez <sunshavi@fastmail.fm>
> > Date: Wed, 20 Jan 2016 15:38:05 -0500
> > 
> > What about byte-compilation.
> > Does obsolete packages should be byte-compiled when compiling emacs?
> 
> Why not?
Cos we are trying to get rid of them. 
Regards



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-20 17:05           ` Andrew Hyatt
  2016-01-20 17:49             ` Eli Zaretskii
@ 2016-01-21  3:02             ` Richard Stallman
  2016-01-23 21:15               ` Andrew Hyatt
  1 sibling, 1 reply; 128+ messages in thread
From: Richard Stallman @ 2016-01-21  3:02 UTC (permalink / raw)
  To: Andrew Hyatt; +Cc: johnw, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  >   Someone will have to, at the right time, make an
  > argument that the code should be removed, and be willing to advocate for
  > it.  This is too high a burden for code that's been in obsolete for years.
  > I think the burden should be on people to advocate for it's continued
  > existence.

(You mean "its", not "it's".)

I disagree.  Deleting something that people once used
should not be semiautomatic.

How about proposing some obsolete features for deletion
and we can think about deleting them in Emacs 25.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-20 21:03                     ` Andrés Ramírez
@ 2016-01-21  3:35                       ` Eli Zaretskii
  0 siblings, 0 replies; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-21  3:35 UTC (permalink / raw)
  To: Andrés Ramírez; +Cc: ahyatt, emacs-devel, rms, monnier

> From: Andrés Ramírez <sunshavi@fastmail.fm>
> Cc: ahyatt@gmail.com,
> 	rms@gnu.org,
> 	monnier@iro.umontreal.ca,
> 	emacs-devel@gnu.org
> Date: Wed, 20 Jan 2016 16:03:01 -0500
> 
> On Wed, 20 Jan 2016 15:52:32 -0500,
> Eli Zaretskii wrote:
> > 
> > > From: Andrés Ramírez <sunshavi@fastmail.fm>
> > > Date: Wed, 20 Jan 2016 15:38:05 -0500
> > > 
> > > What about byte-compilation.
> > > Does obsolete packages should be byte-compiled when compiling emacs?
> > 
> > Why not?
> Cos we are trying to get rid of them. 

No, we are not.  When we decide to get rid of them, we delete them.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-21  3:02             ` Richard Stallman
@ 2016-01-23 21:15               ` Andrew Hyatt
  2016-01-23 22:03                 ` Drew Adams
                                   ` (2 more replies)
  0 siblings, 3 replies; 128+ messages in thread
From: Andrew Hyatt @ 2016-01-23 21:15 UTC (permalink / raw)
  To: Richard Stallman; +Cc: johnw, monnier, emacs-devel

Richard Stallman <rms@gnu.org> writes:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   >   Someone will have to, at the right time, make an
>   > argument that the code should be removed, and be willing to advocate for
>   > it.  This is too high a burden for code that's been in obsolete for years.
>   > I think the burden should be on people to advocate for it's continued
>   > existence.
>
> (You mean "its", not "it's".)
>
> I disagree.  Deleting something that people once used
> should not be semiautomatic.
>
> How about proposing some obsolete features for deletion
> and we can think about deleting them in Emacs 25.

Here are the packages that are eligible for deletion in Emacs 25 (all
obsolete since before Emacs 24):

awk-mode
cl-compat
iso-acc, iso-insert, iso-swed
keyswap
options
resume
scribe
spell
swedish
sym-comp
vc-mcvs

Most of these seem to be unused. I did a Google search for each of them,
but only resume.el and cl-compat had any notable reference. In addition,
vc-mcvs states that it no longer works with vc in Emacs 23, so that
seems like a pretty obvious candidate to go.  And awk-mode is now
implemented by cc-mode, I believe.

I think we should delete all of these in Emacs 25. The one I'm least
sure of deleting is cl-compat, because I don't know enough about the
history of cl compatibility, and how much the current packages replace
this one. But I think we should take a chance - if removing any package
turns out to be a bad idea, we can put it back.

Is there anything here you think would be dangerous to delete?




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-20 19:52               ` John Wiegley
  2016-01-20 20:38                 ` Andrés Ramírez
@ 2016-01-23 21:22                 ` Andrew Hyatt
  1 sibling, 0 replies; 128+ messages in thread
From: Andrew Hyatt @ 2016-01-23 21:22 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, rms, monnier

John Wiegley <jwiegley@gmail.com> writes:

>>>>>> Eli Zaretskii <eliz@gnu.org> writes:
>
>> As long as the removal is not done by a program, but by humans, I think
>> considering each candidate before producing the list is a reasonable
>> compromise.
>
> Right. I imagine that even without such a list, the process will look
> something like this:
>
>   1. Core developer looks at bug.
>   2. Sees it is in "obsolete" code.
>   3. Sees it has been "obsolete" for a while.
>   4. Asks list, "Hey, can I just delete this code and the bug?"
>   5. Hears deafening applause of consent.
>   6. Happiness is restored.
>
> Our biggest complaint about obsolete code is not its existence, but having to
> tend to it; and so, this new policy gives us a way to do decisively deal with
> it after a certain period of time.
>
> Likewise, if an obsolete file never has any bugs, I'm not opposed to letting
> it stay in "obsolete" forever. And yet, if someone requests that it be removed
> after the appropriate amount of time, that's OK too.
>
> The point is that we get to decide, not a mechanistic process, in the case
> that someone knows of a good reason to keep that code around for a few
> releases more.

I guess I'm more of a fan of mechanistic process since it forces action
and decisions, but it sounds like I'm the only one who thinks this way.
The process you propose seems fine, and I can or anyone else can
aggressively push for obsolete package deletion under it.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* RE: A proposal for removing obsolete packages
  2016-01-23 21:15               ` Andrew Hyatt
@ 2016-01-23 22:03                 ` Drew Adams
  2016-01-24  1:02                   ` Andrew Hyatt
  2016-01-25  1:42                 ` Richard Stallman
  2016-01-26 16:43                 ` A proposal for removing obsolete packages John Wiegley
  2 siblings, 1 reply; 128+ messages in thread
From: Drew Adams @ 2016-01-23 22:03 UTC (permalink / raw)
  To: Andrew Hyatt, Richard Stallman; +Cc: johnw, monnier, emacs-devel

> Here are the packages that are eligible for deletion in Emacs 25 (all
> obsolete since before Emacs 24):
> 
> options

FWIW, wrt `options.el':

1. Command `list-options' lists all user options, together with their
current values and their documentation.

That still seems useful to me.  If it is not, we should tell users
what is its specific replacement.

I see only this in the doc string of `list-options':

  "It is now better to use Customize instead."

("instead" is redundant here, BTW.)

And this message is shown at the top of the `list-options' output:

  "This facility is obsolete; we recommend using M-x customize instead."

Really?  Just how do you "use Customize" to get a listing such as
`list-options' provides?  How do you use `M-x customize' to get
such a listing?

I don't think you can get such a listing.  Certainly not with just
`M-x customize'.  And `customize-apropos .*' doesn't give you the
same thing (no complete doc strings, and not just options, etc.).

If I'm right that there is no real substitute provided by Customize
then I think that command `list-options' (renamed, if necessary)
should be kept.  It could be moved to one of the `cus*.el' files,
if you really plan to toss `options.el'.


2. Similarly, I think that command `edit-options' is still useful.

And yes, I'm familiar with Customize, and I use it often.  But I
don't see that it replaces the specific behavior offered by
`options.el'.  If I'm right about `edit-options' not having a
replacement, please consider keeping it too, possibly moving it
to one of the `cus*.el' files.


3. It is true that `edit-options' does not DTRT when an option has
a `:set' function etc.  It simply uses `set' to set the new value.
(This is true also of command `set-variable', BTW.)  To improve it,
we could make it use a Customize function such as
`customize-set-variable', which does DTRT.


4. I might have said the above when `options.el' was considered
for deprecation.  Dunno.

In any case, I've said it now - I don't see why this library needs
to be deprecated, much less removed.  It represents zero maintenance
burden, unless I'm missing something.

Sure, we want to encourage users to use Customize for most of their
user-option needs.  But I don't see the specific features offered
by `options.el' being provided by Customize.  And I think they are
useful features.

For all the user complaints we hear about Customize (and I generally
defend Customize, though I agree that the UI leaves something to be
desired), I do not recall a single complaint about the commands
`list-options' and `edit-options'.  The listing is clear and easy
to use.

Given #3, above, we could decide to keep only `list-options', but I
think a better approach would be to keep both, possibly improving
`edit-options' to take `:set' etc. into account.  Another alternative
would be for the editing keys to just pop to a relevant Customize
buffer for the given option.

`options.el' provides a useful view of the user options.  I think
that such a view is missing with Customize.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-23 22:03                 ` Drew Adams
@ 2016-01-24  1:02                   ` Andrew Hyatt
  2016-01-24  1:08                     ` Andrew Hyatt
  2016-01-24  1:56                     ` Drew Adams
  0 siblings, 2 replies; 128+ messages in thread
From: Andrew Hyatt @ 2016-01-24  1:02 UTC (permalink / raw)
  To: Drew Adams; +Cc: johnw, emacs-devel, Richard Stallman, monnier

Drew Adams <drew.adams@oracle.com> writes:

>> Here are the packages that are eligible for deletion in Emacs 25 (all
>> obsolete since before Emacs 24):
>> 
>> options
>
> FWIW, wrt `options.el':
>
> 1. Command `list-options' lists all user options, together with their
> current values and their documentation.
>
> That still seems useful to me.  If it is not, we should tell users
> what is its specific replacement.
>
> I see only this in the doc string of `list-options':
>
>   "It is now better to use Customize instead."
>
> ("instead" is redundant here, BTW.)
>
> And this message is shown at the top of the `list-options' output:
>
>   "This facility is obsolete; we recommend using M-x customize instead."
>
> Really?  Just how do you "use Customize" to get a listing such as
> `list-options' provides?  How do you use `M-x customize' to get
> such a listing?
>
> I don't think you can get such a listing.  Certainly not with just
> `M-x customize'.  And `customize-apropos .*' doesn't give you the
> same thing (no complete doc strings, and not just options, etc.).
>
> If I'm right that there is no real substitute provided by Customize
> then I think that command `list-options' (renamed, if necessary)
> should be kept.  It could be moved to one of the `cus*.el' files,
> if you really plan to toss `options.el'.

I hadn't used options before, but I tried now.  I guess I don't see the
usefulness of the command.  What I thought you were described above
seems useful indeed - a list of everything customized (for those who
don't want to fiddle with elisp).  But list-options instead gives much,
much more than that in a buffer 38k lines long.  What is the use of
this, and why is it more useful than, say, customize-browse?

>
>
> 2. Similarly, I think that command `edit-options' is still useful.
>
> And yes, I'm familiar with Customize, and I use it often.  But I
> don't see that it replaces the specific behavior offered by
> `options.el'.  If I'm right about `edit-options' not having a
> replacement, please consider keeping it too, possibly moving it
> to one of the `cus*.el' files.
>
>
> 3. It is true that `edit-options' does not DTRT when an option has
> a `:set' function etc.  It simply uses `set' to set the new value.
> (This is true also of command `set-variable', BTW.)  To improve it,
> we could make it use a Customize function such as
> `customize-set-variable', which does DTRT.
>
>
> 4. I might have said the above when `options.el' was considered
> for deprecation.  Dunno.
>
> In any case, I've said it now - I don't see why this library needs
> to be deprecated, much less removed.  It represents zero maintenance
> burden, unless I'm missing something.
>
> Sure, we want to encourage users to use Customize for most of their
> user-option needs.  But I don't see the specific features offered
> by `options.el' being provided by Customize.  And I think they are
> useful features.
>
> For all the user complaints we hear about Customize (and I generally
> defend Customize, though I agree that the UI leaves something to be
> desired), I do not recall a single complaint about the commands
> `list-options' and `edit-options'.  The listing is clear and easy
> to use.
>
> Given #3, above, we could decide to keep only `list-options', but I
> think a better approach would be to keep both, possibly improving
> `edit-options' to take `:set' etc. into account.  Another alternative
> would be for the editing keys to just pop to a relevant Customize
> buffer for the given option.
>
> `options.el' provides a useful view of the user options.  I think
> that such a view is missing with Customize.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-24  1:02                   ` Andrew Hyatt
@ 2016-01-24  1:08                     ` Andrew Hyatt
  2016-01-24  1:56                     ` Drew Adams
  1 sibling, 0 replies; 128+ messages in thread
From: Andrew Hyatt @ 2016-01-24  1:08 UTC (permalink / raw)
  To: Drew Adams; +Cc: johnw, emacs-devel, Richard Stallman, monnier

[-- Attachment #1: Type: text/plain, Size: 4193 bytes --]

On Sat, Jan 23, 2016 at 8:02 PM Andrew Hyatt <ahyatt@gmail.com> wrote:

> Drew Adams <drew.adams@oracle.com> writes:
>
> >> Here are the packages that are eligible for deletion in Emacs 25 (all
> >> obsolete since before Emacs 24):
> >>
> >> options
> >
> > FWIW, wrt `options.el':
> >
> > 1. Command `list-options' lists all user options, together with their
> > current values and their documentation.
> >
> > That still seems useful to me.  If it is not, we should tell users
> > what is its specific replacement.
> >
> > I see only this in the doc string of `list-options':
> >
> >   "It is now better to use Customize instead."
> >
> > ("instead" is redundant here, BTW.)
> >
> > And this message is shown at the top of the `list-options' output:
> >
> >   "This facility is obsolete; we recommend using M-x customize instead."
> >
> > Really?  Just how do you "use Customize" to get a listing such as
> > `list-options' provides?  How do you use `M-x customize' to get
> > such a listing?
> >
> > I don't think you can get such a listing.  Certainly not with just
> > `M-x customize'.  And `customize-apropos .*' doesn't give you the
> > same thing (no complete doc strings, and not just options, etc.).
> >
> > If I'm right that there is no real substitute provided by Customize
> > then I think that command `list-options' (renamed, if necessary)
> > should be kept.  It could be moved to one of the `cus*.el' files,
> > if you really plan to toss `options.el'.
>
> I hadn't used options before, but I tried now.  I guess I don't see the
> usefulness of the command.  What I thought you were described above
> seems useful indeed - a list of everything customized (for those who
> don't want to fiddle with elisp).  But list-options instead gives much,
> much more than that in a buffer 38k lines long.  What is the use of
> this, and why is it more useful than, say, customize-browse?
>

Actually, after a few minutes of looking at customize, I see there is both
customize-saved (to customize everything the user has customized with
customize) and customize-rogue (to customize everything else that is
customized outside of customize).  These should, hopefully, solve your
use-case.  Does it?


>
> >
> >
> > 2. Similarly, I think that command `edit-options' is still useful.
> >
> > And yes, I'm familiar with Customize, and I use it often.  But I
> > don't see that it replaces the specific behavior offered by
> > `options.el'.  If I'm right about `edit-options' not having a
> > replacement, please consider keeping it too, possibly moving it
> > to one of the `cus*.el' files.
> >
> >
> > 3. It is true that `edit-options' does not DTRT when an option has
> > a `:set' function etc.  It simply uses `set' to set the new value.
> > (This is true also of command `set-variable', BTW.)  To improve it,
> > we could make it use a Customize function such as
> > `customize-set-variable', which does DTRT.
> >
> >
> > 4. I might have said the above when `options.el' was considered
> > for deprecation.  Dunno.
> >
> > In any case, I've said it now - I don't see why this library needs
> > to be deprecated, much less removed.  It represents zero maintenance
> > burden, unless I'm missing something.
> >
> > Sure, we want to encourage users to use Customize for most of their
> > user-option needs.  But I don't see the specific features offered
> > by `options.el' being provided by Customize.  And I think they are
> > useful features.
> >
> > For all the user complaints we hear about Customize (and I generally
> > defend Customize, though I agree that the UI leaves something to be
> > desired), I do not recall a single complaint about the commands
> > `list-options' and `edit-options'.  The listing is clear and easy
> > to use.
> >
> > Given #3, above, we could decide to keep only `list-options', but I
> > think a better approach would be to keep both, possibly improving
> > `edit-options' to take `:set' etc. into account.  Another alternative
> > would be for the editing keys to just pop to a relevant Customize
> > buffer for the given option.
> >
> > `options.el' provides a useful view of the user options.  I think
> > that such a view is missing with Customize.
>

[-- Attachment #2: Type: text/html, Size: 5390 bytes --]

^ permalink raw reply	[flat|nested] 128+ messages in thread

* RE: A proposal for removing obsolete packages
  2016-01-24  1:02                   ` Andrew Hyatt
  2016-01-24  1:08                     ` Andrew Hyatt
@ 2016-01-24  1:56                     ` Drew Adams
  2016-01-24 21:44                       ` Andrew Hyatt
  1 sibling, 1 reply; 128+ messages in thread
From: Drew Adams @ 2016-01-24  1:56 UTC (permalink / raw)
  To: Andrew Hyatt; +Cc: johnw, emacs-devel, Richard Stallman, monnier

> > Really?  Just how do you "use Customize" to get a listing such as
> > `list-options' provides?  How do you use `M-x customize' to get
> > such a listing?
> >
> > I don't think you can get such a listing.  Certainly not with just
> > `M-x customize'.  And `customize-apropos .*' doesn't give you the
> > same thing (no complete doc strings, and not just options, etc.).

Both of those messages are incorrect in what they tell users now.

> > If I'm right that there is no real substitute provided by Customize
> > then I think that command `list-options' (renamed, if necessary)
> > should be kept.  It could be moved to one of the `cus*.el' files,
> > if you really plan to toss `options.el'.
> 
> I hadn't used options before, but I tried now.  I guess I don't see
> the usefulness of the command.

It gives you a readable, searchable buffer of all of the options,
together with their values and complete doc strings.  To me, that
can be useful.  And I don't see that Customize provides any
replacement for it - nothing at all similar, AFAICT.

> What I thought you were described above
> seems useful indeed - a list of everything customized (for those who
> don't want to fiddle with elisp).

A list of everything that you have customized but not saved is a
different topic.  It is not what `list-options' is for.

But FWIW, the command you describe already exists:
`customize-customized' (though it returns info also about faces).

And command `customize-saved', if by "customized" you meant
customized and saved.

> But list-options instead gives much,
> much more than that in a buffer 38k lines long.

Yes.  It is not about options that you have customized - that's
a different topic.  And it's not just about listing all of the
options with one-line descriptions.  It's about what `list-options'
does: lists all options together with their current values and
complete doc strings.

> What is the use of this, and why is it more useful than, say,
> customize-browse?

See above for the usefulness.

There is no reason to compare it with `customize-browse' - that's
irrelevant, unless you are claiming that it provides the same
functionality and so is a replacement.

Just because `customize-browse' can be useful is no reason that
`list-options' cannot also be useful.

Similarly for `customize-apropos-options', which is more like
what `list-options' does (with a regexp of `.*').

And you cannot search across all (complete) doc strings with
`customize-apropos-options' - you need to open each entry
individually, to see its full doc string.

(Isearch could perhaps be modified to automatically open
`customize-apropos*' entries that have search hits, instead of
ignoring text in closed entries.  But that's not the case today.)

Anyway, you need not find the command useful for it to be useful
to others.  (There are people who do not find `customize-browse'
to be particularly useful...)

Try `apropos-documentation', which is not about options, but
which is another buffer that shows you complete doc strings,
across which you can search etc.  Useful, no?

An improvement to `list-options' could be to have it list only
matches for some apropos input.  But even now by listing all
options it can be useful.

If the `customize-apropos*' commands were improved to show
what `list-options' shows (searchable full doc strings and
current values) then `customize-apropos-options' might provide
a replacement for `list-options'.  But that's not yet the case.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-24  1:56                     ` Drew Adams
@ 2016-01-24 21:44                       ` Andrew Hyatt
  2016-01-25  2:37                         ` Drew Adams
  0 siblings, 1 reply; 128+ messages in thread
From: Andrew Hyatt @ 2016-01-24 21:44 UTC (permalink / raw)
  To: Drew Adams; +Cc: johnw, emacs-devel, Richard Stallman, monnier

Drew Adams <drew.adams@oracle.com> writes:

>> > Really?  Just how do you "use Customize" to get a listing such as
>> > `list-options' provides?  How do you use `M-x customize' to get
>> > such a listing?
>> >
>> > I don't think you can get such a listing.  Certainly not with just
>> > `M-x customize'.  And `customize-apropos .*' doesn't give you the
>> > same thing (no complete doc strings, and not just options, etc.).
>
> Both of those messages are incorrect in what they tell users now.
>
>> > If I'm right that there is no real substitute provided by Customize
>> > then I think that command `list-options' (renamed, if necessary)
>> > should be kept.  It could be moved to one of the `cus*.el' files,
>> > if you really plan to toss `options.el'.
>> 
>> I hadn't used options before, but I tried now.  I guess I don't see
>> the usefulness of the command.
>
> It gives you a readable, searchable buffer of all of the options,
> together with their values and complete doc strings.  To me, that
> can be useful.  And I don't see that Customize provides any
> replacement for it - nothing at all similar, AFAICT.
>
>> What I thought you were described above
>> seems useful indeed - a list of everything customized (for those who
>> don't want to fiddle with elisp).
>
> A list of everything that you have customized but not saved is a
> different topic.  It is not what `list-options' is for.
>
> But FWIW, the command you describe already exists:
> `customize-customized' (though it returns info also about faces).
>
> And command `customize-saved', if by "customized" you meant
> customized and saved.
>
>> But list-options instead gives much,
>> much more than that in a buffer 38k lines long.
>
> Yes.  It is not about options that you have customized - that's
> a different topic.  And it's not just about listing all of the
> options with one-line descriptions.  It's about what `list-options'
> does: lists all options together with their current values and
> complete doc strings.
>
>> What is the use of this, and why is it more useful than, say,
>> customize-browse?
>
> See above for the usefulness.
>
> There is no reason to compare it with `customize-browse' - that's
> irrelevant, unless you are claiming that it provides the same
> functionality and so is a replacement.
>
> Just because `customize-browse' can be useful is no reason that
> `list-options' cannot also be useful.
>
> Similarly for `customize-apropos-options', which is more like
> what `list-options' does (with a regexp of `.*').
>
> And you cannot search across all (complete) doc strings with
> `customize-apropos-options' - you need to open each entry
> individually, to see its full doc string.
>
> (Isearch could perhaps be modified to automatically open
> `customize-apropos*' entries that have search hits, instead of
> ignoring text in closed entries.  But that's not the case today.)
>
> Anyway, you need not find the command useful for it to be useful
> to others.  (There are people who do not find `customize-browse'
> to be particularly useful...)
>
> Try `apropos-documentation', which is not about options, but
> which is another buffer that shows you complete doc strings,
> across which you can search etc.  Useful, no?
>
> An improvement to `list-options' could be to have it list only
> matches for some apropos input.  But even now by listing all
> options it can be useful.
>
> If the `customize-apropos*' commands were improved to show
> what `list-options' shows (searchable full doc strings and
> current values) then `customize-apropos-options' might provide
> a replacement for `list-options'.  But that's not yet the case.

Everything you wrote above is pretty reasonable, and as far as I can
tell, correct.  Thanks for the explanation.

But this last paragraph seems wrong - if I run, for example,
(customize-apropos-options "beyond.*fill"), I see customize option for
2c-beyond-fill-column, complete with the value I've set and the
docstring, all easily searchable.

However, the functionality that appears missing to me is either to be
able to additionally search by docstring, or showing all options
(basically, (customize-apropos-options ".*") should work quickly and
give something useful, neither of which is true for me today.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-23 21:15               ` Andrew Hyatt
  2016-01-23 22:03                 ` Drew Adams
@ 2016-01-25  1:42                 ` Richard Stallman
  2016-01-25  4:41                   ` Andrew Hyatt
                                     ` (3 more replies)
  2016-01-26 16:43                 ` A proposal for removing obsolete packages John Wiegley
  2 siblings, 4 replies; 128+ messages in thread
From: Richard Stallman @ 2016-01-25  1:42 UTC (permalink / raw)
  To: Andrew Hyatt; +Cc: johnw, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > iso-acc, iso-insert, iso-swed

I think I had to use one of these to insert some non-ASCII characters
that didn't appear in my input method.  What is the replacement for these?
-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* RE: A proposal for removing obsolete packages
  2016-01-24 21:44                       ` Andrew Hyatt
@ 2016-01-25  2:37                         ` Drew Adams
  0 siblings, 0 replies; 128+ messages in thread
From: Drew Adams @ 2016-01-25  2:37 UTC (permalink / raw)
  To: Andrew Hyatt; +Cc: johnw, emacs-devel, Richard Stallman, monnier

> > (Isearch could perhaps be modified to automatically open
> > `customize-apropos*' entries that have search hits, instead of
> > ignoring text in closed entries.  But that's not the case today.)
...

> > An improvement to `list-options' could be to have it list only
> > matches for some apropos input.  But even now by listing all
> > options it can be useful.
> >
> > If the `customize-apropos*' commands were improved to show
> > what `list-options' shows (searchable full doc strings and
> > current values) then `customize-apropos-options' might provide
> > a replacement for `list-options'.  But that's not yet the case.
> 
> Everything you wrote above is pretty reasonable, and as far as I can
> tell, correct.  Thanks for the explanation.
> 
> But this last paragraph seems wrong - if I run, for example,
> (customize-apropos-options "beyond.*fill"), I see customize option for
> 2c-beyond-fill-column, complete with the value I've set and the
> docstring, all easily searchable.

With `emacs -q' in Emacs 24.5 or the latest Emacs 25 binary I have
(which is quite old now) I get:
(error "No customizable options matching beyond.*fill")

But yes, if there is only one option that matches the pattern then
the doc string is opened (shown completely).  If there is more
than one (a more typical case for use of an apropos command) then
the details are closed, showing only the first line of the doc
string and not showing the value.

> However, the functionality that appears missing to me is either to be
> able to additionally search by docstring, or showing all options
> (basically, (customize-apropos-options ".*") should work quickly and
> give something useful, neither of which is true for me today.

Yes.  Either it should be improved as suggested or `list-options'
should be retained (IMO).  (And `list-options' could itself be
improved as I indicated, so that it does apropos matching.)



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-25  1:42                 ` Richard Stallman
@ 2016-01-25  4:41                   ` Andrew Hyatt
  2016-01-25 15:37                     ` Entering Unicode characters Richard Stallman
  2016-01-25 13:01                   ` A proposal for removing obsolete packages Stefan Monnier
                                     ` (2 subsequent siblings)
  3 siblings, 1 reply; 128+ messages in thread
From: Andrew Hyatt @ 2016-01-25  4:41 UTC (permalink / raw)
  To: Richard Stallman; +Cc: johnw, monnier, emacs-devel

Richard Stallman <rms@gnu.org> writes:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > iso-acc, iso-insert, iso-swed
>
> I think I had to use one of these to insert some non-ASCII characters
> that didn't appear in my input method.  What is the replacement for these?

You should be able to get the common ones with the C-x 8 commands that
work out of the box.  For example, "C-x 8 ' e" gives é.  "C-x 8 RET"
should give you any unicode character by name.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-25  1:42                 ` Richard Stallman
  2016-01-25  4:41                   ` Andrew Hyatt
@ 2016-01-25 13:01                   ` Stefan Monnier
  2016-01-26  9:36                     ` Richard Stallman
  2016-01-25 15:46                   ` Eli Zaretskii
       [not found]                   ` <<m2a8nu46ff.fsf@gmail.com>
  3 siblings, 1 reply; 128+ messages in thread
From: Stefan Monnier @ 2016-01-25 13:01 UTC (permalink / raw)
  To: emacs-devel

> I think I had to use one of these to insert some non-ASCII characters
> that didn't appear in my input method.  What is the replacement for these?

Hard to tell without knowing what "these" are.  But we have lots of
different ways to insert characters, so there's no doubt that there is
a replacement.


        Stefan




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Entering Unicode characters
  2016-01-25  4:41                   ` Andrew Hyatt
@ 2016-01-25 15:37                     ` Richard Stallman
  2016-01-25 16:08                       ` Eli Zaretskii
                                         ` (2 more replies)
  0 siblings, 3 replies; 128+ messages in thread
From: Richard Stallman @ 2016-01-25 15:37 UTC (permalink / raw)
  To: Andrew Hyatt; +Cc: johnw, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > You should be able to get the common ones with the C-x 8 commands that
  > work out of the box.

C-x 8 may be a good replacement for iso-acc, iso-insert, iso-swed.

			   "C-x 8 RET"
  > should give you any unicode character by name.

That is useless in practice, because it requires users to know these
long and often obscure names.  When I wanted to do this, I was unable
to do it with C-x 8.  I was totally stumped!  All I could do was try
to find a file which had the character I wanted.

We need a way to enter any Unicode character that is EASY to use
and does not require using its official name.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-25  1:42                 ` Richard Stallman
  2016-01-25  4:41                   ` Andrew Hyatt
  2016-01-25 13:01                   ` A proposal for removing obsolete packages Stefan Monnier
@ 2016-01-25 15:46                   ` Eli Zaretskii
       [not found]                   ` <<m2a8nu46ff.fsf@gmail.com>
  3 siblings, 0 replies; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-25 15:46 UTC (permalink / raw)
  To: rms; +Cc: ahyatt, johnw, monnier, emacs-devel

> From: Richard Stallman <rms@gnu.org>
> Date: Sun, 24 Jan 2016 20:42:44 -0500
> Cc: johnw@gnu.org, monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
>   > iso-acc, iso-insert, iso-swed
> 
> I think I had to use one of these to insert some non-ASCII characters
> that didn't appear in my input method.  What is the replacement for these?

"C-x 8", mainly.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* RE: Entering Unicode characters
       [not found]                     ` <<E1aNjCP-0004Ya-Si@fencepost.gnu.org>
@ 2016-01-25 16:04                       ` Drew Adams
  2016-01-25 16:18                         ` Stefan Monnier
  0 siblings, 1 reply; 128+ messages in thread
From: Drew Adams @ 2016-01-25 16:04 UTC (permalink / raw)
  To: rms, Andrew Hyatt; +Cc: johnw, monnier, emacs-devel

> > "C-x 8 RET" should give you any unicode character by name.
> 
> That is useless in practice, because it requires users to know these
> long and often obscure names.  When I wanted to do this, I was unable
> to do it with C-x 8.  I was totally stumped!  All I could do was try
> to find a file which had the character I wanted.
> 
> We need a way to enter any Unicode character that is EASY to use
> and does not require using its official name.

It's a _lot_ easier if completion matching is at least substring,
and much easier still if you can combine multiple input patterns
to match (e.g. multiple substrings).

But yes, some of the char names are hard to imagine (and thus
match).  It would help if a user could narrow the choices by
specifying a character category, for example.

Even just providing a set of insertion commands for different
categories could help.  E.g., if you know you want a math symbol
then you complete against only math-symbol names.  Or if you want
a Greek character then you complete only against their names.

Emacs could at least provide such a set of insertion commands,
and let users decide when and whether to bind some of them.
`C-x 8 RET' is a very wide brush to paint with.  It is a great
command, IMO, but its power and generality can limit its usefulness
for quick insertion of a char from a limited set of chars.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-25 15:37                     ` Entering Unicode characters Richard Stallman
@ 2016-01-25 16:08                       ` Eli Zaretskii
  2016-01-25 17:20                         ` Vivek Dasmohapatra
  2016-01-25 18:59                       ` Marcin Borkowski
  2016-01-25 21:36                       ` Tianxiang Xiong
  2 siblings, 1 reply; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-25 16:08 UTC (permalink / raw)
  To: rms; +Cc: ahyatt, johnw, monnier, emacs-devel

> From: Richard Stallman <rms@gnu.org>
> Date: Mon, 25 Jan 2016 10:37:01 -0500
> Cc: johnw@gnu.org, monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
> We need a way to enter any Unicode character that is EASY to use
> and does not require using its official name.

Indeed, such a feature would be a welcome addition.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-25 16:04                       ` Entering Unicode characters Drew Adams
@ 2016-01-25 16:18                         ` Stefan Monnier
  0 siblings, 0 replies; 128+ messages in thread
From: Stefan Monnier @ 2016-01-25 16:18 UTC (permalink / raw)
  To: Drew Adams; +Cc: Andrew Hyatt, johnw, rms, emacs-devel

>> > "C-x 8 RET" should give you any unicode character by name.
>> That is useless in practice, because it requires users to know these
>> long and often obscure names.  When I wanted to do this, I was unable
>> to do it with C-x 8.  I was totally stumped!  All I could do was try
>> to find a file which had the character I wanted.
> It's a _lot_ easier if completion matching is at least substring,

Which it already is by default.

> But yes, some of the char names are hard to imagine (and thus
> match).  It would help if a user could narrow the choices by
> specifying a character category, for example.

I think for the cases corresponding to those obsolete iso-* packages,
even better would be to provide a "base character" and be offered
a choice among all those chars that build on it.


        Stefan



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-25 16:08                       ` Eli Zaretskii
@ 2016-01-25 17:20                         ` Vivek Dasmohapatra
  2016-01-25 17:51                           ` Teemu Likonen
  2016-01-25 20:12                           ` Eli Zaretskii
  0 siblings, 2 replies; 128+ messages in thread
From: Vivek Dasmohapatra @ 2016-01-25 17:20 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: ahyatt, johnw, emacs-devel, rms, monnier

[-- Attachment #1: Type: TEXT/PLAIN, Size: 447 bytes --]

> Indeed, such a feature would be a welcome addition.

For situations where xcompose is not availble, why not mimic
what xcompose does, albeit with a different prefix?

    AltGr " e → ë
    AltGr / o → ø
    AltGr t e a → ☕

That last one is a local mapping I have, but you get the idea.
They're even already divided up by locale in the

   /usr/share/X11/locale/*/Compose

files, so a lot of the tedious legwork has already been done.

^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-25 17:20                         ` Vivek Dasmohapatra
@ 2016-01-25 17:51                           ` Teemu Likonen
  2016-01-25 20:12                           ` Eli Zaretskii
  1 sibling, 0 replies; 128+ messages in thread
From: Teemu Likonen @ 2016-01-25 17:51 UTC (permalink / raw)
  To: Vivek Dasmohapatra
  Cc: ahyatt, rms, johnw, emacs-devel, monnier, Eli Zaretskii

[-- Attachment #1: Type: text/plain, Size: 503 bytes --]

Vivek Dasmohapatra [2016-01-25 17:20:38Z] wrote:

> For situations where xcompose is not availble, why not mimic
> what xcompose does, albeit with a different prefix?
>
>    AltGr " e → ë
>    AltGr / o → ø
>    AltGr t e a → ☕

Input method “rfc1345” is quite similar:

    &e:  →  ë
    &o/  →  ø
    &"6  →  “
    &"9  →  ”

-- 
/// Teemu Likonen   - .-..   <https://github.com/tlikonen> //
// PGP: 4E10 55DC 84E9 DFF6 13D7 8557 719D 69D3 2453 9450 ///

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 818 bytes --]

^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-25 15:37                     ` Entering Unicode characters Richard Stallman
  2016-01-25 16:08                       ` Eli Zaretskii
@ 2016-01-25 18:59                       ` Marcin Borkowski
  2016-01-25 19:28                         ` Drew Adams
  2016-01-26  8:38                         ` Oleh Krehel
  2016-01-25 21:36                       ` Tianxiang Xiong
  2 siblings, 2 replies; 128+ messages in thread
From: Marcin Borkowski @ 2016-01-25 18:59 UTC (permalink / raw)
  To: rms; +Cc: Andrew Hyatt, johnw, monnier, emacs-devel


On 2016-01-25, at 16:37, Richard Stallman <rms@gnu.org> wrote:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > You should be able to get the common ones with the C-x 8 commands that
>   > work out of the box.
>
> C-x 8 may be a good replacement for iso-acc, iso-insert, iso-swed.
>
> 			   "C-x 8 RET"
>   > should give you any unicode character by name.
>
> That is useless in practice, because it requires users to know these
> long and often obscure names.  When I wanted to do this, I was unable
> to do it with C-x 8.  I was totally stumped!  All I could do was try
> to find a file which had the character I wanted.
>
> We need a way to enter any Unicode character that is EASY to use
> and does not require using its official name.

Have you heard about autocompletion?

Sorry, could not resist.  In fact, I agree that C-x 8 RET with stock
Emacs is not the best experience, but either Icicles (which I used
previously) or Ivy (which I use now) make it much, much better.  Icicles
especially, since it displays the characters next to their names.  Ivy
is much faster, OTOH.

For instance, I can type

™ using C-x 8 RET trade RET
© using C-x 8 RET copyr <down> RET
💩 using C-x 8 RET poo RET (though, fortunately, my font does not support
this)

etc.

Also, TeX input method.  I have it as my default-input-method, and it's
really great, provided one is fluent in TeX (I am, quite).

And, do you think that something like a character table, divided into
categories, might be useful?

Best,

-- 
Marcin Borkowski
http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski
Faculty of Mathematics and Computer Science
Adam Mickiewicz University



^ permalink raw reply	[flat|nested] 128+ messages in thread

* RE: Entering Unicode characters
  2016-01-25 18:59                       ` Marcin Borkowski
@ 2016-01-25 19:28                         ` Drew Adams
  2016-01-26  8:38                         ` Oleh Krehel
  1 sibling, 0 replies; 128+ messages in thread
From: Drew Adams @ 2016-01-25 19:28 UTC (permalink / raw)
  To: Marcin Borkowski, rms; +Cc: Andrew Hyatt, johnw, monnier, emacs-devel

> > We need a way to enter any Unicode character that is EASY to use
> > and does not require using its official name.
> 
> Have you heard about autocompletion?
> 
> Sorry, could not resist.  In fact, I agree that C-x 8 RET with stock
> Emacs is not the best experience, but either Icicles (which I used
> previously) or Ivy (which I use now) make it much, much better.  Icicles
> especially, since it displays the characters next to their names.  Ivy
> is much faster, OTOH.

Icicles too can be instantaneous if you turn off the feature that you mention,
of showing the code points and characters themselves next to the name.

To do that, set `icicle-read-char-by-name-multi-completion-flag' to nil.

These are not just annotations, BTW - you can complete against any of
the 3: name, code point, or char, or any combination of them.  Why might
you complete against the character?  To see its name or code point.  Helpful
if the char is easy to enter.  E.g., what are the name and code point of `}'?
Type it and you see these two (equivalent) candidates:

 CLOSING CURLY BRACKET	7D	}
 RIGHT CURLY BRACKET	7D	}

You can also speed things up during cycling if you sacrifice display of
the current candidate's info in the mode line.  To do that, set
`icicle-help-in-mode-line-delay' to 0.

The doc string of `icicle-read-char-by-name' tells you all of this:

,----
| icicle-read-char-by-name is a compiled Lisp function.
| 
| (icicle-read-char-by-name PROMPT &optional NAMES)
| 
| Read a character by its Unicode name or hex number string.
| Display PROMPT and read a string that represents a character by its
| Unicode property `name' or `old-name'.  Return the char as a number.
| 
| You can use completion against the Unicode name of the character.
| 
| In Icicle mode, if `icicle-read-char-by-name-multi-completion-flag' is
| non-nil:
| 
| * The Unicode code point of the char and the char itself appear next
|   to the char name in `*Completions*' - WYSIWYG.
| 
| * The completion candidate is a multi-completion.  Its first part is
|   the char name.  Its second part is the code point, as a hexadecimal
|   numeral.  Its third part is the character.  This means that you can
|   alternatively type the code point or the character to see what the
|   name is.  You can complete the name or the code point, or both.
| 
| * When you cycle among candidates, regardless of whether buffer
|   `*Completions*' is shown, the current character and its code point
|   are shown in the mode line (provided user option
|   `icicle-help-in-mode-line-delay' is greater than zero).  The code
|   point is shown in hexadecimal, octal, and decimal notation.
| 
| If you use a dedicated `*Completions*' frame, then the font used in
| `*Completions*' is the same as the frame from which you invoked
| completion.
| 
| If you use library `doremi-frm.el' then you can increase the font size
| for `*Completions*' dynamically using `C-x -'.
| 
| As an alternative to completing the Unicode name or code point, you
| can just input the code point as a hexidecimal numeral or a number in
| hash notation: #o21430 for octal, #x2318 for hex, or #10r8984 for
| decimal.
| 
| Non-nil optional arg NAMES is an alist of names to use in place of the
| value returned by `icicle-ucs-names'.  It must have the same form as
| such a return value: (CHAR-NAME . CHAR-CODE).
`----



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-25 17:20                         ` Vivek Dasmohapatra
  2016-01-25 17:51                           ` Teemu Likonen
@ 2016-01-25 20:12                           ` Eli Zaretskii
  2016-01-26  1:24                             ` Vivek Dasmohapatra
  1 sibling, 1 reply; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-25 20:12 UTC (permalink / raw)
  To: Vivek Dasmohapatra; +Cc: ahyatt, johnw, emacs-devel, rms, monnier

> Date: Mon, 25 Jan 2016 17:20:38 +0000 (GMT)
> From: Vivek Dasmohapatra <vivek@etla.org>
> cc: rms@gnu.org, ahyatt@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, 
>     emacs-devel@gnu.org
> 
> > Indeed, such a feature would be a welcome addition.
> 
> For situations where xcompose is not availble, why not mimic
> what xcompose does, albeit with a different prefix?
> 
>     AltGr " e → ë
>     AltGr / o → ø
>     AltGr t e a → ☕

Sorry, I don't understand what you are proposing concretely.  When
xcompose is not available, what does Emacs see if you press, e.g.,
AltGr " e?  (You can use "C-h l" to find the answer.)  Does it at all
know that you pressed AltGr and not the left Alt (i.e. Meta) key?

And in any case, how is the above different from Emacs input methods?
There, too, a combination of keys produces a character that is not on
the keyboard.

Thanks.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-25 15:37                     ` Entering Unicode characters Richard Stallman
  2016-01-25 16:08                       ` Eli Zaretskii
  2016-01-25 18:59                       ` Marcin Borkowski
@ 2016-01-25 21:36                       ` Tianxiang Xiong
  2016-01-25 22:17                         ` Drew Adams
                                           ` (2 more replies)
  2 siblings, 3 replies; 128+ messages in thread
From: Tianxiang Xiong @ 2016-01-25 21:36 UTC (permalink / raw)
  To: emacs-devel

Richard Stallman <rms <at> gnu.org> writes:

>   > You should be able to get the common ones with the C-x 8 commands 
that
>   > work out of the box.
> 
> C-x 8 may be a good replacement for iso-acc, iso-insert, iso-swed.
> 
> 			   "C-x 8 RET"
>   > should give you any unicode character by name.
> 
> That is useless in practice, because it requires users to know these
> long and often obscure names.  When I wanted to do this, I was unable
> to do it with C-x 8.  I was totally stumped!  All I could do was try
> to find a file which had the character I wanted.
> 
> We need a way to enter any Unicode character that is EASY to use
> and does not require using its official name.
> 

Seems to me that this is a problem that should be solved by an 
incremental completion framework.

For example, the "helm-ucs" command from the Helm package provides the 
following features:

- List of all symbols by their proper names in a temporary buffer
- Incremental completion; e.g. I can type "Greek theta" and only symbols 
whose offical names contain the words "Greek" and "theta" are included 
in the result set.
- Preview of symbols (so you can easily see what it looks like and 
whether it's supported by your font)
- Hex character code
- Action menu specifying actions to take on a symbo (e.g. insert symbol, 
copy hex code, etc.)

A solution that does not involve the "official" name would only increase 
the cognitive load for the user because they'd have to know the 
"unofficial" name and how to map it to the official name. Considering 
the large number of symbols users may want to insert, this does not seem 
like a good solution.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* RE: Entering Unicode characters
  2016-01-25 21:36                       ` Tianxiang Xiong
@ 2016-01-25 22:17                         ` Drew Adams
  2016-01-25 22:26                           ` Tianxiang Xiong
  2016-01-26  9:39                         ` Richard Stallman
       [not found]                         ` <<E1aO05V-0007eR-Kw@fencepost.gnu.org>
  2 siblings, 1 reply; 128+ messages in thread
From: Drew Adams @ 2016-01-25 22:17 UTC (permalink / raw)
  To: Tianxiang Xiong, emacs-devel

> Seems to me that this is a problem that should be solved by an
> incremental completion framework.

What you describe is exactly what Icicles offers, FWIW.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-25 22:17                         ` Drew Adams
@ 2016-01-25 22:26                           ` Tianxiang Xiong
  0 siblings, 0 replies; 128+ messages in thread
From: Tianxiang Xiong @ 2016-01-25 22:26 UTC (permalink / raw)
  To: emacs-devel

Drew Adams <drew.adams <at> oracle.com> writes:

> 
> > Seems to me that this is a problem that should be solved by an
> > incremental completion framework.
> 
> What you describe is exactly what Icicles offers, FWIW.
> 

Yes, I'm sure there are other frameworks that can offer similar behavior 
as Helm. 

The point is that we should be looking at solutions that allow us to 
better manipulate existing data (in this case Unicode symbols), rather 
than creating new data to fit our too-weak tools.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-25 20:12                           ` Eli Zaretskii
@ 2016-01-26  1:24                             ` Vivek Dasmohapatra
  2016-01-26  3:34                               ` Eli Zaretskii
  0 siblings, 1 reply; 128+ messages in thread
From: Vivek Dasmohapatra @ 2016-01-26  1:24 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: ahyatt, johnw, emacs-devel, rms, monnier

> AltGr " e?  (You can use "C-h l" to find the answer.)  Does it at all
> know that you pressed AltGr and not the left Alt (i.e. Meta) key?

I wasn't proposing AltGr, merely explaining what xcompose used.

> And in any case, how is the above different from Emacs input methods?

It isn't. I merely meant that there is already a widespread mechanism
with a set of defined mnemonics which could be imported wholesale.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-26  1:24                             ` Vivek Dasmohapatra
@ 2016-01-26  3:34                               ` Eli Zaretskii
  0 siblings, 0 replies; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-26  3:34 UTC (permalink / raw)
  To: Vivek Dasmohapatra; +Cc: ahyatt, johnw, emacs-devel, rms, monnier

> Date: Tue, 26 Jan 2016 01:24:31 +0000 (GMT)
> From: Vivek Dasmohapatra <vivek@etla.org>
> cc: rms@gnu.org, ahyatt@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, 
>     emacs-devel@gnu.org
> 
> > AltGr " e?  (You can use "C-h l" to find the answer.)  Does it at all
> > know that you pressed AltGr and not the left Alt (i.e. Meta) key?
> 
> I wasn't proposing AltGr, merely explaining what xcompose used.
> 
> > And in any case, how is the above different from Emacs input methods?
> 
> It isn't. I merely meant that there is already a widespread mechanism
> with a set of defined mnemonics which could be imported wholesale.

I see, thanks for explaining.

I think that this kind of approach works well with accented
characters, but not with others, which are the majority in Unicode.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-25 18:59                       ` Marcin Borkowski
  2016-01-25 19:28                         ` Drew Adams
@ 2016-01-26  8:38                         ` Oleh Krehel
  1 sibling, 0 replies; 128+ messages in thread
From: Oleh Krehel @ 2016-01-26  8:38 UTC (permalink / raw)
  To: Marcin Borkowski; +Cc: Andrew Hyatt, johnw, emacs-devel, rms, monnier

[-- Attachment #1: Type: text/plain, Size: 606 bytes --]

Marcin Borkowski <mbork@mbork.pl> writes:

> On 2016-01-25, at 16:37, Richard Stallman <rms@gnu.org> wrote:

>> That is useless in practice, because it requires users to know these
>> long and often obscure names.  When I wanted to do this, I was unable
>> to do it with C-x 8.  I was totally stumped!  All I could do was try
>> to find a file which had the character I wanted.
>>
> Have you heard about autocompletion?

Here is the current capability of `counsel-unicode-char' which is
included in the GNU ELPA swiper package. Note how the regex boundaries
"\b" are used to closely match the letter "a".


[-- Attachment #2: counsel-unicode-char.png --]
[-- Type: image/png, Size: 130588 bytes --]

[-- Attachment #3: Type: text/plain, Size: 975 bytes --]


This command is meant to do the same as `insert-char' does.

The only issue is that the built-in `ucs-names' variable, which is
offered for completion, includes around 40000 entries. Maybe there
should be a way for the user to turn off the Unicode ranges she's never
interested in (see the division of ranges in the `nxml-unicode-blocks'
variable).  In the included screenshot, I've already disabled some
ranges that aren't interesting for me - my font doesn't have glyphs for
a large portion of these.

Another issue I've found when shortly examining the Unicode table is
that it provides these three categories:

1. Plain letters,

2. Composition characters, like COMBINING GRAVE ACCENT, COMBINING ACUTE
ACCENT etc.,

3 Plain letters pre-combined with the above composition chars.

So maybe the user should decide if she prefers to have 1+2 or 1+3 or
1+2+3, the latter option significantly increasing the number of
completion candidates (by around 2500).

    Oleh








^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-25 13:01                   ` A proposal for removing obsolete packages Stefan Monnier
@ 2016-01-26  9:36                     ` Richard Stallman
  2016-01-26 10:30                       ` Andreas Schwab
  0 siblings, 1 reply; 128+ messages in thread
From: Richard Stallman @ 2016-01-26  9:36 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > I think I had to use one of these to insert some non-ASCII characters
  > > that didn't appear in my input method.  What is the replacement for these?

  > Hard to tell without knowing what "these" are.

One of them was the dotless i, for Turkish.  But I'd have the same
problem for any Unicode character that doesn't have its own C-x 8
subcommand.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-25 21:36                       ` Tianxiang Xiong
  2016-01-25 22:17                         ` Drew Adams
@ 2016-01-26  9:39                         ` Richard Stallman
  2016-01-26 10:55                           ` Jean-Christophe Helary
                                             ` (4 more replies)
       [not found]                         ` <<E1aO05V-0007eR-Kw@fencepost.gnu.org>
  2 siblings, 5 replies; 128+ messages in thread
From: Richard Stallman @ 2016-01-26  9:39 UTC (permalink / raw)
  To: Tianxiang Xiong; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

Completion schemes can make it easier to enter long names that you
know.  They are no use for me in entering unusual characters, because 
I don't know their names.

I want a system that lets me choose them by seeing them on the screen.
I want to specify a language or script and see all its characters.

For instance, if I enter 'turkish' it should show me all the
characters used in Turkish.  Then I could pick the dotless i from the
buffer.

Would someone please implement this?

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-26  9:36                     ` Richard Stallman
@ 2016-01-26 10:30                       ` Andreas Schwab
  2016-01-27  0:46                         ` Richard Stallman
  0 siblings, 1 reply; 128+ messages in thread
From: Andreas Schwab @ 2016-01-26 10:30 UTC (permalink / raw)
  To: Richard Stallman; +Cc: Stefan Monnier, emacs-devel

Richard Stallman <rms@gnu.org> writes:

> One of them was the dotless i, for Turkish.  But I'd have the same
> problem for any Unicode character that doesn't have its own C-x 8
> subcommand.

It should be easy to add bindings for the missing characters to the C-x
8 map.  For example, the dotless i and the dotted I could be added as
`C-x 8 . i' and `C-x 8 . I', resp.

Andreas.

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-26  9:39                         ` Richard Stallman
@ 2016-01-26 10:55                           ` Jean-Christophe Helary
  2016-01-26 14:49                             ` Eli Zaretskii
  2016-01-26 11:31                           ` Yuri Khan
                                             ` (3 subsequent siblings)
  4 siblings, 1 reply; 128+ messages in thread
From: Jean-Christophe Helary @ 2016-01-26 10:55 UTC (permalink / raw)
  To: emacs-devel


> 2016/01/26 18:39、Richard Stallman <rms@gnu.org> のメール:
> 
> I want a system that lets me choose them by seeing them on the screen.
> I want to specify a language or script and see all its characters.
> 
> For instance, if I enter 'turkish' it should show me all the
> characters used in Turkish.  Then I could pick the dotless i from the
> buffer.
> 
> Would someone please implement this?

There is an input system imported from smartphones that is being implemented on some desktop OSes.

In my case it is OSX and it works like this: you choose a keyboard layout and then by pressing a key you know can have variants for 2 secs the list of variants is displayed along with a number under them. You can either use the arrows to select and enter the character or hit the corresponding number.

I just selected the Turkish qwerty layout and when I hit g for 2 secs I get ğ as a possibility. When I am in the US layout I don't get this possibility. In US I get èéêëēėę for e, ÿ for y, ûüùúū for u (and similar options of other vowels), I also get ßśš for s. If I do the same with a capital letter (holding Shift + the letter) I get all the possible capital letters for the selected letter, for ex. S offers ŚŠ but no capital ß.

That's a very convenient way to visually check and select characters.

Jean-Christophe Helary 


^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-26  9:39                         ` Richard Stallman
  2016-01-26 10:55                           ` Jean-Christophe Helary
@ 2016-01-26 11:31                           ` Yuri Khan
  2016-01-27  0:46                             ` Richard Stallman
  2016-01-26 12:40                           ` Marcin Borkowski
                                             ` (2 subsequent siblings)
  4 siblings, 1 reply; 128+ messages in thread
From: Yuri Khan @ 2016-01-26 11:31 UTC (permalink / raw)
  To: rms@gnu.org; +Cc: Tianxiang Xiong, Emacs developers

On Tue, Jan 26, 2016 at 3:39 PM, Richard Stallman <rms@gnu.org> wrote:

> I want a system that lets me choose them by seeing them on the screen.
> I want to specify a language or script and see all its characters.
>
> Would someone please implement this?

You might find the GNOME Character Map application satisfies your
needs. You can see all code points known to it, or all characters
covered by a specific font, or any of the above filtered by Unicode
block or by script. It also supports search by character code, name,
and aliases, and some cross-referencing facilities.

(Although I might prefer if it were an input method usable all over X
rather than a standalone application that you have to copy-and-paste
characters from.)



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-26  9:39                         ` Richard Stallman
  2016-01-26 10:55                           ` Jean-Christophe Helary
  2016-01-26 11:31                           ` Yuri Khan
@ 2016-01-26 12:40                           ` Marcin Borkowski
  2016-01-26 15:10                             ` Eli Zaretskii
  2016-01-26 17:08                           ` Tianxiang Xiong
  2016-02-06 11:56                           ` Helmut Eller
  4 siblings, 1 reply; 128+ messages in thread
From: Marcin Borkowski @ 2016-01-26 12:40 UTC (permalink / raw)
  To: rms; +Cc: Tianxiang Xiong, emacs-devel


On 2016-01-26, at 10:39, Richard Stallman <rms@gnu.org> wrote:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
> Completion schemes can make it easier to enter long names that you
> know.  They are no use for me in entering unusual characters, because 
> I don't know their names.

True, but often these names contain a word which is more or less obvious
to guess.

> I want a system that lets me choose them by seeing them on the screen.
> I want to specify a language or script and see all its characters.
>
> For instance, if I enter 'turkish' it should show me all the
> characters used in Turkish.  Then I could pick the dotless i from the
> buffer.
>
> Would someone please implement this?

I like this idea, though I do not know enough about Unicode etc to
implement it...

Best,

-- 
Marcin Borkowski
http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski
Faculty of Mathematics and Computer Science
Adam Mickiewicz University



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-26 10:55                           ` Jean-Christophe Helary
@ 2016-01-26 14:49                             ` Eli Zaretskii
  2016-01-26 14:54                               ` Stefan Monnier
                                                 ` (2 more replies)
  0 siblings, 3 replies; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-26 14:49 UTC (permalink / raw)
  To: Jean-Christophe Helary; +Cc: emacs-devel

> From: Jean-Christophe Helary <jean.christophe.helary@gmail.com>
> Date: Tue, 26 Jan 2016 19:55:49 +0900
> 
> There is an input system imported from smartphones that is being implemented on some desktop OSes.
> 
> In my case it is OSX and it works like this: you choose a keyboard layout and then by pressing a key you know can have variants for 2 secs the list of variants is displayed along with a number under them. You can either use the arrows to select and enter the character or hit the corresponding number.
> 
> I just selected the Turkish qwerty layout and when I hit g for 2 secs I get ğ as a possibility. When I am in the US layout I don't get this possibility. In US I get èéêëēėę for e, ÿ for y, ûüùúū for u (and similar options of other vowels), I also get ßśš for s. If I do the same with a capital letter (holding Shift + the letter) I get all the possible capital letters for the selected letter, for ex. S offers ŚŠ but no capital ß.
> 
> That's a very convenient way to visually check and select characters.

I think you are describing how Emacs input method work.  Try this:

  C-u C-\ turkish-postfix RET

then type i and watch the echo area.

The advantage of Emacs input methods is that they don't depend on the
locale.  (The disadvantage is that they only affect Emacs; but for
someone who lives inside Emacs, that's not a problem ;-)



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-26 14:49                             ` Eli Zaretskii
@ 2016-01-26 14:54                               ` Stefan Monnier
  2016-01-26 21:41                               ` Jean-Christophe Helary
  2016-01-27  0:47                               ` Richard Stallman
  2 siblings, 0 replies; 128+ messages in thread
From: Stefan Monnier @ 2016-01-26 14:54 UTC (permalink / raw)
  To: emacs-devel

> The advantage of Emacs input methods is that they don't depend on the
> locale.  (The disadvantage is that they only affect Emacs; but for
> someone who lives inside Emacs, that's not a problem ;-)

There's another difference: usually the echo area shows which other
characters you can type, rather than which characters you can get by
typing.  E.g. instead of showing "èéêëēėę", it might show something like
that [`'^"-.,].


        Stefan




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-26 12:40                           ` Marcin Borkowski
@ 2016-01-26 15:10                             ` Eli Zaretskii
  2016-01-27  0:47                               ` Richard Stallman
  0 siblings, 1 reply; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-26 15:10 UTC (permalink / raw)
  To: Marcin Borkowski; +Cc: tianxiang.xiong, rms, emacs-devel

> From: Marcin Borkowski <mbork@mbork.pl>
> Date: Tue, 26 Jan 2016 13:40:11 +0100
> Cc: Tianxiang Xiong <tianxiang.xiong@gmail.com>, emacs-devel@gnu.org
> 
> > I want a system that lets me choose them by seeing them on the screen.
> > I want to specify a language or script and see all its characters.
> >
> > For instance, if I enter 'turkish' it should show me all the
> > characters used in Turkish.  Then I could pick the dotless i from the
> > buffer.
> >
> > Would someone please implement this?
> 
> I like this idea, though I do not know enough about Unicode etc to
> implement it...

I don't think any deep knowledge about Unicode is needed.  What you
need is:

  . a way to display a range of Unicode characters and let the user
    select the one she wants (this should be able to handle a large
    range without annoying delays, e.g., by breaking such long ranges
    into smaller blocks and providing buttons to unhide and hide them)

  . a database of languages and the corresponding Unicode blocks (we
    already have that for scripts, but languages sometimes select
    narrower ranges, in particular in the Latin and Greek script
    parts)

The somewhat tricky part about the last item is that some languages
use non-contiguous portions of a block that is shared with other
languages.  The Cyrillic block is one good examples.  IWBNI the
feature would either refrain from displaying irrelevant characters, or
maybe display them with pale colors, to indicate that they are not
relevant to the language.

TIA



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-23 21:15               ` Andrew Hyatt
  2016-01-23 22:03                 ` Drew Adams
  2016-01-25  1:42                 ` Richard Stallman
@ 2016-01-26 16:43                 ` John Wiegley
  2016-01-26 17:32                   ` John Wiegley
  2 siblings, 1 reply; 128+ messages in thread
From: John Wiegley @ 2016-01-26 16:43 UTC (permalink / raw)
  To: Andrew Hyatt; +Cc: emacs-devel, Richard Stallman, monnier

[-- Attachment #1: Type: text/plain, Size: 516 bytes --]

>>>>> Andrew Hyatt <ahyatt@gmail.com> writes:

> Here are the packages that are eligible for deletion in Emacs 25 (all
> obsolete since before Emacs 24):

> awk-mode
> iso-acc, iso-insert, iso-swed
> keyswap
> options
> resume
> scribe
> spell
> swedish
> sym-comp
> vc-mcvs

Other than cl-compat, I'm OK with deleting these. Does anyone have any other
objections?

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 629 bytes --]

^ permalink raw reply	[flat|nested] 128+ messages in thread

* RE: Entering Unicode characters
       [not found]                         ` <<E1aO05V-0007eR-Kw@fencepost.gnu.org>
@ 2016-01-26 16:58                           ` Drew Adams
  0 siblings, 0 replies; 128+ messages in thread
From: Drew Adams @ 2016-01-26 16:58 UTC (permalink / raw)
  To: rms, Tianxiang Xiong; +Cc: emacs-devel

> Completion schemes can make it easier to enter long names that you
> know.  They are no use for me in entering unusual characters, because
> I don't know their names.
> 
> I want a system that lets me choose them by seeing them on the screen.
> I want to specify a language or script and see all its characters.
> 
> For instance, if I enter 'turkish' it should show me all the
> characters used in Turkish.  Then I could pick the dotless i from the
> buffer.

I agree that names don't always help.  Sometimes they do, though.
I guess that in this case they don't.

FWIW, if I use the pattern "turk" with either Icicles (for `C-x 8 RET')
or `apropos-char' (library apu.el), I see these chars listed.  As all
but one have "OLD TURKIC" in the name, I don't suppose they are what
you are after.  Dunno.  I agree that matching by language instead of
just char name would be a useful feature.

---

(This is from `apropos-char'.  The first column is the char, which my
font cannot display.  In the list buffer, `RET' provides details about
the char of the current line, and `^' inserts it into the original buffer.)

𐱈‎  OLD TURKIC LETTER ORKHON BASH    68680  0x10c48
𐱇‎  OLD TURKIC LETTER ORKHON OT      68679  0x10c47
𐱆‎  OLD TURKIC LETTER YENISEI AET    68678  0x10c46
𐱅‎  OLD TURKIC LETTER ORKHON AET     68677  0x10c45
𐱄‎  OLD TURKIC LETTER YENISEI AT     68676  0x10c44
𐱃‎  OLD TURKIC LETTER ORKHON AT      68675  0x10c43
𐱂‎  OLD TURKIC LETTER YENISEI ESH    68674  0x10c42
𐱁‎  OLD TURKIC LETTER ORKHON ESH     68673  0x10c41
𐱀‎  OLD TURKIC LETTER YENISEI ASH    68672  0x10c40
𐰿‎  OLD TURKIC LETTER ORKHON ASH     68671  0x10c3f
𐰾‎  OLD TURKIC LETTER ORKHON AES     68670  0x10c3e
𐰽‎  OLD TURKIC LETTER ORKHON AS      68669  0x10c3d
𐰼‎  OLD TURKIC LETTER ORKHON AER     68668  0x10c3c
𐰻‎  OLD TURKIC LETTER YENISEI AR     68667  0x10c3b
𐰺‎  OLD TURKIC LETTER ORKHON AR      68666  0x10c3a
𐰹‎  OLD TURKIC LETTER YENISEI OQ     68665  0x10c39
𐰸‎  OLD TURKIC LETTER ORKHON OQ      68664  0x10c38
𐰷‎  OLD TURKIC LETTER YENISEI IQ     68663  0x10c37
𐰶‎  OLD TURKIC LETTER ORKHON IQ      68662  0x10c36
𐰵‎  OLD TURKIC LETTER YENISEI AQ     68661  0x10c35
𐰴‎  OLD TURKIC LETTER ORKHON AQ      68660  0x10c34
𐰳‎  OLD TURKIC LETTER YENISEI EC     68659  0x10c33
𐰲‎  OLD TURKIC LETTER ORKHON EC      68658  0x10c32
𐰱‎  OLD TURKIC LETTER ORKHON IC      68657  0x10c31
𐰰‎  OLD TURKIC LETTER ORKHON OP      68656  0x10c30
𐰯‎  OLD TURKIC LETTER ORKHON EP      68655  0x10c2f
𐰮‎  OLD TURKIC LETTER YENISEI AENG   68654  0x10c2e
𐰭‎  OLD TURKIC LETTER ORKHON ENG     68653  0x10c2d
𐰬‎  OLD TURKIC LETTER YENISEI ANG    68652  0x10c2c
𐰫‎  OLD TURKIC LETTER YENISEI ENY    68651  0x10c2b
𐰪‎  OLD TURKIC LETTER ORKHON ENY     68650  0x10c2a
𐰩‎  OLD TURKIC LETTER YENISEI ENC    68649  0x10c29
𐰨‎  OLD TURKIC LETTER ORKHON ENC     68648  0x10c28
𐰧‎  OLD TURKIC LETTER YENISEI ENT    68647  0x10c27
𐰦‎  OLD TURKIC LETTER ORKHON ENT     68646  0x10c26
𐰥‎  OLD TURKIC LETTER YENISEI AEN    68645  0x10c25
𐰤‎  OLD TURKIC LETTER ORKHON AEN     68644  0x10c24
𐰣‎  OLD TURKIC LETTER ORKHON AN      68643  0x10c23
𐰢‎  OLD TURKIC LETTER ORKHON EM      68642  0x10c22
𐰡‎  OLD TURKIC LETTER ORKHON ELT     68641  0x10c21
𐰠‎  OLD TURKIC LETTER ORKHON AEL     68640  0x10c20
𐰟‎  OLD TURKIC LETTER YENISEI AL     68639  0x10c1f
𐰞‎  OLD TURKIC LETTER ORKHON AL      68638  0x10c1e
𐰝‎  OLD TURKIC LETTER YENISEI OEK    68637  0x10c1d
𐰜‎  OLD TURKIC LETTER ORKHON OEK     68636  0x10c1c
𐰛‎  OLD TURKIC LETTER YENISEI AEK    68635  0x10c1b
𐰚‎  OLD TURKIC LETTER ORKHON AEK     68634  0x10c1a
𐰙‎  OLD TURKIC LETTER YENISEI AEY    68633  0x10c19
𐰘‎  OLD TURKIC LETTER ORKHON AEY     68632  0x10c18
𐰗‎  OLD TURKIC LETTER YENISEI AY     68631  0x10c17
𐰖‎  OLD TURKIC LETTER ORKHON AY      68630  0x10c16
𐰕‎  OLD TURKIC LETTER YENISEI EZ     68629  0x10c15
𐰔‎  OLD TURKIC LETTER ORKHON EZ      68628  0x10c14
𐰓‎  OLD TURKIC LETTER ORKHON AED     68627  0x10c13
𐰒‎  OLD TURKIC LETTER YENISEI AD     68626  0x10c12
𐰑‎  OLD TURKIC LETTER ORKHON AD      68625  0x10c11
𐰐‎  OLD TURKIC LETTER YENISEI AEG    68624  0x10c10
𐰏‎  OLD TURKIC LETTER ORKHON AEG     68623  0x10c0f
𐰎‎  OLD TURKIC LETTER YENISEI AG     68622  0x10c0e
𐰍‎  OLD TURKIC LETTER ORKHON AG      68621  0x10c0d
𐰌‎  OLD TURKIC LETTER YENISEI AEB    68620  0x10c0c
𐰋‎  OLD TURKIC LETTER ORKHON AEB     68619  0x10c0b
𐰊‎  OLD TURKIC LETTER YENISEI AB     68618  0x10c0a
𐰉‎  OLD TURKIC LETTER ORKHON AB      68617  0x10c09
𐰈‎  OLD TURKIC LETTER YENISEI OE     68616  0x10c08
𐰇‎  OLD TURKIC LETTER ORKHON OE      68615  0x10c07
𐰆‎  OLD TURKIC LETTER ORKHON O       68614  0x10c06
𐰅‎  OLD TURKIC LETTER YENISEI E      68613  0x10c05
𐰄‎  OLD TURKIC LETTER YENISEI I      68612  0x10c04
𐰃‎  OLD TURKIC LETTER ORKHON I       68611  0x10c03
𐰂‎  OLD TURKIC LETTER YENISEI AE     68610  0x10c02
𐰁‎  OLD TURKIC LETTER YENISEI A      68609  0x10c01
𐰀‎  OLD TURKIC LETTER ORKHON A       68608  0x10c00
₺  TURKISH LIRA SIGN                 8378   0x20ba



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-26  9:39                         ` Richard Stallman
                                             ` (2 preceding siblings ...)
  2016-01-26 12:40                           ` Marcin Borkowski
@ 2016-01-26 17:08                           ` Tianxiang Xiong
  2016-01-26 17:37                             ` Drew Adams
                                               ` (2 more replies)
  2016-02-06 11:56                           ` Helmut Eller
  4 siblings, 3 replies; 128+ messages in thread
From: Tianxiang Xiong @ 2016-01-26 17:08 UTC (permalink / raw)
  To: emacs-devel

Richard Stallman <rms <at> gnu.org> writes:

> 
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> 
> Completion schemes can make it easier to enter long names that you
> know.  They are no use for me in entering unusual characters, because 
> I don't know their names.
> 
> I want a system that lets me choose them by seeing them on the screen.
> I want to specify a language or script and see all its characters.
> 
> For instance, if I enter 'turkish' it should show me all the
> characters used in Turkish.  Then I could pick the dotless i from the
> buffer.
> 
> Would someone please implement this?
> 

It seems that what Richard wants is something like Microsoft Word's 
character insertion modal window. See 
http://wordfaqs.mvps.org/images/SpecChars2.gif for an example.

You select a subset of characters in a character set (e.g. Greek 
letters) and are shown a modal window with visual representations of all 
the characters. You can then choose a character to insert into the 
document.

In Emacs, of course, we don't have modal windows, but we can have 
buffers that display the characters line-by-line.





^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-26 16:43                 ` A proposal for removing obsolete packages John Wiegley
@ 2016-01-26 17:32                   ` John Wiegley
  2016-02-03  4:45                     ` Andrew Hyatt
  0 siblings, 1 reply; 128+ messages in thread
From: John Wiegley @ 2016-01-26 17:32 UTC (permalink / raw)
  To: Andrew Hyatt; +Cc: emacs-devel, Richard Stallman, monnier

>>>>> John Wiegley <jwiegley@gmail.com> writes:

> Other than cl-compat, I'm OK with deleting these. Does anyone have any other
> objections?

According to objections from Drew about options, we'll keep that one as well.

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2



^ permalink raw reply	[flat|nested] 128+ messages in thread

* RE: Entering Unicode characters
  2016-01-26 17:08                           ` Tianxiang Xiong
@ 2016-01-26 17:37                             ` Drew Adams
  2016-01-26 18:08                             ` Stefan Monnier
  2016-01-26 18:46                             ` Eli Zaretskii
  2 siblings, 0 replies; 128+ messages in thread
From: Drew Adams @ 2016-01-26 17:37 UTC (permalink / raw)
  To: Tianxiang Xiong, emacs-devel

> It seems that what Richard wants is something like Microsoft Word's
> character insertion modal window. See
> http://wordfaqs.mvps.org/images/SpecChars2.gif for an example.
> 
> You select a subset of characters in a character set (e.g. Greek
> letters) and are shown a modal window with visual representations of all
> the characters. You can then choose a character to insert into the
> document.
> 
> In Emacs, of course, we don't have modal windows, but we can have
> buffers that display the characters line-by-line.

Yes.  It is the choosing of a subset (e.g. by language or other
category) that is currently missing, in particular.  Add that and
you can use `apu.el' for the display, choosing chars to insert,
get more info about, etc.

`apu.el' has a few ways to filter characters now, but filtering by
language etc. would be helpful.  And as Eli has mentioned before
(off list), better (quicker) than filtering the Unicode set would
be constructing only the needed subset.

Anyway, you can play with `apu.el', to see what it offers now.
http://www.emacswiki.org/emacs/AproposUnicode   ; Description
http://www.emacswiki.org/emacs/download/apu.el  ; Code



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-26 17:08                           ` Tianxiang Xiong
  2016-01-26 17:37                             ` Drew Adams
@ 2016-01-26 18:08                             ` Stefan Monnier
  2016-01-26 18:46                             ` Eli Zaretskii
  2 siblings, 0 replies; 128+ messages in thread
From: Stefan Monnier @ 2016-01-26 18:08 UTC (permalink / raw)
  To: emacs-devel

> It seems that what Richard wants is something like Microsoft Word's 
> character insertion modal window. See

FWIW, X-Symbol had something along the same lines.


        Stefan




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-26 17:08                           ` Tianxiang Xiong
  2016-01-26 17:37                             ` Drew Adams
  2016-01-26 18:08                             ` Stefan Monnier
@ 2016-01-26 18:46                             ` Eli Zaretskii
  2 siblings, 0 replies; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-26 18:46 UTC (permalink / raw)
  To: Tianxiang Xiong; +Cc: emacs-devel

> From: Tianxiang Xiong <tianxiang.xiong@gmail.com>
> Date: Tue, 26 Jan 2016 17:08:29 +0000 (UTC)
> 
> Richard Stallman <rms <at> gnu.org> writes:
> 
> > I want a system that lets me choose them by seeing them on the screen.
> > I want to specify a language or script and see all its characters.
> > 
> > For instance, if I enter 'turkish' it should show me all the
> > characters used in Turkish.  Then I could pick the dotless i from the
> > buffer.
> > 
> > Would someone please implement this?
> > 
> 
> It seems that what Richard wants is something like Microsoft Word's 
> character insertion modal window. See 
> http://wordfaqs.mvps.org/images/SpecChars2.gif for an example.
> 
> You select a subset of characters in a character set (e.g. Greek 
> letters) and are shown a modal window with visual representations of all 
> the characters. You can then choose a character to insert into the 
> document.

Word lets you choose a _script_ (more accurately, a Unicode block
which supports a specific script), not a language.  E.g., you won't
find "Turkish" there, because there's no such block in Unicode.

Displaying characters for a language is a more fine-grained task.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-26 14:49                             ` Eli Zaretskii
  2016-01-26 14:54                               ` Stefan Monnier
@ 2016-01-26 21:41                               ` Jean-Christophe Helary
  2016-01-27  3:35                                 ` Eli Zaretskii
  2016-01-27  0:47                               ` Richard Stallman
  2 siblings, 1 reply; 128+ messages in thread
From: Jean-Christophe Helary @ 2016-01-26 21:41 UTC (permalink / raw)
  To: emacs-devel


> 2016/01/26 23:49、Eli Zaretskii <eliz@gnu.org> のメール:
> 
>> I just selected the Turkish qwerty layout and when I hit g for 2 secs I get ğ as a possibility. When I am in the US layout I don't get this possibility. In US I get èéêëēėę for e, ÿ for y, ûüùúū for u (and similar options of other vowels), I also get ßśš for s. If I do the same with a capital letter (holding Shift + the letter) I get all the possible capital letters for the selected letter, for ex. S offers ŚŠ but no capital ß.
>> 
>> That's a very convenient way to visually check and select characters.
> 
> I think you are describing how Emacs input method work.  Try this:
> 
>  C-u C-\ turkish-postfix RET
> 
> then type i and watch the echo area.

What I see is the character I need to type to get something I don't see. That's not what Richard requested:

> 2016/01/26 18:39、Richard Stallman <rms@gnu.org> のメール:
> 
> I want a system that lets me choose them by seeing them on the screen.
> I want to specify a language or script and see all its characters.


> The advantage of Emacs input methods is that they don't depend on the
> locale.  (The disadvantage is that they only affect Emacs; but for
> someone who lives inside Emacs, that's not a problem ;-)

The OSX system does not either. I can use a French input system in a Turkish local with a JIS keyboard. Out of the box (and the fact that it is not available out of the box on GNU/Linux system is one of the main reason why I don't work on them, but that's not relevant here).

Jean-Christophe 


^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-26 10:30                       ` Andreas Schwab
@ 2016-01-27  0:46                         ` Richard Stallman
  2016-01-27  1:03                           ` Alexis
  2016-01-27  8:41                           ` Andreas Schwab
  0 siblings, 2 replies; 128+ messages in thread
From: Richard Stallman @ 2016-01-27  0:46 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > It should be easy to add bindings for the missing characters to the C-x
  > 8 map.  For example, the dotless i and the dotted I could be added as
  > `C-x 8 . i' and `C-x 8 . I', resp.

It would be good to add some more characters to C-x 8, but we can't make
subcommands for everything in Unicode.

The approach of showing the characters for a specific unicode block,
or a specific language, or specific script, is feasible for a lot more
characters.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-26 11:31                           ` Yuri Khan
@ 2016-01-27  0:46                             ` Richard Stallman
  0 siblings, 0 replies; 128+ messages in thread
From: Richard Stallman @ 2016-01-27  0:46 UTC (permalink / raw)
  To: Yuri Khan; +Cc: tianxiang.xiong, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > You might find the GNOME Character Map application satisfies your
  > needs.

I run Emacs in a console -- GNOME is not available.

I use that input feature in GNOME.  It is useful there.  But it does
not seem to have the dotless i.  It does not seem to aim for
completeness.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-26 14:49                             ` Eli Zaretskii
  2016-01-26 14:54                               ` Stefan Monnier
  2016-01-26 21:41                               ` Jean-Christophe Helary
@ 2016-01-27  0:47                               ` Richard Stallman
  2 siblings, 0 replies; 128+ messages in thread
From: Richard Stallman @ 2016-01-27  0:47 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: jean.christophe.helary, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I think you are describing how Emacs input method work.  Try this:

  >   C-u C-\ turkish-postfix RET

  > then type i and watch the echo area.

That would work for dotless i (though it would also semipermanently
switch my input method).  But it wouldn't work for (1) nonalphabetic
scripts whose input methods require special knowledge, and (2) special
characters such as ¶.

  > In my case it is OSX and it works like this: you choose a keyboard
  > layout and then by pressing a key you know can have variants for 2
  > secs the list of variants is displayed along with a number under
  > them. You can either use the arrows to select and enter the
  > character or hit the corresponding number.

That seems convenient for characters that are variants of letters,
such as dotless i.

However, there are characters that are not variants of letters.  The
scheme I proposed would be applicable to those sets of characters too.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-26 15:10                             ` Eli Zaretskii
@ 2016-01-27  0:47                               ` Richard Stallman
  0 siblings, 0 replies; 128+ messages in thread
From: Richard Stallman @ 2016-01-27  0:47 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: tianxiang.xiong, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > The somewhat tricky part about the last item is that some languages
  > use non-contiguous portions of a block that is shared with other
  > languages.

It would be easy to allow a language name to specify a list
of character codes to display, instead of a range of codes,
when desirable.

    Word lets you choose a _script_ (more accurately, a Unicode block
    which supports a specific script), not a language.  E.g., you won't
    find "Turkish" there, because there's no such block in Unicode.

    Displaying characters for a language is a more fine-grained task.

A list of the characters special to that language would be easy to add.

So this feature could accept language names, and script names, and various
other ways of specifying which collection of characers to offer.

  > You select a subset of characters in a character set (e.g. Greek 
  > letters) and are shown a modal window with visual representations of all 
  > the characters. You can then choose a character to insert into the 
  > document.

Yes, that's it.


-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-27  0:46                         ` Richard Stallman
@ 2016-01-27  1:03                           ` Alexis
  2016-01-27 22:53                             ` Richard Stallman
  2016-01-27  8:41                           ` Andreas Schwab
  1 sibling, 1 reply; 128+ messages in thread
From: Alexis @ 2016-01-27  1:03 UTC (permalink / raw)
  To: rms; +Cc: Andreas Schwab, monnier, emacs-devel


Richard Stallman <rms@gnu.org> writes:

> [[[ To any NSA and FBI agents reading my email: please consider 
> ]]] [[[ whether defending the US Constitution against all 
> enemies,     ]]] [[[ foreign or domestic, requires you to follow 
> Snowden's example. ]]]
>
>   > It should be easy to add bindings for the missing characters 
>   > to the C-x 8 map.  For example, the dotless i and the dotted 
>   > I could be added as `C-x 8 . i' and `C-x 8 . I', resp.
>
> It would be good to add some more characters to C-x 8, but we 
> can't make subcommands for everything in Unicode.
>
> The approach of showing the characters for a specific unicode 
> block, 

This, at least, is already done by the 'charmap' package:

https://github.com/lateau/charmap

(which is also available via MELPA, as well as Marmalade per the 
README.md).

Typing `M-x charmap` asks the user which Unicode block to display.


Alexis.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-26 21:41                               ` Jean-Christophe Helary
@ 2016-01-27  3:35                                 ` Eli Zaretskii
  2016-01-27  6:01                                   ` Jean-Christophe Helary
  0 siblings, 1 reply; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-27  3:35 UTC (permalink / raw)
  To: Jean-Christophe Helary; +Cc: emacs-devel

> From: Jean-Christophe Helary <jean.christophe.helary@gmail.com>
> Date: Wed, 27 Jan 2016 06:41:57 +0900
> 
> 
> > I think you are describing how Emacs input method work.  Try this:
> > 
> >  C-u C-\ turkish-postfix RET
> > 
> > then type i and watch the echo area.
> 
> What I see is the character I need to type to get something I don't
> see.

??? What I see is the inputs I can type _and_ the characters that will
be inserted when I type each input, including the dotless i character.

That's not what Richard requested:

Maybe so, but then neither is what you proposed, because the Emacs
input methods work in the same way as what you described.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-27  3:35                                 ` Eli Zaretskii
@ 2016-01-27  6:01                                   ` Jean-Christophe Helary
  2016-01-28 23:16                                     ` Jean-Christophe Helary
  0 siblings, 1 reply; 128+ messages in thread
From: Jean-Christophe Helary @ 2016-01-27  6:01 UTC (permalink / raw)
  To: emacs-devel


> 2016/01/27 12:35、Eli Zaretskii <eliz@gnu.org> のメール:
> 
>> From: Jean-Christophe Helary <jean.christophe.helary@gmail.com>
>> Date: Wed, 27 Jan 2016 06:41:57 +0900
>> 
>> 
>>> I think you are describing how Emacs input method work.  Try this:
>>> 
>>> C-u C-\ turkish-postfix RET
>>> 
>>> then type i and watch the echo area.
>> 
>> What I see is the character I need to type to get something I don't
>> see.
> 
> ??? What I see is the inputs I can type _and_ the characters that will
> be inserted when I type each input, including the dotless i character.

Sorry, I see that for turkish-postfix, but not for ex. for latin-1-postfix, where the resulting character is not displayed.

Jean-Christophe 


^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-27  0:46                         ` Richard Stallman
  2016-01-27  1:03                           ` Alexis
@ 2016-01-27  8:41                           ` Andreas Schwab
  1 sibling, 0 replies; 128+ messages in thread
From: Andreas Schwab @ 2016-01-27  8:41 UTC (permalink / raw)
  To: Richard Stallman; +Cc: monnier, emacs-devel

Richard Stallman <rms@gnu.org> writes:

> It would be good to add some more characters to C-x 8, but we can't make
> subcommands for everything in Unicode.

Neither did iso-acc.

> The approach of showing the characters for a specific unicode block,
> or a specific language, or specific script, is feasible for a lot more
> characters.

Sure, but it's an orthogonal issue, iso-acc didn't offer that either.

Andreas.

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-27  1:03                           ` Alexis
@ 2016-01-27 22:53                             ` Richard Stallman
  0 siblings, 0 replies; 128+ messages in thread
From: Richard Stallman @ 2016-01-27 22:53 UTC (permalink / raw)
  To: Alexis; +Cc: schwab, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > This, at least, is already done by the 'charmap' package:

  > https://github.com/lateau/charmap

  > (which is also available via MELPA, as well as Marmalade per the 
  > README.md).

  > Typing `M-x charmap` asks the user which Unicode block to display.

Can we get legal papers for this?

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-27  6:01                                   ` Jean-Christophe Helary
@ 2016-01-28 23:16                                     ` Jean-Christophe Helary
  2016-01-29  8:21                                       ` Eli Zaretskii
  0 siblings, 1 reply; 128+ messages in thread
From: Jean-Christophe Helary @ 2016-01-28 23:16 UTC (permalink / raw)
  To: emacs-devel


>>>> I think you are describing how Emacs input method work.  Try this:
>>>> 
>>>> C-u C-\ turkish-postfix RET
>>>> 
>>>> then type i and watch the echo area.
>>> 
>>> What I see is the character I need to type to get something I don't
>>> see.
>> 
>> ??? What I see is the inputs I can type _and_ the characters that will
>> be inserted when I type each input, including the dotless i character.
> 
> Sorry, I see that for turkish-postfix, but not for ex. for latin-1-postfix, where the resulting character is not displayed.

After checking the turkish-postfix input method, I noticed that the only character that is displayed "a la OSX" is the "i". All the other characters for which there are variants are *not* displayed and only their composing characters are. So emacs is actually *not* displaying resulting characters.

What I suggested would be an improvement is, for ex in latin-1-postfix, to have the following display when you hit "a":

a["'/^_`~] 1.ä 2.á 3.å 4.â 5.ª 6.à 7.ã

right now you only have:
a["'/^_`~]

Jean-Christophe 


^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-28 23:16                                     ` Jean-Christophe Helary
@ 2016-01-29  8:21                                       ` Eli Zaretskii
  2016-01-29 15:51                                         ` handa
  0 siblings, 1 reply; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-29  8:21 UTC (permalink / raw)
  To: Jean-Christophe Helary, Kenichi Handa; +Cc: emacs-devel

> From: Jean-Christophe Helary <jean.christophe.helary@gmail.com>
> Date: Fri, 29 Jan 2016 08:16:10 +0900
> 
> After checking the turkish-postfix input method, I noticed that the only character that is displayed "a la OSX" is the "i". All the other characters for which there are variants are *not* displayed and only their composing characters are. So emacs is actually *not* displaying resulting characters.

That's quail.el "working as designed" for these input methods.  Most
input methods for Far Eastern scripts show the alternatives almost
always.

> What I suggested would be an improvement is, for ex in latin-1-postfix, to have the following display when you hit "a":
> 
> a["'/^_`~] 1.ä 2.á 3.å 4.â 5.ª 6.à 7.ã
> 
> right now you only have:
> a["'/^_`~]

If that's what we want, we need to change quail.el where it decides
whether or not to show the alternative translations.

Perhaps Handa-san could comment on the reasons for this design in
'quail-get-translations': why does it show the list of possible
translations only sometimes?  Is it just an optimization?



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-29  8:21                                       ` Eli Zaretskii
@ 2016-01-29 15:51                                         ` handa
  2016-01-29 16:14                                           ` Eli Zaretskii
  0 siblings, 1 reply; 128+ messages in thread
From: handa @ 2016-01-29 15:51 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: jean.christophe.helary, emacs-devel

In article <831t90ztgm.fsf@gnu.org>, Eli Zaretskii <eliz@gnu.org> writes:

> Perhaps Handa-san could comment on the reasons for this design in
> 'quail-get-translations': why does it show the list of possible
> translations only sometimes?  Is it just an optimization?

The deference is that an input method is determinitic or
non-deterministic.

Most input methods are deterministic, i.e. the defined key sequence
reaches to a target character (or a string), but Chinese input methods
are not deterministic, i.e. the defined key sequence reaches only to a
group of candidate characters.  A user has to select one of them by arrow
keys or by an index number.  So, for such an input method, showing
candidate characters is mandatory.

And, chinese input methods do not show possible translations as this:

> a["'/^_`~] 1.ä 2.á 3.å 4.â 5.ª 6.à 7.ã

The above means that when you type ", you get ä, when you type ', you
get á, ...

But chinese input methods show candidates as this (when you type "ni"
with chinese-py):

ni[aenu]  (01/??) 1.你 2.呢 3.尼 4.泥 5.逆 6.倪 7.匿 8.拟 9.腻 0.妮

This means that when you type 1, you get 你, when you type 2, you get
呢, ..., and when you type a (or e, n, u), the different candidates are
shown.

---
K. Handa
handa@gnu.org



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-29 15:51                                         ` handa
@ 2016-01-29 16:14                                           ` Eli Zaretskii
  2016-01-29 16:24                                             ` Clément Pit--Claudel
                                                               ` (2 more replies)
  0 siblings, 3 replies; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-29 16:14 UTC (permalink / raw)
  To: handa; +Cc: jean.christophe.helary, emacs-devel

> From: handa <handa@gnu.org>
> Cc: jean.christophe.helary@gmail.com, emacs-devel@gnu.org
> Date: Sat, 30 Jan 2016 00:51:10 +0900
> 
> In article <831t90ztgm.fsf@gnu.org>, Eli Zaretskii <eliz@gnu.org> writes:
> 
> > Perhaps Handa-san could comment on the reasons for this design in
> > 'quail-get-translations': why does it show the list of possible
> > translations only sometimes?  Is it just an optimization?
> 
> The deference is that an input method is determinitic or
> non-deterministic.
> 
> Most input methods are deterministic, i.e. the defined key sequence
> reaches to a target character (or a string), but Chinese input methods
> are not deterministic, i.e. the defined key sequence reaches only to a
> group of candidate characters.  A user has to select one of them by arrow
> keys or by an index number.  So, for such an input method, showing
> candidate characters is mandatory.

So you are saying that the candidates are shown only when selection is
done by typing a digit?

Can we add an optional feature where the candidates will be shown even
in deterministic input methods, although the way to choose the
candidates is not by typing a digit?  For example:

  a["'/^_`~]  " - ä  ' - á  / - å  ^ - â _ - ª   ` - à  ~ - ã

or something similar?

Thanks.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-29 16:14                                           ` Eli Zaretskii
@ 2016-01-29 16:24                                             ` Clément Pit--Claudel
  2016-01-30  3:03                                             ` Jean-Christophe Helary
  2016-01-30 12:16                                             ` handa
  2 siblings, 0 replies; 128+ messages in thread
From: Clément Pit--Claudel @ 2016-01-29 16:24 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 822 bytes --]

On 01/29/2016 11:14 AM, Eli Zaretskii wrote:
> So you are saying that the candidates are shown only when selection is
> done by typing a digit?
> 
> Can we add an optional feature where the candidates will be shown even
> in deterministic input methods, although the way to choose the
> candidates is not by typing a digit?  For example:
> 
>   a["'/^_`~]  " - ä  ' - á  / - å  ^ - â _ - ª   ` - à  ~ - ã

I like this sugestion: it would be (more) consistent with Chinese input methods:

In chinese-py "1. 你" means "press 1 to insert 你". With you proposal, "~ - ã"
means "press ~ to insert ã".  I like the symmetry (maybe using "→", just like in
query-replace, would look a tiny bit nicer than " - " though?).  I wonder how this
would generalize to e.g. the TeX input method.

Clément.


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-29 16:14                                           ` Eli Zaretskii
  2016-01-29 16:24                                             ` Clément Pit--Claudel
@ 2016-01-30  3:03                                             ` Jean-Christophe Helary
  2016-01-30  7:30                                               ` Eli Zaretskii
  2016-01-30 12:16                                             ` handa
  2 siblings, 1 reply; 128+ messages in thread
From: Jean-Christophe Helary @ 2016-01-30  3:03 UTC (permalink / raw)
  To: emacs-devel


> 2016/01/30 1:14、Eli Zaretskii <eliz@gnu.org> のメール:
> 
> Can we add an optional feature where the candidates will be shown even
> in deterministic input methods, although the way to choose the
> candidates is not by typing a digit?  For example:
> 
>  a["'/^_`~]  " - ä  ' - á  / - å  ^ - â _ - ª   ` - à  ~ - ã
> 
> or something similar?

The turkish-postfix method seems to offer both, at least with "i".

i[.]         (01/01) 1.ı 2.i

You can get "i" by either typing "." or by typing "1".

For some reason that is not generalized to other characters:

u["^]
i[.]         (01/01) 1.ı 2.i
o["]
a[^]
s[,]
g[^]
c[,]

For chinese-py, Kenichi proposed "ni":
ni[aenu]  (01/??) 1.你 2.呢 3.尼 4.泥 5.逆 6.倪 7.匿 8.拟 9.腻 0.妮

but since the default is 1, you actually don't have to enter 1 to input 你, and similarly, when you go all the way to niang you get 娘 by default and don't need to type 1 for input.

The implementation of turkish-postfix for "i" is superior to what we have on OSX (if offers discoverability, character based input *and* digit based input) but the implementation is not generalized to other letters and other input methods and thus is not satisfactory.

My original comment (description of the new OSX input system)  was a reply to Richard's request to have a way to view "all the characters" of a given language or script:

> I want a system that lets me choose them by seeing them on the screen.
> I want to specify a language or script and see all its characters.
> 
> For instance, if I enter 'turkish' it should show me all the
> characters used in Turkish.  Then I could pick the dotless i from the
> buffer.

Although what I am discussing here is strictly related to current input systems and not to a the new capability that Richard desires, I think the bigger issue here is first discoverability and then input method.

turkish-postfix offers discoverability for "i". chinese-py offers discoverability for all its characters (presumably), neither latin-1-postfix not latin-1-prefix offer any sort of discoverability and also lack predictability (why does /e= œ but /E=Æ ?, also, when you shift to french-prefix you actually do not get all the characters that you could possibly type in French - ±÷ªº¥°½¾¼ etc. - even though french should be a subset of latin-1, with the exception of œ/Œ.)

Then there is the input method when you have discovered the character you want to enter. I personally think that offering 2 options when possible (composing character *and* digit) is the best. Composing characters, and in the case of chinese-py we can argue that letters *are* composing characters for all practical purposes, are available for characters that are input frequently by a given user, and digits are there to input the occasional character. There is no logical need to not have a digit based input for composed characters.


Jean-Christophe


^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-30  3:03                                             ` Jean-Christophe Helary
@ 2016-01-30  7:30                                               ` Eli Zaretskii
  2016-01-30  7:36                                                 ` Jean-Christophe Helary
  0 siblings, 1 reply; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-30  7:30 UTC (permalink / raw)
  To: Jean-Christophe Helary; +Cc: emacs-devel

> From: Jean-Christophe Helary <jean.christophe.helary@gmail.com>
> Date: Sat, 30 Jan 2016 12:03:12 +0900
> 
> Although what I am discussing here is strictly related to current input systems and not to a the new capability that Richard desires, I think the bigger issue here is first discoverability and then input method.
> 
> turkish-postfix offers discoverability for "i". chinese-py offers discoverability for all its characters (presumably), neither latin-1-postfix not latin-1-prefix offer any sort of discoverability and also lack predictability (why does /e= œ but /E=Æ ?, also, when you shift to french-prefix you actually do not get all the characters that you could possibly type in French - ±÷ªº¥°½¾¼ etc. - even though french should be a subset of latin-1, with the exception of œ/Œ.)
> 
> Then there is the input method when you have discovered the character you want to enter. I personally think that offering 2 options when possible (composing character *and* digit) is the best. Composing characters, and in the case of chinese-py we can argue that letters *are* composing characters for all practical purposes, are available for characters that are input frequently by a given user, and digits are there to input the occasional character. There is no logical need to not have a digit based input for composed characters.

Yes, the area of input methods in Emacs needs some long-term loving
care.  They only rarely get any attention, so most methods stay as
they were submitted years ago, and some are no longer up-to-date with
the changes in people expectations.

Would you like to work on making the Emacs input methods better?

Thanks.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-30  7:30                                               ` Eli Zaretskii
@ 2016-01-30  7:36                                                 ` Jean-Christophe Helary
  2016-01-30  7:46                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 128+ messages in thread
From: Jean-Christophe Helary @ 2016-01-30  7:36 UTC (permalink / raw)
  To: emacs-devel


> 2016/01/30 16:30、Eli Zaretskii <eliz@gnu.org> のメール:
> 
> Yes, the area of input methods in Emacs needs some long-term loving
> care.  They only rarely get any attention, so most methods stay as
> they were submitted years ago, and some are no longer up-to-date with
> the changes in people expectations.
> 
> Would you like to work on making the Emacs input methods better?

I definitely would. But the only emacslisp I've written so far is the solutions for problem 1 and 2 of the Euler Project...
And I would not know where to start looking for.
I'm thinking that maybe trying to complete the french method so that it includes other characters from latin-1 would be a start ?

Jean-Christophe 


^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-30  7:36                                                 ` Jean-Christophe Helary
@ 2016-01-30  7:46                                                   ` Eli Zaretskii
  0 siblings, 0 replies; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-30  7:46 UTC (permalink / raw)
  To: Jean-Christophe Helary; +Cc: emacs-devel

> From: Jean-Christophe Helary <jean.christophe.helary@gmail.com>
> Date: Sat, 30 Jan 2016 16:36:22 +0900
> 
> > Would you like to work on making the Emacs input methods better?
> 
> I definitely would. But the only emacslisp I've written so far is the solutions for problem 1 and 2 of the Euler Project...
> And I would not know where to start looking for.

If you means start to looking for problems to fix, you have already
identified quite a few.

If you mean start looking for how input methods work under the hood,
the place to start is quail.el, and please ask questions here if you
don't understand something there.  AFAIR, most of it is not hard to
understand.

> I'm thinking that maybe trying to complete the french method so that it includes other characters from latin-1 would be a start ?

Yes, definitely a good start.  Thanks.

Also, I don't see your copyright assignment for Emacs on file.
Without it, we will only be able to accept limited contributions from
you.  Would you like me to send you the assignment form, to start the
legal paperwork rolling?

TIA



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-29 16:14                                           ` Eli Zaretskii
  2016-01-29 16:24                                             ` Clément Pit--Claudel
  2016-01-30  3:03                                             ` Jean-Christophe Helary
@ 2016-01-30 12:16                                             ` handa
  2016-01-30 13:53                                               ` Eli Zaretskii
  2 siblings, 1 reply; 128+ messages in thread
From: handa @ 2016-01-30 12:16 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: jean.christophe.helary, emacs-devel

In article <83d1skxt0i.fsf@gnu.org>, Eli Zaretskii <eliz@gnu.org> writes:

> > Most input methods are deterministic, i.e. the defined key sequence
> > reaches to a target character (or a string), but Chinese input methods
> > are not deterministic, i.e. the defined key sequence reaches only to a
> > group of candidate characters.  A user has to select one of them by arrow
> > keys or by an index number.  So, for such an input method, showing
> > candidate characters is mandatory.

> So you are saying that the candidates are shown only when selection is
> done by typing a digit?

Not exactly.  The selection can also be done by C-f C-b C-n C-p and
arrow keys.  Anyway, candidates are shown only when an input method
doesn't define an exact key sequence to input a specific character.
Chinese-py only defines that "ni" is for inputting one of "你呢尼泥逆倪
匿拟腻妮霓昵溺旎睨鲵坭猊怩伲祢慝铌".  How many of those candidates are
shown depending on your window width.  If the width is too short to show
all candidates, a user have to type arrow keys or C-n, C-p, C-f, C-b to
see all candidates.  In that sense, chinese-py is non-deterministic.

> Can we add an optional feature where the candidates will be shown even
> in deterministic input methods, although the way to choose the
> candidates is not by typing a digit?  For example:

>   a["'/^_`~]  " - ä  ' - á  / - å  ^ - â _ - ª   ` - à  ~ - ã

> or something similar?

Of course adding such a feature is possible, but it's not just a
changing of condition of some code, but a completely new feature.  The
code to get "你呢尼泥逆倪匿拟腻妮霓昵溺旎睨鲵坭猊怩伲祢慝铌" when a user
type "ni" is easy because chinese-py directly defines it.  But to get
"äáåâªàã" when a user type "a" requires completely different code.

I can work on it, but it may take time.

---
K. Handa
handa@gnu.org



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-30 12:16                                             ` handa
@ 2016-01-30 13:53                                               ` Eli Zaretskii
  0 siblings, 0 replies; 128+ messages in thread
From: Eli Zaretskii @ 2016-01-30 13:53 UTC (permalink / raw)
  To: handa; +Cc: jean.christophe.helary, emacs-devel

> From: handa <handa@gnu.org>
> Cc: jean.christophe.helary@gmail.com, emacs-devel@gnu.org
> Date: Sat, 30 Jan 2016 21:16:46 +0900
> 
> > Can we add an optional feature where the candidates will be shown even
> > in deterministic input methods, although the way to choose the
> > candidates is not by typing a digit?  For example:
> 
> >   a["'/^_`~]  " - ä  ' - á  / - å  ^ - â _ - ª   ` - à  ~ - ã
> 
> > or something similar?
> 
> Of course adding such a feature is possible, but it's not just a
> changing of condition of some code, but a completely new feature.  The
> code to get "你呢尼泥逆倪匿拟腻妮霓昵溺旎睨鲵坭猊怩伲祢慝铌" when a user
> type "ni" is easy because chinese-py directly defines it.  But to get
> "äáåâªàã" when a user type "a" requires completely different code.
> 
> I can work on it, but it may take time.

I think it would be good to have such a feature, especially for input
methods such latin-ltx.el or uni-input,, which can potentially produce
a lot of characters whose appearance mostly has nothing in common with
what the user types.

Thanks.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: A proposal for removing obsolete packages
  2016-01-26 17:32                   ` John Wiegley
@ 2016-02-03  4:45                     ` Andrew Hyatt
  0 siblings, 0 replies; 128+ messages in thread
From: Andrew Hyatt @ 2016-02-03  4:45 UTC (permalink / raw)
  To: John Wiegley, Richard Stallman, monnier, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 834 bytes --]

On Tue, Jan 26, 2016 at 12:32 PM John Wiegley <jwiegley@gmail.com> wrote:

> >>>>> John Wiegley <jwiegley@gmail.com> writes:
>
> > Other than cl-compat, I'm OK with deleting these. Does anyone have any
> other
> > objections?
>
> According to objections from Drew about options, we'll keep that one as
> well.
>

Sounds good.  The only other objections I've heard were from Richard
Stallman about the iso-* packages, but from what I can tell, the objections
have been answered and the conversation about those has moved to other
issues.  Richard, if I'm misunderstanding, let me know.

I'll remove these packages (except for cl-compat and options) tomorrow from
the trunk.


>
> --
> John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
> http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2
>

[-- Attachment #2: Type: text/html, Size: 1468 bytes --]

^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-01-26  9:39                         ` Richard Stallman
                                             ` (3 preceding siblings ...)
  2016-01-26 17:08                           ` Tianxiang Xiong
@ 2016-02-06 11:56                           ` Helmut Eller
  2016-02-06 12:25                             ` Eli Zaretskii
  2016-02-07 18:33                             ` Richard Stallman
  4 siblings, 2 replies; 128+ messages in thread
From: Helmut Eller @ 2016-02-06 11:56 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 559 bytes --]

On Tue, Jan 26 2016, Richard Stallman wrote:

> Would someone please implement this?

Here is my shot at this.  Load the attached file and start the browser
with "M-x ubb-browse". That displays the characters of the "Basic Latin"
block.  From there it's probably the easiest to use the menu to explore
the available commands.

I defined a sets of characters for some languages by looking at
Wikipedia.  This would obviously need more work by people who are
familiar with those languages.

The file is also available at: https://github.com/ellerh/ubb

Helmut


[-- Attachment #2: ubb.el --]
[-- Type: application/emacs-lisp, Size: 25671 bytes --]

;;; ubb.el --- Unicode block browser      -*-coding:utf-8; lexical-binding:t-*-

;; Copyright (C) 2016 Free Software Foundation, Inc.

;; GNU Emacs 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.

;; GNU Emacs 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.  If not, see <http://www.gnu.org/licenses/>.

;;; Commentary:

;; This is a mode for browsing the characters in Unicode Blocks or
;; other collections of characters, like Emacs' "charsets".
;;
;; Start the browser with "M-x ubb-browse".  That displays the
;; characters of the "Basic Latin" block.  From there it's probably
;; the easiest to use the menu to explore the available commands.
;;
;; The browser displays the current "set" of the current "group".  A
;; set is a collection of codepoints, e.g. the Unicode Block "Box
;; Drawing" is such a set.  Groups are collections of sets, e.g. all
;; Unicode Blocks form a group.
;;
;; Displaying large sets can be slow.  Don't hesitate to press C-g if
;; it takes too long.

;;; Code

(require 'cl-lib)

\f
;;; Some type definitions

;; A ubb--set represents a set of codepoints.
(cl-defstruct (ubb--set (:constructor ubb--make-set% (name ranges))
			(:constructor nil)
			(:predicate nil) (:copier nil))
  ;; NAME is a string for display purposes.
  (name "" :type string :read-only t)
  ;; RANGES is a list of the form ((START . END) ...)
  ;; START and END denote a range of codepoints.
  ;; START is inclusive; END is exclusive.
  (ranges () :type list :read-only t))

(defun ubb--check-range (x)
  (cl-assert (consp x))
  (let ((start (car x)) (end (cdr x)))
    (cl-assert (integerp start))
    (cl-assert (integerp end))
    (cl-assert (<= 0 start))
    (cl-assert (< start end))))

(defun ubb--sort-ranges (ranges)
  (sort (copy-sequence ranges)
	(lambda (r1 r2)
	  (< (car r1) (car r2)))))

(defun ubb--ranges-to-set (ranges)
  (cond ((null ranges) '())
	((null (cdr ranges)) ranges)
	(t
	 (let ((sorted (ubb--sort-ranges ranges)))
	   (nreverse
	    (cl-reduce (lambda (left+m right)
			 (cl-destructuring-bind ((s1 &rest e1) &rest m) left+m
			   (cl-destructuring-bind (s2 &rest e2) right
			     (cl-assert (<= s1 s2))
			     (cond ((<= e1 s2) ; no overlap
				    (cons right left+m))
				   (t
				    (cons (cons (min s1 s2)
						(max e1 e2))
					  m))))))
		       (cdr sorted) :initial-value (list (car sorted))))))))

(defun ubb--make-set (name ranges)
  (cl-check-type name string) (cl-check-type ranges list)
  (mapc #'ubb--check-range ranges)
  (let* ((sorted (ubb--ranges-to-set ranges)))
    (cl-loop for ((_ . end1) (start2 . _)) on sorted
	     while start2
	     do (cl-assert (<= end1 start2)))
    (ubb--make-set% name sorted)))

(defun ubb--set-size (set)
  (cl-loop for (start . end) in (ubb--set-ranges set)
	   sum (- end start)))

;; Call FUN for each codepoint in SET.  FUN receives two arguments:
;; and "index" and the codepoint.
(defun ubb--set-foreachi (fun set)
  (let ((i 0))
    (cl-loop for (start . end) in (ubb--set-ranges set) do
	     (cl-loop for codepoint from start below end do
		      (funcall fun i codepoint)
		      (cl-incf i)))))

(defun ubb--set-member? (set codepoint)
  (cl-loop for (start . end) in (ubb--set-ranges set)
	   thereis (and (<= start codepoint) (< codepoint end))))

;; Return a list of ranges corresponding to set of codepoints in the
;; string STRING.
(defun ubb--string-ranges (string)
  (let* ((sorted (cl-sort (copy-sequence string) #'<))
	 (ranges '())
	 (start nil)
	 (end nil))
    (cl-loop for c across sorted do
	     (cond ((not start)
		    (setq start c)
		    (setq end (1+ c)))
		   ((= c (1- end)))
		   ((= c end) (setq end (1+ c)))
		   (t (push (cons start end) ranges)
		      (setq start c)
		      (setq end (1+ c)))))
    (when start (push (cons start end) ranges))
    (reverse ranges)))

;; A ubb--group is used to represent a set of ubb--sets.
(cl-defstruct (ubb--group (:constructor ubb--make-group)
			  (:copier nil) (:predicate nil))
  ;; NAME is a string for display purposes
  (name "" :type string :read-only t)
  ;; SETS%% is either a function (with no arguments) that should return a
  ;; sequence of ubb--sets that belong to this group, or the cached result
  ;; of calling the function.
  (sets%% (error "Arg missing") :type (or function sequence))
  ;; HEADER is a function which receives a set as argument and
  ;; should the value for `header-line-format'.
  (header (error "Arg missing") :type function :read-only t))

(defun ubb--group-sets (group)
  (let ((sets%% (ubb--group-sets%% group)))
    (cl-etypecase sets%%
      (sequence sets%%)
      (function (setf (ubb--group-sets%% group) (funcall sets%%))))))

\f
;;; Unicode blocks

;; Local copy.
(defvar ubb--blocks-file-name
  (expand-file-name "../admin/unidata/Blocks.txt" data-directory))

;; Fallback if no local copy.
(defvar ubb--blocks-url "http://www.unicode.org/Public/UNIDATA/Blocks.txt")

;; Parse blocks in the format used by the Unicode Character Database.
(defun ubb--parse-blocks ()
  (goto-char (point-min))
  (let ((result '()))
    (while (re-search-forward
	    "^\\([0-9A-F]+\\)\\.\\.\\([0-9A-F]+\\);[ ]*\\([^ ].*\\)$"
	    nil t)
      (let* ((start (string-to-number (match-string 1) 16))
	     (end (1+ (string-to-number (match-string 2) 16)))
	     (name (match-string 3)))
	(push (ubb--make-set name (list (cons start end))) result)))
    (let ((r (cl-coerce (nreverse result) 'vector)))
      (cl-assert (let ((s (elt r 0)))
		   (and (equal (ubb--set-name s)  "Basic Latin")
			(equal (ubb--set-ranges s) '((0 . #x80))))))
      r)))

;; Load block information from a file or if the file isn't present
;; download it from unicode.org.
(defun ubb--load-blocks ()
  (with-temp-buffer
    (cond ((file-exists-p ubb--blocks-file-name)
	   (let ((coding-system-for-read 'binary))
	     (insert-file-contents-literally ubb--blocks-file-name)))
	  (t
	   (insert
	    (with-current-buffer (url-retrieve-synchronously ubb--blocks-url)
	      (re-search-forward "\n\n")
	      (buffer-substring (point) (point-max))))))
    (ubb--parse-blocks)))

(defun ubb--all-blocks ()
  "Return a sequence of all blocks."
  (ubb--load-blocks))

(defun ubb--find-block-by-codepoint (codepoint)
  (cl-find-if (lambda (block)
		(ubb--set-member? block codepoint))
	      (ubb--all-blocks)))

(defun ubb--unicode-block-header (set)
  (cl-destructuring-bind ((start &rest end)) (ubb--set-ranges set)
    (format "Block: %s  %04X..%04X" (ubb--set-name set) start end)))

(defvar ubb--unicode-blocks-group
  (ubb--make-group :name "Unicode blocks"
		   :sets%% #'ubb--all-blocks
		   :header #'ubb--unicode-block-header))

\f
;;; Charsets

;; NOTE: `map-charset-chars' can call the function with overlapping
;; ranges.  Also the cons cell for the range argument is updated so
;; it's a good idea to copy the contents instead of using the cons
;; cell.
(defun ubb--charset-to-set (charset)
  (let ((ranges '()))
    (map-charset-chars (lambda (from+to _)
			 (cl-destructuring-bind (from &rest to) from+to
			   (cl-assert (characterp from))
			   (cl-assert (characterp to))
			   (push (cons from (1+ to)) ranges)))
		       charset)
    (ubb--make-set (or (get-charset-property charset :long-name)
		       (get-charset-property charset :short-name)
		       (format "%s" charset))
		   ranges)))

(defun ubb--charsets-without-aliases ()
  (reverse ; ascii first, please
   (cl-remove-duplicates charset-list :key #'charset-plist)))

(defun ubb--all-charsets ()
  (mapcar #'ubb--charset-to-set (ubb--charsets-without-aliases)))

(defun ubb--charset-header (set)
  (format "Charset: %s" (ubb--set-name set)))

(defvar ubb--charsets-group
  (ubb--make-group :name "Charsets"
		   :sets%% #'ubb--all-charsets
		   :header #'ubb--charset-header))

\f
;;; Scripts

(defun ubb--all-scripts ()
  (let ((script2ranges (make-hash-table))
	(sets '()))
    (map-char-table (lambda (key script)
		      (setf (gethash script script2ranges)
			    (cons (cl-etypecase key
				    (character (cons key (1+ key)))
				    (cons (cons (car key) (1+ (cdr key)))))
				  (gethash script script2ranges))))
		    char-script-table)
    (maphash (lambda (script ranges)
	       (push (ubb--make-set (symbol-name script) ranges)
		     sets))
	     script2ranges)
    (cl-sort sets #'string< :key #'ubb--set-name)))

(defvar ubb--scripts-group
  (ubb--make-group :name "Scripts"
		   :sets%% #'ubb--all-scripts
		   :header (lambda (set)
			     (format "Script: %s" (ubb--set-name set)))))

\f
;;; Unicode categories

(defun ubb--all-unicode-categories ()
  (let ((cat2ranges (make-hash-table))
	(sets '()))
    (map-char-table (lambda (key cat)
		      (setf (gethash cat cat2ranges)
			    (cons (cl-etypecase key
				    (character (cons key (1+ key)))
				    (cons (cons (car key) (1+ (cdr key)))))
				  (gethash cat cat2ranges))))
		    unicode-category-table)
    (maphash (lambda (cat ranges)
	       (let* ((desc (char-code-property-description
			     'general-category cat))
		      (name (format "%s (%s)" cat desc)))
		 (push (ubb--make-set name ranges)
		       sets)))
	     cat2ranges)
    (cl-sort sets #'string< :key #'ubb--set-name)))

(defvar ubb--unicode-categories-group
  (ubb--make-group :name "Unicode categories"
		   :sets%% #'ubb--all-unicode-categories
		   :header (lambda (set)
			     (format "Unicode general category: %s"
				     (ubb--set-name set)))))

\f
;;; Languages

(defun ubb--all-languages ()
  (list (ubb--make-set "English" (ubb--string-ranges "“”‘’"))
	(ubb--make-set "French" (ubb--string-ranges "\
éàèùâêîôûëïüÿçœæ\
ÉÀÈÙÂÊÎÔÛËÏÜŸÇŒÆ\
«»‹›“”‘’€"))
	(ubb--make-set "German" (ubb--string-ranges "äöüßÄÖÜ„“‚‘’»«›‹€"))
	(ubb--make-set "Italian" (ubb--string-ranges "\
àèìòùéóî\
ÀÈÌÒÙÉÓÎ\
“”‘’«»‹›€"))
	(ubb--make-set "Spanish" (ubb--string-ranges "\
ñáéíóúü\
ÑÁÉÍÓÚÜ\
“”‘’«»¿¡"))
	(ubb--make-set "Turkish" (ubb--string-ranges "\
çşğıöü\
ÇŞĞİÖÜ\
“”‘’«»‹›"))
	(ubb--make-set "APL" (append (ubb--string-ranges "\
?⌈⌊⍴∼∣⍳⋆−+×÷,⌹○⍟⌽⊖⍋⍒⍎⍕⍉!−×÷⋆○?∈⌈⌊⍴↑↓⊥⊤∣,\/⍳⌹⌽⊖⍟⍕⍉!¨<≤=≥>≠∨∧⍱⍲/⌿\⍀.∘.")
				     `((,?⌶ . ,(1+ ?⍺)))))))

(defvar ubb--languages-group
  (ubb--make-group :name "Languages"
		   :sets%% #'ubb--all-languages
		   :header (lambda (set)
			     (format "Language: %s" (ubb--set-name set)))))


\f
;;; Games (important)

(defun ubb--all-game-sets ()
  (list (ubb--make-set "Chess" (ubb--string-ranges "♚♛♜♝♞♟♙♘♗♔♖♕"))
	(ubb--make-set "Domino" `((#x1f030 . #x1f0a0)))
	(ubb--make-set "Poker" `(,@(ubb--string-ranges "♠♤♥♡♦♢♣♧")
				 (#x1f0a0 . #x1f100)))))

(defun ubb--game-header (set)
  (format "Game: %s" (ubb--set-name set)))

(defvar ubb--games-group
  (ubb--make-group :name "Games"
		   :sets%% #'ubb--all-game-sets
		   :header #'ubb--game-header))

\f
;;; Groups

(defun ubb--all-groups ()
  (list ubb--unicode-blocks-group
	ubb--charsets-group
	ubb--scripts-group
	ubb--unicode-categories-group
	ubb--languages-group
	ubb--games-group))

(defvar ubb--read-group-name-history (list "Unicode blocks"))

(defun ubb--read-group-name (prompt)
  (let ((hist 'ubb--read-group-name-history)
	(completion-ignore-case t))
    (completing-read prompt
		     (mapcar #'ubb--group-name (ubb--all-groups))
		     nil t nil hist)))

(defun ubb--find-group-by-name (name)
  (cl-find name (ubb--all-groups) :key #'ubb--group-name :test #'equal))

(defvar ubb--read-set-name-history (list))

(defun ubb--read-set-name (group prompt)
  (let ((hist 'ubb--read-set-name-history)
	(completion-ignore-case t)
	(completion-styles (cl-adjoin 'substring completion-styles)))
    (completing-read prompt
		     (mapcar #'ubb--set-name (ubb--group-sets group))
		     nil t nil hist)))

(defun ubb--find-set-by-name (group name)
  (cl-find name (ubb--group-sets group)
	   :key #'ubb--set-name :test #'equal))

\f
;;; Display

(defconst ubb--space " ")
(defconst ubb--thin-space (string #x2009))

;; Insert space around the string from START to END so that the region
;; occupies approximately 2*FONT-WIDTH pixels.  Inserting space is
;; generally a good idea to "neutralize" combining marks.
(defun ubb--insert-space (win start end font-width)
  (let ((pixel-width (car (window-text-pixel-size win start end))))
    (cond ((<= pixel-width font-width)
	   (save-excursion
	     (goto-char start)
	     (insert ubb--space)))
	  ((< pixel-width (* 2 font-width))
	   (save-excursion
	     (goto-char start)
	     (insert ubb--thin-space)))
	  (t
	   ;; give up
	   ))))

(defface ubb-invisible
  '((t :inherit tooltip))
  "Face used for codepoints that would otherwise be invisible/transparent."
  :group 'ubb)

(defun ubb--propertize (string codepoint)
  (let ((s (propertize string 'codepoint codepoint
		       'help-echo #'ubb--help-echo)))
    (cond ((memq (get-char-code-property codepoint 'general-category)
		 '(Cf Zs Zl Zp))
	   (propertize s 'face 'ubb-invisible))
	  (t s))))

(defun ubb--insert-codepoint (win codepoint font-width)
  (let* ((s (cl-case codepoint
	      (?\n "^J")
	      (t (string codepoint))))
	 (s (ubb--propertize s codepoint))
	 (start (point))
	 (_ (insert s))
	 (end (point)))
    (ubb--insert-space win start end font-width)))

;; FIXME: only for compatibility with Emacs 24
(defun ubb--default-font-width ()
  (cond ((fboundp 'default-font-width)
	 (default-font-width))
	(t
	 (frame-char-width))))

(defvar ubb--right-margin 10)
(defvar ubb--left-margin 1)

;; Insert a set of codepoints, trying to create lines of equal width.
;;
;; The window WIN is needed for pixel measuring functions.  Inserting
;; large sets can be slow, so this calls redisplay for every line to
;; give some visual feedback to the user.  Also, the progress is shown
;; in percent in the echo area.
(defun ubb--insert-set (win set)
  (let* ((font-width (ubb--default-font-width))
	 (right-limit (- (window-width win t)
			 (* ubb--right-margin font-width)))
	 (line-start (point))
	 (set-size (ubb--set-size set)))
    (insert-char ?\s ubb--left-margin)
    (ubb--set-foreachi
     (lambda (i codepoint)
       (ubb--insert-codepoint win codepoint font-width)
       (let ((w (car (window-text-pixel-size win line-start (point)))))
	 (when (<= right-limit w)
	   (insert "\n")
	   (setq line-start (point))
	   (insert-char ?\s ubb--left-margin)
	   (message "%.f%%" (* 100.0 (/ (float i) set-size)))
	   (redisplay))))
     set)
    (message nil)))

(defun ubb--clear-codepoint-info ()
  (message nil))


;; Return a short description for codepoint.  This basically the
;; Unicode name.
(defun ubb--short-description (codepoint)
  (let* ((name (get-char-code-property codepoint 'name))
	 (old (get-char-code-property codepoint 'old-name))
	 (cat (get-char-code-property codepoint 'general-category))
	 (catdesc (char-code-property-description 'general-category cat)))
    (format "\"%c\" %s (%s: %s)" codepoint (or name old "[no name]")
	     cat catdesc)))

(defun ubb--show-codepoint-info (codepoint)
  (message "%s" (ubb--short-description codepoint)))

(defun ubb--current-codepoint (&optional noerror)
  (let ((codepoint (get-text-property (point) 'codepoint)))
    (cond (codepoint)
	  (noerror nil)
	  (t (user-error "No codepoint selected")))))

;; This is called from post-command-hook.
(defun ubb--codepoint-sensor ()
  (unless (current-message)
    (let ((codepoint (ubb--current-codepoint t)))
      (cond (codepoint (ubb--show-codepoint-info codepoint))
	    (t (ubb--clear-codepoint-info))))))

;; This called if the mouse pointer hovers around.
(defun ubb--help-echo (_ __ pos)
  (let ((codepoint (get-text-property pos 'codepoint)))
    (if codepoint (ubb--short-description codepoint))))

(defvar ubb--buffer-set)   ; The currently displayed ubb--set
(defvar ubb--buffer-group) ; The group to which ubb--buffer-set belongs

(define-derived-mode ubb-mode fundamental-mode "ubb"
  "Mode for viewing the characters in Unicode blocks and other charsets."
  (setq-local bidi-display-reordering nil)
  (setq-local truncate-lines t)
  (read-only-mode 1)
  (add-hook 'post-command-hook 'ubb--codepoint-sensor nil t))

(defun ubb--buffer-name () "*ubb*")

(defun ubb--get-buffer ()
  (or (get-buffer (ubb--buffer-name))
      (with-current-buffer (get-buffer-create (ubb--buffer-name))
	(ubb-mode)
	(current-buffer))))

(defun ubb--display-set (set)
  (let* ((inhibit-read-only t))
    (erase-buffer)
    (let* ((block-win (display-buffer (current-buffer)))
	   (_ (select-window block-win))
	   (pos (point)))
      (insert "\n")
      (ubb--insert-set block-win set)
      (set-window-point block-win pos)
      (current-buffer))))

;; This is the main entry point.
;;
;; Insert and display the ubb--set SET belonging to ubb--group GROUP.
;; Create a fresh buffer only if needed.  Display the buffer and
;; select its window.  Finally return the buffer.
(defun ubb--browse-set (group set)
  (with-current-buffer (ubb--get-buffer)
    (setq-local ubb--buffer-group group)
    (setq-local ubb--buffer-set set)
    (setq header-line-format (funcall (ubb--group-header group) set))
    (ubb--display-set set)))

\f
;;; Commands

(defun ubb-describe-codepoint-briefly ()
  "Show name and category of the current codepoint."
  (interactive)
  (ubb--show-codepoint-info (ubb--current-codepoint)))

(defun ubb-describe-codepoint ()
  "Describe the current codepoint."
  (interactive)
  (when (ubb--current-codepoint)
    (describe-char (point))))

(defun ubb--next-set (next)
  (let* ((set ubb--buffer-set)
	 (group ubb--buffer-group)
	 (all (ubb--group-sets group))
	 (i (cl-position set all :test #'equal))
	 (j (funcall next i)))
    (cond ((and (<= 0 j) (< j (length all)))
	   (ubb--browse-set group (elt all j)))
	  (t
	   (user-error "No more sets (in group %S)"
		       (ubb--group-name group))))))

(defun ubb-next-set ()
  "Browse the next set of the group."
  (interactive)
  (ubb--next-set #'1+))

(defun ubb-prev-set ()
  "Browse the previous set of the group."
  (interactive)
  (ubb--next-set #'1-))

(defun ubb-select-set-by-name (name)
  "Select the set to browse by name."
  (interactive (list (ubb--read-set-name ubb--buffer-group "Set name: ")))
  (let ((set (or (ubb--find-set-by-name ubb--buffer-group name)
		 (user-error "No set with name: %S" name))))
    (ubb--browse-set ubb--buffer-group set)))

(defun ubb--search-property (prop &optional backward)
  "Search the next text range where PROP is non-nil.
Return the value of PROP.
If BACKWARD is non-nil, search backward."
  (let ((next (cond (backward #'previous-single-char-property-change)
		    (t #'next-single-char-property-change)))
        (start (point))
        (value nil))
    (while (progn
             (goto-char (funcall next (point) prop))
             (not (or (setq value (get-char-property (point) prop))
                      (eobp)
                      (bobp)))))
    (cond (value)
          (t (goto-char start) nil))))

(defun ubb-forward-codepoint ()
  "Move cursor to the next codepoint."
  (interactive)
  (or (ubb--search-property 'codepoint nil)
      (user-error "No more codepoints")))

(defun ubb-backward-codepoint ()
  "Move cursor to the previous codepoint."
  (interactive)
  (or (ubb--search-property 'codepoint t)
      (user-error "No more codepoints")))

(defun ubb-browse-block (block &optional codepoint)
  "Browse the Unicode block BLOCK.
Interactively without prefix arg, prompt for the block name.
With negative prefix arg, use the character at point to find
the corresponding block.
With positive positive arg, prompt for the name or number of the codepoint
\(see `read-char-by-name')."
  (interactive
   (cond ((not current-prefix-arg)
	  (let ((name (ubb--read-set-name ubb--unicode-blocks-group
					  "Block name: ")))
	    (list (or (ubb--find-set-by-name ubb--unicode-blocks-group name)
		      (user-error "No block with named: %S" name)))))
	 (t
	  (let* ((codepoint
		  (cond ((< (prefix-numeric-value current-prefix-arg) 0)
			 (char-after))
			(t
			 (read-char-by-name
			  "Codepoint (Unicode name or hex): "))))
		 (block (or (ubb--find-block-by-codepoint codepoint)
			    (user-error "No block for codepoint: %X"
					codepoint))))
	    (list block codepoint)))))
  (with-current-buffer (ubb--browse-set ubb--unicode-blocks-group block)
    (when codepoint
      (search-forward (string codepoint))
      (backward-char))))

(defun ubb-browse-block-by-codepoint ()
  "Very similar to `ubb-browse-block'.
The only difference is that when invoked without prefix arg,
prompt for the codepoint instead for the Unicode block."
  (interactive)
  (let ((current-prefix-arg (or current-prefix-arg '(4))))
    (call-interactively #'ubb-browse-block)))

(defun ubb--browse-group (group)
  (ubb--browse-set group (elt (ubb--group-sets group) 0)))

(defun ubb-browse-group-by-name (name)
  "Prompt for a group name and display the first set in the group."
  (interactive (list (ubb--read-group-name "Group name: ")))
  (let ((group (or (ubb--find-group-by-name name)
		   (user-error "No group with name: %S" name))))
    (ubb--browse-group group)))

(defun ubb-reset-text-scale ()
  (interactive)
  (text-scale-set 0))

(defun ubb-redraw ()
  "Redraw the current set."
  (interactive)
  (ubb--display-set ubb--buffer-set))

(defun ubb-browse ()
  "Start the character browser."
  (interactive)
  (let ((buffer (get-buffer (ubb--buffer-name))))
    (cond (buffer (with-current-buffer buffer
		    (ubb--browse-set ubb--buffer-group ubb--buffer-set)))
	  (t (ubb--browse-group ubb--unicode-blocks-group)))))

(defun ubb-quit ()
  "Close the UBB window."
  (interactive)
  (quit-restore-window nil 'bury))

\f
;;; Menu

;; Return an uninterned symbol with FUN set as it function.  This is a
;; trick to put closures into menus.
(defun ubb--fake-menu-symbol (fun)
  (let ((sym (make-symbol "fake-menu-filter-symbol")))
    (fset sym fun)
    sym))

(defun ubb--build-set-menu (group)
  (mapcar (lambda (set)
	    (vector (ubb--set-name set)
		    (ubb--fake-menu-symbol
		     (lambda ()
		       (interactive)
		       (ubb--browse-set group set)))))
	  (ubb--group-sets group)))

(defun ubb--set-menu-filter (_others)
  (ubb--build-set-menu ubb--buffer-group))

(defun ubb--build-group-menu ()
  (mapcar (lambda (group)
	    (list (ubb--group-name group)
		  :filter (ubb--fake-menu-symbol
			   (lambda (_) (ubb--build-set-menu group)))))
	  (ubb--all-groups)))

(easy-menu-define nil ubb-mode-map
  "Menu for UBB mode."
  `("Character-Browser"
    ,@(ubb--build-group-menu)
    "--"
    ["Select group by name" ubb-browse-group-by-name]
    ["Select set by name" ubb-select-set-by-name]
    ["Select Unicode block by codepoint" ubb-browse-block-by-codepoint]
    ("Select set in current group"
     ("Sets in current group" :filter ubb--set-menu-filter)
     ["Next set in group" ubb-next-set :key-sequence ">"]
     ["Previous set in group" ubb-prev-set :key-sequence "<"])
    "--"
    ["Describe character briefly" ubb-describe-codepoint-briefly]
    ["Show character details" ubb-describe-codepoint]
    ("Movement"
     ["Move to next character" ubb-forward-codepoint]
     ["Move to previous character" ubb-backward-codepoint])
    ("Zoom"
     ["Increase scale factor" text-scale-increase]
     ["Decrease scale factor" text-scale-decrease]
     ["Reset scale factor" ubb-reset-text-scale])
    "--"
    ["Redraw" ubb-redraw]
    ["Quit" ubb-quit]))

\f
;;; Key bindings

(define-key ubb-mode-map (kbd "<SPC>") #'ubb-describe-codepoint-briefly)
(define-key ubb-mode-map (kbd "D") #'ubb-describe-codepoint)
(define-key ubb-mode-map (kbd "f") #'ubb-forward-codepoint)
(define-key ubb-mode-map (kbd "b") #'ubb-backward-codepoint)
(define-key ubb-mode-map (kbd "n") #'ubb-next-set)
(define-key ubb-mode-map (kbd "p") #'ubb-prev-set)
(define-key ubb-mode-map (kbd ">") #'ubb-next-set)
(define-key ubb-mode-map (kbd "<") #'ubb-prev-set)
(define-key ubb-mode-map (kbd "N") #'ubb-select-set-by-name)
(define-key ubb-mode-map (kbd "G") #'ubb-browse-group-by-name)
(define-key ubb-mode-map (kbd "C") #'ubb-browse-block-by-codepoint)
(define-key ubb-mode-map (kbd "+") #'text-scale-increase)
(define-key ubb-mode-map (kbd "-") #'text-scale-decrease)
(define-key ubb-mode-map (kbd "*") #'ubb-reset-text-scale)
(define-key ubb-mode-map (kbd "g") #'ubb-redraw)
(define-key ubb-mode-map (kbd "q") #'ubb-quit)

(provide 'ubb)

^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-06 11:56                           ` Helmut Eller
@ 2016-02-06 12:25                             ` Eli Zaretskii
  2016-02-06 13:59                               ` Helmut Eller
  2016-02-12 11:20                               ` Helmut Eller
  2016-02-07 18:33                             ` Richard Stallman
  1 sibling, 2 replies; 128+ messages in thread
From: Eli Zaretskii @ 2016-02-06 12:25 UTC (permalink / raw)
  To: Helmut Eller; +Cc: emacs-devel

> From: Helmut Eller <eller.helmut@gmail.com>
> Date: Sat, 06 Feb 2016 12:56:14 +0100
> 
> On Tue, Jan 26 2016, Richard Stallman wrote:
> 
> > Would someone please implement this?
> 
> Here is my shot at this.  Load the attached file and start the browser
> with "M-x ubb-browse". That displays the characters of the "Basic Latin"
> block.  From there it's probably the easiest to use the menu to explore
> the available commands.
> 
> I defined a sets of characters for some languages by looking at
> Wikipedia.  This would obviously need more work by people who are
> familiar with those languages.
> 
> The file is also available at: https://github.com/ellerh/ubb

Thanks, I think this is very good.

One aspect where some improvement is probably needed is when
displaying large ranges of characters.  For example, select
"Scripts->symbol" from the "Character-Browser" menu -- this displays
all the punctuation characters defined by Unicode.  You get 160 lines
that display something like 4K characters, which takes a long time to
display (because Emacs looks for a suitable font), and somewhat hard
to view.  Maybe we should display with those +/- widgets that allow
showing and hiding portions of the characters, so that each 256
characters could be shown or hidden separately?

Also, I think unassigned codepoints should not be shown, and the same
for Surrogates and Private-Area codepoints.  They will never yield
anything but those rectangles with a codepoint in hex inside them.

Finally, I think a command to insert the character at point into
another buffer would be a good addition.

Thanks again for working on this.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-06 12:25                             ` Eli Zaretskii
@ 2016-02-06 13:59                               ` Helmut Eller
  2016-02-06 14:30                                 ` Eli Zaretskii
  2016-02-12 11:20                               ` Helmut Eller
  1 sibling, 1 reply; 128+ messages in thread
From: Helmut Eller @ 2016-02-06 13:59 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

On Sat, Feb 06 2016, Eli Zaretskii wrote:

> One aspect where some improvement is probably needed is when
> displaying large ranges of characters.  For example, select
> "Scripts->symbol" from the "Character-Browser" menu -- this displays
> all the punctuation characters defined by Unicode.  You get 160 lines
> that display something like 4K characters, which takes a long time to
> display (because Emacs looks for a suitable font), and somewhat hard
> to view.  Maybe we should display with those +/- widgets that allow
> showing and hiding portions of the characters, so that each 256
> characters could be shown or hidden separately?

Maybe. That's definitely more difficult to implement.  In general, there
is no way around that some sets are just big and that some people will
want see all characters.

Maybe some work could be done with "background" timers, e.g. insert 20
lines then wait a bit before starting the next timer and so on.

> Also, I think unassigned codepoints should not be shown, and the same
> for Surrogates and Private-Area codepoints.  They will never yield
> anything but those rectangles with a codepoint in hex inside them.

Not sure about this.  E.g. if somebody want to see an Unicode block he
may well want to see the range defined by the standard.  I also think
that some fonts do assign glyphs in private-use areas.  A part of the
high surrogates seems to be available for private-use as well.

However, using the same glyph for all unassigned codepoints might speed
up things a bit.

> Finally, I think a command to insert the character at point into
> another buffer would be a good addition.

It's not so easy to know where the charactor should be inserted.  Maybe
a marker could be used, but I suspect that that would be confusing.

I had implement a insert-char command that called the browser in a
recursive edit.  It worked but it definitely was confusing.

So my thinking is that the usual commands for copying a character to the
kill ring or copy&pasting it with the mouse is sufficient.

Helmut



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-06 13:59                               ` Helmut Eller
@ 2016-02-06 14:30                                 ` Eli Zaretskii
  0 siblings, 0 replies; 128+ messages in thread
From: Eli Zaretskii @ 2016-02-06 14:30 UTC (permalink / raw)
  To: Helmut Eller; +Cc: emacs-devel

> From: Helmut Eller <eller.helmut@gmail.com>
> Cc: emacs-devel@gnu.org
> Date: Sat, 06 Feb 2016 14:59:15 +0100
> 
> > Also, I think unassigned codepoints should not be shown, and the same
> > for Surrogates and Private-Area codepoints.  They will never yield
> > anything but those rectangles with a codepoint in hex inside them.
> 
> Not sure about this.  E.g. if somebody want to see an Unicode block he
> may well want to see the range defined by the standard.  I also think
> that some fonts do assign glyphs in private-use areas.  A part of the
> high surrogates seems to be available for private-use as well.

If those use cases exist, they are rare.  So a customizable option,
off by default, would be useful, I think.

> > Finally, I think a command to insert the character at point into
> > another buffer would be a good addition.
> 
> It's not so easy to know where the charactor should be inserted.

I thought about prompting for it.  It's simple, and gets the job done.

> So my thinking is that the usual commands for copying a character to the
> kill ring or copy&pasting it with the mouse is sufficient.

Yes, but if the prompt for the buffer offers the MRU buffer as the
default, all one needs is type RET RET (the first one to invoke the
command, the second one to accept the default buffer), which is faster
and more efficient, I think.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-06 11:56                           ` Helmut Eller
  2016-02-06 12:25                             ` Eli Zaretskii
@ 2016-02-07 18:33                             ` Richard Stallman
  2016-02-07 18:42                               ` Clément Pit--Claudel
                                                 ` (2 more replies)
  1 sibling, 3 replies; 128+ messages in thread
From: Richard Stallman @ 2016-02-07 18:33 UTC (permalink / raw)
  To: Helmut Eller; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

This looks pretty good.  It needs to be a little more
self-documenting; for instance, it should say how to switch to another
block.  It has a lot of commands:

    (define-key ubb-mode-map (kbd "<SPC>") #'ubb-describe-codepoint-briefly)
    (define-key ubb-mode-map (kbd "D") #'ubb-describe-codepoint)
    (define-key ubb-mode-map (kbd "f") #'ubb-forward-codepoint)
    (define-key ubb-mode-map (kbd "b") #'ubb-backward-codepoint)
    (define-key ubb-mode-map (kbd "n") #'ubb-next-set)
    (define-key ubb-mode-map (kbd "p") #'ubb-prev-set)
    (define-key ubb-mode-map (kbd ">") #'ubb-next-set)
    (define-key ubb-mode-map (kbd "<") #'ubb-prev-set)
    (define-key ubb-mode-map (kbd "N") #'ubb-select-set-by-name)
    (define-key ubb-mode-map (kbd "G") #'ubb-browse-group-by-name)
    (define-key ubb-mode-map (kbd "C") #'ubb-browse-block-by-codepoint)
    (define-key ubb-mode-map (kbd "+") #'text-scale-increase)
    (define-key ubb-mode-map (kbd "-") #'text-scale-decrease)
    (define-key ubb-mode-map (kbd "*") #'ubb-reset-text-scale)
    (define-key ubb-mode-map (kbd "g") #'ubb-redraw)
    (define-key ubb-mode-map (kbd "q") #'ubb-quit)

and it isn't obvious to me what they all do.

Many of the characters don't display on my console,
Have we got a way to tell, in Emacs Lisp, whether a certain
character code can actually display?  I think there is one.

Could this use that to show something meaningful,
for characters that can't really display?  For instance,
a sequence of 2 or 3 characters that somehow stands for
the real character?

For instance, the sequence << could stand for «, and
the sequence i-. could stand for dotless i.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-07 18:33                             ` Richard Stallman
@ 2016-02-07 18:42                               ` Clément Pit--Claudel
  2016-02-08 14:15                                 ` Stefan Monnier
  2016-02-07 22:02                               ` John Wiegley
  2016-02-12 11:32                               ` Helmut Eller
  2 siblings, 1 reply; 128+ messages in thread
From: Clément Pit--Claudel @ 2016-02-07 18:42 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 307 bytes --]

On 02/07/2016 01:33 PM, Richard Stallman wrote:
> Many of the characters don't display on my console,
> Have we got a way to tell, in Emacs Lisp, whether a certain
> character code can actually display?  I think there is one.

Do we? That would be wonderful! But I don't think we do, unfortunately.


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-07 18:33                             ` Richard Stallman
  2016-02-07 18:42                               ` Clément Pit--Claudel
@ 2016-02-07 22:02                               ` John Wiegley
  2016-02-08 13:02                                 ` Richard Stallman
  2016-02-08 14:18                                 ` Stefan Monnier
  2016-02-12 11:32                               ` Helmut Eller
  2 siblings, 2 replies; 128+ messages in thread
From: John Wiegley @ 2016-02-07 22:02 UTC (permalink / raw)
  To: Richard Stallman; +Cc: Helmut Eller, emacs-devel

>>>>> Richard Stallman <rms@gnu.org> writes:

> For instance, the sequence << could stand for «, and the sequence i-. could
> stand for dotless i.

Waiting to see what you display for white and black snowman.. :)

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-07 22:02                               ` John Wiegley
@ 2016-02-08 13:02                                 ` Richard Stallman
  2016-02-08 17:34                                   ` Eli Zaretskii
  2016-02-09  6:01                                   ` Alexis
  2016-02-08 14:18                                 ` Stefan Monnier
  1 sibling, 2 replies; 128+ messages in thread
From: Richard Stallman @ 2016-02-08 13:02 UTC (permalink / raw)
  To: John Wiegley; +Cc: eller.helmut, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Waiting to see what you display for white and black snowman.. :)

I don't think I have ever seen that character -- I don't know
what it looks like.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-07 18:42                               ` Clément Pit--Claudel
@ 2016-02-08 14:15                                 ` Stefan Monnier
  2016-02-08 14:25                                   ` Andreas Schwab
  0 siblings, 1 reply; 128+ messages in thread
From: Stefan Monnier @ 2016-02-08 14:15 UTC (permalink / raw)
  To: emacs-devel

>> Many of the characters don't display on my console,
>> Have we got a way to tell, in Emacs Lisp, whether a certain
>> character code can actually display?  I think there is one.
> Do we? That would be wonderful! But I don't think we do, unfortunately.

char-displayable-p?


        Stefan




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-07 22:02                               ` John Wiegley
  2016-02-08 13:02                                 ` Richard Stallman
@ 2016-02-08 14:18                                 ` Stefan Monnier
  1 sibling, 0 replies; 128+ messages in thread
From: Stefan Monnier @ 2016-02-08 14:18 UTC (permalink / raw)
  To: emacs-devel

>> For instance, the sequence << could stand for «, and the sequence i-. could
>> stand for dotless i.

lisp/term/internal.el has quite a few such mappings already, so we could
try and reuse that, if we decide we want this feature.

> Waiting to see what you display for white and black snowman.. :)

Sorry, I couldn't see them, they were hiding behind the green bigfoot.


        Stefan




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-08 14:15                                 ` Stefan Monnier
@ 2016-02-08 14:25                                   ` Andreas Schwab
  2016-02-09 12:14                                     ` Richard Stallman
  0 siblings, 1 reply; 128+ messages in thread
From: Andreas Schwab @ 2016-02-08 14:25 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> writes:

> char-displayable-p?

That is useless for a TTY frame.  It can only check whether the
character is encodable in the terminal coding system, which is trivially
true for UTF-8.  Even for a multi-font display it is only approximate.

Andreas.

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-08 13:02                                 ` Richard Stallman
@ 2016-02-08 17:34                                   ` Eli Zaretskii
  2016-02-09 12:14                                     ` Richard Stallman
  2016-02-09  6:01                                   ` Alexis
  1 sibling, 1 reply; 128+ messages in thread
From: Eli Zaretskii @ 2016-02-08 17:34 UTC (permalink / raw)
  To: rms; +Cc: johnw, eller.helmut, emacs-devel

> From: Richard Stallman <rms@gnu.org>
> Date: Mon, 08 Feb 2016 08:02:42 -0500
> Cc: eller.helmut@gmail.com, emacs-devel@gnu.org
> 
>   > Waiting to see what you display for white and black snowman.. :)
> 
> I don't think I have ever seen that character -- I don't know
> what it looks like.

Like a small snowman.  (There's no white snowman, AFAIK, it's called
"snowman without snow".)




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-08 13:02                                 ` Richard Stallman
  2016-02-08 17:34                                   ` Eli Zaretskii
@ 2016-02-09  6:01                                   ` Alexis
  2016-02-09 15:21                                     ` Drew Adams
  2016-02-10  0:08                                     ` Richard Stallman
  1 sibling, 2 replies; 128+ messages in thread
From: Alexis @ 2016-02-09  6:01 UTC (permalink / raw)
  To: rms; +Cc: John Wiegley, eller.helmut, emacs-devel


Richard Stallman <rms@gnu.org> writes:

>> Waiting to see what you display for white and black 
>> snowman.. :)
>
> I don't think I have ever seen that character -- I don't know 
> what it looks like.

My guess is that, in response to you wondering:

> Could this use that to show something meaningful, for characters 
> that can't really display?  For instance, a sequence of 2 or 3 
> characters that somehow stands for the real character? 
 
> For instance, the sequence << could stand for «, and the 
> sequence i-. could stand for dotless i. 

John might have been referring to the large swathes of Unicode 
that don't necessarily have an 'obvious' representation in such a 
form. For example:

* CJK-related characters;
* the "Musical symbols" characters;
* many of the "Miscellaneous symbols" characters.

Additionally, there are lots of opportunities for bikeshedding 
over the representations of certain characters. Take ☺, WHITE 
SMILING FACE. Off the top of my head, i can imagine that being 
represented by ':-)', but i frequently encounter people using ':)' 
and '(-:' to represent the 'smiling face' concept instead.

Together, these issues seem to me to suggest that it might be 
non-trivial to attempt to build a table of ASCII representations 
of various Unicode characters. 


Alexis.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-08 14:25                                   ` Andreas Schwab
@ 2016-02-09 12:14                                     ` Richard Stallman
  2016-02-09 17:18                                       ` Eli Zaretskii
  0 siblings, 1 reply; 128+ messages in thread
From: Richard Stallman @ 2016-02-09 12:14 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > char-displayable-p?

  > That is useless for a TTY frame.

It should be possible to make it smarter
if it is told which font the tty is displaying.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-08 17:34                                   ` Eli Zaretskii
@ 2016-02-09 12:14                                     ` Richard Stallman
  2016-02-09 13:26                                       ` Dale Snell
  2016-02-09 17:14                                       ` Eli Zaretskii
  0 siblings, 2 replies; 128+ messages in thread
From: Richard Stallman @ 2016-02-09 12:14 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: johnw, eller.helmut, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Like a small snowman.

Without seeing it, I think maybe a combination including 8 might be good
to represent it.  Perhaps `8^ or \8/.

			   (There's no white snowman, AFAIK, it's called
  > "snowman without snow".)

Is that the space character?

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-09 12:14                                     ` Richard Stallman
@ 2016-02-09 13:26                                       ` Dale Snell
  2016-02-10  0:11                                         ` Richard Stallman
  2016-02-09 17:14                                       ` Eli Zaretskii
  1 sibling, 1 reply; 128+ messages in thread
From: Dale Snell @ 2016-02-09 13:26 UTC (permalink / raw)
  To: emacs-devel; +Cc: rms

[-- Attachment #1: Type: text/plain, Size: 1159 bytes --]

On Tue, 09 Feb 2016 07:14:50 -0500, in message
E1aT7By-00056G-8Y@fencepost.gnu.org, Richard Stallman wrote:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> 
>   > Like a small snowman.
> 
> Without seeing it, I think maybe a combination including 8 might be
> good to represent it.  Perhaps `8^ or \8/.
> 
> 			   (There's no white snowman, AFAIK, it's
> called
>   > "snowman without snow".)
> 
> Is that the space character?
> 

No, it's not a space.  Here they are: "⛄" "⛇".  The first one is
U+26C4, SNOWMAN WITHOUT SNOW (a.k.a., light snow); the second one
is U+26C7 BLACK SNOWMAN (a.k.a., heavy snow).

BTW, the Turkish and Azerbaijani dotless i is U+0131 LATIN SMALL
LETTER DOTLESS I: "ı".  I had to use the search function in the
Gnome character map to find it.  Search for "dotless" and check
the "Search in character details" box.

--Dale

-- 
Sign in coffee shop:  "Children left unattended will be given an
espresso and a Free Puppy."

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 128+ messages in thread

* RE: Entering Unicode characters
  2016-02-09  6:01                                   ` Alexis
@ 2016-02-09 15:21                                     ` Drew Adams
  2016-02-10  0:11                                       ` Richard Stallman
       [not found]                                       ` <<E1aTINY-0007Rg-IA@fencepost.gnu.org>
  2016-02-10  0:08                                     ` Richard Stallman
  1 sibling, 2 replies; 128+ messages in thread
From: Drew Adams @ 2016-02-09 15:21 UTC (permalink / raw)
  To: Alexis, rms; +Cc: John Wiegley, eller.helmut, emacs-devel

> Together, these issues seem to me to suggest that it might be
> non-trivial to attempt to build a table of ASCII representations
> of various Unicode characters.

Next up: Unicode emoji.
http://unicode.org/emoji/charts/full-emoji-list.html



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-09 12:14                                     ` Richard Stallman
  2016-02-09 13:26                                       ` Dale Snell
@ 2016-02-09 17:14                                       ` Eli Zaretskii
  1 sibling, 0 replies; 128+ messages in thread
From: Eli Zaretskii @ 2016-02-09 17:14 UTC (permalink / raw)
  To: rms; +Cc: johnw, eller.helmut, emacs-devel

> From: Richard Stallman <rms@gnu.org>
> CC: johnw@gnu.org, eller.helmut@gmail.com, emacs-devel@gnu.org
> Date: Tue, 09 Feb 2016 07:14:50 -0500
> 
> 			   (There's no white snowman, AFAIK, it's called
>   > "snowman without snow".)
> 
> Is that the space character?

:-) I wish.  No, it's the same shape as the other one, but just a
contour (the other one is filled with foreground color).



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-09 12:14                                     ` Richard Stallman
@ 2016-02-09 17:18                                       ` Eli Zaretskii
  2016-02-10  0:12                                         ` Richard Stallman
  0 siblings, 1 reply; 128+ messages in thread
From: Eli Zaretskii @ 2016-02-09 17:18 UTC (permalink / raw)
  To: rms; +Cc: schwab, monnier, emacs-devel

> From: Richard Stallman <rms@gnu.org>
> Date: Tue, 09 Feb 2016 07:14:02 -0500
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
>   > > char-displayable-p?
> 
>   > That is useless for a TTY frame.
> 
> It should be possible to make it smarter
> if it is told which font the tty is displaying.

When Emacs displays on a TTY frame, the font is out of its control.
The font is determined by the terminal emulator or the console config
files, and Emacs wouldn't know where to find the font even when told
its name.

In particular, if you login from another machine, the font used by the
terminal emulator is not accessible at all for Emacs that runs on the
remote.

So I think what you envision is impossible, or at least impractical.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-09  6:01                                   ` Alexis
  2016-02-09 15:21                                     ` Drew Adams
@ 2016-02-10  0:08                                     ` Richard Stallman
  2016-02-10  4:17                                       ` Jose E. Marchesi
  1 sibling, 1 reply; 128+ messages in thread
From: Richard Stallman @ 2016-02-10  0:08 UTC (permalink / raw)
  To: Alexis; +Cc: johnw, eller.helmut, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Additionally, there are lots of opportunities for bikeshedding 
  > over the representations of certain characters. Take ☺, WHITE 
  > SMILING FACE. Off the top of my head, i can imagine that being 
  > represented by ':-)', but i frequently encounter people using ':)' 
  > and '(-:' to represent the 'smiling face' concept instead.

Just pick one.  Since the representation will be used only in this
one feature, the choice is not crucial.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-09 13:26                                       ` Dale Snell
@ 2016-02-10  0:11                                         ` Richard Stallman
  0 siblings, 0 replies; 128+ messages in thread
From: Richard Stallman @ 2016-02-10  0:11 UTC (permalink / raw)
  To: ddsnell; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > 			   (There's no white snowman, AFAIK, it's called
  > >   > "snowman without snow".)

  > > Is that the space character?

  > No, it's not a space.

I was making a joke.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-09 15:21                                     ` Drew Adams
@ 2016-02-10  0:11                                       ` Richard Stallman
  2016-02-10  1:16                                         ` Alexis
       [not found]                                       ` <<E1aTINY-0007Rg-IA@fencepost.gnu.org>
  1 sibling, 1 reply; 128+ messages in thread
From: Richard Stallman @ 2016-02-10  0:11 UTC (permalink / raw)
  To: Drew Adams; +Cc: eller.helmut, johnw, flexibeast, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Next up: Unicode emoji.
  > http://unicode.org/emoji/charts/full-emoji-list.html

We can probably find emoticons to stand for some of them.
And if we can't...so what?

I suggested that it would be good to come up with short ASCII visual
representations of SOME of these Unicode characters _for ubb-browse_.

You seem to be trying to prove we can't do this for ALL the Unicode
characters, but I never said we could do them all.  Doing it for just
some characters will be useful.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-09 17:18                                       ` Eli Zaretskii
@ 2016-02-10  0:12                                         ` Richard Stallman
  2016-02-10 17:52                                           ` Eli Zaretskii
  0 siblings, 1 reply; 128+ messages in thread
From: Richard Stallman @ 2016-02-10  0:12 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: schwab, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > When Emacs displays on a TTY frame, the font is out of its control.
  > The font is determined by the terminal emulator or the console config
  > files,

That's right.

	   and Emacs wouldn't know where to find the font even when told
  > its name.

Why not?  Emacs could know the usual place where these font files are
stored, and some Lisp code could find a particular font file
just like the command that tells the terminal which font to use.

  > In particular, if you login from another machine, the font used by the
  > terminal emulator is not accessible at all for Emacs that runs on the
  > remote.

In theory, it might not be present on the machine Emacs is running on.
But in practice, it probably is present, if they are both GNU/Linux.

And if the font is NOT present there, you could copy it there and tell
Emacs the file name to find it in.

So I think what I proposed is doable, practically speaking.

It would take work, of course, but there is nothing difficult about it
in principle.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-10  0:11                                       ` Richard Stallman
@ 2016-02-10  1:16                                         ` Alexis
  2016-02-10 14:16                                           ` Richard Stallman
  0 siblings, 1 reply; 128+ messages in thread
From: Alexis @ 2016-02-10  1:16 UTC (permalink / raw)
  To: rms; +Cc: johnw, eller.helmut, Drew Adams, emacs-devel


Richard Stallman <rms@gnu.org> writes:

> I suggested that it would be good to come up with short ASCII 
> visual representations of SOME of these Unicode characters _for 
> ubb-browse_.
>
> You seem to be trying to prove we can't do this for ALL the 
> Unicode characters, but I never said we could do them all. 
> Doing it for just some characters will be useful.

What i was trying to say was that, setting aside the difficulty of 
create an ASCII representation for /all/ Unicode codepoints, i 
could foresee a lot of energy being sunk into debates over the 
'best' representation for even /some/ of the codepoints. You 
wrote:

> Just pick one.  Since the representation will be used only in 
> this one feature, the choice is not crucial. 

i tend to agree, but my experience with these sort of situations 
suggests that there will be a number of people feeling that the 
colour of the bikeshed /is/ a crucial matter. :-) But i guess 
we'll see what happens!


Alexis.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* RE: Entering Unicode characters
       [not found]                                       ` <<E1aTINY-0007Rg-IA@fencepost.gnu.org>
@ 2016-02-10  2:07                                         ` Drew Adams
  2016-02-10  4:14                                           ` Elias Mårtenson
  0 siblings, 1 reply; 128+ messages in thread
From: Drew Adams @ 2016-02-10  2:07 UTC (permalink / raw)
  To: rms, Drew Adams; +Cc: flexibeast, johnw, eller.helmut, emacs-devel

>   > Next up: Unicode emoji.
>   > http://unicode.org/emoji/charts/full-emoji-list.html
> 
> We can probably find emoticons to stand for some of them.
> And if we can't...so what?
> 
> I suggested that it would be good to come up with short ASCII visual
> representations of SOME of these Unicode characters _for ubb-browse_.
> 
> You seem to be trying to prove we can't do this for ALL the Unicode
> characters, but I never said we could do them all.  Doing it for just
> some characters will be useful.

I was kidding about emoji.

(You might be confusing me with someone else who spoke against
your idea of ASCII representations.)



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-10  2:07                                         ` Drew Adams
@ 2016-02-10  4:14                                           ` Elias Mårtenson
  2016-02-10 14:15                                             ` Richard Stallman
  0 siblings, 1 reply; 128+ messages in thread
From: Elias Mårtenson @ 2016-02-10  4:14 UTC (permalink / raw)
  To: Drew Adams; +Cc: eller.helmut, johnw, flexibeast, rms, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 855 bytes --]

On 10 February 2016 at 10:07, Drew Adams <drew.adams@oracle.com> wrote:


> > You seem to be trying to prove we can't do this for ALL the Unicode
> > characters, but I never said we could do them all.  Doing it for just
> > some characters will be useful.
>
> I was kidding about emoji.
>
> (You might be confusing me with someone else who spoke against
> your idea of ASCII representations.)
>

I know this can't be used in a summary screen containing more than one
character, but how about drawing a bitmap version of the character? If you
use a, say, 32×32 grid you can represent pretty much anything. I can
envision this being a useful thing to include in the C-u C-x = output.

At least this would allow a user on an ASCII terminal (or even one on a
graphical terminal with incomplete fonts) to see what a character looks
like.

[-- Attachment #2: Type: text/html, Size: 1246 bytes --]

^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-10  0:08                                     ` Richard Stallman
@ 2016-02-10  4:17                                       ` Jose E. Marchesi
  0 siblings, 0 replies; 128+ messages in thread
From: Jose E. Marchesi @ 2016-02-10  4:17 UTC (permalink / raw)
  To: Richard Stallman; +Cc: eller.helmut, johnw, Alexis, emacs-devel

    
I propose to use the ASCII sequence 'vi' to represent U+1F4A9.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-10  4:14                                           ` Elias Mårtenson
@ 2016-02-10 14:15                                             ` Richard Stallman
  0 siblings, 0 replies; 128+ messages in thread
From: Richard Stallman @ 2016-02-10 14:15 UTC (permalink / raw)
  To: Elias Mårtenson
  Cc: eller.helmut, johnw, flexibeast, drew.adams, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I know this can't be used in a summary screen containing more than one
  > character, but how about drawing a bitmap version of the character? If you
  > use a, say, 32×32 grid you can represent pretty much anything. I can
  > envision this being a useful thing to include in the C-u C-x = output.

  > At least this would allow a user on an ASCII terminal (or even one on a
  > graphical terminal with incomplete fonts) to see what a character looks
  > like.

It would be useful to be able to see a character that way, but it
would have to work via requesting to see one specific character.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-10  1:16                                         ` Alexis
@ 2016-02-10 14:16                                           ` Richard Stallman
  2016-02-11 18:59                                             ` John Wiegley
  0 siblings, 1 reply; 128+ messages in thread
From: Richard Stallman @ 2016-02-10 14:16 UTC (permalink / raw)
  To: Alexis; +Cc: johnw, eller.helmut, drew.adams, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > i tend to agree, but my experience with these sort of situations 
  > suggests that there will be a number of people feeling that the 
  > colour of the bikeshed /is/ a crucial matter.

I think John Wiegley can end such arguments, if necessary.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-10  0:12                                         ` Richard Stallman
@ 2016-02-10 17:52                                           ` Eli Zaretskii
  2016-02-11 18:19                                             ` Richard Stallman
  0 siblings, 1 reply; 128+ messages in thread
From: Eli Zaretskii @ 2016-02-10 17:52 UTC (permalink / raw)
  To: rms; +Cc: schwab, monnier, emacs-devel

> From: Richard Stallman <rms@gnu.org>
> CC: schwab@suse.de, monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Tue, 09 Feb 2016 19:12:34 -0500
> 
> 	   and Emacs wouldn't know where to find the font even when told
>   > its name.
> 
> Why not?  Emacs could know the usual place where these font files are
> stored, and some Lisp code could find a particular font file
> just like the command that tells the terminal which font to use.

How can it know?  Emacs compiled --without-x doesn't even have
font-related code compiled in.  And even if it had, the terminal
emulator might very well use a different font back-end, which keeps
font information in a different place.  Especially if the terminal
emulator runs on a different OS.

>   > In particular, if you login from another machine, the font used by the
>   > terminal emulator is not accessible at all for Emacs that runs on the
>   > remote.
> 
> In theory, it might not be present on the machine Emacs is running on.
> But in practice, it probably is present, if they are both GNU/Linux.

You can still have different versions of the same font even in this
special case.

> And if the font is NOT present there, you could copy it there and tell
> Emacs the file name to find it in.

So maybe a better solution would be a feature that would tell Emacs
explicitly, by user initiative, which characters are displayable?  The
user would run some utility to find that out, and then communicate the
results to Emacs via some customization.  That sounds more reliable to
me than have Emacs assume something about fonts in two different
places.



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-10 17:52                                           ` Eli Zaretskii
@ 2016-02-11 18:19                                             ` Richard Stallman
  0 siblings, 0 replies; 128+ messages in thread
From: Richard Stallman @ 2016-02-11 18:19 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: schwab, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > Why not?  Emacs could know the usual place where these font files are
  > > stored, and some Lisp code could find a particular font file
  > > just like the command that tells the terminal which font to use.

  > How can it know?  Emacs compiled --without-x doesn't even have
  > font-related code compiled in.  And even if it had, the terminal
  > emulator might very well use a different font back-end, which keeps
  > font information in a different place.  Especially if the terminal
  > emulator runs on a different OS.

So the feature won't work in that case.

We don't have to choose between perfection and nothing.

  > So maybe a better solution would be a feature that would tell Emacs
  > explicitly, by user initiative, which characters are displayable?  The
  > user would run some utility to find that out, and then communicate the
  > results to Emacs via some customization.  That sounds more reliable to
  > me than have Emacs assume something about fonts in two different
  > places.

That's a good idea.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-10 14:16                                           ` Richard Stallman
@ 2016-02-11 18:59                                             ` John Wiegley
  0 siblings, 0 replies; 128+ messages in thread
From: John Wiegley @ 2016-02-11 18:59 UTC (permalink / raw)
  To: Richard Stallman; +Cc: eller.helmut, Alexis, drew.adams, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 644 bytes --]

>>>>> Richard Stallman <rms@gnu.org> writes:

>> i tend to agree, but my experience with these sort of situations suggests
>> that there will be a number of people feeling that the colour of the
>> bikeshed /is/ a crucial matter.

> I think John Wiegley can end such arguments, if necessary.

Indeed. Now, Emacs-Tangents welcomes any and all bikeshedding discussions, so
please feel free if you believe that antique lace and desert bone should be
considered separate colors. :)

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 629 bytes --]

^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-06 12:25                             ` Eli Zaretskii
  2016-02-06 13:59                               ` Helmut Eller
@ 2016-02-12 11:20                               ` Helmut Eller
  1 sibling, 0 replies; 128+ messages in thread
From: Helmut Eller @ 2016-02-12 11:20 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 937 bytes --]

On Sat, Feb 06 2016, Eli Zaretskii wrote:

> Maybe we should display with those +/- widgets that allow
> showing and hiding portions of the characters, so that each 256
> characters could be shown or hidden separately?

Here is an updated version that uses +/- buttons.

> Also, I think unassigned codepoints should not be shown, and the same
> for Surrogates and Private-Area codepoints.  They will never yield
> anything but those rectangles with a codepoint in hex inside them.

The categories Cn, Cs, and Co are now hidden by default.

For some reason, raw bytes also belong to the Cn category so are not
shown by default.

I discovered that Emacs displays 8-bit control codes the same as raw
bytes, e.g. the char-codes #x82 and #x3FFF82 are both displayed as \202.
I think this is confusing.

> Finally, I think a command to insert the character at point into
> another buffer would be a good addition.

I added that, too.

Helmut


[-- Attachment #2: ubb.el --]
[-- Type: application/emacs-lisp, Size: 36463 bytes --]

;;; ubb.el --- Unicode block browser      -*-coding:utf-8; lexical-binding:t-*-

;; Copyright (C) 2016 Free Software Foundation, Inc.

;; GNU Emacs 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.

;; GNU Emacs 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.  If not, see <http://www.gnu.org/licenses/>.

;;; Commentary:

;; This is a mode for browsing the characters in Unicode Blocks or
;; other collections of characters, like Emacs' "charsets".
;;
;; Start the browser with "M-x ubb-browse".  That displays the
;; characters of the "Basic Latin" block.  From there it's probably
;; the easiest to use the menu to explore the available commands.
;;
;; The browser displays the current "set" of the current "group".  A
;; set is a collection of codepoints, e.g. the Unicode Block "Box
;; Drawing" is such a set.  Groups are collections of sets, e.g. all
;; Unicode Blocks form a group.  The commands
;; `ubb-browse-group-by-name'/`ubb-select-set-by-name' can used to
;; select the current group/set.

;;; Code

(require 'cl-lib)

;; term/internal.el doesn't provide any feature.  Not sure what the proper
;; way is to load it.
(defvar IT-unicode-translations)
(unless (boundp 'IT-unicode-translations)
  (load "term/internal"))

\f
;;; Some type definitions

;; A ubb--set represents a set of codepoints.
(cl-defstruct (ubb--set (:constructor ubb--make-set% (name ranges%%))
			(:constructor nil)
			(:predicate nil) (:copier nil))
  ;; NAME is a string for display purposes.
  (name "" :type string :read-only t)
  ;; RANGES%% is either a list or a function.
  ;; If a list then it looks like ((START . END) ...)
  ;; START and END denote a range of codepoints.
  ;; START is inclusive; END is exclusive.
  ;; If a function, it returns a list of ranges of the above form.
  (ranges%% () :type (or list function) :read-only t))

(defun ubb--make-set (name ranges)
  (cl-check-type name string) (cl-check-type ranges (or list function))
  (ubb--make-set% name ranges))

(defun ubb--sort-ranges (ranges)
  (sort (copy-sequence ranges)
	(lambda (r1 r2)
	  (< (car r1) (car r2)))))

;; A "rangeset" is a list of ranges.  The ranges in a rangeset are
;; non-overlapping and ordered by start point.
(defun ubb--ranges-to-rangeset (ranges)
  (cond ((null ranges) '())
	((null (cdr ranges)) ranges)
	(t
	 (let ((sorted (ubb--sort-ranges ranges)))
	   (nreverse
	    (cl-reduce (lambda (left+m right)
			 (cl-destructuring-bind ((s1 &rest e1) &rest m) left+m
			   (cl-destructuring-bind (s2 &rest e2) right
			     (cl-assert (<= s1 s2))
			     (cond ((<= e1 s2) ; no overlap
				    (cons right left+m))
				   (t
				    (cons (cons (min s1 s2)
						(max e1 e2))
					  m))))))
		       (cdr sorted) :initial-value (list (car sorted))))))))

(defun ubb--set-ranges% (set)
  (let ((ranges%% (ubb--set-ranges%% set)))
    (cl-etypecase ranges%%
      (function (funcall ranges%%))
      (list ranges%%))))

(defun ubb--set-rangeset (set)
  (ubb--ranges-to-rangeset (ubb--set-ranges% set)))

(defun ubb--rangeset-member (rangeset codepoint)
  (cl-loop for (start . end) in rangeset
	   thereis (and (<= start codepoint) (< codepoint end))))

(defun ubb--set-member (set codepoint)
  (ubb--rangeset-member (ubb--set-rangeset set) codepoint))

(defun ubb--rangeset-foreach (rangeset fun)
  (cl-loop for (start . end) in rangeset
	   do (cl-loop for codepoint from start below end
		       do (funcall fun codepoint))))

(defun ubb--rangeset-size (rangeset)
  (cl-loop for (start . end) in rangeset
	   sum (- end start)))

(defun ubb--rangeset-difference (x y)
  (cond ((null y) x)
	(t
	 (let ((result '()))
	   (while (and x y)
	     (cl-destructuring-bind ((s1 &rest e1) &rest r1) x
	       (cl-destructuring-bind (s2 &rest e2) (car y)
		 (cond ((<= e1 s2) (push (pop x) result))
		       ((<= e2 s1) (pop y))
		       ((and (<= s2 s1) (<= e1 e2))
			(pop x))
		       ((< s1 s2)
			(push (cons s1 s2) result)
			(setq x (cons (cons s2 e1) r1)))
		       (t
			(cl-assert (<= s2 s1))
			(cl-assert (< e2 e1))
			(setq x (cons (cons e2 e1) r1)))))))
	   (cl-revappend result x)))))

;; Return a list of ranges corresponding to set of codepoints in the
;; string STRING.
(defun ubb--string-ranges (string)
  (let* ((sorted (cl-sort (copy-sequence string) #'<))
	 (ranges '())
	 (start nil)
	 (end nil))
    (cl-loop for c across sorted do
	     (cond ((not start)
		    (setq start c)
		    (setq end (1+ c)))
		   ((= c (1- end)))
		   ((= c end) (setq end (1+ c)))
		   (t (push (cons start end) ranges)
		      (setq start c)
		      (setq end (1+ c)))))
    (when start (push (cons start end) ranges))
    (reverse ranges)))

;; A ubb--group is used to represent a set of ubb--sets.
(cl-defstruct (ubb--group (:constructor ubb--make-group)
			  (:copier nil) (:predicate nil))
  ;; NAME is a string for display purposes
  (name "" :type string :read-only t)
  ;; SETS%% is either a function (with no arguments) that should return a
  ;; sequence of ubb--sets that belong to this group, or the cached result
  ;; of calling the function.
  (sets%% (error "Arg missing") :type (or function sequence))
  ;; HEADER is a function which receives a set as argument and
  ;; should the value for `header-line-format'.
  (header (error "Arg missing") :type function :read-only t))

(defun ubb--group-sets (group)
  (let ((sets%% (ubb--group-sets%% group)))
    (cl-etypecase sets%%
      (sequence sets%%)
      (function (setf (ubb--group-sets%% group) (funcall sets%%))))))

\f
;;; Unicode blocks

;; Local copy.
(defvar ubb--blocks-file-name
  (expand-file-name "../admin/unidata/Blocks.txt" data-directory))

;; Fallback if no local copy.
(defvar ubb--blocks-url "http://www.unicode.org/Public/UNIDATA/Blocks.txt")

;; Parse blocks in the format used by the Unicode Character Database.
(defun ubb--parse-blocks ()
  (goto-char (point-min))
  (let ((result '()))
    (while (re-search-forward
	    "^\\([0-9A-F]+\\)\\.\\.\\([0-9A-F]+\\);[ ]*\\([^ ].*\\)$"
	    nil t)
      (let* ((start (string-to-number (match-string 1) 16))
	     (end (1+ (string-to-number (match-string 2) 16)))
	     (name (match-string 3)))
	(push (ubb--make-set name (list (cons start end))) result)))
    (let ((r (cl-coerce (nreverse result) 'vector)))
      (cl-assert (let ((s (elt r 0)))
		   (and (equal (ubb--set-name s)  "Basic Latin")
			(equal (ubb--set-rangeset s) '((0 . #x80))))))
      r)))

;; Load block information from a file or if the file isn't present
;; download it from unicode.org.
(defun ubb--load-blocks ()
  (with-temp-buffer
    (cond ((file-exists-p ubb--blocks-file-name)
	   (let ((coding-system-for-read 'binary))
	     (insert-file-contents-literally ubb--blocks-file-name)))
	  (t
	   (insert
	    (with-current-buffer (url-retrieve-synchronously ubb--blocks-url)
	      (re-search-forward "\n\n")
	      (buffer-substring (point) (point-max))))))
    (ubb--parse-blocks)))

(defvar ubb--all-blocks-cache nil)

(defun ubb--all-blocks ()
  "Return a sequence of all blocks."
  (or ubb--all-blocks-cache
      (setq ubb--all-blocks-cache (ubb--load-blocks))))

(defun ubb--find-block-by-codepoint (codepoint)
  (cl-find-if (lambda (block)
		(ubb--set-member block codepoint))
	      (ubb--all-blocks)))

(defun ubb--unicode-block-header (set)
  (cl-destructuring-bind ((start &rest end)) (ubb--set-rangeset set)
    (format "Block: %s  %04X..%04X" (ubb--set-name set) start end)))

(defvar ubb--unicode-blocks-group
  (ubb--make-group :name "Unicode blocks"
		   :sets%% #'ubb--all-blocks
		   :header #'ubb--unicode-block-header))

\f
;;; Charsets

;; NOTE: `map-charset-chars' can call the function with overlapping
;; ranges.  Also the cons cell for the range argument is updated so
;; it's a good idea to copy the contents instead of using the cons
;; cell.
(defun ubb--charset-ranges (charset)
  (let ((ranges '()))
    (map-charset-chars (lambda (from+to _)
			 (cl-destructuring-bind (from &rest to) from+to
			   (cl-assert (characterp from))
			   (cl-assert (characterp to))
			   (push (cons from (1+ to)) ranges)))
		       charset)
    ranges))

(defun ubb--charset-to-set (charset)
  (ubb--make-set (or (get-charset-property charset :long-name)
		     (get-charset-property charset :short-name)
		     (format "%s" charset))
		 (lambda () (ubb--charset-ranges charset))))

(defun ubb--charsets-without-aliases ()
  (reverse ; ascii first, please
   (cl-remove-duplicates charset-list :key #'charset-plist)))

(defun ubb--all-charsets ()
  (mapcar #'ubb--charset-to-set (ubb--charsets-without-aliases)))

(defun ubb--charset-header (set)
  (format "Charset: %s" (ubb--set-name set)))

(defvar ubb--charsets-group
  (ubb--make-group :name "Charsets"
		   :sets%% #'ubb--all-charsets
		   :header #'ubb--charset-header))

\f
;;; Scripts

(defun ubb--all-scripts ()
  (let ((script2ranges (make-hash-table))
	(sets '()))
    (map-char-table (lambda (key script)
		      (setf (gethash script script2ranges)
			    (cons (cl-etypecase key
				    (character (cons key (1+ key)))
				    (cons (cons (car key) (1+ (cdr key)))))
				  (gethash script script2ranges))))
		    char-script-table)
    (maphash (lambda (script ranges)
	       (push (ubb--make-set (symbol-name script) ranges)
		     sets))
	     script2ranges)
    (cl-sort sets #'string< :key #'ubb--set-name)))

(defvar ubb--scripts-group
  (ubb--make-group :name "Scripts"
		   :sets%% #'ubb--all-scripts
		   :header (lambda (set)
			     (format "Script: %s" (ubb--set-name set)))))

\f
;;; Unicode categories

(defun ubb--all-unicode-categories ()
  (let ((cat2ranges (make-hash-table))
	(sets '()))
    (map-char-table (lambda (key cat)
		      (setf (gethash cat cat2ranges)
			    (cons (cl-etypecase key
				    (character (cons key (1+ key)))
				    (cons (cons (car key) (1+ (cdr key)))))
				  (gethash cat cat2ranges))))
		    unicode-category-table)
    (maphash (lambda (cat ranges)
	       (let* ((desc (char-code-property-description
			     'general-category cat))
		      (name (format "%s (%s)" cat desc)))
		 (push (ubb--make-set name ranges)
		       sets)))
	     cat2ranges)
    (cl-sort sets #'string< :key #'ubb--set-name)))

(defvar ubb--unicode-categories-group
  (ubb--make-group :name "Unicode categories"
		   :sets%% #'ubb--all-unicode-categories
		   :header (lambda (set)
			     (format "Unicode general category: %s"
				     (ubb--set-name set)))))

\f
;;; Languages

(defun ubb--all-languages ()
  (list (ubb--make-set "English" (ubb--string-ranges "“”‘’"))
	(ubb--make-set "French" (ubb--string-ranges "\
éàèùâêîôûëïüÿçœæ\
ÉÀÈÙÂÊÎÔÛËÏÜŸÇŒÆ\
«»‹›“”‘’€"))
	(ubb--make-set "German" (ubb--string-ranges "äöüßÄÖÜ„“‚‘’»«›‹€"))
	(ubb--make-set "Italian" (ubb--string-ranges "\
àèìòùéóî\
ÀÈÌÒÙÉÓÎ\
“”‘’«»‹›€"))
	(ubb--make-set "Spanish" (ubb--string-ranges "\
ñáéíóúü\
ÑÁÉÍÓÚÜ\
“”‘’«»¿¡"))
	(ubb--make-set "Turkish" (ubb--string-ranges "\
çşğıöü\
ÇŞĞİÖÜ\
“”‘’«»‹›"))
	(ubb--make-set "APL" (append (ubb--string-ranges "\
?⌈⌊⍴∼∣⍳⋆−+×÷,⌹○⍟⌽⊖⍋⍒⍎⍕⍉!−×÷⋆○?∈⌈⌊⍴↑↓⊥⊤∣,\/⍳⌹⌽⊖⍟⍕⍉!¨<≤=≥>≠∨∧⍱⍲/⌿\⍀.∘.")
				     `((,?⌶ . ,(1+ ?⍺)))))))

(defvar ubb--languages-group
  (ubb--make-group :name "Languages"
		   :sets%% #'ubb--all-languages
		   :header (lambda (set)
			     (format "Language: %s" (ubb--set-name set)))))


\f
;;; Games (important)

(defun ubb--all-game-sets ()
  (list (ubb--make-set "Chess" (ubb--string-ranges "♚♛♜♝♞♟♙♘♗♔♖♕"))
	(ubb--make-set "Domino" `((#x1f030 . #x1f0a0)))
	(ubb--make-set "Poker" `(,@(ubb--string-ranges "♠♤♥♡♦♢♣♧")
				 (#x1f0a0 . #x1f100)))))

(defun ubb--game-header (set)
  (format "Game: %s" (ubb--set-name set)))

(defvar ubb--games-group
  (ubb--make-group :name "Games"
		   :sets%% #'ubb--all-game-sets
		   :header #'ubb--game-header))

\f
;;; Groups

(defun ubb--all-groups ()
  (list ubb--unicode-blocks-group
	ubb--charsets-group
	ubb--scripts-group
	ubb--unicode-categories-group
	ubb--languages-group
	ubb--games-group))

(defvar ubb--read-group-name-history (list "Unicode blocks"))

(defun ubb--read-group-name (prompt)
  (let ((hist 'ubb--read-group-name-history)
	(completion-ignore-case t))
    (completing-read prompt
		     (mapcar #'ubb--group-name (ubb--all-groups))
		     nil t nil hist)))

(defun ubb--find-group-by-name (name)
  (cl-find name (ubb--all-groups) :key #'ubb--group-name :test #'equal))

(defvar ubb--read-set-name-history (list))

(defun ubb--read-set-name (group prompt)
  (let ((hist 'ubb--read-set-name-history)
	(completion-ignore-case t)
	(completion-styles (cl-adjoin 'substring completion-styles)))
    (completing-read prompt
		     (mapcar #'ubb--set-name (ubb--group-sets group))
		     nil t nil hist)))

(defun ubb--find-set-by-name (group name)
  (cl-find name (ubb--group-sets group)
	   :key #'ubb--set-name :test #'equal))

\f
;;; Codepoint filter

(eval-and-compile
  (defun ubb--unicode-category-symbols ()
    (let ((result '()))
      (map-char-table (lambda (_ cat) (cl-pushnew cat result))
		      unicode-category-table)
      result)))

(defcustom ubb-categories-to-hide '(Cn Cs Co)
  "List of Unicode category symbols.
Characters belonging to these categories will not be displayed."
  :group 'ubb
  :type (eval-when-compile
	  `(set ,@(cl-loop for c in (ubb--unicode-category-symbols)
			   collect `(const ,c)))))

(defmacro ubb--define-hide-category-toggle (name category)
  `(defun ,name ()
     (interactive)
     (cond ((memq ',category ubb-categories-to-hide)
	    (setq ubb-categories-to-hide
		  (remove ',category ubb-categories-to-hide)))
	   (t
	    (push ',category ubb-categories-to-hide)))))

(ubb--define-hide-category-toggle ubb-toggle-hide-not-assigned-codepoints Cn)
(ubb--define-hide-category-toggle ubb-toggle-hide-surrogates Cs)
(ubb--define-hide-category-toggle ubb-toggle-hide-private-use-codepoints Co)

;; Return the set of hidden codepoints.
(defun ubb--hidden-rangeset ()
  (cond ((null ubb-categories-to-hide) '())
	(t
	 (let ((ranges '()))
	   (map-char-table
	    (lambda (key cat)
	      (when (memq cat ubb-categories-to-hide)
		(cl-etypecase key
		  (character (push (cons key (1+ key)) ranges))
		  (cons (push (cons (car key) (1+ (cdr key))) ranges)))))
	    unicode-category-table)
	   (ubb--ranges-to-rangeset ranges)))))

\f
;;; Display

(defface ubb-invisible
  '((t :inherit tooltip))
  "Face used for code-points that would otherwise be invisible/transparent."
  :group 'ubb)

(defvar ubb--invisible-categories '(Cf Zs Zl Zp))

(defun ubb--propertize (start end codepoint)
  (add-text-properties start end (list 'codepoint codepoint
				       'help-echo #'ubb--help-echo))
  (when (memq (get-char-code-property codepoint 'general-category)
	      ubb--invisible-categories)
    (add-text-properties start end '(face ubb-invisible))))

(defun ubb--insert-codepoint (codepoint)
  (insert " ")
  (let* ((start (point))
	 (_ (insert (cl-case codepoint
		      (?\n "^J")
		      (t codepoint)))))
    (ubb--propertize start (point) codepoint)))

;; FIXME: only for compatibility with Emacs 24
(defun ubb--default-font-width ()
  (cond ((fboundp 'default-font-width)
	 (default-font-width))
	(t
	 (frame-char-width))))

(defvar ubb--right-margin 10)
(defvar ubb--left-margin 1)

;; Insert a set of codepoints, trying to create lines of equal width.
;;
;; Inserting large sets can be slow, so this calls redisplay for every
;; line to give some visual feedback to the user.  Also, the progress
;; is shown in percent in the echo area.
(defun ubb--insert-rangeset (rangeset)
  (let* ((win (get-buffer-window))
	 (_ (cl-assert win))
	 (font-width (ubb--default-font-width))
	 (right-limit (- (window-width win t)
			 (* ubb--right-margin font-width)))
	 (line-start (point))
	 (count (ubb--rangeset-size rangeset))
	 (i 0))
    (insert-char ?\s ubb--left-margin)
    (ubb--rangeset-foreach
     rangeset
     (lambda (codepoint)
       (ubb--insert-codepoint codepoint)
       (cl-incf i)
       (let ((w (car (window-text-pixel-size win line-start (point)))))
	 (when (<= right-limit w)
	   (insert "\n")
	   (setq line-start (point))
	   (insert-char ?\s ubb--left-margin)
	   (message "%.f%%" (* 100.0 (/ (float i) count)))
	   (redisplay)))))
    (message nil)))

\f
;;; Buttons

(defun ubb--insert-button-rangeset (rangeset)
  (ubb--insert-rangeset rangeset))

(defvar ubb--button-keymap (make-sparse-keymap))

(defun ubb--insert-button (rangeset collapsed?)
  (let ((start (point)))
    (insert (propertize (if collapsed? "[+]" "[-]")
			'keymap ubb--button-keymap))
    (unless collapsed?
      (insert "\n")
      (ubb--insert-button-rangeset rangeset))
    (add-text-properties start (point)
			 (list 'rangeset rangeset 'collapsed? collapsed?))))

(defun ubb-toggle-button ()
  (interactive)
  (when (not (get-text-property (point) 'rangeset))
    (user-error "Not at a button"))
  (let* ((collapsed? (get-text-property (point) 'collapsed?))
	 (rangeset (get-text-property (point) 'rangeset))
	 (end (next-single-char-property-change (point) 'rangeset))
	 (start (previous-single-char-property-change end 'rangeset))
	 (inhibit-read-only t))
    (delete-region start end)
    (ubb--insert-button rangeset (not collapsed?))
    (goto-char start))
  (message "toggle"))

(defun ubb--split-rangeset (rangeset n)
  (let ((left '())
	(count 0)
	(right rangeset))
    (while (and (< count n) right)
      (cl-destructuring-bind (start &rest end) (car right)
	(let ((len (- end start)))
	  (cond ((<= (+ count len) n)
		 (push (pop right) left)
		 (cl-incf count len))
		(t
		 (let ((k (- n count)))
		   (push (cons start (+ start k)) left)
		   (pop right)
		   (push (cons (+ start k) end) right)
		   (cl-incf count k)))))))
    (list (nreverse left) right)))

(defvar ubb--codepoints-per-button 256)

(defun ubb--insert-rangeset/buttons (rangeset)
  (let ((n ubb--codepoints-per-button))
    (cl-destructuring-bind (first rest) (ubb--split-rangeset rangeset n)
      (cond ((null rest)
	     (insert "\n")
	     (ubb--insert-rangeset first))
	    (t
	     (ubb--insert-button first nil)
	     (insert "\n")
	     (save-excursion
	       (set-window-point (get-buffer-window) (point-min))
	       (redisplay))
	     (while rest
	       (cl-destructuring-bind (r rs) (ubb--split-rangeset rest n)
		 (ubb--insert-button r t)
		 (insert "\n")
		 (setq rest rs))))))))

\f
;;; Mode

(defun ubb--clear-codepoint-info ()
  (message nil))

;; Return a short description for codepoint.  This basically the
;; Unicode name.
(defun ubb--short-description (codepoint)
  (let* ((name (get-char-code-property codepoint 'name))
	 (old (get-char-code-property codepoint 'old-name))
	 (cat (get-char-code-property codepoint 'general-category))
	 (catdesc (char-code-property-description 'general-category cat)))
    (format "\"%c\" %s (%s: %s) U+%04X" codepoint (or name old "[no name]")
	     cat catdesc codepoint)))

(defun ubb--show-codepoint-info (codepoint)
  (message "%s" (ubb--short-description codepoint)))

(defun ubb--current-codepoint (&optional noerror)
  (let ((codepoint (get-text-property (point) 'codepoint)))
    (cond (codepoint)
	  (noerror nil)
	  (t (user-error "No code-point selected")))))

;; This is called from post-command-hook.
(defun ubb--codepoint-sensor ()
  (unless (current-message)
    (let ((codepoint (ubb--current-codepoint t)))
      (cond (codepoint (ubb--show-codepoint-info codepoint))
	    (t (ubb--clear-codepoint-info))))))

;; This called if the mouse pointer hovers around.
(defun ubb--help-echo (_ __ pos)
  (let ((codepoint (get-text-property pos 'codepoint)))
    (if codepoint (ubb--short-description codepoint))))

(defvar ubb--buffer-set)   ; The currently displayed ubb--set
(defvar ubb--buffer-group) ; The group to which ubb--buffer-set belongs
(defvar ubb--buffer-hidden-codepoints-count)

(define-derived-mode ubb-mode fundamental-mode "ubb"
  "\\<ubb-mode-map>\
Mode for viewing the characters in Unicode blocks and other charsets.

The browser displays the current \"set\" of the current \"group\".  A
set is a collection of code-points, e.g. the Unicode Block \"Box
Drawing\" is such a set.  Groups are collections of sets, e.g. all
Unicode Blocks form a group.

Example: To view the \"Box Drawing\" block, first select the
\"Unicode blocks\" group with:
  \\[ubb-browse-group-by-name] \"Unicode blocks\" RET
then select the \"Box Drawing\" set with:
  \\[ubb-select-set-by-name] \"Box Drawing\" RET

Main commands:
\\[ubb-browse-group-by-name] - Select a group and display its first set.
\\[ubb-select-set-by-name] - Select a set from the current group.
\\[ubb-next-set] - Select the next set in the current group.
\\[ubb-prev-set] - Select the previous set in the current group.
\\[ubb-insert] - Insert the current code-point into a buffer.
\\[ubb-copy-to-kill-ring] - Copy current code-point to the kill-ring.
"
  (setq-local bidi-display-reordering nil)
  (setq-local truncate-lines t)
  (read-only-mode 1)
  (add-hook 'post-command-hook 'ubb--codepoint-sensor nil t))

(defun ubb--buffer-name () "*ubb*")

(defun ubb--get-buffer ()
  (or (get-buffer (ubb--buffer-name))
      (with-current-buffer (get-buffer-create (ubb--buffer-name))
	(ubb-mode)
	(current-buffer))))

(defcustom ubb-incremental-display 'buttons
  "Variable to customize the display algorithm.
This is primarily interesting for large sets which can be slow to
display.

If the value is 'buttons, only the first 256 characters are
visible initially.  The user must press the [+] \"buttons\" to
see the others.

If the value is 'nil then all characters are displayed as quickly
as possible.  This can be slow."
  :group 'ubb
  :type '(radio (const buttons) (const nil)))

(defun ubb--display-rangeset (rangeset)
  (let* ((inhibit-read-only t))
    (erase-buffer)
    (let* ((win (display-buffer (current-buffer)))
	   (_ (select-window win))
	   (pos (point)))
      (cl-ecase ubb-incremental-display
	((nil) (insert "\n") (ubb--insert-rangeset rangeset))
	((buttons) (ubb--insert-rangeset/buttons rangeset)))
      (set-window-point win pos)
      (current-buffer))))

;; This is the main entry point.
;;
;; Insert and display the ubb--set SET belonging to ubb--group GROUP.
;; Create a fresh buffer only if needed.  Display the buffer and
;; select its window.  Finally return the buffer.
(defun ubb--browse-set (group set)
  (with-current-buffer (ubb--get-buffer)
    (setq-local ubb--buffer-group group)
    (setq-local ubb--buffer-set set)
    (let* ((rs1 (ubb--set-rangeset set))
	   (rs (ubb--rangeset-difference rs1 (ubb--hidden-rangeset)))
	   (nhidden (- (ubb--rangeset-size rs1) (ubb--rangeset-size rs))))
      (setq header-line-format
	    (concat (funcall (ubb--group-header group) set)
		    (if (> nhidden 0) (format "  [%d hidden]" nhidden))))
      (ubb--display-rangeset rs))))

\f
;;; ASCII replacements

;; For fonts that don't have proper glyphs for some codepoints it may
;; be useful to display an ASCII string instead.  E.g. "i." could be
;; used instead of ı (dotless i).
;;
;; This uses buffer-display-table to do that.  The replacement strings
;; come from `IT-unicode-translations'.

(defun ubb--codepoint-displayable-p (codepoint)
  (char-displayable-p codepoint))

(defun ubb-toggle-ascii-replacements ()
  "Toggle whether to display some glyphs with ASCII replacements."
  (interactive)
  (cond (buffer-display-table (setq buffer-display-table nil))
	(t
	 (let ((dtab (make-display-table)))
	   (cl-loop for (from to vector) in IT-unicode-translations do
		    (cl-loop for c from from to to
			     for glyph across vector do
			     (when (and glyph
					(not (ubb--codepoint-displayable-p c)))
			       (let* ((string (cl-etypecase glyph
						(integer (string glyph))
						(string glyph)))
				      (vector (vconcat string)))
				 (aset dtab c vector)))))
	   (setq buffer-display-table dtab))))
  (recenter))

\f
;;; Commands

(defun ubb-describe-codepoint-briefly ()
  "Show name and category of the current code-point."
  (interactive)
  (ubb--show-codepoint-info (ubb--current-codepoint)))

(defun ubb-describe-codepoint ()
  "Describe the current code-point."
  (interactive)
  (when (ubb--current-codepoint)
    (describe-char (point))))

(defun ubb--next-set (next)
  (let* ((set ubb--buffer-set)
	 (group ubb--buffer-group)
	 (all (ubb--group-sets group))
	 (i (cl-position set all :test #'equal))
	 (j (funcall next i)))
    (cond ((and (<= 0 j) (< j (length all)))
	   (ubb--browse-set group (elt all j)))
	  (t
	   (user-error "No more sets (in group %S)"
		       (ubb--group-name group))))))

(defun ubb-next-set ()
  "Browse the next set of the group."
  (interactive)
  (ubb--next-set #'1+))

(defun ubb-prev-set ()
  "Browse the previous set of the group."
  (interactive)
  (ubb--next-set #'1-))

(defun ubb-select-set-by-name (name)
  "Select the set to browse by name."
  (interactive (list (ubb--read-set-name ubb--buffer-group "Set name: ")))
  (let ((set (or (ubb--find-set-by-name ubb--buffer-group name)
		 (user-error "No set with name: %S" name))))
    (ubb--browse-set ubb--buffer-group set)))

(defun ubb--search-property (prop &optional backward)
  "Search the next text range where PROP is non-nil.
Return the value of PROP.
If BACKWARD is non-nil, search backward."
  (let ((next (cond (backward #'previous-single-char-property-change)
		    (t #'next-single-char-property-change)))
        (start (point))
        (value nil))
    (while (progn
             (goto-char (funcall next (point) prop))
             (not (or (setq value (get-char-property (point) prop))
                      (eobp)
                      (bobp)))))
    (cond (value)
          (t (goto-char start) nil))))

(defun ubb-forward-codepoint ()
  "Move cursor to the next code-point."
  (interactive)
  (or (ubb--search-property 'codepoint nil)
      (user-error "No more code-points")))

(defun ubb-backward-codepoint ()
  "Move cursor to the previous code-point."
  (interactive)
  (or (ubb--search-property 'codepoint t)
      (user-error "No more code-points")))

(defun ubb-forward-button ()
  "Move cursor to the next button."
  (interactive)
  (or (ubb--search-property 'rangeset nil)
      (user-error "No more buttons")))

(defun ubb-backward-button ()
  "Move cursor to the previous button."
  (interactive)
  (or (ubb--search-property 'rangeset t)
      (user-error "No more buttons")))

(defun ubb--search-codepoint (codepoint)
  (or (let ((pos (text-property-any (point) (point-max) 'codepoint codepoint)))
	(cond (pos (goto-char pos) t)))
      (let ((start (point))
	    (found? nil))
	(while (and (not found?) (ubb--search-property 'rangeset))
	  (when (ubb--rangeset-member (ubb--search-property 'rangeset)
				      codepoint)
	    (setq found? t)))
	(cond (found? (when (get-text-property (point) 'collapsed?)
			(ubb-toggle-button)
			(ubb--search-codepoint codepoint))
		      t)
	      (t (goto-char start) nil)))
      (error "Not found: %c" codepoint)))

(defun ubb-browse-block (block &optional codepoint)
  "Browse the Unicode block BLOCK.
Interactively without prefix arg, prompt for the block name.
With negative prefix arg, use the character at point to find
the corresponding block.
With positive positive arg, prompt for the name or number of the code-point
\(see `read-char-by-name')."
  (interactive
   (cond ((not current-prefix-arg)
	  (let ((name (ubb--read-set-name ubb--unicode-blocks-group
					  "Block name: ")))
	    (list (or (ubb--find-set-by-name ubb--unicode-blocks-group name)
		      (user-error "No block with named: %S" name)))))
	 (t
	  (let* ((codepoint
		  (cond ((< (prefix-numeric-value current-prefix-arg) 0)
			 (char-after))
			(t
			 (read-char-by-name
			  "Code-point (Unicode name or hex): "))))
		 (block (or (ubb--find-block-by-codepoint codepoint)
			    (user-error "No block for code-point: %X"
					codepoint))))
	    (list block codepoint)))))
  (with-current-buffer (ubb--browse-set ubb--unicode-blocks-group block)
    (when codepoint
      (ubb--search-codepoint codepoint))))

(defun ubb-browse-block-by-codepoint ()
  "Very similar to `ubb-browse-block'.
The only difference is that when invoked without prefix arg,
prompt for the codepoint instead for the Unicode block."
  (interactive)
  (let ((current-prefix-arg (or current-prefix-arg '(4))))
    (call-interactively #'ubb-browse-block)))

(defun ubb--browse-group (group)
  (ubb--browse-set group (elt (ubb--group-sets group) 0)))

(defun ubb-browse-group-by-name (name)
  "Prompt for a group name and display the first set in the group."
  (interactive (list (ubb--read-group-name "Group name: ")))
  (let ((group (or (ubb--find-group-by-name name)
		   (user-error "No group with name: %S" name))))
    (ubb--browse-group group)))

(defun ubb-reset-text-scale ()
  (interactive)
  (text-scale-set 0))

(defun ubb-copy-to-kill-ring ()
  "Save the current code-point in the kill ring."
  (interactive)
  (kill-new (string (ubb--current-codepoint)))
  (message "Current kill is %S" (current-kill 0)))

(defun ubb-append-to-kill ()
  "Append the current code-point to the latest kill."
  (interactive)
  (kill-append (string (ubb--current-codepoint)) nil)
  (message "Current kill is %S" (current-kill 0)))

(defun ubb-insert (buffer)
  "Insert the current code-point into BUFFER and switch to that buffer.
Intractively, prompt for a buffer name (using `other-buffer' as default)."
  (interactive (list (progn
		       (ubb--current-codepoint)
		       (read-buffer "Insert into buffer: "
				    (list (other-buffer (current-buffer) t))
				    t))))
  (let ((codepoint (ubb--current-codepoint)))
    (pop-to-buffer buffer)
    (insert-char codepoint)))

(defun ubb-redraw ()
  "Redraw the current set."
  (interactive)
  (ubb--browse-set ubb--buffer-group ubb--buffer-set))

(defun ubb-browse ()
  "Start the character browser."
  (interactive)
  (let ((buffer (get-buffer (ubb--buffer-name))))
    (cond (buffer (with-current-buffer buffer
		    (ubb--browse-set ubb--buffer-group ubb--buffer-set)))
	  (t (ubb--browse-group ubb--unicode-blocks-group)))))

(defun ubb-quit ()
  "Close the UBB window."
  (interactive)
  (quit-restore-window nil 'bury))

\f
;;; Menu

;; Return an uninterned symbol with FUN set as it function.  This is a
;; trick to put closures into menus.
(defun ubb--fake-menu-symbol (fun)
  (let ((sym (make-symbol "fake-menu-filter-symbol")))
    (fset sym fun)
    sym))

(defun ubb--build-set-menu (group)
  (mapcar (lambda (set)
	    (vector (ubb--set-name set)
		    (ubb--fake-menu-symbol
		     (lambda ()
		       (interactive)
		       (ubb--browse-set group set)))))
	  (ubb--group-sets group)))

(defun ubb--set-menu-filter (_others)
  (ubb--build-set-menu ubb--buffer-group))

(defun ubb--build-group-menu ()
  (mapcar (lambda (group)
	    (list (ubb--group-name group)
		  :filter (ubb--fake-menu-symbol
			   (lambda (_) (ubb--build-set-menu group)))))
	  (ubb--all-groups)))

(easy-menu-define nil ubb-mode-map
  "Menu for UBB mode."
  `("Character-Browser"
    ,@(ubb--build-group-menu)
    "--"
    ["Select group by name" ubb-browse-group-by-name]
    ["Select set by name" ubb-select-set-by-name]
    ["Select Unicode block by code-point" ubb-browse-block-by-codepoint]
    ("Select set in current group"
     ("Sets in current group" :filter ubb--set-menu-filter)
     ["Next set in group" ubb-next-set :key-sequence ">"]
     ["Previous set in group" ubb-prev-set :key-sequence "<"])
    "--"
    ["Insert code-point into buffer" ubb-insert
     :active (ubb--current-codepoint t)]
    ["Copy code-point to kill-ring" ubb-copy-to-kill-ring
     :active (ubb--current-codepoint t)]
    ["Describe code-point briefly" ubb-describe-codepoint-briefly
     :active (ubb--current-codepoint t)]
    ["Show code-point details" ubb-describe-codepoint
     :active (ubb--current-codepoint t)]
    "--"
    ("Movement"
     ["Move to next code-point" ubb-forward-codepoint]
     ["Move to previous code-point" ubb-backward-codepoint]
     ["Move to next button" ubb-forward-button
      :active (text-property-not-all (point-min) (point-max) 'rangeset nil)]
     ["Move to previous button" ubb-backward-button
      :active (text-property-not-all (point-min) (point-max) 'rangeset nil)])
    ("Zoom"
     :visible window-system
     ["Increase scale factor" text-scale-increase]
     ["Decrease scale factor" text-scale-decrease]
     ["Reset scale factor" ubb-reset-text-scale])
    ("Options"
     ["Hide not assigned code-points" ubb-toggle-hide-not-assigned-codepoints
      :style toggle :selected (memq 'Cn ubb-categories-to-hide)]
     ["Hide code-points within private-use areas"
      ubb-toggle-hide-private-use-codepoints
      :style toggle :selected (memq 'Co ubb-categories-to-hide)]
     ["Hide surrogates" ubb-toggle-hide-surrogates
      :style toggle :selected (memq 'Cs ubb-categories-to-hide)]
     "--"
     ["Display buttons for large sets"
      (lambda () (interactive) (setq ubb-incremental-display 'buttons))
      :style radio :selected (eq ubb-incremental-display 'buttons)]
     ["Non-incremental display"
      (lambda () (interactive) (setq ubb-incremental-display nil))
      :style radio :selected (eq ubb-incremental-display 'nil)]
     "--"
     ["ASCII replacements" ubb-toggle-ascii-replacements
      :style toggle :selected buffer-display-table])
    "--"
    ["Redraw" ubb-redraw]
    ["Quit" ubb-quit]))

\f
;;; Key bindings

(define-key ubb-mode-map (kbd "SPC") #'ubb-describe-codepoint-briefly)
(define-key ubb-mode-map (kbd "D") #'ubb-describe-codepoint)
(define-key ubb-mode-map (kbd "f") #'ubb-forward-codepoint)
(define-key ubb-mode-map (kbd "b") #'ubb-backward-codepoint)
(define-key ubb-mode-map (kbd "n") #'ubb-next-set)
(define-key ubb-mode-map (kbd "p") #'ubb-prev-set)
(define-key ubb-mode-map (kbd ">") #'ubb-next-set)
(define-key ubb-mode-map (kbd "<") #'ubb-prev-set)
(define-key ubb-mode-map (kbd "TAB") #'ubb-forward-button)
(define-key ubb-mode-map (kbd "<backtab>") #'ubb-backward-button)
(define-key ubb-mode-map (kbd "N") #'ubb-select-set-by-name)
(define-key ubb-mode-map (kbd "G") #'ubb-browse-group-by-name)
(define-key ubb-mode-map (kbd "C") #'ubb-browse-block-by-codepoint)
(define-key ubb-mode-map (kbd "+") #'text-scale-increase)
(define-key ubb-mode-map (kbd "-") #'text-scale-decrease)
(define-key ubb-mode-map (kbd "*") #'ubb-reset-text-scale)
(define-key ubb-mode-map (kbd "c") #'ubb-copy-to-kill-ring)
(define-key ubb-mode-map (kbd "a") #'ubb-append-to-kill)
(define-key ubb-mode-map (kbd "RET") #'ubb-insert)
(define-key ubb-mode-map (kbd "~") #'ubb-toggle-ascii-replacements)
(define-key ubb-mode-map (kbd "g") #'ubb-redraw)
(define-key ubb-mode-map (kbd "q") #'ubb-quit)

(define-key ubb--button-keymap (kbd "RET") #'ubb-toggle-button)
(define-key ubb--button-keymap (kbd "<mouse-1>") #'ubb-toggle-button)

(provide 'ubb)

^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-07 18:33                             ` Richard Stallman
  2016-02-07 18:42                               ` Clément Pit--Claudel
  2016-02-07 22:02                               ` John Wiegley
@ 2016-02-12 11:32                               ` Helmut Eller
  2016-02-13 15:32                                 ` Richard Stallman
  2 siblings, 1 reply; 128+ messages in thread
From: Helmut Eller @ 2016-02-12 11:32 UTC (permalink / raw)
  To: Richard Stallman; +Cc: emacs-devel

On Sun, Feb 07 2016, Richard Stallman wrote:

> It needs to be a little more self-documenting; for instance, it should
> say how to switch to another block.

I tried to improve the docstring of ubb-mode.

> Many of the characters don't display on my console,
> Have we got a way to tell, in Emacs Lisp, whether a certain
> character code can actually display?  I think there is one.

char-displayable-p seems to do this and it has, or more precisely
terminal_glyph_code has, special code for the Linux console.  So I think
it works on the Linux console and X but not with terminal emulators like
xterm.

> Could this use that to show something meaningful,
> for characters that can't really display?  For instance,
> a sequence of 2 or 3 characters that somehow stands for
> the real character?
>
> For instance, the sequence << could stand for «, and
> the sequence i-. could stand for dotless i.

I added the command ubb-toggle-ascii-replacements (bound to ~) for this.
It uses the translations from term/internal.el.  E.g. dotless i becomes
"i.".

Helmut



^ permalink raw reply	[flat|nested] 128+ messages in thread

* Re: Entering Unicode characters
  2016-02-12 11:32                               ` Helmut Eller
@ 2016-02-13 15:32                                 ` Richard Stallman
  0 siblings, 0 replies; 128+ messages in thread
From: Richard Stallman @ 2016-02-13 15:32 UTC (permalink / raw)
  To: Helmut Eller; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

It sounds like this will soon be very usable.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 128+ messages in thread

end of thread, other threads:[~2016-02-13 15:32 UTC | newest]

Thread overview: 128+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-01-11  3:09 A proposal for removing obsolete packages Andrew Hyatt
2016-01-11 14:41 ` Phillip Lord
2016-01-11 15:14 ` Eli Zaretskii
2016-01-12  4:24   ` Stefan Monnier
2016-01-19  5:28     ` John Wiegley
2016-01-20  2:54       ` Richard Stallman
2016-01-20  7:25         ` John Wiegley
2016-01-20 17:05           ` Andrew Hyatt
2016-01-20 17:49             ` Eli Zaretskii
2016-01-20 19:52               ` John Wiegley
2016-01-20 20:38                 ` Andrés Ramírez
2016-01-20 20:46                   ` John Wiegley
2016-01-20 20:52                   ` Eli Zaretskii
2016-01-20 21:03                     ` Andrés Ramírez
2016-01-21  3:35                       ` Eli Zaretskii
2016-01-23 21:22                 ` Andrew Hyatt
2016-01-21  3:02             ` Richard Stallman
2016-01-23 21:15               ` Andrew Hyatt
2016-01-23 22:03                 ` Drew Adams
2016-01-24  1:02                   ` Andrew Hyatt
2016-01-24  1:08                     ` Andrew Hyatt
2016-01-24  1:56                     ` Drew Adams
2016-01-24 21:44                       ` Andrew Hyatt
2016-01-25  2:37                         ` Drew Adams
2016-01-25  1:42                 ` Richard Stallman
2016-01-25  4:41                   ` Andrew Hyatt
2016-01-25 15:37                     ` Entering Unicode characters Richard Stallman
2016-01-25 16:08                       ` Eli Zaretskii
2016-01-25 17:20                         ` Vivek Dasmohapatra
2016-01-25 17:51                           ` Teemu Likonen
2016-01-25 20:12                           ` Eli Zaretskii
2016-01-26  1:24                             ` Vivek Dasmohapatra
2016-01-26  3:34                               ` Eli Zaretskii
2016-01-25 18:59                       ` Marcin Borkowski
2016-01-25 19:28                         ` Drew Adams
2016-01-26  8:38                         ` Oleh Krehel
2016-01-25 21:36                       ` Tianxiang Xiong
2016-01-25 22:17                         ` Drew Adams
2016-01-25 22:26                           ` Tianxiang Xiong
2016-01-26  9:39                         ` Richard Stallman
2016-01-26 10:55                           ` Jean-Christophe Helary
2016-01-26 14:49                             ` Eli Zaretskii
2016-01-26 14:54                               ` Stefan Monnier
2016-01-26 21:41                               ` Jean-Christophe Helary
2016-01-27  3:35                                 ` Eli Zaretskii
2016-01-27  6:01                                   ` Jean-Christophe Helary
2016-01-28 23:16                                     ` Jean-Christophe Helary
2016-01-29  8:21                                       ` Eli Zaretskii
2016-01-29 15:51                                         ` handa
2016-01-29 16:14                                           ` Eli Zaretskii
2016-01-29 16:24                                             ` Clément Pit--Claudel
2016-01-30  3:03                                             ` Jean-Christophe Helary
2016-01-30  7:30                                               ` Eli Zaretskii
2016-01-30  7:36                                                 ` Jean-Christophe Helary
2016-01-30  7:46                                                   ` Eli Zaretskii
2016-01-30 12:16                                             ` handa
2016-01-30 13:53                                               ` Eli Zaretskii
2016-01-27  0:47                               ` Richard Stallman
2016-01-26 11:31                           ` Yuri Khan
2016-01-27  0:46                             ` Richard Stallman
2016-01-26 12:40                           ` Marcin Borkowski
2016-01-26 15:10                             ` Eli Zaretskii
2016-01-27  0:47                               ` Richard Stallman
2016-01-26 17:08                           ` Tianxiang Xiong
2016-01-26 17:37                             ` Drew Adams
2016-01-26 18:08                             ` Stefan Monnier
2016-01-26 18:46                             ` Eli Zaretskii
2016-02-06 11:56                           ` Helmut Eller
2016-02-06 12:25                             ` Eli Zaretskii
2016-02-06 13:59                               ` Helmut Eller
2016-02-06 14:30                                 ` Eli Zaretskii
2016-02-12 11:20                               ` Helmut Eller
2016-02-07 18:33                             ` Richard Stallman
2016-02-07 18:42                               ` Clément Pit--Claudel
2016-02-08 14:15                                 ` Stefan Monnier
2016-02-08 14:25                                   ` Andreas Schwab
2016-02-09 12:14                                     ` Richard Stallman
2016-02-09 17:18                                       ` Eli Zaretskii
2016-02-10  0:12                                         ` Richard Stallman
2016-02-10 17:52                                           ` Eli Zaretskii
2016-02-11 18:19                                             ` Richard Stallman
2016-02-07 22:02                               ` John Wiegley
2016-02-08 13:02                                 ` Richard Stallman
2016-02-08 17:34                                   ` Eli Zaretskii
2016-02-09 12:14                                     ` Richard Stallman
2016-02-09 13:26                                       ` Dale Snell
2016-02-10  0:11                                         ` Richard Stallman
2016-02-09 17:14                                       ` Eli Zaretskii
2016-02-09  6:01                                   ` Alexis
2016-02-09 15:21                                     ` Drew Adams
2016-02-10  0:11                                       ` Richard Stallman
2016-02-10  1:16                                         ` Alexis
2016-02-10 14:16                                           ` Richard Stallman
2016-02-11 18:59                                             ` John Wiegley
     [not found]                                       ` <<E1aTINY-0007Rg-IA@fencepost.gnu.org>
2016-02-10  2:07                                         ` Drew Adams
2016-02-10  4:14                                           ` Elias Mårtenson
2016-02-10 14:15                                             ` Richard Stallman
2016-02-10  0:08                                     ` Richard Stallman
2016-02-10  4:17                                       ` Jose E. Marchesi
2016-02-08 14:18                                 ` Stefan Monnier
2016-02-12 11:32                               ` Helmut Eller
2016-02-13 15:32                                 ` Richard Stallman
     [not found]                         ` <<E1aO05V-0007eR-Kw@fencepost.gnu.org>
2016-01-26 16:58                           ` Drew Adams
2016-01-25 13:01                   ` A proposal for removing obsolete packages Stefan Monnier
2016-01-26  9:36                     ` Richard Stallman
2016-01-26 10:30                       ` Andreas Schwab
2016-01-27  0:46                         ` Richard Stallman
2016-01-27  1:03                           ` Alexis
2016-01-27 22:53                             ` Richard Stallman
2016-01-27  8:41                           ` Andreas Schwab
2016-01-25 15:46                   ` Eli Zaretskii
     [not found]                   ` <<m2a8nu46ff.fsf@gmail.com>
     [not found]                     ` <<E1aNjCP-0004Ya-Si@fencepost.gnu.org>
2016-01-25 16:04                       ` Entering Unicode characters Drew Adams
2016-01-25 16:18                         ` Stefan Monnier
2016-01-26 16:43                 ` A proposal for removing obsolete packages John Wiegley
2016-01-26 17:32                   ` John Wiegley
2016-02-03  4:45                     ` Andrew Hyatt
2016-01-12  5:25   ` Andrew Hyatt
2016-01-12  4:07 ` Richard Stallman
2016-01-12  5:25   ` Andrew Hyatt
2016-01-12 21:49     ` Richard Stallman
2016-01-14  5:19       ` Andrew Hyatt
2016-01-17 22:53         ` Stefan Monnier
2016-01-14 23:09       ` Phillip Lord
2016-01-16  4:13         ` Andrew Hyatt
2016-01-16 19:10           ` Richard Stallman
2016-01-18 18:47             ` Andrew Hyatt
2016-01-19 13:51               ` Richard Stallman
2016-01-19 14:54           ` Phillip Lord
     [not found] <<m28u3wak2g.fsf@gmail.com>

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).