on master help sign in
Initial import.
240e5f4Blaž Hrastnik
.gitignorenew file+1
@@ -0,0 +1 @@
1+target
Cargo.locknew file+798
@@ -0,0 +1,798 @@
1+# This file is automatically @generated by Cargo.
2+# It is not intended for manual editing.
3+[[package]]
4+name = "aho-corasick"
5+version = "0.7.10"
6+source = "registry+https://github.com/rust-lang/crates.io-index"
7+checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada"
8+dependencies = [
9+ "memchr",
10+]
11+
12+[[package]]
13+name = "anyhow"
14+version = "1.0.31"
15+source = "registry+https://github.com/rust-lang/crates.io-index"
16+checksum = "85bb70cc08ec97ca5450e6eba421deeea5f172c0fc61f78b5357b2a8e8be195f"
17+
18+[[package]]
19+name = "arc-swap"
20+version = "0.4.6"
21+source = "registry+https://github.com/rust-lang/crates.io-index"
22+checksum = "b585a98a234c46fc563103e9278c9391fde1f4e6850334da895d27edb9580f62"
23+
24+[[package]]
25+name = "arrayref"
26+version = "0.3.6"
27+source = "registry+https://github.com/rust-lang/crates.io-index"
28+checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
29+
30+[[package]]
31+name = "arrayvec"
32+version = "0.4.12"
33+source = "registry+https://github.com/rust-lang/crates.io-index"
34+checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9"
35+dependencies = [
36+ "nodrop",
37+]
38+
39+[[package]]
40+name = "arrayvec"
41+version = "0.5.1"
42+source = "registry+https://github.com/rust-lang/crates.io-index"
43+checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8"
44+
45+[[package]]
46+name = "autocfg"
47+version = "1.0.0"
48+source = "registry+https://github.com/rust-lang/crates.io-index"
49+checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
50+
51+[[package]]
52+name = "base64"
53+version = "0.10.1"
54+source = "registry+https://github.com/rust-lang/crates.io-index"
55+checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
56+dependencies = [
57+ "byteorder",
58+]
59+
60+[[package]]
61+name = "base64"
62+version = "0.11.0"
63+source = "registry+https://github.com/rust-lang/crates.io-index"
64+checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7"
65+
66+[[package]]
67+name = "bitflags"
68+version = "1.2.1"
69+source = "registry+https://github.com/rust-lang/crates.io-index"
70+checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
71+
72+[[package]]
73+name = "blake2b_simd"
74+version = "0.5.10"
75+source = "registry+https://github.com/rust-lang/crates.io-index"
76+checksum = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a"
77+dependencies = [
78+ "arrayref",
79+ "arrayvec 0.5.1",
80+ "constant_time_eq",
81+]
82+
83+[[package]]
84+name = "byteorder"
85+version = "1.3.4"
86+source = "registry+https://github.com/rust-lang/crates.io-index"
87+checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
88+
89+[[package]]
90+name = "cassowary"
91+version = "0.3.0"
92+source = "registry+https://github.com/rust-lang/crates.io-index"
93+checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
94+
95+[[package]]
96+name = "cfg-if"
97+version = "0.1.9"
98+source = "registry+https://github.com/rust-lang/crates.io-index"
99+checksum = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33"
100+
101+[[package]]
102+name = "constant_time_eq"
103+version = "0.1.5"
104+source = "registry+https://github.com/rust-lang/crates.io-index"
105+checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
106+
107+[[package]]
108+name = "crossbeam-utils"
109+version = "0.7.2"
110+source = "registry+https://github.com/rust-lang/crates.io-index"
111+checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
112+dependencies = [
113+ "autocfg",
114+ "cfg-if",
115+ "lazy_static",
116+]
117+
118+[[package]]
119+name = "dirs"
120+version = "2.0.2"
121+source = "registry+https://github.com/rust-lang/crates.io-index"
122+checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3"
123+dependencies = [
124+ "cfg-if",
125+ "dirs-sys",
126+]
127+
128+[[package]]
129+name = "dirs-sys"
130+version = "0.3.4"
131+source = "registry+https://github.com/rust-lang/crates.io-index"
132+checksum = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b"
133+dependencies = [
134+ "cfg-if",
135+ "libc",
136+ "redox_users",
137+ "winapi",
138+]
139+
140+[[package]]
141+name = "filedescriptor"
142+version = "0.7.1"
143+source = "git+https://github.com/wez/wezterm#58686f925f0f4a0942452e8feb0ababd48ec936c"
144+dependencies = [
145+ "anyhow",
146+ "libc",
147+ "thiserror",
148+ "winapi",
149+]
150+
151+[[package]]
152+name = "fnv"
153+version = "1.0.7"
154+source = "registry+https://github.com/rust-lang/crates.io-index"
155+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
156+
157+[[package]]
158+name = "getrandom"
159+version = "0.1.14"
160+source = "registry+https://github.com/rust-lang/crates.io-index"
161+checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb"
162+dependencies = [
163+ "cfg-if",
164+ "libc",
165+ "wasi",
166+]
167+
168+[[package]]
169+name = "helix-core"
170+version = "0.1.0"
171+
172+[[package]]
173+name = "helix-term"
174+version = "0.1.0"
175+dependencies = [
176+ "anyhow",
177+ "termwiz",
178+]
179+
180+[[package]]
181+name = "lazy_static"
182+version = "1.4.0"
183+source = "registry+https://github.com/rust-lang/crates.io-index"
184+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
185+
186+[[package]]
187+name = "lexical-core"
188+version = "0.6.7"
189+source = "registry+https://github.com/rust-lang/crates.io-index"
190+checksum = "f86d66d380c9c5a685aaac7a11818bdfa1f733198dfd9ec09c70b762cd12ad6f"
191+dependencies = [
192+ "arrayvec 0.4.12",
193+ "bitflags",
194+ "cfg-if",
195+ "rustc_version",
196+ "ryu",
197+ "static_assertions",
198+]
199+
200+[[package]]
201+name = "libc"
202+version = "0.2.70"
203+source = "registry+https://github.com/rust-lang/crates.io-index"
204+checksum = "3baa92041a6fec78c687fa0cc2b3fae8884f743d672cf551bed1d6dac6988d0f"
205+
206+[[package]]
207+name = "log"
208+version = "0.4.8"
209+source = "registry+https://github.com/rust-lang/crates.io-index"
210+checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
211+dependencies = [
212+ "cfg-if",
213+]
214+
215+[[package]]
216+name = "maybe-uninit"
217+version = "2.0.0"
218+source = "registry+https://github.com/rust-lang/crates.io-index"
219+checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
220+
221+[[package]]
222+name = "memchr"
223+version = "2.3.3"
224+source = "registry+https://github.com/rust-lang/crates.io-index"
225+checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400"
226+
227+[[package]]
228+name = "memmem"
229+version = "0.1.1"
230+source = "registry+https://github.com/rust-lang/crates.io-index"
231+checksum = "a64a92489e2744ce060c349162be1c5f33c6969234104dbd99ddb5feb08b8c15"
232+
233+[[package]]
234+name = "nodrop"
235+version = "0.1.14"
236+source = "registry+https://github.com/rust-lang/crates.io-index"
237+checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
238+
239+[[package]]
240+name = "nom"
241+version = "5.1.1"
242+source = "registry+https://github.com/rust-lang/crates.io-index"
243+checksum = "0b471253da97532da4b61552249c521e01e736071f71c1a4f7ebbfbf0a06aad6"
244+dependencies = [
245+ "lexical-core",
246+ "memchr",
247+ "version_check",
248+]
249+
250+[[package]]
251+name = "num"
252+version = "0.2.1"
253+source = "registry+https://github.com/rust-lang/crates.io-index"
254+checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36"
255+dependencies = [
256+ "num-bigint",
257+ "num-complex",
258+ "num-integer",
259+ "num-iter",
260+ "num-rational",
261+ "num-traits",
262+]
263+
264+[[package]]
265+name = "num-bigint"
266+version = "0.2.6"
267+source = "registry+https://github.com/rust-lang/crates.io-index"
268+checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304"
269+dependencies = [
270+ "autocfg",
271+ "num-integer",
272+ "num-traits",
273+]
274+
275+[[package]]
276+name = "num-complex"
277+version = "0.2.4"
278+source = "registry+https://github.com/rust-lang/crates.io-index"
279+checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95"
280+dependencies = [
281+ "autocfg",
282+ "num-traits",
283+]
284+
285+[[package]]
286+name = "num-derive"
287+version = "0.2.5"
288+source = "registry+https://github.com/rust-lang/crates.io-index"
289+checksum = "eafd0b45c5537c3ba526f79d3e75120036502bebacbb3f3220914067ce39dbf2"
290+dependencies = [
291+ "proc-macro2 0.4.30",
292+ "quote 0.6.13",
293+ "syn 0.15.44",
294+]
295+
296+[[package]]
297+name = "num-integer"
298+version = "0.1.42"
299+source = "registry+https://github.com/rust-lang/crates.io-index"
300+checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba"
301+dependencies = [
302+ "autocfg",
303+ "num-traits",
304+]
305+
306+[[package]]
307+name = "num-iter"
308+version = "0.1.40"
309+source = "registry+https://github.com/rust-lang/crates.io-index"
310+checksum = "dfb0800a0291891dd9f4fe7bd9c19384f98f7fbe0cd0f39a2c6b88b9868bbc00"
311+dependencies = [
312+ "autocfg",
313+ "num-integer",
314+ "num-traits",
315+]
316+
317+[[package]]
318+name = "num-rational"
319+version = "0.2.4"
320+source = "registry+https://github.com/rust-lang/crates.io-index"
321+checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef"
322+dependencies = [
323+ "autocfg",
324+ "num-bigint",
325+ "num-integer",
326+ "num-traits",
327+]
328+
329+[[package]]
330+name = "num-traits"
331+version = "0.2.11"
332+source = "registry+https://github.com/rust-lang/crates.io-index"
333+checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096"
334+dependencies = [
335+ "autocfg",
336+]
337+
338+[[package]]
339+name = "ordered-float"
340+version = "1.0.2"
341+source = "registry+https://github.com/rust-lang/crates.io-index"
342+checksum = "18869315e81473c951eb56ad5558bbc56978562d3ecfb87abb7a1e944cea4518"
343+dependencies = [
344+ "num-traits",
345+]
346+
347+[[package]]
348+name = "phf"
349+version = "0.8.0"
350+source = "registry+https://github.com/rust-lang/crates.io-index"
351+checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
352+dependencies = [
353+ "phf_shared",
354+]
355+
356+[[package]]
357+name = "phf_codegen"
358+version = "0.8.0"
359+source = "registry+https://github.com/rust-lang/crates.io-index"
360+checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815"
361+dependencies = [
362+ "phf_generator",
363+ "phf_shared",
364+]
365+
366+[[package]]
367+name = "phf_generator"
368+version = "0.8.0"
369+source = "registry+https://github.com/rust-lang/crates.io-index"
370+checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
371+dependencies = [
372+ "phf_shared",
373+ "rand",
374+]
375+
376+[[package]]
377+name = "phf_shared"
378+version = "0.8.0"
379+source = "registry+https://github.com/rust-lang/crates.io-index"
380+checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
381+dependencies = [
382+ "siphasher",
383+]
384+
385+[[package]]
386+name = "ppv-lite86"
387+version = "0.2.8"
388+source = "registry+https://github.com/rust-lang/crates.io-index"
389+checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea"
390+
391+[[package]]
392+name = "proc-macro2"
393+version = "0.4.30"
394+source = "registry+https://github.com/rust-lang/crates.io-index"
395+checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
396+dependencies = [
397+ "unicode-xid 0.1.0",
398+]
399+
400+[[package]]
401+name = "proc-macro2"
402+version = "1.0.13"
403+source = "registry+https://github.com/rust-lang/crates.io-index"
404+checksum = "53f5ffe53a6b28e37c9c1ce74893477864d64f74778a93a4beb43c8fa167f639"
405+dependencies = [
406+ "unicode-xid 0.2.0",
407+]
408+
409+[[package]]
410+name = "quote"
411+version = "0.6.13"
412+source = "registry+https://github.com/rust-lang/crates.io-index"
413+checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
414+dependencies = [
415+ "proc-macro2 0.4.30",
416+]
417+
418+[[package]]
419+name = "quote"
420+version = "1.0.6"
421+source = "registry+https://github.com/rust-lang/crates.io-index"
422+checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea"
423+dependencies = [
424+ "proc-macro2 1.0.13",
425+]
426+
427+[[package]]
428+name = "rand"
429+version = "0.7.3"
430+source = "registry+https://github.com/rust-lang/crates.io-index"
431+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
432+dependencies = [
433+ "getrandom",
434+ "libc",
435+ "rand_chacha",
436+ "rand_core",
437+ "rand_hc",
438+ "rand_pcg",
439+]
440+
441+[[package]]
442+name = "rand_chacha"
443+version = "0.2.2"
444+source = "registry+https://github.com/rust-lang/crates.io-index"
445+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
446+dependencies = [
447+ "ppv-lite86",
448+ "rand_core",
449+]
450+
451+[[package]]
452+name = "rand_core"
453+version = "0.5.1"
454+source = "registry+https://github.com/rust-lang/crates.io-index"
455+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
456+dependencies = [
457+ "getrandom",
458+]
459+
460+[[package]]
461+name = "rand_hc"
462+version = "0.2.0"
463+source = "registry+https://github.com/rust-lang/crates.io-index"
464+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
465+dependencies = [
466+ "rand_core",
467+]
468+
469+[[package]]
470+name = "rand_pcg"
471+version = "0.2.1"
472+source = "registry+https://github.com/rust-lang/crates.io-index"
473+checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
474+dependencies = [
475+ "rand_core",
476+]
477+
478+[[package]]
479+name = "redox_syscall"
480+version = "0.1.56"
481+source = "registry+https://github.com/rust-lang/crates.io-index"
482+checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
483+
484+[[package]]
485+name = "redox_users"
486+version = "0.3.4"
487+source = "registry+https://github.com/rust-lang/crates.io-index"
488+checksum = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431"
489+dependencies = [
490+ "getrandom",
491+ "redox_syscall",
492+ "rust-argon2",
493+]
494+
495+[[package]]
496+name = "regex"
497+version = "1.3.7"
498+source = "registry+https://github.com/rust-lang/crates.io-index"
499+checksum = "a6020f034922e3194c711b82a627453881bc4682166cabb07134a10c26ba7692"
500+dependencies = [
501+ "aho-corasick",
502+ "memchr",
503+ "regex-syntax",
504+ "thread_local",
505+]
506+
507+[[package]]
508+name = "regex-syntax"
509+version = "0.6.17"
510+source = "registry+https://github.com/rust-lang/crates.io-index"
511+checksum = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae"
512+
513+[[package]]
514+name = "rust-argon2"
515+version = "0.7.0"
516+source = "registry+https://github.com/rust-lang/crates.io-index"
517+checksum = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017"
518+dependencies = [
519+ "base64 0.11.0",
520+ "blake2b_simd",
521+ "constant_time_eq",
522+ "crossbeam-utils",
523+]
524+
525+[[package]]
526+name = "rustc_version"
527+version = "0.2.3"
528+source = "registry+https://github.com/rust-lang/crates.io-index"
529+checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
530+dependencies = [
531+ "semver",
532+]
533+
534+[[package]]
535+name = "ryu"
536+version = "1.0.4"
537+source = "registry+https://github.com/rust-lang/crates.io-index"
538+checksum = "ed3d612bc64430efeb3f7ee6ef26d590dce0c43249217bddc62112540c7941e1"
539+
540+[[package]]
541+name = "semver"
542+version = "0.9.0"
543+source = "registry+https://github.com/rust-lang/crates.io-index"
544+checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
545+dependencies = [
546+ "semver-parser",
547+]
548+
549+[[package]]
550+name = "semver-parser"
551+version = "0.7.0"
552+source = "registry+https://github.com/rust-lang/crates.io-index"
553+checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
554+
555+[[package]]
556+name = "serde"
557+version = "1.0.110"
558+source = "registry+https://github.com/rust-lang/crates.io-index"
559+checksum = "99e7b308464d16b56eba9964e4972a3eee817760ab60d88c3f86e1fecb08204c"
560+dependencies = [
561+ "serde_derive",
562+]
563+
564+[[package]]
565+name = "serde_derive"
566+version = "1.0.110"
567+source = "registry+https://github.com/rust-lang/crates.io-index"
568+checksum = "818fbf6bfa9a42d3bfcaca148547aa00c7b915bec71d1757aa2d44ca68771984"
569+dependencies = [
570+ "proc-macro2 1.0.13",
571+ "quote 1.0.6",
572+ "syn 1.0.22",
573+]
574+
575+[[package]]
576+name = "signal-hook"
577+version = "0.1.15"
578+source = "registry+https://github.com/rust-lang/crates.io-index"
579+checksum = "8ff2db2112d6c761e12522c65f7768548bd6e8cd23d2a9dae162520626629bd6"
580+dependencies = [
581+ "libc",
582+ "signal-hook-registry",
583+]
584+
585+[[package]]
586+name = "signal-hook-registry"
587+version = "1.2.0"
588+source = "registry+https://github.com/rust-lang/crates.io-index"
589+checksum = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41"
590+dependencies = [
591+ "arc-swap",
592+ "libc",
593+]
594+
595+[[package]]
596+name = "siphasher"
597+version = "0.3.3"
598+source = "registry+https://github.com/rust-lang/crates.io-index"
599+checksum = "fa8f3741c7372e75519bd9346068370c9cdaabcc1f9599cbcf2a2719352286b7"
600+
601+[[package]]
602+name = "smallvec"
603+version = "0.6.13"
604+source = "registry+https://github.com/rust-lang/crates.io-index"
605+checksum = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6"
606+dependencies = [
607+ "maybe-uninit",
608+]
609+
610+[[package]]
611+name = "static_assertions"
612+version = "0.3.4"
613+source = "registry+https://github.com/rust-lang/crates.io-index"
614+checksum = "7f3eb36b47e512f8f1c9e3d10c2c1965bc992bd9cdb024fa581e2194501c83d3"
615+
616+[[package]]
617+name = "syn"
618+version = "0.15.44"
619+source = "registry+https://github.com/rust-lang/crates.io-index"
620+checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
621+dependencies = [
622+ "proc-macro2 0.4.30",
623+ "quote 0.6.13",
624+ "unicode-xid 0.1.0",
625+]
626+
627+[[package]]
628+name = "syn"
629+version = "1.0.22"
630+source = "registry+https://github.com/rust-lang/crates.io-index"
631+checksum = "1425de3c33b0941002740a420b1a906a350b88d08b82b2c8a01035a3f9447bac"
632+dependencies = [
633+ "proc-macro2 1.0.13",
634+ "quote 1.0.6",
635+ "unicode-xid 0.2.0",
636+]
637+
638+[[package]]
639+name = "terminfo"
640+version = "0.7.2"
641+source = "registry+https://github.com/rust-lang/crates.io-index"
642+checksum = "12064715207074ac562f450722884f981268a916ce1eb21c5bda2c806c8fecfc"
643+dependencies = [
644+ "dirs",
645+ "fnv",
646+ "nom",
647+ "phf",
648+ "phf_codegen",
649+]
650+
651+[[package]]
652+name = "termios"
653+version = "0.3.2"
654+source = "registry+https://github.com/rust-lang/crates.io-index"
655+checksum = "6f0fcee7b24a25675de40d5bb4de6e41b0df07bc9856295e7e2b3a3600c400c2"
656+dependencies = [
657+ "libc",
658+]
659+
660+[[package]]
661+name = "termwiz"
662+version = "0.9.0"
663+source = "git+https://github.com/wez/wezterm#58686f925f0f4a0942452e8feb0ababd48ec936c"
664+dependencies = [
665+ "anyhow",
666+ "base64 0.10.1",
667+ "bitflags",
668+ "cassowary",
669+ "filedescriptor",
670+ "fnv",
671+ "lazy_static",
672+ "libc",
673+ "log",
674+ "memmem",
675+ "num",
676+ "num-derive",
677+ "num-traits",
678+ "ordered-float",
679+ "regex",
680+ "semver",
681+ "serde",
682+ "signal-hook",
683+ "smallvec",
684+ "terminfo",
685+ "termios",
686+ "unicode-segmentation",
687+ "unicode-width",
688+ "vtparse",
689+ "winapi",
690+ "xi-unicode",
691+]
692+
693+[[package]]
694+name = "thiserror"
695+version = "1.0.18"
696+source = "registry+https://github.com/rust-lang/crates.io-index"
697+checksum = "5976891d6950b4f68477850b5b9e5aa64d955961466f9e174363f573e54e8ca7"
698+dependencies = [
699+ "thiserror-impl",
700+]
701+
702+[[package]]
703+name = "thiserror-impl"
704+version = "1.0.18"
705+source = "registry+https://github.com/rust-lang/crates.io-index"
706+checksum = "ab81dbd1cd69cd2ce22ecfbdd3bdb73334ba25350649408cc6c085f46d89573d"
707+dependencies = [
708+ "proc-macro2 1.0.13",
709+ "quote 1.0.6",
710+ "syn 1.0.22",
711+]
712+
713+[[package]]
714+name = "thread_local"
715+version = "1.0.1"
716+source = "registry+https://github.com/rust-lang/crates.io-index"
717+checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
718+dependencies = [
719+ "lazy_static",
720+]
721+
722+[[package]]
723+name = "unicode-segmentation"
724+version = "1.6.0"
725+source = "registry+https://github.com/rust-lang/crates.io-index"
726+checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0"
727+
728+[[package]]
729+name = "unicode-width"
730+version = "0.1.7"
731+source = "registry+https://github.com/rust-lang/crates.io-index"
732+checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479"
733+
734+[[package]]
735+name = "unicode-xid"
736+version = "0.1.0"
737+source = "registry+https://github.com/rust-lang/crates.io-index"
738+checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
739+
740+[[package]]
741+name = "unicode-xid"
742+version = "0.2.0"
743+source = "registry+https://github.com/rust-lang/crates.io-index"
744+checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
745+
746+[[package]]
747+name = "utf8parse"
748+version = "0.1.1"
749+source = "registry+https://github.com/rust-lang/crates.io-index"
750+checksum = "8772a4ccbb4e89959023bc5b7cb8623a795caa7092d99f3aa9501b9484d4557d"
751+
752+[[package]]
753+name = "version_check"
754+version = "0.9.1"
755+source = "registry+https://github.com/rust-lang/crates.io-index"
756+checksum = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce"
757+
758+[[package]]
759+name = "vtparse"
760+version = "0.2.2"
761+source = "git+https://github.com/wez/wezterm#58686f925f0f4a0942452e8feb0ababd48ec936c"
762+dependencies = [
763+ "utf8parse",
764+]
765+
766+[[package]]
767+name = "wasi"
768+version = "0.9.0+wasi-snapshot-preview1"
769+source = "registry+https://github.com/rust-lang/crates.io-index"
770+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
771+
772+[[package]]
773+name = "winapi"
774+version = "0.3.8"
775+source = "registry+https://github.com/rust-lang/crates.io-index"
776+checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
777+dependencies = [
778+ "winapi-i686-pc-windows-gnu",
779+ "winapi-x86_64-pc-windows-gnu",
780+]
781+
782+[[package]]
783+name = "winapi-i686-pc-windows-gnu"
784+version = "0.4.0"
785+source = "registry+https://github.com/rust-lang/crates.io-index"
786+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
787+
788+[[package]]
789+name = "winapi-x86_64-pc-windows-gnu"
790+version = "0.4.0"
791+source = "registry+https://github.com/rust-lang/crates.io-index"
792+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
793+
794+[[package]]
795+name = "xi-unicode"
796+version = "0.2.0"
797+source = "registry+https://github.com/rust-lang/crates.io-index"
798+checksum = "7395cdb9d0a6219fa0ea77d08c946adf9c1984c72fcd443ace30365f3daadef7"
Cargo.tomlnew file+5
@@ -0,0 +1,5 @@
1+[workspace]
2+members = [
3+ "helix-core",
4+ "helix-term",
5+]
README.mdnew file+80
@@ -0,0 +1,80 @@
1+- server-client architecture via gRPC, UI separate from core
2+- multi cursor based editing and slicing
3+- WASM based plugins (builtin LSP & fuzzy file finder)
4+- piece table-based tree structure for changes
5+
6+
7+Structure similar to codemirror:
8+
9+text (ropes)
10+- column utils, stuff like tab aware (row, col) -> char pos translation
11+- word/grapheme/code point utils and iterators
12+state
13+- transactions
14+ - changes
15+ - annotations (time changed etc)
16+ - state effects
17+ - additional editor state as facets
18+- snapshots as an async view into current state
19+- selections { anchor (nonmoving), head (moving) from/to } -> SelectionSet with a primary
20+ - cursor is just a single range selection
21+- markers
22+ track a position inside text that synchronizes with edits
23+{ doc, selection, update(), splice, changes(), facets, tabSize, identUnit, lineSeparator, changeFilter/transactionFilter to modify stuff before }
24+view (actual UI)
25+- renders via termwiz
26+- viewport(Lines) -> what's actually visible
27+- extend the view via Decorations (inline styling) or Components (UI)
28+ - mark / wieget / line / replace decoration
29+commands (transform state)
30+- movement
31+- selection extension
32+- deletion
33+- indentation
34+keymap (maps keys to commands)
35+history (undo tree via immutable ropes)
36+- undoes transactions
37+- invert changes (generates a revert)
38+(collab mode)
39+gutter (line numbers, diagnostic marker, etc) -> ties into UI components
40+rangeset/span -> mappable over changes (can be a marker primitive?)
41+syntax (treesitter)
42+- indentation strategies
43+fold
44+selections (select mode/multiselect)
45+matchbrackets
46+closebrackets
47+special-chars (shows dots etc for specials)
48+panel (for UI: file pickers, search dialogs, etc)
49+tooltip (for UI)
50+search (regex? pcre)
51+lint (async linters)
52+lsp
53+highlight (?)
54+stream-syntax
55+autocomplete
56+comment (gc, etc for auto commenting)
57+snippets
58+
59+terminal mode?
60+
61+plugins can contain more commands/ui abstractions to use elsewhere
62+
63+languageData as presets for each language (syntax, indent, comment, etc)
64+
65+TODO: determine rust vs script portions
66+
67+vim stuff:
68+motions/operators/text objects
69+full visual mode
70+macros
71+jump lists
72+marks
73+yank/paste
74+conceal for markdown markers, etc
75+
76+
77+---
78+
79+codemirror uses offsets exclusively with Line being computed when necessary
80+(with start/end extents)
helix-core/.gitignorenew file+2
@@ -0,0 +1,2 @@
1+/target
2+Cargo.lock
helix-core/Cargo.tomlnew file+11
@@ -0,0 +1,11 @@
1+[package]
2+name = "helix-core"
3+version = "0.1.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+edition = "2018"
6+
7+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+[dependencies]
10+ropey = "1.1.0"
11+# slab = "0.4.2"
helix-core/src/lib.rsnew file+5
@@ -0,0 +1,5 @@
1+mod position;
2+mod range;
3+
4+use position::Position;
5+use range::Range;
helix-core/src/position.rsnew file+27
@@ -0,0 +1,27 @@
1+/// Represents a single point in a text buffer. Zero indexed.
2+#[derive(Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
3+pub struct Position {
4+ pub row: usize,
5+ pub col: usize,
6+}
7+
8+impl Position {
9+ pub fn new(row: usize, col: usize) -> Self {
10+ Self { row, col }
11+ }
12+
13+ pub fn is_zero(self) -> bool {
14+ self.row == 0 && self.col == 0
15+ }
16+}
17+
18+#[cfg(test)]
19+mod test {
20+ use super::*;
21+
22+ #[test]
23+ fn test_ordering() {
24+ // (0, 5) is less than (1, 0 w v f)
25+ assert!(Position::new(0, 5) < Position::new(1, 0));
26+ }
27+}
helix-core/src/range.rsnew file+9
@@ -0,0 +1,9 @@
1+use crate::Position;
2+
3+#[derive(Clone, Copy, PartialEq, Eq)]
4+pub struct Range {
5+ pub start: Position,
6+ pub end: Position,
7+}
8+
9+// range traversal iters
helix-term/.gitignorenew file+1
@@ -0,0 +1 @@
1+/target
helix-term/Cargo.tomlnew file+19
@@ -0,0 +1,19 @@
1+[package]
2+name = "helix-term"
3+version = "0.1.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+edition = "2018"
6+
7+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+[[bin]]
10+name = "hx"
11+path = "src/main.rs"
12+
13+# [[bin]]
14+# name = "line"
15+# path = "src/line.rs"
16+
17+[dependencies]
18+termwiz = { git = "https://github.com/wez/wezterm", features = ["widgets"] }
19+anyhow = "1.0.31"
helix-term/README.mdnew file+7
@@ -0,0 +1,7 @@
1+
2+window -> buffer -> text
3+\-> contains "view", a viewport into the buffer
4+
5+view
6+\-> selections etc
7+-> cursor
helix-term/src/line.rsnew file+111
@@ -0,0 +1,111 @@
1+use termwiz::cell::AttributeChange;
2+use termwiz::color::{AnsiColor, ColorAttribute, RgbColor};
3+use termwiz::lineedit::*;
4+
5+#[derive(Default)]
6+struct Host {
7+ history: BasicHistory,
8+}
9+
10+impl LineEditorHost for Host {
11+ // Render the prompt with a darkslateblue background color if
12+ // the terminal supports true color, otherwise render it with
13+ // a navy blue ansi color.
14+ fn render_prompt(&self, prompt: &str) -> Vec<OutputElement> {
15+ vec![
16+ OutputElement::Attribute(AttributeChange::Background(
17+ ColorAttribute::TrueColorWithPaletteFallback(
18+ RgbColor::from_named("darkslateblue").unwrap(),
19+ AnsiColor::Navy.into(),
20+ ),
21+ )),
22+ OutputElement::Text(prompt.to_owned()),
23+ ]
24+ }
25+
26+ fn history(&mut self) -> &mut dyn History {
27+ &mut self.history
28+ }
29+
30+ /// Demo of the completion API for words starting with "h" or "he"
31+ fn complete(&self, line: &str, cursor_position: usize) -> Vec<CompletionCandidate> {
32+ let mut candidates = vec![];
33+ if let Some((range, word)) = word_at_cursor(line, cursor_position) {
34+ let words = &["hello", "help", "he-man"];
35+
36+ for w in words {
37+ if w.starts_with(word) {
38+ candidates.push(CompletionCandidate {
39+ range: range.clone(),
40+ text: w.to_string(),
41+ });
42+ }
43+ }
44+ }
45+ candidates
46+ }
47+}
48+
49+/// This is a conceptually simple function that computes the bounds
50+/// of the whitespace delimited word at the specified cursor position
51+/// in the supplied line string.
52+/// It returns the range and the corresponding slice out of the line.
53+/// This function is sufficient for example purposes; in a real application
54+/// the equivalent function would need to be aware of quoting and other
55+/// application specific context.
56+fn word_at_cursor(line: &str, cursor_position: usize) -> Option<(std::ops::Range<usize>, &str)> {
57+ let char_indices: Vec<(usize, char)> = line.char_indices().collect();
58+ if char_indices.is_empty() {
59+ return None;
60+ }
61+ let char_position = char_indices
62+ .iter()
63+ .position(|(idx, _)| *idx == cursor_position)
64+ .unwrap_or(char_indices.len());
65+
66+ // Look back until we find whitespace
67+ let mut start_position = char_position;
68+ while start_position > 0
69+ && start_position <= char_indices.len()
70+ && !char_indices[start_position - 1].1.is_whitespace()
71+ {
72+ start_position -= 1;
73+ }
74+
75+ // Look forwards until we find whitespace
76+ let mut end_position = char_position;
77+ while end_position < char_indices.len() && !char_indices[end_position].1.is_whitespace() {
78+ end_position += 1;
79+ }
80+
81+ if end_position > start_position {
82+ let range = char_indices[start_position].0
83+ ..char_indices
84+ .get(end_position)
85+ .map(|c| c.0 + 1)
86+ .unwrap_or(line.len());
87+ Some((range.clone(), &line[range]))
88+ } else {
89+ None
90+ }
91+}
92+
93+fn main() -> anyhow::Result<()> {
94+ println!("Type `exit` to quit this example, or start a word with `h` and press Tab.");
95+ let mut terminal = line_editor_terminal()?;
96+ let mut editor = LineEditor::new(&mut terminal);
97+
98+ let mut host = Host::default();
99+ loop {
100+ if let Some(line) = editor.read_line(&mut host)? {
101+ println!("read line: {:?}", line);
102+ if line == "exit" {
103+ break;
104+ }
105+
106+ host.history().add(&line);
107+ }
108+ }
109+
110+ Ok(())
111+}
helix-term/src/main.rsnew file+227
@@ -0,0 +1,227 @@
1+//! This example shows how to make a basic widget that accumulates
2+//! text input and renders it to the screen
3+#![allow(unused)]
4+use anyhow::Error;
5+use termwiz::caps::Capabilities;
6+use termwiz::cell::AttributeChange;
7+use termwiz::color::{AnsiColor, ColorAttribute, RgbColor};
8+use termwiz::input::*;
9+use termwiz::surface::Change;
10+use termwiz::terminal::buffered::BufferedTerminal;
11+use termwiz::terminal::{new_terminal, Terminal};
12+use termwiz::widgets::*;
13+
14+/// This is a widget for our application
15+struct MainScreen {}
16+
17+impl MainScreen {
18+ pub fn new() -> Self {
19+ Self {}
20+ }
21+}
22+
23+impl Widget for MainScreen {
24+ fn process_event(&mut self, event: &WidgetEvent, _args: &mut UpdateArgs) -> bool {
25+ true // handled it all
26+ }
27+
28+ /// Draw ourselves into the surface provided by RenderArgs
29+ fn render(&mut self, args: &mut RenderArgs) {
30+ // args.surface.add_change(Change::ClearScreen(
31+ // ColorAttribute::TrueColorWithPaletteFallback(
32+ // RgbColor::new(0x31, 0x1B, 0x92),
33+ // AnsiColor::Black.into(),
34+ // ),
35+ // ));
36+ // args.surface
37+ // .add_change(Change::Attribute(AttributeChange::Foreground(
38+ // ColorAttribute::TrueColorWithPaletteFallback(
39+ // RgbColor::new(0xB3, 0x88, 0xFF),
40+ // AnsiColor::Purple.into(),
41+ // ),
42+ // )));
43+ }
44+
45+ fn get_size_constraints(&self) -> layout::Constraints {
46+ let mut constraints = layout::Constraints::default();
47+ constraints.child_orientation = layout::ChildOrientation::Vertical;
48+ constraints
49+ }
50+}
51+
52+struct Buffer<'a> {
53+ /// Holds the input text that we wish the widget to display
54+ text: &'a mut String,
55+}
56+
57+impl<'a> Buffer<'a> {
58+ /// Initialize the widget with the input text
59+ pub fn new(text: &'a mut String) -> Self {
60+ Self { text }
61+ }
62+}
63+
64+impl<'a> Widget for Buffer<'a> {
65+ fn process_event(&mut self, event: &WidgetEvent, _args: &mut UpdateArgs) -> bool {
66+ match event {
67+ WidgetEvent::Input(InputEvent::Key(KeyEvent {
68+ key: KeyCode::Char(c),
69+ ..
70+ })) => self.text.push(*c),
71+ WidgetEvent::Input(InputEvent::Key(KeyEvent {
72+ key: KeyCode::Enter,
73+ ..
74+ })) => {
75+ self.text.push_str("\r\n");
76+ }
77+ WidgetEvent::Input(InputEvent::Paste(s)) => {
78+ self.text.push_str(&s);
79+ }
80+ _ => {}
81+ }
82+
83+ true // handled it all
84+ }
85+
86+ /// Draw ourselves into the surface provided by RenderArgs
87+ fn render(&mut self, args: &mut RenderArgs) {
88+ args.surface
89+ .add_change(Change::ClearScreen(ColorAttribute::Default));
90+
91+ // args.surface
92+ // .add_change(Change::Attribute(AttributeChange::Foreground(
93+ // ColorAttribute::TrueColorWithPaletteFallback(
94+ // RgbColor::new(0x11, 0x00, 0xFF),
95+ // AnsiColor::Purple.into(),
96+ // ),
97+ // )));
98+ let dims = args.surface.dimensions();
99+ args.surface
100+ .add_change(format!("🤷 surface size is {:?}\r\n", dims));
101+ args.surface.add_change(self.text.clone());
102+
103+ // Place the cursor at the end of the text.
104+ // A more advanced text editing widget would manage the
105+ // cursor position differently.
106+ *args.cursor = CursorShapeAndPosition {
107+ coords: args.surface.cursor_position().into(),
108+ shape: termwiz::surface::CursorShape::SteadyBar,
109+ ..Default::default()
110+ };
111+ }
112+
113+ fn get_size_constraints(&self) -> layout::Constraints {
114+ let mut c = layout::Constraints::default();
115+ c.set_valign(layout::VerticalAlignment::Top);
116+ c
117+ }
118+}
119+
120+struct StatusLine {}
121+
122+impl StatusLine {
123+ pub fn new() -> Self {
124+ StatusLine {}
125+ }
126+}
127+impl Widget for StatusLine {
128+ fn process_event(&mut self, event: &WidgetEvent, _args: &mut UpdateArgs) -> bool {
129+ true
130+ }
131+
132+ fn render(&mut self, args: &mut RenderArgs) {
133+ args.surface.add_change(Change::ClearScreen(
134+ ColorAttribute::TrueColorWithPaletteFallback(
135+ RgbColor::new(0xFF, 0xFF, 0xFF),
136+ AnsiColor::Black.into(),
137+ ),
138+ ));
139+ args.surface
140+ .add_change(Change::Attribute(AttributeChange::Foreground(
141+ ColorAttribute::TrueColorWithPaletteFallback(
142+ RgbColor::new(0x00, 0x00, 0x00),
143+ AnsiColor::Black.into(),
144+ ),
145+ )));
146+
147+ args.surface.add_change(" helix");
148+ }
149+
150+ fn get_size_constraints(&self) -> layout::Constraints {
151+ *layout::Constraints::default()
152+ .set_fixed_height(1)
153+ .set_valign(layout::VerticalAlignment::Bottom)
154+ }
155+}
156+
157+fn main() -> Result<(), Error> {
158+ // Start with an empty string; typing into the app will
159+ // update this string.
160+ let mut typed_text = String::new();
161+
162+ {
163+ // Create a terminal and put it into full screen raw mode
164+ let caps = Capabilities::new_from_env()?;
165+ let mut buf = BufferedTerminal::new(new_terminal(caps)?)?;
166+ buf.terminal().enter_alternate_screen()?;
167+ buf.terminal().set_raw_mode()?;
168+
169+ // Set up the UI
170+ let mut ui = Ui::new();
171+
172+ let root_id = ui.set_root(MainScreen::new());
173+ let buffer_id = ui.add_child(root_id, Buffer::new(&mut typed_text));
174+ // let root_id = ui.set_root(Buffer::new(&mut typed_text));
175+ ui.add_child(root_id, StatusLine::new());
176+ ui.set_focus(buffer_id);
177+
178+ loop {
179+ ui.process_event_queue()?;
180+
181+ // After updating and processing all of the widgets, compose them
182+ // and render them to the screen.
183+ if ui.render_to_screen(&mut buf)? {
184+ // We have more events to process immediately; don't block waiting
185+ // for input below, but jump to the top of the loop to re-run the
186+ // updates.
187+ continue;
188+ }
189+ // Compute an optimized delta to apply to the terminal and display it
190+ buf.flush()?;
191+
192+ // Wait for user input
193+ match buf.terminal().poll_input(None) {
194+ Ok(Some(InputEvent::Resized { rows, cols })) => {
195+ // FIXME: this is working around a bug where we don't realize
196+ // that we should redraw everything on resize in BufferedTerminal.
197+ buf.add_change(Change::ClearScreen(Default::default()));
198+ buf.resize(cols, rows);
199+ }
200+ Ok(Some(input)) => match input {
201+ InputEvent::Key(KeyEvent {
202+ key: KeyCode::Escape,
203+ ..
204+ }) => {
205+ // Quit the app when escape is pressed
206+ break;
207+ }
208+ input @ _ => {
209+ // Feed input into the Ui
210+ ui.queue_event(WidgetEvent::Input(input));
211+ }
212+ },
213+ Ok(None) => {}
214+ Err(e) => {
215+ print!("{:?}\r\n", e);
216+ break;
217+ }
218+ }
219+ }
220+ }
221+
222+ // After we've stopped the full screen raw terminal,
223+ // print out the final edited value of the input text.
224+ println!("The text you entered: {}", typed_text);
225+
226+ Ok(())
227+}