unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Tassilo Horn <tsdh@gnu.org>
To: Eli Zaretskii <eliz@gnu.org>
Cc: "Clément Pit-Claudel" <cpitclaudel@gmail.com>, emacs-devel@gnu.org
Subject: Re: Ligatures
Date: Tue, 19 May 2020 17:36:44 +0200	[thread overview]
Message-ID: <87367wszqr.fsf@gnu.org> (raw)
In-Reply-To: <83lflo81qh.fsf@gnu.org> (Eli Zaretskii's message of "Tue, 19 May 2020 16:59:18 +0300")

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

Eli Zaretskii <eliz@gnu.org> writes:

>> > it be very common to deconstruct such ligatures, like → into ->?
>> > 
>> > No, I don't think so.  Why would this be common?
>> 
>> I thought it would be the default. Emacs shows →, and you can put the
>> point either before (|→), in the middle (-|>), or after (→|).
>
> Doesn't sound as a useful default to me.  It could be an optional
> feature, though.

To me it sounds like a good default.

>> Here's a fairly common case: when writing html or XML, you may type
>> <, then >, then press C-b and type the tag name; or you may use < and
>> a paredit-like setup that inserts the > automatically.  If the font
>> has a ligature for <> and you can't put the point in the middle, this
>> breaks.  Same for || — the notation |x| { … } is used for lambdas in
>> some languages; if you type || then try to move the point back inside
>> the composed || glyph it won't work.
>
> Sounds like a bug or misfeature that needs a solution, not necessarily
> the one that's been proposed here.  For example, how about a special
> insert command that would disable ligation with the character it
> inserts?

I use the attached self-written ligature.el (Eli, you've helped me with
that some months back).  That's all nice but sometimes I too have the
problem that I want to edit the name of a "private" function/variable
foo--do-stuff and cannot move point inside the double-dash because it is
composed as one char.  As a little cure, I disable ligatures in the
minibuffer where I absolutely need to do completion stuff like
foo-<TAB>-bar.

Another case is where when inserting < automatically inserts >
immediately giving a <> diamond where I cannot move into.

A special insert command will not help here because it is already
inserted.

Bye,
Tassilo

[-- Attachment #2: ligature.el --]
[-- Type: text/plain, Size: 3251 bytes --]

(defgroup ligature nil
  "Support for font ligatures"
  :version "28.1"
  :prefix "ligature-")

(defcustom ligature-arrows
  (list "-->" "<!--" "->>" "<<-" "->" "<-"
	"<-<" ">>-" ">-" "<~>" "-<" "-<<"
	"<=>" "=>" "<=<" "<<=" "<==" "<==>" "==>" "=>>" ">=>" ">>="
	"<-|" "<=|"  "|=>" "|->" "<~~" "<~"  "~~>"
	"~>" "<->")
  "Arrow ligatures."
  :type '(repeat string))

(defcustom ligature-misc
  (list "..<"  "~-" "-~" "~@"  "-|" "_|_" "|-" "||-" "|=" "||="
	".?" "?="  "<|>" "<:" ":<" ":>" ">:"
	".=" ".-" "__" "<<<" ">>>" "<<" ">>" "~~"
	"<$>" "<$" "$>" "<+>" "<+" "+>" "<*>" "<*" "*>" "</" "</>" "/>"
	"|}" "{|" "[<" ">]" ":?>" ":?"  "[||]" "?:" "?."
	"|>" "<|" "||>" "<||" "|||>" "<|||::=" "|]" "[|"
	"#{" "#[" "]#" "#(" "#?" "#_" "#_(" "#:" "#!" "#=")
  "Miscellaneous ligatures."
  :type '(repeat string))

(defcustom ligature-relations
  (list "==" "!=" "<=" ">=" "=:=" "!==" "===" "<>" "/==" "=!=" "=/=" "~=" ":="
	"/=" "^=")
  "Relation ligatures."
  :type '(repeat string))

(defcustom ligature-operators
  (list "&&" "&&&" "||" "++" "--" "!!" "::" "+++" "??" ":::" "***" "---"
	"/\\" "\\/")
  "Operator ligatures."
  :type '(repeat string))

(defcustom ligature-comments-c-like
  (list "//" "///" "/**" "/*" "*/")
  "Ligatures for comments in C-like languages."
  :type '(repeat string))

(defcustom ligature-comments-xml-like
  (list "<!--" "-->")
  "Ligatures for comments in XML-like languages."
  :type '(repeat string))

(defcustom ligature-hashes
  (list "##" "###" "####")
  "Ligatures for comments in languages with # being the comment character."
  :type '(repeat string))

(defcustom ligature-dots
  (list "..." "..")
  "Dot ligatures."
  :type '(repeat string))

(defcustom ligature-semicolons
  (list ";;" ";;;")
  "Ligatures for comments in lisp languages."
  :type '(repeat string))

(defun ligature--get-all ()
  (append ligature-arrows
	  ligature-relations
	  ligature-operators
	  ligature-misc
	  ligature-dots
	  ligature-comments-c-like
	  ligature-comments-xml-like
	  ligature-hashes
	  ligature-semicolons))

(defun ligature--apply (ligatures)
  (let ((groups (seq-group-by #'string-to-char ligatures)))
    (dolist (group groups)
      (let ((c (car group))
	    (rx (regexp-opt (mapcar (lambda (s) (substring s 1))
				    (cdr group)))))
	(set-char-table-range composition-function-table
			      c `([,(concat "." rx) 0 compose-gstring-for-graphic]))))))

(define-minor-mode ligature-minor-mode
  "A mode for font ligatures."
  nil "" nil
  (if ligature-minor-mode
      (progn
        (when (minibufferp)
          (error "Cannot use ligature-minor-mode in minibuffer"))
        ;; FIXME: This doesn't work.  When enabled, there will be a local
        ;; variable but the global value is the same (and also includes the
        ;; ligature composition rules).
        (ligature--apply (ligature--get-all)))
    ;; FIXME: Even if the above worked, this could remove much more than this
    ;; mode added itself.
    (kill-local-variable 'composition-function-table)))

(defun ligature-minor-mode--apply-if-possible ()
  (unless (minibufferp)
    (ligature-minor-mode)))

(define-globalized-minor-mode global-ligature-minor-mode
  ligature-minor-mode
  ligature-minor-mode--apply-if-possible)

(provide 'ligature)

  parent reply	other threads:[~2020-05-19 15:36 UTC|newest]

Thread overview: 145+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-17 10:41 Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY) Julius Pfrommer
2020-05-17 14:09 ` Arthur Miller
2020-05-17 14:30   ` Eli Zaretskii
2020-05-17 15:06     ` Arthur Miller
2020-05-17 15:56       ` Eli Zaretskii
2020-05-17 16:50         ` Arthur Miller
2020-05-17 17:06           ` Eli Zaretskii
2020-05-17 14:35 ` Eli Zaretskii
2020-05-17 14:59   ` Julius Pfrommer
2020-05-17 15:55     ` Eli Zaretskii
2020-05-17 16:28       ` Pip Cet
2020-05-17 17:00         ` Eli Zaretskii
2020-05-17 18:50           ` Pip Cet
2020-05-17 19:17             ` Eli Zaretskii
2020-05-18 16:08               ` Ligatures (was: Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY)) Eli Zaretskii
2020-05-18 16:45                 ` tomas
2020-05-18 16:49                   ` Eli Zaretskii
2020-05-18 17:05                 ` Ligatures Stefan Monnier
2020-05-18 17:18                   ` Ligatures Eli Zaretskii
2020-05-18 19:19                     ` Ligatures Pip Cet
2020-05-18 19:25                       ` Ligatures tomas
2020-05-18 19:41                         ` Ligatures Pip Cet
2020-05-18 20:20                           ` Ligatures tomas
2020-05-18 19:33                       ` Ligatures Eli Zaretskii
2020-05-18 19:44                         ` Ligatures Clément Pit-Claudel
2020-05-19  2:25                           ` Ligatures Eli Zaretskii
2020-05-19  2:44                             ` Ligatures Clément Pit-Claudel
2020-05-19 13:59                               ` Ligatures Eli Zaretskii
2020-05-19 14:35                                 ` Ligatures Clément Pit-Claudel
2020-05-19 15:21                                   ` Ligatures Eli Zaretskii
2020-05-19 15:44                                     ` Ligatures Clément Pit-Claudel
2020-05-19 16:15                                       ` Ligatures Eli Zaretskii
2020-05-19 15:36                                 ` Tassilo Horn [this message]
2020-05-19 16:08                                   ` Ligatures Eli Zaretskii
2020-05-19 16:14                                   ` Ligatures Stefan Monnier
2020-05-19  3:47                             ` Ligatures Stefan Monnier
2020-05-19  4:51                               ` Ligatures Clément Pit-Claudel
2020-05-18 19:38                       ` Ligatures Clément Pit-Claudel
2020-05-19 14:55                         ` Ligatures Pip Cet
2020-05-19 15:30                           ` Ligatures Clément Pit-Claudel
2020-05-19 15:52                             ` Ligatures Pip Cet
2020-05-18 17:24                   ` Ligatures tomas
2020-05-18 17:41                     ` Ligatures Eli Zaretskii
2020-05-18 19:07                       ` Ligatures tomas
2020-05-18 19:17                         ` Ligatures Eli Zaretskii
2020-05-18 20:33                     ` Ligatures Stefan Monnier
2020-05-18 17:31                 ` Ligatures (was: Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY)) Clément Pit-Claudel
2020-05-18 17:39                   ` Eli Zaretskii
2020-05-18 19:01                     ` Clément Pit-Claudel
2020-05-18 19:15                       ` Eli Zaretskii
2020-05-18 19:18                       ` tomas
2020-05-18 20:37                       ` Ligatures Stefan Monnier
2020-05-18 21:59                       ` Ligatures (was: Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY)) Alan Third
2020-05-19 13:56                         ` Eli Zaretskii
2020-05-19 14:39                           ` Clément Pit-Claudel
2020-05-19 21:43                             ` Pip Cet
2020-05-20  1:41                               ` Clément Pit-Claudel
2020-05-20  2:07                               ` Ligatures Stefan Monnier
2020-05-20  7:14                               ` Ligatures (was: Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY)) tomas
2020-05-20 15:18                               ` Eli Zaretskii
2020-05-20 17:31                                 ` Clément Pit-Claudel
2020-05-20 18:01                                   ` Eli Zaretskii
2020-05-20 18:33                                     ` Clément Pit-Claudel
2020-05-20 18:49                                       ` Eli Zaretskii
2020-05-20 18:53                                         ` Clément Pit-Claudel
2020-05-20 19:02                                           ` Eli Zaretskii
2020-05-20 23:19                                   ` Ligatures Stefan Monnier
2020-05-21 10:01                                 ` Ligatures (was: Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY)) Pip Cet
2020-05-21 14:11                                   ` Eli Zaretskii
2020-05-21 16:26                                     ` Pip Cet
2020-05-21 19:08                                       ` Eli Zaretskii
2020-05-21 20:51                                         ` Clément Pit-Claudel
2020-05-21 21:16                                           ` Pip Cet
2020-05-22  6:12                                             ` Eli Zaretskii
2020-05-22  9:25                                               ` Pip Cet
2020-05-22 11:23                                                 ` Eli Zaretskii
2020-05-22 12:52                                                   ` Pip Cet
2020-05-22 13:15                                                     ` Eli Zaretskii
2020-05-22 13:29                                                       ` Clément Pit-Claudel
2020-05-22 14:30                                                         ` Eli Zaretskii
2020-05-22 14:34                                                           ` Clément Pit-Claudel
2020-05-22 19:01                                                             ` Eli Zaretskii
2020-05-22 19:33                                                               ` Clément Pit-Claudel
2020-05-22 19:44                                                                 ` Eli Zaretskii
2020-05-22 20:02                                                                   ` Clément Pit-Claudel
     [not found]                                                                     ` <83mu5z171j.fsf@gnu.org>
2020-05-23 14:34                                                                       ` Clément Pit-Claudel
2020-05-23 16:18                                                                         ` Eli Zaretskii
2020-05-23 16:37                                                                           ` Clément Pit-Claudel
2020-05-22 13:56                                                       ` Pip Cet
     [not found]                                                         ` <83lflj16jn.fsf@gnu.org>
     [not found]                                                           ` <AF222EA0-FE05-4224-8459-2BF82CE27266@vasilij.de>
     [not found]                                                             ` <834ks7110w.fsf@gnu.org>
2020-05-23 11:24                                                               ` Vasilij Schneidermann
2020-05-23 13:04                                                                 ` Eli Zaretskii
     [not found]                                                           ` <83eerb145r.fsf@gnu.org>
     [not found]                                                             ` <CAOqdjBeef8Fa596raEyBUwv0Zr+41LSiYvHW39EdoaXpyxCXVw@mail.gmail.com>
     [not found]                                                               ` <831rnb0zld.fsf@gnu.org>
2020-05-23 12:36                                                                 ` Pip Cet
2020-05-23 14:08                                                                   ` Eli Zaretskii
2020-05-23 15:13                                                                     ` Pip Cet
2020-05-23 16:34                                                                       ` Eli Zaretskii
2020-05-23 22:38                                                                         ` Pip Cet
2020-05-24 15:33                                                                           ` Eli Zaretskii
2020-05-26 18:13                                                                             ` Pip Cet
2020-05-26 19:46                                                                               ` Eli Zaretskii
2020-05-27  9:36                                                                                 ` Pip Cet
2020-05-27 17:13                                                                                   ` Eli Zaretskii
2020-05-27 18:42                                                                                     ` Pip Cet
2020-05-27 19:19                                                                                       ` Eli Zaretskii
2020-05-23 17:32                                                                       ` Eli Zaretskii
2020-05-23 21:29                                                                         ` Pip Cet
2020-05-24 15:19                                                                           ` Eli Zaretskii
2020-05-23 12:47                                                                 ` Ligatures Stefan Monnier
2020-05-23 13:10                                                                   ` Ligatures Eli Zaretskii
2020-05-23 13:45                                                                     ` Ligatures Stefan Monnier
2020-05-23 14:12                                                                       ` Ligatures Eli Zaretskii
2020-05-23 13:36                                                                   ` Ligatures 조성빈
2020-05-23 14:15                                                                     ` Ligatures Stefan Monnier
2020-05-23 14:37                                                                   ` Ligatures Pip Cet
2020-05-22 11:44                                           ` Ligatures (was: Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY)) Eli Zaretskii
2020-05-22 13:26                                             ` Clément Pit-Claudel
2020-05-22 14:29                                               ` Eli Zaretskii
2020-05-22 14:32                                                 ` Clément Pit-Claudel
2020-05-22 19:00                                                   ` Eli Zaretskii
2020-05-21 21:06                                         ` Pip Cet
2020-05-22  6:06                                           ` Eli Zaretskii
2020-05-22  9:34                                             ` Pip Cet
2020-05-22 11:33                                               ` Eli Zaretskii
2020-05-19 20:26                           ` Alan Third
2020-05-19 10:09                   ` Trevor Spiteri
2020-05-19 14:22                     ` Eli Zaretskii
2020-05-19  5:43                 ` Ligatures ASSI
2020-05-19  7:22                   ` Ligatures tomas
2020-05-19  7:55                     ` Ligatures Joost Kremers
2020-05-19  8:07                       ` Ligatures tomas
2020-05-19 10:17                         ` Ligatures Yuri Khan
2020-05-19 14:26                           ` Ligatures Eli Zaretskii
2020-05-19 19:00                             ` Ligatures Yuri Khan
2020-05-19 10:43                         ` Ligatures Werner LEMBERG
2020-05-19 10:48                           ` Ligatures tomas
2020-05-19 14:18                   ` Ligatures Eli Zaretskii
2020-05-19 14:52                     ` Ligatures Eli Zaretskii
2020-05-19 15:11                       ` Ligatures Pip Cet
2020-05-19 15:36                         ` Ligatures Eli Zaretskii
2020-05-19 16:16                           ` Ligatures Pip Cet
2020-05-19 16:41                             ` Ligatures Eli Zaretskii
2020-05-19 17:00                             ` Ligatures Eli Zaretskii
2020-05-17 18:28       ` Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY) Julius Pfrommer
2020-05-17 18:45         ` Eli Zaretskii
2020-05-17 22:28         ` chad
2020-05-18 22:08         ` Alan Third

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87367wszqr.fsf@gnu.org \
    --to=tsdh@gnu.org \
    --cc=cpitclaudel@gmail.com \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this 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).