1
0
Fork 0
mirror of synced 2024-05-15 10:03:34 +12:00

Compare commits

...

244 commits
2 ... master

Author SHA1 Message Date
Cyrill Küttel 34cced2a12 link to gnome-terminal issue for Ligatures 2024-02-29 17:53:30 +01:00
Nikita Prokopov ef565289eb Symbols for Legacy Computing: Set color to blue #1566 2024-01-02 17:09:24 +01:00
Nikita Prokopov 40fc56fc4e Add Block elements from the Symbols for Legacy Computing #1566 2024-01-02 17:08:12 +01:00
Josh McKinney f70e21b6e5 Remove makefile edit 2024-01-02 16:27:00 +01:00
Josh McKinney 2b2de1d7a0 Add rest of legacy block elements 2024-01-02 16:27:00 +01:00
Josh McKinney 525f223010 Add horizontal eighth combination blocks 2024-01-02 16:27:00 +01:00
Josh McKinney ea1a77ce75 Add combination one eighth blocks 2024-01-02 16:27:00 +01:00
Josh McKinney 6dfa7e2385 Add horizontal one eighth blocks 2024-01-02 16:27:00 +01:00
Josh McKinney 122cf42d40 Add Vertical eighth blocks and upper quarter block 2024-01-02 16:27:00 +01:00
Nikita Prokopov 747fab5be7 user.clj, nrepl -> socket repl 2024-01-02 16:26:52 +01:00
Nikita Prokopov f064e54c06
Update Notepad++ instructions link #1555 2023-11-09 14:41:46 +01:00
Ikko Eltociear Ashimine ba21c00cdf minor fix 2023-06-19 19:28:30 +02:00
Ikko Eltociear Ashimine 6f05dc2018 Add Japanese README 2023-06-19 19:28:30 +02:00
jim-p 5de1abb167 Update Compatibility List. Fixes #1532
* Adds several entries to Editors and Terminals lists
* Fixes some broken formatting and ordering in the
  second column of Editor list
