Skip to content

Instantly share code, notes, and snippets.

@mrkgnao
Last active August 15, 2025 11:13
Show Gist options
  • Select an option

  • Save mrkgnao/49c7480e1df42405a36b7ab09fe87f3d to your computer and use it in GitHub Desktop.

Select an option

Save mrkgnao/49c7480e1df42405a36b7ab09fe87f3d to your computer and use it in GitHub Desktop.

Revisions

  1. mrkgnao revised this gist Apr 4, 2017. 1 changed file with 2 additions and 0 deletions.
    2 changes: 2 additions & 0 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -6,6 +6,8 @@ An example of generated TOML glyph definitions and elisp code are provided.

    Note that

    * I have a feature set called `XALL` in my fork that basically enables every possible ligation.

    * I've hacked a few extra ligatures into my local checkout (including `<<`, `>>`, a few attempts to make more `->>-`-ish things a la Fira Code and Pragmata Pro, and also ligatures for `<<<` and `>>>` with a bit of extra space between the arrows because things look ugly without).

    * I'm generating *far* more glyphs than there are ligatures for. In particular, I've added definitions for lots of things like `<~>` which aren't yet in Iosevka. The cool thing is that the generated glyphs end up looking almost *exactly* the same as "plain text". That is, plain `<|` and `prettify-symbols-mode`-enabled Unicode `<|` look the same. Once Iosevka gets those ligatures, I can just recompile Iosevka without having to change anything. (Besides restarting Emacs, ha.)
  2. mrkgnao revised this gist Apr 4, 2017. 1 changed file with 2 additions and 0 deletions.
    2 changes: 2 additions & 0 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -2,6 +2,8 @@ Load `IosevkaConfigGen.hs` in a REPL and run `toToml` or `toElisp` to generate e

    An example of generated TOML glyph definitions and elisp code are provided.

    ![screenshot](http://img.pixady.com/2017/04/763958_201704050200541366x768scrot.png)

    Note that

    * I've hacked a few extra ligatures into my local checkout (including `<<`, `>>`, a few attempts to make more `->>-`-ish things a la Fira Code and Pragmata Pro, and also ligatures for `<<<` and `>>>` with a bit of extra space between the arrows because things look ugly without).
  3. mrkgnao revised this gist Apr 4, 2017. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -1,11 +1,11 @@
    Load IosevkaConfigGen.hs in a REPL and run toToml or toElisp to generate either TOML definitions for the glyphs (to put in parameters.toml), or a list of prettify-symbol-mode definitions for Emacs.
    Load `IosevkaConfigGen.hs` in a REPL and run `toToml` or `toElisp` to generate either TOML definitions for the glyphs (to put in parameters.toml), or a list of `prettify-symbol-mode` definitions for Emacs.

    An example of generated TOML glyph definitions and elisp code are provided.

    Note that

    * I've hacked a few extra ligatures into my local checkout (including `<<`, `>>`, a few attempts to make more `->>-`-ish things a la Fira Code and Pragmata Pro, and also ligatures for `<<<` and `>>>` with a bit of extra space between the arrows because things look ugly without).

    * I'm generating far more glyphs than there are ligatures for. In particular, I've added definitions for lots of things like <~> which aren't yet in Iosevka. The cool thing is that the generated glyphs end up looking almost *exactly* the same as "plain text". That is, plain `<|` and prettify-symbols-mode-enabled Unicode `<|` look the same. Once Iosevka gets those ligatures, I can just recompile Iosevka without having to change anything. (Besides restarting Emacs, ha.)
    * I'm generating *far* more glyphs than there are ligatures for. In particular, I've added definitions for lots of things like `<~>` which aren't yet in Iosevka. The cool thing is that the generated glyphs end up looking almost *exactly* the same as "plain text". That is, plain `<|` and `prettify-symbols-mode`-enabled Unicode `<|` look the same. Once Iosevka gets those ligatures, I can just recompile Iosevka without having to change anything. (Besides restarting Emacs, ha.)

    * A ton of the generated glyphs (hello `==>>>--`) are stupid, but meh. I suppose having Pragmata-like equals chains with little indents near the end of each `=` might make those useful in Some Future ASCII APL/Haskell ("Jaskell"?) :P
  4. mrkgnao revised this gist Apr 4, 2017. 2 changed files with 1 addition and 2 deletions.
    1 change: 0 additions & 1 deletion IosevkaConfigGen.hs
    Original file line number Diff line number Diff line change
    @@ -3,7 +3,6 @@
    import Numeric
    import Data.Char

    import Control.Arrow
    import Control.Monad
    import Data.Monoid ((<>))
    import Data.List (nub, sort, reverse)
    2 changes: 1 addition & 1 deletion README.md
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,4 @@
    Load this up in a REPL and run toToml or toElisp to generate either TOML definitions for the glyphs (to put in parameters.toml), or a list of prettify-symbol-mode definitions for Emacs.
    Load IosevkaConfigGen.hs in a REPL and run toToml or toElisp to generate either TOML definitions for the glyphs (to put in parameters.toml), or a list of prettify-symbol-mode definitions for Emacs.

    An example of generated TOML glyph definitions and elisp code are provided.

  5. mrkgnao created this gist Apr 4, 2017.
    127 changes: 127 additions & 0 deletions IosevkaConfigGen.hs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,127 @@
    {-# LANGUAGE RecordWildCards, Arrows #-}

    import Numeric
    import Data.Char

    import Control.Arrow
    import Control.Monad
    import Data.Monoid ((<>))
    import Data.List (nub, sort, reverse)

    data RepeatBounds = RB
    { str :: String
    , min :: Int
    , max :: Int
    } deriving Show

    repeatFromTo s (min,max) = map (\n -> concat $ replicate n s) [min .. max]

    tripleOp left mid right = [left <> mid, left <> mid <> right, mid <> right]

    extended xs = map concat $ mapM renderGroup xs
    where renderGroup RB{..} = repeatFromTo str (min,max)

    reverseArrow = reverse . map rev
    where
    rev xs =
    case xs of
    '>' -> '<'
    '<' -> '>'
    x -> x

    angleArrows = rights <> map reverseArrow rights
    where
    rights = nub $
    [rgLeftHyphen, rgLeftHyphen', rgLeftEquals, rgLeftEquals'] >>= extended
    rgLeftHyphen = [RB "-" 1 2, RB ">" 1 3, RB "-" 0 2]
    rgLeftHyphen' = [RB "-" 0 2, RB ">" 1 3, RB "-" 1 2]
    rgLeftEquals = [RB "=" 1 2, RB ">" 1 3, RB "=" 0 2]
    rgLeftEquals' = [RB "=" 0 2, RB ">" 1 3, RB "=" 1 2]
    rgLeftTilde = [RB "~" 1 2, RB ">" 1 3, RB "-" 0 2]
    rgLeftTilde' = [RB "~" 1 2, RB ">" 1 3, RB "-" 0 0]

    doubleEnded left mid right min max = do
    body <- mid `repeatFromTo` (min,max)
    pure (left ++ body ++ right)

    rightEnded right mid = doubleEnded "" mid right
    leftEnded left mid = doubleEnded left mid ""

    hyphenDouble = doubleEnded "<" "-" ">" 1 5
    equalsDouble = doubleEnded "<" "=" ">" 1 5
    asteriskDouble = doubleEnded "<" "*" ">" 2 5

    htmlCommentStart = leftEnded "<!" "-" 2 3

    colons = repeatFromTo ":" (2,4)
    dots = repeatFromTo "." (2,4)

    tripleOps =
    concatMap
    (\mid -> tripleOp "<" mid ">")
    ["$", ".", "*", "\\", "/", "\"", "'", "^", "&", "%", "@", "#", "+", "-", "!", "?", "|", ":"]

    lensOps =
    concat
    [ prefix' ":" "+-="
    , postfix' ":" "+-="
    , prefix' "=" "^+-*/%"
    , postfix' "=" "^+-*/%"
    ]
    where
    prefix str = map (str ++)
    prefix' str = prefix str . lift
    postfix str = map (++ str)
    postfix' str = postfix str . lift
    lift = map (: [])

    addReversed xs = nub $ xs <> map reverseArrow xs

    monadics = addReversed [">=>", ">->",">-->",">==>"]
    composition = addReversed [">>", ">>>"]

    logic = ["/\\", "\\/"]

    semigroups = ["<>"] <> tripleOp "<" "+" ">"

    allSeqs =
    [ ("Double-ended hyphen arrows", hyphenDouble)
    , ("Double-ended equals arrows",equalsDouble)
    , ("Double-ended asterisk operators",asteriskDouble)
    , ("HTML comments",htmlCommentStart)
    , ("Three-char ops with discards",tripleOps)
    , ("Colons",colons)
    , ("Arrow-like operators",angleArrows)
    , ("Monadic operators", monadics)
    , ("Composition operators", composition)
    , ("Lens operators",lensOps)
    , ("Logical", logic)
    , ("Semigroup/monoid operators", semigroups)
    ]

    toToml = foldM_ go puaStart allSeqs
    where
    go start (sectionHeader, ligs) = do
    putStrLn "# -----------------------------------------"
    putStrLn $ "# " <> sectionHeader
    putStrLn "# -----------------------------------------\n"
    forM_ (enumerate start ligs) $ \(ix, lig) -> do
    putStrLn "[[iosevka.compLig]]"
    putStrLn $ "unicode = " <> show ix <> " # " <> toHex' "0x" ix
    putStrLn "featureTag = 'XALL'"
    putStrLn $ "sequence = " <> show lig
    putStrLn ""
    return $ start + length ligs

    toElisp = foldM_ go puaStart allSeqs
    where
    go start (sectionHeader, ligs) = do
    putStrLn $ "\n;; " <> sectionHeader <> " ----------------"
    forM_ (enumerate start ligs) $ \(ix, lig) ->
    putStrLn $ "(" <> show lig <> " . " <> toHex' "#X" ix <> ")"
    return $ start + length ligs

    enumerate start = zip [start ..]
    puaStart = 0xE100
    toHex n = showHex n ""
    toHex' prefix = (prefix <>) . toHex
    11 changes: 11 additions & 0 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,11 @@
    Load this up in a REPL and run toToml or toElisp to generate either TOML definitions for the glyphs (to put in parameters.toml), or a list of prettify-symbol-mode definitions for Emacs.

    An example of generated TOML glyph definitions and elisp code are provided.

    Note that

    * I've hacked a few extra ligatures into my local checkout (including `<<`, `>>`, a few attempts to make more `->>-`-ish things a la Fira Code and Pragmata Pro, and also ligatures for `<<<` and `>>>` with a bit of extra space between the arrows because things look ugly without).

    * I'm generating far more glyphs than there are ligatures for. In particular, I've added definitions for lots of things like <~> which aren't yet in Iosevka. The cool thing is that the generated glyphs end up looking almost *exactly* the same as "plain text". That is, plain `<|` and prettify-symbols-mode-enabled Unicode `<|` look the same. Once Iosevka gets those ligatures, I can just recompile Iosevka without having to change anything. (Besides restarting Emacs, ha.)

    * A ton of the generated glyphs (hello `==>>>--`) are stupid, but meh. I suppose having Pragmata-like equals chains with little indents near the end of each `=` might make those useful in Some Future ASCII APL/Haskell ("Jaskell"?) :P
    1,082 changes: 1,082 additions & 0 deletions parameters.toml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,1082 @@
    # -----------------------------------------
    # Double-ended hyphen arrows
    # -----------------------------------------

    [[iosevka.compLig]]
    unicode = 57600 # 0xe100
    featureTag = 'XALL'
    sequence = "<->"

    [[iosevka.compLig]]
    unicode = 57601 # 0xe101
    featureTag = 'XALL'
    sequence = "<-->"

    [[iosevka.compLig]]
    unicode = 57602 # 0xe102
    featureTag = 'XALL'
    sequence = "<--->"

    [[iosevka.compLig]]
    unicode = 57603 # 0xe103
    featureTag = 'XALL'
    sequence = "<---->"

    [[iosevka.compLig]]
    unicode = 57604 # 0xe104
    featureTag = 'XALL'
    sequence = "<----->"

    # -----------------------------------------
    # Double-ended equals arrows
    # -----------------------------------------

    [[iosevka.compLig]]
    unicode = 57605 # 0xe105
    featureTag = 'XALL'
    sequence = "<=>"

    [[iosevka.compLig]]
    unicode = 57606 # 0xe106
    featureTag = 'XALL'
    sequence = "<==>"

    [[iosevka.compLig]]
    unicode = 57607 # 0xe107
    featureTag = 'XALL'
    sequence = "<===>"

    [[iosevka.compLig]]
    unicode = 57608 # 0xe108
    featureTag = 'XALL'
    sequence = "<====>"

    [[iosevka.compLig]]
    unicode = 57609 # 0xe109
    featureTag = 'XALL'
    sequence = "<=====>"

    # -----------------------------------------
    # Double-ended asterisk operators
    # -----------------------------------------

    [[iosevka.compLig]]
    unicode = 57610 # 0xe10a
    featureTag = 'XALL'
    sequence = "<**>"

    [[iosevka.compLig]]
    unicode = 57611 # 0xe10b
    featureTag = 'XALL'
    sequence = "<***>"

    [[iosevka.compLig]]
    unicode = 57612 # 0xe10c
    featureTag = 'XALL'
    sequence = "<****>"

    [[iosevka.compLig]]
    unicode = 57613 # 0xe10d
    featureTag = 'XALL'
    sequence = "<*****>"

    # -----------------------------------------
    # HTML comments
    # -----------------------------------------

    [[iosevka.compLig]]
    unicode = 57614 # 0xe10e
    featureTag = 'XALL'
    sequence = "<!--"

    [[iosevka.compLig]]
    unicode = 57615 # 0xe10f
    featureTag = 'XALL'
    sequence = "<!---"

    # -----------------------------------------
    # Three-char ops with discards
    # -----------------------------------------

    [[iosevka.compLig]]
    unicode = 57616 # 0xe110
    featureTag = 'XALL'
    sequence = "<$"

    [[iosevka.compLig]]
    unicode = 57617 # 0xe111
    featureTag = 'XALL'
    sequence = "<$>"

    [[iosevka.compLig]]
    unicode = 57618 # 0xe112
    featureTag = 'XALL'
    sequence = "$>"

    [[iosevka.compLig]]
    unicode = 57619 # 0xe113
    featureTag = 'XALL'
    sequence = "<."

    [[iosevka.compLig]]
    unicode = 57620 # 0xe114
    featureTag = 'XALL'
    sequence = "<.>"

    [[iosevka.compLig]]
    unicode = 57621 # 0xe115
    featureTag = 'XALL'
    sequence = ".>"

    [[iosevka.compLig]]
    unicode = 57622 # 0xe116
    featureTag = 'XALL'
    sequence = "<*"

    [[iosevka.compLig]]
    unicode = 57623 # 0xe117
    featureTag = 'XALL'
    sequence = "<*>"

    [[iosevka.compLig]]
    unicode = 57624 # 0xe118
    featureTag = 'XALL'
    sequence = "*>"

    [[iosevka.compLig]]
    unicode = 57625 # 0xe119
    featureTag = 'XALL'
    sequence = "<\\"

    [[iosevka.compLig]]
    unicode = 57626 # 0xe11a
    featureTag = 'XALL'
    sequence = "<\\>"

    [[iosevka.compLig]]
    unicode = 57627 # 0xe11b
    featureTag = 'XALL'
    sequence = "\\>"

    [[iosevka.compLig]]
    unicode = 57628 # 0xe11c
    featureTag = 'XALL'
    sequence = "</"

    [[iosevka.compLig]]
    unicode = 57629 # 0xe11d
    featureTag = 'XALL'
    sequence = "</>"

    [[iosevka.compLig]]
    unicode = 57630 # 0xe11e
    featureTag = 'XALL'
    sequence = "/>"

    [[iosevka.compLig]]
    unicode = 57631 # 0xe11f
    featureTag = 'XALL'
    sequence = "<\""

    [[iosevka.compLig]]
    unicode = 57632 # 0xe120
    featureTag = 'XALL'
    sequence = "<\">"

    [[iosevka.compLig]]
    unicode = 57633 # 0xe121
    featureTag = 'XALL'
    sequence = "\">"

    [[iosevka.compLig]]
    unicode = 57634 # 0xe122
    featureTag = 'XALL'
    sequence = "<'"

    [[iosevka.compLig]]
    unicode = 57635 # 0xe123
    featureTag = 'XALL'
    sequence = "<'>"

    [[iosevka.compLig]]
    unicode = 57636 # 0xe124
    featureTag = 'XALL'
    sequence = "'>"

    [[iosevka.compLig]]
    unicode = 57637 # 0xe125
    featureTag = 'XALL'
    sequence = "<^"

    [[iosevka.compLig]]
    unicode = 57638 # 0xe126
    featureTag = 'XALL'
    sequence = "<^>"

    [[iosevka.compLig]]
    unicode = 57639 # 0xe127
    featureTag = 'XALL'
    sequence = "^>"

    [[iosevka.compLig]]
    unicode = 57640 # 0xe128
    featureTag = 'XALL'
    sequence = "<&"

    [[iosevka.compLig]]
    unicode = 57641 # 0xe129
    featureTag = 'XALL'
    sequence = "<&>"

    [[iosevka.compLig]]
    unicode = 57642 # 0xe12a
    featureTag = 'XALL'
    sequence = "&>"

    [[iosevka.compLig]]
    unicode = 57643 # 0xe12b
    featureTag = 'XALL'
    sequence = "<%"

    [[iosevka.compLig]]
    unicode = 57644 # 0xe12c
    featureTag = 'XALL'
    sequence = "<%>"

    [[iosevka.compLig]]
    unicode = 57645 # 0xe12d
    featureTag = 'XALL'
    sequence = "%>"

    [[iosevka.compLig]]
    unicode = 57646 # 0xe12e
    featureTag = 'XALL'
    sequence = "<@"

    [[iosevka.compLig]]
    unicode = 57647 # 0xe12f
    featureTag = 'XALL'
    sequence = "<@>"

    [[iosevka.compLig]]
    unicode = 57648 # 0xe130
    featureTag = 'XALL'
    sequence = "@>"

    [[iosevka.compLig]]
    unicode = 57649 # 0xe131
    featureTag = 'XALL'
    sequence = "<#"

    [[iosevka.compLig]]
    unicode = 57650 # 0xe132
    featureTag = 'XALL'
    sequence = "<#>"

    [[iosevka.compLig]]
    unicode = 57651 # 0xe133
    featureTag = 'XALL'
    sequence = "#>"

    [[iosevka.compLig]]
    unicode = 57652 # 0xe134
    featureTag = 'XALL'
    sequence = "<+"

    [[iosevka.compLig]]
    unicode = 57653 # 0xe135
    featureTag = 'XALL'
    sequence = "<+>"

    [[iosevka.compLig]]
    unicode = 57654 # 0xe136
    featureTag = 'XALL'
    sequence = "+>"

    [[iosevka.compLig]]
    unicode = 57655 # 0xe137
    featureTag = 'XALL'
    sequence = "<-"

    [[iosevka.compLig]]
    unicode = 57656 # 0xe138
    featureTag = 'XALL'
    sequence = "<->"

    [[iosevka.compLig]]
    unicode = 57657 # 0xe139
    featureTag = 'XALL'
    sequence = "->"

    [[iosevka.compLig]]
    unicode = 57658 # 0xe13a
    featureTag = 'XALL'
    sequence = "<!"

    [[iosevka.compLig]]
    unicode = 57659 # 0xe13b
    featureTag = 'XALL'
    sequence = "<!>"

    [[iosevka.compLig]]
    unicode = 57660 # 0xe13c
    featureTag = 'XALL'
    sequence = "!>"

    [[iosevka.compLig]]
    unicode = 57661 # 0xe13d
    featureTag = 'XALL'
    sequence = "<?"

    [[iosevka.compLig]]
    unicode = 57662 # 0xe13e
    featureTag = 'XALL'
    sequence = "<?>"

    [[iosevka.compLig]]
    unicode = 57663 # 0xe13f
    featureTag = 'XALL'
    sequence = "?>"

    [[iosevka.compLig]]
    unicode = 57664 # 0xe140
    featureTag = 'XALL'
    sequence = "<|"

    [[iosevka.compLig]]
    unicode = 57665 # 0xe141
    featureTag = 'XALL'
    sequence = "<|>"

    [[iosevka.compLig]]
    unicode = 57666 # 0xe142
    featureTag = 'XALL'
    sequence = "|>"

    [[iosevka.compLig]]
    unicode = 57667 # 0xe143
    featureTag = 'XALL'
    sequence = "<:"

    [[iosevka.compLig]]
    unicode = 57668 # 0xe144
    featureTag = 'XALL'
    sequence = "<:>"

    [[iosevka.compLig]]
    unicode = 57669 # 0xe145
    featureTag = 'XALL'
    sequence = ":>"

    # -----------------------------------------
    # Colons
    # -----------------------------------------

    [[iosevka.compLig]]
    unicode = 57670 # 0xe146
    featureTag = 'XALL'
    sequence = "::"

    [[iosevka.compLig]]
    unicode = 57671 # 0xe147
    featureTag = 'XALL'
    sequence = ":::"

    [[iosevka.compLig]]
    unicode = 57672 # 0xe148
    featureTag = 'XALL'
    sequence = "::::"

    # -----------------------------------------
    # Arrow-like operators
    # -----------------------------------------

    [[iosevka.compLig]]
    unicode = 57673 # 0xe149
    featureTag = 'XALL'
    sequence = "->"

    [[iosevka.compLig]]
    unicode = 57674 # 0xe14a
    featureTag = 'XALL'
    sequence = "->-"

    [[iosevka.compLig]]
    unicode = 57675 # 0xe14b
    featureTag = 'XALL'
    sequence = "->--"

    [[iosevka.compLig]]
    unicode = 57676 # 0xe14c
    featureTag = 'XALL'
    sequence = "->>"

    [[iosevka.compLig]]
    unicode = 57677 # 0xe14d
    featureTag = 'XALL'
    sequence = "->>-"

    [[iosevka.compLig]]
    unicode = 57678 # 0xe14e
    featureTag = 'XALL'
    sequence = "->>--"

    [[iosevka.compLig]]
    unicode = 57679 # 0xe14f
    featureTag = 'XALL'
    sequence = "->>>"

    [[iosevka.compLig]]
    unicode = 57680 # 0xe150
    featureTag = 'XALL'
    sequence = "->>>-"

    [[iosevka.compLig]]
    unicode = 57681 # 0xe151
    featureTag = 'XALL'
    sequence = "->>>--"

    [[iosevka.compLig]]
    unicode = 57682 # 0xe152
    featureTag = 'XALL'
    sequence = "-->"

    [[iosevka.compLig]]
    unicode = 57683 # 0xe153
    featureTag = 'XALL'
    sequence = "-->-"

    [[iosevka.compLig]]
    unicode = 57684 # 0xe154
    featureTag = 'XALL'
    sequence = "-->--"

    [[iosevka.compLig]]
    unicode = 57685 # 0xe155
    featureTag = 'XALL'
    sequence = "-->>"

    [[iosevka.compLig]]
    unicode = 57686 # 0xe156
    featureTag = 'XALL'
    sequence = "-->>-"

    [[iosevka.compLig]]
    unicode = 57687 # 0xe157
    featureTag = 'XALL'
    sequence = "-->>--"

    [[iosevka.compLig]]
    unicode = 57688 # 0xe158
    featureTag = 'XALL'
    sequence = "-->>>"

    [[iosevka.compLig]]
    unicode = 57689 # 0xe159
    featureTag = 'XALL'
    sequence = "-->>>-"

    [[iosevka.compLig]]
    unicode = 57690 # 0xe15a
    featureTag = 'XALL'
    sequence = "-->>>--"

    [[iosevka.compLig]]
    unicode = 57691 # 0xe15b
    featureTag = 'XALL'
    sequence = ">-"

    [[iosevka.compLig]]
    unicode = 57692 # 0xe15c
    featureTag = 'XALL'
    sequence = ">--"

    [[iosevka.compLig]]
    unicode = 57693 # 0xe15d
    featureTag = 'XALL'
    sequence = ">>-"

    [[iosevka.compLig]]
    unicode = 57694 # 0xe15e
    featureTag = 'XALL'
    sequence = ">>--"

    [[iosevka.compLig]]
    unicode = 57695 # 0xe15f
    featureTag = 'XALL'
    sequence = ">>>-"

    [[iosevka.compLig]]
    unicode = 57696 # 0xe160
    featureTag = 'XALL'
    sequence = ">>>--"

    [[iosevka.compLig]]
    unicode = 57697 # 0xe161
    featureTag = 'XALL'
    sequence = "=>"

    [[iosevka.compLig]]
    unicode = 57698 # 0xe162
    featureTag = 'XALL'
    sequence = "=>="

    [[iosevka.compLig]]
    unicode = 57699 # 0xe163
    featureTag = 'XALL'
    sequence = "=>=="

    [[iosevka.compLig]]
    unicode = 57700 # 0xe164
    featureTag = 'XALL'
    sequence = "=>>"

    [[iosevka.compLig]]
    unicode = 57701 # 0xe165
    featureTag = 'XALL'
    sequence = "=>>="

    [[iosevka.compLig]]
    unicode = 57702 # 0xe166
    featureTag = 'XALL'
    sequence = "=>>=="

    [[iosevka.compLig]]
    unicode = 57703 # 0xe167
    featureTag = 'XALL'
    sequence = "=>>>"

    [[iosevka.compLig]]
    unicode = 57704 # 0xe168
    featureTag = 'XALL'
    sequence = "=>>>="

    [[iosevka.compLig]]
    unicode = 57705 # 0xe169
    featureTag = 'XALL'
    sequence = "=>>>=="

    [[iosevka.compLig]]
    unicode = 57706 # 0xe16a
    featureTag = 'XALL'
    sequence = "==>"

    [[iosevka.compLig]]
    unicode = 57707 # 0xe16b
    featureTag = 'XALL'
    sequence = "==>="

    [[iosevka.compLig]]
    unicode = 57708 # 0xe16c
    featureTag = 'XALL'
    sequence = "==>=="

    [[iosevka.compLig]]
    unicode = 57709 # 0xe16d
    featureTag = 'XALL'
    sequence = "==>>"

    [[iosevka.compLig]]
    unicode = 57710 # 0xe16e
    featureTag = 'XALL'
    sequence = "==>>="

    [[iosevka.compLig]]
    unicode = 57711 # 0xe16f
    featureTag = 'XALL'
    sequence = "==>>=="

    [[iosevka.compLig]]
    unicode = 57712 # 0xe170
    featureTag = 'XALL'
    sequence = "==>>>"

    [[iosevka.compLig]]
    unicode = 57713 # 0xe171
    featureTag = 'XALL'
    sequence = "==>>>="

    [[iosevka.compLig]]
    unicode = 57714 # 0xe172
    featureTag = 'XALL'
    sequence = "==>>>=="

    [[iosevka.compLig]]
    unicode = 57715 # 0xe173
    featureTag = 'XALL'
    sequence = ">="

    [[iosevka.compLig]]
    unicode = 57716 # 0xe174
    featureTag = 'XALL'
    sequence = ">=="

    [[iosevka.compLig]]
    unicode = 57717 # 0xe175
    featureTag = 'XALL'
    sequence = ">>="

    [[iosevka.compLig]]
    unicode = 57718 # 0xe176
    featureTag = 'XALL'
    sequence = ">>=="

    [[iosevka.compLig]]
    unicode = 57719 # 0xe177
    featureTag = 'XALL'
    sequence = ">>>="

    [[iosevka.compLig]]
    unicode = 57720 # 0xe178
    featureTag = 'XALL'
    sequence = ">>>=="

    [[iosevka.compLig]]
    unicode = 57721 # 0xe179
    featureTag = 'XALL'
    sequence = "<-"

    [[iosevka.compLig]]
    unicode = 57722 # 0xe17a
    featureTag = 'XALL'
    sequence = "-<-"

    [[iosevka.compLig]]
    unicode = 57723 # 0xe17b
    featureTag = 'XALL'
    sequence = "--<-"

    [[iosevka.compLig]]
    unicode = 57724 # 0xe17c
    featureTag = 'XALL'
    sequence = "<<-"

    [[iosevka.compLig]]
    unicode = 57725 # 0xe17d
    featureTag = 'XALL'
    sequence = "-<<-"

    [[iosevka.compLig]]
    unicode = 57726 # 0xe17e
    featureTag = 'XALL'
    sequence = "--<<-"

    [[iosevka.compLig]]
    unicode = 57727 # 0xe17f
    featureTag = 'XALL'
    sequence = "<<<-"

    [[iosevka.compLig]]
    unicode = 57728 # 0xe180
    featureTag = 'XALL'
    sequence = "-<<<-"

    [[iosevka.compLig]]
    unicode = 57729 # 0xe181
    featureTag = 'XALL'
    sequence = "--<<<-"

    [[iosevka.compLig]]
    unicode = 57730 # 0xe182
    featureTag = 'XALL'
    sequence = "<--"

    [[iosevka.compLig]]
    unicode = 57731 # 0xe183
    featureTag = 'XALL'
    sequence = "-<--"

    [[iosevka.compLig]]
    unicode = 57732 # 0xe184
    featureTag = 'XALL'
    sequence = "--<--"

    [[iosevka.compLig]]
    unicode = 57733 # 0xe185
    featureTag = 'XALL'
    sequence = "<<--"

    [[iosevka.compLig]]
    unicode = 57734 # 0xe186
    featureTag = 'XALL'
    sequence = "-<<--"

    [[iosevka.compLig]]
    unicode = 57735 # 0xe187
    featureTag = 'XALL'
    sequence = "--<<--"

    [[iosevka.compLig]]
    unicode = 57736 # 0xe188
    featureTag = 'XALL'
    sequence = "<<<--"

    [[iosevka.compLig]]
    unicode = 57737 # 0xe189
    featureTag = 'XALL'
    sequence = "-<<<--"

    [[iosevka.compLig]]
    unicode = 57738 # 0xe18a
    featureTag = 'XALL'
    sequence = "--<<<--"

    [[iosevka.compLig]]
    unicode = 57739 # 0xe18b
    featureTag = 'XALL'
    sequence = "-<"

    [[iosevka.compLig]]
    unicode = 57740 # 0xe18c
    featureTag = 'XALL'
    sequence = "--<"

    [[iosevka.compLig]]
    unicode = 57741 # 0xe18d
    featureTag = 'XALL'
    sequence = "-<<"

    [[iosevka.compLig]]
    unicode = 57742 # 0xe18e
    featureTag = 'XALL'
    sequence = "--<<"

    [[iosevka.compLig]]
    unicode = 57743 # 0xe18f
    featureTag = 'XALL'
    sequence = "-<<<"

    [[iosevka.compLig]]
    unicode = 57744 # 0xe190
    featureTag = 'XALL'
    sequence = "--<<<"

    [[iosevka.compLig]]
    unicode = 57745 # 0xe191
    featureTag = 'XALL'
    sequence = "<="

    [[iosevka.compLig]]
    unicode = 57746 # 0xe192
    featureTag = 'XALL'
    sequence = "=<="

    [[iosevka.compLig]]
    unicode = 57747 # 0xe193
    featureTag = 'XALL'
    sequence = "==<="

    [[iosevka.compLig]]
    unicode = 57748 # 0xe194
    featureTag = 'XALL'
    sequence = "<<="

    [[iosevka.compLig]]
    unicode = 57749 # 0xe195
    featureTag = 'XALL'
    sequence = "=<<="

    [[iosevka.compLig]]
    unicode = 57750 # 0xe196
    featureTag = 'XALL'
    sequence = "==<<="

    [[iosevka.compLig]]
    unicode = 57751 # 0xe197
    featureTag = 'XALL'
    sequence = "<<<="

    [[iosevka.compLig]]
    unicode = 57752 # 0xe198
    featureTag = 'XALL'
    sequence = "=<<<="

    [[iosevka.compLig]]
    unicode = 57753 # 0xe199
    featureTag = 'XALL'
    sequence = "==<<<="

    [[iosevka.compLig]]
    unicode = 57754 # 0xe19a
    featureTag = 'XALL'
    sequence = "<=="

    [[iosevka.compLig]]
    unicode = 57755 # 0xe19b
    featureTag = 'XALL'
    sequence = "=<=="

    [[iosevka.compLig]]
    unicode = 57756 # 0xe19c
    featureTag = 'XALL'
    sequence = "==<=="

    [[iosevka.compLig]]
    unicode = 57757 # 0xe19d
    featureTag = 'XALL'
    sequence = "<<=="

    [[iosevka.compLig]]
    unicode = 57758 # 0xe19e
    featureTag = 'XALL'
    sequence = "=<<=="

    [[iosevka.compLig]]
    unicode = 57759 # 0xe19f
    featureTag = 'XALL'
    sequence = "==<<=="

    [[iosevka.compLig]]
    unicode = 57760 # 0xe1a0
    featureTag = 'XALL'
    sequence = "<<<=="

    [[iosevka.compLig]]
    unicode = 57761 # 0xe1a1
    featureTag = 'XALL'
    sequence = "=<<<=="

    [[iosevka.compLig]]
    unicode = 57762 # 0xe1a2
    featureTag = 'XALL'
    sequence = "==<<<=="

    [[iosevka.compLig]]
    unicode = 57763 # 0xe1a3
    featureTag = 'XALL'
    sequence = "=<"

    [[iosevka.compLig]]
    unicode = 57764 # 0xe1a4
    featureTag = 'XALL'
    sequence = "==<"

    [[iosevka.compLig]]
    unicode = 57765 # 0xe1a5
    featureTag = 'XALL'
    sequence = "=<<"

    [[iosevka.compLig]]
    unicode = 57766 # 0xe1a6
    featureTag = 'XALL'
    sequence = "==<<"

    [[iosevka.compLig]]
    unicode = 57767 # 0xe1a7
    featureTag = 'XALL'
    sequence = "=<<<"

    [[iosevka.compLig]]
    unicode = 57768 # 0xe1a8
    featureTag = 'XALL'
    sequence = "==<<<"

    # -----------------------------------------
    # Monadic operators
    # -----------------------------------------

    [[iosevka.compLig]]
    unicode = 57769 # 0xe1a9
    featureTag = 'XALL'
    sequence = ">=>"

    [[iosevka.compLig]]
    unicode = 57770 # 0xe1aa
    featureTag = 'XALL'
    sequence = ">->"

    [[iosevka.compLig]]
    unicode = 57771 # 0xe1ab
    featureTag = 'XALL'
    sequence = ">-->"

    [[iosevka.compLig]]
    unicode = 57772 # 0xe1ac
    featureTag = 'XALL'
    sequence = ">==>"

    [[iosevka.compLig]]
    unicode = 57773 # 0xe1ad
    featureTag = 'XALL'
    sequence = "<=<"

    [[iosevka.compLig]]
    unicode = 57774 # 0xe1ae
    featureTag = 'XALL'
    sequence = "<-<"

    [[iosevka.compLig]]
    unicode = 57775 # 0xe1af
    featureTag = 'XALL'
    sequence = "<--<"

    [[iosevka.compLig]]
    unicode = 57776 # 0xe1b0
    featureTag = 'XALL'
    sequence = "<==<"

    # -----------------------------------------
    # Composition operators
    # -----------------------------------------

    [[iosevka.compLig]]
    unicode = 57777 # 0xe1b1
    featureTag = 'XALL'
    sequence = ">>"

    [[iosevka.compLig]]
    unicode = 57778 # 0xe1b2
    featureTag = 'XALL'
    sequence = ">>>"

    [[iosevka.compLig]]
    unicode = 57779 # 0xe1b3
    featureTag = 'XALL'
    sequence = "<<"

    [[iosevka.compLig]]
    unicode = 57780 # 0xe1b4
    featureTag = 'XALL'
    sequence = "<<<"

    # -----------------------------------------
    # Lens operators
    # -----------------------------------------

    [[iosevka.compLig]]
    unicode = 57781 # 0xe1b5
    featureTag = 'XALL'
    sequence = ":+"

    [[iosevka.compLig]]
    unicode = 57782 # 0xe1b6
    featureTag = 'XALL'
    sequence = ":-"

    [[iosevka.compLig]]
    unicode = 57783 # 0xe1b7
    featureTag = 'XALL'
    sequence = ":="

    [[iosevka.compLig]]
    unicode = 57784 # 0xe1b8
    featureTag = 'XALL'
    sequence = "+:"

    [[iosevka.compLig]]
    unicode = 57785 # 0xe1b9
    featureTag = 'XALL'
    sequence = "-:"

    [[iosevka.compLig]]
    unicode = 57786 # 0xe1ba
    featureTag = 'XALL'
    sequence = "=:"

    [[iosevka.compLig]]
    unicode = 57787 # 0xe1bb
    featureTag = 'XALL'
    sequence = "=^"

    [[iosevka.compLig]]
    unicode = 57788 # 0xe1bc
    featureTag = 'XALL'
    sequence = "=+"

    [[iosevka.compLig]]
    unicode = 57789 # 0xe1bd
    featureTag = 'XALL'
    sequence = "=-"

    [[iosevka.compLig]]
    unicode = 57790 # 0xe1be
    featureTag = 'XALL'
    sequence = "=*"

    [[iosevka.compLig]]
    unicode = 57791 # 0xe1bf
    featureTag = 'XALL'
    sequence = "=/"

    [[iosevka.compLig]]
    unicode = 57792 # 0xe1c0
    featureTag = 'XALL'
    sequence = "=%"

    [[iosevka.compLig]]
    unicode = 57793 # 0xe1c1
    featureTag = 'XALL'
    sequence = "^="

    [[iosevka.compLig]]
    unicode = 57794 # 0xe1c2
    featureTag = 'XALL'
    sequence = "+="

    [[iosevka.compLig]]
    unicode = 57795 # 0xe1c3
    featureTag = 'XALL'
    sequence = "-="

    [[iosevka.compLig]]
    unicode = 57796 # 0xe1c4
    featureTag = 'XALL'
    sequence = "*="

    [[iosevka.compLig]]
    unicode = 57797 # 0xe1c5
    featureTag = 'XALL'
    sequence = "/="

    [[iosevka.compLig]]
    unicode = 57798 # 0xe1c6
    featureTag = 'XALL'
    sequence = "%="

    # -----------------------------------------
    # Logical
    # -----------------------------------------

    [[iosevka.compLig]]
    unicode = 57799 # 0xe1c7
    featureTag = 'XALL'
    sequence = "/\\"

    [[iosevka.compLig]]
    unicode = 57800 # 0xe1c8
    featureTag = 'XALL'
    sequence = "\\/"

    # -----------------------------------------
    # Semigroup/monoid operators
    # -----------------------------------------

    [[iosevka.compLig]]
    unicode = 57801 # 0xe1c9
    featureTag = 'XALL'
    sequence = "<>"

    [[iosevka.compLig]]
    unicode = 57802 # 0xe1ca
    featureTag = 'XALL'
    sequence = "<+"

    [[iosevka.compLig]]
    unicode = 57803 # 0xe1cb
    featureTag = 'XALL'
    sequence = "<+>"

    [[iosevka.compLig]]
    unicode = 57804 # 0xe1cc
    featureTag = 'XALL'
    sequence = "+>"

    [[iosevka.compLig]]
    unicode = 57805 # 0xe1cc
    featureTag = 'XALL'
    sequence = ">~>"

    [[iosevka.compLig]]
    unicode = 57806 # 0xe1cc
    featureTag = 'XALL'
    sequence = "<~>"
    250 changes: 250 additions & 0 deletions setup-ligatures.el
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,250 @@
    ;; I use Spacemacs, so I put this in user-config
    ;; Note that the script above only generates the long list of pairs.
    ;; The surrounding code is stolen from the PragmataPro scripts floating around on Gist.

    (setq prettify-symbols-unprettify-at-point 'right-edge)

    (defun setup-iosevka-ligatures ()
    (setq prettify-symbols-alist
    (append prettify-symbols-alist '(

    ;; Double-ended hyphen arrows ----------------
    ("<->" . #Xe100)
    ("<-->" . #Xe101)
    ("<--->" . #Xe102)
    ("<---->" . #Xe103)
    ("<----->" . #Xe104)

    ;; Double-ended equals arrows ----------------
    ("<=>" . #Xe105)
    ("<==>" . #Xe106)
    ("<===>" . #Xe107)
    ("<====>" . #Xe108)
    ("<=====>" . #Xe109)

    ;; Double-ended asterisk operators ----------------
    ("<**>" . #Xe10a)
    ("<***>" . #Xe10b)
    ("<****>" . #Xe10c)
    ("<*****>" . #Xe10d)

    ;; HTML comments ----------------
    ("<!--" . #Xe10e)
    ("<!---" . #Xe10f)

    ;; Three-char ops with discards ----------------
    ("<$" . #Xe110)
    ("<$>" . #Xe111)
    ("$>" . #Xe112)
    ("<." . #Xe113)
    ("<.>" . #Xe114)
    (".>" . #Xe115)
    ("<*" . #Xe116)
    ("<*>" . #Xe117)
    ("*>" . #Xe118)
    ("<\\" . #Xe119)
    ("<\\>" . #Xe11a)
    ("\\>" . #Xe11b)
    ("</" . #Xe11c)
    ("</>" . #Xe11d)
    ("/>" . #Xe11e)
    ("<\"" . #Xe11f)
    ("<\">" . #Xe120)
    ("\">" . #Xe121)
    ("<'" . #Xe122)
    ("<'>" . #Xe123)
    ("'>" . #Xe124)
    ("<^" . #Xe125)
    ("<^>" . #Xe126)
    ("^>" . #Xe127)
    ("<&" . #Xe128)
    ("<&>" . #Xe129)
    ("&>" . #Xe12a)
    ("<%" . #Xe12b)
    ("<%>" . #Xe12c)
    ("%>" . #Xe12d)
    ("<@" . #Xe12e)
    ("<@>" . #Xe12f)
    ("@>" . #Xe130)
    ("<#" . #Xe131)
    ("<#>" . #Xe132)
    ("#>" . #Xe133)
    ("<+" . #Xe134)
    ("<+>" . #Xe135)
    ("+>" . #Xe136)
    ("<-" . #Xe137)
    ("<->" . #Xe138)
    ("->" . #Xe139)
    ("<!" . #Xe13a)
    ("<!>" . #Xe13b)
    ("!>" . #Xe13c)
    ("<?" . #Xe13d)
    ("<?>" . #Xe13e)
    ("?>" . #Xe13f)
    ("<|" . #Xe140)
    ("<|>" . #Xe141)
    ("|>" . #Xe142)
    ("<:" . #Xe143)
    ("<:>" . #Xe144)
    (":>" . #Xe145)

    ;; Colons ----------------
    ("::" . #Xe146)
    (":::" . #Xe147)
    ("::::" . #Xe148)

    ;; Arrow-like operators ----------------
    ("->" . #Xe149)
    ("->-" . #Xe14a)
    ("->--" . #Xe14b)
    ("->>" . #Xe14c)
    ("->>-" . #Xe14d)
    ("->>--" . #Xe14e)
    ("->>>" . #Xe14f)
    ("->>>-" . #Xe150)
    ("->>>--" . #Xe151)
    ("-->" . #Xe152)
    ("-->-" . #Xe153)
    ("-->--" . #Xe154)
    ("-->>" . #Xe155)
    ("-->>-" . #Xe156)
    ("-->>--" . #Xe157)
    ("-->>>" . #Xe158)
    ("-->>>-" . #Xe159)
    ("-->>>--" . #Xe15a)
    (">-" . #Xe15b)
    (">--" . #Xe15c)
    (">>-" . #Xe15d)
    (">>--" . #Xe15e)
    (">>>-" . #Xe15f)
    (">>>--" . #Xe160)
    ("=>" . #Xe161)
    ("=>=" . #Xe162)
    ("=>==" . #Xe163)
    ("=>>" . #Xe164)
    ("=>>=" . #Xe165)
    ("=>>==" . #Xe166)
    ("=>>>" . #Xe167)
    ("=>>>=" . #Xe168)
    ("=>>>==" . #Xe169)
    ("==>" . #Xe16a)
    ("==>=" . #Xe16b)
    ("==>==" . #Xe16c)
    ("==>>" . #Xe16d)
    ("==>>=" . #Xe16e)
    ("==>>==" . #Xe16f)
    ("==>>>" . #Xe170)
    ("==>>>=" . #Xe171)
    ("==>>>==" . #Xe172)
    (">=" . #Xe173)
    (">==" . #Xe174)
    (">>=" . #Xe175)
    (">>==" . #Xe176)
    (">>>=" . #Xe177)
    (">>>==" . #Xe178)
    ("<-" . #Xe179)
    ("-<-" . #Xe17a)
    ("--<-" . #Xe17b)
    ("<<-" . #Xe17c)
    ("-<<-" . #Xe17d)
    ("--<<-" . #Xe17e)
    ("<<<-" . #Xe17f)
    ("-<<<-" . #Xe180)
    ("--<<<-" . #Xe181)
    ("<--" . #Xe182)
    ("-<--" . #Xe183)
    ("--<--" . #Xe184)
    ("<<--" . #Xe185)
    ("-<<--" . #Xe186)
    ("--<<--" . #Xe187)
    ("<<<--" . #Xe188)
    ("-<<<--" . #Xe189)
    ("--<<<--" . #Xe18a)
    ("-<" . #Xe18b)
    ("--<" . #Xe18c)
    ("-<<" . #Xe18d)
    ("--<<" . #Xe18e)
    ("-<<<" . #Xe18f)
    ("--<<<" . #Xe190)
    ("<=" . #Xe191)
    ("=<=" . #Xe192)
    ("==<=" . #Xe193)
    ("<<=" . #Xe194)
    ("=<<=" . #Xe195)
    ("==<<=" . #Xe196)
    ("<<<=" . #Xe197)
    ("=<<<=" . #Xe198)
    ("==<<<=" . #Xe199)
    ("<==" . #Xe19a)
    ("=<==" . #Xe19b)
    ("==<==" . #Xe19c)
    ("<<==" . #Xe19d)
    ("=<<==" . #Xe19e)
    ("==<<==" . #Xe19f)
    ("<<<==" . #Xe1a0)
    ("=<<<==" . #Xe1a1)
    ("==<<<==" . #Xe1a2)
    ("=<" . #Xe1a3)
    ("==<" . #Xe1a4)
    ("=<<" . #Xe1a5)
    ("==<<" . #Xe1a6)
    ("=<<<" . #Xe1a7)
    ("==<<<" . #Xe1a8)

    ;; Monadic operators ----------------
    (">=>" . #Xe1a9)
    (">->" . #Xe1aa)
    (">-->" . #Xe1ab)
    (">==>" . #Xe1ac)
    ("<=<" . #Xe1ad)
    ("<-<" . #Xe1ae)
    ("<--<" . #Xe1af)
    ("<==<" . #Xe1b0)

    ;; Composition operators ----------------
    (">>" . #Xe1b1)
    (">>>" . #Xe1b2)
    ("<<" . #Xe1b3)
    ("<<<" . #Xe1b4)

    ;; Lens operators ----------------
    (":+" . #Xe1b5)
    (":-" . #Xe1b6)
    (":=" . #Xe1b7)
    ("+:" . #Xe1b8)
    ("-:" . #Xe1b9)
    ("=:" . #Xe1ba)
    ("=^" . #Xe1bb)
    ("=+" . #Xe1bc)
    ("=-" . #Xe1bd)
    ("=*" . #Xe1be)
    ("=/" . #Xe1bf)
    ("=%" . #Xe1c0)
    ("^=" . #Xe1c1)
    ("+=" . #Xe1c2)
    ("-=" . #Xe1c3)
    ("*=" . #Xe1c4)
    ("/=" . #Xe1c5)
    ("%=" . #Xe1c6)

    ;; Logical ----------------
    ("/\\" . #Xe1c7)
    ("\\/" . #Xe1c8)

    ;; Semigroup/monoid operators ----------------
    ("<>" . #Xe1c9)
    ("<+" . #Xe1ca)
    ("<+>" . #Xe1cb)
    ("+>" . #Xe1cc)
    ))))

    (defun refresh-pretty ()
    (prettify-symbols-mode -1)
    (prettify-symbols-mode +1))

    ;; Hooks for modes in which to install the Iosevka ligatures
    (mapc (lambda (hook)
    (add-hook hook (lambda () (setup-iosevka-ligatures) (refresh-pretty))))
    '(text-mode-hook
    prog-mode-hook))
    (global-prettify-symbols-mode +1)