Removed fonts from repo. Download it yourself if you want them.
3
.gitmodules
vendored
@ -7,6 +7,3 @@
|
||||
[submodule "init/vim-json"]
|
||||
path = init/vim-json
|
||||
url = https://github.com/elzr/vim-json
|
||||
[submodule "init/source-code-pro"]
|
||||
path = init/source-code-pro
|
||||
url = https://github.com/adobe-fonts/source-code-pro
|
||||
|
3
init/FiraCode/.github/FUNDING.yml
vendored
@ -1,3 +0,0 @@
|
||||
github: [tonsky]
|
||||
patreon: tonsky
|
||||
custom: https://paypal.me/nikitonsky
|
12
init/FiraCode/.gitignore
vendored
@ -1,12 +0,0 @@
|
||||
*.zip
|
||||
FiraCode_liga.glyphs
|
||||
FiraCode_mess.glyphs
|
||||
target
|
||||
clojure/*.edn
|
||||
FiraCode\ (Autosaved).glyphs
|
||||
.cpcache
|
||||
master_ufo
|
||||
instance_ufo
|
||||
venv
|
||||
.DS_Store
|
||||
*.numbers
|
@ -1,10 +0,0 @@
|
||||
# This is the official list of project authors for copyright purposes.
|
||||
# This file is distinct from the CONTRIBUTORS.txt file.
|
||||
# See the latter for an explanation.
|
||||
#
|
||||
# Names should be added to this file as:
|
||||
# Name or Organization <email address>
|
||||
|
||||
Mozilla Foundation (https://www.mozilla.org/en-US/contact/)
|
||||
Telefonica S.A.
|
||||
Nikita Prokopov (prokopov@gmail.com) github.com/tonsky
|
@ -1,292 +0,0 @@
|
||||
### Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
#### 3.1 (April 15, 2020)
|
||||
|
||||
- Fixed width of Germandbls, cornerbracketleft, cornerbracketleft, negativeAcknowledge-control, cornerbracketleft.half, cornerbracketright.half [#1000]
|
||||
- Fixed misplaced descenders on U+04B3 `ҳ` U+04CB `Ӌ` and U+04CC`ӌ` [#995]
|
||||
- Fixed U+03F4 `ϴ` [#996]
|
||||
- Fixed U+0314 COMBINING REVERSED COMMA ABOVE [#997]
|
||||
|
||||
#### 3.0 (April 9, 2020)
|
||||
|
||||
- Disabled ligatures in progress bars `[-> [--> [---> [=> [==> [===>` [#968]
|
||||
- Added set letters U+2102 `ℂ` U+210D `ℍ` U+2115 `ℕ` U+2119 `ℙ` U+211A `ℚ` U+211D `ℝ` U+2124 `ℤ` and U+1D539 `𝔹` [#841]
|
||||
- Removed `?:` [#970]
|
||||
- Added missing set operations U+2200 `∀` U+2203..U+2205 `∃ ∄ ∅` U+2207 `∇` U+2282..U+228B `⊂ ⊃ ⊄ ⊅ ⊆ ⊇ ⊈ ⊉ ⊊ ⊋` U+2208..U+220# `∈ ∉ ∊ ∋ ∌ ∍` U+222A `∪` [#822]
|
||||
- Added U+300C U+300D Corner brackets `「」` and U+FF62 U+FF63 Halfwidth Corner brackets `「」` [#940]
|
||||
- Added `<<->>` [#919]
|
||||
- Disabled `fl` `Fl` `Tl` ligatures, adjusted `l` height in combination with `[F T I f]` instead [#902]
|
||||
- Added U+25A4..25A9 Squares with fill `▤▥▦▧▨▩` [#450]
|
||||
- Slightly tuned multiple ampersands in `ss03` [#831]
|
||||
- Fixed horizontal bar height in `<!--` [#917]
|
||||
- Fixed multiply sign in `0xFF` and `10x10` with combination of `onum` and `zero` [#888]
|
||||
- Fixed dollar sign in `<$` `$>` `<$>` when `ss04` is active [#830]
|
||||
- Removed `ss19` and `ss20` (they are covered by `zero` and `onum`)
|
||||
- Added `=~` and `!~` to `ss07` [#293]
|
||||
- Removed `~=` [#381]
|
||||
- Re-added `..=` with just a subtle spacing adjustment [#934]
|
||||
- Added U+2630..U+2637 `☰☱☲☳☴☵☶☷` (Bagua trigrams) [#859]
|
||||
- Disabled `<?=` (`?=` after `<`) [#850]
|
||||
- Added SemiBold weight [#987]
|
||||
- Replaced single LIG with per-glyph *.spacer
|
||||
|
||||
#### 2.0 (September 9, 2019)
|
||||
|
||||
- Characters U+25DE `◟` and U+25DF `◞` were swapped [#761]
|
||||
- Added Box Drawing Light Arcs U+256D `╭` U+256E `╮` U+256F `╯` U+2570 `╰` [#349] [#702] [#714] [#725]
|
||||
- Added Mathematical Angle Brackets U+27E8 `⟨` U+27E9 `⟩` [#763]
|
||||
- Added Light and heavy dashed lines U+2504..U+250B `┄┅┆┇┈┉┊┋` [#702]
|
||||
- Adjusted Box drawings double dashes U+254C..U+254F `╌╍╎╏`
|
||||
- Fixed outlines of U+04FA `Ӻ` and U+04FB `ӻ` [#806]
|
||||
- Added Not identical to U+2262 `≢` [#396]
|
||||
- Added Latin Capital Letter Sharp S U+1E9E `ẞ` [#587]
|
||||
- Tuned position and width of U+2044 Fraction Slash ` ⁄ ` [#588] and U+2215 Division Slash `∕` [#805]
|
||||
- Added U+1405 Canadian Syllabics O `ᐅ` and U+140A Canadian Syllabics A `ᐊ` [#666]
|
||||
- Added U+2234 Therefore `∴` and U+2235 Because `∵` [#669]
|
||||
- Added U+239B..U+23AD multi-line brackets [#675]
|
||||
|
||||
```
|
||||
⎛ 1 ⎞ ⎡ a ⎤ ⎧ x ⎫
|
||||
⎜ 2 ⎟ ⎢ b ⎥ ⎪ y ⎪
|
||||
⎜ 3 ⎟ ⎢ c ⎥ ⎨ z ⎬
|
||||
⎜ 4 ⎟ ⎢ d ⎥ ⎪ y ⎪
|
||||
⎝ 5 ⎠ ⎣ e ⎦ ⎩ x ⎭
|
||||
```
|
||||
|
||||
- Added U+27F0..U+27FF Supplemental Arrows-A `⟲⟳⟰⟱⟴⟵⟶⟷⟸⟹⟺⟻⟼⟽⟾⟿` [#677]
|
||||
- Added U+2400..U+2426 Control Pictures `␆␈␇␣␢␘␍␐␡␥␔␑␓␒␙␃␄␗␅␛␜␌␝␉␊␕␀␞␏␎␠␁␂␚␦␖␟␋` [#764]
|
||||
- Added U+2388 Helm Symbol `⎈` [#766]
|
||||
- Added U+2016 Double Vertical Line `‖` [#780]
|
||||
- Tuned metrics (1870,-530 -> 1800,-600, upm 2000 -> 1950, hopefully fix [#241] [#252] [#459] [#552] [#798])
|
||||
- Box characters to not overflow line height, taller `|` [#449]
|
||||
- Added few technical symbols [#799]:
|
||||
- U+21A9 Leftwards arrow with hook (Return) `↩`
|
||||
- U+21DE Upwards arrow with double stroke (Page Up) `⇞`
|
||||
- U+21DF Downwards arrow with double stroke (Page down) `⇟`
|
||||
- U+21E4 Left Tab Arrow `⇤`
|
||||
- U+21E5 Right Tab Arrow `⇥`
|
||||
- U+2300 Diameter sign `⌀`
|
||||
- U+2303 Up Arrowhead (Control) `⌃`
|
||||
- U+2304 Down Arrowhead `⌄`
|
||||
- U+2305 Projective `⌅`
|
||||
- U+2306 Perspective `⌆`
|
||||
- U+2318 Place of interest sign (Command) `⌘`
|
||||
- U+2324 Up Arrowhead between two horizontal bars `⌤`
|
||||
- U+2325 Option Key `⌥`
|
||||
- U+2387 Alternative Key Symbol `⎇`
|
||||
- U+238B Broken Circle with Northwest Arrow (Escape) `⎋`
|
||||
- U+23CF Eject symbol `⏏`
|
||||
- Added Coq logical and ` /\ ` and logical or ` \/ ` ligatures, U+2227 `∧` and U+2228 `∨` [#191] [#488] [#738] [#810]
|
||||
- Added SystemVerilog `|->` `|=>` and `<-|` `<=|` for symmetry [#695]
|
||||
- Added Forces `||-` ligature and U+22A2..U+22AF `⊢ ⊣ ⊤ ⊥ ⊦ ⊧ ⊨ ⊩ ⊪ ⊫ ⊬ ⊭ ⊮ ⊯` [#709]
|
||||
- Added `fl` `Fl` `Tl` ligatures, adjusted `fi` `fj` pairs [#795]
|
||||
- Disabled ligatures after regexp lookahead/lookbehinds `(?<=<` `(?<=>` `(?<==>` `(?<=|` `(?<==` `(?=:=` `(?=!=` `(?==` `(?===` `(?==>` `(?=>` `(?=>>` `(?=<<` `(?=/=` `(?!!` `(?!!.` `(?!=` `(?!==` `(?<!!` `(?<!!.` `(?<!=` `(?<!==` `(?<!--` [#578]
|
||||
- Removed `..=` [#757]
|
||||
- Alternatives (stylistic sets):
|
||||
- Lowercase `r` (ss01) [#601]
|
||||
- Less than/greater than `<=` `>=` (ss02) [#263] [#617]
|
||||
- Ampersand `&` (ss03) [#617]
|
||||
- Dollar sign `$` (ss04) [#617]
|
||||
- At sign `@` (ss05) [#617] [#748] [#817]
|
||||
- Thin backslash (ss06) [#577 #720 #825]
|
||||
- Dotted zero `0` (zero, ss19)
|
||||
- Old-style figures (onum, ss20) [#561] [#715]
|
||||
- Old-style figures no longer prevent ligatures [#561] [#715]
|
||||
|
||||
#### 1.207 (April 6, 2019)
|
||||
|
||||
- Variable TTF, cleaned up [many small Light weight errors](https://github.com/thundernixon/FiraCode/blob/qa/googlefonts-qa/notes/outline-checks.md) (done by @thundernixon, PR #735)
|
||||
- Dropped EOF which were only useful for IE 6-11
|
||||
- Fixed different vertical position of `<=` `>=` in Light and Bold caused during [#483]
|
||||
|
||||
#### 1.206 (September 30, 2018)
|
||||
|
||||
- Added `<==>` ([#392]), `#:` ([#642]), `!!.` ([#618]), `>:` `:<` ([#605]), U+0305 Combining overline ([#608]), U+2610 Ballot box, U+2611 Ballot box with check, U+2612 Ballot box with x ([#384])
|
||||
- Fixed incorrect width of `[` `**` ([#607])
|
||||
- Redrew `{|` `|}` `[|` `|]` ([#643])
|
||||
- Removed `{.` `.}` ([#635]), thin backslash ([#577])
|
||||
- Disabled ligatures in `(?=` `(?<=` `(?:` ([#624]), `>=<` ([#548]), `{|}` `[|]` ([#593])
|
||||
- Fixed ligatures precedence in `<||>` ([#621]), `:>=` ([#574]), `<<*>>` `<<<*>>>` `<<+>>` <<<+>>>` `<<$>>` `<<<$>>>` ([#410]), `!=<` ([#276])
|
||||
- Fixed incorrectly swapped box drawing characters `╵` and `╷` ([#595])
|
||||
- Adjusted vertical position of `<=` `>=` to align with `<` `>` ([#483])
|
||||
|
||||
#### 1.205 (February 27, 2018)
|
||||
|
||||
- Slashed zero by default ([#481] [#342])
|
||||
- Adjusted vertical position of colon `:` near `{[()]}` ([#486])
|
||||
- Thin backslash except when in `\\`, removed `\\\` ([#536])
|
||||
- Added `:>` ([#547]) and `<:` ([#525])
|
||||
- Removed `=<` ([#479] [#468] [#424] [#406] [#355] [#305])
|
||||
- Added `::=` ([#539])
|
||||
- Added `[|` `|]` ([#516]) `{|` `|}` ([#330])
|
||||
- Added `✓` (U+2713)
|
||||
- Added `..=` ([#433])
|
||||
- Added `=!=` ([#338])
|
||||
- Added `|-` `-|` `_|_` and adjusted `|=` `||=` ([#494])
|
||||
- Added `#=` ([#208])
|
||||
|
||||
#### 1.204 (November 6, 2016)
|
||||
|
||||
- Added `U+25B6` (black right-pointing triangle) and `U+25C0` (black left-pointing triangle) ([#289])
|
||||
- Changed look of Markdown headers `##` `###` `####` to make them easier to tell apart ([#287])
|
||||
- Fixed BBEdit incorrectly applying ligatures after tab ([#274])
|
||||
- Returned Nim pragmas `{.` `.}` ([#279])
|
||||
- Added Unicode increment `U+2206` ([#174], [#298])
|
||||
- Added fish operators `>->` `<-<` ([#297])
|
||||
- Added safe navigation operators `?.` `.?` `?:` ([#215])
|
||||
- Added `<~>` ([#179], used in IntelliJ for collapsed methods)
|
||||
- Added F# piping operators `||>` `|||>` `<||` `<|||` ([#184])
|
||||
- Added shebang `#!` ([#169], [#193])
|
||||
|
||||
#### 1.203 (September 17, 2016)
|
||||
|
||||
- Added `__` ([#120], [#269])
|
||||
|
||||
#### 1.202 (September 17, 2016)
|
||||
|
||||
- Removed `{.` `.}` `[.` `.]` `(.` `.)` ([#264])
|
||||
|
||||
#### 1.201 (August 30, 2016)
|
||||
|
||||
- Removed `[]` ([#92]) `{-` `-}` ([#248])
|
||||
- Removed `/**` `**/` and disabled ligatures for `/*/` `*/*` sequences ([#219] [#238])
|
||||
- Added `]#` `{.` `.}` `[.` `.]` `(.` `.)` ([#214])
|
||||
|
||||
#### 1.200 (July 18, 2016)
|
||||
|
||||
- Removed `!!!` `???` `;;;` `&&&` `|||` `=~` [#167] `~~~` `%%%`
|
||||
- New safer `calt` code that doesn’t apply ligatures to long sequences of chars, e.g. `!!!!`, `>>>>`, etc ([#49], [#110], [#176])
|
||||
- Larger `+` `-` `*` and corresponding ligatures ([#86])
|
||||
- Hexadecimal `x` (`0xFF`) is now applied to sequences like `128x128` as well ([#161])
|
||||
- Added twoTurned (U+218A) and threeTurned (U+218B) ([#146])
|
||||
- Added whiteFrowningFace (U+2639) ([#190])
|
||||
- Simplified visual style on markdown headers `##` `###` `####` ([#107])
|
||||
- Added `</>` ([#147])
|
||||
- Provided ttf and webfonts versions (eot, woff, woff2) ([#18], [#24], [#38], [#101], [#106])
|
||||
- Increased spacing in `<=` `>=` ([#117])
|
||||
|
||||
#### 1.102
|
||||
|
||||
- Support for IntelliJ-based IDEs ([instructions](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions))
|
||||
- Turned on autohinting
|
||||
|
||||
#### 1.101
|
||||
|
||||
- Added Light weight
|
||||
- Adjusted rules when vertical centering of `:`, `-`, `*` and `+` occurs
|
||||
|
||||
#### 1.100
|
||||
|
||||
- Fixed calt table conflicts (`----` would incorrectly render as `<!--`)
|
||||
- Added centered `:` (between digits, e.g. `10:40`)
|
||||
- Added lowercase-aligned `-`, `*` and `+` (only between lowercase letters, e.g. kebab case `var-name`, pointers `*ptr` etc)
|
||||
|
||||
#### 1.000
|
||||
|
||||
Added weights:
|
||||
|
||||
- Retina (just slightly heavier than Regular)
|
||||
- Medium
|
||||
- Bold
|
||||
|
||||
Switched to `calt` instead of `liga`. You can now “step inside” the ligature in text editors.
|
||||
|
||||
Fira Code is now drawn and built in Glyphs 2 app (should improve compatibility).
|
||||
|
||||
Added:
|
||||
|
||||
`<->` `<~~` `<~` `~~~` `~>` `~~>`
|
||||
`<$` `<+` `<*` `*>` `+>` `$>`
|
||||
`;;;` `:::` `!!!` `???` `%%` `%%%` `##` `###` `####`
|
||||
`.-` `#_(` `=<` `**/` `0x` `www` `[]`
|
||||
|
||||
Redrawn:
|
||||
|
||||
`{-` `-}` `~=` `=~` `=<<` `>>=` `<$>` `<=>` `.=`
|
||||
|
||||
Removed: `?:`
|
||||
|
||||
Total ligatures count: 115
|
||||
|
||||
#### 0.6
|
||||
|
||||
Redrawn from Fira Mono 3.204 (slightly heavier weight)
|
||||
|
||||
Added:
|
||||
|
||||
`**` `***` `+++` `--` `---` `?:`
|
||||
`/=` `/==` `.=` `^=` `=~` `?=` `||=` `|=`
|
||||
`<<<` `<=<` `-<<` `-<` `>-` `>>-` `>=>` `>>>`
|
||||
`<*>` `<|>` `<$>` `<+>`
|
||||
`<!--` `{-` `-}` `/**` `\\` `\\\`
|
||||
`..<` `??` `|||` `&&&` `<|` `|>`
|
||||
|
||||
Added support for Powerline
|
||||
|
||||
#### 0.5
|
||||
|
||||
Added: `#{` `~-` `-~` `<==` `==>` `///` `;;` `</`
|
||||
|
||||
#### 0.4
|
||||
|
||||
- Added `~=` `~~` `#[`
|
||||
- Rolled back `&&` and `||` to more traditional look
|
||||
- `===` and `!==` are now rendered with 3 horizontal bars
|
||||
|
||||
#### 0.3
|
||||
|
||||
Added: `~@` `#?` `=:=` `=<`
|
||||
|
||||
#### 0.2.1
|
||||
|
||||
Fixed width of `&&` and `||`
|
||||
|
||||
#### 0.2
|
||||
|
||||
Added: `-->` `<--` `&&` `||` `=>>` `=/=`
|
||||
|
||||
#### 0.1
|
||||
|
||||
`>>=` `=<<` `<<=` `->>` `->` `=>` `<<-` `<-`
|
||||
`===` `==` `<=>` `>=` `<=` `>>` `<<` `!==` `!=` `<>`
|
||||
`:=` `++` `#(` `#_`
|
||||
`::` `...` `..` `!!` `//` `/*` `*/` `/>`
|
||||
|
||||
[#18]: https://github.com/tonsky/FiraCode/issues/18
|
||||
[#24]: https://github.com/tonsky/FiraCode/issues/24
|
||||
[#38]: https://github.com/tonsky/FiraCode/issues/38
|
||||
[#49]: https://github.com/tonsky/FiraCode/issues/49
|
||||
[#86]: https://github.com/tonsky/FiraCode/issues/86
|
||||
[#92]: https://github.com/tonsky/FiraCode/issues/92
|
||||
[#101]: https://github.com/tonsky/FiraCode/issues/101
|
||||
[#106]: https://github.com/tonsky/FiraCode/issues/106
|
||||
[#107]: https://github.com/tonsky/FiraCode/issues/107
|
||||
[#110]: https://github.com/tonsky/FiraCode/issues/110
|
||||
[#117]: https://github.com/tonsky/FiraCode/issues/117
|
||||
[#120]: https://github.com/tonsky/FiraCode/issues/120
|
||||
[#146]: https://github.com/tonsky/FiraCode/issues/146
|
||||
[#147]: https://github.com/tonsky/FiraCode/issues/147
|
||||
[#161]: https://github.com/tonsky/FiraCode/issues/161
|
||||
[#167]: https://github.com/tonsky/FiraCode/issues/167
|
||||
[#169]: https://github.com/tonsky/FiraCode/issues/169
|
||||
[#174]: https://github.com/tonsky/FiraCode/issues/174
|
||||
[#176]: https://github.com/tonsky/FiraCode/issues/176
|
||||
[#179]: https://github.com/tonsky/FiraCode/issues/179
|
||||
[#184]: https://github.com/tonsky/FiraCode/issues/184
|
||||
[#190]: https://github.com/tonsky/FiraCode/issues/190
|
||||
[#193]: https://github.com/tonsky/FiraCode/issues/193
|
||||
[#214]: https://github.com/tonsky/FiraCode/issues/214
|
||||
[#215]: https://github.com/tonsky/FiraCode/issues/215
|
||||
[#219]: https://github.com/tonsky/FiraCode/issues/219
|
||||
[#238]: https://github.com/tonsky/FiraCode/issues/238
|
||||
[#248]: https://github.com/tonsky/FiraCode/issues/248
|
||||
[#264]: https://github.com/tonsky/FiraCode/issues/264
|
||||
[#269]: https://github.com/tonsky/FiraCode/issues/269
|
||||
[#274]: https://github.com/tonsky/FiraCode/issues/274
|
||||
[#279]: https://github.com/tonsky/FiraCode/issues/279
|
||||
[#287]: https://github.com/tonsky/FiraCode/issues/287
|
||||
[#289]: https://github.com/tonsky/FiraCode/issues/289
|
||||
[#297]: https://github.com/tonsky/FiraCode/issues/297
|
||||
[#298]: https://github.com/tonsky/FiraCode/issues/298
|
@ -1,93 +0,0 @@
|
||||
Copyright (c) 2014, The Fira Code Project Authors (https://github.com/tonsky/FiraCode)
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
@ -1,240 +0,0 @@
|
||||
## Fira Code: free monospaced font with programming ligatures
|
||||
|
||||
<img src="./extras/logo.svg">
|
||||
|
||||
### Problem
|
||||
|
||||
Programmers use a lot of symbols, often encoded with several characters. For the human brain, sequences like `->`, `<=` or `:=` are single logical tokens, even if they take two or three characters on the screen. Your eye spends a non-zero amount of energy to scan, parse and join multiple characters into a single logical one. Ideally, all programming languages should be designed with full-fledged Unicode symbols for operators, but that’s not the case yet.
|
||||
|
||||
### Solution
|
||||
|
||||
Fira Code is a free monospaced font containing ligatures for common programming multi-character combinations. This is just a font rendering feature: underlying code remains ASCII-compatible. This helps to read and understand code faster. For some frequent sequences like `..` or `//`, ligatures allow us to correct spacing.
|
||||
|
||||
### Download & Install
|
||||
|
||||
**<a href="https://github.com/tonsky/FiraCode/releases/download/3.1/FiraCode_3.1.zip">Download Fira Code v3.1</a>**
|
||||
|
||||
Then:
|
||||
|
||||
- <a href="https://github.com/tonsky/FiraCode/wiki">How to Install</a>
|
||||
- <a href="https://github.com/tonsky/FiraCode/wiki#troubleshooting">Troubleshooting</a>
|
||||
- <a href="https://twitter.com/FiraCode">News & Updates</a>
|
||||
|
||||
### Support
|
||||
|
||||
<a href="https://github.com/sponsors/tonsky" target="_blank"><img src="./extras/sponsor.png"></a>
|
||||
|
||||
Fira Code is a personal, free-time project with no funding and huge [feature request backlog](https://github.com/tonsky/FiraCode/issues). If you love it, consider supporting its development via [GitHub Sponsors](https://github.com/sponsors/tonsky) or [Patreon](https://patreon.com/tonsky). Any help counts!
|
||||
|
||||
### What’s in the box?
|
||||
|
||||
Left: ligatures as rendered in Fira Code. Right: same character sequences without ligatures.
|
||||
|
||||
<img src="./showcases/v3/all_ligatures.png">
|
||||
|
||||
Fira Code comes with a few different character variants, so that everyone can choose what’s best for them. [How to enable](https://github.com/tonsky/FiraCode/wiki/How-to-enable-stylistic-sets)
|
||||
|
||||
<img src="./showcases/v3/stylistic_sets.png">
|
||||
|
||||
In addition to that, Fira Code contains huge variety of Unicode characters well-suited for technical writing, math formulas and terminal UIs.
|
||||
|
||||
<img src="./showcases/v3/unicode.png">
|
||||
|
||||
### Code examples
|
||||
|
||||
Ruby:
|
||||
|
||||
<img src="./showcases/v3/ruby.png">
|
||||
|
||||
JavaScript:
|
||||
|
||||
<img src="./showcases/v3/javascript.png">
|
||||
|
||||
PHP:
|
||||
|
||||
<img src="./showcases/v3/php.png">
|
||||
|
||||
Erlang:
|
||||
|
||||
<img src="./showcases/v3/erlang.png">
|
||||
|
||||
Elixir:
|
||||
|
||||
<img src="/showcases/v3/elixir.png">
|
||||
|
||||
Go:
|
||||
|
||||
<img src="./showcases/v3/go.png">
|
||||
|
||||
LiveScript:
|
||||
|
||||
<img src="./showcases/v3/livescript.png">
|
||||
|
||||
Clojure:
|
||||
|
||||
<img src="./showcases/v3/clojure.png">
|
||||
|
||||
Swift:
|
||||
|
||||
<img src="./showcases/v3/swift.png">
|
||||
|
||||
### Terminal compatibility list
|
||||
|
||||
| Works | Doesn’t work |
|
||||
| ------------------ | ------------------ |
|
||||
| **Butterfly** | **Alacritty** |
|
||||
| **crosh** (ChromeOS, [instructions](https://github.com/tonsky/FiraCode/wiki/ChromeOS-Terminal)) | **Windows Console (conhost.exe)** |
|
||||
| **Hyper.app** | **Cmder** |
|
||||
| **iTerm 2** ([3.1+](https://gitlab.com/gnachman/iterm2/issues/3568#note_13118332)) | **ConEmu** |
|
||||
| **Kitty** | **GNOME Terminal** |
|
||||
| **Konsole** | **mate-terminal** |
|
||||
| **mintty** (partial support [2.8.3+](https://github.com/mintty/mintty/issues/601))| **PuTTY** |
|
||||
| **QTerminal** | **rxvt** |
|
||||
| **Terminal.app** | **xterm** |
|
||||
| **Termux** | **ZOC** (Windows) |
|
||||
| **Token2Shell/MD** | **gtkterm, guake, LXTerminal, sakura, Terminator, xfce4-terminal,** and other libvte-based terminals ([bug report](https://bugzilla.gnome.org/show_bug.cgi?id=584160)) |
|
||||
| **upterm** |
|
||||
| **Windows Terminal** |
|
||||
| **ZOC** (macOS) |
|
||||
|
||||
### Editor compatibility list
|
||||
|
||||
| Works | Doesn’t work |
|
||||
| ----- | -------------- |
|
||||
| **Abricotine** | **Arduino IDE** |
|
||||
| **Android Studio** (2.3+, [instructions](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) | **Adobe Dreamweaver** |
|
||||
| **Anjuta** (unless at the EOF) | **Delphi IDE** |
|
||||
| **AppCode** (2016.2+, [instructions](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) | **Eclipse** (Windows, [vote here](https://bugs.eclipse.org/bugs/show_bug.cgi?id=398656)) |
|
||||
| **Atom** 1.1 or newer ([instructions](https://github.com/tonsky/FiraCode/wiki/Atom-instructions)) | Standalone **Emacs** ([workaround](https://github.com/tonsky/FiraCode/wiki/Emacs-instructions)) |
|
||||
| **BBEdit/TextWrangler** (v. 11 only, [instructions](https://github.com/tonsky/FiraCode/wiki/BBEdit-instructions)) | **Geany** (Windows) |
|
||||
| **Brackets** (with [this plugin](https://github.com/polo2ro/firacode-in-brackets)) | **gVim** (Windows [workaround](https://github.com/tonsky/FiraCode/issues/462)) |
|
||||
| **Chocolat** | **IDLE** |
|
||||
| **CLion** (2016.2+, [instructions](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) | **KDevelop 4** |
|
||||
| **Cloud9** ([instructions](https://github.com/tonsky/FiraCode/wiki/Cloud9-Instructions)) | **MATLAB** |
|
||||
| **Coda 2** | **Monkey Studio IDE** |
|
||||
| **CodeLite** | **UltraEdit** |
|
||||
| **Eclipse** (macOS 4.7+, Linux) | |
|
||||
| **elementary Code** | |
|
||||
| **Geany** (macOS) |
|
||||
| **gEdit / Pluma** |
|
||||
| **GNOME Builder** |
|
||||
| **GoormIDE** ([instructions](https://github.com/tonsky/FiraCode/wiki/GoormIDE-Instructions)) |
|
||||
| **IntelliJ IDEA** (2016.2+, [instructions](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) |
|
||||
| **Kate, KWrite** |
|
||||
| **KDevelop 5+** |
|
||||
| **Komodo** |
|
||||
| **Leafpad** |
|
||||
| **LibreOffice** |
|
||||
| **LightTable** ([instructions](https://github.com/tonsky/FiraCode/wiki/LightTable-instructions)) |
|
||||
| **LINQPad** |
|
||||
| **MacVim** 7.4 or newer ([instructions](https://github.com/tonsky/FiraCode/wiki/MacVim-instructions)) |
|
||||
| **Mancy** |
|
||||
| **Meld** |
|
||||
| **Mousepad** |
|
||||
| **NeoVim-gtk** |
|
||||
| **NetBeans** |
|
||||
| **Notepad** (Windows) |
|
||||
| **Notepad++** (with a [workaround](https://github.com/notepad-plus-plus/notepad-plus-plus/issues/2287#issuecomment-256638098)) |
|
||||
| **Notepad3** ([instructions](https://github.com/rizonesoft/Notepad3/issues/361#issuecomment-365977420))|
|
||||
| **PhpStorm** (2016.2+, [instructions](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) |
|
||||
| **PyCharm** (2016.2+, [instructions](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) |
|
||||
| **QtCreator** |
|
||||
| **Rider** |
|
||||
| **RStudio** ([instructions](https://github.com/tonsky/FiraCode/wiki/RStudio-instructions)) |
|
||||
| **RubyMine** (2016.2+, [instructions](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) |
|
||||
| **Scratch** |
|
||||
| **Scribus** (1.5.3+) |
|
||||
| **SublimeText** (3146+) |
|
||||
| **Spyder IDE** (only with Qt5) |
|
||||
| **SuperCollider 3** |
|
||||
| **TextAdept** (Linux, macOS) |
|
||||
| **TextEdit** |
|
||||
| **TextMate 2** |
|
||||
| **VimR** ([instructions](https://github.com/qvacua/vimr/wiki#ligatures)) |
|
||||
| **Visual Studio** (2015+, [instructions](https://github.com/tonsky/FiraCode/wiki/Visual-Studio-Instructions)) |
|
||||
| **Visual Studio Code** ([instructions](https://github.com/tonsky/FiraCode/wiki/VS-Code-Instructions)) |
|
||||
| **WebStorm** (2016.2+, [instructions](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) |
|
||||
| **Xamarin Studio/Monodevelop** |
|
||||
| **Xcode** (8.0+, otherwise [with plugin](https://github.com/robertvojta/LigatureXcodePlugin)) |
|
||||
| **Xi** |
|
||||
| Probably work: **Smultron, Vico** | Under question: **Code::Blocks IDE** |
|
||||
|
||||
### Browser support
|
||||
|
||||
```html
|
||||
<!-- HTML -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/tonsky/FiraCode@3/distr/fira_code.css">
|
||||
```
|
||||
|
||||
```css
|
||||
/* CSS */
|
||||
@import url(https://cdn.jsdelivr.net/gh/tonsky/FiraCode@3/distr/fira_code.css);
|
||||
```
|
||||
|
||||
```css
|
||||
/* Specify in CSS */
|
||||
code { font-family: 'Fira Code', monospace; }
|
||||
|
||||
@supports (font-variation-settings: normal) {
|
||||
code { font-family: 'Fira Code VF', monospace; }
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
- IE 10+, Edge Legacy: enable with `font-feature-settings: "calt";`
|
||||
- Firefox
|
||||
- Safari
|
||||
- Chromium-based browsers (Chrome, Opera)
|
||||
- ACE
|
||||
- CodeMirror (enable with `font-variant-ligatures: contextual;`)
|
||||
|
||||
### Projects using Fira Code
|
||||
|
||||
- All [JetBrains products](https://www.jetbrains.com/)
|
||||
- [CodePen](https://codepen.io/)
|
||||
- [Blink Shell](http://www.blink.sh/)
|
||||
- [Klipse](http://app.klipse.tech/)
|
||||
- [IlyaBirman.net](http://ilyabirman.net/)
|
||||
- [EvilMartians.com](https://evilmartians.com/)
|
||||
- [Web Maker](https://webmakerapp.com/)
|
||||
- [FromScratch](https://fromscratch.rocks/)
|
||||
- [PEP20.org](https://pep20.org/)
|
||||
|
||||
### Alternatives
|
||||
|
||||
Other free monospaced fonts with ligatures:
|
||||
|
||||
- [Hasklig](https://github.com/i-tu/Hasklig)
|
||||
- [Monoid](http://larsenwork.com/monoid/)
|
||||
- [Fixedsys Excelsior](https://github.com/kika/fixedsys)
|
||||
- [Iosevka](https://be5invis.github.io/Iosevka/)
|
||||
- [DejaVu Sans Code](https://github.com/SSNikolaevich/DejaVuSansCode)
|
||||
- [Victor Mono](https://rubjo.github.io/victor-mono/)
|
||||
- [Cascadia Code](https://github.com/microsoft/cascadia-code)
|
||||
- [JetBrains Mono](https://github.com/JetBrains/JetBrainsMono)
|
||||
|
||||
Paid monospaced fonts with ligatures:
|
||||
|
||||
- [PragmataPro](http://www.fsd.it/fonts/pragmatapro.htm)
|
||||
- [Mono Lisa](https://monolisa.dev/)
|
||||
|
||||
### Building Fira Code locally
|
||||
|
||||
In case you want to alter FiraCode.glyphs and build OTF/TTF/WOFF files yourself, this is setup I use on macOS:
|
||||
|
||||
```bash
|
||||
# install all required build tools
|
||||
./script/bootstrap
|
||||
|
||||
# build the font files
|
||||
./script/build
|
||||
|
||||
# install OTFs to ~/Library/Fonts
|
||||
./script/install
|
||||
```
|
||||
|
||||
### Credits
|
||||
|
||||
- Author: Nikita Prokopov [@nikitonsky](https://twitter.com/nikitonsky)
|
||||
- Based on: [Fira Mono](https://github.com/mozilla/Fira)
|
||||
- Inspired by: [Hasklig](https://github.com/i-tu/Hasklig)
|
@ -1,265 +0,0 @@
|
||||
(ns fira-code.calt
|
||||
(:require
|
||||
[clojure.string :as str]
|
||||
[fira-code.coll :as coll]
|
||||
[fira-code.glyphs :as glyphs]
|
||||
[fira-code.time :as time]
|
||||
[flatland.ordered.map :refer [ordered-map]]))
|
||||
|
||||
|
||||
;; No ligature should follow those sequences
|
||||
(def ignore-prefixes
|
||||
[["parenleft" "question" "colon"]
|
||||
;; #578 #624 Regexp lookahead/lookbehind
|
||||
["parenleft" "question" "equal"]
|
||||
["parenleft" "question" "less" "equal"]
|
||||
["parenleft" "question" "exclam"]
|
||||
["parenleft" "question" "less" "exclam"]
|
||||
;; #850 PHP <?=
|
||||
["less" "question" "equal"]
|
||||
])
|
||||
|
||||
|
||||
(defn gen-ignore-prefixes [liga]
|
||||
(str/join
|
||||
(for [prefix ignore-prefixes
|
||||
;; try to match last N glyphs in `prefix` with N first in `liga`
|
||||
N (range (count liga) 0 -1)
|
||||
:when (= (take-last N prefix) (take N liga))]
|
||||
(str " ignore sub"
|
||||
" " (str/join " " (drop-last N prefix))
|
||||
" " (first liga) "'"
|
||||
" " (str/join " " (drop 1 liga))
|
||||
";\n"))))
|
||||
|
||||
|
||||
(def ignores
|
||||
{ ["slash" "asterisk"]
|
||||
(str
|
||||
" ignore sub slash' asterisk slash;\n"
|
||||
" ignore sub asterisk slash' asterisk;\n")
|
||||
|
||||
["asterisk" "slash"]
|
||||
(str
|
||||
" ignore sub slash asterisk' slash;\n"
|
||||
" ignore sub asterisk' slash asterisk;\n")
|
||||
|
||||
["asterisk" "asterisk"]
|
||||
(str
|
||||
" ignore sub slash asterisk' asterisk;\n"
|
||||
" ignore sub asterisk' asterisk slash;\n")
|
||||
|
||||
["asterisk" "asterisk" "asterisk"]
|
||||
(str
|
||||
" ignore sub slash asterisk' asterisk asterisk;\n"
|
||||
" ignore sub asterisk' asterisk asterisk slash;\n")
|
||||
|
||||
;; #621 <||>
|
||||
["less" "bar" "bar"]
|
||||
" ignore sub less' bar bar greater;\n"
|
||||
|
||||
["bar" "bar" "greater"]
|
||||
" ignore sub less bar' bar greater;\n"
|
||||
|
||||
;; #574 :>=
|
||||
["colon" "greater"]
|
||||
" ignore sub colon' greater equal;\n"
|
||||
|
||||
;; #548 >=<
|
||||
["greater" "equal"]
|
||||
" ignore sub greater' equal less;\n"
|
||||
|
||||
["equal" "less"]
|
||||
" ignore sub greater equal' less;\n"
|
||||
|
||||
;; #593 {|}
|
||||
["braceleft" "bar"]
|
||||
" ignore sub braceleft' bar braceright;\n"
|
||||
|
||||
["bar" "braceright"]
|
||||
" ignore sub braceleft bar' braceright;\n"
|
||||
|
||||
;; #593 [|]
|
||||
["bracketleft" "bar"]
|
||||
" ignore sub bracketleft' bar bracketright;\n"
|
||||
|
||||
["bar" "bracketright"]
|
||||
" ignore sub bracketleft bar' bracketright;\n"
|
||||
|
||||
;; #410 <*>> <+>> <$>>
|
||||
["greater" "greater"]
|
||||
(str " ignore sub asterisk greater' greater;\n"
|
||||
" ignore sub plus greater' greater;\n"
|
||||
" ignore sub dollar greater' greater;\n")
|
||||
|
||||
;; #410 <*>>> <+>>> <$>>>
|
||||
["greater" "greater" "greater"]
|
||||
(str " ignore sub asterisk greater' greater greater;\n"
|
||||
" ignore sub plus greater' greater greater;\n"
|
||||
" ignore sub dollar greater' greater greater;\n")
|
||||
|
||||
;; #410 <<*> <<+> <<$>
|
||||
["less" "less"]
|
||||
(str " ignore sub less' less asterisk;\n"
|
||||
" ignore sub less' less plus;\n"
|
||||
" ignore sub less' less dollar;\n")
|
||||
|
||||
;; #410 <<<*> <<<+> <<<$>
|
||||
["less" "less" "less"]
|
||||
(str " ignore sub less' less less asterisk;\n"
|
||||
" ignore sub less' less less plus;\n"
|
||||
" ignore sub less' less less dollar;\n")
|
||||
|
||||
;; #713 |-|
|
||||
["bar" "hyphen"]
|
||||
" ignore sub bar' hyphen bar;\n"
|
||||
|
||||
["hyphen" "bar"]
|
||||
" ignore sub bar hyphen' bar;\n"
|
||||
|
||||
;; #968 [-> [--> [==> [=>
|
||||
["equal" "greater"]
|
||||
" ignore sub bracketleft equal' greater;\n"
|
||||
|
||||
["equal" "equal" "greater"]
|
||||
" ignore sub bracketleft equal' equal greater;\n"
|
||||
|
||||
["equal" "equal"]
|
||||
" ignore sub bracketleft equal' equal;\n"
|
||||
|
||||
["equal" "equal" "equal"]
|
||||
" ignore sub bracketleft equal' equal equal;\n"
|
||||
|
||||
["hyphen" "greater"]
|
||||
" ignore sub bracketleft hyphen' greater;\n"
|
||||
|
||||
["hyphen" "hyphen" "greater"]
|
||||
" ignore sub bracketleft hyphen' hyphen greater;\n"
|
||||
|
||||
["hyphen" "hyphen"]
|
||||
" ignore sub bracketleft hyphen' hyphen;\n"
|
||||
|
||||
["hyphen" "hyphen" "hyphen"]
|
||||
" ignore sub bracketleft hyphen' hyphen hyphen;\n"
|
||||
})
|
||||
|
||||
|
||||
;; DO NOT generate ignores at all
|
||||
(def skip-ignores? #{
|
||||
;; #410 <<*>> <<+>> <<$>>
|
||||
["less" "asterisk" "greater"]
|
||||
["less" "plus" "greater"]
|
||||
["less" "dollar" "greater"]
|
||||
;; #795
|
||||
["f" "l"] ["F" "l"] ["T" "l"]
|
||||
})
|
||||
|
||||
|
||||
;; DO NOT generate ligature
|
||||
(def manual? #{
|
||||
;; /\ \/
|
||||
["slash" "backslash"]
|
||||
["backslash" "slash"]
|
||||
})
|
||||
|
||||
|
||||
(defn liga->rule
|
||||
"[f f i] => { [LIG LIG i] f_f_i.liga
|
||||
[LIG f i] LIG
|
||||
[ f f i] LIG }"
|
||||
[liga]
|
||||
(case (count liga)
|
||||
2 (let [[a b] liga]
|
||||
(str/replace
|
||||
(str
|
||||
"lookup 1_2 {\n"
|
||||
(when-not (skip-ignores? liga)
|
||||
(str " ignore sub 1 1' 2;\n"
|
||||
" ignore sub 1' 2 2;\n"))
|
||||
(gen-ignore-prefixes liga)
|
||||
(get ignores liga)
|
||||
" sub 1.spacer 2' by 1_2.liga;\n"
|
||||
" sub 1' 2 by 1.spacer;\n"
|
||||
; "sub 1 2 by 1_2.liga;"
|
||||
"} 1_2;")
|
||||
#"\d" {"1" a "2" b}))
|
||||
3 (let [[a b c] liga]
|
||||
(str/replace
|
||||
(str
|
||||
"lookup 1_2_3 {\n"
|
||||
(when-not (skip-ignores? liga)
|
||||
(str " ignore sub 1 1' 2 3;\n"
|
||||
" ignore sub 1' 2 3 3;\n"))
|
||||
(gen-ignore-prefixes liga)
|
||||
(get ignores liga)
|
||||
" sub 1.spacer 2.spacer 3' by 1_2_3.liga;\n"
|
||||
" sub 1.spacer 2' 3 by 2.spacer;\n"
|
||||
" sub 1' 2 3 by 1.spacer;\n"
|
||||
; "sub 1 2 3 by 1_2_3.liga;"
|
||||
"} 1_2_3;")
|
||||
#"\d" {"1" a "2" b "3" c}))
|
||||
4 (let [[a b c d] liga]
|
||||
(str/replace
|
||||
(str
|
||||
"lookup 1_2_3_4 {\n"
|
||||
(when-not (skip-ignores? liga)
|
||||
(str " ignore sub 1 1' 2 3 4;\n"
|
||||
" ignore sub 1' 2 3 4 4;\n"))
|
||||
(gen-ignore-prefixes liga)
|
||||
(get ignores liga)
|
||||
" sub 1.spacer 2.spacer 3.spacer 4' by 1_2_3_4.liga;\n"
|
||||
" sub 1.spacer 2.spacer 3' 4 by 3.spacer;\n"
|
||||
" sub 1.spacer 2' 3 4 by 2.spacer;\n"
|
||||
" sub 1' 2 3 4 by 1.spacer;\n"
|
||||
; "sub 1 2 3 4 by 1_2_3_4.liga;"
|
||||
"} 1_2_3_4;")
|
||||
#"\d" {"1" a "2" b "3" c "4" d}))
|
||||
5 (let [[a b c d e] liga]
|
||||
(str/replace
|
||||
(str
|
||||
"lookup 1_2_3_4_5 {\n"
|
||||
(when-not (skip-ignores? liga)
|
||||
(str " ignore sub 1 1' 2 3 4 5;\n"
|
||||
" ignore sub 1' 2 3 4 4 5;\n"))
|
||||
(gen-ignore-prefixes liga)
|
||||
(get ignores liga)
|
||||
" sub 1.spacer 2.spacer 3.spacer 4.spacer 5' by 1_2_3_4_5.liga;\n"
|
||||
" sub 1.spacer 2.spacer 3.spacer 4' 5 by 4.spacer;\n"
|
||||
" sub 1.spacer 2.spacer 3' 4 5 by 3.spacer;\n"
|
||||
" sub 1.spacer 2' 3 4 5 by 2.spacer;\n"
|
||||
" sub 1' 2 3 4 5 by 1.spacer;\n"
|
||||
; "sub 1 2 3 4 5 by 1_2_3_4_5.liga;"
|
||||
"} 1_2_3_4_5;")
|
||||
#"\d" {"1" a "2" b "3" c "4" d "5" e}))
|
||||
))
|
||||
|
||||
|
||||
(defn compare-ligas [l1 l2]
|
||||
(cond
|
||||
(> (count l1) (count l2)) -1
|
||||
(< (count l1) (count l2)) 1
|
||||
:else (compare l1 l2)))
|
||||
|
||||
|
||||
(defn replace-calt [font ligas]
|
||||
(let [ligas' (->> ligas
|
||||
(remove manual?)
|
||||
(sort compare-ligas))
|
||||
calt (->> ligas'
|
||||
(map liga->rule)
|
||||
(str/join "\n\n"))
|
||||
glyphs (map #(str (str/join "_" %) ".liga") ligas')
|
||||
counts (coll/group-by-to count count ligas')]
|
||||
|
||||
(println " generated calt:"
|
||||
; (str/join " " glyphs)
|
||||
(str
|
||||
#_"(" (get counts 2) " pairs, "
|
||||
(get counts 3) " triples, "
|
||||
(get counts 4) " quadruples, "
|
||||
(count ligas') " total" #_")"))
|
||||
|
||||
(glyphs/update-code font :features "calt"
|
||||
#(str/replace %
|
||||
#"### start of generated calt\n[^#]+\n### end of generated calt\n"
|
||||
(str "### start of generated calt\n" calt "\n### end of generated calt\n")))))
|
@ -1,26 +0,0 @@
|
||||
(ns fira-code.checks
|
||||
(:require
|
||||
[clojure.string :as str]
|
||||
[fira-code.coll :as coll]
|
||||
[fira-code.glyphs :as glyphs]))
|
||||
|
||||
|
||||
(defn width-ok? [w]
|
||||
(#{"0" 0 1200 2400} w))
|
||||
|
||||
|
||||
(defn widths [font]
|
||||
(doseq [g (:glyphs font)
|
||||
:when (not= "0" (:export g))
|
||||
l (:layers g)
|
||||
:let [w (:width l)]
|
||||
:when (not (width-ok? w))]
|
||||
(println (str "WARN glyph '" (:glyphname g) "' layer '" (:id (glyphs/layer l)) "' has width=" (pr-str w))))
|
||||
font)
|
||||
|
||||
|
||||
(defn -main [& args]
|
||||
(let [path (or (first args) "FiraCode.glyphs")
|
||||
font (glyphs/load path)]
|
||||
(widths font)))
|
||||
|
@ -1,15 +0,0 @@
|
||||
(ns fira-code.coll)
|
||||
|
||||
|
||||
(defn index-of [pred xs]
|
||||
(let [res (reduce (fn [i x] (if (pred x) (reduced i) (inc i))) 0 xs)]
|
||||
(assert (< res (count xs)) "Nothing found")
|
||||
res))
|
||||
|
||||
|
||||
(defn group-by-to [key-fn value-fn xs]
|
||||
(reduce-kv
|
||||
(fn [m k vs]
|
||||
(assoc m k (value-fn vs)))
|
||||
{}
|
||||
(group-by key-fn xs)))
|
@ -1,192 +0,0 @@
|
||||
(ns fira-code.glyphs
|
||||
(:refer-clojure :exclude [load])
|
||||
(:require
|
||||
[clojure.java.io :as io]
|
||||
[clojure.string :as str]
|
||||
[fipp.edn :as fipp]
|
||||
[fira-code.coll :as coll]
|
||||
[flatland.ordered.map :refer [ordered-map]]))
|
||||
|
||||
(def ^:dynamic *str)
|
||||
(def ^:dynamic *pos)
|
||||
|
||||
(defn current-char [] (nth @*str @*pos))
|
||||
|
||||
(defn advance! [] (swap! *pos inc))
|
||||
|
||||
(declare parse-anything!)
|
||||
|
||||
(defn skip-ws! []
|
||||
(loop []
|
||||
(case (current-char)
|
||||
\space (do (advance!) (recur))
|
||||
\newline (do (advance!) (recur))
|
||||
nil)))
|
||||
|
||||
(defn parse-escaped-string! []
|
||||
(skip-ws!)
|
||||
(when (= \" (current-char))
|
||||
(let [sb (StringBuilder.)]
|
||||
(->
|
||||
(loop []
|
||||
(advance!)
|
||||
(let [ch (current-char)]
|
||||
(cond
|
||||
(= ch \\) (do (.append sb \\) (advance!) (.append sb (current-char)) (recur))
|
||||
(= ch \") (do (advance!) (str sb))
|
||||
:else (do (.append sb ch) (recur)))))
|
||||
(str/replace "\\012" "\n")
|
||||
(str/replace "\\\"" "\"")
|
||||
(str/replace "\\\\" "\\")))))
|
||||
|
||||
(defn parse-string! []
|
||||
(skip-ws!)
|
||||
(let [sb (StringBuilder.)]
|
||||
(loop []
|
||||
(let [ch (current-char)]
|
||||
(cond
|
||||
(#{\space \newline \{ \} \( \) \; \, \" \=} ch) sb
|
||||
:else (do (.append sb ch) (advance!) (recur)))))
|
||||
(let [res (str sb)]
|
||||
(cond
|
||||
(re-matches #"-?[1-9][0-9]*" res) (Integer/parseInt res)
|
||||
(re-matches #"-?[0-9]+\.[0-9]+" res) (Double/parseDouble res)
|
||||
(re-matches #"[a-zA-Z][a-zA-Z\.0-9]*" res) (keyword res)
|
||||
:else res))))
|
||||
|
||||
(defn expect [c]
|
||||
(assert (= c (current-char))
|
||||
(str "Expected '" c
|
||||
"', found " (current-char)
|
||||
" at " @*pos
|
||||
" around here:\n" (subs @*str (max 0 (- @*pos 100)) (min (count @*str) (+ @*pos 100))))))
|
||||
|
||||
(defn parse-map! []
|
||||
(skip-ws!)
|
||||
(when (= \{ (current-char))
|
||||
(advance!)
|
||||
(loop [m (ordered-map)]
|
||||
(skip-ws!)
|
||||
(if (= \} (current-char))
|
||||
(do (advance!) m)
|
||||
(let [k (or (parse-escaped-string!) (parse-string!))
|
||||
_ (do (skip-ws!) (expect \=) (advance!))
|
||||
v (parse-anything!)
|
||||
v (if (keyword? v) (name v) v)
|
||||
_ (do (skip-ws!) (expect \;) (advance!))]
|
||||
(recur (assoc m k v)))))))
|
||||
|
||||
(defn parse-list! []
|
||||
(skip-ws!)
|
||||
(when (= \( (current-char))
|
||||
(advance!)
|
||||
(loop [l []]
|
||||
(skip-ws!)
|
||||
(if (= \) (current-char))
|
||||
(do (advance!) l)
|
||||
(let [v (parse-anything!)
|
||||
_ (skip-ws!)
|
||||
_ (when (not= \) (current-char))
|
||||
(expect \,)
|
||||
(advance!))]
|
||||
(recur (conj l v)))))))
|
||||
|
||||
(defn parse-anything! []
|
||||
(skip-ws!)
|
||||
(or
|
||||
(parse-map!)
|
||||
(parse-list!)
|
||||
(parse-escaped-string!)
|
||||
(parse-string!)))
|
||||
|
||||
(defn parse [s]
|
||||
(binding [*str (atom s)
|
||||
*pos (atom 0)]
|
||||
(parse-anything!)))
|
||||
|
||||
(def escapes {"\n" "\\012"
|
||||
"\"" "\\\""
|
||||
"\\" "\\\\"})
|
||||
|
||||
(def escape-re #"[\n\"\\]")
|
||||
|
||||
(defn- serialize-impl [form]
|
||||
(cond
|
||||
(string? form) (if (re-matches #"[a-zA-Z0-9._/]+" form)
|
||||
form
|
||||
(str \" (str/replace form escape-re escapes) \"))
|
||||
(keyword? form) (name form)
|
||||
(number? form) (str form)
|
||||
(instance? clojure.lang.MapEntry form)
|
||||
(str
|
||||
(serialize-impl (key form))
|
||||
" = "
|
||||
(if (= ".appVersion" (key form)) ;; https://github.com/googlefonts/glyphsLib/issues/209
|
||||
(str \" (val form) \")
|
||||
(serialize-impl (val form)))
|
||||
";")
|
||||
(sequential? form) (if (empty? form)
|
||||
"(\n)"
|
||||
(str "(\n" (str/join ",\n" (map serialize-impl form)) "\n)"))
|
||||
(map? form) (if (empty? form)
|
||||
"{\n}"
|
||||
(str "{\n" (str/join "\n" (map serialize-impl form)) "\n}"))))
|
||||
|
||||
(defn serialize [font]
|
||||
(str (serialize-impl font) "\n"))
|
||||
|
||||
; (-> (slurp "FiraCode.glyphs") parse serialize (->> (spit "FiraCode_saved.glyphs")))
|
||||
|
||||
(defn load [path]
|
||||
(println (str "Parsing '" path "'..."))
|
||||
(parse (slurp path)))
|
||||
|
||||
(defn save! [path font]
|
||||
(println (str "Saving '" path "'..."))
|
||||
(spit path (serialize font)))
|
||||
|
||||
(defn -main [& args]
|
||||
(let [font (-> (slurp "FiraCode.glyphs") parse)]
|
||||
(with-open [os (io/writer "clojure/FiraCode.edn")]
|
||||
(binding [*out* os]
|
||||
(fipp/pprint font {:width 200})))))
|
||||
|
||||
|
||||
(defn update-code [font key name f & args]
|
||||
(let [idx (coll/index-of #(= (:name %) name) (get font key))]
|
||||
(apply update-in font [key idx :code] f args)))
|
||||
|
||||
|
||||
(def weights
|
||||
{:Light "B67F0F2D-EC95-4CB8-966E-23AE86958A69"
|
||||
:Regular "UUID0"
|
||||
:Bold "4B7A3BAF-EAD8-4024-9BEA-BB1DE86CFCFA"})
|
||||
|
||||
|
||||
(defn layer [l]
|
||||
{ :id (condp = (:layerId l)
|
||||
(:Light weights) "Light"
|
||||
(:Regular weights) "Regular"
|
||||
(:Bold weights) "Bold"
|
||||
(:layerId l))
|
||||
:width (:width l) })
|
||||
|
||||
(defn save-not600 []
|
||||
(let [font (-> (slurp "FiraCode.glyphs") parse)]
|
||||
(with-open [os (io/writer "clojure/FiraCode_not600.edn")]
|
||||
(binding [*out* os]
|
||||
(let [glyphs (for [glyph (:glyphs font)
|
||||
:when (->> (:layers glyph)
|
||||
(filter #(contains? (set (vals weights)) (:layerId %)))
|
||||
(every? #(= 600 (:width %)))
|
||||
(not))]
|
||||
{:glyphname (:glyphname glyph)
|
||||
:layers (mapv layer (:layers glyph))})]
|
||||
(doseq [glyph glyphs]
|
||||
(fipp/pprint glyph {:width 200}))
|
||||
(count glyphs))))))
|
||||
|
||||
;; (-main)
|
||||
;; (save-not600)
|
||||
;; (-> (slurp "FiraCode.glyphs") parse keys)
|
||||
;;
|
@ -1,29 +0,0 @@
|
||||
(ns fira-code.main
|
||||
(:require
|
||||
[clojure.string :as str]
|
||||
[fira-code.calt :as calt]
|
||||
[fira-code.coll :as coll]
|
||||
[fira-code.checks :as checks]
|
||||
[fira-code.glyphs :as glyphs]
|
||||
[fira-code.not-space :as not-space]
|
||||
[fira-code.spacers :as spacers]
|
||||
[fira-code.time :as time]
|
||||
[flatland.ordered.map :refer [ordered-map]]))
|
||||
|
||||
|
||||
(defn -main [& args]
|
||||
(let [path (or (first args) "FiraCode.glyphs")
|
||||
font (glyphs/load path)
|
||||
ligas (for [g (:glyphs font)
|
||||
:let [name (:glyphname g)]
|
||||
:when (str/ends-with? name ".liga")
|
||||
:when (not= "0" (:export g))
|
||||
:let [[_ liga] (re-matches #"([A-Za-z_]+)\.liga" name)]]
|
||||
(str/split liga #"_")) ;; [ ["dash" "greater" "greater"] ... ]
|
||||
font' (-> font
|
||||
(calt/replace-calt ligas)
|
||||
(spacers/add-spacers ligas)
|
||||
(not-space/regen-not-space)
|
||||
(checks/widths))]
|
||||
(glyphs/save! path font')
|
||||
(println)))
|
@ -1,14 +0,0 @@
|
||||
(ns fira-code.not-space
|
||||
(:require
|
||||
[clojure.string :as str]
|
||||
[fira-code.glyphs :as glyphs]))
|
||||
|
||||
|
||||
(defn regen-not-space [font]
|
||||
(let [not-spaces (->> (:glyphs font)
|
||||
(remove #(re-find #"^\.|space$|space\." (:glyphname %)))
|
||||
(remove #(= "0" (:export %)))
|
||||
(map :glyphname)
|
||||
(sort))]
|
||||
(println " regenerated NotSpace:" (count not-spaces) "glyphs")
|
||||
(glyphs/update-code font :classes "NotSpace" (constantly (str/join " " not-spaces)))))
|
@ -1,31 +0,0 @@
|
||||
(ns fira-code.spacers
|
||||
(:require
|
||||
[clojure.string :as str]
|
||||
[fira-code.glyphs :as glyphs]
|
||||
[fira-code.time :as time]
|
||||
[flatland.ordered.map :refer [ordered-map]]))
|
||||
|
||||
|
||||
(defn spacer [name]
|
||||
(ordered-map
|
||||
:color 3,
|
||||
:glyphname name,
|
||||
:lastChange (time/now-str),
|
||||
:layers
|
||||
[(ordered-map :layerId (:Light glyphs/weights), :width 1200)
|
||||
(ordered-map :layerId (:Bold glyphs/weights), :width 1200)]))
|
||||
|
||||
|
||||
(defn add-spacers [font ligas]
|
||||
(let [needed (->> (into #{} cat ligas)
|
||||
(map #(str % ".spacer")))
|
||||
existing (->> (:glyphs font)
|
||||
(map :glyphname)
|
||||
(filter #(str/ends-with? % ".spacer")))
|
||||
new (->> (remove (set existing) needed)
|
||||
(sort-by str/lower-case))]
|
||||
(if-not (empty? new)
|
||||
(do
|
||||
(println " added glyphs: " (str/join " " new))
|
||||
(update font :glyphs #(into % (map spacer new))))
|
||||
font)))
|
@ -1,13 +0,0 @@
|
||||
(ns fira-code.time
|
||||
(:import
|
||||
[java.time LocalDateTime ZoneId]
|
||||
[java.time.format DateTimeFormatter]))
|
||||
|
||||
|
||||
(def ^ZoneId UTC (ZoneId/of "UTC"))
|
||||
|
||||
|
||||
(defn now-str []
|
||||
(.format
|
||||
(DateTimeFormatter/ofPattern "yyyy-MM-dd HH:mm:ss +0000")
|
||||
(LocalDateTime/now UTC)))
|
@ -1,4 +0,0 @@
|
||||
{:paths ["clojure"]
|
||||
:deps {org.clojure/clojure {:mvn/version "1.10.1"}
|
||||
org.flatland/ordered {:mvn/version "1.5.7"}
|
||||
fipp/fipp {:mvn/version "0.6.18"}}}
|
@ -1,566 +0,0 @@
|
||||
Installing
|
||||
==========
|
||||
|
||||
Windows
|
||||
-------
|
||||
|
||||
In the ttf folder, double-click each font file, click “Install font”; to install all at once, select all files, right-click, and choose “Install”
|
||||
|
||||
OR
|
||||
|
||||
Use https://chocolatey.org:
|
||||
|
||||
choco install firacode
|
||||
|
||||
|
||||
macOS
|
||||
-----
|
||||
|
||||
In the downloaded TTF folder:
|
||||
|
||||
1. Select all font files
|
||||
2. Right click and select `Open` (alternatively `Open With Font Book`)
|
||||
3. Select "Install Font"
|
||||
|
||||
OR
|
||||
|
||||
Use http://brew.sh:
|
||||
|
||||
`brew tap homebrew/cask-fonts`
|
||||
`brew cask install font-fira-code`
|
||||
|
||||
|
||||
Ubuntu Zesty (17.04), Debian Stretch (9) or newer
|
||||
-------------------------------------------------
|
||||
|
||||
1. Make sure that the `universe` (for Ubuntu) or `contrib` (for Debian) repository is enabled (see https://askubuntu.com/questions/148638/how-do-i-enable-the-universe-repository or https://wiki.debian.org/SourcesList#Component)
|
||||
2. Install `fonts-firacode` package either by executing `sudo apt install fonts-firacode` in the terminal or via GUI tool (like “Software Center”)
|
||||
|
||||
|
||||
Arch Linux
|
||||
----------
|
||||
|
||||
Fira Code package is available in the official repository: https://www.archlinux.org/packages/community/any/otf-fira-code/.
|
||||
|
||||
Variant of Fira Code package is available in the AUR: https://aur.archlinux.org/packages/otf-fira-code-git/.
|
||||
|
||||
|
||||
Gentoo
|
||||
------
|
||||
|
||||
emerge -av media-fonts/fira-code
|
||||
|
||||
|
||||
Fedora
|
||||
------
|
||||
|
||||
A Fedora copr repository is available: https://copr.fedorainfracloud.org/coprs/evana/fira-code-fonts/. Package sources https://gitlab.com/evana11/fira-code-fonts-fedora.
|
||||
|
||||
To install, perform the following commands:
|
||||
|
||||
dnf copr enable evana/fira-code-fonts
|
||||
dnf install fira-code-fonts
|
||||
|
||||
|
||||
Solus
|
||||
-----
|
||||
|
||||
Fira Code package is available in the official repository: `font-firacode-ttf` and `font-firacode-otf`.
|
||||
They can be installed by running:
|
||||
|
||||
sudo eopkg install font-firacode-ttf font-firacode-otf
|
||||
|
||||
|
||||
Void linux
|
||||
----------
|
||||
|
||||
xbps-install font-firacode
|
||||
|
||||
|
||||
Linux Manual Installation
|
||||
-------------------------
|
||||
|
||||
With most desktop-oriented distributions, double-clicking each font file in the ttf folder and selecting “Install font” should be enough. If it isn’t, create and run `download_and_install.sh` script:
|
||||
|
||||
#!/usr/bin/env bash
|
||||
|
||||
fonts_dir="${HOME}/.local/share/fonts"
|
||||
if [ ! -d "${fonts_dir}" ]; then
|
||||
echo "mkdir -p $fonts_dir"
|
||||
mkdir -p "${fonts_dir}"
|
||||
else
|
||||
echo "Found fonts dir $fonts_dir"
|
||||
fi
|
||||
|
||||
for type in Bold Light Medium Regular Retina; do
|
||||
file_path="${HOME}/.local/share/fonts/FiraCode-${type}.ttf"
|
||||
file_url="https://github.com/tonsky/FiraCode/blob/master/distr/ttf/FiraCode-${type}.ttf?raw=true"
|
||||
if [ ! -e "${file_path}" ]; then
|
||||
echo "wget -O $file_path $file_url"
|
||||
wget -O "${file_path}" "${file_url}"
|
||||
else
|
||||
echo "Found existing file $file_path"
|
||||
fi;
|
||||
done
|
||||
|
||||
echo "fc-cache -f"
|
||||
fc-cache -f
|
||||
|
||||
More details: https://github.com/tonsky/FiraCode/issues/4
|
||||
|
||||
|
||||
FreeBSD
|
||||
-------
|
||||
|
||||
Using pkg(8):
|
||||
|
||||
pkg install firacode
|
||||
|
||||
OR
|
||||
|
||||
Using ports:
|
||||
|
||||
cd /usr/ports/x11-fonts/firacode && make install clean
|
||||
|
||||
|
||||
Enabling ligatures
|
||||
==================
|
||||
|
||||
Atom
|
||||
----
|
||||
|
||||
To change your font to Fira Code, open Atom's preferences (`cmd + ,` on a Mac, `ctrl + ,` on PC), make sure the "Settings" tab is selected, or the "Editor" in Atom 1.10+, and scroll down to "Editor Settings". In the "Font Family" field, enter `Fira Code`.
|
||||
|
||||
If you wish to specify a font weight, for example, Light, use `Fira Code Light` as a font name (Windows) or `FiraCode-Light` (macOS).
|
||||
|
||||
Ligatures are enabled by default in Atom 1.9 and above.
|
||||
|
||||
|
||||
VS Code
|
||||
-------
|
||||
|
||||
To open the settings editor, first from the File menu choose Preferences, Settings or use keyboard shortcut `Ctrl + ,` (Windows) or `Cmd + ,` (macOS).
|
||||
|
||||
To enable FiraCode in the settings editor, under "Commonly Used", expand the "Text Editor" settings and then click on "Font". In the "Font Family" input box type `Fira Code`, replacing any content. Tick the check box "Enables/Disables font ligatures" under "Font Ligatures" to enable the special ligatures.
|
||||
|
||||
If you wish to specify a font weight, for example, Light, use `Fira Code Light` as a font name (Windows) or `FiraCode-Light` (macOS).
|
||||
|
||||
|
||||
IntelliJ products
|
||||
-----------------
|
||||
|
||||
1. Enable in Settings → Editor → Font → Enable Font Ligatures
|
||||
2. Select `Fira Code` as "Primary font" under Settings → Editor → Font
|
||||
|
||||
Additionally, if a Color Scheme is selected:
|
||||
|
||||
3. Enable in Settings → Editor → Color Scheme → Color Scheme Font → Enable Font Ligatures
|
||||
4. Select Fira Code as "Primary font" under Settings → Editor → Color Scheme → Color Scheme Font
|
||||
|
||||
|
||||
BBEdit, TextWrangler
|
||||
--------------------
|
||||
|
||||
Run in your terminal:
|
||||
|
||||
defaults write com.barebones.bbedit "EnableFontLigatures_Fira Code" -bool YES
|
||||
|
||||
Source: https://www.barebones.com/support/bbedit/ExpertPreferences.html
|
||||
|
||||
|
||||
Brackets
|
||||
--------
|
||||
|
||||
1. From the `View` menu choose `Themes....`
|
||||
2. Paste `'Fira Code'`, at the begining of `Font Family`
|
||||
|
||||
|
||||
Emacs
|
||||
-----
|
||||
|
||||
There are a few options when it comes down to using ligatures in
|
||||
Emacs. They are listed in order of preferred to less-preferred. Pick one!
|
||||
|
||||
1. Using composition mode in Emacs Mac port
|
||||
|
||||
If you're using the latest Mac port of Emacs (https://bitbucket.org/mituharu/emacs-mac by Mitsuharu Yamamoto) for macOS, you can use:
|
||||
|
||||
(mac-auto-operator-composition-mode)
|
||||
|
||||
This is generally the easiest solution, but can only be used on macOS.
|
||||
|
||||
2. Using prettify-symbols
|
||||
|
||||
These instructions are pieced together by https://github.com/Triavanicus, taking some pieces from https://github.com/minad/hasklig-mode.
|
||||
|
||||
This method requires you to install the Fira Code Symbol font, made by https://github.com/siegebell:
|
||||
https://github.com/tonsky/FiraCode/issues/211#issuecomment-239058632
|
||||
|
||||
(defun fira-code-mode--make-alist (list)
|
||||
"Generate prettify-symbols alist from LIST."
|
||||
(let ((idx -1))
|
||||
(mapcar
|
||||
(lambda (s)
|
||||
(setq idx (1+ idx))
|
||||
(let* ((code (+ #Xe100 idx))
|
||||
(width (string-width s))
|
||||
(prefix ())
|
||||
(suffix '(?\s (Br . Br)))
|
||||
(n 1))
|
||||
(while (< n width)
|
||||
(setq prefix (append prefix '(?\s (Br . Bl))))
|
||||
(setq n (1+ n)))
|
||||
(cons s (append prefix suffix (list (decode-char 'ucs code))))))
|
||||
list)))
|
||||
|
||||
(defconst fira-code-mode--ligatures
|
||||
'("www" "**" "***" "**/" "*>" "*/" "\\\\" "\\\\\\"
|
||||
"{-" "[]" "::" ":::" ":=" "!!" "!=" "!==" "-}"
|
||||
"--" "---" "-->" "->" "->>" "-<" "-<<" "-~"
|
||||
"#{" "#[" "##" "###" "####" "#(" "#?" "#_" "#_("
|
||||
".-" ".=" ".." "..<" "..." "?=" "??" ";;" "/*"
|
||||
"/**" "/=" "/==" "/>" "//" "///" "&&" "||" "||="
|
||||
"|=" "|>" "^=" "$>" "++" "+++" "+>" "=:=" "=="
|
||||
"===" "==>" "=>" "=>>" "<=" "=<<" "=/=" ">-" ">="
|
||||
">=>" ">>" ">>-" ">>=" ">>>" "<*" "<*>" "<|" "<|>"
|
||||
"<$" "<$>" "<!--" "<-" "<--" "<->" "<+" "<+>" "<="
|
||||
"<==" "<=>" "<=<" "<>" "<<" "<<-" "<<=" "<<<" "<~"
|
||||
"<~~" "</" "</>" "~@" "~-" "~=" "~>" "~~" "~~>" "%%"
|
||||
"x" ":" "+" "+" "*"))
|
||||
|
||||
(defvar fira-code-mode--old-prettify-alist)
|
||||
|
||||
(defun fira-code-mode--enable ()
|
||||
"Enable Fira Code ligatures in current buffer."
|
||||
(setq-local fira-code-mode--old-prettify-alist prettify-symbols-alist)
|
||||
(setq-local prettify-symbols-alist (append (fira-code-mode--make-alist fira-code-mode--ligatures) fira-code-mode--old-prettify-alist))
|
||||
(prettify-symbols-mode t))
|
||||
|
||||
(defun fira-code-mode--disable ()
|
||||
"Disable Fira Code ligatures in current buffer."
|
||||
(setq-local prettify-symbols-alist fira-code-mode--old-prettify-alist)
|
||||
(prettify-symbols-mode -1))
|
||||
|
||||
(define-minor-mode fira-code-mode
|
||||
"Fira Code ligatures minor mode"
|
||||
:lighter " Fira Code"
|
||||
(setq-local prettify-symbols-unprettify-at-point 'right-edge)
|
||||
(if fira-code-mode
|
||||
(fira-code-mode--enable)
|
||||
(fira-code-mode--disable)))
|
||||
|
||||
(defun fira-code-mode--setup ()
|
||||
"Setup Fira Code Symbols"
|
||||
(set-fontset-font t '(#Xe100 . #Xe16f) "Fira Code Symbol"))
|
||||
|
||||
(provide 'fira-code-mode)
|
||||
|
||||
Alternative instructions: https://github.com/Profpatsch/blog/blob/master/posts/ligature-emulation-in-emacs/post.md#appendix-b-update-1-firacode-integration
|
||||
|
||||
3. Using composition char table
|
||||
|
||||
Thanks to https://github.com/seanfarley for putting this together; extended by https://github.com/jrblevin.
|
||||
|
||||
Put this lisp in your .emacs:
|
||||
|
||||
(when (window-system)
|
||||
(set-frame-font "Fira Code"))
|
||||
(let ((alist '((33 . ".\\(?:\\(?:==\\|!!\\)\\|[!=]\\)")
|
||||
(35 . ".\\(?:###\\|##\\|_(\\|[#(?[_{]\\)")
|
||||
(36 . ".\\(?:>\\)")
|
||||
(37 . ".\\(?:\\(?:%%\\)\\|%\\)")
|
||||
(38 . ".\\(?:\\(?:&&\\)\\|&\\)")
|
||||
(42 . ".\\(?:\\(?:\\*\\*/\\)\\|\\(?:\\*[*/]\\)\\|[*/>]\\)")
|
||||
(43 . ".\\(?:\\(?:\\+\\+\\)\\|[+>]\\)")
|
||||
(45 . ".\\(?:\\(?:-[>-]\\|<<\\|>>\\)\\|[<>}~-]\\)")
|
||||
(46 . ".\\(?:\\(?:\\.[.<]\\)\\|[.=-]\\)")
|
||||
(47 . ".\\(?:\\(?:\\*\\*\\|//\\|==\\)\\|[*/=>]\\)")
|
||||
(48 . ".\\(?:x[a-zA-Z]\\)")
|
||||
(58 . ".\\(?:::\\|[:=]\\)")
|
||||
(59 . ".\\(?:;;\\|;\\)")
|
||||
(60 . ".\\(?:\\(?:!--\\)\\|\\(?:~~\\|->\\|\\$>\\|\\*>\\|\\+>\\|--\\|<[<=-]\\|=[<=>]\\||>\\)\\|[*$+~/<=>|-]\\)")
|
||||
(61 . ".\\(?:\\(?:/=\\|:=\\|<<\\|=[=>]\\|>>\\)\\|[<=>~]\\)")
|
||||
(62 . ".\\(?:\\(?:=>\\|>[=>-]\\)\\|[=>-]\\)")
|
||||
(63 . ".\\(?:\\(\\?\\?\\)\\|[:=?]\\)")
|
||||
(91 . ".\\(?:]\\)")
|
||||
(92 . ".\\(?:\\(?:\\\\\\\\\\)\\|\\\\\\)")
|
||||
(94 . ".\\(?:=\\)")
|
||||
(119 . ".\\(?:ww\\)")
|
||||
(123 . ".\\(?:-\\)")
|
||||
(124 . ".\\(?:\\(?:|[=|]\\)\\|[=>|]\\)")
|
||||
(126 . ".\\(?:~>\\|~~\\|[>=@~-]\\)")
|
||||
)
|
||||
))
|
||||
(dolist (char-regexp alist)
|
||||
(set-char-table-range composition-function-table (car char-regexp)
|
||||
`([,(cdr char-regexp) 0 font-shape-gstring]))))
|
||||
|
||||
**Note!** If you get `error in process filter: Attempt to shape unibyte text`, check out https://github.com/tonsky/FiraCode/issues/42. Emacs Cider users may avoid this issue by commenting the following line from the above config:
|
||||
|
||||
;; (46 . ".\\(?:\\(?:\\.[.<]\\)\\|[.=-]\\)")
|
||||
|
||||
Char `45` is also known to have issues in macOS Mojave.
|
||||
|
||||
If you are having problems with helm you can disable ligatures in helm:
|
||||
|
||||
(add-hook 'helm-major-mode-hook
|
||||
(lambda ()
|
||||
(setq auto-composition-mode nil)))
|
||||
|
||||
4. Using font-lock keywords
|
||||
|
||||
If none of the above worked, you can try this method.
|
||||
|
||||
This method requires you to install the Fira Code Symbol font, made by https://github.com/siegebell:
|
||||
https://github.com/tonsky/FiraCode/issues/211#issuecomment-239058632
|
||||
|
||||
;;; Fira code
|
||||
;; This works when using emacs --daemon + emacsclient
|
||||
(add-hook 'after-make-frame-functions (lambda (frame) (set-fontset-font t '(#Xe100 . #Xe16f) "Fira Code Symbol")))
|
||||
;; This works when using emacs without server/client
|
||||
(set-fontset-font t '(#Xe100 . #Xe16f) "Fira Code Symbol")
|
||||
;; I haven't found one statement that makes both of the above situations work, so I use both for now
|
||||
|
||||
(defconst fira-code-font-lock-keywords-alist
|
||||
(mapcar (lambda (regex-char-pair)
|
||||
`(,(car regex-char-pair)
|
||||
(0 (prog1 ()
|
||||
(compose-region (match-beginning 1)
|
||||
(match-end 1)
|
||||
;; The first argument to concat is a string containing a literal tab
|
||||
,(concat " " (list (decode-char 'ucs (cadr regex-char-pair)))))))))
|
||||
'(("\\(www\\)" #Xe100)
|
||||
("[^/]\\(\\*\\*\\)[^/]" #Xe101)
|
||||
("\\(\\*\\*\\*\\)" #Xe102)
|
||||
("\\(\\*\\*/\\)" #Xe103)
|
||||
("\\(\\*>\\)" #Xe104)
|
||||
("[^*]\\(\\*/\\)" #Xe105)
|
||||
("\\(\\\\\\\\\\)" #Xe106)
|
||||
("\\(\\\\\\\\\\\\\\)" #Xe107)
|
||||
("\\({-\\)" #Xe108)
|
||||
("\\(\\[\\]\\)" #Xe109)
|
||||
("\\(::\\)" #Xe10a)
|
||||
("\\(:::\\)" #Xe10b)
|
||||
("[^=]\\(:=\\)" #Xe10c)
|
||||
("\\(!!\\)" #Xe10d)
|
||||
("\\(!=\\)" #Xe10e)
|
||||
("\\(!==\\)" #Xe10f)
|
||||
("\\(-}\\)" #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)
|
||||
("\\(>=>\\)" #Xe146)
|
||||
("[^-=]\\(>>\\)" #Xe147)
|
||||
("\\(>>-\\)" #Xe148)
|
||||
("\\(>>=\\)" #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)
|
||||
("[0\[]\\(x\\)" #Xe16b)
|
||||
("[^:=]\\(:\\)[^:=]" #Xe16c)
|
||||
("[^\\+<>]\\(\\+\\)[^\\+<>]" #Xe16d)
|
||||
("[^\\*/<>]\\(\\*\\)[^\\*/<>]" #Xe16f))))
|
||||
|
||||
(defun add-fira-code-symbol-keywords ()
|
||||
(font-lock-add-keywords nil fira-code-font-lock-keywords-alist))
|
||||
|
||||
(add-hook 'prog-mode-hook
|
||||
#'add-fira-code-symbol-keywords)
|
||||
|
||||
On some systems, `==` will appear incorrectly as a blank space in certain modes unless you add the following lines to your init file:
|
||||
|
||||
(set-language-environment "UTF-8")
|
||||
(set-default-coding-systems 'utf-8)
|
||||
|
||||
|
||||
GoormIDE
|
||||
--------
|
||||
|
||||
In a workspace:
|
||||
|
||||
1. Click goormIDE, then Preferences.
|
||||
2. Go to Theme, then focus Custom Theme CSS.
|
||||
3. Copy & paste the following:
|
||||
|
||||
@font-face{
|
||||
font-family: 'Fira Code';
|
||||
src: url('https://raw.githubusercontent.com/tonsky/FiraCode/master/distr/eot/FiraCode-Regular.eot') format('embedded-opentype'),
|
||||
url('https://raw.githubusercontent.com/tonsky/FiraCode/master/distr/woff2/FiraCode-Regular.woff2') format('woff2'),
|
||||
url('https://raw.githubusercontent.com/tonsky/FiraCode/master/distr/woff/FiraCode-Regular.woff') format('woff'),
|
||||
url('https://raw.githubusercontent.com/tonsky/FiraCode/master/distr/ttf/FiraCode-Regular.ttf') format('truetype');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.editor_container pre {
|
||||
-webkit-font-feature-settings: "liga" on, "calt" on;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
text-rendering: optimizeLegibility;
|
||||
font-family: 'Fira Code';
|
||||
}
|
||||
|
||||
4. Click Aplly or OK
|
||||
5. Happy coding!
|
||||
|
||||
|
||||
Cloud9
|
||||
------
|
||||
|
||||
In a workspace:
|
||||
|
||||
1. Click Cloud9, then Preferences (or use keyboard shortcut CTRL + ,)
|
||||
2. Go to Themes, then click on You can also style Cloud9 by editing your stylesheet (this will open a blank styles.css file in the C9 editor)
|
||||
3. Copy & paste the following:
|
||||
|
||||
@font-face{
|
||||
font-family: 'Fira Code';
|
||||
src: url('https://raw.githubusercontent.com/tonsky/FiraCode/master/distr/eot/FiraCode-Regular.eot') format('embedded-opentype'),
|
||||
url('https://raw.githubusercontent.com/tonsky/FiraCode/master/distr/woff2/FiraCode-Regular.woff2') format('woff2'),
|
||||
url('https://raw.githubusercontent.com/tonsky/FiraCode/master/distr/woff/FiraCode-Regular.woff') format('woff'),
|
||||
url('https://raw.githubusercontent.com/tonsky/FiraCode/master/distr/ttf/FiraCode-Regular.ttf') format('truetype');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.ace_editor{
|
||||
-webkit-font-feature-settings: "liga" on, "calt" on;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
text-rendering: optimizeLegibility;
|
||||
font-family: 'Fira Code';
|
||||
}
|
||||
|
||||
4. Back in Preferences tab, click on User Settings, then click on Code Editor (Ace)
|
||||
5. In Font Family field, enter Fira Code
|
||||
6. Optionally, repeat step 5 for Preferences > User Settings > Terminal, if you want Fira Code font in C9 terminal.
|
||||
|
||||
|
||||
MacVim
|
||||
------
|
||||
|
||||
Add this to ~/.gvimrc:
|
||||
|
||||
set macligatures
|
||||
set guifont=Fira\ Code:h12
|
||||
|
||||
MacVim supports ligatures starting from version 7.4.
|
||||
|
||||
|
||||
RStudio
|
||||
-------
|
||||
|
||||
In RStudio:
|
||||
|
||||
1. Go to Tools > Global Options > Appearance
|
||||
2. Select "Fira Code" as Editor Font. In older versions of RStudio, check "Use Ligatures".
|
||||
3. Hit "OK" and enjoy
|
||||
|
||||
|
||||
Sublime Text
|
||||
------------
|
||||
|
||||
Preferences --> Settings
|
||||
|
||||
Add before "ignored_packages":
|
||||
|
||||
"font_face": "Fira Code",
|
||||
"font_options": ["subpixel_antialias"],
|
||||
|
||||
If you want enable antialias, add in font_options: "gray_antialias"
|
||||
|
||||
|
||||
Visual Studio
|
||||
-------------
|
||||
|
||||
1. Launch Visual Studio (2015 or later).
|
||||
2. Launch the Options dialog by opening the "Tools" menu and selecting "Options".
|
||||
3. In the Options dialog, under the "Environment" category, you'll find "Fonts and Colors". Click on that. You'll see a combo-box on the right hand side of the dialog labelled "Font". Select "Fira Code" from that combo-box.
|
||||
4. Click "OK" to dismiss.
|
||||
5. Restart Visual Studio.
|
||||
|
||||
Now, most FiraCode ligatures will work. A notable exception is the hyphen-based ligatures (e.g. the C++ dereference '->'). See https://github.com/tonsky/FiraCode/issues/422 for details.
|
||||
|
||||
|
||||
Troubleshooting
|
||||
===============
|
||||
|
||||
See https://github.com/tonsky/FiraCode/wiki/Troubleshooting
|
@ -1,48 +0,0 @@
|
||||
@font-face {
|
||||
font-family: 'Fira Code';
|
||||
src: url('woff2/FiraCode-Light.woff2') format('woff2'),
|
||||
url("woff/FiraCode-Light.woff") format("woff");
|
||||
font-weight: 300;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira Code';
|
||||
src: url('woff2/FiraCode-Regular.woff2') format('woff2'),
|
||||
url("woff/FiraCode-Regular.woff") format("woff");
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira Code';
|
||||
src: url('woff2/FiraCode-Medium.woff2') format('woff2'),
|
||||
url("woff/FiraCode-Medium.woff") format("woff");
|
||||
font-weight: 500;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira Code';
|
||||
src: url('woff2/FiraCode-SemiBold.woff2') format('woff2'),
|
||||
url("woff/FiraCode-SemiBold.woff") format("woff");
|
||||
font-weight: 600;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira Code';
|
||||
src: url('woff2/FiraCode-Bold.woff2') format('woff2'),
|
||||
url("woff/FiraCode-Bold.woff") format("woff");
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira Code VF';
|
||||
src: url('woff2/FiraCode-VF.woff2') format('woff2-variations'),
|
||||
url('woff/FiraCode-VF.woff') format('woff-variations');
|
||||
/* font-weight requires a range: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide#Using_a_variable_font_font-face_changes */
|
||||
font-weight: 300 700;
|
||||
font-style: normal;
|
||||
}
|
@ -1,95 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>Fira Code Specimen</title>
|
||||
|
||||
<link rel="stylesheet" href="fira_code.css">
|
||||
<style>
|
||||
body { font: 14px/1.5em "Fira Code"; }
|
||||
.code {
|
||||
font-feature-settings: "calt" 1; /* Enable ligatures for IE 10+, Edge */
|
||||
text-rendering: optimizeLegibility; /* Force ligatures for Webkit, Blink, Gecko */
|
||||
width: 30em;
|
||||
margin: 5em auto;
|
||||
white-space: pre-wrap;
|
||||
word-break: break-all;
|
||||
}
|
||||
.light { font-weight: 300; }
|
||||
.regular { font-weight: 400; }
|
||||
.medium { font-weight: 500; }
|
||||
.semibold { font-weight: 600; }
|
||||
.bold { font-weight: 700; }
|
||||
.variable { font-family: 'Fira Code VF'; font-variation-settings: 'wght' 400; }
|
||||
i { font-style: normal; color: #c33; }
|
||||
b { font-weight: inherit; color: #c33; }
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
function onWeightChange(weight) {
|
||||
// code_variable.style['font-weight'] = weight;
|
||||
code_variable.style['font-variation-settings'] = "'wght' " + weight;
|
||||
span_wght.innerText = weight;
|
||||
}
|
||||
</script>
|
||||
<body>
|
||||
|
||||
<div class="code light"><b># Fira Code Light</b>
|
||||
|
||||
take = (n, [x, <i>...</i>xs]:list) <i>--></i>
|
||||
| n <i><=</i> 0 <i>=></i> []
|
||||
| empty list <i>=></i> []
|
||||
| otherwise <i>=></i> [x] <i>++</i> take n-1, xs
|
||||
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
||||
|
||||
|
||||
<div class="code regular"><b># Fira Code Regular</b>
|
||||
|
||||
take = (n, [x, <i>...</i>xs]:list) <i>--></i>
|
||||
| n <i><=</i> 0 <i>=></i> []
|
||||
| empty list <i>=></i> []
|
||||
| otherwise <i>=></i> [x] <i>++</i> take n-1, xs
|
||||
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
||||
|
||||
|
||||
<div class="code medium"><b># Fira Code Medium</b>
|
||||
|
||||
take = (n, [x, <i>...</i>xs]:list) <i>--></i>
|
||||
| n <i><=</i> 0 <i>=></i> []
|
||||
| empty list <i>=></i> []
|
||||
| otherwise <i>=></i> [x] <i>++</i> take n-1, xs
|
||||
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
||||
|
||||
|
||||
<div class="code semibold"><b># Fira Code SemiBold</b>
|
||||
|
||||
take = (n, [x, <i>...</i>xs]:list) <i>--></i>
|
||||
| n <i><=</i> 0 <i>=></i> []
|
||||
| empty list <i>=></i> []
|
||||
| otherwise <i>=></i> [x] <i>++</i> take n-1, xs
|
||||
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
||||
|
||||
|
||||
<div class="code bold"><b># Fira Code Bold</b>
|
||||
|
||||
take = (n, [x, <i>...</i>xs]:list) <i>--></i>
|
||||
| n <i><=</i> 0 <i>=></i> []
|
||||
| empty list <i>=></i> []
|
||||
| otherwise <i>=></i> [x] <i>++</i> take n-1, xs
|
||||
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
||||
|
||||
<div id="code_variable" class="code variable"><b># Fira Code Variable</b>
|
||||
|
||||
<input type="range" min="300" max="700" value="400" step="10" style="width: 300px;" oninput="onWeightChange(this.value)" onchange="onWeightChange(this.value)"> <span id="span_wght">400</span>
|
||||
|
||||
take = (n, [x, <i>...</i>xs]:list) <i>--></i>
|
||||
| n <i><=</i> 0 <i>=></i> []
|
||||
| empty list <i>=></i> []
|
||||
| otherwise <i>=></i> [x] <i>++</i> take n-1, xs
|
||||
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
@ -1,63 +0,0 @@
|
||||
# Time to shape text with different calt code
|
||||
|
||||
Baseline:
|
||||
|
||||
```
|
||||
sub 1 2 3 4 by 1_2_3_4.liga;
|
||||
```
|
||||
|
||||
Spacers:
|
||||
|
||||
```
|
||||
sub 1.spacer 2.spacer 3.spacer 4' by 1_2_3_4.liga;
|
||||
sub 1.spacer 2.spacer 3' 4 by 3.spacer;
|
||||
sub 1.spacer 2' 3 4 by 2.spacer;
|
||||
sub 1' 2 3 4 by 1.spacer;
|
||||
```
|
||||
|
||||
Lookups:
|
||||
|
||||
```
|
||||
lookup 1_2_3_4 {
|
||||
sub 1.spacer 2.spacer 3.spacer 4' by 1_2_3_4.liga;
|
||||
sub 1.spacer 2.spacer 3' 4 by 3.spacer;
|
||||
sub 1.spacer 2' 3 4 by 2.spacer;
|
||||
sub 1' 2 3 4 by 1.spacer;
|
||||
} 1_2_3_4;
|
||||
```
|
||||
|
||||
Ignores:
|
||||
|
||||
```
|
||||
lookup 1_2_3_4 {
|
||||
ignore sub 1 1' 2 3 4;
|
||||
ignore sub 1' 2 3 4 4;
|
||||
sub 1.spacer 2.spacer 3.spacer 4' by 1_2_3_4.liga;
|
||||
sub 1.spacer 2.spacer 3' 4 by 3.spacer;
|
||||
sub 1.spacer 2' 3 4 by 2.spacer;
|
||||
sub 1' 2 3 4 by 1.spacer;
|
||||
} 1_2_3_4;
|
||||
```
|
||||
|
||||
Benchmark:
|
||||
|
||||
```
|
||||
time hb-shape -n 100000 distr/ttf/FiraCode-Regular.ttf "Hello +++ /// !== <-> world"
|
||||
```
|
||||
|
||||
Setup:
|
||||
|
||||
```
|
||||
HarfBuzz 2.6.4
|
||||
3,2 GHz 6-Core Intel Core i7
|
||||
MacOS 10.15.3
|
||||
```
|
||||
|
||||
Results:
|
||||
|
||||
```
|
||||
Baseline 0.407s
|
||||
Spacers 1.415s
|
||||
Lookups 2.080s
|
||||
Ignores 2.656s
|
||||
```
|
Before Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 1.2 KiB |
@ -1,27 +0,0 @@
|
||||
name: "Fira Code"
|
||||
designer: "Multiple Designers"
|
||||
license: "OFL"
|
||||
category: "Monospace"
|
||||
date_added: "2019-03-25"
|
||||
fonts {
|
||||
name: "Fira Code"
|
||||
style: "normal"
|
||||
weight: 300
|
||||
filename: "FiraCode-Light.ttf"
|
||||
post_script_name: "FiraCode-Light"
|
||||
full_name: "Fira Code Light"
|
||||
copyright: "Copyright 2012-2015 The Fira Code Project Authors (https://github.com/tonsky/FiraCode)"
|
||||
}
|
||||
subsets: "cyrillic"
|
||||
subsets: "cyrillic-ext"
|
||||
subsets: "greek"
|
||||
subsets: "greek-ext"
|
||||
subsets: "latin"
|
||||
subsets: "latin-ext"
|
||||
subsets: "menu"
|
||||
axes {
|
||||
tag: "wght"
|
||||
min_value: 300.0
|
||||
default_value: 300.0
|
||||
max_value: 700.0
|
||||
}
|
@ -1,73 +0,0 @@
|
||||
# Onboarding to Google Fonts
|
||||
|
||||
This directory is made to run a Google Fonts onboarding process for Fira Code.
|
||||
|
||||
The `build.sh` script builds variable and static font files as required by Google Fonts.
|
||||
|
||||
The `move-check.sh` script does a few things:
|
||||
- Fixes a few pieces of font metadata to align them to Google Fonts standards
|
||||
- Moves font files into a google/fonts directory, to prep/update a PR to [the official google/fonts repo](https://github.com/google/fonts)
|
||||
- Runs [FontBakery](https://github.com/googlefonts/fontbakery) to check the fonts against Google Fonts standards, and saves results to the [checks](checks) subfolder.
|
||||
|
||||
This process must be run multiple times, tweaking source files and rebuilding output fonts to solve issues flagged by FontBakery.
|
||||
|
||||
## USAGE
|
||||
|
||||
### First, setup prerequisites
|
||||
|
||||
If you haven't already done so, open a terminal, clone this repo, and move to the `qa` branch:
|
||||
|
||||
```
|
||||
git clone git@github.com:thundernixon/firacode.git
|
||||
cd firacode
|
||||
git checkout qa
|
||||
```
|
||||
|
||||
FontBakery checks are made to be run on fonts within the folder structure of the [google/fonts repo](https://github.com/google/fonts). Therefore, you must have a local copy of this repo on your computer to run this QA procedure. If you don't yet have a local google/fonts repo, open a new terminal session, navigate to a parent folder for this (e.g. `cd ~/yourusername/type_repos`, but use whatever location makes sense), and clone the repo:
|
||||
|
||||
```
|
||||
git clone git@github.com:google/fonts.git
|
||||
```
|
||||
|
||||
### Second, set up your testing environment
|
||||
|
||||
Create a Python 3 virtual environment:
|
||||
|
||||
```
|
||||
virtualenv -p python3 build/venv
|
||||
```
|
||||
|
||||
Then, activate the new virtual environment:
|
||||
|
||||
```
|
||||
source venv/bin/activate
|
||||
```
|
||||
|
||||
Now, install the QA dependencies:
|
||||
|
||||
```
|
||||
pip install -U -r googlefonts-qa/scripts/requirements.txt
|
||||
```
|
||||
|
||||
Give the build and move-check scripts permission to run:
|
||||
|
||||
```
|
||||
chmod +x googlefonts-qa/scripts/build.sh
|
||||
chmod +x googlefonts-qa/scripts/move-check.sh
|
||||
```
|
||||
|
||||
### Third, use scripts to build fonts, then move and check
|
||||
|
||||
With your terminal at the top level of your Fira Code directory, build fresh copies of the relevant fonts by running:
|
||||
|
||||
```
|
||||
googlefonts-qa/scripts/build.sh
|
||||
```
|
||||
|
||||
When that completes, run the move-check script (using the path to your local `google/fonts` repo as an argument):
|
||||
|
||||
```
|
||||
move-check <absolute_path_to_parent_dir>/fonts
|
||||
```
|
||||
|
||||
If all goes well, you will have created a local `firacode` branch in your google fonts directory, moved the fresh fonts there, and run QA checks which will create new markdown documents at `googlefonts-qa/scripts/checks`. If following this guide doesn't work, please file an issue at `thundernixon/firacode`.
|
@ -1,12 +0,0 @@
|
||||
<p>Programmers use a lot of symbols, often encoded with several characters. For the human brain, sequences like
|
||||
<code>-></code>, <code><=</code> or <code>:=</code> are single logical tokens, even if they take two or three
|
||||
characters on the screen. Your eye spends a non-zero amount of energy to scan, parse and join multiple characters
|
||||
into a single logical one. Ideally, all programming languages should be designed with full-fledged Unicode symbols
|
||||
for operators, but that’s not the case yet.
|
||||
</p>
|
||||
<p>
|
||||
Fira Code is an extension of the Fira Mono font containing a set of ligatures for common programming multi-character
|
||||
combinations. This is just a font rendering feature: underlying code remains ASCII-compatible. This helps to read
|
||||
and understand code faster. For some frequent sequences like <code>..</code> or <code>//</code>, ligatures allow us
|
||||
to correct spacing.
|
||||
</p>
|
@ -1,149 +0,0 @@
|
||||
# QA Notes – checking & polishing Fira Code for Google Fonts
|
||||
|
||||
- [x] autohint static TTFs
|
||||
- [ ] check extrapolated outlines for issues
|
||||
|
||||
## Checks to resolve
|
||||
|
||||
|
||||
|
||||
======================================================================================
|
||||
|
||||
## Waiting on others
|
||||
|
||||
<details>
|
||||
<summary>🔥 <b>FAIL:</b> Copyright notices match canonical pattern in fonts</summary>
|
||||
|
||||
* [com.google.fonts/check/font_copyright](https://github.com/googlefonts/fontbakery/search?q=com.google.fonts/check/font_copyright)
|
||||
* 🔥 **FAIL** Name Table entry: Copyright notices should match a pattern similar to: 'Copyright 2017 The Familyname Project Authors (git url)'
|
||||
But instead we have got: 'Copyright 2012-2015 The Mozilla Foundation, Telefonica S.A., and Nikita Prokopov (https://github.com/tonsky/FiraCode)'
|
||||
|
||||
</details>
|
||||
|
||||
- additionally, it's unclear how the original copyright on Fira Mono & Fira Code should best be integrated to credit all designers involved
|
||||
|
||||
- [x] file issue on fontbakery (https://github.com/googlefonts/fontbakery/issues/2419)
|
||||
- [x] confirm that current approach is fine (https://github.com/google/fonts/issues/1460#issuecomment-476713822) (seems okay, based on Hangouts discussion)
|
||||
|
||||
----------------------------
|
||||
|
||||
<details>
|
||||
<summary><b>[119] FiraCode-Light.ttf</b></summary>
|
||||
<details>
|
||||
<summary>🔥 <b>FAIL:</b> Checking file is named canonically.</summary>
|
||||
|
||||
* [com.google.fonts/check/canonical_filename](https://github.com/googlefonts/fontbakery/search?q=com.google.fonts/check/canonical_filename)
|
||||
* 🔥 **FAIL** This is a variable font, but it is using a naming scheme typical of a static font.
|
||||
* 🔥 **FAIL** Please change the font filename to use one of the following valid suffixes for variable fonts: VF, Italic-VF, Roman-VF
|
||||
|
||||
</details>
|
||||
|
||||
- [x] ask if/when this is changing (via hangouts) – Marc: "We’ll batch the vfs once they’ve implemented it"
|
||||
|
||||
----------------------------
|
||||
|
||||
======================================================================================
|
||||
|
||||
## Edits and corrected FontBakery checks
|
||||
|
||||
|
||||
|
||||
<details>
|
||||
<summary>⚠ <b>WARN:</b> Stricter unitsPerEm criteria for Google Fonts. </summary>
|
||||
|
||||
* [com.google.fonts/check/unitsperem_strict](https://github.com/googlefonts/fontbakery/search?q=com.google.fonts/check/unitsperem_strict)
|
||||
* ⚠ **WARN** Even though unitsPerEm (1000) in this font is reasonable. It is strongly advised to consider changing it to 2000, since it will likely improve the quality of Variable Fonts by avoiding excessive rounding of coordinates on interpolations.
|
||||
|
||||
</details>
|
||||
|
||||
- [x] scale UPM to 2000
|
||||
|
||||
----------------------------
|
||||
|
||||
<details>
|
||||
<summary>🔥 <b>FAIL:</b> Are there non-ASCII characters in ASCII-only NAME table entries?</summary>
|
||||
|
||||
* [com.google.fonts/check/name/ascii_only_entries](https://github.com/googlefonts/fontbakery/search?q=com.google.fonts/check/name/ascii_only_entries)
|
||||
* 🔥 **FAIL** There are 1 strings containing non-ASCII characters in the ASCII-only NAME table entries.
|
||||
* ℹ **INFO** Bad string at [nameID 0, 'utf_16_be']: 'b'Copyright © 2015 by Nikita Prokopov''
|
||||
|
||||
</details>
|
||||
|
||||
- [x] remove © symbol
|
||||
|
||||
----------------------------
|
||||
|
||||
<details>
|
||||
<summary><b>[31] Family checks</b></summary>
|
||||
<details>
|
||||
<summary>🔥 <b>FAIL:</b> METADATA.pb: According Google Fonts standards, families should have a Regular style.</summary>
|
||||
|
||||
* [com.google.fonts/check/metadata/has_regular](https://github.com/googlefonts/fontbakery/search?q=com.google.fonts/check/metadata/has_regular)
|
||||
* 🔥 **FAIL** This family lacks a Regular (style: normal and weight: 400) as required by Google Fonts standards.
|
||||
|
||||
</details>
|
||||
|
||||
- [x] this issue is already filed with fontbakery (https://github.com/googlefonts/fontbakery/issues/2378)
|
||||
|
||||
----------------------------
|
||||
|
||||
<details>
|
||||
<summary>🔥 <b>FAIL:</b> Checking OS/2 usWinAscent & usWinDescent.</summary>
|
||||
|
||||
* [com.google.fonts/check/family/win_ascent_and_descent](https://github.com/googlefonts/fontbakery/search?q=com.google.fonts/check/family/win_ascent_and_descent)
|
||||
* 🔥 **FAIL** OS/2.usWinAscent value should be equal or greater than 1050, but got 935 instead [code: ascent]
|
||||
* 🔥 **FAIL** OS/2.usWinDescent value should be equal or greater than 500, but got 265 instead [code: descent]
|
||||
|
||||
</details>
|
||||
|
||||
- [x] run script to correct vertical metrics, recheck
|
||||
- [x] ~~add issue~~ issue exists to gf-docs to update vertical metrics to recommendation at https://github.com/googlefonts/fontbakery/issues/2164#issuecomment-436595886 (will track / manage separately)
|
||||
|
||||
|
||||
----------------------------
|
||||
|
||||
<details>
|
||||
<summary>🔥 <b>FAIL:</b> Glyph names are all valid?</summary>
|
||||
|
||||
* [com.google.fonts/check/valid_glyphnames](https://github.com/googlefonts/fontbakery/search?q=com.google.fonts/check/valid_glyphnames)
|
||||
* 🔥 **FAIL** The following glyph names do not comply with naming conventions: ['numbersign_numbersign_numbersign.liga', 'numbersign_numbersign_numbersign_numbersign.liga', 'numbersign_underscore_parenleft.liga', 'backslash_backslash_backslash.rem', 'numbersign_numbersign_numbersign.liga.rem', 'numbersign_numbersign_numbersign_numbersign.liga.rem', 'semicolon_semicolon_semicolon.rem', 'quadrantUpperLeftAndLowerLeftAndLowerRight', 'quadrantUpperLeftAndUpperRightAndLowerLeft', 'quadrantUpperLeftAndUpperRightAndLowerRight', 'quadrantUpperRightAndLowerLeftAndLowerRight', 'whiteSquareWithUpperLeftQuadrant', 'whiteSquareWithLowerLeftQuadrant', 'whiteSquareWithLowerRightQuadrant', 'whiteSquareWithUpperRightQuadrant', 'asciitilde_asciitilde_greater.liga', 'ampersand_ampersand_ampersand.rem', 'asciitilde_asciitilde_asciitilde.rem'] A glyph name may be up to 31 characters in length, must be entirely comprised of characters from the following set: A-Z a-z 0-9 .(period) _(underscore). and must not start with a digit or period. There are a few exceptions such as the special character ".notdef". The glyph names "twocents", "a1", and "_" are all valid, while "2cents" and ".twocents" are not.
|
||||
|
||||
</details>
|
||||
|
||||
- [x] issue filed at https://github.com/tonsky/FiraCode/issues/730 – I'm guessing this won't cause any real issues on the web fonts.
|
||||
- I'll leave these glyphs as they are for now, and let @tonsky handle it if it seems to be the cause of an actual user issue
|
||||
|
||||
----------------------------
|
||||
|
||||
<details>
|
||||
<summary>🔥 <b>FAIL:</b> Variable font weight coordinates must be multiples of 100.</summary>
|
||||
|
||||
* [com.google.fonts/check/varfont_weight_instances](https://github.com/googlefonts/fontbakery/search?q=com.google.fonts/check/varfont_weight_instances)
|
||||
* 🔥 **FAIL** Found an variable font instance with 'wght'=450.0. This should instead be a multiple of 100.
|
||||
|
||||
</details>
|
||||
|
||||
- (fontmake also started to fail, as "Retina" instance was given a custom param of `weightClass: 900`)
|
||||
|
||||
- [x] uncheck "Retina" instance as `is active` instance
|
||||
- [x] file issue with FontBakery to ask Dave/Marc about this `450` weight "Retina" instance (https://github.com/googlefonts/fontbakery/issues/2420)-
|
||||
- [x] change if you find a better approach to keep Retina without disrupting builds / Regular weight
|
||||
- To set up the instance in GlyhpsApp such that it exports a font as expected: "Retina" gets a custom parameter of `weightClass: 450`, and a glyphs menu-weight of "Normal." Tested in axis-praxis, it seems to work well. All instances have a `weightClass` custom parameter.
|
||||
|
||||
----------------------------
|
||||
|
||||
<details>
|
||||
<summary>🔥 <b>FAIL:</b> Checking OS/2 usWeightClass.</summary>
|
||||
|
||||
* [com.google.fonts/check/usweightclass](https://github.com/googlefonts/fontbakery/search?q=com.google.fonts/check/usweightclass)
|
||||
* 🔥 **FAIL** OS/2 usWeightClass expected value for 'Light' is 300 but this font has 400.
|
||||
|
||||
</details>
|
||||
|
||||
- [ ] explore to find why this would be happening ...
|
||||
- Encode Sans gets an OS/2 usWeightClass of `100`, matching its default instance.
|
||||
|
||||
**Solution**
|
||||
- Custom Parameters of `Axis Location` needed to be set in source masters (https://github.com/googlei18n/fontmake/issues/540)
|
||||
|
||||
----------------------------
|
Before Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 6.0 KiB |
Before Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 8.4 KiB |
Before Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 47 KiB |
Before Width: | Height: | Size: 39 KiB |