Removed fonts from repo. Download it yourself if you want them.

This commit is contained in:
Christian Baer 2020-05-11 18:15:22 +02:00
parent 003f373ef8
commit 3bfac04f29
147 changed files with 0 additions and 128650 deletions

3
.gitmodules vendored
View File

@ -7,6 +7,3 @@
[submodule "init/vim-json"] [submodule "init/vim-json"]
path = init/vim-json path = init/vim-json
url = https://github.com/elzr/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

View File

@ -1,3 +0,0 @@
github: [tonsky]
patreon: tonsky
custom: https://paypal.me/nikitonsky

View File

@ -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

View File

@ -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

View File

@ -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 doesnt 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

File diff suppressed because one or more lines are too long

View File

@ -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.

View File

@ -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 thats 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!
### Whats 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 whats 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 | Doesnt 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 | Doesnt 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)

View File

@ -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")))))

View File

@ -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)))

View File

@ -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)))

View File

@ -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)
;;

View File

@ -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)))

View File

@ -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)))))

View File

@ -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)))

View File

@ -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)))

View File

@ -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"}}}

View File

@ -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 isnt, 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

View File

@ -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;
}

View File

@ -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>

View File

@ -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
```

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -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
}

View File

@ -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`.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,12 +0,0 @@
<p>Programmers use a lot of symbols, often encoded with several characters. For the human brain, sequences like
<code>-&gt;</code>, <code>&lt;=</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 thats 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>

View File

@ -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: "Well batch the vfs once theyve 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 &#169; 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)
----------------------------

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Some files were not shown because too many files have changed in this diff Show More