Compare commits
244 commits
Author | SHA1 | Date | |
---|---|---|---|
34cced2a12 | |||
ef565289eb | |||
40fc56fc4e | |||
f70e21b6e5 | |||
2b2de1d7a0 | |||
525f223010 | |||
ea1a77ce75 | |||
6dfa7e2385 | |||
122cf42d40 | |||
747fab5be7 | |||
f064e54c06 | |||
ba21c00cdf | |||
6f05dc2018 | |||
5de1abb167 | |||
ee125da078 | |||
a47db68a73 | |||
79b02adef1 | |||
20f11a21e0 | |||
f61975c306 | |||
b94cc3e0de | |||
db910e4cd6 | |||
22c5754289 | |||
63976dd129 | |||
a696ca56b0 | |||
f7a8ac72f2 | |||
a03fb501d3 | |||
e19f63e0e9 | |||
9f01d4d376 | |||
ab2aaf3e73 | |||
4cabdfdfb3 | |||
aaafcd3702 | |||
4926aeac29 | |||
c9d4324d90 | |||
3b2506cd31 | |||
caf00206a7 | |||
16de164e66 | |||
a0130c91fa | |||
c44df2bc5f | |||
db40758747 | |||
ad43187d10 | |||
2a95184394 | |||
022693f6f0 | |||
164956350f | |||
7b20ec1e3b | |||
ab6e682f93 | |||
d80b0f07f1 | |||
390c41cc94 | |||
31adb247e5 | |||
82180459c9 | |||
8f4cc97fd5 | |||
a712db6f47 | |||
a258200a13 | |||
37855f9cf8 | |||
4488dc4a66 | |||
dc096591b0 | |||
383835769c | |||
f1725b4b4a | |||
e4d1280121 | |||
2c78d18533 | |||
8c616ac0dd | |||
f2fa4431b8 | |||
e6d6ecfcdf | |||
54f1c04b68 | |||
6d3291e32f | |||
b95464577a | |||
7b29086fd2 | |||
894d462c02 | |||
9f66ca846f | |||
6462d0d3d3 | |||
f2b14f6dd8 | |||
5b90f15c94 | |||
3de2fda715 | |||
1ecbc3ac56 | |||
4c21593495 | |||
6cdf4a0583 | |||
0d88d99bb1 | |||
eee6db9936 | |||
6e5ddfe4fc | |||
16b04e0e4d | |||
dea368f399 | |||
ab85072483 | |||
82936fc67e | |||
a3edab928e | |||
2927d174ff | |||
bd4e557891 | |||
8ff852e533 | |||
4d5aaed215 | |||
fe7af86405 | |||
47b8186471 | |||
aa68c08f1c | |||
2cf5e1b3ed | |||
4bf6dfe4f3 | |||
4905eb5151 | |||
776770e5f1 | |||
d172396be6 | |||
650fd69b74 | |||
76de04fbb7 | |||
aa9ea3dede | |||
fd5acad4fc | |||
6bf3854628 | |||
f1f9767998 | |||
7d923625b4 | |||
0abda27a88 | |||
4b1d987c65 | |||
4e040928e6 | |||
db85e7e6eb | |||
6b13bc53d1 | |||
e5ee4115ba | |||
7c879970f7 | |||
f7c77bff84 | |||
75109548c8 | |||
c5047ac007 | |||
1f0408bcb3 | |||
e9f9cd3b76 | |||
e7d9385716 | |||
dbfa0defb0 | |||
ef7c9b1593 | |||
c93367a0f7 | |||
b029b9a2ef | |||
9206171b31 | |||
888580a05a | |||
e2e526c971 | |||
15f7925625 | |||
af5c3a45fa | |||
d42e5e4aaa | |||
415c773d6a | |||
3ff0138197 | |||
bb660ca841 | |||
1ef9f3a829 | |||
07666484a9 | |||
4d385a806c | |||
a0e08ea3f9 | |||
d6ffaa44f7 | |||
28fb42cf1a | |||
92eb35ffac | |||
94450a374d | |||
acd502658b | |||
00c09d322d | |||
d1737c0c43 | |||
b67c841c35 | |||
89e0af072d | |||
df07894745 | |||
20bd0e45c4 | |||
3c6fe32a1d | |||
0547175ddc | |||
1081fc9525 | |||
ad21f017b6 | |||
8143fbb009 | |||
cda551a87c | |||
98774d8c05 | |||
e2ae5061fd | |||
0124c98e1f | |||
a2363fea8b | |||
64c21a4213 | |||
1a60382d12 | |||
f967f62036 | |||
6fc75b41f9 | |||
e367fa4871 | |||
8da49d55f8 | |||
9fdb974361 | |||
66ce8c3c57 | |||
216c286f7a | |||
5cfaa1eacf | |||
63c6434ab7 | |||
2a76d96b8d | |||
8f0098bf23 | |||
f95f930937 | |||
267a6fd221 | |||
d41386567b | |||
1471298321 | |||
176cecd240 | |||
5eb4ec07b3 | |||
35d2418440 | |||
70827e8b7a | |||
e25f170874 | |||
cb5ab83146 | |||
1a76caac64 | |||
44560d352d | |||
9a9a100be1 | |||
d42e7276fa | |||
5ef7ba1bf9 | |||
06a7b3994d | |||
cf2979c97b | |||
3e6f5d195d | |||
524a28629b | |||
c1c62fd720 | |||
6bb26fc5fc | |||
ace859529f | |||
3843439a55 | |||
8cc5687a3a | |||
63292642c3 | |||
6c8a2839cd | |||
e91e955626 | |||
cbb7575e97 | |||
19fd32dc95 | |||
7b0eec6a25 | |||
b282a970c2 | |||
9ff4b50cc4 | |||
532fba44b4 | |||
e9943d2d63 | |||
6c5f328244 | |||
00cfe69868 | |||
bd081655ed | |||
6d3758123c | |||
86090f3f34 | |||
660cd379bc | |||
947ced5555 | |||
1d7e14a927 | |||
56a6ca30ec | |||
76a6d42b37 | |||
a5b9c80f7e | |||
115994e561 | |||
d735c706f3 | |||
308204e6fc | |||
ab95accd39 | |||
da0b8dc46d | |||
8c676a6fa3 | |||
2d42d9dc35 | |||
6e08517ea3 | |||
d8eef5821f | |||
b844f9f95a | |||
f696c47339 | |||
42d2f7a89d | |||
f51adc1a59 | |||
2a88d87bd5 | |||
84f8fa6b9c | |||
553fce5740 | |||
682ce915cd | |||
bf8e49702b | |||
1134dfad0e | |||
595bc3d40a | |||
df6d08ea78 | |||
e90ff380bf | |||
cf377496bf | |||
64efc49dc3 | |||
fd43cfe61d | |||
5ee2653d58 | |||
b40428e6ad | |||
0e1a03575e | |||
26b564eca4 | |||
11137f8079 | |||
309719815c | |||
a000f6e593 | |||
b7d85a16ac |
3
.github/FUNDING.yml
vendored
|
@ -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
|
@ -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
|
@ -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
|
2
AUTHORS
|
@ -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
|
||||
|
|
140
CHANGELOG.md
|
@ -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 doesn’t apply ligatures to long sequences of chars, e.g. `!!!!`, `>>>>`, etc ([#49], [#110], [#176])
|
||||
- Larger `+` `-` `*` and corresponding ligatures ([#86])
|
||||
- Hexadecimal `x` (`0xFF`) is now applied to sequences like `128x128` as well ([#161])
|
||||
|
@ -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
|
@ -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
|
75959
FiraCode.glyphs
240
LEEME.md
Normal 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
|
@ -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
|
@ -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:
|
||||
### What’s 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 what’s 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 | Doesn’t work |
|
||||
| ------------------ | ------------------ |
|
||||
| **Butterfly** | **Alacritty** |
|
||||
| **crosh** (ChromeOS, [instructions](https://github.com/tonsky/FiraCode/wiki/ChromeOS-Terminal)) | **Windows Console (conhost.exe)** |
|
||||
| **Hyper.app** | **Cmder** |
|
||||
| **iTerm 2** ([3.1+](https://gitlab.com/gnachman/iterm2/issues/3568#note_13118332)) | **ConEmu** |
|
||||
| **Kitty** | **GNOME Terminal** |
|
||||
| **Konsole** | **mate-terminal** |
|
||||
| **mintty** (partial support [2.8.3+](https://github.com/mintty/mintty/issues/601))| **PuTTY** |
|
||||
| **QTerminal** | **rxvt** |
|
||||
| **Terminal.app** | **xterm** |
|
||||
| **Termux** | **ZOC** (Windows) |
|
||||
| **Token2Shell/MD** | **gtkterm, guake, LXTerminal, sakura, Terminator, xfce4-terminal,** and other libvte-based terminals ([bug report](https://bugzilla.gnome.org/show_bug.cgi?id=584160)) |
|
||||
| **upterm** |
|
||||
| **Windows Terminal** |
|
||||
| **ZOC** (macOS) |
|
||||
<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 | Doesn’t work |
|
||||
| ----- | -------------- |
|
||||
| **Abricotine** | **Arduino IDE** |
|
||||
| **Android Studio** (2.3+, [instructions](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) | **Adobe Dreamweaver** |
|
||||
| **Anjuta** (unless at the EOF) | **Delphi IDE** |
|
||||
| **AppCode** (2016.2+, [instructions](https://github.com/tonsky/FiraCode/wiki/Intellij-products-instructions)) | **Eclipse** (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 | Doesn’t 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)) |
|
||||
| Wez’s 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
|
@ -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)) |
|
||||
| Wez’s 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
|
@ -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)) |
|
||||
| Wez’s 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)
|
1
classes/ClosingBracket.fea
Normal file
|
@ -0,0 +1 @@
|
|||
bracketright braceright parenright
|
13
classes/Digit.fea
Normal 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
|
@ -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
|
@ -0,0 +1 @@
|
|||
a b c d e f A B C D E F
|
1
classes/OpeningBracket.fea
Normal file
|
@ -0,0 +1 @@
|
|||
bracketleft braceleft parenleft
|
1
classes/Tall.fea
Normal 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
|
@ -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))))
|
23
clojure/fira_code/checks.clj
Normal 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)))
|
18
clojure/fira_code/classes.clj
Normal 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")))
|
25
clojure/fira_code/coll.clj
Normal 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)))
|
37
clojure/fira_code/features.clj
Normal 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)))
|
12
clojure/fira_code/files.clj
Normal 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 %))))
|
|
@ -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 "Can’t 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) })
|
||||
|
33
clojure/fira_code/main.clj
Normal 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)))
|
14
clojure/fira_code/not_space.clj
Normal 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)))))
|
31
clojure/fira_code/spacers.clj
Normal 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)))
|
13
clojure/fira_code/time.clj
Normal 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)))
|
|
@ -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)))
|
|
@ -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
|
@ -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})))
|
7
deps.edn
|
@ -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"}}}
|
||||
|
|
|
@ -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 you’ve 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 you’re 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 can’t 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 don’t
|
||||
|
||||
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 editor’s 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. It’s 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
|
@ -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 isn’t, create and run `download_and_install.sh` script:
|
||||
|
||||
#!/usr/bin/env bash
|
||||
|
||||
fonts_dir="${HOME}/.local/share/fonts"
|
||||
if [ ! -d "${fonts_dir}" ]; then
|
||||
echo "mkdir -p $fonts_dir"
|
||||
mkdir -p "${fonts_dir}"
|
||||
else
|
||||
echo "Found fonts dir $fonts_dir"
|
||||
fi
|
||||
|
||||
for type in Bold Light Medium Regular Retina; do
|
||||
file_path="${HOME}/.local/share/fonts/FiraCode-${type}.ttf"
|
||||
file_url="https://github.com/tonsky/FiraCode/blob/master/distr/ttf/FiraCode-${type}.ttf?raw=true"
|
||||
if [ ! -e "${file_path}" ]; then
|
||||
echo "wget -O $file_path $file_url"
|
||||
wget -O "${file_path}" "${file_url}"
|
||||
else
|
||||
echo "Found existing file $file_path"
|
||||
fi;
|
||||
done
|
||||
|
||||
echo "fc-cache -f"
|
||||
fc-cache -f
|
||||
|
||||
More details: https://github.com/tonsky/FiraCode/issues/4
|
||||
|
||||
|
||||
FreeBSD
|
||||
-------
|
||||
|
||||
Using pkg(8):
|
||||
|
||||
pkg install firacode
|
||||
|
||||
OR
|
||||
|
||||
Using ports:
|
||||
|
||||
cd /usr/ports/x11-fonts/firacode && make install clean
|
||||
|
||||
|
||||
Enabling ligatures
|
||||
==================
|
||||
|
||||
Atom
|
||||
----
|
||||
|
||||
To change your font to Fira Code, open Atom's preferences (`cmd + ,` on a Mac, `ctrl + ,` on PC), make sure the "Settings" tab is selected, or the "Editor" in Atom 1.10+, and scroll down to "Editor Settings". In the "Font Family" field, enter `Fira Code`.
|
||||
|
||||
If you wish to specify a font weight, for example, Light, use `Fira Code Light` as a font name (Windows) or `FiraCode-Light` (macOS).
|
||||
|
||||
Ligatures are enabled by default in Atom 1.9 and above.
|
||||
|
||||
|
||||
VS Code
|
||||
-------
|
||||
|
||||
To open the settings editor, first from the File menu choose Preferences, Settings or use keyboard shortcut `Ctrl + ,` (Windows) or `Cmd + ,` (macOS).
|
||||
|
||||
To enable FiraCode in the settings editor, under "Commonly Used", expand the "Text Editor" settings and then click on "Font". In the "Font Family" input box type `Fira Code`, replacing any content. Tick the check box "Enables/Disables font ligatures" under "Font Ligatures" to enable the special ligatures.
|
||||
|
||||
If you wish to specify a font weight, for example, Light, use `Fira Code Light` as a font name (Windows) or `FiraCode-Light` (macOS).
|
||||
|
||||
|
||||
IntelliJ products
|
||||
-----------------
|
||||
|
||||
1. Enable in Settings → Editor → Font → Enable Font Ligatures
|
||||
2. Select `Fira Code` as "Primary font" under Settings → Editor → Font
|
||||
|
||||
Additionally, if a Color Scheme is selected:
|
||||
|
||||
3. Enable in Settings → Editor → Color Scheme → Color Scheme Font → Enable Font Ligatures
|
||||
4. Select Fira Code as "Primary font" under Settings → Editor → Color Scheme → Color Scheme Font
|
||||
|
||||
|
||||
BBEdit
|
||||
------
|
||||
|
||||
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
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>--></i>
|
||||
| n <i><=</i> 0 <i>=></i> []
|
||||
| empty list <i>=></i> []
|
||||
| otherwise <i>=></i> [x] <i>++</i> take n-1, xs
|
||||
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
||||
|
||||
|
||||
<div class="code regular"><b># Fira Code Regular</b>
|
||||
|
||||
take = (n, [x, <i>...</i>xs]:list) <i>--></i>
|
||||
| n <i><=</i> 0 <i>=></i> []
|
||||
| empty list <i>=></i> []
|
||||
| otherwise <i>=></i> [x] <i>++</i> take n-1, xs
|
||||
| n <i><=</i> 0 <i>=></i> []
|
||||
| empty list <i>=></i> []
|
||||
| otherwise <i>=></i> [x] <i>++</i> take n-1, xs
|
||||
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
||||
|
||||
|
||||
<div class="code medium"><b># Fira Code Medium</b>
|
||||
|
||||
take = (n, [x, <i>...</i>xs]:list) <i>--></i>
|
||||
| n <i><=</i> 0 <i>=></i> []
|
||||
| empty list <i>=></i> []
|
||||
| otherwise <i>=></i> [x] <i>++</i> take n-1, xs
|
||||
take = (n, [x, <i>...</i>xs]:list) <i>--></i>
|
||||
| n <i><=</i> 0 <i>=></i> []
|
||||
| empty list <i>=></i> []
|
||||
| otherwise <i>=></i> [x] <i>++</i> take n-1, xs
|
||||
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
||||
|
||||
|
||||
<div class="code semibold"><b># Fira Code SemiBold</b>
|
||||
|
||||
take = (n, [x, <i>...</i>xs]:list) <i>--></i>
|
||||
| n <i><=</i> 0 <i>=></i> []
|
||||
| empty list <i>=></i> []
|
||||
| otherwise <i>=></i> [x] <i>++</i> take n-1, xs
|
||||
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
||||
|
||||
|
||||
<div class="code bold"><b># Fira Code Bold</b>
|
||||
|
||||
take = (n, [x, <i>...</i>xs]:list) <i>--></i>
|
||||
| n <i><=</i> 0 <i>=></i> []
|
||||
| empty list <i>=></i> []
|
||||
| otherwise <i>=></i> [x] <i>++</i> take n-1, xs
|
||||
take = (n, [x, <i>...</i>xs]:list) <i>--></i>
|
||||
| n <i><=</i> 0 <i>=></i> []
|
||||
| empty list <i>=></i> []
|
||||
| otherwise <i>=></i> [x] <i>++</i> take n-1, xs
|
||||
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
||||
|
||||
<div id="code_variable" class="code variable"><b># Fira Code Variable</b>
|
||||
|
||||
<input type="range" min="300" max="700" value="400" step="10" style="width: 300px;" oninput="onWeightChange(this.value)" onchange="onWeightChange(this.value)"> <span id="span_wght">400</span>
|
||||
|
||||
take = (n, [x, <i>...</i>xs]:list) <i>--></i>
|
||||
| n <i><=</i> 0 <i>=></i> []
|
||||
| empty list <i>=></i> []
|
||||
| otherwise <i>=></i> [x] <i>++</i> take n-1, xs
|
||||
take = (n, [x, <i>...</i>xs]:list) <i>--></i>
|
||||
| n <i><=</i> 0 <i>=></i> []
|
||||
| empty list <i>=></i> []
|
||||
| otherwise <i>=></i> [x] <i>++</i> take n-1, xs
|
||||
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
||||
last3 = reverse <i>>></i> take 3 <i>>></i> reverse</div>
|
||||
|
|
63
docs/calt_performance.md
Normal 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
After Width: | Height: | Size: 119 KiB |
BIN
extras/arrows_es.png
Normal file
After Width: | Height: | Size: 172 KiB |
BIN
extras/character_variants.png
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
extras/character_variants_es.png
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
extras/console.png
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
extras/console_es.png
Normal file
After Width: | Height: | Size: 94 KiB |
BIN
extras/download.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
extras/download_es.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
extras/ligature_variants.png
Normal file
After Width: | Height: | Size: 62 KiB |
BIN
extras/ligature_variants_es.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
extras/ligatures.png
Normal file
After Width: | Height: | Size: 166 KiB |
BIN
extras/ligatures_es.png
Normal file
After Width: | Height: | Size: 259 KiB |
1
extras/logo.svg
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
extras/math.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
extras/math_es.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
extras/progress.gif
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
extras/progress.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
extras/progress_es.gif
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
extras/samples.png
Normal file
After Width: | Height: | Size: 158 KiB |
BIN
extras/samples2.png
Normal file
After Width: | Height: | Size: 168 KiB |
376
extras/showcases.txt
Normal 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
After Width: | Height: | Size: 35 KiB |
BIN
extras/sponsor_es.png
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
extras/texture.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
extras/typographics.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
extras/typographics_es.png
Normal file
After Width: | Height: | Size: 86 KiB |
25
features/calt/center.fea
Normal 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;
|
15
features/calt/conj_disj.fea
Normal 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
|
@ -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
|
@ -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;
|
73
features/calt/equal_arrows.fea
Normal 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
|
@ -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
|
@ -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;
|
53
features/calt/hyphen_arrows.fea
Normal 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;
|
40
features/calt/match_case.fea
Normal 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;
|
10
features/calt/numbersigns.fea
Normal 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;
|
14
features/calt/underscores.fea
Normal 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
|
@ -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
|
@ -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;
|