2023-05-28 15:18:40 +02:00
matan h ee125da078 move Arduino IDE 2.0 to the Works list 2023-05-16 16:07:09 +02:00
matan h a47db68a73 add arduino-ide 2.0 to the explain message of arduino in editor compatibility list 2023-05-16 16:07:09 +02:00
Björn Kautler 79b02adef1 Add an example Docker call for MSYS2 based shells 2023-04-27 06:55:58 -07:00
Nikita Prokopov 20f11a21e0
Merge pull request #1514 from ecerulm/patch-1
Update README with cv01, ss01 , zero, onum, etc
2023-03-16 03:34:27 -07:00
Ruben Laguna f61975c306
Update README with cv01, ss01 , zero, onum, etc
Those are already reference in the images, but they are not searchable. 
By putting in the text is easier to find as you can search for calt, onum, zero, cv01, ss01, 
and find the relevant documentation
2023-03-16 08:36:54 +01:00
Nikita Prokopov b94cc3e0de
Merge pull request #1512 from snan/master
I don't understand why some are red and some are black.
2023-03-08 08:07:46 -08:00
Sandra Snan db910e4cd6 I don't understand why some are red and some are black.
Let's make it a little bit more consistent.
2023-03-08 10:08:02 +01:00
Nikita Prokopov 22c5754289
Tilix doesn’t work (closes #1506) 2023-02-22 16:42:08 +01:00
Nikita Prokopov 63976dd129
Minor tweaks #1501 2023-01-26 13:23:39 -08:00
Goooler a696ca56b0 Ignore IDEA files 2023-01-26 18:20:34 +08:00
Goooler f7a8ac72f2 Bump GHA versions 2023-01-26 18:20:02 +08:00
Nikita Prokopov a03fb501d3 Update scripts for fresh gftools and cross-platform mktemp 2023-01-17 18:35:09 +00:00
Nikita Prokopov e19f63e0e9
Merge pull request #1471 from ollicle/master
Docs: BBEdit support
2022-10-05 00:56:28 +02:00
Oliver Boermans 9f01d4d376 Docs: BBEdit support
[Latest version of BBEdit](https://www.barebones.com/support/bbedit/notes-14.6.html) supports ligatures once more.

BBEdit no longer requires expert preferences to enable ligatures

TextWrangler is no more – replaced by the unlicenced version of BBEdit.

Update the README files to reflect these changes.
2022-10-04 21:47:36 +10:30
Nikita Prokopov ab2aaf3e73 Misspelling of Haskell in Spanish README (closes #1463) 2022-09-01 17:32:32 +02:00
Nikita Prokopov 4cabdfdfb3
Merge pull request #1452 from ACnoway/master
Update README_CN.md
2022-08-03 15:53:16 +02:00
ACnoway aaafcd3702 update README_CN.md 2022-08-03 10:25:35 +08:00
ACnoway 4926aeac29 wiki Chinese translation 2022-08-02 19:13:50 +08:00
Nikita Prokopov c9d4324d90
Merge pull request #1446 from HyunseungLee-Travis/master
Update quotes to single quote
2022-07-23 02:12:56 +02:00
Hyunseung Lee 3b2506cd31
Update quotes to single quote 2022-07-23 08:33:34 +09:00
Nikita Prokopov caf00206a7
Merge pull request #1440 from xgdgsc/patch-1
fix cn translation regarding sponser
2022-07-13 20:52:58 +02:00
Nikita Prokopov 16de164e66
Merge pull request #1438 from ShalokShalom/patch-1
Move Godot to supported
2022-07-13 20:52:38 +02:00
xgdgsc a0130c91fa
fix cn translation 2022-07-12 22:41:22 +08:00
ShalokShalom c44df2bc5f
Correct order in compability list 2022-07-11 21:11:46 +02:00
ShalokShalom db40758747
Move Godot to supported
Godot resolved the hindering issue 2 years ago. 
Godot 4 ships by default with ligatures.
Issue https://github.com/godotengine/godot-proposals/issues/1180
2022-07-11 17:03:03 +02:00
Nikita Prokopov ad43187d10
Merge pull request #1429 from habere-et-dispertire/patch-1
Raku IDE Comma supports FiraCode
2022-06-30 16:39:04 +02:00
habere-et-dispertire 2a95184394
Raku IDE Comma supports FiraCode
Select installed FiraCode under Preferences... > Editor > Font
and toggle the checkbox Enable ligatures in the same place.
2022-06-29 23:59:46 +01:00
Nikita Prokopov 022693f6f0 Fixed overlap in U+2573 ╳ #1414 2022-05-22 22:58:46 +02:00
Nikita Prokopov 164956350f
Merge pull request #1400 from holazz/patch-readme-cn
docs: improve README_CN.md
2022-04-13 14:54:30 +02:00
holazz 7b20ec1e3b docs: improve README_CN.md 2022-04-13 16:35:22 +08:00
Nikita Prokopov ab6e682f93 Reformatted terminal compatibility list, added Wez’s terminal (closes #1397) 2022-04-01 16:55:14 +02:00
Nikita Prokopov d80b0f07f1 Fixed building on the latest fontmake 2022-03-15 18:11:40 +01:00
Nikita Prokopov 390c41cc94 Fixed build.sh to work on macOS, regen glyphs from *.fea 2022-03-15 15:51:00 +01:00
Fabian Preuß 31adb247e5 feat: allow hardcoding of features via arguments to build script
All features that were not already in their own files were pulled out of
FiraCode.glyphs into individual files. There is no way I will write
a parser for the glyphs file to do that at runtime. The build script
will then read the code in these feature files and appends it to the
`calt` property inside the glyphs file. Features to be baked in can be
given to build.sh as a comma separated list with the `-f / --features`
flag.

To more easily generate multiple font versions with different features
baked in, there are flags `-n / --family-name` for build.sh that will
allow users to set a custom family name for the font. The special value
"features" will append the feature list to the font name. The family
name is exported and used by the other build scripts as a directory to
separate different font versions. The filenames were not changed, the
directory name is enough separation.

The flag `-g / --generate-glyphs-only` will cause the script to exit
after the custom glyphs file has been created without actually building
the font. The custom .glyphs file will be saved as
`${family_name}.glyphs`.

Via another flag, `-w / --weights`, a comma separated list of font
weights to be generated can be given to build.sh.

The README received a hint to the new capabilities.

Fixed a mixup of cv25 and cv32.

The .gitignore was adjusted to better deal with the new directories and
files.
2022-03-15 15:34:25 +01:00
Nikita Prokopov 82180459c9 Removed accidental backgroundImage 2022-03-15 15:29:30 +01:00
Nikita Prokopov 8f4cc97fd5 Removed Docker build from Makefile 2022-03-15 15:29:30 +01:00
Nikita Prokopov a712db6f47
Merge pull request #1385 from VladWinner/master
README.md: Correcting the aspect ratio of images on phones
2022-03-06 20:31:28 +01:00
Vlad a258200a13
Correcting the aspect ratio of images on phones 2022-03-05 04:49:56 +03:00
Vlad 37855f9cf8
Correcting the aspect ratio of images on phones 2022-03-05 04:49:03 +03:00
Nikita Prokopov 4488dc4a66
Update WorkOS link 2022-02-09 17:40:30 +01:00
Nikita Prokopov dc096591b0
WorkOS sponsorship 2022-02-09 15:50:05 +01:00
Nikita Prokopov 383835769c
Merge pull request #1366 from jsoref/spelling
Spelling
2022-02-07 19:33:55 +01:00
Josh Soref f1725b4b4a spelling: to
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2022-02-06 19:19:50 -05:00
Josh Soref e4d1280121 spelling: successfully
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2022-02-06 16:27:49 -05:00
Josh Soref 2c78d18533 spelling: similar
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2022-02-06 16:27:49 -05:00
Josh Soref 8c616ac0dd spelling: proportion
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2022-02-06 16:27:49 -05:00
Josh Soref f2fa4431b8 spelling: postscript
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2022-02-06 16:27:49 -05:00
Josh Soref e6d6ecfcdf spelling: metadata
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2022-02-06 16:27:49 -05:00
Josh Soref 54f1c04b68 spelling: intellij
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2022-02-06 16:27:49 -05:00
Josh Soref 6d3291e32f spelling: inferred
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2022-02-06 16:27:49 -05:00
Josh Soref b95464577a spelling: glyphs
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2022-02-06 16:27:49 -05:00
Josh Soref 7b29086fd2 spelling: conjunction
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2022-02-06 16:27:48 -05:00
Josh Soref 894d462c02 spelling: characters
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2022-02-06 16:27:48 -05:00
Josh Soref 9f66ca846f spelling: aren't
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2022-02-06 16:27:48 -05:00
Josh Soref 6462d0d3d3 spelling: apply
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2022-02-06 16:27:48 -05:00
Josh Soref f2b14f6dd8 spelling: amount
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2022-02-06 16:27:48 -05:00
Diego Sejas-Viscarra 5b90f15c94
Spanish improvements (#1360)
- Corrected a typo in one of the images in Spanish
- Improved the look of one of the images in Spanish

Co-authored-by: Diego Sejas-Viscarra <dsejas.math@m.me>
2022-01-31 19:08:35 +01:00
Keiran Harcombe 3de2fda715 Updated README.md to include TeXShop 2022-01-31 12:57:27 +01:00
Diego Sejas-Viscarra 1ecbc3ac56 Add Spanish README (LEEME) 2022-01-26 09:11:26 +01:00
Pablo 4c21593495 Fixed link to GNOME issue.
GNOME moved from Bugzilla to Gitlab. Fixed the link to the corresponding issue there.
2022-01-19 16:53:02 +01:00
墨抒颖 6cdf4a0583
Update README.md (#1341)
* Update README.md

加入简体中文翻译

* Update README.md

Co-authored-by: Nikita Prokopov <niki@tonsky.me>
2021-12-20 12:59:31 +01:00
墨抒颖 0d88d99bb1 Create README_CN.md
加入中文翻译
2021-12-20 12:57:15 +01:00
Nikita Prokopov eee6db9936 Fira Code 6.2 2021-12-06 21:52:45 +01:00
Nikita Prokopov 6e5ddfe4fc (hopefully) fixed monospaced #1325 2021-12-06 21:43:43 +01:00
Nikita Prokopov 16b04e0e4d
Fixed README after #1327 for good 2021-12-06 17:12:08 +01:00
Nikita Prokopov dea368f399
Fixed README after #1327 2021-12-06 16:06:18 +01:00
Amon Sha ab85072483 Update editor compatibility information for gVim 2021-12-06 15:34:31 +01:00
Nikita Prokopov 82936fc67e Fixed Fedora install instructions (closes #1319) 2021-12-04 14:04:38 +01:00
humzasiddiq2000 a3edab928e UPDATE download link 2021-12-03 23:24:14 +01:00
Nikita Prokopov 2927d174ff Fira Code v6.1 2021-12-03 17:52:29 +01:00
Nikita Prokopov bd4e557891 Fixed hinting settings to match Glyphs export #1315 2021-12-03 17:47:48 +01:00
Nikita Prokopov 8ff852e533 Stylistic sets showcases 2021-11-29 18:09:59 +01:00
Nikita Prokopov 4d5aaed215 Updated jsdelivr URLs 2021-11-29 17:02:58 +01:00
Nikita Prokopov fe7af86405 Fixed release link 2021-11-29 15:38:14 +01:00
Nikita Prokopov 47b8186471 6.0 Release 2021-11-29 15:28:48 +01:00
Nikita Prokopov aa68c08f1c Moved .= into cv32 #670 2021-11-29 15:25:58 +01:00
Nikita Prokopov 2cf5e1b3ed github release on tag 2021-11-29 15:14:10 +01:00
Nikita Prokopov 4bf6dfe4f3 Update README for v6 2021-11-29 15:13:54 +01:00
Nikita Prokopov 4905eb5151 github release on tag 2021-11-12 13:30:20 +00:00
Nikita Prokopov 776770e5f1 Update font version on CI 2021-11-12 13:30:20 +00:00
Andrew Archibald d172396be6 Fix missing script .sh extensions; add Docker build notes 2021-11-12 13:30:10 +00:00
Nikita Prokopov 650fd69b74 Fixed U+2242 Minus Tilde #1090 2021-11-06 00:49:55 +01:00
Nikita Prokopov 76de04fbb7 Added U+21AA Rightwards Arrow with Hook (closes #1307) 2021-11-05 23:48:05 +01:00
Nikita Prokopov aa9ea3dede Convert glyphs to 3.0.3 2021-11-05 23:34:36 +01:00
Nikita Prokopov fd5acad4fc Try CI in a Docker container tonsky/firacode:latest 2021-08-09 02:53:46 +02:00
Nikita Prokopov 6bf3854628 Removed binaries from git, fixed variable + Retina, added version to CI 2021-08-09 02:29:24 +02:00
Marco Bresciani f1f9767998
Add QOwnNotes as supported editor (#1261)
QOwnNotes is not a code editor but a plain-text file markdown note taking tool, and ligatures and Fira Code features are properly shown.
2021-06-29 14:56:11 +02:00
Nikita Prokopov 7d923625b4
Removed JetBrains from README (closes #1260) 2021-06-27 20:29:43 +02:00
Nikita Prokopov 0abda27a88
#1253 2021-06-11 20:35:50 +02:00
James Harris 4b1d987c65 docs: update editor compatibility for geany
Closes https://github.com/tonsky/FiraCode/issues/1252
2021-06-11 20:34:59 +02:00
Jeroendevr 4e040928e6 Update README.txt
Updated to work in latest brew versions. --cask command is outdated.
2021-05-12 00:44:57 +02:00
Joonas Niilola db85e7e6eb README.md: Add terminology to unsupported terminal list
Closes: #1236
2021-05-10 14:06:59 +02:00
Nikita Prokopov 6b13bc53d1 Added U+EE06..U+EE0B Circular progress indicator  #1182 2021-04-18 02:54:20 +02:00
Nikita Prokopov e5ee4115ba Alternative () cv31 (closes #1198) 2021-04-18 02:10:29 +02:00
Nikita Prokopov 7c879970f7 Added U+2237 Propotion (closes #1219) 2021-04-18 01:42:58 +02:00
Nikita Prokopov f7c77bff84 --- now makes a line (closes #1190) 2021-04-18 01:18:27 +02:00
Nikita Prokopov 75109548c8 Adjust |-| ligatures when cv30 is enabled (closes #1160) 2021-04-18 01:14:03 +02:00
Nikita Prokopov c5047ac007 Fixed weird look of ::< ::> <:: >:: #1145 2021-04-18 00:50:55 +02:00
Nikita Prokopov 1f0408bcb3 Removed cpsp, added strikeout position 2021-04-14 01:31:30 +02:00
Nikita Prokopov e9f9cd3b76 Added progress to showcases 2021-04-10 17:40:43 +02:00
Joshua Hamilton e7d9385716 Add CodeRunner and Nova to compatible editors
Nova just works, and CodeRunner has an option to enable ligatures.
2021-03-24 17:39:05 +01:00
Nikita Prokopov dbfa0defb0
Update README CSS import (closes #1220) 2021-03-24 17:38:36 +01:00
wiznillyp ef7c9b1593 Fixed formatting in Readme 2021-03-08 03:41:43 +01:00
wiznillyp c93367a0f7 Update README.md 2021-03-08 02:51:52 +01:00
Ikko Ashimine b029b9a2ef Fix typo in distr/README.txt
begining -> beginning
2021-03-05 12:27:43 +01:00
Andrew Archibald 9206171b31 Use Markdown links, add alt text for images not described by context 2021-02-19 00:34:41 +01:00
Andrew Archibald 888580a05a Use git-tagged version when packaging
`git describe --tags` returns a version string like '5.2-36-g15f7925'
when on commit g15f7925, which is 36 commits after the tag 5.2.
This is a more clear version when between releases.
2021-02-19 00:34:41 +01:00
Nikita Prokopov e2e526c971
Updated homebrew instructions #760 2021-02-18 14:37:54 +01:00
Matej Focko 15f7925625 Add GitHub Action for building
- Add script to bootstrap GitHub action
- Build fonts
- Upload directory with built fonts as artifacts

Signed-off-by: Matej Focko <me@mfocko.xyz>
2021-02-10 19:52:50 +01:00
Nikita Prokopov af5c3a45fa Added U+EE00..U+EE05 Progress Bar  (closes #1182) 2021-01-16 16:29:13 +01:00
Nikita Prokopov d42e5e4aaa
Update README.md 2021-01-05 13:06:04 +01:00
Gabriel Villela Noriega de Queiroz 415c773d6a Added U+FFFD Replacement Character (closes #1137) 2020-12-29 18:51:48 +01:00
Nikita Prokopov 3ff0138197
Reorganized terminal compatibility table #1164 2020-12-06 23:59:20 +01:00
Michael Vorburger ⛑️ bb660ca841 clarify Hyper Ligature support (currently broken)
see https://github.com/vercel/hyper/issues/3607
2020-12-06 23:32:26 +01:00
Michael Vorburger ⛑️ 1ef9f3a829 split Terminal compatibility list by Platform in README
https://github.com/railsware/upterm is removed, because deprecated (unmaintained).
2020-12-06 23:32:26 +01:00
cormullion 07666484a9 Update README.md
Add CotEditor (macOS, free from Mac App Store). Adding this because it's the best (free) text editing app on Mac as regards text handling.
2020-11-03 16:25:31 +01:00
Nikita Prokopov 4d385a806c Simplified ss06 code 2020-10-26 13:10:54 +01:00
Nikita Prokopov a0e08ea3f9 Mono Lisa affiliate link 2020-10-23 11:27:03 +02:00
Nikita Prokopov d6ffaa44f7 Added U+220E End of Proof (closes #1115) 2020-10-11 22:55:26 +02:00
Nikita Prokopov 28fb42cf1a Restored short | by default, long one moved to cv30 (closes #843) 2020-10-11 22:45:06 +02:00
Nikita Prokopov 92eb35ffac Added numbersign_braceleft.liga.cv29 #{ 2020-10-11 21:04:14 +02:00
Nikita Prokopov 94450a374d Hexagonal * cv16 #708 #1134 2020-10-11 01:11:57 +02:00
Nikita Prokopov acd502658b Returned {. .} as cv28 (closes #875) 2020-10-10 23:29:37 +02:00
Nikita Prokopov 00c09d322d Returned full ligatures for Fl Tl fi fj fl ft as ss10 2020-10-10 23:18:05 +02:00
Nikita Prokopov d1737c0c43 Added :- to cv26 (closes #790) 2020-10-10 23:02:05 +02:00
Nikita Prokopov b67c841c35 /= as not equals cv24 (closes #125) 2020-10-10 22:38:43 +02:00
Nikita Prokopov 89e0af072d C-style compound assignment >>= <<= ||= |= are not combined with equal sign by default. Old behavior is moved into ss09 (closes #974) 2020-10-10 22:30:01 +02:00
Nikita Prokopov df07894745 Moved .- into dlig #1103, added =< #34 2020-10-08 13:55:10 +02:00
Nikita Prokopov 20bd0e45c4 cv16 upper asterisk, cv17 upper tilde, cv18 alternative percent 2020-09-18 18:25:50 +02:00
Nikita Prokopov 3c6fe32a1d cv15 braces 2020-09-18 15:26:34 +02:00
Nikita Prokopov 0547175ddc
Update FUNDING.yml 2020-09-13 19:12:41 +02:00
Nikita Prokopov 1081fc9525 cv14 three variant 2020-09-06 21:39:26 +02:00
Nikita Prokopov ad21f017b6 cv11-cv13 zero variants 2020-09-06 21:19:32 +02:00
Nikita Prokopov 8143fbb009 cv03-cv10 i and l variants 2020-09-03 19:50:22 +02:00
Nikita Prokopov cda551a87c cv01 (single-storey a) and cv02 (single-storey g) 2020-09-01 15:43:23 +02:00
Nikita Prokopov 98774d8c05 Redrew U+27F0..U+27FF Supplemental Arrows-A to be strict monospace ⟲⟳⟴⟵⟶⟷⟸⟹⟺⟻⟼⟽⟾⟿ 2020-08-31 19:19:10 +02:00
Nikita Prokopov e2ae5061fd Added new enclosed characters from Unicode 13 U+0229C , U+1F10D 🄍, U+1F10E 🄎, U+1F10F 🄏, U+1F16D 🅭, U+1F16E 🅮, U+1F16F 🅯, U+1F1AD 🆭 (closes #1070) 2020-08-07 22:18:40 +02:00
Nikita Prokopov 0124c98e1f Added U+2241..U+224B ≁ ≂ ≃ ≄ ≅ ≆ ≇ ≉ ≊ ≋ (closes #1090) 2020-08-07 20:54:15 +02:00
Nikita Prokopov a2363fea8b Fixed height of U+2211 N-ARY SUMMATION (closes #1083) 2020-08-07 18:03:46 +02:00
Shen Huang 64c21a4213 Fixed connected lines, adjusted alignment 2020-07-28 21:08:36 +02:00
Bharat Patodi 1a60382d12 Made some grammatical changes
Minor grammatical changes
2020-07-14 13:04:48 +02:00
Tommy Wang f967f62036 Dockerize build 2020-06-17 22:13:23 +02:00
Nikita Prokopov 6fc75b41f9
Eclipse now works https://bugs.eclipse.org/bugs/show_bug.cgi?id=398656 2020-06-17 16:37:01 +02:00
Nikita Prokopov e367fa4871 bump package.json 2020-06-12 15:19:56 +02:00
Nikita Prokopov 8da49d55f8 Fixed hinting problems caused by build_ttf (closes #1075) 2020-06-12 15:18:38 +02:00
Nikita Prokopov 9fdb974361
closes #1077 2020-06-11 15:52:11 +02:00
Jiachen Yang 66ce8c3c57 Suggest to install ttf version in Arch Linux
The otf-fira-code package is just removed from Arch Linux community repo. ttf-fira-code is distributed from the start. 
Related #939
2020-06-11 15:51:16 +02:00
Nikita Prokopov 216c286f7a Fixed monospace property broken by adding threeemdash #1073 2020-06-10 22:20:11 +02:00
Nikita Prokopov 5cfaa1eacf fixed v5 in the picture 2020-06-08 16:35:26 +02:00
Nikita Prokopov 63c6434ab7 Fira Code v5 2020-06-08 16:10:00 +02:00
Nikita Prokopov 2a76d96b8d Added ss08 that adds gaps to == === != !== (closes #383) 2020-06-08 14:35:34 +02:00
Nikita Prokopov 8f0098bf23 Fixed U+27F8 U+27F9 U+27FA U+27FD U+27FE U+27FF that were broken in v4 (closes #1067) 2020-06-08 02:35:00 +02:00
Nikita Prokopov f95f930937 Added U+21B0..U+21B3 ↰↱↲↳, U+2770..U+2771 ❰❱ (closes #1032) 2020-06-08 02:17:09 +02:00
Nikita Prokopov 267a6fd221 Added //= =// =//= (closes #816) 2020-06-08 01:53:13 +02:00
Nikita Prokopov d41386567b Fixed STAT table in FiraCode-VF.ttf (closes #1054) 2020-06-08 01:04:36 +02:00
Nikita Prokopov 1471298321 Disable =/ because of conflicts with paths PATH=/... (closes #1056) 2020-06-07 23:49:39 +02:00
Nikita Prokopov 176cecd240 Make U+2388 Helm Symbol single-width (closes #1036) 2020-06-05 23:06:24 +02:00
Nikita Prokopov 5eb4ec07b3 Vertically-aligned colons, greater/less signs (closes #980, closes #1061) 2020-06-05 22:32:32 +02:00
Nikita Prokopov 35d2418440 Fixed arrows next to lowercase letters (closes #1049 closes #1059) 2020-06-05 21:28:13 +02:00
Nikita Prokopov 70827e8b7a Added U+2E3A 2-em dash , U+2E3B 3-em dash (closes #1019) 2020-06-05 16:47:11 +02:00
Nikita Prokopov e25f170874 Added U+2236 Ratio (closes #926) 2020-06-05 16:42:55 +02:00
Nikita Prokopov cb5ab83146 Fixed Box drawing diagonal lines U+2571 U+2572 U+2573 (closes #929) 2020-06-05 16:39:28 +02:00
strupo 1a76caac64 specimen.html: Use HTML entities for < and > 2020-05-20 16:22:48 +02:00
Nikita Prokopov 44560d352d Fixed typo (closes #1047) 2020-05-20 13:37:08 +02:00
Nikita Prokopov 9a9a100be1 typo (closes #1045) 2020-05-19 13:37:42 +02:00
Nikita Prokopov d42e7276fa Fira Code v4 2020-05-18 04:10:03 +02:00
Nikita Prokopov 5ef7ba1bf9 Bugs 2020-05-17 23:24:09 +02:00
Nikita Prokopov 06a7b3994d Introduced ligatures priorities 2020-05-16 04:22:24 +02:00
Nikita Prokopov cf2979c97b Numbersign sequences #1014 2020-05-15 16:16:30 +02:00
Nikita Prokopov 3e6f5d195d Fixed asciitilde-based arrows 2020-05-15 03:59:45 +02:00
Nikita Prokopov 524a28629b Catching bugs 2020-05-15 03:51:54 +02:00
Nikita Prokopov c1c62fd720 Arbitrary length underscores 2020-05-14 15:46:47 +02:00
Nikita Prokopov 6bb26fc5fc Disalbed >=< =< |||, added slash_start.darw slash_middle.darw slahs_end.darw colon_middle.darw exclam_middle.darw 2020-05-14 00:21:31 +02:00
Nikita Prokopov ace859529f Extracted other features and classes into separate files, fixed few ligatures conflicts with arrows 2020-05-13 22:52:46 +02:00
Hugo Locurcio 3843439a55 Mention that Godot doesn't support ligatures in the README 2020-05-13 17:26:55 +02:00
Nikita Prokopov 8cc5687a3a Equal-based arrows #346, substitute features from *.fea files 2020-05-13 01:42:49 +02:00
Nikita Prokopov 63292642c3 Middles for hyphen arrows #346 2020-05-11 03:38:37 +02:00
Nikita Prokopov 6c8a2839cd Bar and double bar endings for hyphen arrows #346 2020-05-11 02:41:12 +02:00
Nikita Prokopov e91e955626 Arbitrary-long hyphen arrows #346 2020-05-10 23:23:35 +02:00
Nikita Prokopov cbb7575e97 fixed commareversedabovecomb width 1201 2020-05-10 20:32:12 +02:00
Nikita Prokopov 19fd32dc95 Undid #995 and properly fixed U+04CB Ӌ, U+04CCӌ (closes #1001) and U+0449 щ (closes #1007). Fixed descender in U+040F Џ 2020-05-10 20:22:18 +02:00
Nikita Prokopov 7b0eec6a25 Undo #995 2020-05-10 20:22:18 +02:00
meased b282a970c2 Add st to supported terminals 2020-05-07 23:32:49 +02:00
Nikita Prokopov 9ff4b50cc4 Closed #1028 2020-05-07 19:32:33 +02:00
Haokang Den 532fba44b4 Add Xi Editor to the editor compatibility list 2020-04-18 19:22:42 +02:00
Nikita Prokopov e9943d2d63 Fira Code v3.1 2020-04-15 19:34:18 +02:00
Nikita Prokopov 6c5f328244 Fixed U+0314 COMBINING REVERSED COMMA ABOVE (closes #997) 2020-04-15 19:22:40 +02:00
Nikita Prokopov 00cfe69868 Fixed U+03F4 ϴ (closes #996) 2020-04-15 19:11:50 +02:00
Nikita Prokopov bd081655ed Fixed misplaced descenders on U+04B3 ҳ U+04CB Ӌ and U+04CCӌ (closed #995) 2020-04-15 19:05:50 +02:00
Nikita Prokopov 6d3758123c Fixed width of Germandbls, cornerbracketleft, cornerbracketleft, negativeAcknowledge-control, cornerbracketleft.half, cornerbracketright.half (closes #1000) 2020-04-15 18:51:08 +02:00
Shawn MacIntyre 86090f3f34 Updated README Browser Support to version 3
The README still pointed to version 2 in the Browser support section.
2020-04-13 15:49:54 +02:00
Nikita Prokopov 660cd379bc npm version bump 2020-04-09 19:18:10 +02:00
Nikita Prokopov 947ced5555 Fira Code v3 2020-04-09 18:59:53 +02:00
Nikita Prokopov 1d7e14a927 Disabled ligatures in progress bars [-> [--> [---> [=> [==> [===> (closes #968) 2020-04-09 15:09:06 +02:00
Nikita Prokopov 56a6ca30ec Added set letters U+2102 U+210D U+2115 U+2119 U+211A U+211D U+2124 and U+1D539 𝔹 (closes #841) 2020-04-09 02:37:58 +02:00
Nikita Prokopov 76a6d42b37 Removed ?: (closes #970) 2020-04-09 00:15:55 +02:00
Nikita Prokopov a5b9c80f7e Added missing set operations U+2200 U+2203..U+2205 ∃ ∄ ∅ U+2207 U+2282..U+228B ⊂ ⊃ ⊄ ⊅ ⊆ ⊇ ⊈ ⊉ ⊊ ⊋ U+2208..U+220# ∈ ∉ ∊ ∋ ∌ ∍ U+222A (closes #822) 2020-04-09 00:11:41 +02:00
Nikita Prokopov 115994e561 Added U+300C U+300D Corner brackets 「」 and U+FF62 U+FF63 Halfwidth Corner brackets 「」 (closes #940) 2020-04-08 20:27:44 +02:00
Nikita Prokopov d735c706f3 Added <<->> (closes #919) 2020-04-08 19:32:05 +02:00
Nikita Prokopov 308204e6fc Disabled fl Fl Tl ligatures, adjusted l height in combination with [F T I f] instead (closes #902) 2020-04-08 19:24:49 +02:00
Nikita Prokopov ab95accd39 Added U+25A4..25A9 Squares with fill ▤▥▦▧▨▩ (closes #450) 2020-04-06 17:02:54 +02:00
Nikita Prokopov da0b8dc46d Slightly tuned multiple ampersands in ss03 (closes #831) 2020-04-06 15:44:42 +02:00
Nikita Prokopov 8c676a6fa3 Fixed horizontal bar height in <!-- (closes #917) 2020-04-06 02:35:57 +02:00
Nikita Prokopov 2d42d9dc35 Fixed multiply sign in 0xFF and 10x10 with combination of onum and zero (closes #888) 2020-04-06 02:26:48 +02:00
Nikita Prokopov 6e08517ea3 Fixed dollar sign in <$ $> <$> when ss04 is active (closes #830) 2020-04-06 01:47:53 +02:00
Nikita Prokopov d8eef5821f Added =~ and !~ to ss07 (closes #293) 2020-04-06 01:00:03 +02:00
Nikita Prokopov b844f9f95a Removed ~= (closes #381) 2020-04-06 00:35:06 +02:00
Nikita Prokopov f696c47339 Re-added ..= with just a subtle spacing adjustment (closes #934) 2020-04-06 00:17:16 +02:00
Nikita Prokopov 42d2f7a89d Added U+2630..U+2637 ☰☱☲☳☴☵☶☷ (Bagua trigrams) (closes #859) 2020-04-06 00:04:20 +02:00
Nikita Prokopov f51adc1a59 Disabled <?= (?= after <) (closes #850) 2020-04-05 23:35:17 +02:00
Nikita Prokopov 2a88d87bd5 Added SemiBold weight (closes #987) 2020-04-05 23:25:07 +02:00
Nikita Prokopov 84f8fa6b9c LIG -> *.spacer 2020-03-24 00:37:50 +01:00
Nikita Prokopov 553fce5740
Update README.md 2020-03-23 17:59:11 +01:00
JC 682ce915cd add github sponsor 2020-03-20 23:06:59 +01:00
Nikita Prokopov bf8e49702b
Add UltraEdit to unsupported list (closes #979) 2020-03-19 23:11:11 +01:00
秋纫 1134dfad0e It seems that MATLAB does not support ligatures 2020-03-18 12:31:14 +01:00
Arun 595bc3d40a Added JetBrains Mono to alternatives 2020-03-17 17:25:38 +01:00
Druhin Tarafder df6d08ea78
[ImgBot] Optimize images (#964)
*Total -- 2,933.84kb -> 1,897.69kb (35.32%)

/googlefonts-qa/notes/assets/2019-03-28-14-50-52.png -- 38.75kb -> 13.06kb (66.31%)
/googlefonts-qa/notes/assets/2019-03-28-14-51-33.png -- 34.91kb -> 11.91kb (65.88%)
/googlefonts-qa/notes/assets/2019-03-28-15-00-56.png -- 46.90kb -> 16.74kb (64.32%)
/showcases/all_ligatures.png -- 301.00kb -> 122.76kb (59.22%)
/fira_code_patreon.png -- 41.59kb -> 17.17kb (58.71%)
/googlefonts-qa/notes/assets/2019-03-28-14-52-48.png -- 21.88kb -> 9.40kb (57.03%)
/showcases/clojure.png -- 45.40kb -> 19.76kb (56.47%)
/showcases/swift.png -- 44.94kb -> 19.73kb (56.1%)
/googlefonts-qa/notes/assets/2019-03-27-13-47-09.png -- 19.22kb -> 8.44kb (56.1%)
/googlefonts-qa/notes/assets/2019-03-28-14-51-48.png -- 20.35kb -> 9.03kb (55.64%)
/showcases/erlang.png -- 34.56kb -> 15.33kb (55.62%)
/showcases/elixir.png -- 68.45kb -> 30.44kb (55.54%)
/googlefonts-qa/notes/assets/2019-03-28-14-58-50.png -- 21.90kb -> 9.84kb (55.09%)
/showcases/go.png -- 34.87kb -> 15.72kb (54.92%)
/googlefonts-qa/notes/assets/2019-03-27-13-47-20.png -- 18.38kb -> 8.32kb (54.73%)
/showcases/livescript.png -- 27.09kb -> 12.32kb (54.53%)
/showcases/php.png -- 42.92kb -> 19.67kb (54.18%)
/showcases/javascript.png -- 71.18kb -> 33.04kb (53.58%)
/showcases/ruby.png -- 48.00kb -> 22.53kb (53.07%)
/showcases/stylistic_sets.png -- 70.38kb -> 33.75kb (52.05%)
/googlefonts-qa/notes/assets/2019-03-28-14-24-45.png -- 15.36kb -> 7.56kb (50.77%)
/showcases/feature_calt_centering.png -- 66.51kb -> 36.21kb (45.56%)
/googlefonts-qa/notes/assets/2019-03-27-13-41-12.png -- 10.13kb -> 6.00kb (40.76%)
/googlefonts-qa/notes/assets/2019-03-27-13-50-55.png -- 45.71kb -> 31.51kb (31.06%)
/googlefonts-qa/notes/assets/2019-03-27-13-38-30.png -- 17.42kb -> 12.22kb (29.84%)
/googlefonts-qa/notes/assets/2019-03-28-13-56-45.png -- 39.61kb -> 27.82kb (29.77%)
/googlefonts-qa/notes/assets/2019-03-27-13-39-56.png -- 27.76kb -> 19.91kb (28.27%)
/googlefonts-qa/notes/assets/2019-03-28-13-51-49.png -- 32.01kb -> 22.96kb (28.26%)
/googlefonts-qa/notes/assets/2019-03-28-13-50-54.png -- 45.29kb -> 32.74kb (27.71%)
/googlefonts-qa/notes/assets/2019-03-28-13-51-24.png -- 45.29kb -> 32.74kb (27.71%)
/googlefonts-qa/notes/assets/2019-03-27-13-51-17.png -- 44.18kb -> 31.97kb (27.63%)
/googlefonts-qa/notes/assets/2019-03-28-14-13-00.png -- 30.60kb -> 22.31kb (27.07%)
/googlefonts-qa/notes/assets/2019-03-28-13-50-14.png -- 47.49kb -> 34.70kb (26.95%)
/googlefonts-qa/notes/assets/2019-03-28-13-49-19.png -- 45.97kb -> 34.06kb (25.9%)
/googlefonts-qa/notes/assets/2019-03-28-15-00-36.png -- 93.45kb -> 69.56kb (25.57%)
/googlefonts-qa/notes/assets/2019-03-28-14-56-24.png -- 54.86kb -> 41.05kb (25.17%)
/googlefonts-qa/notes/assets/2019-03-28-14-54-14.png -- 21.56kb -> 16.18kb (24.96%)
/googlefonts-qa/notes/assets/2019-03-28-13-53-22.png -- 67.89kb -> 51.20kb (24.59%)
/googlefonts-qa/notes/assets/2019-03-28-14-56-15.png -- 52.44kb -> 39.59kb (24.49%)
/googlefonts-qa/notes/assets/2019-03-28-14-21-39.png -- 51.49kb -> 39.30kb (23.68%)
/googlefonts-qa/notes/assets/2019-03-28-14-20-11.png -- 61.41kb -> 46.96kb (23.53%)
/googlefonts-qa/notes/assets/2019-03-28-14-53-56.png -- 21.29kb -> 16.29kb (23.47%)
/googlefonts-qa/notes/assets/2019-03-27-13-46-21.png -- 30.67kb -> 23.65kb (22.89%)
/googlefonts-qa/notes/assets/2019-03-27-13-35-37.png -- 47.29kb -> 36.53kb (22.74%)
/googlefonts-qa/notes/assets/2019-03-28-13-58-57.png -- 36.03kb -> 28.16kb (21.83%)
/googlefonts-qa/notes/assets/2019-03-28-13-44-06.png -- 50.85kb -> 39.76kb (21.81%)
/googlefonts-qa/notes/assets/2019-03-27-13-52-23.png -- 28.85kb -> 22.63kb (21.54%)
/googlefonts-qa/notes/assets/2019-03-28-14-18-46.png -- 58.46kb -> 46.00kb (21.32%)
/googlefonts-qa/notes/assets/2019-03-28-13-58-48.png -- 36.92kb -> 29.22kb (20.87%)
/googlefonts-qa/notes/assets/2019-03-27-13-48-03.png -- 35.00kb -> 27.87kb (20.36%)
/googlefonts-qa/notes/assets/2019-03-28-13-39-03.png -- 23.78kb -> 18.98kb (20.16%)
/googlefonts-qa/notes/assets/2019-03-28-13-48-15.png -- 31.81kb -> 25.40kb (20.14%)
/googlefonts-qa/notes/assets/2019-03-28-14-11-13.png -- 56.72kb -> 45.33kb (20.07%)
/googlefonts-qa/notes/assets/2019-03-28-14-04-50.png -- 46.60kb -> 37.32kb (19.92%)
/googlefonts-qa/notes/assets/2019-03-28-14-17-52.png -- 69.54kb -> 55.69kb (19.91%)
/googlefonts-qa/notes/assets/2019-03-28-14-13-32.png -- 49.96kb -> 40.49kb (18.96%)
/googlefonts-qa/notes/assets/2019-03-27-13-53-17.png -- 26.72kb -> 21.69kb (18.82%)
/googlefonts-qa/notes/assets/2019-03-28-13-41-49.png -- 42.56kb -> 34.73kb (18.41%)
/googlefonts-qa/notes/assets/2019-03-28-14-01-13.png -- 41.62kb -> 34.00kb (18.31%)
/googlefonts-qa/notes/assets/2019-03-28-13-42-04.png -- 29.72kb -> 24.95kb (16.05%)
/googlefonts-qa/notes/assets/2019-03-28-14-10-07.png -- 22.53kb -> 19.49kb (13.48%)
/googlefonts-qa/notes/assets/2019-03-28-13-47-00.png -- 19.25kb -> 16.80kb (12.72%)
/googlefonts-qa/notes/assets/2019-03-28-13-40-08.png -- 26.67kb -> 23.28kb (12.71%)
/googlefonts-qa/notes/assets/2019-03-27-13-40-23.png -- 14.16kb -> 12.41kb (12.39%)
/googlefonts-qa/notes/assets/2019-03-28-14-03-53.png -- 37.22kb -> 32.66kb (12.25%)
/googlefonts-qa/notes/assets/2019-03-28-14-25-49.png -- 24.21kb -> 22.83kb (5.74%)
/showcases/fira_code_logo.svg -- 56.30kb -> 56.01kb (0.52%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>

Co-authored-by: ImgBotApp <ImgBotHelp@gmail.com>
2020-03-06 11:56:32 +01:00
drify e90ff380bf Clarify browser support
Edge Chromium does not require this!
2020-02-08 20:49:50 +01:00
Nikita Prokopov cf377496bf Typo (closes #921) 2019-12-27 00:45:54 +01:00
Nikita Prokopov 64efc49dc3
Added Notepad3 (closes #891) 2019-11-15 13:32:53 +01:00
Håkan Canberger fd43cfe61d Turn "Stylistic sets" into a heading
This makes it possible to link to this using `#stylistic-sets`
2019-11-13 13:15:33 +01:00
Nikita Prokopov 5ee2653d58 Geany on Windows is not supported (closes #881) 2019-11-04 14:45:41 +01:00
Mathieu Hendey b40428e6ad Fix macOS installation instructions
Brew tap font cask instruction was wrong.
2019-10-24 12:41:55 +02:00
Nikita Prokopov 0e1a03575e Reformatted HowToInstall to TXT instead of Markdown (closes #868 closes #716) 2019-10-20 19:41:38 +02:00
drify 26b564eca4 Add an example: using the variable font in CSS
See [Implementing a variable font with fallback web fonts](https://www.zeichenschatz.net/typografie/implementing-a-variable-font-with-fallback-web-fonts.html) for why this syntax
2019-10-18 12:39:06 +02:00
drify 11137f8079 Make font-feature-settings syntax a little shorter
According to the [spec](https://drafts.csswg.org/css-fonts-3/#propdef-font-feature-settings), they mean the same.
> If the value is omitted, a value of 1 is assumed. 

Tested on IE 10, IE 11 and Edge with no problem.
2019-10-18 12:36:10 +02:00
ExE Boss 309719815c docs(readme): Add “Cascadia Code” 2019-10-04 12:09:40 +02:00
Nikita Prokopov a000f6e593 add npm publish to release script 2019-09-10 13:16:11 +03:00
Nikita Prokopov b7d85a16ac bump package.json 2019-09-10 13:10:51 +03:00
247 changed files with 50874 additions and 30158 deletions

3
.github/FUNDING.yml vendored
View file

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

27
.github/workflows/build.yml vendored Normal file
View file

@ -0,0 +1,27 @@
on:
push:
branches:
- '*'
tags:
- '[0-9]+.[0-9]+'
paths:
- '.github/workflows/**'
- 'FiraCode.glyphs'
- 'script/**'
jobs:
build:
runs-on: ubuntu-latest
container: tonsky/firacode:latest
steps:
- uses: actions/checkout@v3
- if: startsWith(github.ref, 'refs/tags/')
run: python3 ./script/update_version.py
- run: ./script/build.sh
- run: echo "hash=$(git rev-parse --short $GITHUB_SHA)" >> $GITHUB_ENV
- uses: actions/upload-artifact@v3
with:
name: Fira_Code_${{ env.hash }}
path: distr
- if: startsWith(github.ref, 'refs/tags/')
run: python3 ./script/release.py

15
.gitignore vendored
View file

@ -1,12 +1,19 @@
*.zip
FiraCode_liga.glyphs
FiraCode_mess.glyphs
target
clojure/*.edn
FiraCode\ (Autosaved).glyphs
.cpcache
.repl-port
master_ufo
instance_ufo
venv
.DS_Store
*.numbers
*.numbers
distr/*/
*.glyphs
!FiraCode.glyphs
.idea
.fleet
*.iml

View file

@ -7,4 +7,4 @@
Mozilla Foundation (https://www.mozilla.org/en-US/contact/)
Telefonica S.A.
Nikita Prokopov (prokopov@gmail.com) github.com/tonsky
Nikita Prokopov (niki@tonsky.me) github.com/tonsky

View file

@ -2,10 +2,140 @@
All notable changes to this project will be documented in this file.
### 7.0
- Fixed overlap in U+2573 #1414
### 6.2
- Fixed monospaced property #1325
### 6.1
- Fixed hinting settings to match Glyphs export #1315
### 6.0
Unicode:
- Fixed height of `∑` U+2211 N-ARY SUMMATION #1083
- Added U+2241..U+224B `≁ ≂ ≃ ≄ ≅ ≆ ≇ ≉ ≊ ≋` #1090
- Added new enclosed characters from Unicode 13 U+0229C `⊜`, U+1F10D `🄍`, U+1F10E `🄎`, U+1F10F `🄏`, U+1F16D `🅭`, U+1F16E `🅮`, U+1F16F `🅯`, U+1F1AD `🆭` #1070
- Redrew U+27F0..U+27FF Supplemental Arrows-A to be strict monospace `⟲⟳⟴⟵⟶⟷⟸⟹⟺⟻⟼⟽⟾⟿` #1109 #1123
- Added U+220E End of Proof `∎` #1115
- Added U+FFFD Replacement Character `<60>` #1137, thanks @gjvnq
- Added U+EE00..U+EE0B Progress Bar `` #1182
- Added U+2237 Proportion `∷` #1219
- Added U+21AA Rightwards Arrow with Hook `↪` #1307
Changed:
- Fixed weird look of `::<` `::>` `<::` `>::` #1145
- `---` now makes a line #1190
Removed:
- C-style compound assignment `>>=` `<<=` `||=` `|=` are not combined with equal sign by default. Old behavior is moved into `ss09` #974
- Restored short `|` by default, long one moved to `cv30` #843 #1160
- Moved `.-` into `cv25` #670 #860 #1103
- Moved `.=` into `cv32` #670
- Removed named “Retina” instance from FiraCode-VF.ttf (you can still get it by setting `wght=450`) #1318
Added (variants):
- Alternative `a` `cv01` #949
- Alternative `g` `cv02` #886
- Alternative `i` `cv03`-`cv06`
- Alternative `l` `cv07`-`cv10` #899
- Alternative `0` `cv11`-`cv13`
- Alternative `3` `cv14`
- Top-aligned `*` `cv15`
- Hexagonal `*` `cv16` #708 #1134
- Top-aligned `~` `cv17`
- Alternative `%` `cv18`
- `<=` with a horizontal bar `cv19`
- `<=` as an arrow `cv20` #34 #696 #858
- `=<` as less than or equal `cv21` #34
- `=<` as less than or equal with horizontal bar `cv22` #34
- `>=` with a horizontal bar `cv23`
- `/=` as not equals `cv24` #125
- Added `:-` to `cv26` #790
- Returned `[]` as `cv27`
- Returned `{. .}` as `cv28` #875 #635 #409 #279 #264 #214
- Alternative `{}` `cv29`
- Returned full ligatures for `Fl` `Tl` `fi` `fj` `fl` `ft` as `ss10`
- Alternative `()` `cv31` #1198
#### 5.2 (June 12, 2020)
- Fixed hinting problems caused by build_ttf #1075
#### 5.1 (June 10, 2020)
- Fixed monospace property broken by adding threeemdash #1073
#### 5.0 (June 8, 2020)
- Fixed Box drawing diagonal lines U+2571 `` U+2572 `╲` U+2573 `` #929
- Added U+2236 Ratio `` #926
- Added U+2E3A 2-em dash `⸺`, U+2E3B 3-em dash `⸻` #1019
- Fixed arrows next to lowercase letters #1049 #1059
- Vertically-aligned colons, greater/less signs #980 #1061
- Make U+2388 Helm Symbol `⎈` single-width #1036
- Disable `=/` because of conflicts with paths `PATH=/...` #1056
- Fixed STAT table in FiraCode-VF.ttf #770 #1054
- Added `//=` `=//` `=//=` #816
- Added U+21B0..U+21B3 `↰ ↱ ↲ ↳`, U+2770..U+2771 `❰ ❱` #1032
- Fixed U+27F8 `⟸` U+27F9 `⟹` U+27FA `⟺` U+27FD `⟽` U+27FE `⟾` U+27FF `⟿` that were broken in v4 #1067
- Added `ss08` that adds gaps to `==` `===` `!=` `!==` #187 #383
- Removed OTF from distr to avoid confusion #939
#### 4.0 (May 18, 2020)
Removed 44 individual arrow ligatures, replaced with four universal, combinative substitutions. 100-150% faster shaping performance, infinite amount of arrow combinations.
- Arbitrary-long combinative hyphen-based arrows #346 #494 #713 #826 #968 #983 #1029
- Arbitrary-long combinative equal-based arrows #229 #234 #346 #494 #698 #826 #919 #931 #946 #948 #968 #1016 #1018 #1022
- Arbitrary-long underscores #120 #269 #346 #494
- Arbitrary-long numbersign sequences #1014
- Fixed descender in U+040F `Џ`
- Undid #995 and properly fixed U+04CB `Ӌ`, U+04CC `ӌ` #1001 and U+0449 `щ` #1007
- Added `|||` to prevent partial ligatures in `|||-|||` `|||=|||` #346
#### 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 `╰` [#702] [#714] [#725]
- 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 `╌╍╎╏`
@ -29,7 +159,7 @@ All notable changes to this project will be documented in this file.
- 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 [#552] [#798])
- 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) `↩`
@ -57,7 +187,7 @@ All notable changes to this project will be documented in this file.
- Alternatives (stylistic sets):
- Lowercase `r` (ss01) [#601]
- Less than/greater than `<=` `>=` (ss02) [#263] [#617]
- Ampersand `&` (ss03) [#617]
- Ampersand `&` (ss03) [#371] [#617]
- Dollar sign `$` (ss04) [#617]
- At sign `@` (ss05) [#617] [#748] [#817]
- Thin backslash (ss06) [#577 #720 #825]
@ -126,7 +256,7 @@ All notable changes to this project will be documented in this file.
#### 1.200 (July 18, 2016)
- Removed `!!!` `???` `;;;` `&&&` `|||` `=~` ([#167]) `~~~` `%%%`
- 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])
@ -139,7 +269,7 @@ All notable changes to this project will be documented in this file.
#### 1.102
- Support for IntelliJ-based IDEs ([instructions](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions))
- Support for IntelliJ-based IDEs ([instructions](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions))
- Turned on autohinting
#### 1.101

9
Dockerfile Normal file
View file

@ -0,0 +1,9 @@
FROM python:3
WORKDIR /opt
RUN pip install --upgrade Pillow==5.4.1 idna==2.8 requests==2.21.0 urllib3==1.24.1 pycairo==1.20.1 gftools==0.7.4 fontmake==2.4.0 fontbakery==0.8.0
RUN apt-get update && \
apt-get install -y ttfautohint && \
apt-get install -y woff2 && \
apt-get install -y sfnt2woff-zopfli

File diff suppressed because one or more lines are too long

240
LEEME.md Normal file
View file

@ -0,0 +1,240 @@
## Fira Code: la fuente monoespaciada con ligaduras gratuita para programación
![Fira Code](./extras/logo.svg)
Leer en [English](./README.md) | [简体中文](./README_CN.md) | [日本語](./README_JA.md)
### El problema
Los programadores usamos muchos símbolos, frecuentemente codificados con varios caracteres. Para el cerebro humano, sucesiones como `->`, `<=` o `:=` son unidades lógicas individuales, incluso si requieren dos o más caracteres en pantalla. Nuestros ojos utilizan una cantidad no nula de energía para leer, analizar y unir caracteres mútiples en una sola unidad lógica. Idealmente, todos los lenguajes de programación deberían estar diseñados para representar los operadores con símbolos Unicode; pero ese no es el caso aún.
### La solución
Fira Code es una fuente monoespaciada gratuita que contiene ligaduras para combinaciones multicaracter comunes en programación. Esta es simplemente una característica del renderizado de la fuente: el código subyacente permanece compatible con el estándar ASCII. Esto ayuda a leer y comprender más rápido el código. Para algunas sucesiones comunes, como `..` o `//`, las ligaduras nos permiten hacer correcciones en el espaciado.
### Descarga e instalación
<a href="https://github.com/tonsky/FiraCode/releases/download/6.2/Fira_Code_v6.2.zip"><img alt="Fira_Code_v6.2.zip - Diciembre 6 de 2021 - 2.5 MB" src="./extras/download_es.png" width="520" height="130"></a>
Recursos adicionales (en inglés):
- [Cómo instalar](https://github.com/tonsky/FiraCode/wiki)
- [Resolución de problemas](https://github.com/tonsky/FiraCode/wiki#troubleshooting)
- [Noticias e información](https://twitter.com/FiraCode)
### Contribuyendo
<a href="https://github.com/sponsors/tonsky" target="_blank"><img alt="Contribuye" src="./extras/sponsor_es.png"></a>
Fira Code es un proyecto personal desarrollado en mi tiempo libre, sin financiamiento y con una enorme [lista de solicitudes](https://github.com/tonsky/FiraCode/issues). Si el resultado es de tu agrado, por favor considera apoyar a su desarrollo por medio de [GitHub Sponsors](https://github.com/sponsors/tonsky) o [Patreon](https://patreon.com/tonsky). ¡Cualquier ayuda cuenta!
### ¿Qué ofrece?
Izquierda: ligaduras renderizadas en Fira Code. Derecha: las mismas secuencias de caracteres sin ligaduras.
<img src="./extras/ligatures_es.png" width="812" height="1326">
Fira Code viene con una gran variedad de flechas. Mejor aun, ¡estas pueden hacerse tan largas como se desee y se pueden combinar los fragmentos incial/medio/final de la forma que se quiera!
<img src="./extras/arrows_es.png" width="754" height="799">
Fira Code no solo se trata de las ligaduras. Algunos ajustes se han hecho a la puntuación y a pares de letras frecuentes.
<img src="./extras/typographics_es.png" width="754" height="649">
Fira Code viene con algunas variantes de caracteres, de manera que cada uno puede escoger lo que mejor le convenga. [Cómo activar (en inglés)](https://github.com/tonsky/FiraCode/wiki/How-to-enable-stylistic-sets)
<img src="./extras/character_variants_es.png" width="754" height="391">
Algunas ligaduras pueden alterarse o activarse usando conjuntos estilísticos/variantes de caracteres:
<img src="./extras/ligature_variants_es.png" width="754" height="561">
Siendo una fuente para programación, Fira Code tiene un soporte fantástico para dibujos ASCII/de cajas, powerline y otras formas de interfaz de usuario para terminal:
<img src="./extras/console_es.png" width="754" height="459">
Fira Code es la primera fuente para programación en ofrecer glifos dedicados al dibujo de barras de progreso:
<img src="./extras/progress.png" width="754" height="282">
En acción:
<img src="./extras/progress_es.gif" width="594" height="181">
Esperamos que más fuentes adopten esta convención y definan sus propias versiones.
La covertura del estándar Unicode hace de Fira Code una gran elección para la escritura matemática:
<img src="./extras/math_es.png" width="754" height="323">
### ¿Cómo luce?
<img src="./extras/samples.png" width="754" height="1068">
<img src="./extras/samples2.png" width="754" height="1257">
### Lista de compatibilidad con editores
| Funciona | No funciona |
|----------|-------------|
| **Abricotine** | **Arduino IDE** |
| **Android Studio** (2.3+, [instrucciones](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) | **Adobe Dreamweaver** |
| **Anjuta** (excepto con EOF) | **Delphi IDE** |
| **AppCode** (2016.2+, [instrucciones](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) | **Emacs** por sí solo ([solución alternativa](https://github.com/tonsky/FiraCode/wiki/Emacs-instructions)) |
| **Atom** 1.1 o más nuevo ([instrucciones](https://github.com/tonsky/FiraCode/wiki/Atom-instructions)) | **Godot** ([reporte](https://github.com/godotengine/godot/issues/9961)) |
| **BBEdit** (14.6+, [instrucciones](https://github.com/tonsky/FiraCode/wiki/BBEdit-instructions)) | **IDLE** |
| **Brackets** (con [este plugin](https://github.com/polo2ro/firacode-in-brackets)) | **KDevelop 4** |
| **Chocolat** | **Monkey Studio IDE** |
| **CLion** (2016.2+, [instrucciones](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) | **UltraEdit** |
| **Cloud9** ([instrucciones](https://github.com/tonsky/FiraCode/wiki/Cloud9-Instructions)) |
| **Coda 2** |
| **CodeLite** |
| **CodeRunner** |
| **CotEditor** |
| **Eclipse** |
| **elementary Code** |
| **Geany** (1.37+) |
| **gEdit / Pluma** |
| **GNOME Builder** |
| **GoormIDE** ([instrucciones](https://github.com/tonsky/FiraCode/wiki/GoormIDE-Instructions)) |
| **gVim** ([Windows](https://github.com/tonsky/FiraCode/issues/462), [GTK](https://vimhelp.org/options.txt.html#%27guiligatures%27)) |
| **IntelliJ IDEA** (2016.2+, [instrucciones](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) |
| **Kate, KWrite** |
| **KDevelop 5+** |
| **Komodo** |
| **Leafpad** |
| **LibreOffice** |
| **LightTable** ([instrucciones](https://github.com/tonsky/FiraCode/wiki/LightTable-instructions)) |
| **LINQPad** |
| **MacVim** 7.4 o más nuevo ([instrucciones](https://github.com/tonsky/FiraCode/wiki/MacVim-instructions)) |
| **Mancy** |
| **MATLAB** ([instrucciones](https://github.com/tonsky/FiraCode/wiki/MATLAB-for-Windows-Instructions)) |
| **Meld** |
| **Mousepad** |
| **NeoVim-gtk** |
| **NetBeans** |
| **Notepad** (Windows) |
| **Notepad++** (con una [solución alternativa](https://github.com/notepad-plus-plus/notepad-plus-plus/issues/2287#issuecomment-256638098)) |
| **Notepad3** ([instrucciones](https://github.com/rizonesoft/Notepad3/issues/361#issuecomment-365977420))|
| **Nova** |
| **PhpStorm** (2016.2+, [instrucciones](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) |
| **PyCharm** (2016.2+, [instrucciones](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) |
| **QOwnNotes** (21.16.6+) |
| **QtCreator** |
| **Rider** |
| **RStudio** ([instrucciones](https://github.com/tonsky/FiraCode/wiki/RStudio-instructions)) |
| **RubyMine** (2016.2+, [instrucciones](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) |
| **Scratch** |
| **Scribus** (1.5.3+) |
| **SublimeText** (3146+) |
| **Spyder IDE** (solamente con Qt5) |
| **SuperCollider 3** |
| **TeXShop** |
| **TextAdept** (Linux, macOS) |
| **TextEdit** |
| **TextMate 2** |
| **VimR** ([instrucciones](https://github.com/qvacua/vimr/wiki#ligatures)) |
| **Visual Studio** (2015+, [instrucciones](https://github.com/tonsky/FiraCode/wiki/Visual-Studio-Instructions)) |
| **Visual Studio Code** ([instrucciones](https://github.com/tonsky/FiraCode/wiki/VS-Code-Instructions)) |
| **WebStorm** (2016.2+, [instrucciones](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) |
| **Xamarin Studio/Monodevelop** |
| **Xcode** (8.0+, alternativamente con [este plugin](https://github.com/robertvojta/LigatureXcodePlugin)) |
| **Xi** |
| Probablemente: **Smultron, Vico** | En duda: **Code::Blocks IDE** |
### Lista de compatibilidad con terminales
| Plataforma | Funciona | No funciona |
|----------------|----------|-------------|
| macOS | Hyper (ver [#3607](https://github.com/vercel/hyper/issues/3607))<br>iTerm 2<br>Kitty<br>Terminal.app<br>ZOC | Alacritty |
| Windows | Hyper (ver [#3607](https://github.com/vercel/hyper/issues/3607))<br>Mintty<br>Token2Shell<br>Windows Terminal | Alacritty<br>Cmder<br>ConEmu<br>PuTTY<br>Windows Console<br>ZOC |
| Linux | Hyper (ver [#3607](https://github.com/vercel/hyper/issues/3607))<br>Kitty<br>Konsole<br>QTerminal<br>Termux<br>st ([parche](https://st.suckless.org/patches/ligatures/)) | Alacritty<br>GNOME Terminal<br>Terminales basadas en libvte ([reporte](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)): <ul><li>gtkterm<li>guake<li>LXTerminal<li> sakura<li>Terminator<li>xfce4-terminal</ul>mate-terminal<br>rxvt<br>terminology<br>xterm
| ChromeOS | crosh ([instrucciones](https://github.com/tonsky/FiraCode/wiki/ChromeOS-Terminal)) | |
### Soporte en el navegador web
```html
<!-- HTML -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/firacode@6.2.0/distr/fira_code.css">
```
```css
/* CSS */
@import url(https://cdn.jsdelivr.net/npm/firacode@6.2.0/distr/fira_code.css);
```
```css
/* Especificar en el CSS */
code { font-family: 'Fira Code', monospace; }
@supports (font-variation-settings: normal) {
code { font-family: 'Fira Code VF', monospace; }
}
```
- IE 10+, Edge Legacy: activar con `font-feature-settings: "calt";`
- Firefox
- Safari
- Navegadores basados en Chromium (Chrome, Opera)
- ACE
- CodeMirror (activar con `font-variant-ligatures: contextual;`)
### Proyectos que usan Fira Code
- [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/)
### Alternativas
Fuentes monoespaciadas con ligaduras gratuitas:
- [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)
Fuentes monoespaciadas con ligaduras no gratuitas:
- [PragmataPro](http://www.fsd.it/fonts/pragmatapro.htm)
- [Mono Lisa](https://www.monolisa.dev/)
### Compilando Fira Code localmente
En caso que se quiera modificar el código en FiraCode.glyphs y compilar archivos OTF/TTF/WOFF propios, estas son las instrucciones que uso en macOS:
```bash
# instalar las herramientas requeridas para la compilación
./script/bootstrap_macos.sh
# compilar los archivos de la fuente
./script/build.sh
# instalar los OTFs en ~/Library/Fonts
cp distr/otf/*.otf ~/Library/Fonts
```
Alternativamnete, se puede compilar Fira Code usando Docker:
```bash
# instalar las dependencias en un contenedor y compilar los archivos de la fuente
make
# comprimir los archivos de la fuente en dist/ a un zip
make package
```
### Créditos
- Autor: Nikita Prokopov [@nikitonsky](https://twitter.com/nikitonsky)
- Basado en: [Fira Mono](https://github.com/mozilla/Fira)
- Inspirado por: [Hasklig](https://github.com/i-tu/Hasklig)

7
Makefile Normal file
View file

@ -0,0 +1,7 @@
all: build
build:
docker run --rm -v ${PWD}:/opt tonsky/firacode:latest ./script/build.sh
package:
./script/package.sh

256
README.md
View file

@ -1,6 +1,8 @@
## Fira Code: monospaced font with programming ligatures
## Fira Code: free monospaced font with programming ligatures
<img src="./showcases/fira_code_logo.svg">
![Fira Code](./extras/logo.svg)
Read in [Español](./LEEME.md) | [简体中文](./README_CN.md) | [日本語](./README_JA.md)
### Problem
@ -8,101 +10,112 @@ Programmers use a lot of symbols, often encoded with several characters. For the
### Solution
#### [Download v.2](https://github.com/tonsky/FiraCode/releases/download/2/FiraCode_2.zip) · [How to install](https://github.com/tonsky/FiraCode/wiki) · [Troubleshooting](https://github.com/tonsky/FiraCode/wiki#troubleshooting) · [News & updates](https://twitter.com/FiraCode)
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.
<a href="https://patreon.com/tonsky" target="_blank"><img src="./fira_code_patreon.png"></a>
### Download & Install
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 `..` or `//`, ligatures allow us to correct spacing.
<a href="https://github.com/tonsky/FiraCode/releases/download/6.2/Fira_Code_v6.2.zip"><img alt="Fira_Code_v6.2.zip - December 6, 2021 - 2.5 MB" src="./extras/download.png" width="520"></a>
<img src="./showcases/all_ligatures.png">
Then:
### Code examples
- [How to Install](https://github.com/tonsky/FiraCode/wiki)
- [Troubleshooting](https://github.com/tonsky/FiraCode/wiki#troubleshooting)
- [News & Updates](https://twitter.com/FiraCode)
Ruby:
### Sponsors
<img src="./showcases/ruby.png">
Fira Code is a personal, free-time project with no funding and a 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!
JavaScript:
Huge thanks to:
<img src="./showcases/javascript.png">
<table>
<td align="center">
<a href="https://workos.com/?utm_campaign=github_repo&utm_medium=referral&utm_content=firacode&utm_source=github">
<div>
<img src="https://user-images.githubusercontent.com/629429/151508669-efb4c3b3-8fe3-45eb-8e47-e9510b5f0af1.svg" width="290" alt="WorkOS">
</div>
<b>Your app, enterprise-ready.</b>
<div>
<sub>Start selling to enterprise customers with just a few lines of code. Add Single Sign-On (and more) in minutes instead of months.</sup>
</div>
</a>
</td>
</table>
PHP:
### Whats in the box?
<img src="./showcases/php.png">
Left: ligatures as rendered in Fira Code. Right: same character sequences without ligatures.
Erlang:
<img src="./extras/ligatures.png" width="754">
<img src="./showcases/erlang.png">
Fira Code comes with a huge variety of arrows. Even better: you can make them as long as you like and combine start/middle/end fragments however you want!
Elixir:
<img src="./extras/arrows.png" width="754">
<img src="/showcases/elixir.png">
Fira Code is not only about ligatures. Some fine-tuning is done for punctuation and frequent letter pairs.
Go:
<img src="./extras/typographics.png" width="754">
<img src="./showcases/go.png">
Fira Code comes with a few different character variants (`cv01`, `cv02`, etc), stylistic sets (`ss01`, `ss02` , etc) and other font features (`zero`, `onum`, `calt`, etc), so that everyone can choose whats best for them. [How to enable](https://github.com/tonsky/FiraCode/wiki/How-to-enable-stylistic-sets)
LiveScript:
<img src="./extras/character_variants.png" width="754">
<img src="./showcases/livescript.png">
Some ligatures can be altered or enabled using stylistic sets/character variants:
Clojure:
<img src="./extras/ligature_variants.png" width="754">
<img src="./showcases/clojure.png">
Being a programming font, Fira Code has fantastic support for ASCII/box drawing, powerline and other forms of console UIs:
Swift:
<img src="./extras/console.png" width="754">
<img src="./showcases/swift.png">
Fira Code is the first programming font to offer dedicated glyphs to render progress bars:
Stylistic sets:
<img src="./extras/progress.png" width="754">
See [How to enable](https://github.com/tonsky/FiraCode/wiki/How-to-enable-stylistic-sets)
In action:
<img src="./showcases/stylistic_sets.png">
<img src="./extras/progress.gif" width="560">
We hope more programming fonts will adopt this convention and ship their own versions.
### Terminal support
Unicode coverage makes Fira Code a great choice for mathematical writing:
| 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) |
<img src="./extras/math.png" width="754">
### Editor support
### How does it look?
<img src="./extras/samples.png" width="754">
<img src="./extras/samples2.png" width="754">
### 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** (Win, [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)) | **gVim** (Windows [workaround](https://github.com/tonsky/FiraCode/issues/462)) |
| **Brackets** (with [this plugin](https://github.com/polo2ro/firacode-in-brackets)) | **IDLE** |
| **Chocolat** | **KDevelop 4** |
| **CLion** (2016.2+, [instructions](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) | **Monkey Studio IDE** |
| **Cloud9** ([instructions](https://github.com/tonsky/FiraCode/wiki/Cloud9-Instructions)) | |
| **Coda 2** | |
| **CodeLite** | |
| **Eclipse** (Mac 4.7+, Linux) | |
| **elementary Code** | |
| **Geany** |
|-------|----------------|
| **Arduino IDE** (2.0+,same instructions as [vscode](https://github.com/tonsky/FiraCode/wiki/VS-Code-Instructions)) | **Adobe Dreamweaver** |
| **Abricotine** | **Delphi IDE** |
| **Android Studio** (2.3+, [instructions](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) | Standalone **Emacs** ([workaround](https://github.com/tonsky/FiraCode/wiki/Emacs-instructions)) |
| **Anjuta** (unless at the EOF) | **IDLE** |
| **AppCode** (2016.2+, [instructions](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) | **KDevelop 4** |
| **Atom** 1.1 or newer ([instructions](https://github.com/tonsky/FiraCode/wiki/Atom-instructions)) | **Monkey Studio IDE** |
| **BBEdit** (14.6+ [instructions](https://github.com/tonsky/FiraCode/wiki/BBEdit-instructions)) | **UltraEdit** (Windows) |
| **Brackets** (with [this plugin](https://github.com/polo2ro/firacode-in-brackets)) |
| **Chocolat** |
| **CLion** (2016.2+, [instructions](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) |
| **Cloud9** ([instructions](https://github.com/tonsky/FiraCode/wiki/Cloud9-Instructions)) |
| **Coda 2** |
| **CodeLite** |
| **CodeRunner** |
| **Comma** (Under: Preferences > Editor > Font) |
| **CotEditor** |
| **Eclipse** |
| **elementary Code** |
| **Geany** (1.37+) |
| **gEdit / Pluma** |
| **GNOME Builder** |
| **Godot** |
| **GoormIDE** ([instructions](https://github.com/tonsky/FiraCode/wiki/GoormIDE-Instructions)) |
| **IntelliJ IDEA** (2016.2+, [instructions](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) |
| **gVim** ([Windows](https://github.com/tonsky/FiraCode/issues/462), [GTK](https://vimhelp.org/options.txt.html#%27guiligatures%27)) |
| **IntelliJ IDEA** (2016.2+, [instructions](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) |
| **Kate, KWrite** |
| **KDevelop 5+** |
| **Komodo** |
@ -112,53 +125,88 @@ See [How to enable](https://github.com/tonsky/FiraCode/wiki/How-to-enable-stylis
| **LINQPad** |
| **MacVim** 7.4 or newer ([instructions](https://github.com/tonsky/FiraCode/wiki/MacVim-instructions)) |
| **Mancy** |
| **MATLAB** ([instructions](https://github.com/tonsky/FiraCode/wiki/MATLAB-for-Windows-Instructions)) |
| **Meld** |
| **Mousepad** |
| **NeoVim-gtk** |
| **NetBeans** |
| **Notepad** (Win) |
| **Notepad++** (with a [workaround](https://github.com/notepad-plus-plus/notepad-plus-plus/issues/2287#issuecomment-256638098)) |
| **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)) |
| **Notepad** (Windows) |
| **Notepad++** ([instructions](https://github.com/tonsky/FiraCode/issues/1555)) |
| **Notepad3** ([instructions](https://github.com/rizonesoft/Notepad3/issues/361#issuecomment-365977420))|
| **Nova** |
| **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)) |
| **QOwnNotes** (21.16.6+) |
| **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)) |
| **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, Mac) |
| **TeXShop**|
| **TextAdept** (Linux, macOS) |
| **TextEdit** |
| **TextMate 2** |
| **UltraEdit (UEX)** (Linux) |
| **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)) |
| **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** |
### Terminal compatibility list
| Works | Doesnt work |
|-------|--------------|
| crosh ([instructions](https://github.com/tonsky/FiraCode/wiki/ChromeOS-Terminal)) | Alacritty |
| Hyper (see [#3607](https://github.com/vercel/hyper/issues/3607)) | Asbru Connection Manager |
| iTerm 2 | Cmder |
| Kitty | ConEmu |
| Konsole | GNOME Terminal ([ticket](https://gitlab.gnome.org/GNOME/vte/-/issues/192)) |
| Mintty | gtkterm ([ticket](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| QTerminal | guake ([ticket](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| st ([patch](https://st.suckless.org/patches/ligatures/)) | LXTerminal ([ticket](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| Tabby | mate-terminal |
| Terminal.app | PuTTY |
| Termux | rxvt |
| Token2Shell | sakura ([ticket](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| Wezs terminal | SecureCRT
| Windows Terminal | Terminator ([ticket](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| ZOC (macOS) | terminology |
| | Tilix |
| | Windows Console |
| | xfce4-terminal ([ticket](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| | xterm |
| | ZOC (Windows) |
### Browser support
```html
<!-- HTML -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/tonsky/FiraCode@1.207/distr/fira_code.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/firacode@6.2.0/distr/fira_code.css">
```
```css
/* CSS */
@import url(https://cdn.jsdelivr.net/gh/tonsky/FiraCode@1.207/distr/fira_code.css);
@import url(https://cdn.jsdelivr.net/npm/firacode@6.2.0/distr/fira_code.css);
```
```css
/* Specify in CSS */
font-family: 'Fira Code', monospace;
code { font-family: 'Fira Code', monospace; }
@supports (font-variation-settings: normal) {
code { font-family: 'Fira Code VF', monospace; }
}
```
- IE 10+, Edge: enable with `font-feature-settings: "calt" 1;`
- IE 10+, Edge Legacy: enable with `font-feature-settings: "calt";`
- Firefox
- Safari
- Chromium-based browsers (Chrome, Opera)
@ -167,7 +215,6 @@ font-family: 'Fira Code', monospace;
### 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/)
@ -179,29 +226,62 @@ font-family: 'Fira Code', monospace;
### Alternatives
Other monospaced fonts with ligatures:
Free monospaced fonts with ligatures:
- [Hasklig](https://github.com/i-tu/Hasklig) (free)
- [PragmataPro](http://www.fsd.it/fonts/pragmatapro.htm) (€59)
- [Monoid](http://larsenwork.com/monoid/) (free)
- [Fixedsys Excelsior](https://github.com/kika/fixedsys) (free)
- [Iosevka](https://be5invis.github.io/Iosevka/) (free)
- [DejaVu Sans Code](https://github.com/SSNikolaevich/DejaVuSansCode) (free)
- [Victor Mono](https://rubjo.github.io/victor-mono/) (free)
- [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://www.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:
In case you want to alter FiraCode.glyphs and build OTF/TTF/WOFF files yourself, this is the setup I use on macOS:
```bash
# install all required build tools
./script/bootstrap
./script/bootstrap_macos.sh
# build the font files
./script/build
./script/build.sh
# install OTFs to ~/Library/Fonts
./script/install
cp distr/otf/*.otf ~/Library/Fonts
```
Alternatively, you can build Fira Code using Docker:
```bash
# install dependencies in a container and build the font files
make
# package the font files from dist/ into a zip
make package
```
If you want to *permanently enable* certain style sets or character variations, maybe because your editor of choice does not allow you to toggle these individually, you can provide the desired features as a comma separated list to the build script via the `-f / --features` flag.<br>Default: none.
To separate different versions of your font you can specify the desired font family name with the `-n / --family-name` flag. The special value 'features' will append a sorted, space separated list of enabled features to the default family name.<br>Default: "Fira Code"
You can also limit the font weights that will be created with the `-w / --weights` option.<br>Default: "Light,Regular,Retina,Medium,SemiBold,Bold"
```bash
# locally in your shell
./script/build.sh --features "ss02,ss08,ss10,cv03,cv07,cv14" --family-name "Fira Code straight" --weights "Regular,Bold"
# or via a docker container (creates the family name 'Fira Code cv01 cv02 cv06 cv31 onum ss01 ss03 ss04 zero')
docker run --rm -v "${PWD}":/opt tonsky/firacode:latest ./script/build.sh -f "cv01,cv02,cv06,ss01,zero,onum,ss03,ss04,cv31" -n "features"
# in Git Bash from Git for Windows, or any other MSYS2 based shell, you might need to disable path conversion
MSYS2_ARG_CONV_EXCL="*" docker run --rm -v "${PWD}":/opt tonsky/firacode:latest ./script/build.sh -f "ss02,ss03,ss04,ss05,ss06,ss07"
```
### Credits

284
README_CN.md Normal file
View file

@ -0,0 +1,284 @@
## Fira Code: 免费的编程连字等宽字体
![Fira Code](./extras/logo.svg)
### 问题
开发者们使用的多标记,通常都是用几个字符编码。对于人的大脑来说,像`->`、`<=`或`:=`这样的序列是单一的逻辑标记即使它们在屏幕上显示两到三个字符。您的眼睛并非无消耗的来扫描、解析并将多个字符连接到一个逻辑字符中。理想情况下所有编程语言都应该为操作符设计成熟的Unicode符号但现在还不是这样。
### 解决方案
Fira Code是一种免费的等宽字体包含常用的编程语言中多种字符组合的连字。这只是一个字体呈现功能底层代码仍然与ASCII兼容。这有助于更快地阅读和理解代码。对于一些常见的序列如`..`或`//`,连字允许我们纠正间距。
### 下载和安装
<a href="https://github.com/tonsky/FiraCode/releases/download/6.2/Fira_Code_v6.2.zip"><img alt="Fira_Code_v6.2.zip - December 6, 2021 - 2.5 MB" src="./extras/download.png" width="520"></a>
下一步:
- [如何安装](https://github.com/tonsky/FiraCode/wiki)
- [疑难解答](https://github.com/tonsky/FiraCode/wiki#troubleshooting)
- [相关新闻](https://twitter.com/FiraCode)
### 赞助商
<a href="https://github.com/sponsors/tonsky" target="_blank"><img alt="Sponsor" src="./extras/sponsor.png"></a>
Fira Code 是个人的空闲时间进行的项目,缺乏资金但有大量的 [功能请求积压](https://github.com/tonsky/FiraCode/issues)。如果你也热爱这个项目, 请考虑通过 [GitHub Sponsors](https://github.com/sponsors/tonsky) 或 [Patreon](https://patreon.com/tonsky) 来支持它的发展。任何帮助都很重要!
非常感谢:
<table>
<td align="center">
<a href="https://workos.com/?utm_campaign=github_repo&utm_medium=referral&utm_content=firacode&utm_source=github">
<div>
<img src="https://user-images.githubusercontent.com/629429/151508669-efb4c3b3-8fe3-45eb-8e47-e9510b5f0af1.svg" width="290" alt="WorkOS">
</div>
<b>Your app, enterprise-ready.</b>
<div>
<sub>Start selling to enterprise customers with just a few lines of code. Add Single Sign-On (and more) in minutes instead of months.</sup>
</div>
</a>
</td>
</table>
### 字体里都有哪些特征?
左侧Fira Code中呈现的连字。右侧没有连字的相同字符序列。
<img src="./extras/ligatures.png" width="754">
Fira Code 带有种类繁多的箭头。更棒的是:您可以随心所欲地制作它们,并根据需要组合开始/中间/结束片段!
<img src="./extras/arrows.png" width="754">
Fira Code 不仅与连字有关,还对标点符号和频繁的字母对进行了一些微调。
<img src="./extras/typographics.png" width="754">
Fira Code 带有各种各样的箭头,更棒的是,您可以随心所欲地制作它们,并且可以任意组合开始/中间/结束片段![如何启用](https://github.com/tonsky/FiraCode/wiki/How-to-enable-stylistic-sets)
<img src="./extras/character_variants.png" width="754">
可以使用样式集/字符变体更改或启用某些连字:
<img src="./extras/ligature_variants.png" width="754">
作为一种编程字体Fira Code 对 ASCII/框绘图、powerline和其他形式的控制台 UI 具有出色的支持:
<img src="./extras/console.png" width="754">
Fira Code 是第一个提供专用字形来渲染进度条的编程字体:
<img src="./extras/progress.png" width="754">
在运行中:
<img src="./extras/progress.gif" width="560">
我们希望更多的编程字体能够采用这个约定并发布自己的版本。
Unicode 覆盖使 Fira Code 成为数学写作的绝佳选择:
<img src="./extras/math.png" width="754">
### 它看起来怎样?
<img src="./extras/samples.png" width="754">
<img src="./extras/samples2.png" width="754">
### 编辑器兼容性列表
| 支持 | 不支持 |
|-------|----------------|
| **Abricotine** | **Arduino IDE** |
| **Android Studio** (2.3+, [说明](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) | **Adobe Dreamweaver** |
| **Anjuta** (除非在 EOF) | **Delphi IDE** |
| **AppCode** (2016.2+, [说明](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) | Standalone **Emacs** ([解决方法](https://github.com/tonsky/FiraCode/wiki/Emacs-instructions)) | **IDLE** |
| **Atom** 1.1 或更新版本 ([说明](https://github.com/tonsky/FiraCode/wiki/Atom-instructions)) | **KDevelop 4** |
| **BBEdit** (14.6+, [说明](https://github.com/tonsky/FiraCode/wiki/BBEdit-instructions)) | **Monkey Studio IDE** |
| **Brackets** (使用 [此插件](https://github.com/polo2ro/firacode-in-brackets)) |
| **Chocolat** | **UltraEdit** |
| **CLion** (2016.2+, [说明](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) |
| **Cloud9** ([说明](https://github.com/tonsky/FiraCode/wiki/Cloud9-Instructions)) |
| **Coda 2** |
| **CodeLite** |
| **CodeRunner** |
| **Comma** (在 首选项 > 编辑器 > 字体 中) |
| **CotEditor** |
| **Eclipse** |
| **elementary Code** |
| **Geany** (1.37+) |
| **gEdit / Pluma** |
| **GNOME Builder** |
| **Godot** |
| **GoormIDE** ([说明](https://github.com/tonsky/FiraCode/wiki/GoormIDE-Instructions)) |
| **gVim** ([Windows](https://github.com/tonsky/FiraCode/issues/462), [GTK](https://vimhelp.org/options.txt.html#%27guiligatures%27)) |
| **IntelliJ IDEA** (2016.2+, [说明](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) |
| **Kate, KWrite** |
| **KDevelop 5+** |
| **Komodo** |
| **Leafpad** |
| **LibreOffice** |
| **LightTable** ([说明](https://github.com/tonsky/FiraCode/wiki/LightTable-instructions)) |
| **LINQPad** |
| **MacVim** 7.4 或更新版本 ([说明](https://github.com/tonsky/FiraCode/wiki/MacVim-instructions)) |
| **Mancy** |
| **MATLAB** ([说明](https://github.com/tonsky/FiraCode/wiki/MATLAB-for-Windows-Instructions)) |
| **Meld** |
| **Mousepad** |
| **NeoVim-gtk** |
| **NetBeans** |
| **Notepad** (Windows) |
| **Notepad++** ([解决方法](https://github.com/notepad-plus-plus/notepad-plus-plus/issues/2287#issuecomment-256638098)) |
| **Notepad3** ([说明](https://github.com/rizonesoft/Notepad3/issues/361#issuecomment-365977420))|
| **Nova** |
| **PhpStorm** (2016.2+, [说明](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) |
| **PyCharm** (2016.2+, [说明](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) |
| **QOwnNotes** (21.16.6+) |
| **QtCreator** |
| **Rider** |
| **RStudio** ([说明](https://github.com/tonsky/FiraCode/wiki/RStudio-instructions)) |
| **RubyMine** (2016.2+, [说明](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) |
| **Scratch** |
| **Scribus** (1.5.3+) |
| **SublimeText** (3146+) |
| **Spyder IDE** (仅适用于 Qt5) |
| **SuperCollider 3** |
| **TeXShop**|
| **TextAdept** (Linux, macOS) |
| **TextEdit** |
| **TextMate 2** |
| **VimR** ([说明](https://github.com/qvacua/vimr/wiki#ligatures)) |
| **Visual Studio** (2015+, [说明](https://github.com/tonsky/FiraCode/wiki/Visual-Studio-Instructions)) |
| **Visual Studio Code** ([说明](https://github.com/tonsky/FiraCode/wiki/VS-Code-Instructions)) |
| **WebStorm** (2016.2+, [说明](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) |
| **Xamarin Studio/Monodevelop** |
| **Xcode** (8.0+, 否则 [使用插件](https://github.com/robertvojta/LigatureXcodePlugin)) |
| **Xi** |
| Probably work: **Smultron, Vico** | Under question: **Code::Blocks IDE** |
### 终端兼容性列表
| 支持 | 不支持 |
|-------|--------------|
| crosh ([说明](https://github.com/tonsky/FiraCode/wiki/ChromeOS-Terminal)) | Alacritty |
| Hyper (参见 [#3607](https://github.com/vercel/hyper/issues/3607)) | Cmder |
| iTerm 2 | ConEmu |
| Kitty | GNOME Terminal |
| Konsole | gtkterm ([需求](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| Mintty | guake ([需求](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| QTerminal | LXTerminal ([需求](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| st ([补丁](https://st.suckless.org/patches/ligatures/)) | mate-terminal |
| Terminal.app | PuTTY |
| Termux | rxvt |
| Token2Shell | sakura ([需求](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| Wezs terminal | Terminator ([需求](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| Windows Terminal | terminology |
| ZOC (macOS) | Windows Console |
| | xfce4-terminal ([需求](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| | xterm |
| | ZOC (Windows) |
### 浏览器支持
```html
<!-- HTML -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/firacode@6.2.0/distr/fira_code.css">
```
```css
/* CSS */
@import url(https://cdn.jsdelivr.net/npm/firacode@6.2.0/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: 启用 `font-feature-settings: "calt";`
- Firefox
- Safari
- Chromium-based browsers (Chrome, Opera)
- ACE
- CodeMirror (enable with `font-variant-ligatures: contextual;`)
### 使用 Fira Code的项目
- [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/)
### 备选方案
带连字的免费等宽字体:
- [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)
带连字的付费等宽字体:
- [PragmataPro](http://www.fsd.it/fonts/pragmatapro.htm)
- [Mono Lisa](https://www.monolisa.dev/)
### 在本地构建 Fira Code
如果您想更改 FiraCode.glyphs 并自己构建 OTF / TTF / WOFF 文件,这是我在 macOS 上使用的设置:
```bash
# 安装所有编译需要的工具
./script/bootstrap_macos.sh
# 编译字体文件
./script/build.sh
# 将otf文件安装到 ~/Library/Fonts
cp distr/otf/*.otf ~/Library/Fonts
```
或者,您可以使用 Docker 构建 Fira Code
```bash
# install dependencies in a container and build the font files
make
# package the font files from dist/ into a zip
make package
```
如果你想要*永久开启*某个特定的文体集或者字符变种,但你的编辑器有可能不允许你单独开启它们,你可以将你想要的功能作为一个用逗号分隔的列表,通过 `-f / --features` 标志来加入到编译脚本中。<br>默认:无。
要分隔不同的字体版本的话,你可以用 `-n / --family-name` 标志来指定你所需的字体系列名称。特殊值 'features' 将在默认的系列名称后面添加一个有序的、空格分隔的列表,列表内为已经启用的功能。<br>默认:"Fira Code"
你也可以用 `-w / --weights` 选项来限制将要被编译的字体的重量。<br>默认:"Light,Regular,Retina,Medium,SemiBold,Bold"
```bash
# 在你本地的shell中
./script/build.sh --features "ss02,ss08,ss10,cv03,cv07,cv14" --family-name "Fira Code straight" --weights "Regular,Bold"
# 或者通过一个docker容器 (创建系列名为:'Fira Code cv01 cv02 cv06 cv31 onum ss01 ss03 ss04 zero')
docker run --rm -v "${PWD}":/opt tonsky/firacode:latest ./script/build.sh -f "cv01,cv02,cv06,ss01,zero,onum,ss03,ss04,cv31" -n "features"
```
### 制作人员
- 作者: Nikita Prokopov [@nikitonsky](https://twitter.com/nikitonsky)
- 基于此项目: [Fira Mono](https://github.com/mozilla/Fira)
- 灵感来源: [Hasklig](https://github.com/i-tu/Hasklig)
- 翻译:墨抒颖[@moshuying](https://github.com/moshuying)

291
README_JA.md Normal file
View file

@ -0,0 +1,291 @@
## Fira Code: プログラミング合字のフリー等幅フォント
![Fira Code](./extras/logo.svg)
[English](./README.md) | [Español](./LEEME.md) | [简体中文](./README_CN.md) で読む
### 問題点
プログラマは多くの記号を使用し、しばしば数文字で符号化されます。人間の脳にとって`->`、`<=`、`:=`といったシーケンスは、たとえ画面上で 2 文字や 3 文字になったとしても、単一の論理トークンである。あなたの目は、複数の文字をスキャンし、解析し、1 つの論理的なものに結合するために、ゼロではない量のエネルギーを費やしているのです。理想を言えば、すべてのプログラミング言語が演算子のための本格的なユニコード記号を備えて設計されるべきですが、まだそうではありません。
### 解決法
Fira Code は、一般的なプログラミングの複数文字の組み合わせのための合字を含む無料の等幅フォントです。これは単にフォントのレンダリング機能であり、基礎となるコードは ASCII 互換のままです。これによりコードをより速く読み、理解することができます。`...` や `//` のような頻度の高い文字列は、合字によって間隔を修正することができます。
### ダウンロードとインストール
<a href="https://github.com/tonsky/FiraCode/releases/download/6.2/Fira_Code_v6.2.zip"><img alt="Fira_Code_v6.2.zip - December 6, 2021 - 2.5 MB" src="./extras/download.png" width="520"></a>
次は:
- [インストール方法](https://github.com/tonsky/FiraCode/wiki)
- [トラブルシューティング](https://github.com/tonsky/FiraCode/wiki#troubleshooting)
- [ニュースとアップデート](https://twitter.com/FiraCode)
### スポンサー
Fira Code は個人的なフリータイムのプロジェクトで、資金はなく膨大な[機能リクエストバックログ](https://github.com/tonsky/FiraCode/issues)を抱えています。もし気に入っていただけたなら、[GitHub Sponsors](https://github.com/sponsors/tonsky) または [Patreon](https://patreon.com/tonsky) で開発をサポートすることを検討してください。どんな支援でもかまいません!
大いに感謝します:
<table>
<td align="center">
<a href="https://workos.com/?utm_campaign=github_repo&utm_medium=referral&utm_content=firacode&utm_source=github">
<div>
<img src="https://user-images.githubusercontent.com/629429/151508669-efb4c3b3-8fe3-45eb-8e47-e9510b5f0af1.svg" width="290" alt="WorkOS">
</div>
<b>Your app, enterprise-ready.</b>
<div>
<sub>Start selling to enterprise customers with just a few lines of code. Add Single Sign-On (and more) in minutes instead of months.</sup>
</div>
</a>
</td>
</table>
### 何が入っているのでしょうか?
左: Fira Code で描画される合字。右: 合字のない同じ文字列。
<img src="./extras/ligatures.png" width="754">
Fira Code には、膨大な種類の矢印が用意されています。さらに、好きな長さにしたり、始点・中間・終点の断片を自由に組み合わせたりすることができます!
<img src="./extras/arrows.png" width="754">
Fira Code は合字だけではありません。句読点や頻度の高い文字ペアについても、いくつかの微調整が行われています。
<img src="./extras/typographics.png" width="754">
Fira Code には、数種類の文字バリエーション(`cv01`、`cv02` など)、スタイルセット(`ss01`、`ss02` など)、その他のフォント機能(`zero`、`onum`、`calt` など)があり、誰もが自分に最適なものを選ぶことができます。[有効にする方法](https://github.com/tonsky/FiraCode/wiki/How-to-enable-stylistic-sets)
<img src="./extras/character_variants.png" width="754">
一部の合字は、スタイルセット/文字バリアントを使用して変更または有効にすることができます:
<img src="./extras/ligature_variants.png" width="754">
プログラミング用フォントである Fira Code は、ASCII/ボックスドローイング、パワーライン、その他の形式のコンソール UI に素晴らしい対応をしています:
<img src="./extras/console.png" width="754">
Fira Code は、プログレスバーを描画するための専用グリフを提供する最初のプログラミングフォントです:
<img src="./extras/progress.png" width="754">
動作すると:
<img src="./extras/progress.gif" width="560">
より多くのプログラミング用フォントがこの規約を採用し、独自のバージョンを出荷することを望んでいます。
ユニコード対応により、Fira Code は数学の記述に最適です:
<img src="./extras/math.png" width="754">
### どのように見えるのでしょうか?
<img src="./extras/samples.png" width="754">
<img src="./extras/samples2.png" width="754">
### エディタ互換性リスト
| サポート | 非サポート |
|-------|----------------|
| **Arduino IDE** (2.0+,same instructions as [vscode](https://github.com/tonsky/FiraCode/wiki/VS-Code-Instructions)) | **Adobe Dreamweaver** |
| **Abricotine** | **Delphi IDE** |
| **Android Studio** (2.3+, [説明](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) | Standalone **Emacs** ([回避方法](https://github.com/tonsky/FiraCode/wiki/Emacs-instructions)) |
| **Anjuta** (unless at the EOF) | **IDLE** |
| **AppCode** (2016.2+, [説明](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) | **KDevelop 4** |
| **Atom** 1.1 or newer ([説明](https://github.com/tonsky/FiraCode/wiki/Atom-instructions)) | **Monkey Studio IDE** |
| **BBEdit** (14.6+ [説明](https://github.com/tonsky/FiraCode/wiki/BBEdit-instructions)) | **UltraEdit** (Windows) |
| **Brackets** (with [this plugin](https://github.com/polo2ro/firacode-in-brackets)) |
| **Chocolat** |
| **CLion** (2016.2+, [説明](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) |
| **Cloud9** ([説明](https://github.com/tonsky/FiraCode/wiki/Cloud9-Instructions)) |
| **Coda 2** |
| **CodeLite** |
| **CodeRunner** |
| **Comma** (Under: Preferences > Editor > Font) |
| **CotEditor** |
| **Eclipse** |
| **elementary Code** |
| **Geany** (1.37+) |
| **gEdit / Pluma** |
| **GNOME Builder** |
| **Godot** |
| **GoormIDE** ([説明](https://github.com/tonsky/FiraCode/wiki/GoormIDE-Instructions)) |
| **gVim** ([Windows](https://github.com/tonsky/FiraCode/issues/462), [GTK](https://vimhelp.org/options.txt.html#%27guiligatures%27)) |
| **IntelliJ IDEA** (2016.2+, [説明](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) |
| **Kate, KWrite** |
| **KDevelop 5+** |
| **Komodo** |
| **Leafpad** |
| **LibreOffice** |
| **LightTable** ([説明](https://github.com/tonsky/FiraCode/wiki/LightTable-instructions)) |
| **LINQPad** |
| **MacVim** 7.4 or newer ([説明](https://github.com/tonsky/FiraCode/wiki/MacVim-instructions)) |
| **Mancy** |
| **MATLAB** ([説明](https://github.com/tonsky/FiraCode/wiki/MATLAB-for-Windows-Instructions)) |
| **Meld** |
| **Mousepad** |
| **NeoVim-gtk** |
| **NetBeans** |
| **Notepad** (Windows) |
| **Notepad++** ([回避方法](https://github.com/notepad-plus-plus/notepad-plus-plus/issues/2287#issuecomment-256638098)) |
| **Notepad3** ([説明](https://github.com/rizonesoft/Notepad3/issues/361#issuecomment-365977420))|
| **Nova** |
| **PhpStorm** (2016.2+, [説明](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) |
| **PyCharm** (2016.2+, [説明](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) |
| **QOwnNotes** (21.16.6+) |
| **QtCreator** |
| **Rider** |
| **RStudio** ([説明](https://github.com/tonsky/FiraCode/wiki/RStudio-instructions)) |
| **RubyMine** (2016.2+, [説明](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) |
| **Scratch** |
| **Scribus** (1.5.3+) |
| **SublimeText** (3146+) |
| **Spyder IDE** (Qt5 のみ) |
| **SuperCollider 3** |
| **TeXShop**|
| **TextAdept** (Linux, macOS) |
| **TextEdit** |
| **TextMate 2** |
| **UltraEdit (UEX)** (Linux) |
| **VimR** ([説明](https://github.com/qvacua/vimr/wiki#ligatures)) |
| **Visual Studio** (2015+, [説明](https://github.com/tonsky/FiraCode/wiki/Visual-Studio-Instructions)) |
| **Visual Studio Code** ([説明](https://github.com/tonsky/FiraCode/wiki/VS-Code-Instructions)) |
| **WebStorm** (2016.2+, [説明](https://github.com/tonsky/FiraCode/wiki/IntelliJ-products-instructions)) |
| **Xamarin Studio/Monodevelop** |
| **Xcode** (8.0+, それ以外は[プラグイン付き](https://github.com/robertvojta/LigatureXcodePlugin)) |
| **Xi** |
| Probably work: **Smultron, Vico** | Under question: **Code::Blocks IDE** |
### ターミナル互換性リスト
| サポート | 非サポート |
|-------|--------------|
| crosh ([説明](https://github.com/tonsky/FiraCode/wiki/ChromeOS-Terminal)) | Alacritty |
| Hyper ([#3607](https://github.com/vercel/hyper/issues/3607) を確認) | Asbru Connection Manager |
| iTerm 2 | Cmder |
| Kitty | ConEmu |
| Konsole | GNOME Terminal |
| Mintty | gtkterm ([チケット](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| QTerminal | guake ([チケット](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| st ([パッチ](https://st.suckless.org/patches/ligatures/)) | LXTerminal ([チケット](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| Tabby | mate-terminal |
| Terminal.app | PuTTY |
| Termux | rxvt |
| Token2Shell | sakura ([チケット](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| Wezs terminal | SecureCRT
| Windows Terminal | Terminator ([チケット](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| ZOC (macOS) | terminology |
| | Tilix |
| | Windows Console |
| | xfce4-terminal ([チケット](https://gitlab.gnome.org/GNOME/vte/-/issues/1661)) |
| | xterm |
| | ZOC (Windows) |
### ブラウザサポート
```html
<!-- HTML -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/firacode@6.2.0/distr/fira_code.css">
```
```css
/* CSS */
@import url(https://cdn.jsdelivr.net/npm/firacode@6.2.0/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: `font-feature-settings: "calt";` で有効にします
- Firefox
- Safari
- Chromium-based browsers (Chrome, Opera)
- ACE
- CodeMirror (`font-variant-ligatures: contextual;` で有効にします)
### Fira Code を使用したプロジェクト
- [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/)
### 代替品
合字のある無料等幅フォント:
- [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)
合字のある有償等幅フォント:
- [PragmataPro](http://www.fsd.it/fonts/pragmatapro.htm)
- [Mono Lisa](https://www.monolisa.dev/)
### Fira Code をローカルでビルドする
FiraCode.glyphs を変更し、OTF/TTF/WOFF ファイルを自分でビルドしたい場合、私が macOS で使用している設定は次のとおりです:
```bash
# 必要なビルドツールをすべてインストール
./script/bootstrap_macos.sh
# フォントファイルのビルド
./script/build.sh
# OTF を ~/Library/Fonts にインストール
cp distr/otf/*.otf ~/Library/Fonts
```
または、Docker を使用して Fira Code を構築することもできます:
```bash
# コンテナ内に依存関係をインストールし、フォントファイルをビルド
make
# dist/ のフォントファイルを zip にまとめる
make package
```
特定のスタイルセットやキャラクタバリエーションを *永久的に* 有効にしたい場合、おそらくあなたの選んだエディタではこれらを個別に切り替えることができないため、`-f / --features` フラグでビルドスクリプトにカンマ区切りリストとして希望の機能を提供することができます。<br>デフォルト: なし。
異なるバージョンのフォントを分けるために、`-n / --family-name` フラグで希望のフォントファミリー名を指定することができます。特別な値 'features' を指定すると、有効な機能をソートしてスペースで区切ったリストをデフォルトのファミリー名に追加します。<br>デフォルト: "Fira Code"
また、`-w / --weights` オプションで、作成されるフォントのウェイトを制限することができます。<br>デフォルト: "Light,Regular,Retina,Medium,SemiBold,Bold"
```bash
# ローカルでシェル内
./script/build.sh --features "ss02,ss08,ss10,cv03,cv07,cv14" --family-name "Fira Code straight" --weights "Regular,Bold"
# または Docker コンテナ経由(ファミリー名 'Fira Code cv01 cv02 cv06 cv31 onum ss01 ss03 ss04 zero' を作成)
docker run --rm -v "${PWD}":/opt tonsky/firacode:latest ./script/build.sh -f "cv01,cv02,cv06,ss01,zero,onum,ss03,ss04,cv31" -n "features"
# Git for Windows の Git Bash やその他の MSYS2 ベースのシェルで使用する場合は、パス変換を無効にする必要があるかもしれません
MSYS2_ARG_CONV_EXCL="*" docker run --rm -v "${PWD}":/opt tonsky/firacode:latest ./script/build.sh -f "ss02,ss03,ss04,ss05,ss06,ss07"
```
### クレジット
- 作者: Nikita Prokopov [@nikitonsky](https://twitter.com/nikitonsky)
- 基にした: [Fira Mono](https://github.com/mozilla/Fira)
- インスパイアされた: [Hasklig](https://github.com/i-tu/Hasklig)

View file

@ -0,0 +1 @@
bracketright braceright parenright

13
classes/Digit.fea Normal file
View file

@ -0,0 +1,13 @@
zero
zero.zero
one
two
twoTurned
threeTurned
three
four
five
six
seven
eight
nine

12
classes/DigitTosf.fea Normal file
View file

@ -0,0 +1,12 @@
zero.tosf
zero.tosf.zero
zero.zero.tosf
one.tosf
two.tosf
three.tosf
four.tosf
five.tosf
six.tosf
seven.tosf
eight.tosf
nine.tosf

1
classes/HexDigit.fea Normal file
View file

@ -0,0 +1 @@
a b c d e f A B C D E F

View file

@ -0,0 +1 @@
bracketleft braceleft parenleft

1
classes/Tall.fea Normal file
View file

@ -0,0 +1 @@
@Uppercase zero one two twoTurned threeTurned three four five six seven eight nine @OpeningBracket @ClosingBracket bar

335
clojure/fira_code/calt.clj Executable file
View file

@ -0,0 +1,335 @@
(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 priorities
{;; <|>
["less" "bar" "greater"] 0
;; |||> ||> |> <| <|| <|||
["bar" "bar" "bar" "greater"] 1
["bar" "bar" "greater"] 1
["bar" "greater"] 1
["less" "bar" "bar" "bar"] 1
["less" "bar" "bar"] 1
["less" "bar"] 1
;; #346 We need << <<< >> >>> || ||| substituted before -- --- == ===
;; so that `ignore [less greater bar] hyphen hyphen` would not trigger
["less" "less"] 2
["less" "less" "less"] 2
["greater" "greater"] 2
["greater" "greater" "greater"] 2
["bar" "bar"] 2
["bar" "bar" "bar"] 2})
(def ignores
(coll/multimap-by str
["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")
;; #1061
["colon" "colon"]
(str " ignore sub colon' colon [less greater];\n"
" ignore sub [less greater] colon' colon;\n")
["colon" "colon" "colon"]
(str " ignore sub colon' colon colon [less greater];\n"
" ignore sub [less greater] colon' colon colon;\n")
;; #621 <||>
["less" "bar" "bar"]
" ignore sub less' bar bar greater;\n"
["bar" "bar" "greater"]
" ignore sub less bar' bar greater;\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"]
" ignore sub [asterisk plus dollar] greater' greater;\n"
;; #410 <*>>> <+>>> <$>>>
["greater" "greater" "greater"]
" ignore sub [asterisk plus dollar] greater' greater greater;\n"
;; #410 <<*> <<+> <<$>
["less" "less"]
" ignore sub less' less [asterisk plus dollar];\n"
;; #410 <<<*> <<<+> <<<$>
["less" "less" "less"]
" ignore sub less' less less [asterisk plus dollar];\n"
;; #948 [==[ ]==]
;; #968 [== ==]
["equal" "equal"]
(str " ignore sub bracketleft equal' equal;\n"
" ignore sub equal' equal bracketright;\n")
;; #948 [===[ ]===]
;; #968 [=== ===]
["equal" "equal" "equal"]
(str " ignore sub bracketleft equal' equal equal;\n"
" ignore sub equal' equal equal bracketright;\n")
;; #346 =:=
["colon" "equal"]
" ignore sub equal colon' equal;\n"
;; #346 =!=
["exclam" "equal"]
" ignore sub equal exclam' equal;\n"
;; #346 =!==
["exclam" "equal" "equal"]
" ignore sub equal exclam' equal equal;\n"
;; #346 =<= <=< <=> <=| <=: <=! <=/
["less" "equal"]
(str " ignore sub equal less' equal;\n"
" ignore sub less' equal [less greater bar colon exclam slash];\n")
;; #548 >=<
;; #346 =>= >=> >=< >=| >=: >=! >=/
["greater" "equal"]
(str " ignore sub equal greater' equal;\n"
" ignore sub greater' equal [less greater bar colon exclam slash];\n")
;; #346 >>->> >>=>>
;; #974 keep >>=
["greater" "greater"]
(str " ignore sub [hyphen equal] greater' greater;\n"
" ignore sub greater' greater hyphen;\n"
" ignore sub greater' greater equal [equal less greater bar colon exclam slash];\n")
;; #346 <<-<< <<=<<
;; #974 keep <<=
["less" "less"]
(str " ignore sub [hyphen equal] less' less;\n"
" ignore sub less' less hyphen;\n"
" ignore sub less' less equal [equal less greater bar colon exclam slash];\n")
;; #346 ||-|| ||=||
;; #974 keep ||=
["bar" "bar"]
(str " ignore sub [hyphen equal] bar' bar;\n"
" ignore sub bar' bar hyphen;\n"
" ignore sub bar' bar equal [equal less greater bar colon exclam slash];\n")
;; #816 //=
["slash" "slash"]
(str " ignore sub equal slash' slash;\n"
" ignore sub slash' slash equal;\n")
;; #346 <--> >--< |--|
["hyphen" "hyphen"]
(str " ignore sub [less greater bar] hyphen' hyphen;\n"
" ignore sub hyphen' hyphen [less greater bar];\n")
;; #346 <==> >==< |==| /==/ =:== =!== ==:= ==!=
["equal" "equal"]
(str " ignore sub equal [colon exclam] equal' equal;\n"
" ignore sub [less greater bar slash] equal' equal;\n"
" ignore sub equal' equal [less greater bar slash] ;\n"
" ignore sub equal' equal [colon exclam] equal;\n")
;; #346 <===> >===< |===| /===/ =:=== =!=== ===:= ===!=
["equal" "equal" "equal"]
(str " ignore sub equal [colon exclam] equal' equal equal;\n"
" ignore sub [less greater bar slash] equal' equal equal;\n"
" ignore sub equal' equal equal [less greater bar slash];\n"
" ignore sub equal' equal equal [colon exclam] equal;\n")
))
;; DO NOT generate ignores at all
(def skip-ignores? #{
;; #410 <<*>> <<+>> <<$>>
["less" "asterisk" "greater"]
["less" "plus" "greater"]
["less" "dollar" "greater"]
})
;; 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]
(let [p1 (priorities l1 Long/MAX_VALUE)
p2 (priorities l2 Long/MAX_VALUE)
pc (compare p1 p2)
c1 (count l1)
c2 (count l2)
cc (compare c1 c2)]
(cond
(not= 0 pc) pc ;; lower priority first
(not= 0 cc) (- cc) ;; longer first
:else (compare l1 l2)))) ;; alphabetical
(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')]
(when-some [unused (not-empty (reduce dissoc ignores ligas'))]
(println " WARN Unused ignores" (str/join " " (keys unused))))
(when-some [unused (not-empty (reduce disj skip-ignores? ligas'))]
(println " WARN Unused skip-ignores?" (str/join " " unused)))
(when-some [unused (not-empty (reduce disj manual? ligas))]
(println " WARN Unused manual?" (str/join " " unused)))
(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" (constantly calt))))

View file

@ -0,0 +1,23 @@
(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} w))
(defn widths [font]
(doseq [g (:glyphs font)
:when (not= "0" (:export g))
:let [[w & _ :as ws] (mapv :width (:layers g))]]
(when-not (apply = ws)
(println (str "WARN glyph '" (:glyphname g) "' has different widths=" (pr-str ws))))
(when-not (width-ok? w)
(println (str "WARN glyph '" (:glyphname g) "' has unexpected width=" (pr-str w)))))
font)
(defn -main [& args]
(let [path (or (first args) "FiraCode.glyphs")
font (glyphs/load path)]
(widths font)))

View file

@ -0,0 +1,18 @@
(ns fira-code.classes
(:require
[clojure.java.io :as io]
[clojure.string :as str]
[fira-code.glyphs :as glyphs]
[fira-code.files :as files]))
(defn fill-class [font file]
(let [[_ name] (re-matches #"([^.]+)\.fea" (.getName file))
code (slurp file)
class {:code (str/trim code)
:name name}]
(glyphs/set-class font name class)))
(defn fill-all [font]
(reduce fill-class font (files/find "classes" #"classes/[^/]+\.fea")))

View file

@ -0,0 +1,25 @@
(ns fira-code.coll)
(defn index-of [pred xs]
(let [res (reduce (fn [i x] (if (pred x) (reduced i) (inc i))) 0 xs)]
(if (>= res (count xs))
-1
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)))
(defn multimap-by [f & kvs]
(reduce
(fn [m [k v]]
(if (contains? m k)
(update m k f v)
(assoc m k v)))
{} (partition 2 kvs)))

View file

@ -0,0 +1,37 @@
(ns fira-code.features
(:require
[clojure.java.io :as io]
[clojure.string :as str]
[fira-code.glyphs :as glyphs]
[fira-code.files :as files]))
(defn append-calt [font]
(let [features (->> (files/find "features/calt" #"features/calt/[^/]+\.fea")
(map slurp)
(map str/trim)
(str/join "\n\n"))]
(println " appending to feature calt" (glyphs/lines features) "lines")
(glyphs/update-code font :features "calt"
#(str % "\n\n" features))))
(defn fill-feature [font file]
(let [[_ name] (re-matches #"([^.]+)\.fea" (.getName file))
code (slurp file)
[_ notes code'] (re-matches #"(?s)#([^\n]+)\n(.*)" code)
feature (cond-> {:code (str/trim (or code' code))
:name name}
notes
(assoc :notes (str/trim notes)))]
(glyphs/set-feature font name feature)))
(defn fill-features [font]
(reduce fill-feature font (files/find "features" #"features/[^/]+\.fea")))
(defn fill-all [font]
(-> font
(append-calt)
(fill-features)))

View file

@ -0,0 +1,12 @@
(ns fira-code.files
(:refer-clojure :exclude [find])
(:require
[clojure.java.io :as io]
[clojure.string :as str]))
(defn find [path re]
(->> (file-seq (io/file path))
(next) ;; skip directory itself
(filter #(re-matches re (.getPath %)))
(sort-by #(.getPath %))))

View file

@ -1,9 +1,10 @@
(ns glyphs
(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)
@ -137,11 +138,11 @@
; (-> (slurp "FiraCode.glyphs") parse serialize (->> (spit "FiraCode_saved.glyphs")))
(defn load [path]
(println "Parsing" path "...")
(println (str "Parsing '" path "'..."))
(parse (slurp path)))
(defn save! [path font]
(println "Saving" path "...")
(println (str "Saving '" path "'..."))
(spit path (serialize font)))
(defn -main [& args]
@ -150,13 +151,54 @@
(binding [*out* os]
(fipp/pprint font {:width 200})))))
(def weights {:Regular "UUID0"
:Bold "BF448B58-7A35-489E-A1C9-12628F60690C"})
(defn update-code [font key name f & args]
(let [idx (coll/index-of #(= (:name %) name) (get font key))]
(assert (>= idx 0) (str "Cant find " key "[name=\"" name "\"], got " (str/join ", " (map :name (get font key)))))
(apply update-in font [key idx :code] f args)))
(defn lines [s]
(inc (count (re-seq #"\n" s))))
(defn words [s]
(count (re-seq #"[^\s]+" s)))
(defn set-feature [font name feature]
(let [idx (coll/index-of #(= (:name %) name) (:features font))]
(if (pos? idx)
(do
(println " replacing feature" name "with" (lines (:code feature)) "lines")
(assoc-in font [:features idx] feature))
(do
(println " appending to feature" name (lines (:code feature)) "lines")
(update font :features conj feature)))))
(defn set-class [font name class]
(let [idx (coll/index-of #(= (:name %) name) (:classes font))]
(if (pos? idx)
(do
(println " replacing class" name "with" (words (:code class)) "entries")
(assoc-in font [:classes idx] class))
(do
(println " appending to class" name (words (:code class)) "entries")
(update font :classes conj class)))))
(def weights
{:Light "B67F0F2D-EC95-4CB8-966E-23AE86958A69"
:Regular "UUID0"
:Bold "4B7A3BAF-EAD8-4024-9BEA-BB1DE86CFCFA"})
(defn layer [l]
{ :id (case (:layerId l)
((:Regular weights)) "Regular"
((:Bold weights)) "Bold"
{ :id (condp = (:layerId l)
(:Light weights) "Light"
(:Regular weights) "Regular"
(:Bold weights) "Bold"
(:layerId l))
:width (:width l) })

View file

@ -0,0 +1,33 @@
(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.classes :as classes]
[fira-code.features :as features]
[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)
(classes/fill-all)
(features/fill-all)
(spacers/add-spacers ligas)
(not-space/regen-not-space)
(checks/widths))]
(glyphs/save! path font')
(println)))

View file

@ -0,0 +1,14 @@
(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

@ -0,0 +1,31 @@
(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

@ -0,0 +1,13 @@
(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,215 +0,0 @@
;; clj -m regen-calt
(ns regen-calt
(:require
[clojure.string :as str]
[glyphs :as glyphs]))
;; 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"]])
(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"
})
;; 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 LIG 2' by 1_2.liga;\n"
" sub 1' 2 by LIG;\n"
"} 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 LIG LIG 3' by 1_2_3.liga;\n"
" sub LIG 2' 3 by LIG;\n"
" sub 1' 2 3 by LIG;\n"
"} 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 LIG LIG LIG 4' by 1_2_3_4.liga;\n"
" sub LIG LIG 3' 4 by LIG;\n"
" sub LIG 2' 3 4 by LIG;\n"
" sub 1' 2 3 4 by LIG;\n"
"} 1_2_3_4;")
#"\d" {"1" a "2" b "3" c "4" d}))))
(defn index-of [pred xs]
(reduce (fn [i x] (if (pred x) (reduced i) (inc i))) 0 xs))
(defn replace-calt [font calt]
(let [features (:features font)
idx (index-of #(= "calt" (:name %)) features)
code (get-in features [idx :code])
code' (str/replace code
#"### start of generated calt\n[^#]+\n### end of generated calt\n"
(str "### start of generated calt\n" calt "\n### end of generated calt\n"))]
(assoc-in font [:features idx :code] code')))
(defn compare-ligas [l1 l2]
(cond
(> (count l1) (count l2)) -1
(< (count l1) (count l2)) 1
:else (compare l1 l2)))
(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"] ... ]
calt (->> ligas (remove manual?) (sort compare-ligas) (map liga->rule) (str/join "\n\n"))
font' (replace-calt font calt)]
(glyphs/save! path font')
(println "Total ligatures count:" (count ligas))
(println " " (->> ligas
(group-by count)
(sort-by first)
(map (fn [[k v]] (str (count v) (case k 2 " pairs", 3 " triples", 4 " quadruples"))))
(str/join ", ")))
(println)))

View file

@ -1,26 +0,0 @@
;; clj -m regen-classes
(ns regen-classes
(:require
[clojure.string :as str]
[glyphs :as glyphs]
[flatland.ordered.map :refer [ordered-map]]))
(defn -main [& args]
(let [path (or (first args) "FiraCode.glyphs")
font (glyphs/load path)
not-spaces (->> (:glyphs font)
(remove #(re-find #"^\.|space$|space\." (:glyphname %)))
(remove #(= "0" (:export %))))
_ (println "Generating class:NotSpace with" (count not-spaces) "glyphs")
class (ordered-map
:code (str/join " " (map :glyphname not-spaces))
:name "NotSpace")
classes (->> (:classes font)
(remove #(= "NotSpace" (:name %)))
(cons class))
font' (assoc font :classes classes)
_ (glyphs/save! path font')
_ (println)]))
; (-main)

72
clojure/user.clj Normal file
View file

@ -0,0 +1,72 @@
(ns user
(:require
[clojure.core.server :as server]
[clojure.java.io :as io]
[clojure.tools.namespace.repl :as ns]
[clojure.tools.namespace.track :as track]))
(ns/disable-reload!)
(ns/set-refresh-dirs "clojure")
(def *reloaded
(atom nil))
(add-watch #'ns/refresh-tracker ::watch
(fn [_ _ old new]
(when (empty? (::track/load new))
(reset! *reloaded (::track/load old)))))
(defn after-reload []
(let [cnt (count @*reloaded)]
(str "Reloaded " cnt " namespace" (when (> cnt 1) "s"))))
(defn reload []
(set! *warn-on-reflection* true)
; (set! *unchecked-math* :warn-on-boxed)
(let [res (ns/refresh :after 'user/after-reload)]
(if (instance? Throwable res)
(throw res)
res)))
(def p-lock
(Object.))
(defn p-pos []
(let [trace (->> (Thread/currentThread)
(.getStackTrace)
(seq))
el ^StackTraceElement (nth trace 4)]
(str "[" (clojure.lang.Compiler/demunge (.getClassName el)) " " (.getFileName el) ":" (.getLineNumber el) "]")))
(defn p-impl [position form res]
(let [form (clojure.walk/postwalk
(fn [form]
(if (and
(list? form)
(= 'user/p-impl (first form)))
(clojure.lang.TaggedLiteral/create 'p (nth form 3))
form))
form)]
(locking p-lock
(println (str position " #p " form " => " (pr-str res))))
res))
(defn p [form]
`(p-impl (p-pos) '~form ~form))
(defn -main [& args]
;; setup repl
(let [args (apply array-map args)
port (or
(some-> (get args "--port") parse-long)
(+ 1024 (rand-int 64512)))
file (io/file ".repl-port")]
(println "Started Server Socket REPL on port" port)
(spit file port)
(.deleteOnExit file)
(server/start-server
{:name "repl"
:port port
:accept 'clojure.core.server/repl
:server-daemon false})))

View file

@ -1,4 +1,5 @@
{: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"}}}
:deps {org.clojure/clojure {:mvn/version "1.11.1"}
org.flatland/ordered {:mvn/version "1.5.7"}
fipp/fipp {:mvn/version "0.6.18"}
org.clojure/tools.namespace {:mvn/version "1.3.0"}}}

View file

@ -1,123 +0,0 @@
Return to [FiraCode](https://github.com/tonsky/FiraCode)
### [](#installing-font)Installing font
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 [chocolatey](https://chocolatey.org): `choco install firacode`
Mac:
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 [brew](http://brew.sh) and [cask](https://caskroom.github.io):
_Not officially supported, might install outdated version_
<div class="highlight highlight-source-shell">
brew tap caskroom/fonts
brew cask install font-fira-code
Linux:
* Install a package available for your distribution following [the instructions](https://github.com/tonsky/FiraCode/wiki/Linux-instructions#installing-with-a-package-manager)
_or_
* In the ttf folder double-click each font file and click “Install font”; see [“Manual Installation”](https://github.com/tonsky/FiraCode/wiki/Linux-instructions#manual-installation) if double-clicking doesn't work
FreeBSD:
* Using pkg(8): `pkg install firacode`
_or_
* Using ports: `cd /usr/ports/x11-fonts/firacode && make install clean`
### [](#how-to-enable-ligatures)How to enable ligatures
You need to explicitly enable ligatures support in following editors:
* [Atom](https://github.com/tonsky/FiraCode/wiki/Atom-instructions)
* [Brackets](https://github.com/tonsky/FiraCode/wiki/Brackets-Instructions/)
* [Cloud9](https://github.com/tonsky/FiraCode/wiki/cloud9-instructions)
* [Jetbrains' products](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions) (IntelliJ, etc)
* [Emacs](https://github.com/tonsky/FiraCode/wiki/Emacs-instructions)
* [MacVim](https://github.com/tonsky/FiraCode/wiki/MacVim-instructions)
* [VS Code](https://github.com/tonsky/FiraCode/wiki/VS-Code-Instructions)
* [BBEdit](https://github.com/tonsky/FiraCode/wiki/BBEdit-instructions)
* [LightTable](https://github.com/tonsky/FiraCode/wiki/LightTable-instructions)
* [Sublimetext](https://github.com/tonsky/FiraCode/wiki/Sublimetext-Instructions)
For other editors it must be enough to simply select Fira Code as your font of choice. [Full list of supported editors](https://github.com/tonsky/FiraCode#editor-support)
### [](#troubleshooting)Troubleshooting
#### [](#1-make-sure-the-font-your-editor-displays-is-actually-fira-code)1\. Make sure the font your editor displays is actually Fira Code
Easiest way is to compare the shape of `@` `&` and `r` with the reference image:
![](https://user-images.githubusercontent.com/285292/26971424-c609be76-4d15-11e7-8684-23e7b1c08929.png)
Issues: [#393](https://github.com/tonsky/FiraCode/issues/393) [#373](https://github.com/tonsky/FiraCode/issues/373) [#227](https://github.com/tonsky/FiraCode/issues/227)
#### [](#2-make-sure-youve-enabled-ligatures-in-your-editor)2\. Make sure youve enabled ligatures in your editor
Consult this wiki (see above ↑) for instruction on how to do that.
Issues: [#291](https://github.com/tonsky/FiraCode/issues/291)
#### [](#3-make-sure-youre-on-the-latest-version-of-fira-code)3\. Make sure youre on the latest version of Fira Code
Consult [CHANGELOG](https://github.com/tonsky/FiraCode/blob/master/CHANGELOG.md) to see when it was last updated.
#### [](#4-check-the-list-of-known-issues-below-)4\. Check the list of known issues below ↓
### [](#known-issues)Known issues
#### [](#hinting-issues)Hinting issues
* Uneven spacing in `===` and `!==` at certain font sizes, esp. on Windows [#405](https://github.com/tonsky/FiraCode/issues/405) [#243](https://github.com/tonsky/FiraCode/issues/243) [#119](https://github.com/tonsky/FiraCode/issues/119) [#114](https://github.com/tonsky/FiraCode/issues/114)
* Different height of `[]` at certain font sizes [#332](https://github.com/tonsky/FiraCode/issues/332) [#251](https://github.com/tonsky/FiraCode/issues/251)
#### [](#powerline-characters-are-of-slightly-wrong-size)Powerline characters are of slightly wrong size
Unfortunately this cant be fixed for all terminals because they have different ways of calculate font metrics. See [this comment](https://github.com/tonsky/FiraCode/issues/44#issuecomment-187305276)
Issues: [#426](https://github.com/tonsky/FiraCode/issues/426) [#131](https://github.com/tonsky/FiraCode/issues/131) [#44](https://github.com/tonsky/FiraCode/issues/44)
#### [](#some-ligatures-work-while-some-dont)Some ligatures work while some dont
This is an issue with your editor and how it handles tokenization/syntax highlighting. Nothing can be done in a font to work around that. Report your problem to the corresponding editors issue tracker.
* All ligatures with dashes in Visual Studio (not Code) [#422](https://github.com/tonsky/FiraCode/issues/422) [#395](https://github.com/tonsky/FiraCode/issues/395) [#360](https://github.com/tonsky/FiraCode/issues/360) [#273](https://github.com/tonsky/FiraCode/issues/273) [#259](https://github.com/tonsky/FiraCode/issues/259) [#233](https://github.com/tonsky/FiraCode/issues/233) [#220](https://github.com/tonsky/FiraCode/issues/220) [#196](https://github.com/tonsky/FiraCode/issues/196) [#181](https://github.com/tonsky/FiraCode/issues/181) [#157](https://github.com/tonsky/FiraCode/issues/157) [#99](https://github.com/tonsky/FiraCode/issues/99) [#43](https://github.com/tonsky/FiraCode/issues/43) [#32](https://github.com/tonsky/FiraCode/issues/32)
* Ligatures in column 100 in VS Code [#403](https://github.com/tonsky/FiraCode/issues/403) [#397](https://github.com/tonsky/FiraCode/issues/397) [#372](https://github.com/tonsky/FiraCode/issues/372)
* Atom/VS Code are known to break certain ligatures in certain syntaxes [#361](https://github.com/tonsky/FiraCode/issues/361) [#353](https://github.com/tonsky/FiraCode/issues/353) [#348](https://github.com/tonsky/FiraCode/issues/348) [#328](https://github.com/tonsky/FiraCode/issues/328) [#326](https://github.com/tonsky/FiraCode/issues/326) [#235](https://github.com/tonsky/FiraCode/issues/235)
#### [](#corrupted-font-in-intellij-on-windows)Corrupted font in IntelliJ on Windows
Go to `C:\Windows\Fonts` with `cmd.exe`, find and delete everything having Fira in the file name. Its important that you use terminal commands, not Explorer.
Issues: [#589](https://github.com/tonsky/FiraCode/issues/589) [#581](https://github.com/tonsky/FiraCode/issues/581) [#398](https://github.com/tonsky/FiraCode/issues/398) [IDEA-159901](https://youtrack.jetbrains.com/issue/IDEA-159901)
#### [](#anything-related-to-italics)Anything related to italics
Fira Code does not have italics at all. If you see italicized glyphs it means your editor is “faking” them.
Issues: [#375](https://github.com/tonsky/FiraCode/issues/375) [#320](https://github.com/tonsky/FiraCode/issues/320) [#281](https://github.com/tonsky/FiraCode/issues/281)

560
distr/README.txt Normal file
View file

@ -0,0 +1,560 @@
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 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/ttf-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
------
To install, perform the following commands:
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
------
1. Install FiraCode as per the [macOS installation instructions](https://github.com/tonsky/FiraCode/wiki/Installing#macos)
2. Open BBEdit preferences, Editor Defaults, assign Fira Code as the Default font
Brackets
--------
1. From the `View` menu choose `Themes....`
2. Paste `'Fira Code'`, at the beginning 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 Apply 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,7 +1,7 @@
@font-face {
font-family: 'Fira Code';
src: url('woff2/FiraCode-Light.woff2') format('woff2'),
url("woff/FiraCode-Light.woff") format("woff");
url('woff/FiraCode-Light.woff') format('woff');
font-weight: 300;
font-style: normal;
}
@ -9,7 +9,7 @@
@font-face {
font-family: 'Fira Code';
src: url('woff2/FiraCode-Regular.woff2') format('woff2'),
url("woff/FiraCode-Regular.woff") format("woff");
url('woff/FiraCode-Regular.woff') format('woff');
font-weight: 400;
font-style: normal;
}
@ -17,15 +17,23 @@
@font-face {
font-family: 'Fira Code';
src: url('woff2/FiraCode-Medium.woff2') format('woff2'),
url("woff/FiraCode-Medium.woff") format("woff");
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");
url('woff/FiraCode-Bold.woff') format('woff');
font-weight: 700;
font-style: normal;
}
@ -33,8 +41,8 @@
@font-face {
font-family: 'Fira Code VF';
src: url('woff2/FiraCode-VF.woff2') format('woff2-variations'),
url('woff/FiraCode-VF.woff') format('woff-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;
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,5 +1,5 @@
<!DOCTYPE html>
<html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
@ -19,6 +19,7 @@
.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; }
@ -35,50 +36,60 @@
<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
take = (n, [x, <i>...</i>xs]:list) <i>--&gt;</i>
| n <i>&lt;=</i> 0 <i>=&gt;</i> []
| empty list <i>=&gt;</i> []
| otherwise <i>=&gt;</i> [x] <i>++</i> take n-1, xs
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
last3 = reverse <i>&gt;&gt;</i> take 3 <i>&gt;&gt;</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
| n <i>&lt;=</i> 0 <i>=&gt;</i> []
| empty list <i>=&gt;</i> []
| otherwise <i>=&gt;</i> [x] <i>++</i> take n-1, xs
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
last3 = reverse <i>&gt;&gt;</i> take 3 <i>&gt;&gt;</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
take = (n, [x, <i>...</i>xs]:list) <i>--&gt;</i>
| n <i>&lt;=</i> 0 <i>=&gt;</i> []
| empty list <i>=&gt;</i> []
| otherwise <i>=&gt;</i> [x] <i>++</i> take n-1, xs
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
last3 = reverse <i>&gt;&gt;</i> take 3 <i>&gt;&gt;</i> reverse</div>
<div class="code semibold"><b># Fira Code SemiBold</b>
take = (n, [x, <i>...</i>xs]:list) <i>--&gt;</i>
| n <i>&lt;=</i> 0 <i>=&gt;</i> []
| empty list <i>=&gt;</i> []
| otherwise <i>=&gt;</i> [x] <i>++</i> take n-1, xs
last3 = reverse <i>&gt;&gt;</i> take 3 <i>&gt;&gt;</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
take = (n, [x, <i>...</i>xs]:list) <i>--&gt;</i>
| n <i>&lt;=</i> 0 <i>=&gt;</i> []
| empty list <i>=&gt;</i> []
| otherwise <i>=&gt;</i> [x] <i>++</i> take n-1, xs
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
last3 = reverse <i>&gt;&gt;</i> take 3 <i>&gt;&gt;</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
take = (n, [x, <i>...</i>xs]:list) <i>--&gt;</i>
| n <i>&lt;=</i> 0 <i>=&gt;</i> []
| empty list <i>=&gt;</i> []
| otherwise <i>=&gt;</i> [x] <i>++</i> take n-1, xs
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
last3 = reverse <i>&gt;&gt;</i> take 3 <i>&gt;&gt;</i> reverse</div>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

63
docs/calt_performance.md Normal file
View file

@ -0,0 +1,63 @@
# 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
```

BIN
extras/arrows.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

BIN
extras/arrows_es.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
extras/console.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
extras/console_es.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
extras/download.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
extras/download_es.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

BIN
extras/ligatures.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

BIN
extras/ligatures_es.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

1
extras/logo.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 56 KiB

BIN
extras/math.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
extras/math_es.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

BIN
extras/progress.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
extras/progress.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
extras/progress_es.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
extras/samples.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

BIN
extras/samples2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

376
extras/showcases.txt Normal file
View file

@ -0,0 +1,376 @@
.= ..= := ::= =:= __
== != === !== =/= =!=
<-< <<- <-- <- <-> -> --> ->> >->
<=< <== <<->> <=> => ==> =>> >=>
>>- >- <~> -< -<< =<<
<-| <=| /\ \/ |-> |=>
<~~ <~ ~~ ~> ~~>
<<< << <= <> >= >> >>>
{. {| [| |] |} .}
<:> >:< >:> <:< :>: :<: :> :< >: <:
<||| <|| <| <|> |> ||> |||>
<$ <$> $>
<+ <+> +>
<* <*> *>
\n \\ /* */ /// //
</ <!-- </> --> />
0xF www Fl Tl Il fi fj
;; :: ::: !! ?? %% &&
|| .. ... ..< .? ?.
-- --- ++ +++ ** ***
=~ !~ ~- -~ ~@
^= ?= /= /==
-| _|_ |- ||-
#! #= ## ### ####
#{ #[ ]# #( #? #_ #_(
# Context-aware alignment
fii fjj
a*b a*A B*b A*B *a *A a* A*
a-b a-A B-b A-B -a -A a- A-
a+b a+A B+b A+B +a +A a+ A+
a:b a:A B:b A:B :a :A a: A:
# Powerline
      
# Stylistic sets
r 0 123456789 & && $ <$ <$> $> @ <= >=
# Unicode
      
⌀ ⌃ ⌄ ⌅ ⌆ ⌘ ⌤ ⌥ ⎇ ⎋ ⏏ ⎈ ✓ ⌂ ⇪ ⌧ ⌫ ⌦ ⌨ ⏎ <20>
☐ ☑ ☒ ■ □ ▢ ▣ ▤ ▦ ▧ ▨ ▩ ◧ ◨ ◩ ◪ ◫ ◰ ◱ ◲ ◳
⊜ 🄍 🄎 🄏 🅭 🅮 🅯 🆭
⟲ ⟳ ⟰ ⟱ ⟴ ⟵ ⟶ ⟷ ⟸ ⟹ ⟺ ⟻ ⟼ ⟽ ⟾ ⟿ ↩ ↪ ⇞ ⇟ ⇤ ⇥ ↰ ↱ ↲ ↳ ❰ ❱
           
≢ ẞ ᐅ ᐊ ∴ ∵ ⎈ ‖ ∧ ⊢ ⊣ ⊥ ⊦ ⊧ ⊨ ⊩ ⊪ ⊫ ⊬ ⊭ ⊮ ⊯
⟲ ⟳ ⟰ ⟱ ⟴ ⟵ ⟶ ⟷ ⟸ ⟹ ⟺ ⟻ ⟼ ⟽ ⟾ ⟿
↩ ⇞ ⇟ ⇤ ⇥ ⌀ ⌃ ⌄ ⌅ ⌆ ⌘ ⌤ ⌥ ⎇ ⎋ ⏏ ✓ ☐ ☑ ☒ ▤ ▦ ▧ ▨ ▩
␆ ␈ ␇ ␣ ␢ ␘ ␍ ␐ ␡ ␥ ␔ ␑ ␓ ␒ ␙ ␃ ␄ ␗ ␅ ␛ ␜ ␌ ␝ ␉ ␊ ␕ ␤ ␀ ␞ ␏ ␎ ␠ ␁ ␂ ␚ ␦ ␖ ␟ ␋
𝔹 ∀ ∃ ∄ ∅ ⊂ ⊃ ⊄ ⊅ ⊆ ⊇ ⊈ ⊉ ⊊ ⊋ ∈ ∉ ∊ ∋ ∌ ∍
☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷ 「a」 「a」
# Box drawing
╭╌╌╌╌╮ ╭┄┄┄┄╮ ╭┈┈┈┈╮
╎ ╏ ┆ ┇ ┊ ┋
╎ ╏ ┆ ┇ ┊ ┋
╰╍╍╍╍╯ ╰┅┅┅┅╯ ╰┉┉┉┉╯
┌─┬─┐ ╔╦═╗ ┏━┳┓ ╒═╤═╗ ╭─┰─╮ ○ ○ ◆ ◆
├─┼─┤ ╠╬═╣ ┣━╋┫ ├─┼─╢ ┝━╋━┥ ╲
└─┴─┘ ╚╩═╝ ┗━┻┛ ╘═╧═╝ ╰─┸─╯ ■ ◆ ◆
# Blocks
|███ | 50%
▖ ▗ ▙ ▚ ▛ ▜ ▞ ▟
▁▂▃▄▅▆▇█▀▔
# Multi-line brackets
⎛ 1 ⎞ ⎡ a ⎤ ⎧ x ⎫
⎜ 2 ⎟ ⎢ b ⎥ ⎪ y ⎪
⎜ 3 ⎟ ⎢ c ⎥ ⎨ z ⎬
⎜ 4 ⎟ ⎢ d ⎥ ⎪ y ⎪
⎝ 5 ⎠ ⎣ e ⎦ ⎩ x ⎭
# Stylistic sets
cv01 a
cv02 g
cv03..06 i
cv07..10 l
ss01 r
zero, cv11..13 0
cv14 3
onum 0123456789
cv17 ~
ss05 @
ss04 $
cv18 %
ss03 &
cv15..16 *
cv31 ()
cv29 {}
cv30 |
ss02 <= >=
cv19..20 <=
cv23 >=
cv21..22 =<
ss08 == === != !==
cv24 /=
ss09 >>= <<= ||= |=
cv25 .-
cv26 :-
cv32 .=
cv27 []
cv28 {. .}
ss06 \\
ss07 =~ !~
ss10 Fl Tl fi fj fl ft
# Arbitrary-length arrows #346
<---------------------------------------------<<
<- <-- <--- <---- ----> ---> --> ->
>- >-- >--- >---- ----< ---< --< -<
|- |-- |--- |---- ----| ---| --| -|
<<- <<-- <<--- <<---- ---->> --->> -->> ->>
>>- >>-- >>--- >>---- ----<< ---<< --<< -<<
||- ||-- ||--- ||---- ----|| ---|| --|| -||
----- ----< ---<< ----> --->> ----| ---||
<---- <---< <--<< <---> <-->> <---| <--|| --<--
<<--- <<--< <<-<< <<--> <<->> <<--| <<-|| -<<-
>---- >---< >--<< >---> >-->> >---| >--|| -->--
>>--- >>--< >>-<< >>--> >>->> >>--| >>-|| ->>-
|---- |---< |--<< |---> |-->> |---| |--|| --|--
||--- ||--< ||-<< ||--> ||->> ||--| ||-|| -||-
|-<-<<->>->-|-||-|
|--<--<<-->>-->--|--||--|
|---<---<<--->>--->---|---||---|
< -< --< ---< ----<
<- -<- --<- ---<- ----<-
<-- -<-- --<-- ---<-- ----<--
<--- -<--- --<--- ---<--- ----<---
<---- -<---- --<---- ---<---- ----<----
> -> --> ---> ---->
>- ->- -->- --->- ---->-
>-- ->-- -->-- --->-- ---->--
>--- ->--- -->--- --->--- ---->---
>---- ->---- -->---- --->---- ---->----
| -| --| ---| ----|
|- -|- --|- ---|- ----|-
|-- -|-- --|-- ---|-- ----|--
|--- -|--- --|--- ---|--- ----|---
|---- -|---- --|---- ---|---- ----|----
<< -<< --<< ---<< ----<<
<<- -<<- --<<- ---<<- ----<<-
<<-- -<<-- --<<-- ---<<-- ----<<--
<<--- -<<--- --<<--- ---<<--- ----<<---
<<---- -<<---- --<<---- ---<<---- ----<<----
>> ->> -->> --->> ---->>
>>- ->>- -->>- --->>- ---->>-
>>-- ->>-- -->>-- --->>-- ---->>--
>>--- ->>--- -->>--- --->>--- ---->>---
>>---- ->>---- -->>---- --->>---- ---->>----
|| -|| --|| ---|| ----||
||- -||- --||- ---||- ----||-
||-- -||-- --||-- ---||-- ----||--
||--- -||--- --||--- ---||--- ----||---
||---- -||---- --||---- ---||---- ----||----
<<< -<<< --<<< ---<<< ----<<<
<<<- -<<<- --<<<- ---<<<- ----<<<-
<<<-- -<<<-- --<<<-- ---<<<-- ----<<<--
<<<--- -<<<--- --<<<--- ---<<<--- ----<<<---
<<<---- -<<<---- --<<<---- ---<<<---- ----<<<----
>>> ->>> -->>> --->>> ---->>>
>>>- ->>>- -->>>- --->>>- ---->>>-
>>>-- ->>>-- -->>>-- --->>>-- ---->>>--
>>>--- ->>>--- -->>>--- --->>>--- ---->>>---
>>>---- ->>>---- -->>>---- --->>>---- ---->>>----
||| -||| --||| ---||| ----|||
|||- -|||- --|||- ---|||- ----|||-
|||-- -|||-- --|||-- ---|||-- ----|||--
|||--- -|||--- --|||--- ---|||--- ----|||---
|||---- -|||---- --|||---- ---|||---- ----|||----
# Equal-based arrows
<====================================================<<
<= <== <=== <==== ====> ===> ==> =>
>= >== >=== >==== ====< ===< ==< =<
|= |== |=== |==== ====| ===| ==| =|
<<= <<== <<=== <<==== ====>> ===>> ==>> =>>
>>= >>== >>=== >>==== ====<< ===<< ==<< =<<
||= ||== ||=== ||==== ====|| ===|| ==|| =||
===== ====< ===<< ====> ===>> ====| ===|| ====/
<==== <===< <==<< <===> <==>> <===| <==|| <===/ ==<==
<<=== <<==< <<=<< <<==> <<=>> <<==| <<=|| <<==/ =<<=
>==== >===< >==<< >===> >==>> >===| >==|| >===/ ==>==
>>=== >>==< >>=<< >>==> >>=>> >>==| >>=|| >>==/ =>>=
|==== |===< |==<< |===> |==>> |===| |==|| |===/ ==|==
||=== ||==< ||=<< ||==> ||=>> ||==| ||=|| ||==/ =||=
/==== /===< /==<< /===> /==>> /===| /==|| /===/ ==/==
|=<=<<=>>=>=|=||=/=:=!=|
|==<==<<==>>==>==|==||==/==:==!==|
|===<===<<===>>===>===|===||===/===:===!===|
< =< ==< ===< ====<
<= =<= ==<= ===<= ====<=
<== =<== ==<== ===<== ====<==
<=== =<=== ==<=== ===<=== ====<===
<==== =<==== ==<==== ===<==== ====<====
> => ==> ===> ====>
>= =>= ==>= ===>= ====>=
>== =>== ==>== ===>== ====>==
>=== =>=== ==>=== ===>=== ====>===
>==== =>==== ==>==== ===>==== ====>====
| =| ==| ===| ====|
|= =|= ==|= ===|= ====|=
|== =|== ==|== ===|== ====|==
|=== =|=== ==|=== ===|=== ====|===
|==== =|==== ==|==== ===|==== ====|====
/ =/ ==/ ===/ ====/
/= =/= ==/= ===/= ====/=
/== =/== ==/== ===/== ====/==
/=== =/=== ==/=== ===/=== ====/===
/==== =/==== ==/==== ===/==== ====/====
: =: ==: ===: ====:
:= =:= ==:= ===:= ====:=
:== =:== ==:== ===:== ====:==
:=== =:=== ==:=== ===:=== ====:===
:==== =:==== ==:==== ===:==== ====:====
! =! ==! ===! ====!
!= =!= ==!= ===!= ====!=
!== =!== ==!== ===!== ====!==
!=== =!=== ==!=== ===!=== ====!===
!==== =!==== ==!==== ===!==== ====!====
<< =<< ==<< ===<< ====<<
<<= =<<= ==<<= ===<<= ====<<=
<<== =<<== ==<<== ===<<== ====<<==
<<=== =<<=== ==<<=== ===<<=== ====<<===
<<==== =<<==== ==<<==== ===<<==== ====<<====
>> =>> ==>> ===>> ====>>
>>= =>>= ==>>= ===>>= ====>>=
>>== =>>== ==>>== ===>>== ====>>==
>>=== =>>=== ==>>=== ===>>=== ====>>===
>>==== =>>==== ==>>==== ===>>==== ====>>====
|| =|| ==|| ===|| ====||
||= =||= ==||= ===||= ====||=
||== =||== ==||== ===||== ====||==
||=== =||=== ==||=== ===||=== ====||===
||==== =||==== ==||==== ===||==== ====||====
// =// ==// ===// ====//
//= =//= ==//= ===//= ====//=
//== =//== ==//== ===//== ====//==
//=== =//=== ==//=== ===//=== ====//===
//==== =//==== ==//==== ===//==== ====//====
:: =:: ==:: ===:: ====::
::= =::= ==::= ===::= ====::=
::== =::== ==::== ===::== ====::==
::=== =::=== ==::=== ===::=== ====::===
::==== =::==== ==::==== ===::==== ====::====
!! =!! ==!! ===!! ====!!
!!= =!!= ==!!= ===!!= ====!!=
!!== =!!== ==!!== ===!!== ====!!==
!!=== =!!=== ==!!=== ===!!=== ====!!===
!!==== =!!==== ==!!==== ===!!==== ====!!====
<<< =<<< ==<<< ===<<< ====<<<
<<<= =<<<= ==<<<= ===<<<= ====<<<=
<<<== =<<<== ==<<<== ===<<<== ====<<<==
<<<=== =<<<=== ==<<<=== ===<<<=== ====<<<===
<<<==== =<<<==== ==<<<==== ===<<<==== ====<<<====
>>> =>>> ==>>> ===>>> ====>>>
>>>= =>>>= ==>>>= ===>>>= ====>>>=
>>>== =>>>== ==>>>== ===>>>== ====>>>==
>>>=== =>>>=== ==>>>=== ===>>>=== ====>>>===
>>>==== =>>>==== ==>>>==== ===>>>==== ====>>>====
||| =||| ==||| ===||| ====|||
|||= =|||= ==|||= ===|||= ====|||=
|||== =|||== ==|||== ===|||== ====|||==
|||=== =|||=== ==|||=== ===|||=== ====|||===
|||==== =|||==== ==|||==== ===|||==== ====|||====
/// =/// ==/// ===/// ====///
///= =///= ==///= ===///= ====///=
///== =///== ==///== ===///== ====///==
///=== =///=== ==///=== ===///=== ====///===
///==== =///==== ==///==== ===///==== ====///====
::: =::: ==::: ===::: ====:::
:::= =:::= ==:::= ===:::= ====:::=
:::== =:::== ==:::== ===:::== ====:::==
:::=== =:::=== ==:::=== ===:::=== ====:::===
:::==== =:::==== ==:::==== ===:::==== ====:::====
!!! =!!! ==!!! ===!!! ====!!!
!!!= =!!!= ==!!!= ===!!!= ====!!!=
!!!== =!!!== ==!!!== ===!!!== ====!!!==
!!!=== =!!!=== ==!!!=== ===!!!=== ====!!!===
!!!==== =!!!==== ==!!!==== ===!!!==== ====!!!====
# Underscore lines
_ __ ___ ____
_|_ __|_ _|__ __|__
_| |_ _||_ __| ___| |__ |___
# Numbersign lines
# ## ### #### ##### ######
# Progress bars
[...........] [-----------] 
[#..........] [>----------] 
[##.........] [=>---------] 
[###........] [==>--------] 
[####.......] [===>-------] 
[#####......] [====>------] 
[######.....] [=====>-----] 
[#######....] [======>----] 
[########...] [=======>---] 
[#########..] [========>--] 
[##########.] [=========>-] 
[###########] [==========>] 
# Sanity check
- -- --- |> <| ||> <|| |||> <||| <!-- -~ .- ~-
= == === .= ..= := ::= != !== ?= #= ^=
<= <=< <=> <=|
>=
#548 >=< >=> >=| >=<< >>=<
#479 #468 #424 #406 #355 #305 =< ==< =<< |=<
#574 :>=
#621 <||>
#1056 =/

BIN
extras/sponsor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
extras/sponsor_es.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
extras/texture.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
extras/typographics.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

BIN
extras/typographics_es.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

25
features/calt/center.fea Normal file
View file

@ -0,0 +1,25 @@
### Vertical-align colon/greater/less
# :> :< >: <:
# :>: :<:
# <:> >:< <:< >:>
# <::> <::< >::< >::>
# <:::> <:::< >:::< >:::>
# <::::> <::::< >::::< >::::>
lookup center {
#574 :>= :<=
ignore sub colon' [less greater] [equal hyphen];
#1145 ::< ::> <:: >::
ignore sub colon colon' [less greater];
ignore sub [less greater]' colon colon;
# middles & ends
sub [less.center greater.center colon.center] colon' by colon.center;
sub colon.center [less greater]' by [less.center greater.center];
# starts
sub [less greater]' colon by [less.center greater.center];
sub colon' [less greater] by colon.center;
} center;

View file

@ -0,0 +1,15 @@
### Logical conjunction/disjunction #738
lookup slash_backslash {
ignore sub @NotSpace slash' backslash;
ignore sub slash' backslash @NotSpace;
sub slash.spacer backslash' by slash_backslash.liga;
sub slash' backslash by slash.spacer;
} slash_backslash;
lookup backslash_slash {
ignore sub @NotSpace backslash' slash;
ignore sub backslash' slash @NotSpace;
sub backslash.spacer slash' by backslash_slash.liga;
sub backslash' slash by backslash.spacer;
} backslash_slash;

9
features/calt/cross.fea Normal file
View file

@ -0,0 +1,9 @@
lookup hexadecimal_x {
### 0xFF
sub [zero zero.zero] x' [@Digit @HexDigit] by x.multiply;
sub [zero.tosf zero.zero.tosf zero.tosf.zero] x' [@DigitTosf @HexDigit] by x.multiply.tosf;
### 800x600
sub @Digit x' @Digit by x.multiply;
sub @DigitTosf x' @DigitTosf by x.multiply.tosf;
} hexadecimal_x;

4
features/calt/dashes.fea Normal file
View file

@ -0,0 +1,4 @@
### Long dashes
sub twoemdash by hyphen_start.seq hyphen_end.seq;
sub threeemdash by hyphen_start.seq hyphen_middle.seq hyphen_end.seq;

View file

@ -0,0 +1,73 @@
lookup equal_arrows {
# Disable |||
ignore sub bar bar' bar equal;
ignore sub bar bar' equal;
ignore sub [equal_start.seq equal_middle.seq] bar' bar bar;
# equal middle & end
sub [less_equal_start.seq less_less_equal_start.seq less_equal_middle.seq less_less_equal_middle.seq greater_equal_start.seq greater_greater_equal_start.seq greater_equal_middle.seq greater_greater_equal_middle.seq bar_equal_start.seq bar_bar_equal_start.seq bar_equal_middle.seq bar_bar_equal_middle.seq slash_equal_start.seq slash_slash_equal_start.seq slash_equal_middle.seq slash_slash_equal_middle.seq colon_equal_middle.seq exclam_equal_middle.seq equal_start.seq equal_middle.seq] equal' [equal less greater bar slash colon exclam] by equal_middle.seq;
sub [less_equal_start.seq less_less_equal_start.seq less_equal_middle.seq less_less_equal_middle.seq greater_equal_start.seq greater_greater_equal_start.seq greater_equal_middle.seq greater_greater_equal_middle.seq bar_equal_start.seq bar_bar_equal_start.seq bar_equal_middle.seq bar_bar_equal_middle.seq slash_equal_start.seq slash_slash_equal_start.seq slash_equal_middle.seq slash_slash_equal_middle.seq colon_equal_middle.seq exclam_equal_middle.seq equal_start.seq equal_middle.seq] equal' by equal_end.seq;
# double middles
sub [equal_start.seq equal_middle.seq] less.spacer less' equal by less_less_equal_middle.seq;
sub [equal_start.seq equal_middle.seq] less' less equal by less.spacer;
sub [equal_start.seq equal_middle.seq] greater.spacer greater' equal by greater_greater_equal_middle.seq;
sub [equal_start.seq equal_middle.seq] greater' greater equal by greater.spacer;
sub [equal_start.seq equal_middle.seq] bar.spacer bar' equal by bar_bar_equal_middle.seq;
sub [equal_start.seq equal_middle.seq] bar' bar equal by bar.spacer;
sub [equal_start.seq equal_middle.seq] slash.spacer slash' equal by slash_slash_equal_middle.seq;
sub [equal_start.seq equal_middle.seq] slash' slash equal by slash.spacer;
# single middles
sub [equal_start.seq equal_middle.seq] less' equal by less_equal_middle.seq;
sub [equal_start.seq equal_middle.seq] greater' equal by greater_equal_middle.seq;
sub [equal_start.seq equal_middle.seq] bar' equal by bar_equal_middle.seq;
sub [equal_start.seq equal_middle.seq] slash' equal by slash_equal_middle.seq;
sub [equal_start.seq equal_middle.seq] colon' equal by colon_equal_middle.seq;
sub [equal_start.seq equal_middle.seq] exclam' equal by exclam_equal_middle.seq;
# double ends
sub [equal_start.seq equal_middle.seq] less.spacer less' by less_less_equal_end.seq;
sub [equal_start.seq equal_middle.seq] less' less by less.spacer;
sub [equal_start.seq equal_middle.seq] greater.spacer greater' by greater_greater_equal_end.seq;
sub [equal_start.seq equal_middle.seq] greater' greater by greater.spacer;
sub [equal_start.seq equal_middle.seq] bar.spacer bar' by bar_bar_equal_end.seq;
sub [equal_start.seq equal_middle.seq] bar' bar by bar.spacer;
sub [equal_start.seq equal_middle.seq] slash.spacer slash' by slash_slash_equal_end.seq;
sub [equal_start.seq equal_middle.seq] slash' slash by slash.spacer;
# single ends
sub [equal_start.seq equal_middle.seq] less' by less_equal_end.seq;
sub [equal_start.seq equal_middle.seq] greater' by greater_equal_end.seq;
sub [equal_start.seq equal_middle.seq] bar' by bar_equal_end.seq;
sub [equal_start.seq equal_middle.seq] slash' by slash_equal_end.seq;
# double beginnings
sub less.spacer less' equal by less_less_equal_start.seq;
sub less' less equal by less.spacer;
sub greater.spacer greater' equal by greater_greater_equal_start.seq;
sub greater' greater equal by greater.spacer;
sub bar.spacer bar' equal by bar_bar_equal_start.seq;
sub bar' bar equal by bar.spacer;
sub slash.spacer slash' equal by slash_slash_equal_start.seq;
sub slash' slash equal by slash.spacer;
# Disable >=< #548
sub greater' equal less [equal less] by greater_equal_start.seq;
ignore sub greater' equal less;
# Disable =< #479 #468 #424 #406 #355 #305
sub equal' less [equal less] by equal_start.seq;
# Disable =/ #1056
sub equal' slash [equal slash] by equal_start.seq;
# single beginnings
sub less' equal by less_equal_start.seq;
sub greater' equal by greater_equal_start.seq;
sub bar' equal [equal less greater bar colon exclam slash] by bar_equal_start.seq; # disable |=
sub slash' equal by slash_equal_start.seq;
sub equal' [equal greater bar colon exclam] by equal_start.seq;
} equal_arrows;

4
features/calt/fi_fl.fea Normal file
View file

@ -0,0 +1,4 @@
### fi/fl #795
sub [f i.salt_low j.salt_low] [i j]' by [i.salt_low j.salt_low];
sub [F T I l.salt_low] l' by l.salt_low;

13
features/calt/greek.fea Normal file
View file

@ -0,0 +1,13 @@
### Greek
lookup caltGreekUCdiph {
sub @GreekUCdiphIOTA Iota' by Iotadieresis;
sub @GreekUCdiphUPSILON Upsilon' by Upsilondieresis;
} caltGreekUCdiph;
lookup caltGreekUC {
sub @GreekUCAcc' @GreekUC by @GreekUCcalt;
sub @GreekUC @GreekUCAcc' by @GreekUCcalt;
sub @GreekUCAcc' space @GreekUC by @GreekUCcalt;
sub @GreekUC space @GreekUCAcc' by @GreekUCcalt;
} caltGreekUC;

View file

@ -0,0 +1,53 @@
### Arbitrary-length arrows #346
lookup hyphen_arrows {
# Disable |||
ignore sub bar bar' bar hyphen;
ignore sub bar bar' hyphen;
ignore sub [hyphen_start.seq hyphen_middle.seq] bar' bar bar;
# hyphen middle & end
sub [less_hyphen_start.seq less_less_hyphen_start.seq less_hyphen_middle.seq less_less_hyphen_middle.seq greater_hyphen_start.seq greater_greater_hyphen_start.seq greater_hyphen_middle.seq greater_greater_hyphen_middle.seq bar_hyphen_start.seq bar_bar_hyphen_start.seq bar_hyphen_middle.seq bar_bar_hyphen_middle.seq hyphen_start.seq hyphen_middle.seq] hyphen' [hyphen less greater bar] by hyphen_middle.seq;
sub [less_hyphen_start.seq less_less_hyphen_start.seq less_hyphen_middle.seq less_less_hyphen_middle.seq greater_hyphen_start.seq greater_greater_hyphen_start.seq greater_hyphen_middle.seq greater_greater_hyphen_middle.seq bar_hyphen_start.seq bar_bar_hyphen_start.seq bar_hyphen_middle.seq bar_bar_hyphen_middle.seq hyphen_start.seq hyphen_middle.seq] hyphen' by hyphen_end.seq;
# double middles
sub [hyphen_start.seq hyphen_middle.seq] less.spacer less' hyphen by less_less_hyphen_middle.seq;
sub [hyphen_start.seq hyphen_middle.seq] less' less hyphen by less.spacer;
sub [hyphen_start.seq hyphen_middle.seq] greater.spacer greater' hyphen by greater_greater_hyphen_middle.seq;
sub [hyphen_start.seq hyphen_middle.seq] greater' greater hyphen by greater.spacer;
sub [hyphen_start.seq hyphen_middle.seq] bar.spacer bar' hyphen by bar_bar_hyphen_middle.seq;
sub [hyphen_start.seq hyphen_middle.seq] bar' bar hyphen by bar.spacer;
# single middles
sub [hyphen_start.seq hyphen_middle.seq] less' hyphen by less_hyphen_middle.seq;
sub [hyphen_start.seq hyphen_middle.seq] greater' hyphen by greater_hyphen_middle.seq;
sub [hyphen_start.seq hyphen_middle.seq] bar' hyphen by bar_hyphen_middle.seq;
# double ends
sub [hyphen_start.seq hyphen_middle.seq] less.spacer less' by less_less_hyphen_end.seq;
sub [hyphen_start.seq hyphen_middle.seq] less' less by less.spacer;
sub [hyphen_start.seq hyphen_middle.seq] greater.spacer greater' by greater_greater_hyphen_end.seq;
sub [hyphen_start.seq hyphen_middle.seq] greater' greater by greater.spacer;
sub [hyphen_start.seq hyphen_middle.seq] bar.spacer bar' by bar_bar_hyphen_end.seq;
sub [hyphen_start.seq hyphen_middle.seq] bar' bar by bar.spacer;
# single ends
sub [hyphen_start.seq hyphen_middle.seq] less' by less_hyphen_end.seq;
sub [hyphen_start.seq hyphen_middle.seq] greater' by greater_hyphen_end.seq;
sub [hyphen_start.seq hyphen_middle.seq] bar' by bar_hyphen_end.seq;
# double beginnings
sub less.spacer less' hyphen by less_less_hyphen_start.seq;
sub less' less hyphen by less.spacer;
sub greater.spacer greater' hyphen by greater_greater_hyphen_start.seq;
sub greater' greater hyphen by greater.spacer;
sub bar.spacer bar' hyphen by bar_bar_hyphen_start.seq;
sub bar' bar hyphen by bar.spacer;
# single beginnings
sub less' hyphen by less_hyphen_start.seq;
sub greater' hyphen by greater_hyphen_start.seq;
sub bar' hyphen by bar_hyphen_start.seq;
sub hyphen' [hyphen less greater bar] by hyphen_start.seq;
} hyphen_arrows;

View file

@ -0,0 +1,40 @@
### Lowercase/uppercase operators
# Must go after hyphen_arrows.fea
lookup lowercase_hyphen {
ignore sub @Tall \hyphen' @Lowercase;
ignore sub @Lowercase \hyphen' @Tall;
sub \hyphen' @Lowercase by \hyphen.lc;
sub @Lowercase \hyphen' by \hyphen.lc;
} lowercase_hyphen;
lookup lowercase_plus {
ignore sub @Tall \plus' @Lowercase;
ignore sub @Lowercase \plus' @Tall;
sub \plus' @Lowercase by \plus.lc;
sub @Lowercase \plus' by \plus.lc;
} lowercase_plus;
lookup lowercase_asterisk {
ignore sub @Tall \asterisk' @Lowercase;
ignore sub @Lowercase \asterisk' @Tall;
sub \asterisk' @Lowercase by \asterisk.lc;
sub @Lowercase \asterisk' by \asterisk.lc;
} lowercase_asterisk;
lookup lowercase_asteriskmath {
ignore sub @Tall \asteriskmath' @Lowercase;
ignore sub @Lowercase \asteriskmath' @Tall;
sub \asteriskmath' @Lowercase by \asteriskmath.lc;
sub @Lowercase \asteriskmath' by \asteriskmath.lc;
} lowercase_asteriskmath;
lookup uppercase_colon {
ignore sub @Tall \colon' @Lowercase;
ignore sub @Lowercase \colon' @Tall;
sub @Tall \colon' by \colon.uc;
sub \colon' @Tall by \colon.uc;
# pos @Tall \colon' <0 160 0 0>;
# pos \colon' @Tall <0 160 0 0>;
} uppercase_colon;

View file

@ -0,0 +1,10 @@
lookup numbersigns {
# middle parts
sub [numbersign_start.seq numbersign_middle.seq] numbersign' numbersign by numbersign_middle.seq;
# ends
sub [numbersign_start.seq numbersign_middle.seq] numbersign' by numbersign_end.seq;
# beginnings
sub numbersign' numbersign by numbersign_start.seq;
} numbersigns;

View file

@ -0,0 +1,14 @@
lookup underscores {
# middle parts
sub [underscore_start.seq underscore_middle.seq] bar' underscore by bar_underscore_middle.seq;
sub [underscore_start.seq underscore_middle.seq bar_underscore_middle.seq] underscore' bar underscore by underscore_middle.seq;
sub [underscore_start.seq underscore_middle.seq bar_underscore_middle.seq] underscore' underscore by underscore_middle.seq;
# ends
sub [underscore_start.seq underscore_middle.seq bar_underscore_middle.seq] underscore' by underscore_end.seq;
# beginnings
sub underscore' bar underscore by underscore_start.seq;
sub underscore' underscore by underscore_start.seq;
} underscores;

12
features/cv01.fea Normal file
View file

@ -0,0 +1,12 @@
# alternate lowercase a
sub a by a.cv01;
sub aacute by aacute.cv01;
sub abreve by abreve.cv01;
sub acircumflex by acircumflex.cv01;
sub adieresis by adieresis.cv01;
sub agrave by agrave.cv01;
sub amacron by amacron.cv01;
sub aogonek by aogonek.cv01;
sub aring by aring.cv01;
sub atilde by atilde.cv01;

7
features/cv02.fea Normal file
View file

@ -0,0 +1,7 @@
# single storey lowercase g
sub g by g.cv02;
sub gbreve by gbreve.cv02;
sub gcircumflex by gcircumflex.cv02;
sub gcommaaccent by gcommaaccent.cv02;
sub gdotaccent by gdotaccent.cv02;

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