Step by step guide in compiling a custom Iosevka font on Ubuntu/Debian

Published October 27, 2019 #iosevka, #font, #emacs

My last post on how to build a custom Iosevka font got completely out of date as Iosevka changed the build system and moved away from Makefiles. I thought I’ll write an update with additional step-by-step guide on how to make it work on more popular GNU/Linux distribution - Ubuntu (it is pretty straightforward on Arch or Gentoo as every dependency can be installed by distro’s package/port manager).

/article_images/2019-10-27-iosevka.png

Custom Iosevka font you can have today!

Through the whole guide I assume we’ll clone most of the repositories used inside ~/Src/opensource/ directory.

Install dependencies

There are three major dependencies for building Iosevka, NodeJS/NPM and ttfautohint are available as binaries in Ubuntu/Debian repositories so it is quite easy to install them running the following from terminal:

sudo apt install nodejs npm ttfautohint libttfautohint-dev

Build and compile premake5 for otfcc

Otfcc requires premake5 build system to build and we need to compile it from sources:

cd ~/Src/opensource/

git clone https://github.com/premake/premake-core
cd premake-core
make -f Bootstrap.mak linux

Build otfcc

We’ll not install premake system-wide, just execute it from otfcc’s source directory and build otfcc’s binaries.

cd ~/Src/opensource/

git clone https://github.com/caryll/otfcc
cd otfcc
../premake-core/bin/release/premake5 gmake
cd build/gmake
make config=release_x64

Clone Iosevka repository

Now we can finally clone Iosevka’s source repository.

cd ~/Src/opensource/

git clone https://github.com/be5invis/Iosevka -o iosevka

Install nodeJs dependencies

Node package manager will take care of last set of dependencies needed.

cd iosevka
npm install

Create a custom build plan for Iosevka font

Now create a “private-build-plans.toml” file with the contents below inside Iosevka’s source directory. You can tweak look for each of the available options - please refer to official Iosevka readme to see what options are available. The ones below are what I’m using and reflect what you could see on the picture at the beginning of this post.

[buildPlans.iosevka-custom]
family = "Iosevka Custom"
design = [
'extended,
'ligset-coq',
'v-l-tailed',
'v-i-serifed',
'v-j-serifed',
'v-a-singlestorey',
'v-f-tailed',
'v-g-opendoublestorey',
'v-m-shortleg',
'v-t-standard',
'v-q-taily',
'v-y-curly',
'v-zero-slashed',
'v-one-hooky',
'v-three-flattop',
'v-seven-normal',
'v-tilde-high',
'v-asterisk-hexhigh',
'v-paragraph-low',
'v-caret-high',
'v-underscore-low',
'v-percent-rings',
'v-at-short',
'v-brace-curly',
'v-dollar-throughcap',
'v-numbersigh-slanted'
]

(optional) Add legacy support for ligatures

For use with Emacs. If you use an editor with Open Ligatures support (basically all of them nowadays) or are just not interested in ligatures at all - skip this step. If you want legacy ligature support built in simply append lines below to parameters.toml in Iosevka’s source code directory (credits goes to Soham Chowdhury).

# -----------------------------------------
# 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 = "<~>"

Build the iosevka font

Finally we can build the font. Just for the build step run we’ll add otfcc’s binary path to the $PATH variable, for npm to find it. Go grab some coffee as it might take a while.

env PATH="$PATH:../otfcc/bin/release-x64/" npm run build -- contents::iosevka-custom

Install the font

The last step is to install the font, a shortcut from using your desktop’s font manager is just to copy the fonts where font-config can find it and invalidate it’s cache.

cp build/iosevka-custom/*.ttf ~/.fonts
fc-cache -f

That’s all, custom Iosevka build should be available as “Iosevka Custom” now. Happy hacking!

Read next

See also

Emacs in WSL and opening links

Using Emacs on Windows got a little bit easier with the latest Creator Update to Windows 10. First great improvement allows to run unpatched Emacs and connect it to X Server like an opensource VcXsrv. Copying and pasting between Emacs and Windows apps now works like a charm, and resizing Emacs (gtk) window also works as expected. It become a really pleasant experience and it feels it have better performance than a natively compiled one.

Read more

Emacs 25 on Windows (x64)

Today whole sourceforge site wasn’t reachable from my home network and suspecting the worst I have decided to make my own Emacs build environment for Windows. Using instructions of bburns.km from https://emacs.stackexchange.com/a/19202 which in turn are based on work of Chris Zheng (emacsbinw64 project) I have created a set of simple shell scripts to automate building of Emacs straight from it’s git repository. If you would like to use them, here are instructions on how to do so:

Read more