on 4229583 help sign in
.envrc−1
since splitsnapshots
unifiedsplit
@@ -1,6 +1,5 @@
1watch_file shell.nix
1watch_file shell.nix
2watch_file flake.lock
2watch_file flake.lock
3−watch_file rust-toolchain.toml
4
3
5# try to use flakes, if it fails use normal nix (ie. shell.nix)
4# try to use flakes, if it fails use normal nix (ie. shell.nix)
6use flake || use nix
5use flake || use nix
.github/workflows/build.yml+3−3
@@ -39,7 +39,7 @@ jobs:
39 uses: actions/checkout@v4
39 uses: actions/checkout@v4
40
40
41 - name: Install stable toolchain
41 - name: Install stable toolchain
42− uses: dtolnay/rust-toolchain@1.70
42+ uses: dtolnay/rust-toolchain@1.65
43
43
44 - uses: Swatinem/rust-cache@v2
44 - uses: Swatinem/rust-cache@v2
45 with:
45 with:
@@ -70,7 +70,7 @@ jobs:
70 uses: actions/checkout@v4
70 uses: actions/checkout@v4
71
71
72 - name: Install stable toolchain
72 - name: Install stable toolchain
73− uses: dtolnay/rust-toolchain@1.70
73+ uses: dtolnay/rust-toolchain@1.65
74 with:
74 with:
75 components: rustfmt, clippy
75 components: rustfmt, clippy
76
76
@@ -97,7 +97,7 @@ jobs:
97 uses: actions/checkout@v4
97 uses: actions/checkout@v4
98
98
99 - name: Install stable toolchain
99 - name: Install stable toolchain
100− uses: dtolnay/rust-toolchain@1.70
100+ uses: dtolnay/rust-toolchain@1.65
101
101
102 - uses: Swatinem/rust-cache@v2
102 - uses: Swatinem/rust-cache@v2
103 with:
103 with:
.github/workflows/cachix.yml+2−2
@@ -14,10 +14,10 @@ jobs:
14 uses: actions/checkout@v4
14 uses: actions/checkout@v4
15
15
16 - name: Install nix
16 - name: Install nix
17− uses: cachix/install-nix-action@v24
17+ uses: cachix/install-nix-action@v23
18
18
19 - name: Authenticate with Cachix
19 - name: Authenticate with Cachix
20− uses: cachix/cachix-action@v13
20+ uses: cachix/cachix-action@v12
21 with:
21 with:
22 name: helix
22 name: helix
23 authToken: ${{ secrets.CACHIX_AUTH_TOKEN }}
23 authToken: ${{ secrets.CACHIX_AUTH_TOKEN }}
.github/workflows/release.yml+5−5
@@ -36,7 +36,7 @@ jobs:
36 - name: Bundle grammars
36 - name: Bundle grammars
37 run: tar cJf grammars.tar.xz -C runtime/grammars/sources .
37 run: tar cJf grammars.tar.xz -C runtime/grammars/sources .
38
38
39− - uses: actions/upload-artifact@v4
39+ - uses: actions/upload-artifact@v3
40 with:
40 with:
41 name: grammars
41 name: grammars
42 path: grammars.tar.xz
42 path: grammars.tar.xz
@@ -106,7 +106,7 @@ jobs:
106 uses: actions/checkout@v4
106 uses: actions/checkout@v4
107
107
108 - name: Download grammars
108 - name: Download grammars
109− uses: actions/download-artifact@v4
109+ uses: actions/download-artifact@v3
110
110
111 - name: Move grammars under runtime
111 - name: Move grammars under runtime
112 if: "!startsWith(matrix.os, 'windows')"
112 if: "!startsWith(matrix.os, 'windows')"
@@ -220,7 +220,7 @@ jobs:
220 fi
220 fi
221 cp -r runtime dist
221 cp -r runtime dist
222
222
223− - uses: actions/upload-artifact@v4
223+ - uses: actions/upload-artifact@v3
224 with:
224 with:
225 name: bins-${{ matrix.build }}
225 name: bins-${{ matrix.build }}
226 path: dist
226 path: dist
@@ -233,7 +233,7 @@ jobs:
233 - name: Checkout sources
233 - name: Checkout sources
234 uses: actions/checkout@v4
234 uses: actions/checkout@v4
235
235
236− - uses: actions/download-artifact@v4
236+ - uses: actions/download-artifact@v3
237
237
238 - name: Build archive
238 - name: Build archive
239 shell: bash
239 shell: bash
@@ -288,7 +288,7 @@ jobs:
288 overwrite: true
288 overwrite: true
289
289
290 - name: Upload binaries as artifact
290 - name: Upload binaries as artifact
291− uses: actions/upload-artifact@v4
291+ uses: actions/upload-artifact@v3
292 if: env.preview == 'true'
292 if: env.preview == 'true'
293 with:
293 with:
294 name: release
294 name: release
Cargo.lock+314−317
@@ -32,9 +32,18 @@ dependencies = [
32
32
33[[package]]
33[[package]]
34name = "aho-corasick"
34name = "aho-corasick"
35−version = "1.1.2"
35+version = "0.7.20"
36source = "registry+https://github.com/rust-lang/crates.io-index"
36source = "registry+https://github.com/rust-lang/crates.io-index"
37−checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
37+checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
38+dependencies = [
39+ "memchr",
40+]
41+
42+[[package]]
43+name = "aho-corasick"
44+version = "1.0.2"
45+source = "registry+https://github.com/rust-lang/crates.io-index"
46+checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41"
38dependencies = [
47dependencies = [
39 "memchr",
48 "memchr",
40]
49]
@@ -62,9 +71,9 @@ dependencies = [
62
71
63[[package]]
72[[package]]
64name = "anyhow"
73name = "anyhow"
65−version = "1.0.76"
74+version = "1.0.75"
66source = "registry+https://github.com/rust-lang/crates.io-index"
75source = "registry+https://github.com/rust-lang/crates.io-index"
67−checksum = "59d2a3357dde987206219e78ecfbbb6e8dad06cbb65292758d3270e6254f7355"
76+checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
68
77
69[[package]]
78[[package]]
70name = "arc-swap"
79name = "arc-swap"
@@ -107,12 +116,12 @@ checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
107
116
108[[package]]
117[[package]]
109name = "bstr"
118name = "bstr"
110−version = "1.8.0"
119+version = "1.6.0"
111source = "registry+https://github.com/rust-lang/crates.io-index"
120source = "registry+https://github.com/rust-lang/crates.io-index"
112−checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c"
121+checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05"
113dependencies = [
122dependencies = [
114 "memchr",
123 "memchr",
115− "regex-automata",
124+ "regex-automata 0.3.9",
116 "serde",
125 "serde",
117]
126]
118
127
@@ -131,6 +140,12 @@ version = "3.12.0"
131source = "registry+https://github.com/rust-lang/crates.io-index"
140source = "registry+https://github.com/rust-lang/crates.io-index"
132checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
141checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
133
142
143+[[package]]
144+name = "bytecount"
145+version = "0.6.3"
146+source = "registry+https://github.com/rust-lang/crates.io-index"
147+checksum = "2c676a478f63e9fa2dd5368a42f28bba0d6c560b775f38583c8bbaa7fcd67c9c"
148+
134[[package]]
149[[package]]
135name = "bytes"
150name = "bytes"
136version = "1.4.0"
151version = "1.4.0"
@@ -145,9 +160,9 @@ checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
145
160
146[[package]]
161[[package]]
147name = "cc"
162name = "cc"
148−version = "1.0.84"
163+version = "1.0.83"
149source = "registry+https://github.com/rust-lang/crates.io-index"
164source = "registry+https://github.com/rust-lang/crates.io-index"
150−checksum = "0f8e7c90afad890484a21653d08b6e209ae34770fb5ee298f9c699fcc1e5c856"
165+checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
151dependencies = [
166dependencies = [
152 "libc",
167 "libc",
153]
168]
@@ -183,11 +198,13 @@ dependencies = [
183
198
184[[package]]
199[[package]]
185name = "clipboard-win"
200name = "clipboard-win"
186−version = "5.0.0"
201+version = "4.5.0"
187source = "registry+https://github.com/rust-lang/crates.io-index"
202source = "registry+https://github.com/rust-lang/crates.io-index"
188−checksum = "c57002a5d9be777c1ef967e33674dac9ebd310d8893e4e3437b14d5f0f6372cc"
203+checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362"
189dependencies = [
204dependencies = [
190 "error-code",
205 "error-code",
206+ "str-buf",
207+ "winapi",
191]
208]
192
209
193[[package]]
210[[package]]
@@ -350,6 +367,27 @@ dependencies = [
350 "syn 2.0.38",
367 "syn 2.0.38",
351]
368]
352
369
370+[[package]]
371+name = "dirs"
372+version = "5.0.1"
373+source = "registry+https://github.com/rust-lang/crates.io-index"
374+checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225"
375+dependencies = [
376+ "dirs-sys",
377+]
378+
379+[[package]]
380+name = "dirs-sys"
381+version = "0.4.1"
382+source = "registry+https://github.com/rust-lang/crates.io-index"
383+checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c"
384+dependencies = [
385+ "libc",
386+ "option-ext",
387+ "redox_users",
388+ "windows-sys 0.48.0",
389+]
390+
353[[package]]
391[[package]]
354name = "dunce"
392name = "dunce"
355version = "1.0.4"
393version = "1.0.4"
@@ -388,19 +426,34 @@ checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1"
388
426
389[[package]]
427[[package]]
390name = "errno"
428name = "errno"
391−version = "0.3.8"
429+version = "0.3.1"
392source = "registry+https://github.com/rust-lang/crates.io-index"
430source = "registry+https://github.com/rust-lang/crates.io-index"
393−checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
431+checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
394dependencies = [
432dependencies = [
433+ "errno-dragonfly",
434+ "libc",
435+ "windows-sys 0.48.0",
436+]
437+
438+[[package]]
439+name = "errno-dragonfly"
440+version = "0.1.2"
441+source = "registry+https://github.com/rust-lang/crates.io-index"
442+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
443+dependencies = [
444+ "cc",
395 "libc",
445 "libc",
396− "windows-sys 0.52.0",
397]
446]
398
447
399[[package]]
448[[package]]
400name = "error-code"
449name = "error-code"
401−version = "3.0.0"
450+version = "2.3.1"
402source = "registry+https://github.com/rust-lang/crates.io-index"
451source = "registry+https://github.com/rust-lang/crates.io-index"
403−checksum = "281e452d3bad4005426416cdba5ccfd4f5c1280e10099e21db27f7c1c28347fc"
452+checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21"
453+dependencies = [
454+ "libc",
455+ "str-buf",
456+]
404
457
405[[package]]
458[[package]]
406name = "etcetera"
459name = "etcetera"
@@ -415,9 +468,9 @@ dependencies = [
415
468
416[[package]]
469[[package]]
417name = "faster-hex"
470name = "faster-hex"
418−version = "0.9.0"
471+version = "0.8.1"
419source = "registry+https://github.com/rust-lang/crates.io-index"
472source = "registry+https://github.com/rust-lang/crates.io-index"
420−checksum = "a2a2b11eda1d40935b26cf18f6833c526845ae8c41e58d09af6adeb6f0269183"
473+checksum = "239f7bfb930f820ab16a9cd95afc26f88264cf6905c960b340a615384aa3338a"
421dependencies = [
474dependencies = [
422 "serde",
475 "serde",
423]
476]
@@ -458,20 +511,26 @@ dependencies = [
458 "miniz_oxide",
511 "miniz_oxide",
459]
512]
460
513
514+[[package]]
515+name = "fnv"
516+version = "1.0.7"
517+source = "registry+https://github.com/rust-lang/crates.io-index"
518+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
519+
461[[package]]
520[[package]]
462name = "form_urlencoded"
521name = "form_urlencoded"
463−version = "1.2.1"
522+version = "1.2.0"
464source = "registry+https://github.com/rust-lang/crates.io-index"
523source = "registry+https://github.com/rust-lang/crates.io-index"
465−checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
524+checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
466dependencies = [
525dependencies = [
467 "percent-encoding",
526 "percent-encoding",
468]
527]
469
528
470[[package]]
529[[package]]
471name = "futures-core"
530name = "futures-core"
472−version = "0.3.30"
531+version = "0.3.29"
473source = "registry+https://github.com/rust-lang/crates.io-index"
532source = "registry+https://github.com/rust-lang/crates.io-index"
474−checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
533+checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c"
475
534
476[[package]]
535[[package]]
477name = "futures-executor"
536name = "futures-executor"
@@ -486,15 +545,15 @@ dependencies = [
486
545
487[[package]]
546[[package]]
488name = "futures-task"
547name = "futures-task"
489−version = "0.3.30"
548+version = "0.3.29"
490source = "registry+https://github.com/rust-lang/crates.io-index"
549source = "registry+https://github.com/rust-lang/crates.io-index"
491−checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
550+checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2"
492
551
493[[package]]
552[[package]]
494name = "futures-util"
553name = "futures-util"
495−version = "0.3.30"
554+version = "0.3.29"
496source = "registry+https://github.com/rust-lang/crates.io-index"
555source = "registry+https://github.com/rust-lang/crates.io-index"
497−checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
556+checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104"
498dependencies = [
557dependencies = [
499 "futures-core",
558 "futures-core",
500 "futures-task",
559 "futures-task",
@@ -522,9 +581,9 @@ checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
522
581
523[[package]]
582[[package]]
524name = "gix"
583name = "gix"
525−version = "0.57.0"
584+version = "0.55.2"
526source = "registry+https://github.com/rust-lang/crates.io-index"
585source = "registry+https://github.com/rust-lang/crates.io-index"
527−checksum = "721c7497ab24b665ed5a1eb2b3526936aa60068e61ba260651f7e77c52feec69"
586+checksum = "002667cd1ebb789313d0d0afe3d23b2821cf3b0e91605095f0e6d8751f0ceeea"
528dependencies = [
587dependencies = [
529 "gix-actor",
588 "gix-actor",
530 "gix-commitgraph",
589 "gix-commitgraph",
@@ -563,46 +622,46 @@ dependencies = [
563
622
564[[package]]
623[[package]]
565name = "gix-actor"
624name = "gix-actor"
566−version = "0.29.0"
625+version = "0.28.0"
567source = "registry+https://github.com/rust-lang/crates.io-index"
626source = "registry+https://github.com/rust-lang/crates.io-index"
568−checksum = "886014c4865b93ce268f1d3eddd4fd3261242c3f3ee61eb36009f913016a9059"
627+checksum = "948a5f9e43559d16faf583694f1c742eb401ce24ce8e6f2238caedea7486433c"
569dependencies = [
628dependencies = [
570 "bstr",
629 "bstr",
571 "btoi",
630 "btoi",
572 "gix-date",
631 "gix-date",
573 "itoa",
632 "itoa",
574 "thiserror",
633 "thiserror",
575− "winnow 0.5.28",
634+ "winnow 0.5.17",
576]
635]
577
636
578[[package]]
637[[package]]
579name = "gix-chunk"
638name = "gix-chunk"
580−version = "0.4.6"
639+version = "0.4.4"
581source = "registry+https://github.com/rust-lang/crates.io-index"
640source = "registry+https://github.com/rust-lang/crates.io-index"
582−checksum = "2ade37ef69870de0ed966b97c57a3a947a22ff3482a52c3b99b205f77bcb08fb"
641+checksum = "5b42ea64420f7994000130328f3c7a2038f639120518870436d31b8bde704493"
583dependencies = [
642dependencies = [
584 "thiserror",
643 "thiserror",
585]
644]
586
645
587[[package]]
646[[package]]
588name = "gix-commitgraph"
647name = "gix-commitgraph"
589−version = "0.23.0"
648+version = "0.22.0"
590source = "registry+https://github.com/rust-lang/crates.io-index"
649source = "registry+https://github.com/rust-lang/crates.io-index"
591−checksum = "e7559ea9cefee188cd88b05afcc8e3ef7a3cb4a5c647bccf06b981e591b02b77"
650+checksum = "7e8bc78b1a6328fa6d8b3a53b6c73997af37fd6bfc1d6c49f149e63bda5cbb36"
592dependencies = [
651dependencies = [
593 "bstr",
652 "bstr",
594 "gix-chunk",
653 "gix-chunk",
595 "gix-features",
654 "gix-features",
596 "gix-hash",
655 "gix-hash",
597− "memmap2",
656+ "memmap2 0.7.1",
598 "thiserror",
657 "thiserror",
599]
658]
600
659
601[[package]]
660[[package]]
602name = "gix-config"
661name = "gix-config"
603−version = "0.33.0"
662+version = "0.31.0"
604source = "registry+https://github.com/rust-lang/crates.io-index"
663source = "registry+https://github.com/rust-lang/crates.io-index"
605−checksum = "9c35dc7f9c00a42bbc9cfa1ca2ec0a78ad1b76ff0736d3d35dfd612962244467"
664+checksum = "5cae98c6b4c66c09379bc35274b172587d6b0ac369a416c39128ad8c6454f9bb"
606dependencies = [
665dependencies = [
607 "bstr",
666 "bstr",
608 "gix-config-value",
667 "gix-config-value",
@@ -616,14 +675,14 @@ dependencies = [
616 "smallvec",
675 "smallvec",
617 "thiserror",
676 "thiserror",
618 "unicode-bom",
677 "unicode-bom",
619− "winnow 0.5.28",
678+ "winnow 0.5.17",
620]
679]
621
680
622[[package]]
681[[package]]
623name = "gix-config-value"
682name = "gix-config-value"
624−version = "0.14.2"
683+version = "0.14.0"
625source = "registry+https://github.com/rust-lang/crates.io-index"
684source = "registry+https://github.com/rust-lang/crates.io-index"
626−checksum = "39f388cb2396aee82d6f460a2e7770659bdf8854e9e5478f7d2b1324a9698284"
685+checksum = "ea7505b97f4d8e7933e29735a568ba2f86d8de466669d9f0e8321384f9972f47"
627dependencies = [
686dependencies = [
628 "bitflags 2.4.1",
687 "bitflags 2.4.1",
629 "bstr",
688 "bstr",
@@ -634,9 +693,9 @@ dependencies = [
634
693
635[[package]]
694[[package]]
636name = "gix-date"
695name = "gix-date"
637−version = "0.8.2"
696+version = "0.8.0"
638source = "registry+https://github.com/rust-lang/crates.io-index"
697source = "registry+https://github.com/rust-lang/crates.io-index"
639−checksum = "9d85f4a01e0d05c3de585e28bae514d4baf01655e3fc3f14ce6f30bf62405345"
698+checksum = "fc7df669639582dc7c02737642f76890b03b5544e141caba68a7d6b4eb551e0d"
640dependencies = [
699dependencies = [
641 "bstr",
700 "bstr",
642 "itoa",
701 "itoa",
@@ -646,11 +705,10 @@ dependencies = [
646
705
647[[package]]
706[[package]]
648name = "gix-diff"
707name = "gix-diff"
649−version = "0.39.0"
708+version = "0.37.0"
650source = "registry+https://github.com/rust-lang/crates.io-index"
709source = "registry+https://github.com/rust-lang/crates.io-index"
651−checksum = "ac0e75f5afd2f6c47c800b6b0a000a08045739d0450d20482e8faa42543f62d1"
710+checksum = "931394f69fb8c9ed6afc0aae3487bd869e936339bcc13ed8884472af072e0554"
652dependencies = [
711dependencies = [
653− "bstr",
654 "gix-hash",
712 "gix-hash",
655 "gix-object",
713 "gix-object",
656 "thiserror",
714 "thiserror",
@@ -658,9 +716,9 @@ dependencies = [
658
716
659[[package]]
717[[package]]
660name = "gix-discover"
718name = "gix-discover"
661−version = "0.28.0"
719+version = "0.26.0"
662source = "registry+https://github.com/rust-lang/crates.io-index"
720source = "registry+https://github.com/rust-lang/crates.io-index"
663−checksum = "f0b63ce2ad81632ac1a84ac370f85a5e580c3261580bd85ea17ff35d3a0bba18"
721+checksum = "a45d5cf0321178883e38705ab2b098f625d609a7d4c391b33ac952eff2c490f2"
664dependencies = [
722dependencies = [
665 "bstr",
723 "bstr",
666 "dunce",
724 "dunce",
@@ -673,9 +731,9 @@ dependencies = [
673
731
674[[package]]
732[[package]]
675name = "gix-features"
733name = "gix-features"
676−version = "0.37.0"
734+version = "0.36.0"
677source = "registry+https://github.com/rust-lang/crates.io-index"
735source = "registry+https://github.com/rust-lang/crates.io-index"
678−checksum = "befe7edea299a824504b5acc96d7a3a538125b38c42f3a8379f6912a29c90c81"
736+checksum = "51f4365ba17c4f218d7fd9ec102b8d2d3cb0ca200a835e81151ace7778aec827"
679dependencies = [
737dependencies = [
680 "crc32fast",
738 "crc32fast",
681 "flate2",
739 "flate2",
@@ -691,18 +749,18 @@ dependencies = [
691
749
692[[package]]
750[[package]]
693name = "gix-fs"
751name = "gix-fs"
694−version = "0.9.0"
752+version = "0.8.0"
695source = "registry+https://github.com/rust-lang/crates.io-index"
753source = "registry+https://github.com/rust-lang/crates.io-index"
696−checksum = "007017ce93b819ea52c0ec68306f7d72212a2d307c3d70f1548c7141c015d0a1"
754+checksum = "8cd171c0cae97cd0dc57e7b4601cb1ebf596450e263ef3c02be9107272c877bd"
697dependencies = [
755dependencies = [
698 "gix-features",
756 "gix-features",
699]
757]
700
758
701[[package]]
759[[package]]
702name = "gix-glob"
760name = "gix-glob"
703−version = "0.15.0"
761+version = "0.14.0"
704source = "registry+https://github.com/rust-lang/crates.io-index"
762source = "registry+https://github.com/rust-lang/crates.io-index"
705−checksum = "61fb116c2516d3a1170e010118f639944a6389872c875a008960cdab2a44ac72"
763+checksum = "8fac08925dbc14d414bd02eb45ffb4cecd912d1fce3883f867bd0103c192d3e4"
706dependencies = [
764dependencies = [
707 "bitflags 2.4.1",
765 "bitflags 2.4.1",
708 "bstr",
766 "bstr",
@@ -712,9 +770,9 @@ dependencies = [
712
770
713[[package]]
771[[package]]
714name = "gix-hash"
772name = "gix-hash"
715−version = "0.14.0"
773+version = "0.13.1"
716source = "registry+https://github.com/rust-lang/crates.io-index"
774source = "registry+https://github.com/rust-lang/crates.io-index"
717−checksum = "c52c3170a17b6031833cd2eb4ad7bc23f2755d06e6e70f78dec21d42e8fe1b30"
775+checksum = "1884c7b41ea0875217c1be9ce91322f90bde433e91d374d0e1276073a51ccc60"
718dependencies = [
776dependencies = [
719 "faster-hex",
777 "faster-hex",
720 "thiserror",
778 "thiserror",
@@ -722,20 +780,20 @@ dependencies = [
722
780
723[[package]]
781[[package]]
724name = "gix-hashtable"
782name = "gix-hashtable"
725−version = "0.5.0"
783+version = "0.4.0"
726source = "registry+https://github.com/rust-lang/crates.io-index"
784source = "registry+https://github.com/rust-lang/crates.io-index"
727−checksum = "40a838e6366a5e5b84668b6997ce0981b833136468e8ba949f424c0ef2927eba"
785+checksum = "409268480841ad008e81c17ca5a293393fbf9f2b6c2f85b8ab9de1f0c5176a16"
728dependencies = [
786dependencies = [
729 "gix-hash",
787 "gix-hash",
730− "hashbrown 0.14.3",
788+ "hashbrown 0.14.2",
731 "parking_lot",
789 "parking_lot",
732]
790]
733
791
734[[package]]
792[[package]]
735name = "gix-lock"
793name = "gix-lock"
736−version = "12.0.0"
794+version = "11.0.0"
737source = "registry+https://github.com/rust-lang/crates.io-index"
795source = "registry+https://github.com/rust-lang/crates.io-index"
738−checksum = "6cf112ddee94223c119a8534dad027740dc3aba3365ac5edeef8a7f6660c74db"
796+checksum = "f4feb1dcd304fe384ddc22edba9dd56a42b0800032de6537728cea2f033a4f37"
739dependencies = [
797dependencies = [
740 "gix-tempfile",
798 "gix-tempfile",
741 "gix-utils",
799 "gix-utils",
@@ -744,9 +802,9 @@ dependencies = [
744
802
745[[package]]
803[[package]]
746name = "gix-macros"
804name = "gix-macros"
747−version = "0.1.2"
805+version = "0.1.0"
748source = "registry+https://github.com/rust-lang/crates.io-index"
806source = "registry+https://github.com/rust-lang/crates.io-index"
749−checksum = "fc207b64189cf71bcb17fc841ab99a5d63d0845546b611e2703ce467f659323a"
807+checksum = "9d8acb5ee668d55f0f2d19a320a3f9ef67a6999ad483e11135abcc2464ed18b6"
750dependencies = [
808dependencies = [
751 "proc-macro2",
809 "proc-macro2",
752 "quote",
810 "quote",
@@ -755,9 +813,9 @@ dependencies = [
755
813
756[[package]]
814[[package]]
757name = "gix-object"
815name = "gix-object"
758−version = "0.40.0"
816+version = "0.38.0"
759source = "registry+https://github.com/rust-lang/crates.io-index"
817source = "registry+https://github.com/rust-lang/crates.io-index"
760−checksum = "e4c77e47ffba92127faf632a841fce23d19547e269bd8b88e68961a70eab4e93"
818+checksum = "740f2a44267f58770a1cb3a3d01d14e67b089c7136c48d4bddbb3cfd2bf86a51"
761dependencies = [
819dependencies = [
762 "bstr",
820 "bstr",
763 "btoi",
821 "btoi",
@@ -769,14 +827,14 @@ dependencies = [
769 "itoa",
827 "itoa",
770 "smallvec",
828 "smallvec",
771 "thiserror",
829 "thiserror",
772− "winnow 0.5.28",
830+ "winnow 0.5.17",
773]
831]
774
832
775[[package]]
833[[package]]
776name = "gix-odb"
834name = "gix-odb"
777−version = "0.56.0"
835+version = "0.54.0"
778source = "registry+https://github.com/rust-lang/crates.io-index"
836source = "registry+https://github.com/rust-lang/crates.io-index"
779−checksum = "a3254f2005cc7553ea78e85e816a09150c6f7a64e6b7627b8d1fdc56721bea73"
837+checksum = "8630b56cb80d8fa684d383dad006a66401ee8314e12fbf0e566ddad8c115143b"
780dependencies = [
838dependencies = [
781 "arc-swap",
839 "arc-swap",
782 "gix-date",
840 "gix-date",
@@ -793,9 +851,9 @@ dependencies = [
793
851
794[[package]]
852[[package]]
795name = "gix-pack"
853name = "gix-pack"
796−version = "0.46.0"
854+version = "0.44.0"
797source = "registry+https://github.com/rust-lang/crates.io-index"
855source = "registry+https://github.com/rust-lang/crates.io-index"
798−checksum = "02ebc8cd657eec207d82d8f876ca402361308ecd3c87a47935b0299506257b4f"
856+checksum = "1431ba2e30deff1405920693d54ab231c88d7c240dd6ccc936ee223d8f8697c3"
799dependencies = [
857dependencies = [
800 "clru",
858 "clru",
801 "gix-chunk",
859 "gix-chunk",
@@ -805,7 +863,7 @@ dependencies = [
805 "gix-object",
863 "gix-object",
806 "gix-path",
864 "gix-path",
807 "gix-tempfile",
865 "gix-tempfile",
808− "memmap2",
866+ "memmap2 0.7.1",
809 "parking_lot",
867 "parking_lot",
810 "smallvec",
868 "smallvec",
811 "thiserror",
869 "thiserror",
@@ -813,9 +871,9 @@ dependencies = [
813
871
814[[package]]
872[[package]]
815name = "gix-path"
873name = "gix-path"
816−version = "0.10.2"
874+version = "0.10.0"
817source = "registry+https://github.com/rust-lang/crates.io-index"
875source = "registry+https://github.com/rust-lang/crates.io-index"
818−checksum = "10931652a3da126990ac93bce1b1c600cc99d7c268d712b6360ed52174ce1b68"
876+checksum = "6a1d370115171e3ae03c5c6d4f7d096f2981a40ddccb98dfd704c773530ba73b"
819dependencies = [
877dependencies = [
820 "bstr",
878 "bstr",
821 "gix-trace",
879 "gix-trace",
@@ -826,9 +884,9 @@ dependencies = [
826
884
827[[package]]
885[[package]]
828name = "gix-quote"
886name = "gix-quote"
829−version = "0.4.9"
887+version = "0.4.7"
830source = "registry+https://github.com/rust-lang/crates.io-index"
888source = "registry+https://github.com/rust-lang/crates.io-index"
831−checksum = "6c43530cb94a7759807e6f8d180e17ac9c65673b891645c6c433831dc0cf4342"
889+checksum = "475c86a97dd0127ba4465fbb239abac9ea10e68301470c9791a6dd5351cdc905"
832dependencies = [
890dependencies = [
833 "bstr",
891 "bstr",
834 "btoi",
892 "btoi",
@@ -837,9 +895,9 @@ dependencies = [
837
895
838[[package]]
896[[package]]
839name = "gix-ref"
897name = "gix-ref"
840−version = "0.40.0"
898+version = "0.38.0"
841source = "registry+https://github.com/rust-lang/crates.io-index"
899source = "registry+https://github.com/rust-lang/crates.io-index"
842−checksum = "baa951b3b850d6d1be4f900768e49af20b76bf9505beac22af723d57249a2f1d"
900+checksum = "0ec2f6d07ac88d2fb8007ee3fa3e801856fb9d82e7366ec0ca332eb2c9d74a52"
843dependencies = [
901dependencies = [
844 "gix-actor",
902 "gix-actor",
845 "gix-date",
903 "gix-date",
@@ -851,16 +909,16 @@ dependencies = [
851 "gix-path",
909 "gix-path",
852 "gix-tempfile",
910 "gix-tempfile",
853 "gix-validate",
911 "gix-validate",
854− "memmap2",
912+ "memmap2 0.7.1",
855 "thiserror",
913 "thiserror",
856− "winnow 0.5.28",
914+ "winnow 0.5.17",
857]
915]
858
916
859[[package]]
917[[package]]
860name = "gix-refspec"
918name = "gix-refspec"
861−version = "0.21.0"
919+version = "0.19.0"
862source = "registry+https://github.com/rust-lang/crates.io-index"
920source = "registry+https://github.com/rust-lang/crates.io-index"
863−checksum = "88c61f849d58c06e3068a0b601cf10127d2a07cdad00a725ed66cf303f76f6b3"
921+checksum = "ccb0974cc41dbdb43a180c7f67aa481e1c1e160fcfa8f4a55291fd1126c1a6e7"
864dependencies = [
922dependencies = [
865 "bstr",
923 "bstr",
866 "gix-hash",
924 "gix-hash",
@@ -872,9 +930,9 @@ dependencies = [
872
930
873[[package]]
931[[package]]
874name = "gix-revision"
932name = "gix-revision"
875−version = "0.25.0"
933+version = "0.23.0"
876source = "registry+https://github.com/rust-lang/crates.io-index"
934source = "registry+https://github.com/rust-lang/crates.io-index"
877−checksum = "bcbbf91f4200c5c76802ef5f057b96f5a336827508881fe55a780be71a794d22"
935+checksum = "2ca97ac73459a7f3766aa4a5638a6e37d56d4c7962bc1986fbaf4883d0772588"
878dependencies = [
936dependencies = [
879 "bstr",
937 "bstr",
880 "gix-date",
938 "gix-date",
@@ -888,9 +946,9 @@ dependencies = [
888
946
889[[package]]
947[[package]]
890name = "gix-revwalk"
948name = "gix-revwalk"
891−version = "0.11.0"
949+version = "0.9.0"
892source = "registry+https://github.com/rust-lang/crates.io-index"
950source = "registry+https://github.com/rust-lang/crates.io-index"
893−checksum = "33ab66354d83f70f2730391747d0c75f94ef3c3dd40ebde2e206db9faaf7a0a7"
951+checksum = "a16d8c892e4cd676d86f0265bf9d40cefd73d8d94f86b213b8b77d50e77efae0"
894dependencies = [
952dependencies = [
895 "gix-commitgraph",
953 "gix-commitgraph",
896 "gix-date",
954 "gix-date",
@@ -903,21 +961,21 @@ dependencies = [
903
961
904[[package]]
962[[package]]
905name = "gix-sec"
963name = "gix-sec"
906−version = "0.10.2"
964+version = "0.10.0"
907source = "registry+https://github.com/rust-lang/crates.io-index"
965source = "registry+https://github.com/rust-lang/crates.io-index"
908−checksum = "a9963f38a42144253ed4d571882d7db5ef644c12e6726e4b75135597cc9d0e1a"
966+checksum = "92b9542ac025a8c02ed5d17b3fc031a111a384e859d0be3532ec4d58c40a0f28"
909dependencies = [
967dependencies = [
910 "bitflags 2.4.1",
968 "bitflags 2.4.1",
911 "gix-path",
969 "gix-path",
912 "libc",
970 "libc",
913− "windows 0.52.0",
971+ "windows",
914]
972]
915
973
916[[package]]
974[[package]]
917name = "gix-tempfile"
975name = "gix-tempfile"
918−version = "12.0.0"
976+version = "11.0.0"
919source = "registry+https://github.com/rust-lang/crates.io-index"
977source = "registry+https://github.com/rust-lang/crates.io-index"
920−checksum = "e76a494bd530e1a1309188ff971825a24f159c76c2db0bf71fa5dfb469a2c915"
978+checksum = "05cc2205cf10d99f70b96e04e16c55d4c7cf33efc151df1f793e29fd12a931f8"
921dependencies = [
979dependencies = [
922 "gix-fs",
980 "gix-fs",
923 "libc",
981 "libc",
@@ -928,15 +986,15 @@ dependencies = [
928
986
929[[package]]
987[[package]]
930name = "gix-trace"
988name = "gix-trace"
931−version = "0.1.5"
989+version = "0.1.3"
932source = "registry+https://github.com/rust-lang/crates.io-index"
990source = "registry+https://github.com/rust-lang/crates.io-index"
933−checksum = "bda62acb44dd86a40c7c3762a5403cfc1ac789ea559df54085cedf79864f809e"
991+checksum = "96b6d623a1152c3facb79067d6e2ecdae48130030cf27d6eb21109f13bd7b836"
934
992
935[[package]]
993[[package]]
936name = "gix-traverse"
994name = "gix-traverse"
937−version = "0.36.0"
995+version = "0.34.0"
938source = "registry+https://github.com/rust-lang/crates.io-index"
996source = "registry+https://github.com/rust-lang/crates.io-index"
939−checksum = "8661fab39985c9214e56d81a63ceb5886ac948cec2fba76c39494d1e0e307ea8"
997+checksum = "14d050ec7d4e1bb76abf0636cf4104fb915b70e54e3ced9a4427c999100ff38a"
940dependencies = [
998dependencies = [
941 "gix-commitgraph",
999 "gix-commitgraph",
942 "gix-date",
1000 "gix-date",
@@ -950,9 +1008,9 @@ dependencies = [
950
1008
951[[package]]
1009[[package]]
952name = "gix-url"
1010name = "gix-url"
953−version = "0.26.0"
1011+version = "0.25.1"
954source = "registry+https://github.com/rust-lang/crates.io-index"
1012source = "registry+https://github.com/rust-lang/crates.io-index"
955−checksum = "10a0129c1e8b52736d7c5128300a4485dbc85863001371e2771ac1754bd89fd7"
1013+checksum = "b1b9ac8ed32ad45f9fc6c5f8c0be2ed911e544a5a19afd62d95d524ebaa95671"
956dependencies = [
1014dependencies = [
957 "bstr",
1015 "bstr",
958 "gix-features",
1016 "gix-features",
@@ -964,18 +1022,18 @@ dependencies = [
964
1022
965[[package]]
1023[[package]]
966name = "gix-utils"
1024name = "gix-utils"
967−version = "0.1.7"
1025+version = "0.1.5"
968source = "registry+https://github.com/rust-lang/crates.io-index"
1026source = "registry+https://github.com/rust-lang/crates.io-index"
969−checksum = "ab9277a5e32e85d53f738096d872a4a9b76067ad471894ad31bd99c8fa2da1dc"
1027+checksum = "b85d89dc728613e26e0ed952a19583744e7f5240fcd4aa30d6c824ffd8b52f0f"
970dependencies = [
1028dependencies = [
971 "fastrand",
1029 "fastrand",
972]
1030]
973
1031
974[[package]]
1032[[package]]
975name = "gix-validate"
1033name = "gix-validate"
976−version = "0.8.2"
1034+version = "0.8.0"
977source = "registry+https://github.com/rust-lang/crates.io-index"
1035source = "registry+https://github.com/rust-lang/crates.io-index"
978−checksum = "f805ebbdbaa4bfd98e2ee43e6d14099b8a4d9141f5d7b8202fea4d48e44263e7"
1036+checksum = "e05cab2b03a45b866156e052aa38619f4ece4adcb2f79978bfc249bc3b21b8c5"
979dependencies = [
1037dependencies = [
980 "bstr",
1038 "bstr",
981 "thiserror",
1039 "thiserror",
@@ -983,52 +1041,54 @@ dependencies = [
983
1041
984[[package]]
1042[[package]]
985name = "globset"
1043name = "globset"
986−version = "0.4.14"
1044+version = "0.4.13"
987source = "registry+https://github.com/rust-lang/crates.io-index"
1045source = "registry+https://github.com/rust-lang/crates.io-index"
988−checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
1046+checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d"
989dependencies = [
1047dependencies = [
990− "aho-corasick",
1048+ "aho-corasick 1.0.2",
991 "bstr",
1049 "bstr",
1050+ "fnv",
992 "log",
1051 "log",
993− "regex-automata",
1052+ "regex",
994− "regex-syntax",
995]
1053]
996
1054
997[[package]]
1055[[package]]
998name = "grep-matcher"
1056name = "grep-matcher"
999−version = "0.1.7"
1057+version = "0.1.6"
1000source = "registry+https://github.com/rust-lang/crates.io-index"
1058source = "registry+https://github.com/rust-lang/crates.io-index"
1001−checksum = "47a3141a10a43acfedc7c98a60a834d7ba00dfe7bec9071cbfc19b55b292ac02"
1059+checksum = "3902ca28f26945fe35cad349d776f163981d777fee382ccd6ef451126f51b319"
1002dependencies = [
1060dependencies = [
1003 "memchr",
1061 "memchr",
1004]
1062]
1005
1063
1006[[package]]
1064[[package]]
1007name = "grep-regex"
1065name = "grep-regex"
1008−version = "0.1.12"
1066+version = "0.1.11"
1009source = "registry+https://github.com/rust-lang/crates.io-index"
1067source = "registry+https://github.com/rust-lang/crates.io-index"
1010−checksum = "f748bb135ca835da5cbc67ca0e6955f968db9c5df74ca4f56b18e1ddbc68230d"
1068+checksum = "997598b41d53a37a2e3fc5300d5c11d825368c054420a9c65125b8fe1078463f"
1011dependencies = [
1069dependencies = [
1070+ "aho-corasick 0.7.20",
1012 "bstr",
1071 "bstr",
1013 "grep-matcher",
1072 "grep-matcher",
1014 "log",
1073 "log",
1015− "regex-automata",
1074+ "regex",
1016− "regex-syntax",
1075+ "regex-syntax 0.6.29",
1076+ "thread_local",
1017]
1077]
1018
1078
1019[[package]]
1079[[package]]
1020name = "grep-searcher"
1080name = "grep-searcher"
1021−version = "0.1.13"
1081+version = "0.1.11"
1022source = "registry+https://github.com/rust-lang/crates.io-index"
1082source = "registry+https://github.com/rust-lang/crates.io-index"
1023−checksum = "ba536ae4f69bec62d8839584dd3153d3028ef31bb229f04e09fb5a9e5a193c54"
1083+checksum = "5601c4b9f480f0c9ebb40b1f6cbf447b8a50c5369223937a6c5214368c58779f"
1024dependencies = [
1084dependencies = [
1025 "bstr",
1085 "bstr",
1086+ "bytecount",
1026 "encoding_rs",
1087 "encoding_rs",
1027 "encoding_rs_io",
1088 "encoding_rs_io",
1028 "grep-matcher",
1089 "grep-matcher",
1029 "log",
1090 "log",
1030− "memchr",
1031− "memmap2",
1091+ "memmap2 0.5.10",
1032]
1092]
1033
1093
1034[[package]]
1094[[package]]
@@ -1039,9 +1099,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
1039
1099
1040[[package]]
1100[[package]]
1041name = "hashbrown"
1101name = "hashbrown"
1042−version = "0.14.3"
1102+version = "0.14.2"
1043source = "registry+https://github.com/rust-lang/crates.io-index"
1103source = "registry+https://github.com/rust-lang/crates.io-index"
1044−checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
1104+checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156"
1045dependencies = [
1105dependencies = [
1046 "ahash",
1106 "ahash",
1047 "allocator-api2",
1107 "allocator-api2",
@@ -1049,7 +1109,7 @@ dependencies = [
1049
1109
1050[[package]]
1110[[package]]
1051name = "helix-core"
1111name = "helix-core"
1052−version = "23.10.0"
1112+version = "0.6.0"
1053dependencies = [
1113dependencies = [
1054 "ahash",
1114 "ahash",
1055 "arc-swap",
1115 "arc-swap",
@@ -1058,7 +1118,7 @@ dependencies = [
1058 "dunce",
1118 "dunce",
1059 "encoding_rs",
1119 "encoding_rs",
1060 "etcetera",
1120 "etcetera",
1061− "hashbrown 0.14.3",
1121+ "hashbrown 0.14.2",
1062 "helix-loader",
1122 "helix-loader",
1063 "imara-diff",
1123 "imara-diff",
1064 "indoc",
1124 "indoc",
@@ -1084,7 +1144,7 @@ dependencies = [
1084
1144
1085[[package]]
1145[[package]]
1086name = "helix-dap"
1146name = "helix-dap"
1087−version = "23.10.0"
1147+version = "0.6.0"
1088dependencies = [
1148dependencies = [
1089 "anyhow",
1149 "anyhow",
1090 "fern",
1150 "fern",
@@ -1099,7 +1159,7 @@ dependencies = [
1099
1159
1100[[package]]
1160[[package]]
1101name = "helix-event"
1161name = "helix-event"
1102−version = "23.10.0"
1162+version = "0.6.0"
1103dependencies = [
1163dependencies = [
1104 "parking_lot",
1164 "parking_lot",
1105 "tokio",
1165 "tokio",
@@ -1107,7 +1167,7 @@ dependencies = [
1107
1167
1108[[package]]
1168[[package]]
1109name = "helix-loader"
1169name = "helix-loader"
1110−version = "23.10.0"
1170+version = "0.6.0"
1111dependencies = [
1171dependencies = [
1112 "anyhow",
1172 "anyhow",
1113 "cc",
1173 "cc",
@@ -1126,7 +1186,7 @@ dependencies = [
1126
1186
1127[[package]]
1187[[package]]
1128name = "helix-lsp"
1188name = "helix-lsp"
1129−version = "23.10.0"
1189+version = "0.6.0"
1130dependencies = [
1190dependencies = [
1131 "anyhow",
1191 "anyhow",
1132 "futures-executor",
1192 "futures-executor",
@@ -1148,11 +1208,11 @@ dependencies = [
1148
1208
1149[[package]]
1209[[package]]
1150name = "helix-parsec"
1210name = "helix-parsec"
1151−version = "23.10.0"
1211+version = "0.6.0"
1152
1212
1153[[package]]
1213[[package]]
1154name = "helix-term"
1214name = "helix-term"
1155−version = "23.10.0"
1215+version = "0.6.0"
1156dependencies = [
1216dependencies = [
1157 "anyhow",
1217 "anyhow",
1158 "arc-swap",
1218 "arc-swap",
@@ -1177,7 +1237,6 @@ dependencies = [
1177 "log",
1237 "log",
1178 "nucleo",
1238 "nucleo",
1179 "once_cell",
1239 "once_cell",
1180− "open",
1181 "pulldown-cmark",
1240 "pulldown-cmark",
1182 "serde",
1241 "serde",
1183 "serde_json",
1242 "serde_json",
@@ -1188,13 +1247,12 @@ dependencies = [
1188 "tokio",
1247 "tokio",
1189 "tokio-stream",
1248 "tokio-stream",
1190 "toml",
1249 "toml",
1191− "url",
1192 "which",
1250 "which",
1193]
1251]
1194
1252
1195[[package]]
1253[[package]]
1196name = "helix-tui"
1254name = "helix-tui"
1197−version = "23.10.0"
1255+version = "0.6.0"
1198dependencies = [
1256dependencies = [
1199 "bitflags 2.4.1",
1257 "bitflags 2.4.1",
1200 "cassowary",
1258 "cassowary",
@@ -1210,7 +1268,7 @@ dependencies = [
1210
1268
1211[[package]]
1269[[package]]
1212name = "helix-vcs"
1270name = "helix-vcs"
1213−version = "23.10.0"
1271+version = "0.6.0"
1214dependencies = [
1272dependencies = [
1215 "anyhow",
1273 "anyhow",
1216 "arc-swap",
1274 "arc-swap",
@@ -1226,7 +1284,7 @@ dependencies = [
1226
1284
1227[[package]]
1285[[package]]
1228name = "helix-view"
1286name = "helix-view"
1229−version = "23.10.0"
1287+version = "0.6.0"
1230dependencies = [
1288dependencies = [
1231 "anyhow",
1289 "anyhow",
1232 "arc-swap",
1290 "arc-swap",
@@ -1268,11 +1326,11 @@ dependencies = [
1268
1326
1269[[package]]
1327[[package]]
1270name = "home"
1328name = "home"
1271−version = "0.5.5"
1329+version = "0.5.4"
1272source = "registry+https://github.com/rust-lang/crates.io-index"
1330source = "registry+https://github.com/rust-lang/crates.io-index"
1273−checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"
1331+checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408"
1274dependencies = [
1332dependencies = [
1275− "windows-sys 0.48.0",
1333+ "winapi",
1276]
1334]
1277
1335
1278[[package]]
1336[[package]]
@@ -1286,7 +1344,7 @@ dependencies = [
1286 "iana-time-zone-haiku",
1344 "iana-time-zone-haiku",
1287 "js-sys",
1345 "js-sys",
1288 "wasm-bindgen",
1346 "wasm-bindgen",
1289− "windows 0.48.0",
1347+ "windows",
1290]
1348]
1291
1349
1292[[package]]
1350[[package]]
@@ -1301,9 +1359,9 @@ dependencies = [
1301
1359
1302[[package]]
1360[[package]]
1303name = "idna"
1361name = "idna"
1304−version = "0.5.0"
1362+version = "0.4.0"
1305source = "registry+https://github.com/rust-lang/crates.io-index"
1363source = "registry+https://github.com/rust-lang/crates.io-index"
1306−checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
1364+checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
1307dependencies = [
1365dependencies = [
1308 "unicode-bidi",
1366 "unicode-bidi",
1309 "unicode-normalization",
1367 "unicode-normalization",
@@ -1311,16 +1369,17 @@ dependencies = [
1311
1369
1312[[package]]
1370[[package]]
1313name = "ignore"
1371name = "ignore"
1314−version = "0.4.21"
1372+version = "0.4.20"
1315source = "registry+https://github.com/rust-lang/crates.io-index"
1373source = "registry+https://github.com/rust-lang/crates.io-index"
1316−checksum = "747ad1b4ae841a78e8aba0d63adbfbeaea26b517b63705d47856b73015d27060"
1374+checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492"
1317dependencies = [
1375dependencies = [
1318− "crossbeam-deque",
1319 "globset",
1376 "globset",
1377+ "lazy_static",
1320 "log",
1378 "log",
1321 "memchr",
1379 "memchr",
1322− "regex-automata",
1380+ "regex",
1323 "same-file",
1381 "same-file",
1382+ "thread_local",
1324 "walkdir",
1383 "walkdir",
1325 "winapi-util",
1384 "winapi-util",
1326]
1385]
@@ -1342,7 +1401,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1342checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
1401checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
1343dependencies = [
1402dependencies = [
1344 "equivalent",
1403 "equivalent",
1345− "hashbrown 0.14.3",
1404+ "hashbrown 0.14.2",
1346]
1405]
1347
1406
1348[[package]]
1407[[package]]
@@ -1351,25 +1410,6 @@ version = "2.0.4"
1351source = "registry+https://github.com/rust-lang/crates.io-index"
1410source = "registry+https://github.com/rust-lang/crates.io-index"
1352checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
1411checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
1353
1412
1354−[[package]]
1355−name = "is-docker"
1356−version = "0.2.0"
1357−source = "registry+https://github.com/rust-lang/crates.io-index"
1358−checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3"
1359−dependencies = [
1360− "once_cell",
1361−]
1362−
1363−[[package]]
1364−name = "is-wsl"
1365−version = "0.4.0"
1366−source = "registry+https://github.com/rust-lang/crates.io-index"
1367−checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5"
1368−dependencies = [
1369− "is-docker",
1370− "once_cell",
1371−]
1372−
1373[[package]]
1413[[package]]
1374name = "itoa"
1414name = "itoa"
1375version = "1.0.6"
1415version = "1.0.6"
@@ -1385,11 +1425,17 @@ dependencies = [
1385 "wasm-bindgen",
1425 "wasm-bindgen",
1386]
1426]
1387
1427
1428+[[package]]
1429+name = "lazy_static"
1430+version = "1.4.0"
1431+source = "registry+https://github.com/rust-lang/crates.io-index"
1432+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
1433+
1388[[package]]
1434[[package]]
1389name = "libc"
1435name = "libc"
1390−version = "0.2.151"
1436+version = "0.2.150"
1391source = "registry+https://github.com/rust-lang/crates.io-index"
1437source = "registry+https://github.com/rust-lang/crates.io-index"
1392−checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4"
1438+checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
1393
1439
1394[[package]]
1440[[package]]
1395name = "libloading"
1441name = "libloading"
@@ -1412,9 +1458,9 @@ dependencies = [
1412
1458
1413[[package]]
1459[[package]]
1414name = "linux-raw-sys"
1460name = "linux-raw-sys"
1415−version = "0.4.11"
1461+version = "0.4.10"
1416source = "registry+https://github.com/rust-lang/crates.io-index"
1462source = "registry+https://github.com/rust-lang/crates.io-index"
1417−checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829"
1463+checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f"
1418
1464
1419[[package]]
1465[[package]]
1420name = "lock_api"
1466name = "lock_api"
@@ -1434,9 +1480,9 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
1434
1480
1435[[package]]
1481[[package]]
1436name = "lsp-types"
1482name = "lsp-types"
1437−version = "0.95.0"
1483+version = "0.94.1"
1438source = "registry+https://github.com/rust-lang/crates.io-index"
1484source = "registry+https://github.com/rust-lang/crates.io-index"
1439−checksum = "158c1911354ef73e8fe42da6b10c0484cb65c7f1007f28022e847706c1ab6984"
1485+checksum = "c66bfd44a06ae10647fe3f8214762e9369fd4248df1350924b4ef9e770a85ea1"
1440dependencies = [
1486dependencies = [
1441 "bitflags 1.3.2",
1487 "bitflags 1.3.2",
1442 "serde",
1488 "serde",
@@ -1453,9 +1499,18 @@ checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c"
1453
1499
1454[[package]]
1500[[package]]
1455name = "memmap2"
1501name = "memmap2"
1456−version = "0.9.0"
1502+version = "0.5.10"
1503+source = "registry+https://github.com/rust-lang/crates.io-index"
1504+checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327"
1505+dependencies = [
1506+ "libc",
1507+]
1508+
1509+[[package]]
1510+name = "memmap2"
1511+version = "0.7.1"
1457source = "registry+https://github.com/rust-lang/crates.io-index"
1512source = "registry+https://github.com/rust-lang/crates.io-index"
1458−checksum = "deaba38d7abf1d4cca21cc89e932e542ba2b9258664d2a9ef0e61512039c9375"
1513+checksum = "f49388d20533534cd19360ad3d6a7dadc885944aa802ba3995040c5ec11288c6"
1459dependencies = [
1514dependencies = [
1460 "libc",
1515 "libc",
1461]
1516]
@@ -1480,14 +1535,14 @@ dependencies = [
1480
1535
1481[[package]]
1536[[package]]
1482name = "mio"
1537name = "mio"
1483−version = "0.8.9"
1538+version = "0.8.6"
1484source = "registry+https://github.com/rust-lang/crates.io-index"
1539source = "registry+https://github.com/rust-lang/crates.io-index"
1485−checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0"
1540+checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9"
1486dependencies = [
1541dependencies = [
1487 "libc",
1542 "libc",
1488 "log",
1543 "log",
1489 "wasi",
1544 "wasi",
1490− "windows-sys 0.48.0",
1545+ "windows-sys 0.45.0",
1491]
1546]
1492
1547
1493[[package]]
1548[[package]]
@@ -1551,20 +1606,15 @@ dependencies = [
1551
1606
1552[[package]]
1607[[package]]
1553name = "once_cell"
1608name = "once_cell"
1554−version = "1.19.0"
1609+version = "1.18.0"
1555source = "registry+https://github.com/rust-lang/crates.io-index"
1610source = "registry+https://github.com/rust-lang/crates.io-index"
1556−checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
1611+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
1557
1612
1558[[package]]
1613[[package]]
1559−name = "open"
1614+name = "option-ext"
1560−version = "5.0.1"
1615+version = "0.2.0"
1561source = "registry+https://github.com/rust-lang/crates.io-index"
1616source = "registry+https://github.com/rust-lang/crates.io-index"
1562−checksum = "90878fb664448b54c4e592455ad02831e23a3f7e157374a8b95654731aac7349"
1617+checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
1563−dependencies = [
1564− "is-wsl",
1565− "libc",
1566− "pathdiff",
1567−]
1568
1618
1569[[package]]
1619[[package]]
1570name = "parking_lot"
1620name = "parking_lot"
@@ -1589,17 +1639,11 @@ dependencies = [
1589 "windows-sys 0.45.0",
1639 "windows-sys 0.45.0",
1590]
1640]
1591
1641
1592−[[package]]
1593−name = "pathdiff"
1594−version = "0.2.1"
1595−source = "registry+https://github.com/rust-lang/crates.io-index"
1596−checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd"
1597−
1598[[package]]
1642[[package]]
1599name = "percent-encoding"
1643name = "percent-encoding"
1600−version = "2.3.1"
1644+version = "2.3.0"
1601source = "registry+https://github.com/rust-lang/crates.io-index"
1645source = "registry+https://github.com/rust-lang/crates.io-index"
1602−checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
1646+checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
1603
1647
1604[[package]]
1648[[package]]
1605name = "pin-project-lite"
1649name = "pin-project-lite"
@@ -1624,9 +1668,9 @@ dependencies = [
1624
1668
1625[[package]]
1669[[package]]
1626name = "prodash"
1670name = "prodash"
1627−version = "28.0.0"
1671+version = "26.2.2"
1628source = "registry+https://github.com/rust-lang/crates.io-index"
1672source = "registry+https://github.com/rust-lang/crates.io-index"
1629−checksum = "744a264d26b88a6a7e37cbad97953fa233b94d585236310bcbc88474b4092d79"
1673+checksum = "794b5bf8e2d19b53dcdcec3e4bba628e20f5b6062503ba89281fa7037dd7bbcf"
1630
1674
1631[[package]]
1675[[package]]
1632name = "pulldown-cmark"
1676name = "pulldown-cmark"
@@ -1715,29 +1759,52 @@ dependencies = [
1715 "bitflags 1.3.2",
1759 "bitflags 1.3.2",
1716]
1760]
1717
1761
1762+[[package]]
1763+name = "redox_users"
1764+version = "0.4.3"
1765+source = "registry+https://github.com/rust-lang/crates.io-index"
1766+checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
1767+dependencies = [
1768+ "getrandom",
1769+ "redox_syscall 0.2.16",
1770+ "thiserror",
1771+]
1772+
1718[[package]]
1773[[package]]
1719name = "regex"
1774name = "regex"
1720version = "1.10.2"
1775version = "1.10.2"
1721source = "registry+https://github.com/rust-lang/crates.io-index"
1776source = "registry+https://github.com/rust-lang/crates.io-index"
1722checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
1777checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
1723dependencies = [
1778dependencies = [
1724− "aho-corasick",
1779+ "aho-corasick 1.0.2",
1725 "memchr",
1780 "memchr",
1726− "regex-automata",
1781+ "regex-automata 0.4.3",
1727− "regex-syntax",
1782+ "regex-syntax 0.8.2",
1728]
1783]
1729
1784
1785+[[package]]
1786+name = "regex-automata"
1787+version = "0.3.9"
1788+source = "registry+https://github.com/rust-lang/crates.io-index"
1789+checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9"
1790+
1730[[package]]
1791[[package]]
1731name = "regex-automata"
1792name = "regex-automata"
1732version = "0.4.3"
1793version = "0.4.3"
1733source = "registry+https://github.com/rust-lang/crates.io-index"
1794source = "registry+https://github.com/rust-lang/crates.io-index"
1734checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
1795checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
1735dependencies = [
1796dependencies = [
1736− "aho-corasick",
1797+ "aho-corasick 1.0.2",
1737 "memchr",
1798 "memchr",
1738− "regex-syntax",
1799+ "regex-syntax 0.8.2",
1739]
1800]
1740
1801
1802+[[package]]
1803+name = "regex-syntax"
1804+version = "0.6.29"
1805+source = "registry+https://github.com/rust-lang/crates.io-index"
1806+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
1807+
1741[[package]]
1808[[package]]
1742name = "regex-syntax"
1809name = "regex-syntax"
1743version = "0.8.2"
1810version = "0.8.2"
@@ -1762,15 +1829,15 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
1762
1829
1763[[package]]
1830[[package]]
1764name = "rustix"
1831name = "rustix"
1765−version = "0.38.28"
1832+version = "0.38.21"
1766source = "registry+https://github.com/rust-lang/crates.io-index"
1833source = "registry+https://github.com/rust-lang/crates.io-index"
1767−checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316"
1834+checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3"
1768dependencies = [
1835dependencies = [
1769 "bitflags 2.4.1",
1836 "bitflags 2.4.1",
1770 "errno",
1837 "errno",
1771 "libc",
1838 "libc",
1772 "linux-raw-sys",
1839 "linux-raw-sys",
1773− "windows-sys 0.52.0",
1840+ "windows-sys 0.48.0",
1774]
1841]
1775
1842
1776[[package]]
1843[[package]]
@@ -1802,18 +1869,18 @@ checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1"
1802
1869
1803[[package]]
1870[[package]]
1804name = "serde"
1871name = "serde"
1805−version = "1.0.193"
1872+version = "1.0.191"
1806source = "registry+https://github.com/rust-lang/crates.io-index"
1873source = "registry+https://github.com/rust-lang/crates.io-index"
1807−checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
1874+checksum = "a834c4821019838224821468552240d4d95d14e751986442c816572d39a080c9"
1808dependencies = [
1875dependencies = [
1809 "serde_derive",
1876 "serde_derive",
1810]
1877]
1811
1878
1812[[package]]
1879[[package]]
1813name = "serde_derive"
1880name = "serde_derive"
1814−version = "1.0.193"
1881+version = "1.0.191"
1815source = "registry+https://github.com/rust-lang/crates.io-index"
1882source = "registry+https://github.com/rust-lang/crates.io-index"
1816−checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
1883+checksum = "46fa52d5646bce91b680189fe5b1c049d2ea38dabb4e2e7c8d00ca12cfbfbcfd"
1817dependencies = [
1884dependencies = [
1818 "proc-macro2",
1885 "proc-macro2",
1819 "quote",
1886 "quote",
@@ -1910,18 +1977,18 @@ dependencies = [
1910
1977
1911[[package]]
1978[[package]]
1912name = "slotmap"
1979name = "slotmap"
1913−version = "1.0.7"
1980+version = "1.0.6"
1914source = "registry+https://github.com/rust-lang/crates.io-index"
1981source = "registry+https://github.com/rust-lang/crates.io-index"
1915−checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a"
1982+checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342"
1916dependencies = [
1983dependencies = [
1917 "version_check",
1984 "version_check",
1918]
1985]
1919
1986
1920[[package]]
1987[[package]]
1921name = "smallvec"
1988name = "smallvec"
1922−version = "1.11.2"
1989+version = "1.11.1"
1923source = "registry+https://github.com/rust-lang/crates.io-index"
1990source = "registry+https://github.com/rust-lang/crates.io-index"
1924−checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"
1991+checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
1925
1992
1926[[package]]
1993[[package]]
1927name = "smartstring"
1994name = "smartstring"
@@ -1942,9 +2009,9 @@ checksum = "f67ad224767faa3c7d8b6d91985b78e70a1324408abcb1cfcc2be4c06bc06043"
1942
2009
1943[[package]]
2010[[package]]
1944name = "socket2"
2011name = "socket2"
1945−version = "0.5.5"
2012+version = "0.5.3"
1946source = "registry+https://github.com/rust-lang/crates.io-index"
2013source = "registry+https://github.com/rust-lang/crates.io-index"
1947−checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
2014+checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877"
1948dependencies = [
2015dependencies = [
1949 "libc",
2016 "libc",
1950 "windows-sys 0.48.0",
2017 "windows-sys 0.48.0",
@@ -1956,6 +2023,12 @@ version = "1.1.0"
1956source = "registry+https://github.com/rust-lang/crates.io-index"
2023source = "registry+https://github.com/rust-lang/crates.io-index"
1957checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
2024checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
1958
2025
2026+[[package]]
2027+name = "str-buf"
2028+version = "1.0.6"
2029+source = "registry+https://github.com/rust-lang/crates.io-index"
2030+checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0"
2031+
1959[[package]]
2032[[package]]
1960name = "str_indices"
2033name = "str_indices"
1961version = "0.4.1"
2034version = "0.4.1"
@@ -2028,24 +2101,34 @@ dependencies = [
2028
2101
2029[[package]]
2102[[package]]
2030name = "thiserror"
2103name = "thiserror"
2031−version = "1.0.52"
2104+version = "1.0.50"
2032source = "registry+https://github.com/rust-lang/crates.io-index"
2105source = "registry+https://github.com/rust-lang/crates.io-index"
2033−checksum = "83a48fd946b02c0a526b2e9481c8e2a17755e47039164a86c4070446e3a4614d"
2106+checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2"
2034dependencies = [
2107dependencies = [
2035 "thiserror-impl",
2108 "thiserror-impl",
2036]
2109]
2037
2110
2038[[package]]
2111[[package]]
2039name = "thiserror-impl"
2112name = "thiserror-impl"
2040−version = "1.0.52"
2113+version = "1.0.50"
2041source = "registry+https://github.com/rust-lang/crates.io-index"
2114source = "registry+https://github.com/rust-lang/crates.io-index"
2042−checksum = "e7fbe9b594d6568a6a1443250a7e67d80b74e1e96f6d1715e1e21cc1888291d3"
2115+checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8"
2043dependencies = [
2116dependencies = [
2044 "proc-macro2",
2117 "proc-macro2",
2045 "quote",
2118 "quote",
2046 "syn 2.0.38",
2119 "syn 2.0.38",
2047]
2120]
2048
2121
2122+[[package]]
2123+name = "thread_local"
2124+version = "1.1.7"
2125+source = "registry+https://github.com/rust-lang/crates.io-index"
2126+checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
2127+dependencies = [
2128+ "cfg-if",
2129+ "once_cell",
2130+]
2131+
2049[[package]]
2132[[package]]
2050name = "threadpool"
2133name = "threadpool"
2051version = "1.8.1"
2134version = "1.8.1"
@@ -2101,9 +2184,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
2101
2184
2102[[package]]
2185[[package]]
2103name = "tokio"
2186name = "tokio"
2104−version = "1.35.1"
2187+version = "1.33.0"
2105source = "registry+https://github.com/rust-lang/crates.io-index"
2188source = "registry+https://github.com/rust-lang/crates.io-index"
2106−checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
2189+checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653"
2107dependencies = [
2190dependencies = [
2108 "backtrace",
2191 "backtrace",
2109 "bytes",
2192 "bytes",
@@ -2120,9 +2203,9 @@ dependencies = [
2120
2203
2121[[package]]
2204[[package]]
2122name = "tokio-macros"
2205name = "tokio-macros"
2123−version = "2.2.0"
2206+version = "2.1.0"
2124source = "registry+https://github.com/rust-lang/crates.io-index"
2207source = "registry+https://github.com/rust-lang/crates.io-index"
2125−checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
2208+checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
2126dependencies = [
2209dependencies = [
2127 "proc-macro2",
2210 "proc-macro2",
2128 "quote",
2211 "quote",
@@ -2245,9 +2328,9 @@ checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
2245
2328
2246[[package]]
2329[[package]]
2247name = "url"
2330name = "url"
2248−version = "2.5.0"
2331+version = "2.4.1"
2249source = "registry+https://github.com/rust-lang/crates.io-index"
2332source = "registry+https://github.com/rust-lang/crates.io-index"
2250−checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
2333+checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5"
2251dependencies = [
2334dependencies = [
2252 "form_urlencoded",
2335 "form_urlencoded",
2253 "idna",
2336 "idna",
@@ -2263,9 +2346,9 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
2263
2346
2264[[package]]
2347[[package]]
2265name = "walkdir"
2348name = "walkdir"
2266−version = "2.4.0"
2349+version = "2.3.3"
2267source = "registry+https://github.com/rust-lang/crates.io-index"
2350source = "registry+https://github.com/rust-lang/crates.io-index"
2268−checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee"
2351+checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
2269dependencies = [
2352dependencies = [
2270 "same-file",
2353 "same-file",
2271 "winapi-util",
2354 "winapi-util",
@@ -2333,15 +2416,14 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d"
2333
2416
2334[[package]]
2417[[package]]
2335name = "which"
2418name = "which"
2336−version = "5.0.0"
2419+version = "4.4.1"
2337source = "registry+https://github.com/rust-lang/crates.io-index"
2420source = "registry+https://github.com/rust-lang/crates.io-index"
2338−checksum = "9bf3ea8596f3a0dd5980b46430f2058dfe2c36a27ccfbb1845d6fbfcd9ba6e14"
2421+checksum = "8ad25fe5717e59ada8ea33511bbbf7420b11031730a24c65e82428766c307006"
2339dependencies = [
2422dependencies = [
2423+ "dirs",
2340 "either",
2424 "either",
2341− "home",
2342 "once_cell",
2425 "once_cell",
2343 "rustix",
2426 "rustix",
2344− "windows-sys 0.48.0",
2345]
2427]
2346
2428
2347[[package]]
2429[[package]]
@@ -2384,25 +2466,6 @@ dependencies = [
2384 "windows-targets 0.48.0",
2466 "windows-targets 0.48.0",
2385]
2467]
2386
2468
2387−[[package]]
2388−name = "windows"
2389−version = "0.52.0"
2390−source = "registry+https://github.com/rust-lang/crates.io-index"
2391−checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
2392−dependencies = [
2393− "windows-core",
2394− "windows-targets 0.52.0",
2395−]
2396−
2397−[[package]]
2398−name = "windows-core"
2399−version = "0.52.0"
2400−source = "registry+https://github.com/rust-lang/crates.io-index"
2401−checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
2402−dependencies = [
2403− "windows-targets 0.52.0",
2404−]
2405−
2406[[package]]
2469[[package]]
2407name = "windows-sys"
2470name = "windows-sys"
2408version = "0.45.0"
2471version = "0.45.0"
@@ -2421,15 +2484,6 @@ dependencies = [
2421 "windows-targets 0.48.0",
2484 "windows-targets 0.48.0",
2422]
2485]
2423
2486
2424−[[package]]
2425−name = "windows-sys"
2426−version = "0.52.0"
2427−source = "registry+https://github.com/rust-lang/crates.io-index"
2428−checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
2429−dependencies = [
2430− "windows-targets 0.52.0",
2431−]
2432−
2433[[package]]
2487[[package]]
2434name = "windows-targets"
2488name = "windows-targets"
2435version = "0.42.2"
2489version = "0.42.2"
@@ -2460,21 +2514,6 @@ dependencies = [
2460 "windows_x86_64_msvc 0.48.0",
2514 "windows_x86_64_msvc 0.48.0",
2461]
2515]
2462
2516
2463−[[package]]
2464−name = "windows-targets"
2465−version = "0.52.0"
2466−source = "registry+https://github.com/rust-lang/crates.io-index"
2467−checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
2468−dependencies = [
2469− "windows_aarch64_gnullvm 0.52.0",
2470− "windows_aarch64_msvc 0.52.0",
2471− "windows_i686_gnu 0.52.0",
2472− "windows_i686_msvc 0.52.0",
2473− "windows_x86_64_gnu 0.52.0",
2474− "windows_x86_64_gnullvm 0.52.0",
2475− "windows_x86_64_msvc 0.52.0",
2476−]
2477−
2478[[package]]
2517[[package]]
2479name = "windows_aarch64_gnullvm"
2518name = "windows_aarch64_gnullvm"
2480version = "0.42.2"
2519version = "0.42.2"
@@ -2487,12 +2526,6 @@ version = "0.48.0"
2487source = "registry+https://github.com/rust-lang/crates.io-index"
2526source = "registry+https://github.com/rust-lang/crates.io-index"
2488checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
2527checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
2489
2528
2490−[[package]]
2491−name = "windows_aarch64_gnullvm"
2492−version = "0.52.0"
2493−source = "registry+https://github.com/rust-lang/crates.io-index"
2494−checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
2495−
2496[[package]]
2529[[package]]
2497name = "windows_aarch64_msvc"
2530name = "windows_aarch64_msvc"
2498version = "0.42.2"
2531version = "0.42.2"
@@ -2505,12 +2538,6 @@ version = "0.48.0"
2505source = "registry+https://github.com/rust-lang/crates.io-index"
2538source = "registry+https://github.com/rust-lang/crates.io-index"
2506checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
2539checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
2507
2540
2508−[[package]]
2509−name = "windows_aarch64_msvc"
2510−version = "0.52.0"
2511−source = "registry+https://github.com/rust-lang/crates.io-index"
2512−checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
2513−
2514[[package]]
2541[[package]]
2515name = "windows_i686_gnu"
2542name = "windows_i686_gnu"
2516version = "0.42.2"
2543version = "0.42.2"
@@ -2523,12 +2550,6 @@ version = "0.48.0"
2523source = "registry+https://github.com/rust-lang/crates.io-index"
2550source = "registry+https://github.com/rust-lang/crates.io-index"
2524checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
2551checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
2525
2552
2526−[[package]]
2527−name = "windows_i686_gnu"
2528−version = "0.52.0"
2529−source = "registry+https://github.com/rust-lang/crates.io-index"
2530−checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
2531−
2532[[package]]
2553[[package]]
2533name = "windows_i686_msvc"
2554name = "windows_i686_msvc"
2534version = "0.42.2"
2555version = "0.42.2"
@@ -2541,12 +2562,6 @@ version = "0.48.0"
2541source = "registry+https://github.com/rust-lang/crates.io-index"
2562source = "registry+https://github.com/rust-lang/crates.io-index"
2542checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
2563checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
2543
2564
2544−[[package]]
2545−name = "windows_i686_msvc"
2546−version = "0.52.0"
2547−source = "registry+https://github.com/rust-lang/crates.io-index"
2548−checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
2549−
2550[[package]]
2565[[package]]
2551name = "windows_x86_64_gnu"
2566name = "windows_x86_64_gnu"
2552version = "0.42.2"
2567version = "0.42.2"
@@ -2559,12 +2574,6 @@ version = "0.48.0"
2559source = "registry+https://github.com/rust-lang/crates.io-index"
2574source = "registry+https://github.com/rust-lang/crates.io-index"
2560checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
2575checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
2561
2576
2562−[[package]]
2563−name = "windows_x86_64_gnu"
2564−version = "0.52.0"
2565−source = "registry+https://github.com/rust-lang/crates.io-index"
2566−checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
2567−
2568[[package]]
2577[[package]]
2569name = "windows_x86_64_gnullvm"
2578name = "windows_x86_64_gnullvm"
2570version = "0.42.2"
2579version = "0.42.2"
@@ -2577,12 +2586,6 @@ version = "0.48.0"
2577source = "registry+https://github.com/rust-lang/crates.io-index"
2586source = "registry+https://github.com/rust-lang/crates.io-index"
2578checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
2587checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
2579
2588
2580−[[package]]
2581−name = "windows_x86_64_gnullvm"
2582−version = "0.52.0"
2583−source = "registry+https://github.com/rust-lang/crates.io-index"
2584−checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
2585−
2586[[package]]
2589[[package]]
2587name = "windows_x86_64_msvc"
2590name = "windows_x86_64_msvc"
2588version = "0.42.2"
2591version = "0.42.2"
@@ -2595,12 +2598,6 @@ version = "0.48.0"
2595source = "registry+https://github.com/rust-lang/crates.io-index"
2598source = "registry+https://github.com/rust-lang/crates.io-index"
2596checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
2599checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
2597
2600
2598−[[package]]
2599−name = "windows_x86_64_msvc"
2600−version = "0.52.0"
2601−source = "registry+https://github.com/rust-lang/crates.io-index"
2602−checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
2603−
2604[[package]]
2601[[package]]
2605name = "winnow"
2602name = "winnow"
2606version = "0.4.6"
2603version = "0.4.6"
@@ -2612,16 +2609,16 @@ dependencies = [
2612
2609
2613[[package]]
2610[[package]]
2614name = "winnow"
2611name = "winnow"
2615−version = "0.5.28"
2612+version = "0.5.17"
2616source = "registry+https://github.com/rust-lang/crates.io-index"
2613source = "registry+https://github.com/rust-lang/crates.io-index"
2617−checksum = "6c830786f7720c2fd27a1a0e27a709dbd3c4d009b56d098fc742d4f4eab91fe2"
2614+checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c"
2618dependencies = [
2615dependencies = [
2619 "memchr",
2616 "memchr",
2620]
2617]
2621
2618
2622[[package]]
2619[[package]]
2623name = "xtask"
2620name = "xtask"
2624−version = "23.10.0"
2621+version = "0.6.0"
2625dependencies = [
2622dependencies = [
2626 "helix-core",
2623 "helix-core",
2627 "helix-loader",
2624 "helix-loader",
@@ -2632,18 +2629,18 @@ dependencies = [
2632
2629
2633[[package]]
2630[[package]]
2634name = "zerocopy"
2631name = "zerocopy"
2635−version = "0.7.31"
2632+version = "0.7.20"
2636source = "registry+https://github.com/rust-lang/crates.io-index"
2633source = "registry+https://github.com/rust-lang/crates.io-index"
2637−checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d"
2634+checksum = "dd66a62464e3ffd4e37bd09950c2b9dd6c4f8767380fabba0d523f9a775bc85a"
2638dependencies = [
2635dependencies = [
2639 "zerocopy-derive",
2636 "zerocopy-derive",
2640]
2637]
2641
2638
2642[[package]]
2639[[package]]
2643name = "zerocopy-derive"
2640name = "zerocopy-derive"
2644−version = "0.7.31"
2641+version = "0.7.20"
2645source = "registry+https://github.com/rust-lang/crates.io-index"
2642source = "registry+https://github.com/rust-lang/crates.io-index"
2646−checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a"
2643+checksum = "255c4596d41e6916ced49cfafea18727b24d67878fa180ddfd69b9df34fd1726"
2647dependencies = [
2644dependencies = [
2648 "proc-macro2",
2645 "proc-macro2",
2649 "quote",
2646 "quote",
Cargo.toml−11
@@ -1,5 +1,4 @@
1[workspace]
1[workspace]
2−resolver = "2"
3members = [
2members = [
4 "helix-core",
3 "helix-core",
5 "helix-view",
4 "helix-view",
@@ -38,13 +37,3 @@ package.helix-term.opt-level = 2
38[workspace.dependencies]
37[workspace.dependencies]
39tree-sitter = { version = "0.20", git = "https://github.com/tree-sitter/tree-sitter", rev = "ab09ae20d640711174b8da8a654f6b3dec93da1a" }
38tree-sitter = { version = "0.20", git = "https://github.com/tree-sitter/tree-sitter", rev = "ab09ae20d640711174b8da8a654f6b3dec93da1a" }
40nucleo = "0.2.0"
39nucleo = "0.2.0"
41−
42−[workspace.package]
43−version = "23.10.0"
44−edition = "2021"
45−authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
46−categories = ["editor"]
47−repository = "https://github.com/helix-editor/helix"
48−homepage = "https://helix-editor.com"
49−license = "MPL-2.0"
50−rust-version = "1.70"
README.md+1−1
@@ -18,7 +18,7 @@
18
18
19![Screenshot](./screenshot.png)
19![Screenshot](./screenshot.png)
20
20
21−A [Kakoune](https://github.com/mawww/kakoune) / [Neovim](https://github.com/neovim/neovim) inspired editor, written in Rust.
21+A Kakoune / Neovim inspired editor, written in Rust.
22
22
23The editing model is very heavily based on Kakoune; during development I found
23The editing model is very heavily based on Kakoune; during development I found
24myself agreeing with most of Kakoune's design decisions.
24myself agreeing with most of Kakoune's design decisions.
VERSIONnew file+1
@@ -0,0 +1 @@
1+23.10
book/src/configuration.md+8−25
@@ -65,8 +65,6 @@ Its settings will be merged with the configuration directory `config.toml` and t
65| `workspace-lsp-roots` | Directories relative to the workspace root that are treated as LSP roots. Should only be set in `.helix/config.toml` | `[]` |
65| `workspace-lsp-roots` | Directories relative to the workspace root that are treated as LSP roots. Should only be set in `.helix/config.toml` | `[]` |
66| `default-line-ending` | The line ending to use for new documents. Can be `native`, `lf`, `crlf`, `ff`, `cr` or `nel`. `native` uses the platform's native line ending (`crlf` on Windows, otherwise `lf`). | `native` |
66| `default-line-ending` | The line ending to use for new documents. Can be `native`, `lf`, `crlf`, `ff`, `cr` or `nel`. `native` uses the platform's native line ending (`crlf` on Windows, otherwise `lf`). | `native` |
67| `insert-final-newline` | Whether to automatically insert a trailing line-ending on write if missing | `true` |
67| `insert-final-newline` | Whether to automatically insert a trailing line-ending on write if missing | `true` |
68−| `popup-border` | Draw border around `popup`, `menu`, `all`, or `none` | `none` |
69−| `indent-heuristic` | How the indentation for a newly inserted line is computed: `simple` just copies the indentation level from the previous line, `tree-sitter` computes the indentation based on the syntax tree and `hybrid` combines both approaches. If the chosen heuristic is not available, a different one will be used as a fallback (the fallback order being `hybrid` -> `tree-sitter` -> `simple`). | `hybrid`
70
68
71### `[editor.statusline]` Section
69### `[editor.statusline]` Section
72
70
@@ -168,31 +166,16 @@ All git related options are only enabled in a git repository.
168
166
169| Key | Description | Default |
167| Key | Description | Default |
170|--|--|---------|
168|--|--|---------|
171−|`hidden` | Enables ignoring hidden files | `true`
169+|`hidden` | Enables ignoring hidden files | true
172−|`follow-symlinks` | Follow symlinks instead of ignoring them | `true`
170+|`follow-symlinks` | Follow symlinks instead of ignoring them | true
173−|`deduplicate-links` | Ignore symlinks that point at files already shown in the picker | `true`
171+|`deduplicate-links` | Ignore symlinks that point at files already shown in the picker | true
174−|`parents` | Enables reading ignore files from parent directories | `true`
172+|`parents` | Enables reading ignore files from parent directories | true
175−|`ignore` | Enables reading `.ignore` files | `true`
173+|`ignore` | Enables reading `.ignore` files | true
176−|`git-ignore` | Enables reading `.gitignore` files | `true`
174+|`git-ignore` | Enables reading `.gitignore` files | true
177−|`git-global` | Enables reading global `.gitignore`, whose path is specified in git's config: `core.excludesfile` option | `true`
175+|`git-global` | Enables reading global `.gitignore`, whose path is specified in git's config: `core.excludefile` option | true
178−|`git-exclude` | Enables reading `.git/info/exclude` files | `true`
176+|`git-exclude` | Enables reading `.git/info/exclude` files | true
179|`max-depth` | Set with an integer value for maximum depth to recurse | Defaults to `None`.
177|`max-depth` | Set with an integer value for maximum depth to recurse | Defaults to `None`.
180
178
181−Ignore files can be placed locally as `.ignore` or put in your home directory as `~/.ignore`. They support the usual ignore and negative ignore (unignore) rules used in `.gitignore` files.
182−
183−Additionally, you can use Helix-specific ignore files by creating a local `.helix/ignore` file in the current workspace or a global `ignore` file located in your Helix config directory:
184−- Linux and Mac: `~/.config/helix/ignore`
185−- Windows: `%AppData%\helix\ignore`
186−
187−Example:
188−
189−```ini
190−# unignore in file picker and global search
191−!.github/
192−!.gitignore
193−!.gitattributes
194−```
195−
196### `[editor.auto-pairs]` Section
179### `[editor.auto-pairs]` Section
197
180
198Enables automatic insertion of pairs to parentheses, brackets, etc. Can be a
181Enables automatic insertion of pairs to parentheses, brackets, etc. Can be a
book/src/generated/lang-support.md+2−8
@@ -1,6 +1,5 @@
1| Language | Syntax Highlighting | Treesitter Textobjects | Auto Indent | Default LSP |
1| Language | Syntax Highlighting | Treesitter Textobjects | Auto Indent | Default LSP |
2| --- | --- | --- | --- | --- |
2| --- | --- | --- | --- | --- |
3−| agda | ✓ | | | |
4| astro | ✓ | | | |
3| astro | ✓ | | | |
5| awk | ✓ | ✓ | | `awk-language-server` |
4| awk | ✓ | ✓ | | `awk-language-server` |
6| bash | ✓ | ✓ | ✓ | `bash-language-server` |
5| bash | ✓ | ✓ | ✓ | `bash-language-server` |
@@ -11,7 +10,7 @@
11| blueprint | ✓ | | | `blueprint-compiler` |
10| blueprint | ✓ | | | `blueprint-compiler` |
12| c | ✓ | ✓ | ✓ | `clangd` |
11| c | ✓ | ✓ | ✓ | `clangd` |
13| c-sharp | ✓ | ✓ | | `OmniSharp` |
12| c-sharp | ✓ | ✓ | | `OmniSharp` |
14−| cabal | | | | `haskell-language-server-wrapper` |
13+| cabal | | | | |
15| cairo | ✓ | ✓ | ✓ | `cairo-language-server` |
14| cairo | ✓ | ✓ | ✓ | `cairo-language-server` |
16| capnp | ✓ | | ✓ | |
15| capnp | ✓ | | ✓ | |
17| clojure | ✓ | | | `clojure-lsp` |
16| clojure | ✓ | | | `clojure-lsp` |
@@ -25,7 +24,6 @@
25| cue | ✓ | | | `cuelsp` |
24| cue | ✓ | | | `cuelsp` |
26| d | ✓ | ✓ | ✓ | `serve-d` |
25| d | ✓ | ✓ | ✓ | `serve-d` |
27| dart | ✓ | | ✓ | `dart` |
26| dart | ✓ | | ✓ | `dart` |
28−| dbml | ✓ | | | |
29| devicetree | ✓ | | | |
27| devicetree | ✓ | | | |
30| dhall | ✓ | ✓ | | `dhall-lsp-server` |
28| dhall | ✓ | ✓ | | `dhall-lsp-server` |
31| diff | ✓ | | | |
29| diff | ✓ | | | |
@@ -56,7 +54,6 @@
56| git-rebase | ✓ | | | |
54| git-rebase | ✓ | | | |
57| gleam | ✓ | ✓ | | `gleam` |
55| gleam | ✓ | ✓ | | `gleam` |
58| glsl | ✓ | ✓ | ✓ | |
56| glsl | ✓ | ✓ | ✓ | |
59−| gn | ✓ | | | |
60| go | ✓ | ✓ | ✓ | `gopls`, `golangci-lint-langserver` |
57| go | ✓ | ✓ | ✓ | `gopls`, `golangci-lint-langserver` |
61| godot-resource | ✓ | | | |
58| godot-resource | ✓ | | | |
62| gomod | ✓ | | | `gopls` |
59| gomod | ✓ | | | `gopls` |
@@ -74,7 +71,6 @@
74| idris | | | | `idris2-lsp` |
71| idris | | | | `idris2-lsp` |
75| iex | ✓ | | | |
72| iex | ✓ | | | |
76| ini | ✓ | | | |
73| ini | ✓ | | | |
77−| janet | ✓ | | | |
78| java | ✓ | ✓ | ✓ | `jdtls` |
74| java | ✓ | ✓ | ✓ | `jdtls` |
79| javascript | ✓ | ✓ | ✓ | `typescript-language-server` |
75| javascript | ✓ | ✓ | ✓ | `typescript-language-server` |
80| jinja | ✓ | | | |
76| jinja | ✓ | | | |
@@ -93,7 +89,6 @@
93| llvm | ✓ | ✓ | ✓ | |
89| llvm | ✓ | ✓ | ✓ | |
94| llvm-mir | ✓ | ✓ | ✓ | |
90| llvm-mir | ✓ | ✓ | ✓ | |
95| llvm-mir-yaml | ✓ | | ✓ | |
91| llvm-mir-yaml | ✓ | | ✓ | |
96−| log | ✓ | | | |
97| lpf | ✓ | | | |
92| lpf | ✓ | | | |
98| lua | ✓ | ✓ | ✓ | `lua-language-server` |
93| lua | ✓ | ✓ | ✓ | `lua-language-server` |
99| make | ✓ | | | |
94| make | ✓ | | | |
@@ -109,7 +104,7 @@
109| nickel | ✓ | | ✓ | `nls` |
104| nickel | ✓ | | ✓ | `nls` |
110| nim | ✓ | ✓ | ✓ | `nimlangserver` |
105| nim | ✓ | ✓ | ✓ | `nimlangserver` |
111| nix | ✓ | | | `nil` |
106| nix | ✓ | | | `nil` |
112−| nu | ✓ | | | `nu` |
107+| nu | ✓ | | | |
113| nunjucks | ✓ | | | |
108| nunjucks | ✓ | | | |
114| ocaml | ✓ | | ✓ | `ocamllsp` |
109| ocaml | ✓ | | ✓ | `ocamllsp` |
115| ocaml-interface | ✓ | | | `ocamllsp` |
110| ocaml-interface | ✓ | | | `ocamllsp` |
@@ -148,7 +143,6 @@
148| scheme | ✓ | | ✓ | |
143| scheme | ✓ | | ✓ | |
149| scss | ✓ | | | `vscode-css-language-server` |
144| scss | ✓ | | | `vscode-css-language-server` |
150| slint | ✓ | | ✓ | `slint-lsp` |
145| slint | ✓ | | ✓ | `slint-lsp` |
151−| smali | ✓ | | ✓ | |
152| smithy | ✓ | | | `cs` |
146| smithy | ✓ | | | `cs` |
153| sml | ✓ | | | |
147| sml | ✓ | | | |
154| solidity | ✓ | | | `solc` |
148| solidity | ✓ | | | `solc` |
book/src/generated/typable-cmd.md+1−1
@@ -17,7 +17,7 @@
17| `:write-buffer-close!`, `:wbc!` | Force write changes to disk creating necessary subdirectories and closes the buffer. Accepts an optional path (:write-buffer-close! some/path.txt) |
17| `:write-buffer-close!`, `:wbc!` | Force write changes to disk creating necessary subdirectories and closes the buffer. Accepts an optional path (:write-buffer-close! some/path.txt) |
18| `:new`, `:n` | Create a new scratch buffer. |
18| `:new`, `:n` | Create a new scratch buffer. |
19| `:format`, `:fmt` | Format the file using the LSP formatter. |
19| `:format`, `:fmt` | Format the file using the LSP formatter. |
20−| `:indent-style` | Set the indentation style for editing. ('t' for tabs or 1-16 for number of spaces.) |
20+| `:indent-style` | Set the indentation style for editing. ('t' for tabs or 1-8 for number of spaces.) |
21| `:line-ending` | Set the document's default line ending. Options: crlf, lf. |
21| `:line-ending` | Set the document's default line ending. Options: crlf, lf. |
22| `:earlier`, `:ear` | Jump back to an earlier point in edit history. Accepts a number of steps or a time span. |
22| `:earlier`, `:ear` | Jump back to an earlier point in edit history. Accepts a number of steps or a time span. |
23| `:later`, `:lat` | Jump to a later point in edit history. Accepts a number of steps or a time span. |
23| `:later`, `:lat` | Jump to a later point in edit history. Accepts a number of steps or a time span. |
book/src/guides/adding_languages.md−2
@@ -36,7 +36,6 @@ below.
363. Refer to the
363. Refer to the
37 [tree-sitter website](https://tree-sitter.github.io/tree-sitter/syntax-highlighting#queries)
37 [tree-sitter website](https://tree-sitter.github.io/tree-sitter/syntax-highlighting#queries)
38 for more information on writing queries.
38 for more information on writing queries.
39−4. A list of highlight captures can be found [on the themes page](https://docs.helix-editor.com/themes.html#scopes).
40
39
41> 💡 In Helix, the first matching query takes precedence when evaluating
40> 💡 In Helix, the first matching query takes precedence when evaluating
42> queries, which is different from other editors such as Neovim where the last
41> queries, which is different from other editors such as Neovim where the last
@@ -52,4 +51,3 @@ below.
52 grammars.
51 grammars.
53- If a parser is causing a segfault, or you want to remove it, make sure to
52- If a parser is causing a segfault, or you want to remove it, make sure to
54 remove the compiled parser located at `runtime/grammars/<name>.so`.
53 remove the compiled parser located at `runtime/grammars/<name>.so`.
55−- If you are attempting to add queries and Helix is unable to locate them, ensure that the environment variable `HELIX_RUNTIME` is set to the location of the `runtime` folder you're developing in.
book/src/guides/indent.md−9
@@ -12,15 +12,6 @@ Note that it matters where these added indents begin. For example,
12multiple indent level increases that start on the same line only increase
12multiple indent level increases that start on the same line only increase
13the total indent level by 1. See [Capture types](#capture-types).
13the total indent level by 1. See [Capture types](#capture-types).
14
14
15−By default, Helix uses the `hybrid` indentation heuristic. This means that
16−indent queries are not used to compute the expected absolute indentation of a
17−line but rather the expected difference in indentation between the new and an
18−already existing line. This difference is then added to the actual indentation
19−of the already existing line. Since this makes errors in the indent queries
20−harder to find, it is recommended to disable it when testing via
21−`:set indent-heuristic tree-sitter`. The rest of this guide assumes that
22−the `tree-sitter` heuristic is used.
23−
24## Indent queries
15## Indent queries
25
16
26When Helix is inserting a new line through `o`, `O`, or `<ret>`, to determine
17When Helix is inserting a new line through `o`, `O`, or `<ret>`, to determine
book/src/install.md+3
@@ -65,7 +65,10 @@ sudo apt install helix
65
65
66### Fedora/RHEL
66### Fedora/RHEL
67
67
68+Enable the `COPR` repository for Helix:
69+
68```sh
70```sh
71+sudo dnf copr enable varlad/helix
69sudo dnf install helix
72sudo dnf install helix
70```
73```
71
74
book/src/keymap.md+1−1
@@ -25,7 +25,7 @@
25
25
26## Normal mode
26## Normal mode
27
27
28−Normal mode is the default mode when you launch helix. You can return to it from other modes by pressing the `Escape` key.
28+Normal mode is the default mode when you launch helix. Return to it from other modes by typing `Escape`.
29
29
30### Movement
30### Movement
31
31
book/src/languages.md−2
@@ -66,10 +66,8 @@ These configuration keys are available:
66| `language-servers` | The Language Servers used for this language. See below for more information in the section [Configuring Language Servers for a language](#configuring-language-servers-for-a-language) |
66| `language-servers` | The Language Servers used for this language. See below for more information in the section [Configuring Language Servers for a language](#configuring-language-servers-for-a-language) |
67| `grammar` | The tree-sitter grammar to use (defaults to the value of `name`) |
67| `grammar` | The tree-sitter grammar to use (defaults to the value of `name`) |
68| `formatter` | The formatter for the language, it will take precedence over the lsp when defined. The formatter must be able to take the original file as input from stdin and write the formatted file to stdout |
68| `formatter` | The formatter for the language, it will take precedence over the lsp when defined. The formatter must be able to take the original file as input from stdin and write the formatted file to stdout |
69−| `soft-wrap` | [editor.softwrap](./configuration.md#editorsoft-wrap-section)
70| `text-width` | Maximum line length. Used for the `:reflow` command and soft-wrapping if `soft-wrap.wrap-at-text-width` is set, defaults to `editor.text-width` |
69| `text-width` | Maximum line length. Used for the `:reflow` command and soft-wrapping if `soft-wrap.wrap-at-text-width` is set, defaults to `editor.text-width` |
71| `workspace-lsp-roots` | Directories relative to the workspace root that are treated as LSP roots. Should only be set in `.helix/config.toml`. Overwrites the setting of the same name in `config.toml` if set. |
70| `workspace-lsp-roots` | Directories relative to the workspace root that are treated as LSP roots. Should only be set in `.helix/config.toml`. Overwrites the setting of the same name in `config.toml` if set. |
72−| `persistent-diagnostic-sources` | An array of LSP diagnostic sources assumed unchanged when the language server resends the same set of diagnostics. Helix can track the position for these diagnostics internally instead. Useful for diagnostics that are recomputed on save.
73
71
74### File-type detection and the `file-types` key
72### File-type detection and the `file-types` key
75
73
book/src/themes.md+1−4
@@ -296,14 +296,11 @@ These scopes are used for theming the editor interface:
296| `ui.statusline.insert` | Statusline mode during insert mode ([only if `editor.color-modes` is enabled][editor-section]) |
296| `ui.statusline.insert` | Statusline mode during insert mode ([only if `editor.color-modes` is enabled][editor-section]) |
297| `ui.statusline.select` | Statusline mode during select mode ([only if `editor.color-modes` is enabled][editor-section]) |
297| `ui.statusline.select` | Statusline mode during select mode ([only if `editor.color-modes` is enabled][editor-section]) |
298| `ui.statusline.separator` | Separator character in statusline |
298| `ui.statusline.separator` | Separator character in statusline |
299−| `ui.bufferline` | Style for the buffer line |
300−| `ui.bufferline.active` | Style for the active buffer in buffer line |
301−| `ui.bufferline.background` | Style for bufferline background |
302| `ui.popup` | Documentation popups (e.g. Space + k) |
299| `ui.popup` | Documentation popups (e.g. Space + k) |
303| `ui.popup.info` | Prompt for multiple key options |
300| `ui.popup.info` | Prompt for multiple key options |
304| `ui.window` | Borderlines separating splits |
301| `ui.window` | Borderlines separating splits |
305| `ui.help` | Description box for commands |
302| `ui.help` | Description box for commands |
306−| `ui.text` | Default text style, command prompts, popup text, etc. |
303+| `ui.text` | Command prompts, popup text, etc. |
307| `ui.text.focus` | The currently selected line in the picker |
304| `ui.text.focus` | The currently selected line in the picker |
308| `ui.text.inactive` | Same as `ui.text` but when the text is inactive (e.g. suggestions) |
305| `ui.text.inactive` | Same as `ui.text` but when the text is inactive (e.g. suggestions) |
309| `ui.text.info` | The key: command text in `ui.popup.info` boxes |
306| `ui.text.info` | The key: command text in `ui.popup.info` boxes |
docs/releases.md+5−12
@@ -1,23 +1,16 @@
1## Checklist
1## Checklist
2
2
3Helix releases are versioned in the Calendar Versioning scheme:
3Helix releases are versioned in the Calendar Versioning scheme:
4−`YY.0M(.MICRO)`, for example, `22.05` for May of 2022, or in a patch release,
4+`YY.0M(.MICRO)`, for example, `22.05` for May of 2022. In these instructions
5−`22.05.1`. In these instructions we'll use `<tag>` as a placeholder for the tag
5+we'll use `<tag>` as a placeholder for the tag being published.
6−being published.
7
6
8* Merge the changelog PR
7* Merge the changelog PR
9* Add new `<release>` entry in `contrib/Helix.appdata.xml` with release information according to the [AppStream spec](https://www.freedesktop.org/software/appstream/docs/sect-Metadata-Releases.html)
8* Add new `<release>` entry in `contrib/Helix.appdata.xml` with release information according to the [AppStream spec](https://www.freedesktop.org/software/appstream/docs/sect-Metadata-Releases.html)
10* Tag and push
9* Tag and push
11 * `git tag -s -m "<tag>" -a <tag> && git push`
10 * `git tag -s -m "<tag>" -a <tag> && git push`
12 * Make sure to switch to master and pull first
11 * Make sure to switch to master and pull first
13−* Edit the `Cargo.toml` file and change the date in the `version` field to the next planned release
12+* Edit the `VERSION` file and change the date to the next planned release
14− * Due to Cargo having a strict requirement on SemVer with 3 or more version
15− numbers, a `0` is required in the micro version; however, unless we are
16− publishing a patch release after a major release, the `.0` is dropped in
17− the user facing version.
18− * Releases are planned to happen every two months, so `22.05.0` would change to `22.07.0`
13+ * Releases are planned to happen every two months, so `22.05` would change to `22.07`
19− * If we are pushing a patch/bugfix release in the same month as the previous
20− release, bump the micro version, e.g. `22.07.0` to `22.07.1`
21* Wait for the Release CI to finish
14* Wait for the Release CI to finish
22 * It will automatically turn the git tag into a GitHub release when it uploads artifacts
15 * It will automatically turn the git tag into a GitHub release when it uploads artifacts
23* Edit the new release
16* Edit the new release
@@ -64,4 +57,4 @@ versions for convenience:
64> release. For the full log, check out the git log.
57> release. For the full log, check out the git log.
65
58
66Typically, small changes like dependencies or documentation updates, refactors,
59Typically, small changes like dependencies or documentation updates, refactors,
67−or meta changes like GitHub Actions work are left out.
60+or meta changes like GitHub Actions work are left out.
flake.lock+35−12
@@ -2,16 +2,23 @@
2 "nodes": {
2 "nodes": {
3 "crane": {
3 "crane": {
4 "inputs": {
4 "inputs": {
5+ "flake-compat": "flake-compat",
6+ "flake-utils": [
7+ "flake-utils"
8+ ],
5 "nixpkgs": [
9 "nixpkgs": [
6 "nixpkgs"
10 "nixpkgs"
11+ ],
12+ "rust-overlay": [
13+ "rust-overlay"
7 ]
14 ]
8 },
15 },
9 "locked": {
16 "locked": {
10− "lastModified": 1701025348,
17+ "lastModified": 1688772518,
11− "narHash": "sha256-42GHmYH+GF7VjwGSt+fVT1CQuNpGanJbNgVHTAZppUM=",
18+ "narHash": "sha256-ol7gZxwvgLnxNSZwFTDJJ49xVY5teaSvF7lzlo3YQfM=",
12 "owner": "ipetkov",
19 "owner": "ipetkov",
13 "repo": "crane",
20 "repo": "crane",
14− "rev": "42afaeb1a0325194a7cdb526332d2cb92fddd07b",
21+ "rev": "8b08e96c9af8c6e3a2b69af5a7fa168750fcf88e",
15 "type": "github"
22 "type": "github"
16 },
23 },
17 "original": {
24 "original": {
@@ -20,16 +27,32 @@
20 "type": "github"
27 "type": "github"
21 }
28 }
22 },
29 },
30+ "flake-compat": {
31+ "flake": false,
32+ "locked": {
33+ "lastModified": 1673956053,
34+ "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
35+ "owner": "edolstra",
36+ "repo": "flake-compat",
37+ "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
38+ "type": "github"
39+ },
40+ "original": {
41+ "owner": "edolstra",
42+ "repo": "flake-compat",
43+ "type": "github"
44+ }
45+ },
23 "flake-utils": {
46 "flake-utils": {
24 "inputs": {
47 "inputs": {
25 "systems": "systems"
48 "systems": "systems"
26 },
49 },
27 "locked": {
50 "locked": {
28− "lastModified": 1694529238,
51+ "lastModified": 1689068808,
29− "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
52+ "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=",
30 "owner": "numtide",
53 "owner": "numtide",
31 "repo": "flake-utils",
54 "repo": "flake-utils",
32− "rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
55+ "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4",
33 "type": "github"
56 "type": "github"
34 },
57 },
35 "original": {
58 "original": {
@@ -40,11 +63,11 @@
40 },
63 },
41 "nixpkgs": {
64 "nixpkgs": {
42 "locked": {
65 "locked": {
43− "lastModified": 1700794826,
66+ "lastModified": 1690272529,
44− "narHash": "sha256-RyJTnTNKhO0yqRpDISk03I/4A67/dp96YRxc86YOPgU=",
67+ "narHash": "sha256-MakzcKXEdv/I4qJUtq/k/eG+rVmyOZLnYNC2w1mB59Y=",
45 "owner": "nixos",
68 "owner": "nixos",
46 "repo": "nixpkgs",
69 "repo": "nixpkgs",
47− "rev": "5a09cb4b393d58f9ed0d9ca1555016a8543c2ac8",
70+ "rev": "ef99fa5c5ed624460217c31ac4271cfb5cb2502c",
48 "type": "github"
71 "type": "github"
49 },
72 },
50 "original": {
73 "original": {
@@ -72,11 +95,11 @@
72 ]
95 ]
73 },
96 },
74 "locked": {
97 "locked": {
75− "lastModified": 1701137803,
98+ "lastModified": 1690424156,
76− "narHash": "sha256-0LcPAdql5IhQSUXJx3Zna0dYTgdIoYO7zUrsKgiBd04=",
99+ "narHash": "sha256-Bpml+L280tHTQpwpC5/BJbU4HSvEzMvW8IZ4gAXimhE=",
77 "owner": "oxalica",
100 "owner": "oxalica",
78 "repo": "rust-overlay",
101 "repo": "rust-overlay",
79− "rev": "9dd940c967502f844eacea52a61e9596268d4f70",
102+ "rev": "f335a0213504c7e6481c359dc1009be9cf34432c",
80 "type": "github"
103 "type": "github"
81 },
104 },
82 "original": {
105 "original": {
flake.nix+14−12
@@ -13,6 +13,8 @@
13 };
13 };
14 crane = {
14 crane = {
15 url = "github:ipetkov/crane";
15 url = "github:ipetkov/crane";
16+ inputs.rust-overlay.follows = "rust-overlay";
17+ inputs.flake-utils.follows = "flake-utils";
16 inputs.nixpkgs.follows = "nixpkgs";
18 inputs.nixpkgs.follows = "nixpkgs";
17 };
19 };
18 };
20 };
@@ -121,18 +123,18 @@
121 rustToolchain = pkgs.pkgsBuildHost.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
123 rustToolchain = pkgs.pkgsBuildHost.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
122 craneLibMSRV = (crane.mkLib pkgs).overrideToolchain rustToolchain;
124 craneLibMSRV = (crane.mkLib pkgs).overrideToolchain rustToolchain;
123 craneLibStable = (crane.mkLib pkgs).overrideToolchain pkgs.pkgsBuildHost.rust-bin.stable.latest.default;
125 craneLibStable = (crane.mkLib pkgs).overrideToolchain pkgs.pkgsBuildHost.rust-bin.stable.latest.default;
124− commonArgs = {
126+ commonArgs =
125− inherit stdenv;
127+ {
126− inherit (craneLibMSRV.crateNameFromCargoToml {cargoToml = ./helix-term/Cargo.toml;}) pname;
128+ inherit stdenv;
127− inherit (craneLibMSRV.crateNameFromCargoToml {cargoToml = ./Cargo.toml;}) version;
128− src = filteredSource;
129+ src = filteredSource;
129− # disable fetching and building of tree-sitter grammars in the helix-term build.rs
130+ # disable fetching and building of tree-sitter grammars in the helix-term build.rs
130− HELIX_DISABLE_AUTO_GRAMMAR_BUILD = "1";
131+ HELIX_DISABLE_AUTO_GRAMMAR_BUILD = "1";
131− buildInputs = [stdenv.cc.cc.lib];
132+ buildInputs = [stdenv.cc.cc.lib];
132− # disable tests
133+ # disable tests
133− doCheck = false;
134+ doCheck = false;
134− meta.mainProgram = "hx";
135+ meta.mainProgram = "hx";
135− };
136+ }
137+ // craneLibMSRV.crateNameFromCargoToml {cargoToml = ./helix-term/Cargo.toml;};
136 cargoArtifacts = craneLibMSRV.buildDepsOnly commonArgs;
138 cargoArtifacts = craneLibMSRV.buildDepsOnly commonArgs;
137 in {
139 in {
138 packages = {
140 packages = {
grammars.nix+21−24
@@ -5,7 +5,6 @@
5 runCommand,
5 runCommand,
6 yj,
6 yj,
7 includeGrammarIf ? _: true,
7 includeGrammarIf ? _: true,
8− grammarOverlays ? [],
9 ...
8 ...
10}: let
9}: let
11 # HACK: nix < 2.6 has a bug in the toml parser, so we convert to JSON
10 # HACK: nix < 2.6 has a bug in the toml parser, so we convert to JSON
@@ -49,22 +48,22 @@
49 then sourceGitHub
48 then sourceGitHub
50 else sourceGit;
49 else sourceGit;
51 in
50 in
52− stdenv.mkDerivation {
51+ stdenv.mkDerivation rec {
53 # see https://github.com/NixOS/nixpkgs/blob/fbdd1a7c0bc29af5325e0d7dd70e804a972eb465/pkgs/development/tools/parsing/tree-sitter/grammar.nix
52 # see https://github.com/NixOS/nixpkgs/blob/fbdd1a7c0bc29af5325e0d7dd70e804a972eb465/pkgs/development/tools/parsing/tree-sitter/grammar.nix
54
53
55 pname = "helix-tree-sitter-${grammar.name}";
54 pname = "helix-tree-sitter-${grammar.name}";
56 version = grammar.source.rev;
55 version = grammar.source.rev;
57
56
58− src = source;
57+ src =
59− sourceRoot = if builtins.hasAttr "subpath" grammar.source then
58+ if builtins.hasAttr "subpath" grammar.source
60− "source/${grammar.source.subpath}"
59+ then "${source}/${grammar.source.subpath}"
61− else
62− "source";
60+ else source;
63
61
62+ dontUnpack = true;
64 dontConfigure = true;
63 dontConfigure = true;
65
64
66 FLAGS = [
65 FLAGS = [
67− "-Isrc"
66+ "-I${src}/src"
68 "-g"
67 "-g"
69 "-O3"
68 "-O3"
70 "-fPIC"
69 "-fPIC"
@@ -77,13 +76,13 @@
77 buildPhase = ''
76 buildPhase = ''
78 runHook preBuild
77 runHook preBuild
79
78
80− if [[ -e src/scanner.cc ]]; then
79+ if [[ -e "$src/src/scanner.cc" ]]; then
81− $CXX -c src/scanner.cc -o scanner.o $FLAGS
80+ $CXX -c "$src/src/scanner.cc" -o scanner.o $FLAGS
82− elif [[ -e src/scanner.c ]]; then
81+ elif [[ -e "$src/src/scanner.c" ]]; then
83− $CC -c src/scanner.c -o scanner.o $FLAGS
82+ $CC -c "$src/src/scanner.c" -o scanner.o $FLAGS
84 fi
83 fi
85
84
86− $CC -c src/parser.c -o parser.o $FLAGS
85+ $CC -c "$src/src/parser.c" -o parser.o $FLAGS
87 $CXX -shared -o $NAME.so *.o
86 $CXX -shared -o $NAME.so *.o
88
87
89 ls -al
88 ls -al
@@ -106,17 +105,15 @@
106 '';
105 '';
107 };
106 };
108 grammarsToBuild = builtins.filter includeGrammarIf gitGrammars;
107 grammarsToBuild = builtins.filter includeGrammarIf gitGrammars;
108+ builtGrammars =
109− builtGrammars = builtins.map (grammar: {
109+ builtins.map (grammar: {
110− inherit (grammar) name;
110+ inherit (grammar) name;
111− value = buildGrammar grammar;
111+ artifact = buildGrammar grammar;
112+ })
112− }) grammarsToBuild;
113+ grammarsToBuild;
113− extensibleGrammars =
114− lib.makeExtensible (self: builtins.listToAttrs builtGrammars);
115− overlayedGrammars = lib.pipe extensibleGrammars
116− (builtins.map (overlay: grammar: grammar.extend overlay) grammarOverlays);
117− grammarLinks = lib.mapAttrsToList
114+ grammarLinks =
118− (name: artifact: "ln -s ${artifact}/${name}.so $out/${name}.so")
115+ builtins.map (grammar: "ln -s ${grammar.artifact}/${grammar.name}.so $out/${grammar.name}.so")
119− (lib.filterAttrs (n: v: lib.isDerivation v) overlayedGrammars);
116+ builtGrammars;
120in
117in
121 runCommand "consolidated-helix-grammars" {} ''
118 runCommand "consolidated-helix-grammars" {} ''
122 mkdir -p $out
119 mkdir -p $out
helix-core/Cargo.toml+10−11
@@ -1,22 +1,21 @@
1[package]
1[package]
2name = "helix-core"
2name = "helix-core"
3+version = "0.6.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+edition = "2021"
6+license = "MPL-2.0"
3description = "Helix editor core editing primitives"
7description = "Helix editor core editing primitives"
8+categories = ["editor"]
9+repository = "https://github.com/helix-editor/helix"
10+homepage = "https://helix-editor.com"
4include = ["src/**/*", "README.md"]
11include = ["src/**/*", "README.md"]
5−version.workspace = true
6−authors.workspace = true
7−edition.workspace = true
8−license.workspace = true
9−rust-version.workspace = true
10−categories.workspace = true
11−repository.workspace = true
12−homepage.workspace = true
13
12
14[features]
13[features]
15unicode-lines = ["ropey/unicode_lines"]
14unicode-lines = ["ropey/unicode_lines"]
16integration = []
15integration = []
17
16
18[dependencies]
17[dependencies]
19−helix-loader = { path = "../helix-loader" }
18+helix-loader = { version = "0.6", path = "../helix-loader" }
20
19
21ropey = { version = "1.6.1", default-features = false, features = ["simd"] }
20ropey = { version = "1.6.1", default-features = false, features = ["simd"] }
22smallvec = "1.11"
21smallvec = "1.11"
@@ -27,12 +26,12 @@ unicode-general-category = "0.6"
27# slab = "0.4.2"
26# slab = "0.4.2"
28slotmap = "1.0"
27slotmap = "1.0"
29tree-sitter.workspace = true
28tree-sitter.workspace = true
30−once_cell = "1.19"
29+once_cell = "1.18"
31arc-swap = "1"
30arc-swap = "1"
32regex = "1"
31regex = "1"
33bitflags = "2.4"
32bitflags = "2.4"
34ahash = "0.8.6"
33ahash = "0.8.6"
35−hashbrown = { version = "0.14.3", features = ["raw"] }
34+hashbrown = { version = "0.14.2", features = ["raw"] }
36dunce = "1.0"
35dunce = "1.0"
37
36
38log = "0.4"
37log = "0.4"
helix-core/src/diagnostic.rs−4
@@ -39,10 +39,6 @@ pub enum DiagnosticTag {
39#[derive(Debug, Clone)]
39#[derive(Debug, Clone)]
40pub struct Diagnostic {
40pub struct Diagnostic {
41 pub range: Range,
41 pub range: Range,
42− // whether this diagnostic ends at the end of(or inside) a word
43− pub ends_at_word: bool,
44− pub starts_at_word: bool,
45− pub zero_width: bool,
46 pub line: usize,
42 pub line: usize,
47 pub message: String,
43 pub message: String,
48 pub severity: Option<Severity>,
44 pub severity: Option<Severity>,
helix-core/src/indent.rs+101−310
@@ -4,11 +4,10 @@ use tree_sitter::{Query, QueryCursor, QueryPredicateArg};
4
4
5use crate::{
5use crate::{
6 chars::{char_is_line_ending, char_is_whitespace},
6 chars::{char_is_line_ending, char_is_whitespace},
7− find_first_non_whitespace_char,
8 graphemes::{grapheme_width, tab_width_at},
7 graphemes::{grapheme_width, tab_width_at},
9− syntax::{IndentationHeuristic, LanguageConfiguration, RopeProvider, Syntax},
8+ syntax::{LanguageConfiguration, RopeProvider, Syntax},
10 tree_sitter::Node,
9 tree_sitter::Node,
11− Position, Rope, RopeGraphemes, RopeSlice,
10+ Rope, RopeGraphemes, RopeSlice,
12};
11};
13
12
14/// Enum representing indentation style.
13/// Enum representing indentation style.
@@ -22,7 +21,7 @@ pub enum IndentStyle {
22
21
23// 16 spaces
22// 16 spaces
24const INDENTS: &str = " ";
23const INDENTS: &str = " ";
25−pub const MAX_INDENT: u8 = 16;
24+const MAX_INDENT: u8 = 16;
26
25
27impl IndentStyle {
26impl IndentStyle {
28 /// Creates an `IndentStyle` from an indentation string.
27 /// Creates an `IndentStyle` from an indentation string.
@@ -197,56 +196,6 @@ pub fn indent_level_for_line(line: RopeSlice, tab_width: usize, indent_width: us
197 len / indent_width
196 len / indent_width
198}
197}
199
198
200−/// Create a string of tabs & spaces that has the same visual width as the given RopeSlice (independent of the tab width).
201−fn whitespace_with_same_width(text: RopeSlice) -> String {
202− let mut s = String::new();
203− for grapheme in RopeGraphemes::new(text) {
204− if grapheme == "\t" {
205− s.push('\t');
206− } else {
207− s.extend(std::iter::repeat(' ').take(grapheme_width(&Cow::from(grapheme))));
208− }
209− }
210− s
211−}
212−
213−fn add_indent_level(
214− mut base_indent: String,
215− added_indent_level: isize,
216− indent_style: &IndentStyle,
217− tab_width: usize,
218−) -> String {
219− if added_indent_level >= 0 {
220− // Adding a non-negative indent is easy, we can simply append the indent string
221− base_indent.push_str(&indent_style.as_str().repeat(added_indent_level as usize));
222− base_indent
223− } else {
224− // In this case, we want to return a prefix of `base_indent`.
225− // Since the width of a tab depends on its offset, we cannot simply iterate over
226− // the chars of `base_indent` in reverse until we have the desired indent reduction,
227− // instead we iterate over them twice in forward direction.
228− let base_indent_rope = RopeSlice::from(base_indent.as_str());
229− #[allow(deprecated)]
230− let base_indent_width =
231− crate::visual_coords_at_pos(base_indent_rope, base_indent_rope.len_chars(), tab_width)
232− .col;
233− let target_indent_width = base_indent_width
234− .saturating_sub((-added_indent_level) as usize * indent_style.indent_width(tab_width));
235− #[allow(deprecated)]
236− let char_end_idx = crate::pos_at_visual_coords(
237− base_indent_rope,
238− Position {
239− row: 0,
240− col: target_indent_width,
241− },
242− tab_width,
243− );
244− let byte_end_idx = base_indent_rope.char_to_byte(char_end_idx);
245− base_indent.truncate(byte_end_idx);
246− base_indent
247− }
248−}
249−
250/// Computes for node and all ancestors whether they are the first node on their line.
199/// Computes for node and all ancestors whether they are the first node on their line.
251/// The first entry in the return value represents the root node, the last one the node itself
200/// The first entry in the return value represents the root node, the last one the node itself
252fn get_first_in_line(mut node: Node, new_line_byte_pos: Option<usize>) -> Vec<bool> {
201fn get_first_in_line(mut node: Node, new_line_byte_pos: Option<usize>) -> Vec<bool> {
@@ -292,21 +241,21 @@ fn get_first_in_line(mut node: Node, new_line_byte_pos: Option<usize>) -> Vec<bo
292/// - max(0, indent - outdent) tabs, if tabs are used for indentation
241/// - max(0, indent - outdent) tabs, if tabs are used for indentation
293/// - max(0, indent - outdent)*indent_width spaces, if spaces are used for indentation
242/// - max(0, indent - outdent)*indent_width spaces, if spaces are used for indentation
294#[derive(Default, Debug, PartialEq, Eq, Clone)]
243#[derive(Default, Debug, PartialEq, Eq, Clone)]
295−pub struct Indentation<'a> {
244+pub struct Indentation {
296 indent: usize,
245 indent: usize,
297 indent_always: usize,
246 indent_always: usize,
298 outdent: usize,
247 outdent: usize,
299 outdent_always: usize,
248 outdent_always: usize,
300 /// The alignment, as a string containing only tabs & spaces. Storing this as a string instead of e.g.
249 /// The alignment, as a string containing only tabs & spaces. Storing this as a string instead of e.g.
301 /// the (visual) width ensures that the alignment is preserved even if the tab width changes.
250 /// the (visual) width ensures that the alignment is preserved even if the tab width changes.
302− align: Option<RopeSlice<'a>>,
251+ align: Option<String>,
303}
252}
304
253
305−impl<'a> Indentation<'a> {
254+impl Indentation {
306 /// Add some other [Indentation] to this.
255 /// Add some other [Indentation] to this.
307 /// The added indent should be the total added indent from one line.
256 /// The added indent should be the total added indent from one line.
308 /// Indent should always be added starting from the bottom (or equivalently, the innermost tree-sitter node).
257 /// Indent should always be added starting from the bottom (or equivalently, the innermost tree-sitter node).
309− fn add_line(&mut self, added: Indentation<'a>) {
258+ fn add_line(&mut self, added: Indentation) {
310 // Align overrides the indent from outer scopes.
259 // Align overrides the indent from outer scopes.
311 if self.align.is_some() {
260 if self.align.is_some() {
312 return;
261 return;
@@ -325,7 +274,7 @@ impl<'a> Indentation<'a> {
325 /// Only captures that apply to the same line should be added together in this way (otherwise use `add_line`)
274 /// Only captures that apply to the same line should be added together in this way (otherwise use `add_line`)
326 /// and the captures should be added starting from the innermost tree-sitter node (currently this only matters
275 /// and the captures should be added starting from the innermost tree-sitter node (currently this only matters
327 /// if multiple `@align` patterns occur on the same line).
276 /// if multiple `@align` patterns occur on the same line).
328− fn add_capture(&mut self, added: IndentCaptureType<'a>) {
277+ fn add_capture(&mut self, added: IndentCaptureType) {
329 match added {
278 match added {
330 IndentCaptureType::Indent => {
279 IndentCaptureType::Indent => {
331 if self.indent_always == 0 {
280 if self.indent_always == 0 {
@@ -354,62 +303,43 @@ impl<'a> Indentation<'a> {
354 }
303 }
355 }
304 }
356 }
305 }
357− fn net_indent(&self) -> isize {
306+ fn into_string(self, indent_style: &IndentStyle) -> String {
358− (self.indent + self.indent_always) as isize
307+ let indent = self.indent_always + self.indent;
359− - ((self.outdent + self.outdent_always) as isize)
308+ let outdent = self.outdent_always + self.outdent;
360− }
309+
361− /// Convert `self` into a string, taking into account the computed and actual indentation of some other line.
310+ let indent_level = if indent >= outdent {
362− fn relative_indent(
311+ indent - outdent
363− &self,
364− other_computed_indent: &Self,
365− other_leading_whitespace: RopeSlice,
366− indent_style: &IndentStyle,
367− tab_width: usize,
368− ) -> Option<String> {
369− if self.align == other_computed_indent.align {
370− // If self and baseline are either not aligned to anything or both aligned the same way,
371− // we can simply take `other_leading_whitespace` and add some indent / outdent to it (in the second
372− // case, the alignment should already be accounted for in `other_leading_whitespace`).
373− let indent_diff = self.net_indent() - other_computed_indent.net_indent();
374− Some(add_indent_level(
375− String::from(other_leading_whitespace),
376− indent_diff,
377− indent_style,
378− tab_width,
379− ))
380 } else {
312 } else {
381− // If the alignment of both lines is different, we cannot compare their indentation in any meaningful way
313+ log::warn!("Encountered more outdent than indent nodes while calculating indentation: {} outdent, {} indent", self.outdent, self.indent);
382− None
314+ 0
383− }
315+ };
384− }
316+ let mut indent_string = if let Some(align) = self.align {
385− pub fn to_string(&self, indent_style: &IndentStyle, tab_width: usize) -> String {
317+ align
386− add_indent_level(
318+ } else {
387− self.align
319+ String::new()
388− .map_or_else(String::new, whitespace_with_same_width),
320+ };
389− self.net_indent(),
321+ indent_string.push_str(&indent_style.as_str().repeat(indent_level));
390− indent_style,
322+ indent_string
391− tab_width,
392− )
393 }
323 }
394}
324}
395
325
396/// An indent definition which corresponds to a capture from the indent query
326/// An indent definition which corresponds to a capture from the indent query
397#[derive(Debug)]
327#[derive(Debug)]
398−struct IndentCapture<'a> {
328+struct IndentCapture {
399− capture_type: IndentCaptureType<'a>,
329+ capture_type: IndentCaptureType,
400 scope: IndentScope,
330 scope: IndentScope,
401}
331}
402#[derive(Debug, Clone, PartialEq)]
332#[derive(Debug, Clone, PartialEq)]
403−enum IndentCaptureType<'a> {
333+enum IndentCaptureType {
404 Indent,
334 Indent,
405 IndentAlways,
335 IndentAlways,
406 Outdent,
336 Outdent,
407 OutdentAlways,
337 OutdentAlways,
408 /// Alignment given as a string of whitespace
338 /// Alignment given as a string of whitespace
409− Align(RopeSlice<'a>),
339+ Align(String),
410}
340}
411
341
412−impl<'a> IndentCaptureType<'a> {
342+impl IndentCaptureType {
413 fn default_scope(&self) -> IndentScope {
343 fn default_scope(&self) -> IndentScope {
414 match self {
344 match self {
415 IndentCaptureType::Indent | IndentCaptureType::IndentAlways => IndentScope::Tail,
345 IndentCaptureType::Indent | IndentCaptureType::IndentAlways => IndentScope::Tail,
@@ -441,8 +371,8 @@ enum ExtendCapture {
441/// each node (identified by its ID) the relevant captures (already filtered
371/// each node (identified by its ID) the relevant captures (already filtered
442/// by predicates).
372/// by predicates).
443#[derive(Debug)]
373#[derive(Debug)]
444−struct IndentQueryResult<'a> {
374+struct IndentQueryResult {
445− indent_captures: HashMap<usize, Vec<IndentCapture<'a>>>,
375+ indent_captures: HashMap<usize, Vec<IndentCapture>>,
446 extend_captures: HashMap<usize, Vec<ExtendCapture>>,
376 extend_captures: HashMap<usize, Vec<ExtendCapture>>,
447}
377}
448
378
@@ -463,14 +393,14 @@ fn get_node_end_line(node: Node, new_line_byte_pos: Option<usize>) -> usize {
463 node_line
393 node_line
464}
394}
465
395
466−fn query_indents<'a>(
396+fn query_indents(
467 query: &Query,
397 query: &Query,
468 syntax: &Syntax,
398 syntax: &Syntax,
469 cursor: &mut QueryCursor,
399 cursor: &mut QueryCursor,
470− text: RopeSlice<'a>,
400+ text: RopeSlice,
471 range: std::ops::Range<usize>,
401 range: std::ops::Range<usize>,
472 new_line_byte_pos: Option<usize>,
402 new_line_byte_pos: Option<usize>,
473−) -> IndentQueryResult<'a> {
403+) -> IndentQueryResult {
474 let mut indent_captures: HashMap<usize, Vec<IndentCapture>> = HashMap::new();
404 let mut indent_captures: HashMap<usize, Vec<IndentCapture>> = HashMap::new();
475 let mut extend_captures: HashMap<usize, Vec<ExtendCapture>> = HashMap::new();
405 let mut extend_captures: HashMap<usize, Vec<ExtendCapture>> = HashMap::new();
476 cursor.set_byte_range(range);
406 cursor.set_byte_range(range);
@@ -558,7 +488,7 @@ fn query_indents<'a>(
558 "outdent" => IndentCaptureType::Outdent,
488 "outdent" => IndentCaptureType::Outdent,
559 "outdent.always" => IndentCaptureType::OutdentAlways,
489 "outdent.always" => IndentCaptureType::OutdentAlways,
560 // The alignment will be updated to the correct value at the end, when the anchor is known.
490 // The alignment will be updated to the correct value at the end, when the anchor is known.
561− "align" => IndentCaptureType::Align(RopeSlice::from("")),
491+ "align" => IndentCaptureType::Align(String::from("")),
562 "anchor" => {
492 "anchor" => {
563 if anchor.is_some() {
493 if anchor.is_some() {
564 log::error!("Invalid indent query: Encountered more than one @anchor in the same match.")
494 log::error!("Invalid indent query: Encountered more than one @anchor in the same match.")
@@ -630,10 +560,22 @@ fn query_indents<'a>(
630 }
560 }
631 Some(anchor) => anchor,
561 Some(anchor) => anchor,
632 };
562 };
633− capture.capture_type = IndentCaptureType::Align(
563+ // Create a string of tabs & spaces that should have the same width
564+ // as the string that precedes the anchor (independent of the tab width).
565+ let mut align = String::new();
566+ for grapheme in RopeGraphemes::new(
634 text.line(anchor.start_position().row)
567 text.line(anchor.start_position().row)
635 .byte_slice(0..anchor.start_position().column),
568 .byte_slice(0..anchor.start_position().column),
636− );
569+ ) {
570+ if grapheme == "\t" {
571+ align.push('\t');
572+ } else {
573+ align.extend(
574+ std::iter::repeat(' ').take(grapheme_width(&Cow::from(grapheme))),
575+ );
576+ }
577+ }
578+ capture.capture_type = IndentCaptureType::Align(align);
637 }
579 }
638 indent_captures
580 indent_captures
639 .entry(node_id)
581 .entry(node_id)
@@ -719,20 +661,56 @@ fn extend_nodes<'a>(
719 }
661 }
720}
662}
721
663
722−/// Prepare an indent query by computing:
664+/// Use the syntax tree to determine the indentation for a given position.
723−/// - The node from which to start the query (this is non-trivial due to `@extend` captures)
665+/// This can be used in 2 ways:
724−/// - The indent captures for all relevant nodes.
666+///
667+/// - To get the correct indentation for an existing line (new_line=false), not necessarily equal to the current indentation.
668+/// - In this case, pos should be inside the first tree-sitter node on that line.
669+/// In most cases, this can just be the first non-whitespace on that line.
670+/// - To get the indentation for a new line (new_line=true). This behaves like the first usecase if the part of the current line
671+/// after pos were moved to a new line.
672+///
673+/// The indentation is determined by traversing all the tree-sitter nodes containing the position.
674+/// Each of these nodes produces some [Indentation] for:
675+///
676+/// - The line of the (beginning of the) node. This is defined by the scope `all` if this is the first node on its line.
677+/// - The line after the node. This is defined by:
678+/// - The scope `tail`.
679+/// - The scope `all` if this node is not the first node on its line.
680+/// Intuitively, `all` applies to everything contained in this node while `tail` applies to everything except for the first line of the node.
681+/// The indents from different nodes for the same line are then combined.
682+/// The result [Indentation] is simply the sum of the [Indentation] for all lines.
683+///
684+/// Specifying which line exactly an [Indentation] applies to is important because indents on the same line combine differently than indents on different lines:
685+/// ```ignore
686+/// some_function(|| {
687+/// // Both the function parameters as well as the contained block should be indented.
688+/// // Because they are on the same line, this only yields one indent level
689+/// });
690+/// ```
691+///
692+/// ```ignore
693+/// some_function(
694+/// param1,
695+/// || {
696+/// // Here we get 2 indent levels because the 'parameters' and the 'block' node begin on different lines
697+/// },
698+/// );
699+/// ```
725#[allow(clippy::too_many_arguments)]
700#[allow(clippy::too_many_arguments)]
726−fn init_indent_query<'a, 'b>(
701+pub fn treesitter_indent_for_pos(
727 query: &Query,
702 query: &Query,
728− syntax: &'a Syntax,
703+ syntax: &Syntax,
729− text: RopeSlice<'b>,
704+ indent_style: &IndentStyle,
730 tab_width: usize,
705 tab_width: usize,
731 indent_width: usize,
706 indent_width: usize,
707+ text: RopeSlice,
732 line: usize,
708 line: usize,
733− byte_pos: usize,
709+ pos: usize,
734− new_line_byte_pos: Option<usize>,
710+ new_line: bool,
735−) -> Option<(Node<'a>, HashMap<usize, Vec<IndentCapture<'b>>>)> {
711+) -> Option<String> {
712+ let byte_pos = text.char_to_byte(pos);
713+ let new_line_byte_pos = new_line.then_some(byte_pos);
736 // The innermost tree-sitter node which is considered for the indent
714 // The innermost tree-sitter node which is considered for the indent
737 // computation. It may change if some predeceding node is extended
715 // computation. It may change if some predeceding node is extended
738 let mut node = syntax
716 let mut node = syntax
@@ -776,6 +754,7 @@ fn init_indent_query<'a, 'b>(
776 (query_result, deepest_preceding)
754 (query_result, deepest_preceding)
777 })
755 })
778 };
756 };
757+ let mut indent_captures = query_result.indent_captures;
779 let extend_captures = query_result.extend_captures;
758 let extend_captures = query_result.extend_captures;
780
759
781 // Check for extend captures, potentially changing the node that the indent calculation starts with
760 // Check for extend captures, potentially changing the node that the indent calculation starts with
@@ -790,68 +769,6 @@ fn init_indent_query<'a, 'b>(
790 indent_width,
769 indent_width,
791 );
770 );
792 }
771 }
793− Some((node, query_result.indent_captures))
794−}
795−
796−/// Use the syntax tree to determine the indentation for a given position.
797−/// This can be used in 2 ways:
798−///
799−/// - To get the correct indentation for an existing line (new_line=false), not necessarily equal to the current indentation.
800−/// - In this case, pos should be inside the first tree-sitter node on that line.
801−/// In most cases, this can just be the first non-whitespace on that line.
802−/// - To get the indentation for a new line (new_line=true). This behaves like the first usecase if the part of the current line
803−/// after pos were moved to a new line.
804−///
805−/// The indentation is determined by traversing all the tree-sitter nodes containing the position.
806−/// Each of these nodes produces some [Indentation] for:
807−///
808−/// - The line of the (beginning of the) node. This is defined by the scope `all` if this is the first node on its line.
809−/// - The line after the node. This is defined by:
810−/// - The scope `tail`.
811−/// - The scope `all` if this node is not the first node on its line.
812−/// Intuitively, `all` applies to everything contained in this node while `tail` applies to everything except for the first line of the node.
813−/// The indents from different nodes for the same line are then combined.
814−/// The result [Indentation] is simply the sum of the [Indentation] for all lines.
815−///
816−/// Specifying which line exactly an [Indentation] applies to is important because indents on the same line combine differently than indents on different lines:
817−/// ```ignore
818−/// some_function(|| {
819−/// // Both the function parameters as well as the contained block should be indented.
820−/// // Because they are on the same line, this only yields one indent level
821−/// });
822−/// ```
823−///
824−/// ```ignore
825−/// some_function(
826−/// param1,
827−/// || {
828−/// // Here we get 2 indent levels because the 'parameters' and the 'block' node begin on different lines
829−/// },
830−/// );
831−/// ```
832−#[allow(clippy::too_many_arguments)]
833−pub fn treesitter_indent_for_pos<'a>(
834− query: &Query,
835− syntax: &Syntax,
836− tab_width: usize,
837− indent_width: usize,
838− text: RopeSlice<'a>,
839− line: usize,
840− pos: usize,
841− new_line: bool,
842−) -> Option<Indentation<'a>> {
843− let byte_pos = text.char_to_byte(pos);
844− let new_line_byte_pos = new_line.then_some(byte_pos);
845− let (mut node, mut indent_captures) = init_indent_query(
846− query,
847− syntax,
848− text,
849− tab_width,
850− indent_width,
851− line,
852− byte_pos,
853− new_line_byte_pos,
854− )?;
855 let mut first_in_line = get_first_in_line(node, new_line.then_some(byte_pos));
772 let mut first_in_line = get_first_in_line(node, new_line.then_some(byte_pos));
856
773
857 let mut result = Indentation::default();
774 let mut result = Indentation::default();
@@ -919,7 +836,7 @@ pub fn treesitter_indent_for_pos<'a>(
919 break;
836 break;
920 }
837 }
921 }
838 }
922− Some(result)
839+ Some(result.into_string(indent_style))
923}
840}
924
841
925/// Returns the indentation for a new line.
842/// Returns the indentation for a new line.
@@ -928,7 +845,6 @@ pub fn treesitter_indent_for_pos<'a>(
928pub fn indent_for_newline(
845pub fn indent_for_newline(
929 language_config: Option<&LanguageConfiguration>,
846 language_config: Option<&LanguageConfiguration>,
930 syntax: Option<&Syntax>,
847 syntax: Option<&Syntax>,
931− indent_heuristic: &IndentationHeuristic,
932 indent_style: &IndentStyle,
848 indent_style: &IndentStyle,
933 tab_width: usize,
849 tab_width: usize,
934 text: RopeSlice,
850 text: RopeSlice,
@@ -937,18 +853,14 @@ pub fn indent_for_newline(
937 current_line: usize,
853 current_line: usize,
938) -> String {
854) -> String {
939 let indent_width = indent_style.indent_width(tab_width);
855 let indent_width = indent_style.indent_width(tab_width);
940− if let (
941− IndentationHeuristic::TreeSitter | IndentationHeuristic::Hybrid,
942− Some(query),
943− Some(syntax),
856+ if let (Some(query), Some(syntax)) = (
944− ) = (
945− indent_heuristic,
946 language_config.and_then(|config| config.indent_query()),
857 language_config.and_then(|config| config.indent_query()),
947 syntax,
858 syntax,
948 ) {
859 ) {
949 if let Some(indent) = treesitter_indent_for_pos(
860 if let Some(indent) = treesitter_indent_for_pos(
950 query,
861 query,
951 syntax,
862 syntax,
863+ indent_style,
952 tab_width,
864 tab_width,
953 indent_width,
865 indent_width,
954 text,
866 text,
@@ -956,57 +868,9 @@ pub fn indent_for_newline(
956 line_before_end_pos,
868 line_before_end_pos,
957 true,
869 true,
958 ) {
870 ) {
959− if *indent_heuristic == IndentationHeuristic::Hybrid {
960− // We want to compute the indentation not only based on the
961− // syntax tree but also on the actual indentation of a previous
962− // line. This makes indentation computation more resilient to
963− // incomplete queries, incomplete source code & differing indentation
964− // styles for the same language.
965− // However, using the indent of a previous line as a baseline may not
966− // make sense, e.g. if it has a different alignment than the new line.
967− // In order to prevent edge cases with long running times, we only try
968− // a constant number of (non-empty) lines.
969− const MAX_ATTEMPTS: usize = 4;
970− let mut num_attempts = 0;
971− for line_idx in (0..=line_before).rev() {
972− let line = text.line(line_idx);
973− let first_non_whitespace_char = match find_first_non_whitespace_char(line) {
974− Some(i) => i,
975− None => {
976− continue;
977− }
978− };
979− if let Some(indent) = (|| {
980− let computed_indent = treesitter_indent_for_pos(
981− query,
982− syntax,
983− tab_width,
984− indent_width,
985− text,
986− line_idx,
987− text.line_to_char(line_idx) + first_non_whitespace_char,
988− false,
989− )?;
990− let leading_whitespace = line.slice(0..first_non_whitespace_char);
991− indent.relative_indent(
992− &computed_indent,
993− leading_whitespace,
994− indent_style,
995− tab_width,
996− )
997− })() {
998− return indent;
871+ return indent;
999− }
1000− num_attempts += 1;
1001− if num_attempts == MAX_ATTEMPTS {
1002− break;
1003− }
1004− }
1005− }
1006− return indent.to_string(indent_style, tab_width);
1007 };
872 };
1008 }
873 }
1009− // Fallback in case we either don't have indent queries or they failed for some reason
1010 let indent_level = indent_level_for_line(text.line(current_line), tab_width, indent_width);
874 let indent_level = indent_level_for_line(text.line(current_line), tab_width, indent_width);
1011 indent_style.as_str().repeat(indent_level)
875 indent_style.as_str().repeat(indent_level)
1012}
876}
@@ -1098,13 +962,10 @@ mod test {
1098 ..Default::default()
962 ..Default::default()
1099 };
963 };
1100
964
1101− fn add_capture<'a>(
1102− mut indent: Indentation<'a>,
965+ let add_capture = |mut indent: Indentation, capture| {
1103− capture: IndentCaptureType<'a>,
1104− ) -> Indentation<'a> {
1105 indent.add_capture(capture);
966 indent.add_capture(capture);
1106 indent
967 indent
1107− }
968+ };
1108
969
1109 // adding an indent to no indent makes an indent
970 // adding an indent to no indent makes an indent
1110 assert_eq!(
971 assert_eq!(
@@ -1199,74 +1060,4 @@ mod test {
1199 )
1060 )
1200 );
1061 );
1201 }
1062 }
1202−
1203− #[test]
1204− fn test_relative_indent() {
1205− let indent_style = IndentStyle::Spaces(4);
1206− let tab_width: usize = 4;
1207− let no_align = [
1208− Indentation::default(),
1209− Indentation {
1210− indent: 1,
1211− ..Default::default()
1212− },
1213− Indentation {
1214− indent: 5,
1215− outdent: 1,
1216− ..Default::default()
1217− },
1218− ];
1219− let align = no_align.clone().map(|indent| Indentation {
1220− align: Some(RopeSlice::from("12345")),
1221− ..indent
1222− });
1223− let different_align = Indentation {
1224− align: Some(RopeSlice::from("123456")),
1225− ..Default::default()
1226− };
1227−
1228− // Check that relative and absolute indentation computation are the same when the line we compare to is
1229− // indented as we expect.
1230− let check_consistency = |indent: &Indentation, other: &Indentation| {
1231− assert_eq!(
1232− indent.relative_indent(
1233− other,
1234− RopeSlice::from(other.to_string(&indent_style, tab_width).as_str()),
1235− &indent_style,
1236− tab_width
1237− ),
1238− Some(indent.to_string(&indent_style, tab_width))
1239− );
1240− };
1241− for a in &no_align {
1242− for b in &no_align {
1243− check_consistency(a, b);
1244− }
1245− }
1246− for a in &align {
1247− for b in &align {
1248− check_consistency(a, b);
1249− }
1250− }
1251−
1252− // Relative indent computation makes no sense if the alignment differs
1253− assert_eq!(
1254− align[0].relative_indent(
1255− &no_align[0],
1256− RopeSlice::from(" "),
1257− &indent_style,
1258− tab_width
1259− ),
1260− None
1261− );
1262− assert_eq!(
1263− align[0].relative_indent(
1264− &different_align,
1265− RopeSlice::from(" "),
1266− &indent_style,
1267− tab_width
1268− ),
1269− None
1270− );
1271− }
1272}
1063}
helix-core/src/syntax.rs+5−21
@@ -101,8 +101,7 @@ pub struct LanguageConfiguration {
101 pub file_types: Vec<FileType>, // filename extension or ends_with? <Gemfile, rb, etc>
101 pub file_types: Vec<FileType>, // filename extension or ends_with? <Gemfile, rb, etc>
102 #[serde(default)]
102 #[serde(default)]
103 pub shebangs: Vec<String>, // interpreter(s) associated with language
103 pub shebangs: Vec<String>, // interpreter(s) associated with language
104− #[serde(default)]
105− pub roots: Vec<String>, // these indicate project roots <.git, Cargo.toml>
104+ pub roots: Vec<String>, // these indicate project roots <.git, Cargo.toml>
106 pub comment_token: Option<String>,
105 pub comment_token: Option<String>,
107 pub text_width: Option<usize>,
106 pub text_width: Option<usize>,
108 pub soft_wrap: Option<SoftWrap>,
107 pub soft_wrap: Option<SoftWrap>,
@@ -155,8 +154,6 @@ pub struct LanguageConfiguration {
155 /// Hardcoded LSP root directories relative to the workspace root, like `examples` or `tools/fuzz`.
154 /// Hardcoded LSP root directories relative to the workspace root, like `examples` or `tools/fuzz`.
156 /// Falling back to the current working directory if none are configured.
155 /// Falling back to the current working directory if none are configured.
157 pub workspace_lsp_roots: Option<Vec<PathBuf>>,
156 pub workspace_lsp_roots: Option<Vec<PathBuf>>,
158− #[serde(default)]
159− pub persistent_diagnostic_sources: Vec<String>,
160}
157}
161
158
162#[derive(Debug, PartialEq, Eq, Hash)]
159#[derive(Debug, PartialEq, Eq, Hash)]
@@ -214,7 +211,10 @@ impl<'de> Deserialize<'de> for FileType {
214 {
211 {
215 match map.next_entry::<String, String>()? {
212 match map.next_entry::<String, String>()? {
216 Some((key, suffix)) if key == "suffix" => Ok(FileType::Suffix({
213 Some((key, suffix)) if key == "suffix" => Ok(FileType::Suffix({
217− suffix.replace('/', std::path::MAIN_SEPARATOR_STR)
214+ // FIXME: use `suffix.replace('/', std::path::MAIN_SEPARATOR_STR)`
215+ // if MSRV is updated to 1.68
216+ let mut separator = [0; 1];
217+ suffix.replace('/', std::path::MAIN_SEPARATOR.encode_utf8(&mut separator))
218 })),
218 })),
219 Some((key, _value)) => Err(serde::de::Error::custom(format!(
219 Some((key, _value)) => Err(serde::de::Error::custom(format!(
220 "unknown key in `file-types` list: {}",
220 "unknown key in `file-types` list: {}",
@@ -444,22 +444,6 @@ pub struct IndentationConfiguration {
444 pub unit: String,
444 pub unit: String,
445}
445}
446
446
447−/// How the indentation for a newly inserted line should be determined.
448−/// If the selected heuristic is not available (e.g. because the current
449−/// language has no tree-sitter indent queries), a simpler one will be used.
450−#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
451−#[serde(rename_all = "kebab-case")]
452−pub enum IndentationHeuristic {
453− /// Just copy the indentation of the line that the cursor is currently on.
454− Simple,
455− /// Use tree-sitter indent queries to compute the expected absolute indentation level of the new line.
456− TreeSitter,
457− /// Use tree-sitter indent queries to compute the expected difference in indentation between the new line
458− /// and the line before. Add this to the actual indentation level of the line before.
459− #[default]
460− Hybrid,
461−}
462−
463/// Configuration for auto pairs
447/// Configuration for auto pairs
464#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
448#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
465#[serde(rename_all = "kebab-case", deny_unknown_fields, untagged)]
449#[serde(rename_all = "kebab-case", deny_unknown_fields, untagged)]
helix-core/src/transaction.rs+14−73
@@ -1,7 +1,7 @@
1use ropey::RopeSlice;
1use ropey::RopeSlice;
2use smallvec::SmallVec;
2use smallvec::SmallVec;
3
3
4−use crate::{chars::char_is_word, Range, Rope, Selection, Tendril};
4+use crate::{Range, Rope, Selection, Tendril};
5use std::{borrow::Cow, iter::once};
5use std::{borrow::Cow, iter::once};
6
6
7/// (from, to, replacement)
7/// (from, to, replacement)
@@ -23,30 +23,6 @@ pub enum Operation {
23pub enum Assoc {
23pub enum Assoc {
24 Before,
24 Before,
25 After,
25 After,
26− /// Acts like `After` if a word character is inserted
27− /// after the position, otherwise acts like `Before`
28− AfterWord,
29− /// Acts like `Before` if a word character is inserted
30− /// before the position, otherwise acts like `After`
31− BeforeWord,
32−}
33−
34−impl Assoc {
35− /// Whether to stick to gaps
36− fn stay_at_gaps(self) -> bool {
37− !matches!(self, Self::BeforeWord | Self::AfterWord)
38− }
39−
40− fn insert_offset(self, s: &str) -> usize {
41− let chars = s.chars().count();
42− match self {
43− Assoc::After => chars,
44− Assoc::AfterWord => s.chars().take_while(|&c| char_is_word(c)).count(),
45− // return position before inserted text
46− Assoc::Before => 0,
47− Assoc::BeforeWord => chars - s.chars().rev().take_while(|&c| char_is_word(c)).count(),
48− }
49− }
50}
26}
51
27
52#[derive(Debug, Default, Clone, PartialEq, Eq)]
28#[derive(Debug, Default, Clone, PartialEq, Eq)]
@@ -439,6 +415,8 @@ impl ChangeSet {
439 map!(|pos, _| (old_end > pos).then_some(new_pos), i);
415 map!(|pos, _| (old_end > pos).then_some(new_pos), i);
440 }
416 }
441 Insert(s) => {
417 Insert(s) => {
418+ let ins = s.chars().count();
419+
442 // a subsequent delete means a replace, consume it
420 // a subsequent delete means a replace, consume it
443 if let Some((_, Delete(len))) = iter.peek() {
421 if let Some((_, Delete(len))) = iter.peek() {
444 iter.next();
422 iter.next();
@@ -446,13 +424,13 @@ impl ChangeSet {
446 old_end = old_pos + len;
424 old_end = old_pos + len;
447 // in range of replaced text
425 // in range of replaced text
448 map!(
426 map!(
449− |pos, assoc: Assoc| (old_end > pos).then(|| {
427+ |pos, assoc| (old_end > pos).then(|| {
450 // at point or tracking before
428 // at point or tracking before
451− if pos == old_pos && assoc.stay_at_gaps() {
429+ if pos == old_pos || assoc == Assoc::Before {
452 new_pos
430 new_pos
453 } else {
431 } else {
454 // place to end of insert
432 // place to end of insert
455− new_pos + assoc.insert_offset(s)
433+ new_pos + ins
456 }
434 }
457 }),
435 }),
458 i
436 i
@@ -460,15 +438,20 @@ impl ChangeSet {
460 } else {
438 } else {
461 // at insert point
439 // at insert point
462 map!(
440 map!(
463− |pos, assoc: Assoc| (old_pos == pos).then(|| {
441+ |pos, assoc| (old_pos == pos).then(|| {
464 // return position before inserted text
442 // return position before inserted text
465− new_pos + assoc.insert_offset(s)
443+ if assoc == Assoc::Before {
444+ new_pos
445+ } else {
446+ // after text
447+ new_pos + ins
448+ }
466 }),
449 }),
467 i
450 i
468 );
451 );
469 }
452 }
470
453
471− new_pos += s.chars().count();
454+ new_pos += ins;
472 }
455 }
473 }
456 }
474 old_pos = old_end;
457 old_pos = old_end;
@@ -901,48 +884,6 @@ mod test {
901 let mut positions = [4, 2];
884 let mut positions = [4, 2];
902 cs.update_positions(positions.iter_mut().map(|pos| (pos, Assoc::After)));
885 cs.update_positions(positions.iter_mut().map(|pos| (pos, Assoc::After)));
903 assert_eq!(positions, [4, 2]);
886 assert_eq!(positions, [4, 2]);
904− // stays at word boundary
905− let cs = ChangeSet {
906− changes: vec![
907− Retain(2), // <space><space>
908− Insert(" ab".into()),
909− Retain(2), // cd
910− Insert("de ".into()),
911− ],
912− len: 4,
913− len_after: 10,
914− };
915− assert_eq!(cs.map_pos(2, Assoc::BeforeWord), 3);
916− assert_eq!(cs.map_pos(4, Assoc::AfterWord), 9);
917− let cs = ChangeSet {
918− changes: vec![
919− Retain(1), // <space>
920− Insert(" b".into()),
921− Delete(1), // c
922− Retain(1), // d
923− Insert("e ".into()),
924− Delete(1), // <space>
925− ],
926− len: 5,
927− len_after: 7,
928− };
929− assert_eq!(cs.map_pos(1, Assoc::BeforeWord), 2);
930− assert_eq!(cs.map_pos(3, Assoc::AfterWord), 5);
931− let cs = ChangeSet {
932− changes: vec![
933− Retain(1), // <space>
934− Insert("a".into()),
935− Delete(2), // <space>b
936− Retain(1), // d
937− Insert("e".into()),
938− Delete(1), // f
939− Retain(1), // <space>
940− ],
941− len: 5,
942− len_after: 7,
943− };
944− assert_eq!(cs.map_pos(2, Assoc::BeforeWord), 1);
945− assert_eq!(cs.map_pos(4, Assoc::AfterWord), 4);
946 }
887 }
947
888
948 #[test]
889 #[test]
helix-core/tests/indent.rs+2−2
@@ -210,6 +210,7 @@ fn test_treesitter_indent(
210 let suggested_indent = treesitter_indent_for_pos(
210 let suggested_indent = treesitter_indent_for_pos(
211 indent_query,
211 indent_query,
212 &syntax,
212 &syntax,
213+ &indent_style,
213 tab_width,
214 tab_width,
214 indent_style.indent_width(tab_width),
215 indent_style.indent_width(tab_width),
215 text,
216 text,
@@ -217,8 +218,7 @@ fn test_treesitter_indent(
217 text.line_to_char(i) + pos,
218 text.line_to_char(i) + pos,
218 false,
219 false,
219 )
220 )
220− .unwrap()
221+ .unwrap();
221− .to_string(&indent_style, tab_width);
222 assert!(
222 assert!(
223 line.get_slice(..pos).map_or(false, |s| s == suggested_indent),
223 line.get_slice(..pos).map_or(false, |s| s == suggested_indent),
224 "Wrong indentation for file {:?} on line {}:\n\"{}\" (original line)\n\"{}\" (suggested indentation)\n",
224 "Wrong indentation for file {:?} on line {}:\n\"{}\" (original line)\n\"{}\" (suggested indentation)\n",
helix-dap/Cargo.toml+9−11
@@ -1,27 +1,25 @@
1[package]
1[package]
2name = "helix-dap"
2name = "helix-dap"
3+version = "0.6.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+edition = "2018"
6+license = "MPL-2.0"
3description = "DAP client implementation for Helix project"
7description = "DAP client implementation for Helix project"
4−version.workspace = true
5−authors.workspace = true
6−edition.workspace = true
7−license.workspace = true
8−rust-version.workspace = true
9−categories.workspace = true
8+categories = ["editor"]
10−repository.workspace = true
9+repository = "https://github.com/helix-editor/helix"
11−homepage.workspace = true
10+homepage = "https://helix-editor.com"
12
11
13# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
12# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
14
13
15[dependencies]
14[dependencies]
16−helix-core = { path = "../helix-core" }
15+helix-core = { version = "0.6", path = "../helix-core" }
17−
18anyhow = "1.0"
16anyhow = "1.0"
19log = "0.4"
17log = "0.4"
20serde = { version = "1.0", features = ["derive"] }
18serde = { version = "1.0", features = ["derive"] }
21serde_json = "1.0"
19serde_json = "1.0"
22thiserror = "1.0"
20thiserror = "1.0"
23tokio = { version = "1", features = ["rt", "rt-multi-thread", "io-util", "io-std", "time", "process", "macros", "fs", "parking_lot", "net", "sync"] }
21tokio = { version = "1", features = ["rt", "rt-multi-thread", "io-util", "io-std", "time", "process", "macros", "fs", "parking_lot", "net", "sync"] }
24−which = "5.0.0"
22+which = "4.4"
25
23
26[dev-dependencies]
24[dev-dependencies]
27fern = "0.6"
25fern = "0.6"
helix-event/Cargo.toml+7−8
@@ -1,13 +1,12 @@
1[package]
1[package]
2name = "helix-event"
2name = "helix-event"
3−version.workspace = true
3+version = "0.6.0"
4−authors.workspace = true
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5−edition.workspace = true
5+edition = "2021"
6−license.workspace = true
6+license = "MPL-2.0"
7−rust-version.workspace = true
8−categories.workspace = true
7+categories = ["editor"]
9−repository.workspace = true
8+repository = "https://github.com/helix-editor/helix"
10−homepage.workspace = true
9+homepage = "https://helix-editor.com"
11
10
12# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
11# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
13
12
helix-loader/Cargo.toml+10−11
@@ -1,14 +1,13 @@
1[package]
1[package]
2name = "helix-loader"
2name = "helix-loader"
3−description = "Build bootstrapping for Helix crates"
3+version = "0.6.0"
4−version.workspace = true
4+description = "A post-modern text editor."
5−authors.workspace = true
5+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
6−edition.workspace = true
6+edition = "2021"
7−license.workspace = true
7+license = "MPL-2.0"
8−rust-version.workspace = true
9−categories.workspace = true
8+categories = ["editor"]
10−repository.workspace = true
9+repository = "https://github.com/helix-editor/helix"
11−homepage.workspace = true
10+homepage = "https://helix-editor.com"
12
11
13[[bin]]
12[[bin]]
14name = "hx-loader"
13name = "hx-loader"
@@ -20,9 +19,9 @@ serde = { version = "1.0", features = ["derive"] }
20toml = "0.7"
19toml = "0.7"
21etcetera = "0.8"
20etcetera = "0.8"
22tree-sitter.workspace = true
21tree-sitter.workspace = true
23−once_cell = "1.19"
22+once_cell = "1.18"
24log = "0.4"
23log = "0.4"
25−which = "5.0.0"
24+which = "4.4"
26
25
27# TODO: these two should be on !wasm32 only
26# TODO: these two should be on !wasm32 only
28
27
helix-loader/build.rs+4−14
@@ -2,17 +2,7 @@ use std::borrow::Cow;
2use std::path::Path;
2use std::path::Path;
3use std::process::Command;
3use std::process::Command;
4
4
5−const MAJOR: &str = env!("CARGO_PKG_VERSION_MAJOR");
5+const VERSION: &str = include_str!("../VERSION");
6−const MINOR: &str = env!("CARGO_PKG_VERSION_MINOR");
7−const PATCH: &str = env!("CARGO_PKG_VERSION_PATCH");
8−
9−fn get_calver() -> String {
10− if PATCH == "0" {
11− format!("{MAJOR}.{MINOR}")
12− } else {
13− format!("{MAJOR}.{MINOR}.{PATCH}")
14− }
15−}
16
6
17fn main() {
7fn main() {
18 let git_hash = Command::new("git")
8 let git_hash = Command::new("git")
@@ -22,10 +12,9 @@ fn main() {
22 .filter(|output| output.status.success())
12 .filter(|output| output.status.success())
23 .and_then(|x| String::from_utf8(x.stdout).ok());
13 .and_then(|x| String::from_utf8(x.stdout).ok());
24
14
25− let calver = get_calver();
26 let version: Cow<_> = match &git_hash {
15 let version: Cow<_> = match &git_hash {
27− Some(git_hash) => format!("{} ({})", calver, &git_hash[..8]).into(),
16+ Some(git_hash) => format!("{} ({})", VERSION, &git_hash[..8]).into(),
28− None => calver.into(),
17+ None => VERSION.into(),
29 };
18 };
30
19
31 println!(
20 println!(
@@ -33,6 +22,7 @@ fn main() {
33 std::env::var("TARGET").unwrap()
22 std::env::var("TARGET").unwrap()
34 );
23 );
35
24
25+ println!("cargo:rerun-if-changed=../VERSION");
36 println!("cargo:rustc-env=VERSION_AND_GIT_HASH={}", version);
26 println!("cargo:rustc-env=VERSION_AND_GIT_HASH={}", version);
37
27
38 if git_hash.is_none() {
28 if git_hash.is_none() {
helix-lsp/Cargo.toml+14−15
@@ -1,32 +1,31 @@
1[package]
1[package]
2name = "helix-lsp"
2name = "helix-lsp"
3+version = "0.6.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+edition = "2021"
6+license = "MPL-2.0"
3description = "LSP client implementation for Helix project"
7description = "LSP client implementation for Helix project"
4−version.workspace = true
5−authors.workspace = true
6−edition.workspace = true
7−license.workspace = true
8−rust-version.workspace = true
9−categories.workspace = true
8+categories = ["editor"]
10−repository.workspace = true
9+repository = "https://github.com/helix-editor/helix"
11−homepage.workspace = true
10+homepage = "https://helix-editor.com"
12
11
13# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
12# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
14
13
15[dependencies]
14[dependencies]
16−helix-core = { path = "../helix-core" }
15+helix-core = { version = "0.6", path = "../helix-core" }
17−helix-loader = { path = "../helix-loader" }
16+helix-loader = { version = "0.6", path = "../helix-loader" }
18−helix-parsec = { path = "../helix-parsec" }
17+helix-parsec = { version = "0.6", path = "../helix-parsec" }
19
18
20anyhow = "1.0"
19anyhow = "1.0"
21futures-executor = "0.3"
20futures-executor = "0.3"
22futures-util = { version = "0.3", features = ["std", "async-await"], default-features = false }
21futures-util = { version = "0.3", features = ["std", "async-await"], default-features = false }
23−globset = "0.4.14"
22+globset = "0.4.13"
24log = "0.4"
23log = "0.4"
25−lsp-types = { version = "0.95" }
24+lsp-types = { version = "0.94" }
26serde = { version = "1.0", features = ["derive"] }
25serde = { version = "1.0", features = ["derive"] }
27serde_json = "1.0"
26serde_json = "1.0"
28thiserror = "1.0"
27thiserror = "1.0"
29−tokio = { version = "1.35", features = ["rt", "rt-multi-thread", "io-util", "io-std", "time", "process", "macros", "fs", "parking_lot", "sync"] }
28+tokio = { version = "1.33", features = ["rt", "rt-multi-thread", "io-util", "io-std", "time", "process", "macros", "fs", "parking_lot", "sync"] }
30tokio-stream = "0.1.14"
29tokio-stream = "0.1.14"
31−which = "5.0.0"
30+which = "4.4"
32parking_lot = "0.12.1"
31parking_lot = "0.12.1"
helix-lsp/src/client.rs+8−8
@@ -667,7 +667,6 @@ impl Client {
667 version: Some(String::from(VERSION_AND_GIT_HASH)),
667 version: Some(String::from(VERSION_AND_GIT_HASH)),
668 }),
668 }),
669 locale: None, // TODO
669 locale: None, // TODO
670− work_done_progress_params: lsp::WorkDoneProgressParams::default(),
671 };
670 };
672
671
673 self.request::<lsp::request::Initialize>(params).await
672 self.request::<lsp::request::Initialize>(params).await
@@ -970,19 +969,20 @@ impl Client {
970 ) -> Option<impl Future<Output = Result<()>>> {
969 ) -> Option<impl Future<Output = Result<()>>> {
971 let capabilities = self.capabilities.get().unwrap();
970 let capabilities = self.capabilities.get().unwrap();
972
971
973− let include_text = match &capabilities.text_document_sync.as_ref()? {
972+ let include_text = match &capabilities.text_document_sync {
974− lsp::TextDocumentSyncCapability::Options(lsp::TextDocumentSyncOptions {
973+ Some(lsp::TextDocumentSyncCapability::Options(lsp::TextDocumentSyncOptions {
975− save: options,
974+ save: Some(options),
976 ..
975 ..
977− }) => match options.as_ref()? {
976+ })) => match options {
978 lsp::TextDocumentSyncSaveOptions::Supported(true) => false,
977 lsp::TextDocumentSyncSaveOptions::Supported(true) => false,
979 lsp::TextDocumentSyncSaveOptions::SaveOptions(lsp_types::SaveOptions {
978 lsp::TextDocumentSyncSaveOptions::SaveOptions(lsp_types::SaveOptions {
980 include_text,
979 include_text,
981 }) => include_text.unwrap_or(false),
980 }) => include_text.unwrap_or(false),
982− lsp::TextDocumentSyncSaveOptions::Supported(false) => return None,
981+ // Supported(false)
982+ _ => return None,
983 },
983 },
984− // see: https://github.com/microsoft/language-server-protocol/issues/288
984+ // unsupported
985− lsp::TextDocumentSyncCapability::Kind(..) => false,
985+ _ => return None,
986 };
986 };
987
987
988 Some(self.notify::<lsp::notification::DidSaveTextDocument>(
988 Some(self.notify::<lsp::notification::DidSaveTextDocument>(
helix-parsec/Cargo.toml+7−8
@@ -1,14 +1,13 @@
1[package]
1[package]
2name = "helix-parsec"
2name = "helix-parsec"
3+version = "0.6.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+edition = "2021"
6+license = "MPL-2.0"
3description = "Parser combinators for Helix"
7description = "Parser combinators for Helix"
8+categories = ["editor"]
9+repository = "https://github.com/helix-editor/helix"
10+homepage = "https://helix-editor.com"
4include = ["src/**/*", "README.md"]
11include = ["src/**/*", "README.md"]
5−version.workspace = true
6−authors.workspace = true
7−edition.workspace = true
8−license.workspace = true
9−rust-version.workspace = true
10−categories.workspace = true
11−repository.workspace = true
12−homepage.workspace = true
13
12
14[dependencies]
13[dependencies]
helix-term/Cargo.toml+21−25
@@ -1,16 +1,16 @@
1[package]
1[package]
2name = "helix-term"
2name = "helix-term"
3+version = "0.6.0"
3description = "A post-modern text editor."
4description = "A post-modern text editor."
5+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
6+edition = "2021"
7+license = "MPL-2.0"
8+categories = ["editor", "command-line-utilities"]
9+repository = "https://github.com/helix-editor/helix"
10+homepage = "https://helix-editor.com"
4include = ["src/**/*", "README.md"]
11include = ["src/**/*", "README.md"]
5default-run = "hx"
12default-run = "hx"
6−version.workspace = true
7−authors.workspace = true
8−edition.workspace = true
9−license.workspace = true
10−rust-version.workspace = true
13+rust-version = "1.65"
11−categories.workspace = true
12−repository.workspace = true
13−homepage.workspace = true
14
14
15[features]
15[features]
16default = ["git"]
16default = ["git"]
@@ -23,18 +23,18 @@ name = "hx"
23path = "src/main.rs"
23path = "src/main.rs"
24
24
25[dependencies]
25[dependencies]
26−helix-core = { path = "../helix-core" }
26+helix-core = { version = "0.6", path = "../helix-core" }
27−helix-event = { path = "../helix-event" }
27+helix-event = { version = "0.6", path = "../helix-event" }
28−helix-view = { path = "../helix-view" }
28+helix-view = { version = "0.6", path = "../helix-view" }
29−helix-lsp = { path = "../helix-lsp" }
29+helix-lsp = { version = "0.6", path = "../helix-lsp" }
30−helix-dap = { path = "../helix-dap" }
30+helix-dap = { version = "0.6", path = "../helix-dap" }
31−helix-vcs = { path = "../helix-vcs" }
31+helix-vcs = { version = "0.6", path = "../helix-vcs" }
32−helix-loader = { path = "../helix-loader" }
32+helix-loader = { version = "0.6", path = "../helix-loader" }
33
33
34anyhow = "1"
34anyhow = "1"
35−once_cell = "1.19"
35+once_cell = "1.18"
36
36
37−which = "5.0.0"
37+which = "4.4"
38
38
39tokio = { version = "1", features = ["rt", "rt-multi-thread", "io-util", "io-std", "time", "process", "macros", "fs", "parking_lot"] }
39tokio = { version = "1", features = ["rt", "rt-multi-thread", "io-util", "io-std", "time", "process", "macros", "fs", "parking_lot"] }
40tui = { path = "../helix-tui", package = "helix-tui", default-features = false, features = ["crossterm"] }
40tui = { path = "../helix-tui", package = "helix-tui", default-features = false, features = ["crossterm"] }
@@ -57,10 +57,6 @@ pulldown-cmark = { version = "0.9", default-features = false }
57# file type detection
57# file type detection
58content_inspector = "0.2.4"
58content_inspector = "0.2.4"
59
59
60−# opening URLs
61−open = "5.0.1"
62−url = "2.5.0"
63−
64# config
60# config
65toml = "0.7"
61toml = "0.7"
66
62
@@ -68,18 +64,18 @@ serde_json = "1.0"
68serde = { version = "1.0", features = ["derive"] }
64serde = { version = "1.0", features = ["derive"] }
69
65
70# ripgrep for global search
66# ripgrep for global search
71−grep-regex = "0.1.12"
67+grep-regex = "0.1.11"
72−grep-searcher = "0.1.13"
68+grep-searcher = "0.1.11"
73
69
74[target.'cfg(not(windows))'.dependencies] # https://github.com/vorner/signal-hook/issues/100
70[target.'cfg(not(windows))'.dependencies] # https://github.com/vorner/signal-hook/issues/100
75signal-hook-tokio = { version = "0.3", features = ["futures-v0_3"] }
71signal-hook-tokio = { version = "0.3", features = ["futures-v0_3"] }
76−libc = "0.2.151"
72+libc = "0.2.150"
77
73
78[target.'cfg(target_os = "macos")'.dependencies]
74[target.'cfg(target_os = "macos")'.dependencies]
79crossterm = { version = "0.27", features = ["event-stream", "use-dev-tty"] }
75crossterm = { version = "0.27", features = ["event-stream", "use-dev-tty"] }
80
76
81[build-dependencies]
77[build-dependencies]
82−helix-loader = { path = "../helix-loader" }
78+helix-loader = { version = "0.6", path = "../helix-loader" }
83
79
84[dev-dependencies]
80[dev-dependencies]
85smallvec = "1.11"
81smallvec = "1.11"
helix-term/src/application.rs+46−95
@@ -1,7 +1,6 @@
1use arc_swap::{access::Map, ArcSwap};
1use arc_swap::{access::Map, ArcSwap};
2use futures_util::Stream;
2use futures_util::Stream;
3use helix_core::{
3use helix_core::{
4− chars::char_is_word,
5 diagnostic::{DiagnosticTag, NumberOrString},
4 diagnostic::{DiagnosticTag, NumberOrString},
6 path::get_relative_path,
5 path::get_relative_path,
7 pos_at_coords, syntax, Selection,
6 pos_at_coords, syntax, Selection,
@@ -163,19 +162,14 @@ impl Application {
163 // Unset path to prevent accidentally saving to the original tutor file.
162 // Unset path to prevent accidentally saving to the original tutor file.
164 doc_mut!(editor).set_path(None);
163 doc_mut!(editor).set_path(None);
165 } else if !args.files.is_empty() {
164 } else if !args.files.is_empty() {
166− let mut files_it = args.files.into_iter().peekable();
165+ if args.open_cwd {
167−
166+ // NOTE: The working directory is already set to args.files[0] in main()
168− // If the first file is a directory, skip it and open a picker
167+ editor.new_file(Action::VerticalSplit);
169− if let Some((first, _)) = files_it.next_if(|(p, _)| p.is_dir()) {
170− let picker = ui::file_picker(first, &config.load().editor);
168+ let picker = ui::file_picker(".".into(), &config.load().editor);
171 compositor.push(Box::new(overlaid(picker)));
169 compositor.push(Box::new(overlaid(picker)));
172− }
170+ } else {
173−
174− // If there are any more files specified, open them
175− if files_it.peek().is_some() {
176− let mut nr_of_files = 0;
171+ let nr_of_files = args.files.len();
177− for (file, pos) in files_it {
172+ for (i, (file, pos)) in args.files.into_iter().enumerate() {
178− nr_of_files += 1;
179 if file.is_dir() {
173 if file.is_dir() {
180 return Err(anyhow::anyhow!(
174 return Err(anyhow::anyhow!(
181 "expected a path to file, found a directory. (to open a directory pass it as first argument)"
175 "expected a path to file, found a directory. (to open a directory pass it as first argument)"
@@ -187,7 +181,7 @@ impl Application {
187 // option. If neither of those two arguments are passed
181 // option. If neither of those two arguments are passed
188 // in, just load the files normally.
182 // in, just load the files normally.
189 let action = match args.split {
183 let action = match args.split {
190− _ if nr_of_files == 1 => Action::VerticalSplit,
184+ _ if i == 0 => Action::VerticalSplit,
191 Some(Layout::Vertical) => Action::VerticalSplit,
185 Some(Layout::Vertical) => Action::VerticalSplit,
192 Some(Layout::Horizontal) => Action::HorizontalSplit,
186 Some(Layout::Horizontal) => Action::HorizontalSplit,
193 None => Action::Load,
187 None => Action::Load,
@@ -214,8 +208,6 @@ impl Application {
214 // does not affect views without pos since it is at the top
208 // does not affect views without pos since it is at the top
215 let (view, doc) = current!(editor);
209 let (view, doc) = current!(editor);
216 align_view(doc, view, Align::Center);
210 align_view(doc, view, Align::Center);
217− } else {
218− editor.new_file(Action::VerticalSplit);
219 }
211 }
220 } else if stdin().is_tty() || cfg!(feature = "integration") {
212 } else if stdin().is_tty() || cfg!(feature = "integration") {
221 editor.new_file(Action::VerticalSplit);
213 editor.new_file(Action::VerticalSplit);
@@ -718,7 +710,7 @@ impl Application {
718 ));
710 ));
719 }
711 }
720 }
712 }
721− Notification::PublishDiagnostics(mut params) => {
713+ Notification::PublishDiagnostics(params) => {
722 let path = match params.uri.to_file_path() {
714 let path = match params.uri.to_file_path() {
723 Ok(path) => path,
715 Ok(path) => path,
724 Err(_) => {
716 Err(_) => {
@@ -732,69 +724,31 @@ impl Application {
732 return;
724 return;
733 }
725 }
734 let offset_encoding = language_server.offset_encoding();
726 let offset_encoding = language_server.offset_encoding();
735− // have to inline the function because of borrow checking...
727+ let doc = self.editor.document_by_path_mut(&path).filter(|doc| {
736− let doc = self.editor.documents.values_mut()
737− .find(|doc| doc.path().map(|p| p == &path).unwrap_or(false))
738− .filter(|doc| {
739− if let Some(version) = params.version {
728+ if let Some(version) = params.version {
740− if version != doc.version() {
729+ if version != doc.version() {
741− log::info!("Version ({version}) is out of date for {path:?} (expected ({}), dropping PublishDiagnostic notification", doc.version());
730+ log::info!("Version ({version}) is out of date for {path:?} (expected ({}), dropping PublishDiagnostic notification", doc.version());
742− return false;
731+ return false;
743− }
744 }
732 }
733+ }
734+
745− true
735+ true
746− });
736+ });
747
737
748 if let Some(doc) = doc {
738 if let Some(doc) = doc {
749− let lang_conf = doc.language.clone();
739+ let lang_conf = doc.language_config();
750− let text = doc.text().clone();
740+ let text = doc.text();
751−
752− let mut unchaged_diag_sources_ = Vec::new();
753− if let Some(lang_conf) = &lang_conf {
754− if let Some(old_diagnostics) =
755− self.editor.diagnostics.get(&params.uri)
756− {
757− if !lang_conf.persistent_diagnostic_sources.is_empty() {
758− // Sort diagnostics first by severity and then by line numbers.
759− // Note: The `lsp::DiagnosticSeverity` enum is already defined in decreasing order
760− params
761− .diagnostics
762− .sort_unstable_by_key(|d| (d.severity, d.range.start));
763− }
764− for source in &lang_conf.persistent_diagnostic_sources {
765− let new_diagnostics = params
766− .diagnostics
767− .iter()
768− .filter(|d| d.source.as_ref() == Some(source));
769− let old_diagnostics = old_diagnostics
770− .iter()
771− .filter(|(d, d_server)| {
772− *d_server == server_id
773− && d.source.as_ref() == Some(source)
774− })
775− .map(|(d, _)| d);
776− if new_diagnostics.eq(old_diagnostics) {
777− unchaged_diag_sources_.push(source.clone())
778− }
779− }
780− }
781− }
782
741
783− let unchaged_diag_sources = &unchaged_diag_sources_;
742+ let diagnostics = params
784− let diagnostics =
743+ .diagnostics
744+ .iter()
785− params.diagnostics.iter().filter_map(move |diagnostic| {
745+ .filter_map(|diagnostic| {
786 use helix_core::diagnostic::{Diagnostic, Range, Severity::*};
746 use helix_core::diagnostic::{Diagnostic, Range, Severity::*};
787 use lsp::DiagnosticSeverity;
747 use lsp::DiagnosticSeverity;
788
748
789− if diagnostic.source.as_ref().map_or(false, |source| {
790− unchaged_diag_sources.contains(source)
791− }) {
792− return None;
793− }
794−
795 // TODO: convert inside server
749 // TODO: convert inside server
796 let start = if let Some(start) = lsp_pos_to_pos(
750 let start = if let Some(start) = lsp_pos_to_pos(
797− &text,
751+ text,
798 diagnostic.range.start,
752 diagnostic.range.start,
799 offset_encoding,
753 offset_encoding,
800 ) {
754 ) {
@@ -805,13 +759,14 @@ impl Application {
805 };
759 };
806
760
807 let end = if let Some(end) =
761 let end = if let Some(end) =
808− lsp_pos_to_pos(&text, diagnostic.range.end, offset_encoding)
762+ lsp_pos_to_pos(text, diagnostic.range.end, offset_encoding)
809 {
763 {
810 end
764 end
811 } else {
765 } else {
812 log::warn!("lsp position out of bounds - {:?}", diagnostic);
766 log::warn!("lsp position out of bounds - {:?}", diagnostic);
813 return None;
767 return None;
814 };
768 };
769+
815 let severity =
770 let severity =
816 diagnostic.severity.map(|severity| match severity {
771 diagnostic.severity.map(|severity| match severity {
817 DiagnosticSeverity::ERROR => Error,
772 DiagnosticSeverity::ERROR => Error,
@@ -824,7 +779,7 @@ impl Application {
824 ),
779 ),
825 });
780 });
826
781
827− if let Some(lang_conf) = &lang_conf {
782+ if let Some(lang_conf) = lang_conf {
828 if let Some(severity) = severity {
783 if let Some(severity) = severity {
829 if severity < lang_conf.diagnostic_severity {
784 if severity < lang_conf.diagnostic_severity {
830 return None;
785 return None;
@@ -863,17 +818,8 @@ impl Application {
863 Vec::new()
818 Vec::new()
864 };
819 };
865
820
866− let ends_at_word = start != end
867− && end != 0
868− && text.get_char(end - 1).map_or(false, char_is_word);
869− let starts_at_word = start != end
870− && text.get_char(start).map_or(false, char_is_word);
871−
872 Some(Diagnostic {
821 Some(Diagnostic {
873 range: Range { start, end },
822 range: Range { start, end },
874− ends_at_word,
875− starts_at_word,
876− zero_width: start == end,
877 line: diagnostic.range.start.line as usize,
823 line: diagnostic.range.start.line as usize,
878 message: diagnostic.message.clone(),
824 message: diagnostic.message.clone(),
879 severity,
825 severity,
@@ -883,33 +829,38 @@ impl Application {
883 data: diagnostic.data.clone(),
829 data: diagnostic.data.clone(),
884 language_server_id: server_id,
830 language_server_id: server_id,
885 })
831 })
886− });
832+ })
833+ .collect();
887
834
888− doc.replace_diagnostics(diagnostics, unchaged_diag_sources, server_id);
835+ doc.replace_diagnostics(diagnostics, server_id);
889 }
836 }
890
837
891− let diagnostics = params.diagnostics.into_iter().map(|d| (d, server_id));
838+ let mut diagnostics = params
839+ .diagnostics
840+ .into_iter()
841+ .map(|d| (d, server_id))
842+ .collect();
892
843
893 // Insert the original lsp::Diagnostics here because we may have no open document
844 // Insert the original lsp::Diagnostics here because we may have no open document
894 // for diagnosic message and so we can't calculate the exact position.
845 // for diagnosic message and so we can't calculate the exact position.
895 // When using them later in the diagnostics picker, we calculate them on-demand.
846 // When using them later in the diagnostics picker, we calculate them on-demand.
896− let diagnostics = match self.editor.diagnostics.entry(params.uri) {
847+ match self.editor.diagnostics.entry(params.uri) {
897 Entry::Occupied(o) => {
848 Entry::Occupied(o) => {
898 let current_diagnostics = o.into_mut();
849 let current_diagnostics = o.into_mut();
899 // there may entries of other language servers, which is why we can't overwrite the whole entry
850 // there may entries of other language servers, which is why we can't overwrite the whole entry
900 current_diagnostics.retain(|(_, lsp_id)| *lsp_id != server_id);
851 current_diagnostics.retain(|(_, lsp_id)| *lsp_id != server_id);
901− current_diagnostics.extend(diagnostics);
852+ current_diagnostics.append(&mut diagnostics);
902− current_diagnostics
903 // Sort diagnostics first by severity and then by line numbers.
853 // Sort diagnostics first by severity and then by line numbers.
854+ // Note: The `lsp::DiagnosticSeverity` enum is already defined in decreasing order
855+ current_diagnostics
856+ .sort_unstable_by_key(|(d, _)| (d.severity, d.range.start));
857+ }
858+ Entry::Vacant(v) => {
859+ diagnostics
860+ .sort_unstable_by_key(|(d, _)| (d.severity, d.range.start));
861+ v.insert(diagnostics);
904 }
862 }
905− Entry::Vacant(v) => v.insert(diagnostics.collect()),
906 };
863 };
907−
908− // Sort diagnostics first by severity and then by line numbers.
909− // Note: The `lsp::DiagnosticSeverity` enum is already defined in decreasing order
910− diagnostics.sort_unstable_by_key(|(d, server_id)| {
911− (d.severity, d.range.start, *server_id)
912− });
913 }
864 }
914 Notification::ShowMessage(params) => {
865 Notification::ShowMessage(params) => {
915 log::warn!("unhandled window/showMessage: {:?}", params);
866 log::warn!("unhandled window/showMessage: {:?}", params);
helix-term/src/args.rs+1
@@ -17,6 +17,7 @@ pub struct Args {
17 pub log_file: Option<PathBuf>,
17 pub log_file: Option<PathBuf>,
18 pub config_file: Option<PathBuf>,
18 pub config_file: Option<PathBuf>,
19 pub files: Vec<(PathBuf, Position)>,
19 pub files: Vec<(PathBuf, Position)>,
20+ pub open_cwd: bool,
20 pub working_directory: Option<PathBuf>,
21 pub working_directory: Option<PathBuf>,
21}
22}
22
23
helix-term/src/commands.rs+20−109
@@ -60,13 +60,8 @@ use crate::{
60
60
61use crate::job::{self, Jobs};
61use crate::job::{self, Jobs};
62use futures_util::{stream::FuturesUnordered, TryStreamExt};
62use futures_util::{stream::FuturesUnordered, TryStreamExt};
63−use std::{
64− collections::{HashMap, HashSet},
63+use std::{collections::HashMap, fmt, future::Future};
65− fmt,
66− future::Future,
67− io::Read,
68− num::NonZeroUsize,
64+use std::{collections::HashSet, num::NonZeroUsize};
69−};
70
65
71use std::{
66use std::{
72 borrow::Cow,
67 borrow::Cow,
@@ -75,7 +70,6 @@ use std::{
75
70
76use once_cell::sync::Lazy;
71use once_cell::sync::Lazy;
77use serde::de::{self, Deserialize, Deserializer};
72use serde::de::{self, Deserialize, Deserializer};
78−use url::Url;
79
73
80use grep_regex::RegexMatcherBuilder;
74use grep_regex::RegexMatcherBuilder;
81use grep_searcher::{sinks, BinaryDetection, SearcherBuilder};
75use grep_searcher::{sinks, BinaryDetection, SearcherBuilder};
@@ -337,7 +331,7 @@ impl MappableCommand {
337 goto_implementation, "Goto implementation",
331 goto_implementation, "Goto implementation",
338 goto_file_start, "Goto line number <n> else file start",
332 goto_file_start, "Goto line number <n> else file start",
339 goto_file_end, "Goto file end",
333 goto_file_end, "Goto file end",
340− goto_file, "Goto files/URLs in selection",
334+ goto_file, "Goto files in selection",
341 goto_file_hsplit, "Goto files in selection (hsplit)",
335 goto_file_hsplit, "Goto files in selection (hsplit)",
342 goto_file_vsplit, "Goto files in selection (vsplit)",
336 goto_file_vsplit, "Goto files in selection (vsplit)",
343 goto_reference, "Goto references",
337 goto_reference, "Goto references",
@@ -990,7 +984,6 @@ fn align_selections(cx: &mut Context) {
990
984
991 let transaction = Transaction::change(doc.text(), changes.into_iter());
985 let transaction = Transaction::change(doc.text(), changes.into_iter());
992 doc.apply(&transaction, view.id);
986 doc.apply(&transaction, view.id);
993− exit_select_mode(cx);
994}
987}
995
988
996fn goto_window(cx: &mut Context, align: Align) {
989fn goto_window(cx: &mut Context, align: Align) {
@@ -1196,53 +1189,10 @@ fn goto_file_impl(cx: &mut Context, action: Action) {
1196 .to_string(),
1189 .to_string(),
1197 );
1190 );
1198 }
1191 }
1199−
1200 for sel in paths {
1192 for sel in paths {
1201 let p = sel.trim();
1193 let p = sel.trim();
1202− if p.is_empty() {
1194+ if !p.is_empty() {
1203− continue;
1204− }
1205−
1206− if let Ok(url) = Url::parse(p) {
1207− return open_url(cx, url, action);
1208− }
1209−
1210− let path = &rel_path.join(p);
1195+ let path = &rel_path.join(p);
1211− if path.is_dir() {
1212− let picker = ui::file_picker(path.into(), &cx.editor.config());
1213− cx.push_layer(Box::new(overlaid(picker)));
1214− } else if let Err(e) = cx.editor.open(path, action) {
1215− cx.editor.set_error(format!("Open file failed: {:?}", e));
1216− }
1217− }
1218−}
1219−
1220−/// Opens the given url. If the URL points to a valid textual file it is open in helix.
1221−// Otherwise, the file is open using external program.
1222−fn open_url(cx: &mut Context, url: Url, action: Action) {
1223− let doc = doc!(cx.editor);
1224− let rel_path = doc
1225− .relative_path()
1226− .map(|path| path.parent().unwrap().to_path_buf())
1227− .unwrap_or_default();
1228−
1229− if url.scheme() != "file" {
1230− return open_external_url(cx, url);
1231− }
1232−
1233− let content_type = std::fs::File::open(url.path()).and_then(|file| {
1234− // Read up to 1kb to detect the content type
1235− let mut read_buffer = Vec::new();
1236− let n = file.take(1024).read_to_end(&mut read_buffer)?;
1237− Ok(content_inspector::inspect(&read_buffer[..n]))
1238− });
1239−
1240− // we attempt to open binary files - files that can't be open in helix - using external
1241− // program as well, e.g. pdf files or images
1242− match content_type {
1243− Ok(content_inspector::ContentType::BINARY) => open_external_url(cx, url),
1244− Ok(_) | Err(_) => {
1245− let path = &rel_path.join(url.path());
1246 if path.is_dir() {
1196 if path.is_dir() {
1247 let picker = ui::file_picker(path.into(), &cx.editor.config());
1197 let picker = ui::file_picker(path.into(), &cx.editor.config());
1248 cx.push_layer(Box::new(overlaid(picker)));
1198 cx.push_layer(Box::new(overlaid(picker)));
@@ -1253,23 +1203,6 @@ fn open_url(cx: &mut Context, url: Url, action: Action) {
1253 }
1203 }
1254}
1204}
1255
1205
1256−/// Opens URL in external program.
1257−fn open_external_url(cx: &mut Context, url: Url) {
1258− let commands = open::commands(url.as_str());
1259− cx.jobs.callback(async {
1260− for cmd in commands {
1261− let mut command = tokio::process::Command::new(cmd.get_program());
1262− command.args(cmd.get_args());
1263− if command.output().await.is_ok() {
1264− return Ok(job::Callback::Editor(Box::new(|_| {})));
1265− }
1266− }
1267− Ok(job::Callback::Editor(Box::new(move |editor| {
1268− editor.set_error("Opening URL in external program failed")
1269− })))
1270− });
1271−}
1272−
1273fn extend_word_impl<F>(cx: &mut Context, extend_fn: F)
1206fn extend_word_impl<F>(cx: &mut Context, extend_fn: F)
1274where
1207where
1275 F: Fn(RopeSlice, Range, usize) -> Range,
1208 F: Fn(RopeSlice, Range, usize) -> Range,
@@ -1318,7 +1251,7 @@ fn extend_next_long_word_end(cx: &mut Context) {
1318 extend_word_impl(cx, movement::move_next_long_word_end)
1251 extend_word_impl(cx, movement::move_next_long_word_end)
1319}
1252}
1320
1253
1321−/// Separate branch to find_char designed only for `<ret>` char.
1254+/// Separate branch to find_char designed only for <ret> char.
1322//
1255//
1323// This is necessary because the one document can have different line endings inside. And we
1256// This is necessary because the one document can have different line endings inside. And we
1324// cannot predict what character to find when <ret> is pressed. On the current line it can be `lf`
1257// cannot predict what character to find when <ret> is pressed. On the current line it can be `lf`
@@ -1594,7 +1527,6 @@ where
1594 });
1527 });
1595
1528
1596 doc.apply(&transaction, view.id);
1529 doc.apply(&transaction, view.id);
1597− exit_select_mode(cx);
1598}
1530}
1599
1531
1600fn switch_case(cx: &mut Context) {
1532fn switch_case(cx: &mut Context) {
@@ -3053,7 +2985,6 @@ fn insert_with_indent(cx: &mut Context, cursor_fallback: IndentFallbackPos) {
3053 let indent = indent::indent_for_newline(
2985 let indent = indent::indent_for_newline(
3054 language_config,
2986 language_config,
3055 syntax,
2987 syntax,
3056− &doc.config.load().indent_heuristic,
3057 &doc.indent_style,
2988 &doc.indent_style,
3058 tab_width,
2989 tab_width,
3059 text,
2990 text,
@@ -3182,7 +3113,6 @@ fn open(cx: &mut Context, open: Open) {
3182 let indent = indent::indent_for_newline(
3113 let indent = indent::indent_for_newline(
3183 doc.language_config(),
3114 doc.language_config(),
3184 doc.syntax(),
3115 doc.syntax(),
3185− &doc.config.load().indent_heuristic,
3186 &doc.indent_style,
3116 &doc.indent_style,
3187 doc.tab_width(),
3117 doc.tab_width(),
3188 text,
3118 text,
@@ -3722,7 +3652,6 @@ pub mod insert {
3722 let indent = indent::indent_for_newline(
3652 let indent = indent::indent_for_newline(
3723 doc.language_config(),
3653 doc.language_config(),
3724 doc.syntax(),
3654 doc.syntax(),
3725− &doc.config.load().indent_heuristic,
3726 &doc.indent_style,
3655 &doc.indent_style,
3727 doc.tab_width(),
3656 doc.tab_width(),
3728 text,
3657 text,
@@ -4156,27 +4085,22 @@ pub(crate) fn paste_bracketed_value(cx: &mut Context, contents: String) {
4156 };
4085 };
4157 let (view, doc) = current!(cx.editor);
4086 let (view, doc) = current!(cx.editor);
4158 paste_impl(&[contents], doc, view, paste, count, cx.editor.mode);
4087 paste_impl(&[contents], doc, view, paste, count, cx.editor.mode);
4159− exit_select_mode(cx);
4160}
4088}
4161
4089
4162fn paste_clipboard_after(cx: &mut Context) {
4090fn paste_clipboard_after(cx: &mut Context) {
4163 paste(cx.editor, '+', Paste::After, cx.count());
4091 paste(cx.editor, '+', Paste::After, cx.count());
4164− exit_select_mode(cx);
4165}
4092}
4166
4093
4167fn paste_clipboard_before(cx: &mut Context) {
4094fn paste_clipboard_before(cx: &mut Context) {
4168 paste(cx.editor, '+', Paste::Before, cx.count());
4095 paste(cx.editor, '+', Paste::Before, cx.count());
4169− exit_select_mode(cx);
4170}
4096}
4171
4097
4172fn paste_primary_clipboard_after(cx: &mut Context) {
4098fn paste_primary_clipboard_after(cx: &mut Context) {
4173 paste(cx.editor, '*', Paste::After, cx.count());
4099 paste(cx.editor, '*', Paste::After, cx.count());
4174− exit_select_mode(cx);
4175}
4100}
4176
4101
4177fn paste_primary_clipboard_before(cx: &mut Context) {
4102fn paste_primary_clipboard_before(cx: &mut Context) {
4178 paste(cx.editor, '*', Paste::Before, cx.count());
4103 paste(cx.editor, '*', Paste::Before, cx.count());
4179− exit_select_mode(cx);
4180}
4104}
4181
4105
4182fn replace_with_yanked(cx: &mut Context) {
4106fn replace_with_yanked(cx: &mut Context) {
@@ -4215,12 +4139,10 @@ fn replace_with_yanked_impl(editor: &mut Editor, register: char, count: usize) {
4215
4139
4216fn replace_selections_with_clipboard(cx: &mut Context) {
4140fn replace_selections_with_clipboard(cx: &mut Context) {
4217 replace_with_yanked_impl(cx.editor, '+', cx.count());
4141 replace_with_yanked_impl(cx.editor, '+', cx.count());
4218− exit_select_mode(cx);
4219}
4142}
4220
4143
4221fn replace_selections_with_primary_clipboard(cx: &mut Context) {
4144fn replace_selections_with_primary_clipboard(cx: &mut Context) {
4222 replace_with_yanked_impl(cx.editor, '*', cx.count());
4145 replace_with_yanked_impl(cx.editor, '*', cx.count());
4223− exit_select_mode(cx);
4224}
4146}
4225
4147
4226fn paste(editor: &mut Editor, register: char, pos: Paste, count: usize) {
4148fn paste(editor: &mut Editor, register: char, pos: Paste, count: usize) {
@@ -4238,7 +4160,6 @@ fn paste_after(cx: &mut Context) {
4238 Paste::After,
4160 Paste::After,
4239 cx.count(),
4161 cx.count(),
4240 );
4162 );
4241− exit_select_mode(cx);
4242}
4163}
4243
4164
4244fn paste_before(cx: &mut Context) {
4165fn paste_before(cx: &mut Context) {
@@ -4248,7 +4169,6 @@ fn paste_before(cx: &mut Context) {
4248 Paste::Before,
4169 Paste::Before,
4249 cx.count(),
4170 cx.count(),
4250 );
4171 );
4251− exit_select_mode(cx);
4252}
4172}
4253
4173
4254fn get_lines(doc: &Document, view_id: ViewId) -> Vec<usize> {
4174fn get_lines(doc: &Document, view_id: ViewId) -> Vec<usize> {
@@ -4287,7 +4207,6 @@ fn indent(cx: &mut Context) {
4287 }),
4207 }),
4288 );
4208 );
4289 doc.apply(&transaction, view.id);
4209 doc.apply(&transaction, view.id);
4290− exit_select_mode(cx);
4291}
4210}
4292
4211
4293fn unindent(cx: &mut Context) {
4212fn unindent(cx: &mut Context) {
@@ -4327,7 +4246,6 @@ fn unindent(cx: &mut Context) {
4327 let transaction = Transaction::change(doc.text(), changes.into_iter());
4246 let transaction = Transaction::change(doc.text(), changes.into_iter());
4328
4247
4329 doc.apply(&transaction, view.id);
4248 doc.apply(&transaction, view.id);
4330− exit_select_mode(cx);
4331}
4249}
4332
4250
4333fn format_selections(cx: &mut Context) {
4251fn format_selections(cx: &mut Context) {
@@ -4394,9 +4312,10 @@ fn join_selections_impl(cx: &mut Context, select_space: bool) {
4394 use movement::skip_while;
4312 use movement::skip_while;
4395 let (view, doc) = current!(cx.editor);
4313 let (view, doc) = current!(cx.editor);
4396 let text = doc.text();
4314 let text = doc.text();
4397− let slice = text.slice(..);
4315+ let slice = doc.text().slice(..);
4398
4316
4399 let mut changes = Vec::new();
4317 let mut changes = Vec::new();
4318+ let fragment = Tendril::from(" ");
4400
4319
4401 for selection in doc.selection(view.id) {
4320 for selection in doc.selection(view.id) {
4402 let (start, mut end) = selection.line_range(slice);
4321 let (start, mut end) = selection.line_range(slice);
@@ -4412,13 +4331,9 @@ fn join_selections_impl(cx: &mut Context, select_space: bool) {
4412 let mut end = text.line_to_char(line + 1);
4331 let mut end = text.line_to_char(line + 1);
4413 end = skip_while(slice, end, |ch| matches!(ch, ' ' | '\t')).unwrap_or(end);
4332 end = skip_while(slice, end, |ch| matches!(ch, ' ' | '\t')).unwrap_or(end);
4414
4333
4415− let separator = if end == line_end_char_index(&slice, line + 1) {
4334+ // need to skip from start, not end
4416− // the joining line contains only space-characters => don't include a whitespace when joining
4335+ let change = (start, end, Some(fragment.clone()));
4417− None
4418− } else {
4419− Some(Tendril::from(" "))
4420− };
4421− changes.push((start, end, separator));
4336+ changes.push(change);
4422 }
4337 }
4423 }
4338 }
4424
4339
@@ -4430,6 +4345,9 @@ fn join_selections_impl(cx: &mut Context, select_space: bool) {
4430 changes.sort_unstable_by_key(|(from, _to, _text)| *from);
4345 changes.sort_unstable_by_key(|(from, _to, _text)| *from);
4431 changes.dedup();
4346 changes.dedup();
4432
4347
4348+ // TODO: joining multiple empty lines should be replaced by a single space.
4349+ // need to merge change ranges that touch
4350+
4433 // select inserted spaces
4351 // select inserted spaces
4434 let transaction = if select_space {
4352 let transaction = if select_space {
4435 let ranges: SmallVec<_> = changes
4353 let ranges: SmallVec<_> = changes
@@ -4441,9 +4359,9 @@ fn join_selections_impl(cx: &mut Context, select_space: bool) {
4441 })
4359 })
4442 .collect();
4360 .collect();
4443 let selection = Selection::new(ranges, 0);
4361 let selection = Selection::new(ranges, 0);
4444− Transaction::change(text, changes.into_iter()).with_selection(selection)
4362+ Transaction::change(doc.text(), changes.into_iter()).with_selection(selection)
4445 } else {
4363 } else {
4446− Transaction::change(text, changes.into_iter())
4364+ Transaction::change(doc.text(), changes.into_iter())
4447 };
4365 };
4448
4366
4449 doc.apply(&transaction, view.id);
4367 doc.apply(&transaction, view.id);
@@ -5609,18 +5527,12 @@ fn shell(cx: &mut compositor::Context, cmd: &str, behavior: &ShellBehavior) {
5609 };
5527 };
5610
5528
5611 // These `usize`s cannot underflow because selection ranges cannot overlap.
5529 // These `usize`s cannot underflow because selection ranges cannot overlap.
5612− let anchor = to
5530+ // Once the MSRV is 1.66.0 (mixed_integer_ops is stabilized), we can use checked
5613− .checked_add_signed(offset)
5531+ // arithmetic to assert this.
5614− .expect("Selection ranges cannot overlap")
5532+ let anchor = (to as isize + offset - deleted_len as isize) as usize;
5615− .checked_sub(deleted_len)
5616− .expect("Selection ranges cannot overlap");
5617 let new_range = Range::new(anchor, anchor + output_len).with_direction(range.direction());
5533 let new_range = Range::new(anchor, anchor + output_len).with_direction(range.direction());
5618 ranges.push(new_range);
5534 ranges.push(new_range);
5619− offset = offset
5535+ offset = offset + output_len as isize - deleted_len as isize;
5620− .checked_add_unsigned(output_len)
5621− .expect("Selection ranges cannot overlap")
5622− .checked_sub_unsigned(deleted_len)
5623− .expect("Selection ranges cannot overlap");
5624
5536
5625 changes.push((from, to, Some(output)));
5537 changes.push((from, to, Some(output)));
5626 }
5538 }
@@ -5759,7 +5671,6 @@ fn increment_impl(cx: &mut Context, increment_direction: IncrementDirection) {
5759 let transaction = Transaction::change(doc.text(), changes.into_iter());
5671 let transaction = Transaction::change(doc.text(), changes.into_iter());
5760 let transaction = transaction.with_selection(new_selection);
5672 let transaction = transaction.with_selection(new_selection);
5761 doc.apply(&transaction, view.id);
5673 doc.apply(&transaction, view.id);
5762− exit_select_mode(cx);
5763 }
5674 }
5764}
5675}
5765
5676
helix-term/src/commands/dap.rs+2−7
@@ -8,7 +8,7 @@ use dap::{StackFrame, Thread, ThreadStates};
8use helix_core::syntax::{DebugArgumentValue, DebugConfigCompletion, DebugTemplate};
8use helix_core::syntax::{DebugArgumentValue, DebugConfigCompletion, DebugTemplate};
9use helix_dap::{self as dap, Client};
9use helix_dap::{self as dap, Client};
10use helix_lsp::block_on;
10use helix_lsp::block_on;
11−use helix_view::{editor::Breakpoint, graphics::Margin};
11+use helix_view::editor::Breakpoint;
12
12
13use serde_json::{to_value, Value};
13use serde_json::{to_value, Value};
14use tokio_stream::wrappers::UnboundedReceiverStream;
14use tokio_stream::wrappers::UnboundedReceiverStream;
@@ -581,12 +581,7 @@ pub fn dap_variables(cx: &mut Context) {
581 }
581 }
582
582
583 let contents = Text::from(tui::text::Text::from(variables));
583 let contents = Text::from(tui::text::Text::from(variables));
584− let margin = if cx.editor.popup_border() {
585− Margin::all(1)
586− } else {
587− Margin::none()
588− };
589− let popup = Popup::new("dap-variables", contents).margin(margin);
584+ let popup = Popup::new("dap-variables", contents);
590 cx.replace_or_push_layer("dap-variables", popup);
585 cx.replace_or_push_layer("dap-variables", popup);
591}
586}
592
587
helix-term/src/commands/lsp.rs+2−12
@@ -23,7 +23,6 @@ use helix_core::{
23use helix_view::{
23use helix_view::{
24 document::{DocumentInlayHints, DocumentInlayHintsId, Mode},
24 document::{DocumentInlayHints, DocumentInlayHintsId, Mode},
25 editor::Action,
25 editor::Action,
26− graphics::Margin,
27 theme::Style,
26 theme::Style,
28 Document, View,
27 Document, View,
29};
28};
@@ -50,7 +49,7 @@ use std::{
50/// If there is no configured language server that supports the feature, this displays a status message.
49/// If there is no configured language server that supports the feature, this displays a status message.
51/// Using this macro in a context where the editor automatically queries the LSP
50/// Using this macro in a context where the editor automatically queries the LSP
52/// (instead of when the user explicitly does so via a keybind like `gd`)
51/// (instead of when the user explicitly does so via a keybind like `gd`)
53−/// will spam the "No configured language server supports \<feature>" status message confusingly.
52+/// will spam the "No configured language server supports <feature>" status message confusingly.
54#[macro_export]
53#[macro_export]
55macro_rules! language_server_with_feature {
54macro_rules! language_server_with_feature {
56 ($editor:expr, $doc:expr, $feature:expr) => {{
55 ($editor:expr, $doc:expr, $feature:expr) => {{
@@ -745,16 +744,7 @@ pub fn code_action(cx: &mut Context) {
745 });
744 });
746 picker.move_down(); // pre-select the first item
745 picker.move_down(); // pre-select the first item
747
746
748− let margin = if editor.menu_border() {
749− Margin::vertical(1)
750− } else {
751− Margin::none()
752− };
753−
754− let popup = Popup::new("code-action", picker)
747+ let popup = Popup::new("code-action", picker).with_scrollbar(false);
755− .with_scrollbar(false)
756− .margin(margin);
757−
758 compositor.replace_or_push("code-action", popup);
748 compositor.replace_or_push("code-action", popup);
759 };
749 };
760
750
helix-term/src/commands/typed.rs+5−4
@@ -6,7 +6,6 @@ use crate::job::Job;
6use super::*;
6use super::*;
7
7
8use helix_core::fuzzy::fuzzy_match;
8use helix_core::fuzzy::fuzzy_match;
9−use helix_core::indent::MAX_INDENT;
10use helix_core::{encoding, line_ending, path::get_canonicalized_path, shellwords::Shellwords};
9use helix_core::{encoding, line_ending, path::get_canonicalized_path, shellwords::Shellwords};
11use helix_lsp::{OffsetEncoding, Url};
10use helix_lsp::{OffsetEncoding, Url};
12use helix_view::document::DEFAULT_LANGUAGE_NAME;
11use helix_view::document::DEFAULT_LANGUAGE_NAME;
@@ -477,7 +476,8 @@ fn set_indent_style(
477 cx.editor.set_status(match style {
476 cx.editor.set_status(match style {
478 Tabs => "tabs".to_owned(),
477 Tabs => "tabs".to_owned(),
479 Spaces(1) => "1 space".to_owned(),
478 Spaces(1) => "1 space".to_owned(),
480− Spaces(n) => format!("{} spaces", n),
479+ Spaces(n) if (2..=8).contains(&n) => format!("{} spaces", n),
480+ _ => unreachable!(), // Shouldn't happen.
481 });
481 });
482 return Ok(());
482 return Ok(());
483 }
483 }
@@ -489,7 +489,7 @@ fn set_indent_style(
489 Some(arg) => arg
489 Some(arg) => arg
490 .parse::<u8>()
490 .parse::<u8>()
491 .ok()
491 .ok()
492− .filter(|n| (1..=MAX_INDENT).contains(n))
492+ .filter(|n| (1..=8).contains(n))
493 .map(Spaces),
493 .map(Spaces),
494 _ => None,
494 _ => None,
495 };
495 };
@@ -574,6 +574,7 @@ fn set_line_ending(
574
574
575 Ok(())
575 Ok(())
576}
576}
577+
577fn earlier(
578fn earlier(
578 cx: &mut compositor::Context,
579 cx: &mut compositor::Context,
579 args: &[Cow<str>],
580 args: &[Cow<str>],
@@ -2605,7 +2606,7 @@ pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[
2605 TypableCommand {
2606 TypableCommand {
2606 name: "indent-style",
2607 name: "indent-style",
2607 aliases: &[],
2608 aliases: &[],
2608− doc: "Set the indentation style for editing. ('t' for tabs or 1-16 for number of spaces.)",
2609+ doc: "Set the indentation style for editing. ('t' for tabs or 1-8 for number of spaces.)",
2609 fun: set_indent_style,
2610 fun: set_indent_style,
2610 signature: CommandSignature::none(),
2611 signature: CommandSignature::none(),
2611 },
2612 },
helix-term/src/main.rs+5−7
@@ -116,18 +116,16 @@ FLAGS:
116
116
117 setup_logging(args.verbosity).context("failed to initialize logging")?;
117 setup_logging(args.verbosity).context("failed to initialize logging")?;
118
118
119− // Before setting the working directory, resolve all the paths in args.files
120− for (path, _) in args.files.iter_mut() {
121− *path = helix_core::path::get_canonicalized_path(path);
122− }
123−
124 // NOTE: Set the working directory early so the correct configuration is loaded. Be aware that
119 // NOTE: Set the working directory early so the correct configuration is loaded. Be aware that
125 // Application::new() depends on this logic so it must be updated if this changes.
120 // Application::new() depends on this logic so it must be updated if this changes.
126 if let Some(path) = &args.working_directory {
121 if let Some(path) = &args.working_directory {
127 helix_loader::set_current_working_dir(path)?;
122 helix_loader::set_current_working_dir(path)?;
123+ }
124+
125+ // If the first file is a directory, it will be the working directory and a file picker will be opened
128− } else if let Some((path, _)) = args.files.first().filter(|p| p.0.is_dir()) {
126+ if let Some((path, _)) = args.files.first().filter(|p| p.0.is_dir()) {
129− // If the first file is a directory, it will be the working directory unless -w was specified
130 helix_loader::set_current_working_dir(path)?;
127 helix_loader::set_current_working_dir(path)?;
128+ args.open_cwd = true; // Signal Application that we want to open the picker on "."
131 }
129 }
132
130
133 let config = match Config::load_default() {
131 let config = match Config::load_default() {
helix-term/src/ui/completion.rs+1−17
@@ -2,7 +2,6 @@ use crate::compositor::{Component, Context, Event, EventResult};
2use helix_view::{
2use helix_view::{
3 document::SavePoint,
3 document::SavePoint,
4 editor::CompleteAction,
4 editor::CompleteAction,
5− graphics::Margin,
6 theme::{Modifier, Style},
5 theme::{Modifier, Style},
7 ViewId,
6 ViewId,
8};
7};
@@ -327,18 +326,9 @@ impl Completion {
327 }
326 }
328 };
327 };
329 });
328 });
330−
331− let margin = if editor.menu_border() {
332− Margin::vertical(1)
333− } else {
334− Margin::none()
335− };
336−
337 let popup = Popup::new(Self::ID, menu)
329 let popup = Popup::new(Self::ID, menu)
338 .with_scrollbar(false)
330 .with_scrollbar(false)
339− .ignore_escape_key(true)
331+ .ignore_escape_key(true);
340− .margin(margin);
341−
342 let mut completion = Self {
332 let mut completion = Self {
343 popup,
333 popup,
344 start_offset,
334 start_offset,
@@ -579,12 +569,6 @@ impl Component for Completion {
579 // clear area
569 // clear area
580 let background = cx.editor.theme.get("ui.popup");
570 let background = cx.editor.theme.get("ui.popup");
581 surface.clear_with(doc_area, background);
571 surface.clear_with(doc_area, background);
582−
583− if cx.editor.popup_border() {
584− use tui::widgets::{Block, Borders, Widget};
585− Widget::render(Block::default().borders(Borders::ALL), doc_area, surface);
586− }
587−
588 markdown_doc.render(doc_area, surface, cx);
572 markdown_doc.render(doc_area, surface, cx);
589 }
573 }
590}
574}
helix-term/src/ui/document.rs+24−60
@@ -97,8 +97,7 @@ pub fn render_document(
97 doc: &Document,
97 doc: &Document,
98 offset: ViewPosition,
98 offset: ViewPosition,
99 doc_annotations: &TextAnnotations,
99 doc_annotations: &TextAnnotations,
100− syntax_highlight_iter: impl Iterator<Item = HighlightEvent>,
101− overlay_highlight_iter: impl Iterator<Item = HighlightEvent>,
100+ highlight_iter: impl Iterator<Item = HighlightEvent>,
102 theme: &Theme,
101 theme: &Theme,
103 line_decoration: &mut [Box<dyn LineDecoration + '_>],
102 line_decoration: &mut [Box<dyn LineDecoration + '_>],
104 translated_positions: &mut [TranslatedPosition],
103 translated_positions: &mut [TranslatedPosition],
@@ -110,8 +109,7 @@ pub fn render_document(
110 offset,
109 offset,
111 &doc.text_format(viewport.width, Some(theme)),
110 &doc.text_format(viewport.width, Some(theme)),
112 doc_annotations,
111 doc_annotations,
113− syntax_highlight_iter,
112+ highlight_iter,
114− overlay_highlight_iter,
115 theme,
113 theme,
116 line_decoration,
114 line_decoration,
117 translated_positions,
115 translated_positions,
@@ -159,8 +157,7 @@ pub fn render_text<'t>(
159 offset: ViewPosition,
157 offset: ViewPosition,
160 text_fmt: &TextFormat,
158 text_fmt: &TextFormat,
161 text_annotations: &TextAnnotations,
159 text_annotations: &TextAnnotations,
162− syntax_highlight_iter: impl Iterator<Item = HighlightEvent>,
163− overlay_highlight_iter: impl Iterator<Item = HighlightEvent>,
160+ highlight_iter: impl Iterator<Item = HighlightEvent>,
164 theme: &Theme,
161 theme: &Theme,
165 line_decorations: &mut [Box<dyn LineDecoration + '_>],
162 line_decorations: &mut [Box<dyn LineDecoration + '_>],
166 translated_positions: &mut [TranslatedPosition],
163 translated_positions: &mut [TranslatedPosition],
@@ -181,16 +178,10 @@ pub fn render_text<'t>(
181
178
182 let (mut formatter, mut first_visible_char_idx) =
179 let (mut formatter, mut first_visible_char_idx) =
183 DocumentFormatter::new_at_prev_checkpoint(text, text_fmt, text_annotations, offset.anchor);
180 DocumentFormatter::new_at_prev_checkpoint(text, text_fmt, text_annotations, offset.anchor);
184− let mut syntax_styles = StyleIter {
181+ let mut styles = StyleIter {
185 text_style: renderer.text_style,
182 text_style: renderer.text_style,
186 active_highlights: Vec::with_capacity(64),
183 active_highlights: Vec::with_capacity(64),
187− highlight_iter: syntax_highlight_iter,
184+ highlight_iter,
188− theme,
189− };
190− let mut overlay_styles = StyleIter {
191− text_style: Style::default(),
192− active_highlights: Vec::with_capacity(64),
193− highlight_iter: overlay_highlight_iter,
194 theme,
185 theme,
195 };
186 };
196
187
@@ -202,10 +193,7 @@ pub fn render_text<'t>(
202 };
193 };
203 let mut is_in_indent_area = true;
194 let mut is_in_indent_area = true;
204 let mut last_line_indent_level = 0;
195 let mut last_line_indent_level = 0;
205− let mut syntax_style_span = syntax_styles
196+ let mut style_span = styles
206− .next()
207− .unwrap_or_else(|| (Style::default(), usize::MAX));
208− let mut overlay_style_span = overlay_styles
209 .next()
197 .next()
210 .unwrap_or_else(|| (Style::default(), usize::MAX));
198 .unwrap_or_else(|| (Style::default(), usize::MAX));
211
199
@@ -233,16 +221,9 @@ pub fn render_text<'t>(
233
221
234 // skip any graphemes on visual lines before the block start
222 // skip any graphemes on visual lines before the block start
235 if pos.row < row_off {
223 if pos.row < row_off {
236− if char_pos >= syntax_style_span.1 {
224+ if char_pos >= style_span.1 {
237− syntax_style_span = if let Some(syntax_style_span) = syntax_styles.next() {
225+ style_span = if let Some(style_span) = styles.next() {
238− syntax_style_span
226+ style_span
239− } else {
240− break;
241− }
242− }
243− if char_pos >= overlay_style_span.1 {
244− overlay_style_span = if let Some(overlay_style_span) = overlay_styles.next() {
245− overlay_style_span
246 } else {
227 } else {
247 break;
228 break;
248 }
229 }
@@ -279,15 +260,8 @@ pub fn render_text<'t>(
279 }
260 }
280
261
281 // acquire the correct grapheme style
262 // acquire the correct grapheme style
282− if char_pos >= syntax_style_span.1 {
263+ if char_pos >= style_span.1 {
283− syntax_style_span = syntax_styles
284− .next()
285− .unwrap_or((Style::default(), usize::MAX));
286− }
287− if char_pos >= overlay_style_span.1 {
288− overlay_style_span = overlay_styles
289− .next()
290− .unwrap_or((Style::default(), usize::MAX));
264+ style_span = styles.next().unwrap_or((Style::default(), usize::MAX));
291 }
265 }
292 char_pos += grapheme.doc_chars();
266 char_pos += grapheme.doc_chars();
293
267
@@ -301,25 +275,22 @@ pub fn render_text<'t>(
301 pos,
275 pos,
302 );
276 );
303
277
304− let (syntax_style, overlay_style) =
305− if let GraphemeSource::VirtualText { highlight } = grapheme.source {
278+ let grapheme_style = if let GraphemeSource::VirtualText { highlight } = grapheme.source {
306− let mut style = renderer.text_style;
279+ let style = renderer.text_style;
307− if let Some(highlight) = highlight {
280+ if let Some(highlight) = highlight {
308− style = style.patch(theme.highlight(highlight.0))
281+ style.patch(theme.highlight(highlight.0))
309− }
310− (style, Style::default())
311 } else {
282 } else {
312− (syntax_style_span.0, overlay_style_span.0)
283+ style
284+ }
285+ } else {
286+ style_span.0
313− };
287+ };
314
288
315− let is_virtual = grapheme.is_virtual();
289+ let virt = grapheme.is_virtual();
316 renderer.draw_grapheme(
290 renderer.draw_grapheme(
317 grapheme.grapheme,
291 grapheme.grapheme,
318− GraphemeStyle {
292+ grapheme_style,
319− syntax_style,
293+ virt,
320− overlay_style,
321− },
322− is_virtual,
323 &mut last_line_indent_level,
294 &mut last_line_indent_level,
324 &mut is_in_indent_area,
295 &mut is_in_indent_area,
325 pos,
296 pos,
@@ -351,11 +322,6 @@ pub struct TextRenderer<'a> {
351 pub viewport: Rect,
322 pub viewport: Rect,
352}
323}
353
324
354−pub struct GraphemeStyle {
355− syntax_style: Style,
356− overlay_style: Style,
357−}
358−
359impl<'a> TextRenderer<'a> {
325impl<'a> TextRenderer<'a> {
360 pub fn new(
326 pub fn new(
361 surface: &'a mut Surface,
327 surface: &'a mut Surface,
@@ -429,7 +395,7 @@ impl<'a> TextRenderer<'a> {
429 pub fn draw_grapheme(
395 pub fn draw_grapheme(
430 &mut self,
396 &mut self,
431 grapheme: Grapheme,
397 grapheme: Grapheme,
432− grapheme_style: GraphemeStyle,
398+ mut style: Style,
433 is_virtual: bool,
399 is_virtual: bool,
434 last_indent_level: &mut usize,
400 last_indent_level: &mut usize,
435 is_in_indent_area: &mut bool,
401 is_in_indent_area: &mut bool,
@@ -439,11 +405,9 @@ impl<'a> TextRenderer<'a> {
439 let is_whitespace = grapheme.is_whitespace();
405 let is_whitespace = grapheme.is_whitespace();
440
406
441 // TODO is it correct to apply the whitespace style to all unicode white spaces?
407 // TODO is it correct to apply the whitespace style to all unicode white spaces?
442− let mut style = grapheme_style.syntax_style;
443 if is_whitespace {
408 if is_whitespace {
444 style = style.patch(self.whitespace_style);
409 style = style.patch(self.whitespace_style);
445 }
410 }
446− style = style.patch(grapheme_style.overlay_style);
447
411
448 let width = grapheme.width();
412 let width = grapheme.width();
449 let space = if is_virtual { " " } else { &self.space };
413 let space = if is_virtual { " " } else { &self.space };
helix-term/src/ui/editor.rs+43−76
@@ -124,20 +124,16 @@ impl EditorView {
124 line_decorations.push(Box::new(line_decoration));
124 line_decorations.push(Box::new(line_decoration));
125 }
125 }
126
126
127− let syntax_highlights =
127+ let mut highlights =
128 Self::doc_syntax_highlights(doc, view.offset.anchor, inner.height, theme);
128 Self::doc_syntax_highlights(doc, view.offset.anchor, inner.height, theme);
129−
130− let mut overlay_highlights =
129+ let overlay_highlights = Self::overlay_syntax_highlights(
131− Self::empty_highlight_iter(doc, view.offset.anchor, inner.height);
132− let overlay_syntax_highlights = Self::overlay_syntax_highlights(
133 doc,
130 doc,
134 view.offset.anchor,
131 view.offset.anchor,
135 inner.height,
132 inner.height,
136 &text_annotations,
133 &text_annotations,
137 );
134 );
138− if !overlay_syntax_highlights.is_empty() {
135+ if !overlay_highlights.is_empty() {
139− overlay_highlights =
136+ highlights = Box::new(syntax::merge(highlights, overlay_highlights));
140− Box::new(syntax::merge(overlay_highlights, overlay_syntax_highlights));
141 }
137 }
142
138
143 for diagnostic in Self::doc_diagnostics_highlights(doc, theme) {
139 for diagnostic in Self::doc_diagnostics_highlights(doc, theme) {
@@ -146,28 +142,29 @@ impl EditorView {
146 if diagnostic.is_empty() {
142 if diagnostic.is_empty() {
147 continue;
143 continue;
148 }
144 }
149− overlay_highlights = Box::new(syntax::merge(overlay_highlights, diagnostic));
145+ highlights = Box::new(syntax::merge(highlights, diagnostic));
150 }
146 }
151
147
152− if is_focused {
148+ let highlights: Box<dyn Iterator<Item = HighlightEvent>> = if is_focused {
153 let highlights = syntax::merge(
149 let highlights = syntax::merge(
154− overlay_highlights,
150+ highlights,
155 Self::doc_selection_highlights(
151 Self::doc_selection_highlights(
156 editor.mode(),
152 editor.mode(),
157 doc,
153 doc,
158 view,
154 view,
159 theme,
155 theme,
160 &config.cursor_shape,
156 &config.cursor_shape,
161− self.terminal_focused,
162 ),
157 ),
163 );
158 );
164 let focused_view_elements = Self::highlight_focused_view_elements(view, doc, theme);
159 let focused_view_elements = Self::highlight_focused_view_elements(view, doc, theme);
165 if focused_view_elements.is_empty() {
160 if focused_view_elements.is_empty() {
166− overlay_highlights = Box::new(highlights)
161+ Box::new(highlights)
167 } else {
162 } else {
168− overlay_highlights = Box::new(syntax::merge(highlights, focused_view_elements))
163+ Box::new(syntax::merge(highlights, focused_view_elements))
169 }
164 }
170− }
165+ } else {
166+ Box::new(highlights)
167+ };
171
168
172 let gutter_overflow = view.gutter_offset(doc) == 0;
169 let gutter_overflow = view.gutter_offset(doc) == 0;
173 if !gutter_overflow {
170 if !gutter_overflow {
@@ -200,8 +197,7 @@ impl EditorView {
200 doc,
197 doc,
201 view.offset,
198 view.offset,
202 &text_annotations,
199 &text_annotations,
203− syntax_highlights,
200+ highlights,
204− overlay_highlights,
205 theme,
201 theme,
206 &mut line_decorations,
202 &mut line_decorations,
207 &mut translated_positions,
203 &mut translated_positions,
@@ -261,39 +257,27 @@ impl EditorView {
261 .for_each(|area| surface.set_style(area, ruler_theme))
257 .for_each(|area| surface.set_style(area, ruler_theme))
262 }
258 }
263
259
264− fn viewport_byte_range(
260+ pub fn overlay_syntax_highlights(
265− text: helix_core::RopeSlice,
266− row: usize,
267− height: u16,
268− ) -> std::ops::Range<usize> {
269− // Calculate viewport byte ranges:
270− // Saturating subs to make it inclusive zero indexing.
271− let last_line = text.len_lines().saturating_sub(1);
272− let last_visible_line = (row + height as usize).saturating_sub(1).min(last_line);
273− let start = text.line_to_byte(row.min(last_line));
274− let end = text.line_to_byte(last_visible_line + 1);
275−
276− start..end
277− }
278−
279− pub fn empty_highlight_iter(
280 doc: &Document,
261 doc: &Document,
281 anchor: usize,
262 anchor: usize,
282 height: u16,
263 height: u16,
283− ) -> Box<dyn Iterator<Item = HighlightEvent>> {
264+ text_annotations: &TextAnnotations,
265+ ) -> Vec<(usize, std::ops::Range<usize>)> {
284 let text = doc.text().slice(..);
266 let text = doc.text().slice(..);
285 let row = text.char_to_line(anchor.min(text.len_chars()));
267 let row = text.char_to_line(anchor.min(text.len_chars()));
286
268
269+ let range = {
287− // Calculate viewport byte ranges:
270+ // Calculate viewport byte ranges:
288− // Saturating subs to make it inclusive zero indexing.
271+ // Saturating subs to make it inclusive zero indexing.
289− let range = Self::viewport_byte_range(text, row, height);
272+ let last_line = text.len_lines().saturating_sub(1);
290− Box::new(
273+ let last_visible_line = (row + height as usize).saturating_sub(1).min(last_line);
291− [HighlightEvent::Source {
274+ let start = text.line_to_byte(row.min(last_line));
292− start: text.byte_to_char(range.start),
275+ let end = text.line_to_byte(last_visible_line + 1);
293− end: text.byte_to_char(range.end),
276+
277+ start..end
294− }]
278+ };
295− .into_iter(),
279+
296− )
280+ text_annotations.collect_overlay_highlights(range)
297 }
281 }
298
282
299 /// Get syntax highlights for a document in a view represented by the first line
283 /// Get syntax highlights for a document in a view represented by the first line
@@ -308,7 +292,16 @@ impl EditorView {
308 let text = doc.text().slice(..);
292 let text = doc.text().slice(..);
309 let row = text.char_to_line(anchor.min(text.len_chars()));
293 let row = text.char_to_line(anchor.min(text.len_chars()));
310
294
311− let range = Self::viewport_byte_range(text, row, height);
295+ let range = {
296+ // Calculate viewport byte ranges:
297+ // Saturating subs to make it inclusive zero indexing.
298+ let last_line = text.len_lines().saturating_sub(1);
299+ let last_visible_line = (row + height as usize).saturating_sub(1).min(last_line);
300+ let start = text.line_to_byte(row.min(last_line));
301+ let end = text.line_to_byte(last_visible_line + 1);
302+
303+ start..end
304+ };
312
305
313 match doc.syntax() {
306 match doc.syntax() {
314 Some(syntax) => {
307 Some(syntax) => {
@@ -341,20 +334,6 @@ impl EditorView {
341 }
334 }
342 }
335 }
343
336
344− pub fn overlay_syntax_highlights(
345− doc: &Document,
346− anchor: usize,
347− height: u16,
348− text_annotations: &TextAnnotations,
349− ) -> Vec<(usize, std::ops::Range<usize>)> {
350− let text = doc.text().slice(..);
351− let row = text.char_to_line(anchor.min(text.len_chars()));
352−
353− let range = Self::viewport_byte_range(text, row, height);
354−
355− text_annotations.collect_overlay_highlights(range)
356− }
357−
358 /// Get highlight spans for document diagnostics
337 /// Get highlight spans for document diagnostics
359 pub fn doc_diagnostics_highlights(
338 pub fn doc_diagnostics_highlights(
360 doc: &Document,
339 doc: &Document,
@@ -421,7 +400,6 @@ impl EditorView {
421 view: &View,
400 view: &View,
422 theme: &Theme,
401 theme: &Theme,
423 cursor_shape_config: &CursorShapeConfig,
402 cursor_shape_config: &CursorShapeConfig,
424− is_terminal_focused: bool,
425 ) -> Vec<(usize, std::ops::Range<usize>)> {
403 ) -> Vec<(usize, std::ops::Range<usize>)> {
426 let text = doc.text().slice(..);
404 let text = doc.text().slice(..);
427 let selection = doc.selection(view.id);
405 let selection = doc.selection(view.id);
@@ -469,7 +447,7 @@ impl EditorView {
469
447
470 // Special-case: cursor at end of the rope.
448 // Special-case: cursor at end of the rope.
471 if range.head == range.anchor && range.head == text.len_chars() {
449 if range.head == range.anchor && range.head == text.len_chars() {
472− if !selection_is_primary || (cursor_is_block && is_terminal_focused) {
450+ if !selection_is_primary || cursor_is_block {
473 // Bar and underline cursors are drawn by the terminal
451 // Bar and underline cursors are drawn by the terminal
474 // BUG: If the editor area loses focus while having a bar or
452 // BUG: If the editor area loses focus while having a bar or
475 // underline cursor (eg. when a regex prompt has focus) then
453 // underline cursor (eg. when a regex prompt has focus) then
@@ -492,17 +470,13 @@ impl EditorView {
492 cursor_start
470 cursor_start
493 };
471 };
494 spans.push((selection_scope, range.anchor..selection_end));
472 spans.push((selection_scope, range.anchor..selection_end));
495− // add block cursors
496− // skip primary cursor if terminal is unfocused - crossterm cursor is used in that case
497− if !selection_is_primary || (cursor_is_block && is_terminal_focused) {
473+ if !selection_is_primary || cursor_is_block {
498 spans.push((cursor_scope, cursor_start..range.head));
474 spans.push((cursor_scope, cursor_start..range.head));
499 }
475 }
500 } else {
476 } else {
501 // Reverse case.
477 // Reverse case.
502 let cursor_end = next_grapheme_boundary(text, range.head);
478 let cursor_end = next_grapheme_boundary(text, range.head);
503− // add block cursors
504− // skip primary cursor if terminal is unfocused - crossterm cursor is used in that case
505− if !selection_is_primary || (cursor_is_block && is_terminal_focused) {
479+ if !selection_is_primary || cursor_is_block {
506 spans.push((cursor_scope, range.head..cursor_end));
480 spans.push((cursor_scope, range.head..cursor_end));
507 }
481 }
508 // non block cursors look like they exclude the cursor
482 // non block cursors look like they exclude the cursor
@@ -1526,15 +1500,8 @@ impl Component for EditorView {
1526
1500
1527 fn cursor(&self, _area: Rect, editor: &Editor) -> (Option<Position>, CursorKind) {
1501 fn cursor(&self, _area: Rect, editor: &Editor) -> (Option<Position>, CursorKind) {
1528 match editor.cursor() {
1502 match editor.cursor() {
1529− // all block cursors are drawn manually
1503+ // All block cursors are drawn manually
1530− (pos, CursorKind::Block) => {
1531− if self.terminal_focused {
1532− (pos, CursorKind::Hidden)
1504+ (pos, CursorKind::Block) => (pos, CursorKind::Hidden),
1533− } else {
1534− // use crossterm cursor when terminal loses focus
1535− (pos, CursorKind::Underline)
1536− }
1537− }
1538 cursor => cursor,
1505 cursor => cursor,
1539 }
1506 }
1540 }
1507 }
helix-term/src/ui/lsp.rs+1−3
@@ -92,9 +92,7 @@ impl Component for SignatureHelp {
92 Some(doc) => Markdown::new(doc.clone(), Arc::clone(&self.config_loader)),
92 Some(doc) => Markdown::new(doc.clone(), Arc::clone(&self.config_loader)),
93 };
93 };
94 let sig_doc = sig_doc.parse(Some(&cx.editor.theme));
94 let sig_doc = sig_doc.parse(Some(&cx.editor.theme));
95− let sig_doc_area = area
96− .clip_top(sig_text_area.height + 2)
95+ let sig_doc_area = area.clip_top(sig_text_area.height + 2);
97− .clip_bottom(u16::from(cx.editor.popup_border()));
98 let sig_doc_para = Paragraph::new(sig_doc)
96 let sig_doc_para = Paragraph::new(sig_doc)
99 .wrap(Wrap { trim: false })
97 .wrap(Wrap { trim: false })
100 .scroll((cx.scroll.unwrap_or_default() as u16, 0));
98 .scroll((cx.scroll.unwrap_or_default() as u16, 0));
helix-term/src/ui/menu.rs+13−34
@@ -7,18 +7,11 @@ use crate::{
7use helix_core::fuzzy::MATCHER;
7use helix_core::fuzzy::MATCHER;
8use nucleo::pattern::{Atom, AtomKind, CaseMatching};
8use nucleo::pattern::{Atom, AtomKind, CaseMatching};
9use nucleo::{Config, Utf32Str};
9use nucleo::{Config, Utf32Str};
10−use tui::{
11− buffer::Buffer as Surface,
10+use tui::{buffer::Buffer as Surface, widgets::Table};
12− widgets::{Block, Borders, Table, Widget},
13−};
14
11
15pub use tui::widgets::{Cell, Row};
12pub use tui::widgets::{Cell, Row};
16
13
17−use helix_view::{
18− editor::SmartTabConfig,
14+use helix_view::{editor::SmartTabConfig, graphics::Rect, Editor};
19− graphics::{Margin, Rect},
20− Editor,
21−};
22use tui::layout::Constraint;
15use tui::layout::Constraint;
23
16
24pub trait Item: Sync + Send + 'static {
17pub trait Item: Sync + Send + 'static {
@@ -329,15 +322,6 @@ impl<T: Item + 'static> Component for Menu<T> {
329 let selected = theme.get("ui.menu.selected");
322 let selected = theme.get("ui.menu.selected");
330 surface.clear_with(area, style);
323 surface.clear_with(area, style);
331
324
332− let render_borders = cx.editor.menu_border();
333−
334− let area = if render_borders {
335− Widget::render(Block::default().borders(Borders::ALL), area, surface);
336− area.inner(&Margin::vertical(1))
337− } else {
338− area
339− };
340−
341 let scroll = self.scroll;
325 let scroll = self.scroll;
342
326
343 let options: Vec<_> = self
327 let options: Vec<_> = self
@@ -378,19 +362,15 @@ impl<T: Item + 'static> Component for Menu<T> {
378 false,
362 false,
379 );
363 );
380
364
381− let render_borders = cx.editor.menu_border();
382−
383− if !render_borders {
384− if let Some(cursor) = self.cursor {
365+ if let Some(cursor) = self.cursor {
385− let offset_from_top = cursor - scroll;
366+ let offset_from_top = cursor - scroll;
386− let left = &mut surface[(area.left(), area.y + offset_from_top as u16)];
367+ let left = &mut surface[(area.left(), area.y + offset_from_top as u16)];
387− left.set_style(selected);
368+ left.set_style(selected);
388− let right = &mut surface[(
369+ let right = &mut surface[(
389− area.right().saturating_sub(1),
370+ area.right().saturating_sub(1),
390− area.y + offset_from_top as u16,
371+ area.y + offset_from_top as u16,
391− )];
372+ )];
392− right.set_style(selected);
373+ right.set_style(selected);
393− }
394 }
374 }
395
375
396 let fits = len <= win_height;
376 let fits = len <= win_height;
@@ -405,13 +385,12 @@ impl<T: Item + 'static> Component for Menu<T> {
405 for i in 0..win_height {
385 for i in 0..win_height {
406 cell = &mut surface[(area.right() - 1, area.top() + i as u16)];
386 cell = &mut surface[(area.right() - 1, area.top() + i as u16)];
407
387
408− let half_block = if render_borders { "▌" } else { "▐" };
388+ cell.set_symbol("▐"); // right half block
409
389
410 if scroll_line <= i && i < scroll_line + scroll_height {
390 if scroll_line <= i && i < scroll_line + scroll_height {
411 // Draw scroll thumb
391 // Draw scroll thumb
412− cell.set_symbol(half_block);
413 cell.set_fg(scroll_style.fg.unwrap_or(helix_view::theme::Color::Reset));
392 cell.set_fg(scroll_style.fg.unwrap_or(helix_view::theme::Color::Reset));
414− } else if !render_borders {
393+ } else {
415 // Draw scroll track
394 // Draw scroll track
416 cell.set_fg(scroll_style.bg.unwrap_or(helix_view::theme::Color::Reset));
395 cell.set_fg(scroll_style.bg.unwrap_or(helix_view::theme::Color::Reset));
417 }
396 }
helix-term/src/ui/picker.rs+3−7
@@ -736,20 +736,17 @@ impl<T: Item + 'static> Picker<T> {
736 }
736 }
737 }
737 }
738
738
739− let syntax_highlights = EditorView::doc_syntax_highlights(
739+ let mut highlights = EditorView::doc_syntax_highlights(
740 doc,
740 doc,
741 offset.anchor,
741 offset.anchor,
742 area.height,
742 area.height,
743 &cx.editor.theme,
743 &cx.editor.theme,
744 );
744 );
745−
746− let mut overlay_highlights =
747− EditorView::empty_highlight_iter(doc, offset.anchor, area.height);
748 for spans in EditorView::doc_diagnostics_highlights(doc, &cx.editor.theme) {
745 for spans in EditorView::doc_diagnostics_highlights(doc, &cx.editor.theme) {
749 if spans.is_empty() {
746 if spans.is_empty() {
750 continue;
747 continue;
751 }
748 }
752− overlay_highlights = Box::new(helix_core::syntax::merge(overlay_highlights, spans));
749+ highlights = Box::new(helix_core::syntax::merge(highlights, spans));
753 }
750 }
754 let mut decorations: Vec<Box<dyn LineDecoration>> = Vec::new();
751 let mut decorations: Vec<Box<dyn LineDecoration>> = Vec::new();
755
752
@@ -780,8 +777,7 @@ impl<T: Item + 'static> Picker<T> {
780 offset,
777 offset,
781 // TODO: compute text annotations asynchronously here (like inlay hints)
778 // TODO: compute text annotations asynchronously here (like inlay hints)
782 &TextAnnotations::default(),
779 &TextAnnotations::default(),
783− syntax_highlights,
780+ highlights,
784− overlay_highlights,
785 &cx.editor.theme,
781 &cx.editor.theme,
786 &mut decorations,
782 &mut decorations,
787 &mut [],
783 &mut [],
helix-term/src/ui/popup.rs+7−27
@@ -3,10 +3,7 @@ use crate::{
3 compositor::{Callback, Component, Context, Event, EventResult},
3 compositor::{Callback, Component, Context, Event, EventResult},
4 ctrl, key,
4 ctrl, key,
5};
5};
6−use tui::{
7− buffer::Buffer as Surface,
6+use tui::buffer::Buffer as Surface;
8− widgets::{Block, Borders, Widget},
9−};
10
7
11use helix_core::Position;
8use helix_core::Position;
12use helix_view::{
9use helix_view::{
@@ -255,29 +252,13 @@ impl<T: Component> Component for Popup<T> {
255 let background = cx.editor.theme.get("ui.popup");
252 let background = cx.editor.theme.get("ui.popup");
256 surface.clear_with(area, background);
253 surface.clear_with(area, background);
257
254
258− let render_borders = cx.editor.popup_border();
259−
260− let inner = if self
261− .contents
262− .type_name()
263− .starts_with("helix_term::ui::menu::Menu")
264− {
265− area
266− } else {
267− area.inner(&self.margin)
255+ let inner = area.inner(&self.margin);
268− };
269−
270− let border = usize::from(render_borders);
271− if render_borders {
272− Widget::render(Block::default().borders(Borders::ALL), area, surface);
273− }
274−
275 self.contents.render(inner, surface, cx);
256 self.contents.render(inner, surface, cx);
276
257
277 // render scrollbar if contents do not fit
258 // render scrollbar if contents do not fit
278 if self.has_scrollbar {
259 if self.has_scrollbar {
279− let win_height = (inner.height as usize).saturating_sub(2 * border);
260+ let win_height = inner.height as usize;
280− let len = (self.child_size.1 as usize).saturating_sub(2 * border);
261+ let len = self.child_size.1 as usize;
281 let fits = len <= win_height;
262 let fits = len <= win_height;
282 let scroll = self.scroll;
263 let scroll = self.scroll;
283 let scroll_style = cx.editor.theme.get("ui.menu.scroll");
264 let scroll_style = cx.editor.theme.get("ui.menu.scroll");
@@ -293,15 +274,14 @@ impl<T: Component> Component for Popup<T> {
293
274
294 let mut cell;
275 let mut cell;
295 for i in 0..win_height {
276 for i in 0..win_height {
296− cell = &mut surface[(inner.right() - 1, inner.top() + (border + i) as u16)];
277+ cell = &mut surface[(inner.right() - 1, inner.top() + i as u16)];
297
278
298− let half_block = if render_borders { "▌" } else { "▐" };
279+ cell.set_symbol("▐"); // right half block
299
280
300 if scroll_line <= i && i < scroll_line + scroll_height {
281 if scroll_line <= i && i < scroll_line + scroll_height {
301 // Draw scroll thumb
282 // Draw scroll thumb
302− cell.set_symbol(half_block);
303 cell.set_fg(scroll_style.fg.unwrap_or(helix_view::theme::Color::Reset));
283 cell.set_fg(scroll_style.fg.unwrap_or(helix_view::theme::Color::Reset));
304− } else if !render_borders {
284+ } else {
305 // Draw scroll track
285 // Draw scroll track
306 cell.set_fg(scroll_style.bg.unwrap_or(helix_view::theme::Color::Reset));
286 cell.set_fg(scroll_style.bg.unwrap_or(helix_view::theme::Color::Reset));
307 }
287 }
helix-term/tests/test/commands.rs−46
@@ -480,49 +480,3 @@ fn bar() {#(\n|)#\
480
480
481 Ok(())
481 Ok(())
482}
482}
483−
484−#[tokio::test(flavor = "multi_thread")]
485−async fn test_join_selections() -> anyhow::Result<()> {
486− // normal join
487− test((
488− platform_line(indoc! {"\
489− #[a|]#bc
490− def
491− "}),
492− "J",
493− platform_line(indoc! {"\
494− #[a|]#bc def
495− "}),
496− ))
497− .await?;
498−
499− // join with empty line
500− test((
501− platform_line(indoc! {"\
502− #[a|]#bc
503−
504− def
505− "}),
506− "JJ",
507− platform_line(indoc! {"\
508− #[a|]#bc def
509− "}),
510− ))
511− .await?;
512−
513− // join with additional space in non-empty line
514− test((
515− platform_line(indoc! {"\
516− #[a|]#bc
517−
518− def
519− "}),
520− "JJ",
521− platform_line(indoc! {"\
522− #[a|]#bc def
523− "}),
524− ))
525− .await?;
526−
527− Ok(())
528−}
helix-tui/Cargo.toml+13−13
@@ -1,28 +1,28 @@
1[package]
1[package]
2name = "helix-tui"
2name = "helix-tui"
3+version = "0.6.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+description = """
3−description = """A library to build rich terminal user interfaces or dashboards"""
6+A library to build rich terminal user interfaces or dashboards
7+"""
8+edition = "2021"
9+license = "MPL-2.0"
10+categories = ["editor"]
11+repository = "https://github.com/helix-editor/helix"
12+homepage = "https://helix-editor.com"
4include = ["src/**/*", "README.md"]
13include = ["src/**/*", "README.md"]
5−version.workspace = true
6−authors.workspace = true
7−edition.workspace = true
8−license.workspace = true
9−rust-version.workspace = true
10−categories.workspace = true
11−repository.workspace = true
12−homepage.workspace = true
13
14
14[features]
15[features]
15default = ["crossterm"]
16default = ["crossterm"]
16
17
17[dependencies]
18[dependencies]
18−helix-view = { path = "../helix-view", features = ["term"] }
19−helix-core = { path = "../helix-core" }
20−
21bitflags = "2.4"
19bitflags = "2.4"
22cassowary = "0.3"
20cassowary = "0.3"
23unicode-segmentation = "1.10"
21unicode-segmentation = "1.10"
24crossterm = { version = "0.27", optional = true }
22crossterm = { version = "0.27", optional = true }
25termini = "1.0"
23termini = "1.0"
26serde = { version = "1", "optional" = true, features = ["derive"]}
24serde = { version = "1", "optional" = true, features = ["derive"]}
27−once_cell = "1.19"
25+once_cell = "1.18"
28log = "~0.4"
26log = "~0.4"
27+helix-view = { version = "0.6", path = "../helix-view", features = ["term"] }
28+helix-core = { version = "0.6", path = "../helix-core" }
helix-tui/src/buffer.rs+2−2
@@ -213,7 +213,7 @@ impl Buffer {
213 && y < self.area.bottom()
213 && y < self.area.bottom()
214 }
214 }
215
215
216− /// Returns the index in the `Vec<Cell>` for the given global (x, y) coordinates.
216+ /// Returns the index in the Vec<Cell> for the given global (x, y) coordinates.
217 ///
217 ///
218 /// Global coordinates are offset by the Buffer's area offset (`x`/`y`).
218 /// Global coordinates are offset by the Buffer's area offset (`x`/`y`).
219 ///
219 ///
@@ -242,7 +242,7 @@ impl Buffer {
242 ((y - self.area.y) as usize) * (self.area.width as usize) + ((x - self.area.x) as usize)
242 ((y - self.area.y) as usize) * (self.area.width as usize) + ((x - self.area.x) as usize)
243 }
243 }
244
244
245− /// Returns the index in the `Vec<Cell>` for the given global (x, y) coordinates,
245+ /// Returns the index in the Vec<Cell> for the given global (x, y) coordinates,
246 /// or `None` if the coordinates are outside the buffer's area.
246 /// or `None` if the coordinates are outside the buffer's area.
247 fn index_of_opt(&self, x: u16, y: u16) -> Option<usize> {
247 fn index_of_opt(&self, x: u16, y: u16) -> Option<usize> {
248 if self.in_bounds(x, y) {
248 if self.in_bounds(x, y) {
helix-vcs/Cargo.toml+11−12
@@ -1,25 +1,24 @@
1[package]
1[package]
2name = "helix-vcs"
2name = "helix-vcs"
3−version.workspace = true
3+version = "0.6.0"
4−authors.workspace = true
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5−edition.workspace = true
5+edition = "2021"
6−license.workspace = true
6+license = "MPL-2.0"
7−rust-version.workspace = true
8−categories.workspace = true
7+categories = ["editor"]
9−repository.workspace = true
8+repository = "https://github.com/helix-editor/helix"
10−homepage.workspace = true
9+homepage = "https://helix-editor.com"
11
10
12# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
11# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
13
12
14[dependencies]
13[dependencies]
15−helix-core = { path = "../helix-core" }
14+helix-core = { version = "0.6", path = "../helix-core" }
16−helix-event = { path = "../helix-event" }
15+helix-event = { version = "0.6", path = "../helix-event" }
17
16
18tokio = { version = "1", features = ["rt", "rt-multi-thread", "time", "sync", "parking_lot", "macros"] }
17tokio = { version = "1", features = ["rt", "rt-multi-thread", "time", "sync", "parking_lot", "macros"] }
19parking_lot = "0.12"
18parking_lot = "0.12"
20arc-swap = { version = "1.6.0" }
19arc-swap = { version = "1.6.0" }
21
20
22−gix = { version = "0.57.0", default-features = false , optional = true }
21+gix = { version = "0.55.0", default-features = false , optional = true }
23imara-diff = "0.1.5"
22imara-diff = "0.1.5"
24anyhow = "1"
23anyhow = "1"
25
24
@@ -29,4 +28,4 @@ log = "0.4"
29git = ["gix"]
28git = ["gix"]
30
29
31[dev-dependencies]
30[dev-dependencies]
32−tempfile = "3.8"
31+tempfile = "3.8"
helix-vcs/src/git.rs+4−4
@@ -3,7 +3,7 @@ use arc_swap::ArcSwap;
3use std::path::Path;
3use std::path::Path;
4use std::sync::Arc;
4use std::sync::Arc;
5
5
6−use gix::objs::tree::EntryKind;
6+use gix::objs::tree::EntryMode;
7use gix::sec::trust::DefaultForLevel;
7use gix::sec::trust::DefaultForLevel;
8use gix::{Commit, ObjectId, Repository, ThreadSafeRepository};
8use gix::{Commit, ObjectId, Repository, ThreadSafeRepository};
9
9
@@ -128,12 +128,12 @@ fn find_file_in_commit(repo: &Repository, commit: &Commit, file: &Path) -> Resul
128 let tree_entry = tree
128 let tree_entry = tree
129 .lookup_entry_by_path(rel_path, &mut Vec::new())?
129 .lookup_entry_by_path(rel_path, &mut Vec::new())?
130 .context("file is untracked")?;
130 .context("file is untracked")?;
131− match tree_entry.mode().kind() {
131+ match tree_entry.mode() {
132 // not a file, everything is new, do not show diff
132 // not a file, everything is new, do not show diff
133− mode @ (EntryKind::Tree | EntryKind::Commit | EntryKind::Link) => {
133+ mode @ (EntryMode::Tree | EntryMode::Commit | EntryMode::Link) => {
134 bail!("entry at {} is not a file but a {mode:?}", file.display())
134 bail!("entry at {} is not a file but a {mode:?}", file.display())
135 }
135 }
136 // found a file
136 // found a file
137− EntryKind::Blob | EntryKind::BlobExecutable => Ok(tree_entry.object_id()),
137+ EntryMode::Blob | EntryMode::BlobExecutable => Ok(tree_entry.object_id()),
138 }
138 }
139}
139}
helix-view/Cargo.toml+17−19
@@ -1,34 +1,32 @@
1[package]
1[package]
2name = "helix-view"
2name = "helix-view"
3+version = "0.6.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+edition = "2021"
6+license = "MPL-2.0"
3description = "UI abstractions for use in backends"
7description = "UI abstractions for use in backends"
4−version.workspace = true
5−authors.workspace = true
6−edition.workspace = true
7−license.workspace = true
8−rust-version.workspace = true
9−categories.workspace = true
8+categories = ["editor"]
10−repository.workspace = true
9+repository = "https://github.com/helix-editor/helix"
11−homepage.workspace = true
10+homepage = "https://helix-editor.com"
12
11
13[features]
12[features]
14default = []
13default = []
15term = ["crossterm"]
14term = ["crossterm"]
16
15
17[dependencies]
16[dependencies]
18−helix-core = { path = "../helix-core" }
19−helix-event = { path = "../helix-event" }
20−helix-loader = { path = "../helix-loader" }
21−helix-lsp = { path = "../helix-lsp" }
22−helix-dap = { path = "../helix-dap" }
23−helix-vcs = { path = "../helix-vcs" }
24−
25bitflags = "2.4"
17bitflags = "2.4"
26anyhow = "1"
18anyhow = "1"
19+helix-core = { version = "0.6", path = "../helix-core" }
20+helix-event = { version = "0.6", path = "../helix-event" }
21+helix-loader = { version = "0.6", path = "../helix-loader" }
22+helix-lsp = { version = "0.6", path = "../helix-lsp" }
23+helix-dap = { version = "0.6", path = "../helix-dap" }
27crossterm = { version = "0.27", optional = true }
24crossterm = { version = "0.27", optional = true }
25+helix-vcs = { version = "0.6", path = "../helix-vcs" }
28
26
29# Conversion traits
27# Conversion traits
30−once_cell = "1.19"
28+once_cell = "1.18"
31−url = "2.5.0"
29+url = "2"
32
30
33arc-swap = { version = "1.6.0" }
31arc-swap = { version = "1.6.0" }
34
32
@@ -45,12 +43,12 @@ serde_json = "1.0"
45toml = "0.7"
43toml = "0.7"
46log = "~0.4"
44log = "~0.4"
47
45
48−which = "5.0.0"
46+which = "4.4"
49parking_lot = "0.12.1"
47parking_lot = "0.12.1"
50
48
51
49
52[target.'cfg(windows)'.dependencies]
50[target.'cfg(windows)'.dependencies]
53−clipboard-win = { version = "5.0", features = ["std"] }
51+clipboard-win = { version = "4.5", features = ["std"] }
54
52
55[target.'cfg(unix)'.dependencies]
53[target.'cfg(unix)'.dependencies]
56libc = "0.2"
54libc = "0.2"
helix-view/src/document.rs+20−57
@@ -1213,40 +1213,23 @@ impl Document {
1213
1213
1214 let changes = transaction.changes();
1214 let changes = transaction.changes();
1215
1215
1216+ changes.update_positions(
1217+ self.diagnostics
1218+ .iter_mut()
1219+ .map(|diagnostic| (&mut diagnostic.range.start, Assoc::After)),
1220+ );
1221+ changes.update_positions(
1222+ self.diagnostics
1223+ .iter_mut()
1224+ .map(|diagnostic| (&mut diagnostic.range.end, Assoc::After)),
1225+ );
1216− // map diagnostics over changes too
1226+ // map state.diagnostics over changes::map_pos too
1217− changes.update_positions(self.diagnostics.iter_mut().map(|diagnostic| {
1218− let assoc = if diagnostic.starts_at_word {
1219− Assoc::BeforeWord
1220− } else {
1221− Assoc::After
1222− };
1223− (&mut diagnostic.range.start, assoc)
1224− }));
1225− changes.update_positions(self.diagnostics.iter_mut().map(|diagnostic| {
1226− let assoc = if diagnostic.ends_at_word {
1227− Assoc::AfterWord
1228− } else {
1229− Assoc::Before
1230− };
1231− (&mut diagnostic.range.end, assoc)
1232− }));
1233− self.diagnostics.retain_mut(|diagnostic| {
1227+ for diagnostic in &mut self.diagnostics {
1234− if diagnostic.range.start > diagnostic.range.end
1235− || (!diagnostic.zero_width && diagnostic.range.start == diagnostic.range.end)
1236− {
1237− return false;
1238− }
1239 diagnostic.line = self.text.char_to_line(diagnostic.range.start);
1228 diagnostic.line = self.text.char_to_line(diagnostic.range.start);
1240− true
1241− });
1229+ }
1242
1230
1231+ self.diagnostics
1243− self.diagnostics.sort_unstable_by_key(|diagnostic| {
1232+ .sort_unstable_by_key(|diagnostic| diagnostic.range);
1244− (
1245− diagnostic.range,
1246− diagnostic.severity,
1247− diagnostic.language_server_id,
1248− )
1249− });
1250
1233
1251 // Update the inlay hint annotations' positions, helping ensure they are displayed in the proper place
1234 // Update the inlay hint annotations' positions, helping ensure they are displayed in the proper place
1252 let apply_inlay_hint_changes = |annotations: &mut Rc<[InlineAnnotation]>| {
1235 let apply_inlay_hint_changes = |annotations: &mut Rc<[InlineAnnotation]>| {
@@ -1723,33 +1706,13 @@ impl Document {
1723
1706
1724 pub fn replace_diagnostics(
1707 pub fn replace_diagnostics(
1725 &mut self,
1708 &mut self,
1726− diagnostics: impl IntoIterator<Item = Diagnostic>,
1709+ mut diagnostics: Vec<Diagnostic>,
1727− unchanged_sources: &[String],
1728 language_server_id: usize,
1710 language_server_id: usize,
1729 ) {
1711 ) {
1730− if unchanged_sources.is_empty() {
1731− self.clear_diagnostics(language_server_id);
1712+ self.clear_diagnostics(language_server_id);
1732− } else {
1733− self.diagnostics.retain(|d| {
1713+ self.diagnostics.append(&mut diagnostics);
1734− if d.language_server_id != language_server_id {
1735− return true;
1736− }
1737−
1738− if let Some(source) = &d.source {
1739− unchanged_sources.contains(source)
1740− } else {
1741− false
1742− }
1743− });
1744− }
1745− self.diagnostics.extend(diagnostics);
1714+ self.diagnostics
1746− self.diagnostics.sort_unstable_by_key(|diagnostic| {
1715+ .sort_unstable_by_key(|diagnostic| diagnostic.range);
1747− (
1748− diagnostic.range,
1749− diagnostic.severity,
1750− diagnostic.language_server_id,
1751− )
1752− });
1753 }
1716 }
1754
1717
1755 pub fn clear_diagnostics(&mut self, language_server_id: usize) {
1718 pub fn clear_diagnostics(&mut self, language_server_id: usize) {
helix-view/src/editor.rs+11−31
@@ -42,9 +42,10 @@ use anyhow::{anyhow, bail, Error};
42pub use helix_core::diagnostic::Severity;
42pub use helix_core::diagnostic::Severity;
43use helix_core::{
43use helix_core::{
44 auto_pairs::AutoPairs,
44 auto_pairs::AutoPairs,
45− syntax::{self, AutoPairConfig, IndentationHeuristic, SoftWrap},
45+ syntax::{self, AutoPairConfig, SoftWrap},
46− Change, LineEnding, Position, Selection, NATIVE_LINE_ENDING,
46+ Change, LineEnding, NATIVE_LINE_ENDING,
47};
47};
48+use helix_core::{Position, Selection};
48use helix_dap as dap;
49use helix_dap as dap;
49use helix_lsp::lsp;
50use helix_lsp::lsp;
50
51
@@ -290,11 +291,6 @@ pub struct Config {
290 pub insert_final_newline: bool,
291 pub insert_final_newline: bool,
291 /// Enables smart tab
292 /// Enables smart tab
292 pub smart_tab: Option<SmartTabConfig>,
293 pub smart_tab: Option<SmartTabConfig>,
293− /// Draw border around popups.
294− pub popup_border: PopupBorderConfig,
295− /// Which indent heuristic to use when a new line is inserted
296− #[serde(default)]
297− pub indent_heuristic: IndentationHeuristic,
298}
294}
299
295
300#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Eq, PartialOrd, Ord)]
296#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Eq, PartialOrd, Ord)]
@@ -731,7 +727,7 @@ pub struct WhitespaceCharacters {
731impl Default for WhitespaceCharacters {
727impl Default for WhitespaceCharacters {
732 fn default() -> Self {
728 fn default() -> Self {
733 Self {
729 Self {
734− space: '·', // U+00B7
730+ space: '·', // U+00B7
735 nbsp: '⍽', // U+237D
731 nbsp: '⍽', // U+237D
736 tab: '→', // U+2192
732 tab: '→', // U+2192
737 newline: '⏎', // U+23CE
733 newline: '⏎', // U+23CE
@@ -759,13 +755,12 @@ impl Default for IndentGuidesConfig {
759}
755}
760
756
761/// Line ending configuration.
757/// Line ending configuration.
762−#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
758+#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
763#[serde(rename_all = "lowercase")]
759#[serde(rename_all = "lowercase")]
764pub enum LineEndingConfig {
760pub enum LineEndingConfig {
765 /// The platform's native line ending.
761 /// The platform's native line ending.
766 ///
762 ///
767 /// `crlf` on Windows, otherwise `lf`.
763 /// `crlf` on Windows, otherwise `lf`.
768− #[default]
769 Native,
764 Native,
770 /// Line feed.
765 /// Line feed.
771 LF,
766 LF,
@@ -782,6 +777,12 @@ pub enum LineEndingConfig {
782 Nel,
777 Nel,
783}
778}
784
779
780+impl Default for LineEndingConfig {
781+ fn default() -> Self {
782+ LineEndingConfig::Native
783+ }
784+}
785+
785impl From<LineEndingConfig> for LineEnding {
786impl From<LineEndingConfig> for LineEnding {
786 fn from(line_ending: LineEndingConfig) -> Self {
787 fn from(line_ending: LineEndingConfig) -> Self {
787 match line_ending {
788 match line_ending {
@@ -798,15 +799,6 @@ impl From<LineEndingConfig> for LineEnding {
798 }
799 }
799}
800}
800
801
801−#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
802−#[serde(rename_all = "kebab-case")]
803−pub enum PopupBorderConfig {
804− None,
805− All,
806− Popup,
807− Menu,
808−}
809−
810impl Default for Config {
802impl Default for Config {
811 fn default() -> Self {
803 fn default() -> Self {
812 Self {
804 Self {
@@ -854,8 +846,6 @@ impl Default for Config {
854 default_line_ending: LineEndingConfig::default(),
846 default_line_ending: LineEndingConfig::default(),
855 insert_final_newline: true,
847 insert_final_newline: true,
856 smart_tab: Some(SmartTabConfig::default()),
848 smart_tab: Some(SmartTabConfig::default()),
857− popup_border: PopupBorderConfig::None,
858− indent_heuristic: IndentationHeuristic::default(),
859 }
849 }
860 }
850 }
861}
851}
@@ -1075,16 +1065,6 @@ impl Editor {
1075 }
1065 }
1076 }
1066 }
1077
1067
1078− pub fn popup_border(&self) -> bool {
1079− self.config().popup_border == PopupBorderConfig::All
1080− || self.config().popup_border == PopupBorderConfig::Popup
1081− }
1082−
1083− pub fn menu_border(&self) -> bool {
1084− self.config().popup_border == PopupBorderConfig::All
1085− || self.config().popup_border == PopupBorderConfig::Menu
1086− }
1087−
1088 pub fn apply_motion<F: Fn(&mut Self) + 'static>(&mut self, motion: F) {
1068 pub fn apply_motion<F: Fn(&mut Self) + 'static>(&mut self, motion: F) {
1089 motion(self);
1069 motion(self);
1090 self.last_motion = Some(Box::new(motion));
1070 self.last_motion = Some(Box::new(motion));
helix-view/src/gutter.rs+2−1
@@ -9,7 +9,8 @@ use crate::{
9};
9};
10
10
11fn count_digits(n: usize) -> usize {
11fn count_digits(n: usize) -> usize {
12− (usize::checked_ilog10(n).unwrap_or(0) + 1) as usize
12+ // TODO: use checked_log10 when MSRV reaches 1.67
13+ std::iter::successors(Some(n), |&n| (n >= 10).then_some(n / 10)).count()
13}
14}
14
15
15pub type GutterFn<'doc> = Box<dyn FnMut(usize, bool, bool, &mut String) -> Option<Style> + 'doc>;
16pub type GutterFn<'doc> = Box<dyn FnMut(usize, bool, bool, &mut String) -> Option<Style> + 'doc>;
helix-view/src/handlers/dap.rs+3−1
@@ -369,7 +369,9 @@ impl Editor {
369 {
369 {
370 Ok(process) => process,
370 Ok(process) => process,
371 Err(err) => {
371 Err(err) => {
372+ // TODO replace the pretty print {:?} with a regular format {}
373+ // when the MSRV is raised to 1.60.0
372− self.set_error(format!("Error starting external terminal: {}", err));
374+ self.set_error(format!("Error starting external terminal: {:?}", err));
373 return true;
375 return true;
374 }
376 }
375 };
377 };
languages.toml+163−113
@@ -3,7 +3,6 @@
3
3
4[language-server]
4[language-server]
5
5
6−als = { command = "als" }
7awk-language-server = { command = "awk-language-server" }
6awk-language-server = { command = "awk-language-server" }
8bash-language-server = { command = "bash-language-server", args = ["start"] }
7bash-language-server = { command = "bash-language-server", args = ["start"] }
9bass = { command = "bass", args = ["--lsp"] }
8bass = { command = "bass", args = ["--lsp"] }
@@ -48,7 +47,6 @@ mint = { command = "mint", args = ["ls"] }
48nil = { command = "nil" }
47nil = { command = "nil" }
49nimlangserver = { command = "nimlangserver" }
48nimlangserver = { command = "nimlangserver" }
50nls = { command = "nls" }
49nls = { command = "nls" }
51−nu-lsp = { command = "nu", args = [ "--lsp" ] }
52ocamllsp = { command = "ocamllsp" }
50ocamllsp = { command = "ocamllsp" }
53ols = { command = "ols", args = [] }
51ols = { command = "ols", args = [] }
54omnisharp = { command = "OmniSharp", args = [ "--languageserver" ] }
52omnisharp = { command = "OmniSharp", args = [ "--languageserver" ] }
@@ -97,7 +95,7 @@ command = "ansible-language-server"
97args = ["--stdio"]
95args = ["--stdio"]
98
96
99[language-server.lua-language-server]
97[language-server.lua-language-server]
100−command = "lua-language-server"
98+command = "lua-language-server"
101
99
102[language-server.lua-language-server.config.Lua.hint]
100[language-server.lua-language-server.config.Lua.hint]
103enable = true
101enable = true
@@ -191,7 +189,6 @@ auto-format = true
191comment-token = "//"
189comment-token = "//"
192language-servers = [ "rust-analyzer" ]
190language-servers = [ "rust-analyzer" ]
193indent = { tab-width = 4, unit = " " }
191indent = { tab-width = 4, unit = " " }
194−persistent-diagnostic-sources = ["rustc", "clippy"]
195
192
196[language.auto-pairs]
193[language.auto-pairs]
197'(' = ')'
194'(' = ')'
@@ -252,6 +249,7 @@ name = "toml"
252scope = "source.toml"
249scope = "source.toml"
253injection-regex = "toml"
250injection-regex = "toml"
254file-types = ["toml", "poetry.lock", "Cargo.lock"]
251file-types = ["toml", "poetry.lock", "Cargo.lock"]
252+roots = []
255comment-token = "#"
253comment-token = "#"
256language-servers = [ "taplo" ]
254language-servers = [ "taplo" ]
257indent = { tab-width = 2, unit = " " }
255indent = { tab-width = 2, unit = " " }
@@ -265,6 +263,7 @@ name = "awk"
265scope = "source.awk"
263scope = "source.awk"
266injection-regex = "awk"
264injection-regex = "awk"
267file-types = ["awk", "gawk", "nawk", "mawk"]
265file-types = ["awk", "gawk", "nawk", "mawk"]
266+roots = []
268comment-token = "#"
267comment-token = "#"
269language-servers = [ "awk-language-server" ]
268language-servers = [ "awk-language-server" ]
270indent = { tab-width = 2, unit = " " }
269indent = { tab-width = 2, unit = " " }
@@ -279,6 +278,7 @@ scope = "source.proto"
279injection-regex = "protobuf"
278injection-regex = "protobuf"
280file-types = ["proto"]
279file-types = ["proto"]
281language-servers = [ "bufls", "pbkit" ]
280language-servers = [ "bufls", "pbkit" ]
281+roots = []
282comment-token = "//"
282comment-token = "//"
283indent = { tab-width = 2, unit = " " }
283indent = { tab-width = 2, unit = " " }
284
284
@@ -307,6 +307,7 @@ scope = "source.fish"
307injection-regex = "fish"
307injection-regex = "fish"
308file-types = ["fish"]
308file-types = ["fish"]
309shebangs = ["fish"]
309shebangs = ["fish"]
310+roots = []
310comment-token = "#"
311comment-token = "#"
311indent = { tab-width = 4, unit = " " }
312indent = { tab-width = 4, unit = " " }
312
313
@@ -320,6 +321,7 @@ scope = "source.mint"
320injection-regex = "mint"
321injection-regex = "mint"
321file-types = ["mint"]
322file-types = ["mint"]
322shebangs = []
323shebangs = []
324+roots = []
323comment-token = "//"
325comment-token = "//"
324language-servers = [ "mint" ]
326language-servers = [ "mint" ]
325indent = { tab-width = 2, unit = " " }
327indent = { tab-width = 2, unit = " " }
@@ -347,9 +349,9 @@ file-types = [
347 "jsonld",
349 "jsonld",
348 ".vuerc",
350 ".vuerc",
349 "composer.lock",
351 "composer.lock",
350− ".watchmanconfig",
352+ ".watchmanconfig"
351− "avsc"
352]
353]
354+roots = []
353language-servers = [ "vscode-json-language-server" ]
355language-servers = [ "vscode-json-language-server" ]
354auto-format = true
356auto-format = true
355indent = { tab-width = 2, unit = " " }
357indent = { tab-width = 2, unit = " " }
@@ -364,6 +366,7 @@ name = "json5"
364scope = "source.json5"
366scope = "source.json5"
365injection-regex = "json5"
367injection-regex = "json5"
366file-types = ["json5"]
368file-types = ["json5"]
369+roots = []
367language-servers = []
370language-servers = []
368comment-token = "//"
371comment-token = "//"
369indent = { tab-width = 4, unit = " " }
372indent = { tab-width = 4, unit = " " }
@@ -378,6 +381,7 @@ name = "c"
378scope = "source.c"
381scope = "source.c"
379injection-regex = "c"
382injection-regex = "c"
380file-types = ["c"] # TODO: ["h"]
383file-types = ["c"] # TODO: ["h"]
384+roots = []
381comment-token = "//"
385comment-token = "//"
382language-servers = [ "clangd" ]
386language-servers = [ "clangd" ]
383indent = { tab-width = 2, unit = " " }
387indent = { tab-width = 2, unit = " " }
@@ -414,6 +418,7 @@ name = "cpp"
414scope = "source.cpp"
418scope = "source.cpp"
415injection-regex = "cpp"
419injection-regex = "cpp"
416file-types = ["cc", "hh", "c++", "cpp", "hpp", "h", "ipp", "tpp", "cxx", "hxx", "ixx", "txx", "ino", "C", "H", "cu", "cuh", "cppm", "h++", "ii", "inl", { suffix = ".hpp.in" }, { suffix = ".h.in" }]
420file-types = ["cc", "hh", "c++", "cpp", "hpp", "h", "ipp", "tpp", "cxx", "hxx", "ixx", "txx", "ino", "C", "H", "cu", "cuh", "cppm", "h++", "ii", "inl", { suffix = ".hpp.in" }, { suffix = ".h.in" }]
421+roots = []
417comment-token = "//"
422comment-token = "//"
418language-servers = [ "clangd" ]
423language-servers = [ "clangd" ]
419indent = { tab-width = 2, unit = " " }
424indent = { tab-width = 2, unit = " " }
@@ -546,6 +551,7 @@ name = "gomod"
546scope = "source.gomod"
551scope = "source.gomod"
547injection-regex = "gomod"
552injection-regex = "gomod"
548file-types = ["go.mod"]
553file-types = ["go.mod"]
554+roots = []
549auto-format = true
555auto-format = true
550comment-token = "//"
556comment-token = "//"
551language-servers = [ "gopls" ]
557language-servers = [ "gopls" ]
@@ -560,6 +566,7 @@ name = "gotmpl"
560scope = "source.gotmpl"
566scope = "source.gotmpl"
561injection-regex = "gotmpl"
567injection-regex = "gotmpl"
562file-types = ["gotmpl"]
568file-types = ["gotmpl"]
569+roots = []
563comment-token = "//"
570comment-token = "//"
564language-servers = [ "gopls" ]
571language-servers = [ "gopls" ]
565indent = { tab-width = 2, unit = " " }
572indent = { tab-width = 2, unit = " " }
@@ -573,6 +580,7 @@ name = "gowork"
573scope = "source.gowork"
580scope = "source.gowork"
574injection-regex = "gowork"
581injection-regex = "gowork"
575file-types = ["go.work"]
582file-types = ["go.work"]
583+roots = []
576auto-format = true
584auto-format = true
577comment-token = "//"
585comment-token = "//"
578language-servers = [ "gopls" ]
586language-servers = [ "gopls" ]
@@ -589,6 +597,7 @@ injection-regex = "(js|javascript)"
589language-id = "javascript"
597language-id = "javascript"
590file-types = ["js", "mjs", "cjs", "rules", "es6", "pac", "jakefile"]
598file-types = ["js", "mjs", "cjs", "rules", "es6", "pac", "jakefile"]
591shebangs = ["node"]
599shebangs = ["node"]
600+roots = []
592comment-token = "//"
601comment-token = "//"
593language-servers = [ "typescript-language-server" ]
602language-servers = [ "typescript-language-server" ]
594indent = { tab-width = 2, unit = " " }
603indent = { tab-width = 2, unit = " " }
@@ -615,6 +624,7 @@ scope = "source.jsx"
615injection-regex = "jsx"
624injection-regex = "jsx"
616language-id = "javascriptreact"
625language-id = "javascriptreact"
617file-types = ["jsx"]
626file-types = ["jsx"]
627+roots = []
618comment-token = "//"
628comment-token = "//"
619language-servers = [ "typescript-language-server" ]
629language-servers = [ "typescript-language-server" ]
620indent = { tab-width = 2, unit = " " }
630indent = { tab-width = 2, unit = " " }
@@ -627,6 +637,7 @@ injection-regex = "(ts|typescript)"
627file-types = ["ts", "mts", "cts"]
637file-types = ["ts", "mts", "cts"]
628language-id = "typescript"
638language-id = "typescript"
629shebangs = ["deno", "ts-node"]
639shebangs = ["deno", "ts-node"]
640+roots = []
630language-servers = [ "typescript-language-server" ]
641language-servers = [ "typescript-language-server" ]
631indent = { tab-width = 2, unit = " " }
642indent = { tab-width = 2, unit = " " }
632
643
@@ -640,6 +651,7 @@ scope = "source.tsx"
640injection-regex = "(tsx)" # |typescript
651injection-regex = "(tsx)" # |typescript
641language-id = "typescriptreact"
652language-id = "typescriptreact"
642file-types = ["tsx"]
653file-types = ["tsx"]
654+roots = []
643language-servers = [ "typescript-language-server" ]
655language-servers = [ "typescript-language-server" ]
644indent = { tab-width = 2, unit = " " }
656indent = { tab-width = 2, unit = " " }
645
657
@@ -652,6 +664,7 @@ name = "css"
652scope = "source.css"
664scope = "source.css"
653injection-regex = "css"
665injection-regex = "css"
654file-types = ["css", "scss"]
666file-types = ["css", "scss"]
667+roots = []
655language-servers = [ "vscode-css-language-server" ]
668language-servers = [ "vscode-css-language-server" ]
656auto-format = true
669auto-format = true
657indent = { tab-width = 2, unit = " " }
670indent = { tab-width = 2, unit = " " }
@@ -665,6 +678,7 @@ name = "scss"
665scope = "source.scss"
678scope = "source.scss"
666injection-regex = "scss"
679injection-regex = "scss"
667file-types = ["scss"]
680file-types = ["scss"]
681+roots = []
668language-servers = [ "vscode-css-language-server" ]
682language-servers = [ "vscode-css-language-server" ]
669auto-format = true
683auto-format = true
670indent = { tab-width = 2, unit = " " }
684indent = { tab-width = 2, unit = " " }
@@ -678,6 +692,7 @@ name = "html"
678scope = "text.html.basic"
692scope = "text.html.basic"
679injection-regex = "html"
693injection-regex = "html"
680file-types = ["html", "htm", "shtml", "xhtml", "xht", "jsp", "asp", "aspx", "jshtm", "volt", "rhtml"]
694file-types = ["html", "htm", "shtml", "xhtml", "xht", "jsp", "asp", "aspx", "jshtm", "volt", "rhtml"]
695+roots = []
681language-servers = [ "vscode-html-language-server" ]
696language-servers = [ "vscode-html-language-server" ]
682auto-format = true
697auto-format = true
683indent = { tab-width = 2, unit = " " }
698indent = { tab-width = 2, unit = " " }
@@ -700,7 +715,7 @@ indent = { tab-width = 4, unit = " " }
700
715
701[[grammar]]
716[[grammar]]
702name = "python"
717name = "python"
703−source = { git = "https://github.com/tree-sitter/tree-sitter-python", rev = "4bfdd9033a2225cc95032ce77066b7aeca9e2efc" }
718+source = { git = "https://github.com/tree-sitter/tree-sitter-python", rev = "de221eccf9a221f5b85474a553474a69b4b5784d" }
704
719
705[[language]]
720[[language]]
706name = "nickel"
721name = "nickel"
@@ -708,6 +723,7 @@ scope = "source.nickel"
708injection-regex = "nickel"
723injection-regex = "nickel"
709file-types = ["ncl"]
724file-types = ["ncl"]
710shebangs = []
725shebangs = []
726+roots = []
711comment-token = "#"
727comment-token = "#"
712language-servers = [ "nls" ]
728language-servers = [ "nls" ]
713indent = { tab-width = 2, unit = " " }
729indent = { tab-width = 2, unit = " " }
@@ -728,6 +744,7 @@ scope = "source.nix"
728injection-regex = "nix"
744injection-regex = "nix"
729file-types = ["nix"]
745file-types = ["nix"]
730shebangs = []
746shebangs = []
747+roots = []
731comment-token = "#"
748comment-token = "#"
732language-servers = [ "nil" ]
749language-servers = [ "nil" ]
733indent = { tab-width = 2, unit = " " }
750indent = { tab-width = 2, unit = " " }
@@ -777,6 +794,7 @@ file-types = [
777 "Gymfile"
794 "Gymfile"
778]
795]
779shebangs = ["ruby"]
796shebangs = ["ruby"]
797+roots = []
780comment-token = "#"
798comment-token = "#"
781language-servers = [ "solargraph" ]
799language-servers = [ "solargraph" ]
782indent = { tab-width = 2, unit = " " }
800indent = { tab-width = 2, unit = " " }
@@ -831,6 +849,7 @@ file-types = [
831 "zshrc_Apple_Terminal"
849 "zshrc_Apple_Terminal"
832]
850]
833shebangs = ["sh", "bash", "dash", "zsh"]
851shebangs = ["sh", "bash", "dash", "zsh"]
852+roots = []
834comment-token = "#"
853comment-token = "#"
835language-servers = [ "bash-language-server" ]
854language-servers = [ "bash-language-server" ]
836indent = { tab-width = 2, unit = " " }
855indent = { tab-width = 2, unit = " " }
@@ -858,6 +877,7 @@ name = "twig"
858scope = "source.twig"
877scope = "source.twig"
859injection-regex = "twig"
878injection-regex = "twig"
860file-types = ["twig"]
879file-types = ["twig"]
880+roots = []
861indent = { tab-width = 2, unit = " " }
881indent = { tab-width = 2, unit = " " }
862
882
863[[grammar]]
883[[grammar]]
@@ -869,6 +889,7 @@ name = "latex"
869scope = "source.tex"
889scope = "source.tex"
870injection-regex = "tex"
890injection-regex = "tex"
871file-types = ["tex", "sty", "cls", "Rd", "bbx", "cbx"]
891file-types = ["tex", "sty", "cls", "Rd", "bbx", "cbx"]
892+roots = []
872comment-token = "%"
893comment-token = "%"
873language-servers = [ "texlab" ]
894language-servers = [ "texlab" ]
874indent = { tab-width = 4, unit = "\t" }
895indent = { tab-width = 4, unit = "\t" }
@@ -882,6 +903,7 @@ name = "bibtex"
882scope = "source.bib"
903scope = "source.bib"
883injection-regex = "bib"
904injection-regex = "bib"
884file-types = ["bib"]
905file-types = ["bib"]
906+roots = []
885comment-token = "%"
907comment-token = "%"
886language-servers = [ "texlab" ]
908language-servers = [ "texlab" ]
887indent = { tab-width = 4, unit = "\t" }
909indent = { tab-width = 4, unit = "\t" }
@@ -924,6 +946,7 @@ name = "lpf"
924comment-token = "#"
946comment-token = "#"
925scope = "source.lpf"
947scope = "source.lpf"
926file-types = ["lpf"]
948file-types = ["lpf"]
949+roots = []
927
950
928[[grammar]]
951[[grammar]]
929name = "lpf"
952name = "lpf"
@@ -957,24 +980,12 @@ indent = { tab-width = 2, unit = " " }
957name = "java"
980name = "java"
958source = { git = "https://github.com/tree-sitter/tree-sitter-java", rev = "09d650def6cdf7f479f4b78f595e9ef5b58ce31e" }
981source = { git = "https://github.com/tree-sitter/tree-sitter-java", rev = "09d650def6cdf7f479f4b78f595e9ef5b58ce31e" }
959
982
960−[[language]]
961−name = "smali"
962−scope = "source.smali"
963−injection-regex = "smali"
964−file-types = ["smali"]
965−comment-token = "#"
966−roots = []
967−indent = { tab-width = 4, unit = " " }
968−
969−[[grammar]]
970−name = "smali"
971−source = { git = "https://github.com/amaanq/tree-sitter-smali", rev = "5ae51e15c4d1ac93cba6127caf3d1f0a072c140c" }
972−
973[[language]]
983[[language]]
974name = "ledger"
984name = "ledger"
975scope = "source.ledger"
985scope = "source.ledger"
976injection-regex = "ledger"
986injection-regex = "ledger"
977file-types = ["ldg", "ledger", "journal"]
987file-types = ["ldg", "ledger", "journal"]
988+roots = []
978comment-token = ";"
989comment-token = ";"
979indent = { tab-width = 4, unit = " " }
990indent = { tab-width = 4, unit = " " }
980
991
@@ -987,12 +998,13 @@ name = "beancount"
987scope = "source.beancount"
998scope = "source.beancount"
988injection-regex = "beancount"
999injection-regex = "beancount"
989file-types = ["beancount", "bean"]
1000file-types = ["beancount", "bean"]
1001+roots = []
990comment-token = ";"
1002comment-token = ";"
991indent = { tab-width = 2, unit = " " }
1003indent = { tab-width = 2, unit = " " }
992
1004
993[[grammar]]
1005[[grammar]]
994name = "beancount"
1006name = "beancount"
995−source = { git = "https://github.com/polarmutex/tree-sitter-beancount", rev = "f3741a3a68ade59ec894ed84a64673494d2ba8f3" }
1007+source = { git = "https://github.com/polarmutex/tree-sitter-beancount", rev = "4cbd1f09cd07c1f1fabf867c2cf354f9da53cc4c" }
996
1008
997[[language]]
1009[[language]]
998name = "ocaml"
1010name = "ocaml"
@@ -1000,6 +1012,7 @@ scope = "source.ocaml"
1000injection-regex = "ocaml"
1012injection-regex = "ocaml"
1001file-types = ["ml"]
1013file-types = ["ml"]
1002shebangs = ["ocaml", "ocamlrun", "ocamlscript"]
1014shebangs = ["ocaml", "ocamlrun", "ocamlscript"]
1015+roots = []
1003comment-token = "(**)"
1016comment-token = "(**)"
1004language-servers = [ "ocamllsp" ]
1017language-servers = [ "ocamllsp" ]
1005indent = { tab-width = 2, unit = " " }
1018indent = { tab-width = 2, unit = " " }
@@ -1019,6 +1032,7 @@ name = "ocaml-interface"
1019scope = "source.ocaml.interface"
1032scope = "source.ocaml.interface"
1020file-types = ["mli"]
1033file-types = ["mli"]
1021shebangs = []
1034shebangs = []
1035+roots = []
1022comment-token = "(**)"
1036comment-token = "(**)"
1023language-servers = [ "ocamllsp" ]
1037language-servers = [ "ocamllsp" ]
1024indent = { tab-width = 2, unit = " " }
1038indent = { tab-width = 2, unit = " " }
@@ -1053,6 +1067,7 @@ name = "svelte"
1053scope = "source.svelte"
1067scope = "source.svelte"
1054injection-regex = "svelte"
1068injection-regex = "svelte"
1055file-types = ["svelte"]
1069file-types = ["svelte"]
1070+roots = []
1056indent = { tab-width = 2, unit = " " }
1071indent = { tab-width = 2, unit = " " }
1057language-servers = [ "svelteserver" ]
1072language-servers = [ "svelteserver" ]
1058
1073
@@ -1077,6 +1092,7 @@ source = { git = "https://github.com/ikatyang/tree-sitter-vue", rev = "91fe27547
1077name = "yaml"
1092name = "yaml"
1078scope = "source.yaml"
1093scope = "source.yaml"
1079file-types = ["yml", "yaml"]
1094file-types = ["yml", "yaml"]
1095+roots = []
1080comment-token = "#"
1096comment-token = "#"
1081indent = { tab-width = 2, unit = " " }
1097indent = { tab-width = 2, unit = " " }
1082language-servers = [ "yaml-language-server", "ansible-language-server" ]
1098language-servers = [ "yaml-language-server", "ansible-language-server" ]
@@ -1104,6 +1120,7 @@ source = { git = "https://github.com/tree-sitter/tree-sitter-haskell", rev = "d7
1104name = "haskell-persistent"
1120name = "haskell-persistent"
1105scope = "source.persistentmodels"
1121scope = "source.persistentmodels"
1106file-types = ["persistentmodels"]
1122file-types = ["persistentmodels"]
1123+roots = []
1107comment-token = "--"
1124comment-token = "--"
1108indent = { tab-width = 2, unit = " " }
1125indent = { tab-width = 2, unit = " " }
1109
1126
@@ -1125,7 +1142,7 @@ formatter = { command = "purs-tidy", args = ["format"] }
1125
1142
1126[[grammar]]
1143[[grammar]]
1127name = "purescript"
1144name = "purescript"
1128−source = { git = "https://github.com/postsolar/tree-sitter-purescript", rev = "5ef5592674ea42de75fc2792972e4ea0b6e3da6c" }
1145+source = { git = "https://github.com/postsolar/tree-sitter-purescript", rev = "593193b9bf0f46d5eee708a4e53044d2a9054897" }
1129
1146
1130[[language]]
1147[[language]]
1131name = "zig"
1148name = "zig"
@@ -1169,6 +1186,7 @@ source = { git = "https://github.com/maxxnino/tree-sitter-zig", rev = "0d08703e4
1169[[language]]
1186[[language]]
1170name = "prolog"
1187name = "prolog"
1171scope = "source.prolog"
1188scope = "source.prolog"
1189+roots = []
1172file-types = ["pl", "prolog"]
1190file-types = ["pl", "prolog"]
1173shebangs = ["swipl"]
1191shebangs = ["swipl"]
1174comment-token = "%"
1192comment-token = "%"
@@ -1178,6 +1196,7 @@ language-servers = [ "swipl" ]
1178name = "tsq"
1196name = "tsq"
1179scope = "source.tsq"
1197scope = "source.tsq"
1180file-types = ["tsq"]
1198file-types = ["tsq"]
1199+roots = []
1181comment-token = ";"
1200comment-token = ";"
1182injection-regex = "tsq"
1201injection-regex = "tsq"
1183indent = { tab-width = 2, unit = " " }
1202indent = { tab-width = 2, unit = " " }
@@ -1190,6 +1209,7 @@ source = { git = "https://github.com/the-mikedavis/tree-sitter-tsq", rev = "48b5
1190name = "cmake"
1209name = "cmake"
1191scope = "source.cmake"
1210scope = "source.cmake"
1192file-types = ["cmake", "CMakeLists.txt"]
1211file-types = ["cmake", "CMakeLists.txt"]
1212+roots = []
1193comment-token = "#"
1213comment-token = "#"
1194indent = { tab-width = 2, unit = " " }
1214indent = { tab-width = 2, unit = " " }
1195language-servers = [ "cmake-language-server" ]
1215language-servers = [ "cmake-language-server" ]
@@ -1205,6 +1225,7 @@ scope = "source.make"
1205file-types = ["Makefile", "makefile", "make", "mk", "mak", "GNUmakefile", "OCamlMakefile"]
1225file-types = ["Makefile", "makefile", "make", "mk", "mak", "GNUmakefile", "OCamlMakefile"]
1206shebangs = ["make", "gmake"]
1226shebangs = ["make", "gmake"]
1207injection-regex = "(make|makefile|Makefile|mk)"
1227injection-regex = "(make|makefile|Makefile|mk)"
1228+roots = []
1208comment-token = "#"
1229comment-token = "#"
1209indent = { tab-width = 4, unit = "\t" }
1230indent = { tab-width = 4, unit = "\t" }
1210
1231
@@ -1216,6 +1237,7 @@ source = { git = "https://github.com/alemuller/tree-sitter-make", rev = "a4b9187
1216name = "glsl"
1237name = "glsl"
1217scope = "source.glsl"
1238scope = "source.glsl"
1218file-types = ["glsl", "vert", "tesc", "tese", "geom", "frag", "comp" ]
1239file-types = ["glsl", "vert", "tesc", "tese", "geom", "frag", "comp" ]
1240+roots = []
1219comment-token = "//"
1241comment-token = "//"
1220indent = { tab-width = 4, unit = " " }
1242indent = { tab-width = 4, unit = " " }
1221injection-regex = "glsl"
1243injection-regex = "glsl"
@@ -1229,18 +1251,20 @@ name = "perl"
1229scope = "source.perl"
1251scope = "source.perl"
1230file-types = ["pl", "pm", "t", "psgi", "raku", "rakumod", "rakutest", "rakudoc", "nqp", "p6", "pl6", "pm6"]
1252file-types = ["pl", "pm", "t", "psgi", "raku", "rakumod", "rakutest", "rakudoc", "nqp", "p6", "pl6", "pm6"]
1231shebangs = ["perl"]
1253shebangs = ["perl"]
1254+roots = []
1232comment-token = "#"
1255comment-token = "#"
1233language-servers = [ "perlnavigator" ]
1256language-servers = [ "perlnavigator" ]
1234indent = { tab-width = 2, unit = " " }
1257indent = { tab-width = 2, unit = " " }
1235
1258
1236[[grammar]]
1259[[grammar]]
1237name = "perl"
1260name = "perl"
1238−source = { git = "https://github.com/tree-sitter-perl/tree-sitter-perl", rev = "e99bb5283805db4cb86c964722d709df21b0ac16" }
1261+source = { git = "https://github.com/tree-sitter-perl/tree-sitter-perl", rev = "9f3166800d40267fa68ed8273e96baf74f390517" }
1239
1262
1240[[language]]
1263[[language]]
1241name = "pod"
1264name = "pod"
1242scope = "source.pod"
1265scope = "source.pod"
1243injection-regex = "pod"
1266injection-regex = "pod"
1267+roots = []
1244file-types = ["pod"]
1268file-types = ["pod"]
1245
1269
1246[[grammar]]
1270[[grammar]]
@@ -1250,6 +1274,7 @@ source = { git = "https://github.com/tree-sitter-perl/tree-sitter-pod", rev = "d
1250[[language]]
1274[[language]]
1251name = "racket"
1275name = "racket"
1252scope = "source.racket"
1276scope = "source.racket"
1277+roots = []
1253file-types = ["rkt", "rktd", "rktl", "scrbl"]
1278file-types = ["rkt", "rktd", "rktl", "scrbl"]
1254shebangs = ["racket"]
1279shebangs = ["racket"]
1255comment-token = ";"
1280comment-token = ";"
@@ -1260,6 +1285,7 @@ grammar = "scheme"
1260[[language]]
1285[[language]]
1261name = "common-lisp"
1286name = "common-lisp"
1262scope = "source.lisp"
1287scope = "source.lisp"
1288+roots = []
1263file-types = ["lisp", "asd", "cl", "l", "lsp", "ny", "podsl", "sexp"]
1289file-types = ["lisp", "asd", "cl", "l", "lsp", "ny", "podsl", "sexp"]
1264shebangs = ["lisp", "sbcl", "ccl", "clisp", "ecl"]
1290shebangs = ["lisp", "sbcl", "ccl", "clisp", "ecl"]
1265comment-token = ";"
1291comment-token = ";"
@@ -1276,17 +1302,19 @@ grammar = "scheme"
1276[[language]]
1302[[language]]
1277name = "comment"
1303name = "comment"
1278scope = "scope.comment"
1304scope = "scope.comment"
1305+roots = []
1279file-types = []
1306file-types = []
1280injection-regex = "comment"
1307injection-regex = "comment"
1281
1308
1282[[grammar]]
1309[[grammar]]
1283name = "comment"
1310name = "comment"
1284−source = { git = "https://github.com/stsewd/tree-sitter-comment", rev = "a37ca370310ac6f89b6e0ebf2b86b2219780494e" }
1311+source = { git = "https://github.com/stsewd/tree-sitter-comment", rev = "5dd3c62f1bbe378b220fe16b317b85247898639e" }
1285
1312
1286[[language]]
1313[[language]]
1287name = "wgsl"
1314name = "wgsl"
1288scope = "source.wgsl"
1315scope = "source.wgsl"
1289file-types = ["wgsl"]
1316file-types = ["wgsl"]
1317+roots = []
1290comment-token = "//"
1318comment-token = "//"
1291language-servers = [ "wgsl_analyzer" ]
1319language-servers = [ "wgsl_analyzer" ]
1292indent = { tab-width = 4, unit = " " }
1320indent = { tab-width = 4, unit = " " }
@@ -1298,6 +1326,7 @@ source = { git = "https://github.com/szebniok/tree-sitter-wgsl", rev = "272e89ef
1298[[language]]
1326[[language]]
1299name = "llvm"
1327name = "llvm"
1300scope = "source.llvm"
1328scope = "source.llvm"
1329+roots = []
1301file-types = ["ll"]
1330file-types = ["ll"]
1302comment-token = ";"
1331comment-token = ";"
1303indent = { tab-width = 2, unit = " " }
1332indent = { tab-width = 2, unit = " " }
@@ -1305,11 +1334,12 @@ injection-regex = "llvm"
1305
1334
1306[[grammar]]
1335[[grammar]]
1307name = "llvm"
1336name = "llvm"
1308−source = { git = "https://github.com/benwilliamgraham/tree-sitter-llvm", rev = "e9948edc41e9e5869af99dddb2b5ff5cc5581af6" }
1337+source = { git = "https://github.com/benwilliamgraham/tree-sitter-llvm", rev = "3b213925b9c4f42c1acfe2e10bfbb438d9c6834d" }
1309
1338
1310[[language]]
1339[[language]]
1311name = "llvm-mir"
1340name = "llvm-mir"
1312scope = "source.llvm_mir"
1341scope = "source.llvm_mir"
1342+roots = []
1313file-types = []
1343file-types = []
1314comment-token = ";"
1344comment-token = ";"
1315indent = { tab-width = 2, unit = " " }
1345indent = { tab-width = 2, unit = " " }
@@ -1325,6 +1355,7 @@ name = "llvm-mir-yaml"
1325#
1355#
1326# grammar = "yaml"
1356# grammar = "yaml"
1327scope = "source.yaml"
1357scope = "source.yaml"
1358+roots = []
1328file-types = ["mir"]
1359file-types = ["mir"]
1329comment-token = "#"
1360comment-token = "#"
1330indent = { tab-width = 2, unit = " " }
1361indent = { tab-width = 2, unit = " " }
@@ -1332,6 +1363,7 @@ indent = { tab-width = 2, unit = " " }
1332[[language]]
1363[[language]]
1333name = "tablegen"
1364name = "tablegen"
1334scope = "source.tablegen"
1365scope = "source.tablegen"
1366+roots = []
1335file-types = ["td"]
1367file-types = ["td"]
1336comment-token = "//"
1368comment-token = "//"
1337indent = { tab-width = 2, unit = " " }
1369indent = { tab-width = 2, unit = " " }
@@ -1359,6 +1391,7 @@ name = "markdown.inline"
1359scope = "source.markdown.inline"
1391scope = "source.markdown.inline"
1360injection-regex = "markdown\\.inline"
1392injection-regex = "markdown\\.inline"
1361file-types = []
1393file-types = []
1394+roots = []
1362grammar = "markdown_inline"
1395grammar = "markdown_inline"
1363
1396
1364[[grammar]]
1397[[grammar]]
@@ -1409,6 +1442,7 @@ source = { git = "https://github.com/camdencheek/tree-sitter-dockerfile", rev =
1409[[language]]
1442[[language]]
1410name = "git-commit"
1443name = "git-commit"
1411scope = "git.commitmsg"
1444scope = "git.commitmsg"
1445+roots = []
1412file-types = ["COMMIT_EDITMSG"]
1446file-types = ["COMMIT_EDITMSG"]
1413comment-token = "#"
1447comment-token = "#"
1414indent = { tab-width = 2, unit = " " }
1448indent = { tab-width = 2, unit = " " }
@@ -1422,6 +1456,7 @@ source = { git = "https://github.com/the-mikedavis/tree-sitter-git-commit", rev
1422[[language]]
1456[[language]]
1423name = "diff"
1457name = "diff"
1424scope = "source.diff"
1458scope = "source.diff"
1459+roots = []
1425file-types = ["diff", "patch", "rej"]
1460file-types = ["diff", "patch", "rej"]
1426injection-regex = "diff"
1461injection-regex = "diff"
1427comment-token = "#"
1462comment-token = "#"
@@ -1434,6 +1469,7 @@ source = { git = "https://github.com/the-mikedavis/tree-sitter-diff", rev = "fd7
1434[[language]]
1469[[language]]
1435name = "git-rebase"
1470name = "git-rebase"
1436scope = "source.gitrebase"
1471scope = "source.gitrebase"
1472+roots = []
1437file-types = ["git-rebase-todo"]
1473file-types = ["git-rebase-todo"]
1438injection-regex = "git-rebase"
1474injection-regex = "git-rebase"
1439comment-token = "#"
1475comment-token = "#"
@@ -1448,6 +1484,7 @@ name = "regex"
1448scope = "source.regex"
1484scope = "source.regex"
1449injection-regex = "regex"
1485injection-regex = "regex"
1450file-types = ["regex", ".Rbuildignore"]
1486file-types = ["regex", ".Rbuildignore"]
1487+roots = []
1451
1488
1452[[grammar]]
1489[[grammar]]
1453name = "regex"
1490name = "regex"
@@ -1456,6 +1493,7 @@ source = { git = "https://github.com/tree-sitter/tree-sitter-regex", rev = "e1cf
1456[[language]]
1493[[language]]
1457name = "git-config"
1494name = "git-config"
1458scope = "source.gitconfig"
1495scope = "source.gitconfig"
1496+roots = []
1459file-types = [".gitmodules", ".gitconfig", { suffix = ".git/config" }, { suffix = ".config/git/config" }]
1497file-types = [".gitmodules", ".gitconfig", { suffix = ".git/config" }, { suffix = ".config/git/config" }]
1460injection-regex = "git-config"
1498injection-regex = "git-config"
1461comment-token = "#"
1499comment-token = "#"
@@ -1468,6 +1506,7 @@ source = { git = "https://github.com/the-mikedavis/tree-sitter-git-config", rev
1468[[language]]
1506[[language]]
1469name = "git-attributes"
1507name = "git-attributes"
1470scope = "source.gitattributes"
1508scope = "source.gitattributes"
1509+roots = []
1471file-types = [".gitattributes"]
1510file-types = [".gitattributes"]
1472injection-regex = "git-attributes"
1511injection-regex = "git-attributes"
1473comment-token = "#"
1512comment-token = "#"
@@ -1480,6 +1519,7 @@ source = { git = "https://github.com/mtoohey31/tree-sitter-gitattributes", rev =
1480[[language]]
1519[[language]]
1481name = "git-ignore"
1520name = "git-ignore"
1482scope = "source.gitignore"
1521scope = "source.gitignore"
1522+roots = []
1483file-types = [".gitignore", ".gitignore_global", ".ignore", ".prettierignore", ".eslintignore", ".npmignore", "CODEOWNERS"]
1523file-types = [".gitignore", ".gitignore_global", ".ignore", ".prettierignore", ".eslintignore", ".npmignore", "CODEOWNERS"]
1484injection-regex = "git-ignore"
1524injection-regex = "git-ignore"
1485comment-token = "#"
1525comment-token = "#"
@@ -1494,6 +1534,7 @@ name = "graphql"
1494scope = "source.graphql"
1534scope = "source.graphql"
1495injection-regex = "graphql"
1535injection-regex = "graphql"
1496file-types = ["gql", "graphql", "graphqls"]
1536file-types = ["gql", "graphql", "graphqls"]
1537+roots = []
1497language-servers = [ "graphql-language-service" ]
1538language-servers = [ "graphql-language-service" ]
1498indent = { tab-width = 2, unit = " " }
1539indent = { tab-width = 2, unit = " " }
1499
1540
@@ -1521,6 +1562,7 @@ name = "iex"
1521scope = "source.iex"
1562scope = "source.iex"
1522injection-regex = "iex"
1563injection-regex = "iex"
1523file-types = ["iex"]
1564file-types = ["iex"]
1565+roots = []
1524
1566
1525[[grammar]]
1567[[grammar]]
1526name = "iex"
1568name = "iex"
@@ -1539,7 +1581,7 @@ indent = { tab-width = 2, unit = " " }
1539
1581
1540[[grammar]]
1582[[grammar]]
1541name = "rescript"
1583name = "rescript"
1542−source = { git = "https://github.com/jaredramirez/tree-sitter-rescript", rev = "467dcf99f68c47823d7b378779a6b282d7ef9782" }
1584+source = { git = "https://github.com/jaredramirez/tree-sitter-rescript", rev = "65609807c628477f3b94052e7ef895885ac51c3c" }
1543
1585
1544[[language]]
1586[[language]]
1545name = "erlang"
1587name = "erlang"
@@ -1583,6 +1625,7 @@ scope = "source.hcl"
1583injection-regex = "(hcl|tf|nomad)"
1625injection-regex = "(hcl|tf|nomad)"
1584language-id = "terraform"
1626language-id = "terraform"
1585file-types = ["hcl", "tf", "nomad"]
1627file-types = ["hcl", "tf", "nomad"]
1628+roots = []
1586comment-token = "#"
1629comment-token = "#"
1587indent = { tab-width = 2, unit = " " }
1630indent = { tab-width = 2, unit = " " }
1588language-servers = [ "terraform-ls" ]
1631language-servers = [ "terraform-ls" ]
@@ -1597,6 +1640,7 @@ name = "tfvars"
1597scope = "source.tfvars"
1640scope = "source.tfvars"
1598language-id = "terraform-vars"
1641language-id = "terraform-vars"
1599file-types = ["tfvars"]
1642file-types = ["tfvars"]
1643+roots = []
1600comment-token = "#"
1644comment-token = "#"
1601indent = { tab-width = 2, unit = " " }
1645indent = { tab-width = 2, unit = " " }
1602language-servers = [ "terraform-ls" ]
1646language-servers = [ "terraform-ls" ]
@@ -1608,6 +1652,7 @@ name = "org"
1608scope = "source.org"
1652scope = "source.org"
1609injection-regex = "org"
1653injection-regex = "org"
1610file-types = ["org"]
1654file-types = ["org"]
1655+roots = []
1611indent = { tab-width = 2, unit = " " }
1656indent = { tab-width = 2, unit = " " }
1612
1657
1613[[grammar]]
1658[[grammar]]
@@ -1619,6 +1664,7 @@ name = "solidity"
1619scope = "source.sol"
1664scope = "source.sol"
1620injection-regex = "(sol|solidity)"
1665injection-regex = "(sol|solidity)"
1621file-types = ["sol"]
1666file-types = ["sol"]
1667+roots = []
1622comment-token = "//"
1668comment-token = "//"
1623indent = { tab-width = 4, unit = " " }
1669indent = { tab-width = 4, unit = " " }
1624language-servers = [ "solc" ]
1670language-servers = [ "solc" ]
@@ -1640,13 +1686,14 @@ auto-format = true
1640
1686
1641[[grammar]]
1687[[grammar]]
1642name = "gleam"
1688name = "gleam"
1643−source = { git = "https://github.com/gleam-lang/tree-sitter-gleam", rev = "b2afa4fd6bb41a7bf912b034c653c90af7ae5122" }
1689+source = { git = "https://github.com/gleam-lang/tree-sitter-gleam", rev = "a59aadf3d7c11702cad244e7cd6b67b34ca9c16a" }
1644
1690
1645[[language]]
1691[[language]]
1646name = "ron"
1692name = "ron"
1647scope = "source.ron"
1693scope = "source.ron"
1648injection-regex = "ron"
1694injection-regex = "ron"
1649file-types = ["ron"]
1695file-types = ["ron"]
1696+roots = []
1650comment-token = "//"
1697comment-token = "//"
1651indent = { tab-width = 4, unit = " " }
1698indent = { tab-width = 4, unit = " " }
1652
1699
@@ -1660,6 +1707,7 @@ scope = "source.robot"
1660injection-regex = "robot"
1707injection-regex = "robot"
1661file-types = ["robot", "resource"]
1708file-types = ["robot", "resource"]
1662comment-token = "#"
1709comment-token = "#"
1710+roots = []
1663indent = { tab-width = 4, unit = " " }
1711indent = { tab-width = 4, unit = " " }
1664language-servers = [ "robotframework_ls" ]
1712language-servers = [ "robotframework_ls" ]
1665
1713
@@ -1673,6 +1721,7 @@ scope = "source.r"
1673injection-regex = "(r|R)"
1721injection-regex = "(r|R)"
1674file-types = ["r", "R", ".Rprofile", "Rprofile.site", ".RHistory"]
1722file-types = ["r", "R", ".Rprofile", "Rprofile.site", ".RHistory"]
1675shebangs = ["r", "R"]
1723shebangs = ["r", "R"]
1724+roots = []
1676comment-token = "#"
1725comment-token = "#"
1677indent = { tab-width = 2, unit = " " }
1726indent = { tab-width = 2, unit = " " }
1678language-servers = [ "r" ]
1727language-servers = [ "r" ]
@@ -1684,9 +1733,9 @@ source = { git = "https://github.com/r-lib/tree-sitter-r", rev = "cc04302e1bff76
1684[[language]]
1733[[language]]
1685name = "rmarkdown"
1734name = "rmarkdown"
1686scope = "source.rmd"
1735scope = "source.rmd"
1687−language-id = "rmd"
1688injection-regex = "(r|R)md"
1736injection-regex = "(r|R)md"
1689file-types = ["rmd", "Rmd"]
1737file-types = ["rmd", "Rmd"]
1738+roots = []
1690indent = { tab-width = 2, unit = " " }
1739indent = { tab-width = 2, unit = " " }
1691grammar = "markdown"
1740grammar = "markdown"
1692language-servers = [ "r" ]
1741language-servers = [ "r" ]
@@ -1710,6 +1759,7 @@ name = "erb"
1710scope = "text.html.erb"
1759scope = "text.html.erb"
1711injection-regex = "erb"
1760injection-regex = "erb"
1712file-types = ["erb"]
1761file-types = ["erb"]
1762+roots = []
1713indent = { tab-width = 2, unit = " " }
1763indent = { tab-width = 2, unit = " " }
1714grammar = "embedded-template"
1764grammar = "embedded-template"
1715
1765
@@ -1718,6 +1768,7 @@ name = "ejs"
1718scope = "text.html.ejs"
1768scope = "text.html.ejs"
1719injection-regex = "ejs"
1769injection-regex = "ejs"
1720file-types = ["ejs"]
1770file-types = ["ejs"]
1771+roots = []
1721indent = { tab-width = 2, unit = " " }
1772indent = { tab-width = 2, unit = " " }
1722grammar = "embedded-template"
1773grammar = "embedded-template"
1723
1774
@@ -1754,13 +1805,14 @@ source = { git = "https://github.com/phoenixframework/tree-sitter-heex", rev = "
1754name = "sql"
1805name = "sql"
1755scope = "source.sql"
1806scope = "source.sql"
1756file-types = ["sql", "dsql"]
1807file-types = ["sql", "dsql"]
1808+roots = []
1757comment-token = "--"
1809comment-token = "--"
1758indent = { tab-width = 4, unit = " " }
1810indent = { tab-width = 4, unit = " " }
1759injection-regex = "sql"
1811injection-regex = "sql"
1760
1812
1761[[grammar]]
1813[[grammar]]
1762name = "sql"
1814name = "sql"
1763−source = { git = "https://github.com/DerekStride/tree-sitter-sql", rev = "25be0b8f17e9189ad9e1b875869d025c5aec1286" }
1815+source = { git = "https://github.com/DerekStride/tree-sitter-sql", rev = "eeab7240a11098724e6f95bc57cc3ceaf5487d5f" }
1764
1816
1765[[language]]
1817[[language]]
1766name = "gdscript"
1818name = "gdscript"
@@ -1799,9 +1851,9 @@ scope = "source.nu"
1799injection-regex = "nu"
1851injection-regex = "nu"
1800file-types = ["nu"]
1852file-types = ["nu"]
1801shebangs = ["nu"]
1853shebangs = ["nu"]
1854+roots = []
1802comment-token = "#"
1855comment-token = "#"
1803indent = { tab-width = 2, unit = " " }
1856indent = { tab-width = 2, unit = " " }
1804−language-servers = [ "nu-lsp" ]
1805
1857
1806[[grammar]]
1858[[grammar]]
1807name = "nu"
1859name = "nu"
@@ -1812,6 +1864,7 @@ name = "vala"
1812scope = "source.vala"
1864scope = "source.vala"
1813injection-regex = "vala"
1865injection-regex = "vala"
1814file-types = ["vala", "vapi"]
1866file-types = ["vala", "vapi"]
1867+roots = []
1815comment-token = "//"
1868comment-token = "//"
1816indent = { tab-width = 2, unit = " " }
1869indent = { tab-width = 2, unit = " " }
1817language-servers = [ "vala-language-server" ]
1870language-servers = [ "vala-language-server" ]
@@ -1825,6 +1878,7 @@ name = "hare"
1825scope = "source.hare"
1878scope = "source.hare"
1826injection-regex = "hare"
1879injection-regex = "hare"
1827file-types = ["ha"]
1880file-types = ["ha"]
1881+roots = []
1828comment-token = "//"
1882comment-token = "//"
1829indent = { tab-width = 8, unit = "\t" }
1883indent = { tab-width = 8, unit = "\t" }
1830
1884
@@ -1837,6 +1891,7 @@ name = "devicetree"
1837scope = "source.devicetree"
1891scope = "source.devicetree"
1838injection-regex = "(dtsi?|devicetree|fdt)"
1892injection-regex = "(dtsi?|devicetree|fdt)"
1839file-types = ["dts", "dtsi"]
1893file-types = ["dts", "dtsi"]
1894+roots = []
1840comment-token = "//"
1895comment-token = "//"
1841indent = { tab-width = 4, unit = "\t" }
1896indent = { tab-width = 4, unit = "\t" }
1842
1897
@@ -1849,6 +1904,7 @@ name = "cairo"
1849scope = "source.cairo"
1904scope = "source.cairo"
1850injection-regex = "cairo"
1905injection-regex = "cairo"
1851file-types = ["cairo"]
1906file-types = ["cairo"]
1907+roots = []
1852comment-token = "//"
1908comment-token = "//"
1853indent = { tab-width = 4, unit = " " }
1909indent = { tab-width = 4, unit = " " }
1854# auto-format = true
1910# auto-format = true
@@ -1860,6 +1916,7 @@ name = "cpon"
1860scope = "scope.cpon"
1916scope = "scope.cpon"
1861injection-regex = "cpon"
1917injection-regex = "cpon"
1862file-types = ["cpon", "cp"]
1918file-types = ["cpon", "cp"]
1919+roots = []
1863auto-format = true
1920auto-format = true
1864comment-token = "//"
1921comment-token = "//"
1865indent = { tab-width = 2, unit = " " }
1922indent = { tab-width = 2, unit = " " }
@@ -1886,7 +1943,8 @@ source = { git = "https://github.com/ap29600/tree-sitter-odin", rev = "b219207e4
1886name = "meson"
1943name = "meson"
1887scope = "source.meson"
1944scope = "source.meson"
1888injection-regex = "meson"
1945injection-regex = "meson"
1889−file-types = ["meson.build", "meson_options.txt"]
1946+file-types = ["meson.build"]
1947+roots = []
1890comment-token = "#"
1948comment-token = "#"
1891indent = { tab-width = 2, unit = " " }
1949indent = { tab-width = 2, unit = " " }
1892
1950
@@ -1898,6 +1956,7 @@ source = { git = "https://github.com/staysail/tree-sitter-meson", rev = "32a83e8
1898name = "sshclientconfig"
1956name = "sshclientconfig"
1899scope = "source.sshclientconfig"
1957scope = "source.sshclientconfig"
1900file-types = [{ suffix = ".ssh/config" }, { suffix = "/etc/ssh/ssh_config" }]
1958file-types = [{ suffix = ".ssh/config" }, { suffix = "/etc/ssh/ssh_config" }]
1959+roots = []
1901comment-token = "#"
1960comment-token = "#"
1902
1961
1903[[grammar]]
1962[[grammar]]
@@ -1910,6 +1969,7 @@ scope = "source.scheme"
1910injection-regex = "scheme"
1969injection-regex = "scheme"
1911file-types = ["ss", "scm"]
1970file-types = ["ss", "scm"]
1912shebangs = ["scheme", "guile", "chicken"]
1971shebangs = ["scheme", "guile", "chicken"]
1972+roots = []
1913comment-token = ";"
1973comment-token = ";"
1914indent = { tab-width = 2, unit = " " }
1974indent = { tab-width = 2, unit = " " }
1915
1975
@@ -1936,6 +1996,7 @@ source = {git = "https://github.com/v-analyzer/v-analyzer", subpath = "tree_sitt
1936name = "verilog"
1996name = "verilog"
1937scope = "source.verilog"
1997scope = "source.verilog"
1938file-types = ["v", "vh", "sv", "svh"]
1998file-types = ["v", "vh", "sv", "svh"]
1999+roots = []
1939comment-token = "//"
2000comment-token = "//"
1940language-servers = [ "svlangserver" ]
2001language-servers = [ "svlangserver" ]
1941indent = { tab-width = 2, unit = " " }
2002indent = { tab-width = 2, unit = " " }
@@ -1950,6 +2011,7 @@ name = "edoc"
1950scope = "source.edoc"
2011scope = "source.edoc"
1951file-types = ["edoc", "edoc.in"]
2012file-types = ["edoc", "edoc.in"]
1952injection-regex = "edoc"
2013injection-regex = "edoc"
2014+roots = []
1953indent = { tab-width = 4, unit = " " }
2015indent = { tab-width = 4, unit = " " }
1954
2016
1955[[grammar]]
2017[[grammar]]
@@ -1961,6 +2023,7 @@ name = "jsdoc"
1961scope = "source.jsdoc"
2023scope = "source.jsdoc"
1962injection-regex = "jsdoc"
2024injection-regex = "jsdoc"
1963file-types = ["jsdoc"]
2025file-types = ["jsdoc"]
2026+roots = []
1964indent = { tab-width = 2, unit = " " }
2027indent = { tab-width = 2, unit = " " }
1965
2028
1966[[grammar]]
2029[[grammar]]
@@ -1972,6 +2035,7 @@ name = "openscad"
1972scope = "source.openscad"
2035scope = "source.openscad"
1973injection-regex = "openscad"
2036injection-regex = "openscad"
1974file-types = ["scad"]
2037file-types = ["scad"]
2038+roots = []
1975comment-token = "//"
2039comment-token = "//"
1976language-servers = [ "openscad-lsp" ]
2040language-servers = [ "openscad-lsp" ]
1977indent = { tab-width = 2, unit = "\t" }
2041indent = { tab-width = 2, unit = "\t" }
@@ -2013,6 +2077,7 @@ name = "starlark"
2013scope = "source.starlark"
2077scope = "source.starlark"
2014injection-regex = "(starlark|bzl|bazel)"
2078injection-regex = "(starlark|bzl|bazel)"
2015file-types = ["bzl", "bazel", "BUILD", "star"]
2079file-types = ["bzl", "bazel", "BUILD", "star"]
2080+roots = []
2016comment-token = "#"
2081comment-token = "#"
2017indent = { tab-width = 4, unit = " " }
2082indent = { tab-width = 4, unit = " " }
2018grammar = "python"
2083grammar = "python"
@@ -2021,6 +2086,7 @@ grammar = "python"
2021name = "elvish"
2086name = "elvish"
2022scope = "source.elvish"
2087scope = "source.elvish"
2023file-types = ["elv"]
2088file-types = ["elv"]
2089+roots = []
2024comment-token = "#"
2090comment-token = "#"
2025indent = { tab-width = 2, unit = " " }
2091indent = { tab-width = 2, unit = " " }
2026language-servers = [ "elvish" ]
2092language-servers = [ "elvish" ]
@@ -2036,6 +2102,7 @@ scope = "source.idr"
2036injection-regex = "idr"
2102injection-regex = "idr"
2037file-types = ["idr"]
2103file-types = ["idr"]
2038shebangs = []
2104shebangs = []
2105+roots = []
2039comment-token = "--"
2106comment-token = "--"
2040indent = { tab-width = 2, unit = " " }
2107indent = { tab-width = 2, unit = " " }
2041language-servers = [ "idris2-lsp" ]
2108language-servers = [ "idris2-lsp" ]
@@ -2059,18 +2126,20 @@ name = "ungrammar"
2059scope = "source.ungrammar"
2126scope = "source.ungrammar"
2060injection-regex = "ungrammar"
2127injection-regex = "ungrammar"
2061file-types = ["ungram", "ungrammar"]
2128file-types = ["ungram", "ungrammar"]
2129+roots = []
2062comment-token = "//"
2130comment-token = "//"
2063indent = { tab-width = 2, unit = " " }
2131indent = { tab-width = 2, unit = " " }
2064
2132
2065[[grammar]]
2133[[grammar]]
2066name = "ungrammar"
2134name = "ungrammar"
2067−source = { git = "https://github.com/Philipp-M/tree-sitter-ungrammar", rev = "a7e104629cff5a8b7367187610631e8f5eb7c6ea" }
2135+source = { git = "https://github.com/Philipp-M/tree-sitter-ungrammar", rev = "0113de880a58ea14f2a75802e9b99fcc25003d9c" }
2068
2136
2069[[language]]
2137[[language]]
2070name = "dot"
2138name = "dot"
2071scope = "source.dot"
2139scope = "source.dot"
2072injection-regex = "dot"
2140injection-regex = "dot"
2073file-types = ["dot"]
2141file-types = ["dot"]
2142+roots = []
2074comment-token = "//"
2143comment-token = "//"
2075indent = { tab-width = 4, unit = " " }
2144indent = { tab-width = 4, unit = " " }
2076language-servers = [ "dot-language-server" ]
2145language-servers = [ "dot-language-server" ]
@@ -2100,6 +2169,7 @@ name = "slint"
2100scope = "source.slint"
2169scope = "source.slint"
2101injection-regex = "slint"
2170injection-regex = "slint"
2102file-types = ["slint"]
2171file-types = ["slint"]
2172+roots = []
2103comment-token = "//"
2173comment-token = "//"
2104indent = { tab-width = 4, unit = " " }
2174indent = { tab-width = 4, unit = " " }
2105language-servers = [ "slint-lsp" ]
2175language-servers = [ "slint-lsp" ]
@@ -2113,6 +2183,7 @@ name = "task"
2113scope = "source.task"
2183scope = "source.task"
2114injection-regex = "task"
2184injection-regex = "task"
2115file-types = ["task"]
2185file-types = ["task"]
2186+roots = []
2116comment-token = "#"
2187comment-token = "#"
2117indent = { tab-width = 2, unit = " " }
2188indent = { tab-width = 2, unit = " " }
2118
2189
@@ -2125,6 +2196,7 @@ name = "xit"
2125scope = "source.xit"
2196scope = "source.xit"
2126injection-regex = "xit"
2197injection-regex = "xit"
2127file-types = ["xit"]
2198file-types = ["xit"]
2199+roots = []
2128indent = { tab-width = 4, unit = " " }
2200indent = { tab-width = 4, unit = " " }
2129
2201
2130[[grammar]]
2202[[grammar]]
@@ -2149,6 +2221,7 @@ name = "pascal"
2149scope = "source.pascal"
2221scope = "source.pascal"
2150injection-regex = "pascal"
2222injection-regex = "pascal"
2151file-types = ["pas", "pp", "inc", "lpr", "lfm"]
2223file-types = ["pas", "pp", "inc", "lpr", "lfm"]
2224+roots = []
2152comment-token = "//"
2225comment-token = "//"
2153indent = { tab-width = 2, unit = " " }
2226indent = { tab-width = 2, unit = " " }
2154language-servers = [ "pasls" ]
2227language-servers = [ "pasls" ]
@@ -2163,6 +2236,7 @@ scope = "source.sml"
2163injection-regex = "sml"
2236injection-regex = "sml"
2164file-types = ["sml"]
2237file-types = ["sml"]
2165comment-token = "(*"
2238comment-token = "(*"
2239+roots = []
2166
2240
2167[[grammar]]
2241[[grammar]]
2168name = "sml"
2242name = "sml"
@@ -2186,17 +2260,19 @@ name = "astro"
2186scope = "source.astro"
2260scope = "source.astro"
2187injection-regex = "astro"
2261injection-regex = "astro"
2188file-types = ["astro"]
2262file-types = ["astro"]
2263+roots = []
2189indent = { tab-width = 2, unit = " " }
2264indent = { tab-width = 2, unit = " " }
2190
2265
2191[[grammar]]
2266[[grammar]]
2192name = "astro"
2267name = "astro"
2193−source = { git = "https://github.com/virchau13/tree-sitter-astro", rev = "947e93089e60c66e681eba22283f4037841451e7" }
2268+source = { git = "https://github.com/virchau13/tree-sitter-astro", rev = "5f5c3e73c45967df9aa42f861fad2d77cd4e0900" }
2194
2269
2195[[language]]
2270[[language]]
2196name = "bass"
2271name = "bass"
2197scope = "source.bass"
2272scope = "source.bass"
2198injection-regex = "bass"
2273injection-regex = "bass"
2199file-types = ["bass"]
2274file-types = ["bass"]
2275+roots = []
2200comment-token = ";"
2276comment-token = ";"
2201indent = { tab-width = 2, unit = " " }
2277indent = { tab-width = 2, unit = " " }
2202language-servers = [ "bass" ]
2278language-servers = [ "bass" ]
@@ -2210,6 +2286,7 @@ name = "wat"
2210scope = "source.wat"
2286scope = "source.wat"
2211comment-token = ";;"
2287comment-token = ";;"
2212file-types = ["wat"]
2288file-types = ["wat"]
2289+roots = []
2213
2290
2214[[grammar]]
2291[[grammar]]
2215name = "wat"
2292name = "wat"
@@ -2220,6 +2297,7 @@ name = "wast"
2220scope = "source.wast"
2297scope = "source.wast"
2221comment-token = ";;"
2298comment-token = ";;"
2222file-types = ["wast"]
2299file-types = ["wast"]
2300+roots = []
2223
2301
2224[[grammar]]
2302[[grammar]]
2225name = "wast"
2303name = "wast"
@@ -2229,6 +2307,7 @@ source = { git = "https://github.com/wasm-lsp/tree-sitter-wasm", rev = "2ca28a9f
2229name = "d"
2307name = "d"
2230scope = "source.d"
2308scope = "source.d"
2231file-types = [ "d", "dd" ]
2309file-types = [ "d", "dd" ]
2310+roots = []
2232comment-token = "//"
2311comment-token = "//"
2233injection-regex = "d"
2312injection-regex = "d"
2234indent = { tab-width = 4, unit = " "}
2313indent = { tab-width = 4, unit = " "}
@@ -2237,12 +2316,13 @@ formatter = { command = "dfmt" }
2237
2316
2238[[grammar]]
2317[[grammar]]
2239name = "d"
2318name = "d"
2240−source = { git = "https://github.com/gdamore/tree-sitter-d", rev = "5566f8ce8fc24186fad06170bbb3c8d97c935d74" }
2319+source = { git = "https://github.com/gdamore/tree-sitter-d", rev="601c4a1e8310fb2f3c43fa8a923d0d27497f3c04" }
2241
2320
2242[[language]]
2321[[language]]
2243name = "vhs"
2322name = "vhs"
2244scope = "source.vhs"
2323scope = "source.vhs"
2245file-types = ["tape"]
2324file-types = ["tape"]
2325+roots = []
2246comment-token = "#"
2326comment-token = "#"
2247indent = { tab-width = 2, unit = " " }
2327indent = { tab-width = 2, unit = " " }
2248grammar = "vhs"
2328grammar = "vhs"
@@ -2255,6 +2335,7 @@ source = { git = "https://github.com/charmbracelet/tree-sitter-vhs", rev = "c6d8
2255name = "kdl"
2335name = "kdl"
2256scope = "source.kdl"
2336scope = "source.kdl"
2257file-types = ["kdl"]
2337file-types = ["kdl"]
2338+roots = []
2258comment-token = "//"
2339comment-token = "//"
2259injection-regex = "kdl"
2340injection-regex = "kdl"
2260
2341
@@ -2320,11 +2401,10 @@ file-types = [
2320 "xliff",
2401 "xliff",
2321 "xpdl",
2402 "xpdl",
2322 "xul",
2403 "xul",
2323− "xoml",
2404+ "xoml"
2324− "musicxml",
2325− "glif"
2326]
2405]
2327indent = { tab-width = 2, unit = " " }
2406indent = { tab-width = 2, unit = " " }
2407+roots = []
2328
2408
2329[language.auto-pairs]
2409[language.auto-pairs]
2330'(' = ')'
2410'(' = ')'
@@ -2345,6 +2425,7 @@ scope = "source.dtd"
2345injection-regex = "dtd"
2425injection-regex = "dtd"
2346file-types = ["dtd", "ent"]
2426file-types = ["dtd", "ent"]
2347indent = {tab-width = 2, unit = " "}
2427indent = {tab-width = 2, unit = " "}
2428+roots = []
2348
2429
2349[language.auto-pairs]
2430[language.auto-pairs]
2350'(' = ')'
2431'(' = ')'
@@ -2362,6 +2443,7 @@ name = "wit"
2362scope = "source.wit"
2443scope = "source.wit"
2363injection-regex = "wit"
2444injection-regex = "wit"
2364file-types = ["wit"]
2445file-types = ["wit"]
2446+roots = []
2365comment-token = "//"
2447comment-token = "//"
2366indent = { tab-width = 2, unit = " " }
2448indent = { tab-width = 2, unit = " " }
2367
2449
@@ -2380,10 +2462,11 @@ source = { git = "https://github.com/hh9527/tree-sitter-wit", rev = "c917790ab9a
2380[[language]]
2462[[language]]
2381name = "env"
2463name = "env"
2382scope = "source.env"
2464scope = "source.env"
2383−file-types = [".env", ".env.local", ".env.development", ".env.production", ".env.dist", ".envrc", ".envrc.local", ".envrc.private"]
2465+file-types = [".env", ".env.local", ".env.development", ".env.production", ".env.dist", ".envrc"]
2384injection-regex = "env"
2466injection-regex = "env"
2385comment-token = "#"
2467comment-token = "#"
2386indent = { tab-width = 4, unit = "\t" }
2468indent = { tab-width = 4, unit = "\t" }
2469+roots = []
2387grammar = "bash"
2470grammar = "bash"
2388
2471
2389[[language]]
2472[[language]]
@@ -2416,6 +2499,7 @@ file-types = [
2416injection-regex = "ini"
2499injection-regex = "ini"
2417comment-token = "#"
2500comment-token = "#"
2418indent = { tab-width = 4, unit = "\t" }
2501indent = { tab-width = 4, unit = "\t" }
2502+roots = []
2419
2503
2420[[grammar]]
2504[[grammar]]
2421name = "ini"
2505name = "ini"
@@ -2425,6 +2509,7 @@ source = { git = "https://github.com/justinmk/tree-sitter-ini", rev = "4d247fb87
2425name = "bicep"
2509name = "bicep"
2426scope = "source.bicep"
2510scope = "source.bicep"
2427file-types = ["bicep"]
2511file-types = ["bicep"]
2512+roots = []
2428auto-format = true
2513auto-format = true
2429comment-token = "//"
2514comment-token = "//"
2430indent = { tab-width = 2, unit = " "}
2515indent = { tab-width = 2, unit = " "}
@@ -2438,6 +2523,7 @@ source = { git = "https://github.com/the-mikedavis/tree-sitter-bicep", rev = "d8
2438name = "qml"
2523name = "qml"
2439scope = "source.qml"
2524scope = "source.qml"
2440file-types = ["qml"]
2525file-types = ["qml"]
2526+roots = []
2441language-servers = [ "qmlls" ]
2527language-servers = [ "qmlls" ]
2442indent = { tab-width = 4, unit = " " }
2528indent = { tab-width = 4, unit = " " }
2443grammar = "qmljs"
2529grammar = "qmljs"
@@ -2451,6 +2537,7 @@ name = "mermaid"
2451scope = "source.mermaid"
2537scope = "source.mermaid"
2452injection-regex = "mermaid"
2538injection-regex = "mermaid"
2453file-types = ["mermaid"]
2539file-types = ["mermaid"]
2540+roots = []
2454comment-token = "%%"
2541comment-token = "%%"
2455indent = { tab-width = 4, unit = " " }
2542indent = { tab-width = 4, unit = " " }
2456
2543
@@ -2464,6 +2551,7 @@ scope = "source.m"
2464file-types = ["m"]
2551file-types = ["m"]
2465comment-token = "%"
2552comment-token = "%"
2466shebangs = ["octave-cli", "matlab"]
2553shebangs = ["octave-cli", "matlab"]
2554+roots = []
2467indent = { tab-width = 2, unit = " " }
2555indent = { tab-width = 2, unit = " " }
2468
2556
2469[[grammar]]
2557[[grammar]]
@@ -2488,6 +2576,7 @@ name = "dhall"
2488scope = "source.dhall"
2576scope = "source.dhall"
2489injection-regex = "dhall"
2577injection-regex = "dhall"
2490file-types = ["dhall"]
2578file-types = ["dhall"]
2579+roots = []
2491comment-token = "--"
2580comment-token = "--"
2492indent = { tab-width = 2, unit = " " }
2581indent = { tab-width = 2, unit = " " }
2493language-servers = [ "dhall-lsp-server" ]
2582language-servers = [ "dhall-lsp-server" ]
@@ -2502,6 +2591,7 @@ name = "sage"
2502scope = "source.sage"
2591scope = "source.sage"
2503file-types = ["sage"]
2592file-types = ["sage"]
2504injection-regex = "sage"
2593injection-regex = "sage"
2594+roots = []
2505comment-token = "#"
2595comment-token = "#"
2506indent = { tab-width = 4, unit = " " }
2596indent = { tab-width = 4, unit = " " }
2507grammar = "python"
2597grammar = "python"
@@ -2512,6 +2602,7 @@ scope = "source.msbuild"
2512injection-regex = "msbuild"
2602injection-regex = "msbuild"
2513file-types = ["proj", "vbproj", "csproj", "fsproj", "targets", "props"]
2603file-types = ["proj", "vbproj", "csproj", "fsproj", "targets", "props"]
2514indent = { tab-width = 2, unit = " " }
2604indent = { tab-width = 2, unit = " " }
2605+roots = []
2515grammar = "xml"
2606grammar = "xml"
2516
2607
2517[language.auto-pairs]
2608[language.auto-pairs]
@@ -2527,6 +2618,7 @@ name = "pem"
2527scope = "source.pem"
2618scope = "source.pem"
2528file-types = ["pem", "cert", "crt"]
2619file-types = ["pem", "cert", "crt"]
2529injection-regex = "pem"
2620injection-regex = "pem"
2621+roots = []
2530grammar = "pem"
2622grammar = "pem"
2531
2623
2532[[grammar]]
2624[[grammar]]
@@ -2537,6 +2629,7 @@ source = { git = "https://github.com/mtoohey31/tree-sitter-pem", rev = "be67a433
2537name = "passwd"
2629name = "passwd"
2538scope = "source.passwd"
2630scope = "source.passwd"
2539file-types = ["passwd"]
2631file-types = ["passwd"]
2632+roots = []
2540
2633
2541[[grammar]]
2634[[grammar]]
2542name = "passwd"
2635name = "passwd"
@@ -2546,6 +2639,7 @@ source = { git = "https://github.com/ath3/tree-sitter-passwd", rev = "20239395ea
2546name = "hosts"
2639name = "hosts"
2547scope = "source.hosts"
2640scope = "source.hosts"
2548file-types = ["hosts"]
2641file-types = ["hosts"]
2642+roots = []
2549comment-token = "#"
2643comment-token = "#"
2550
2644
2551[[grammar]]
2645[[grammar]]
@@ -2557,18 +2651,20 @@ name = "uxntal"
2557scope = "source.tal"
2651scope = "source.tal"
2558injection-regex = "tal"
2652injection-regex = "tal"
2559file-types = ["tal"]
2653file-types = ["tal"]
2654+roots = []
2560auto-format = false
2655auto-format = false
2561comment-token = "("
2656comment-token = "("
2562
2657
2563[[grammar]]
2658[[grammar]]
2564name = "uxntal"
2659name = "uxntal"
2565−source = { git = "https://github.com/Jummit/tree-sitter-uxntal", rev = "d68406066648cd6db4c6a2f11ec305af02079884" }
2660+source = { git = "https://github.com/Jummit/tree-sitter-uxntal", rev = "9297e95ef74380b0ad84c4fd98f91e9f6e4319e6" }
2566
2661
2567[[language]]
2662[[language]]
2568name = "yuck"
2663name = "yuck"
2569scope = "source.yuck"
2664scope = "source.yuck"
2570injection-regex = "yuck"
2665injection-regex = "yuck"
2571file-types = ["yuck"]
2666file-types = ["yuck"]
2667+roots = []
2572comment-token = ";"
2668comment-token = ";"
2573indent = { tab-width = 2, unit = " " }
2669indent = { tab-width = 2, unit = " " }
2574
2670
@@ -2581,6 +2677,7 @@ name = "prql"
2581scope = "source.prql"
2677scope = "source.prql"
2582injection-regex = "prql"
2678injection-regex = "prql"
2583file-types = ["prql"]
2679file-types = ["prql"]
2680+roots = []
2584comment-token = "#"
2681comment-token = "#"
2585indent = { tab-width = 4, unit = " " }
2682indent = { tab-width = 4, unit = " " }
2586
2683
@@ -2592,6 +2689,7 @@ source = { git = "https://github.com/PRQL/tree-sitter-prql", rev = "09e158cd3650
2592name = "po"
2689name = "po"
2593scope = "source.po"
2690scope = "source.po"
2594file-types = ["po", "pot"]
2691file-types = ["po", "pot"]
2692+roots = []
2595comment-token = "#"
2693comment-token = "#"
2596
2694
2597[[grammar]]
2695[[grammar]]
@@ -2603,6 +2701,7 @@ name = "nasm"
2603scope = "source.nasm"
2701scope = "source.nasm"
2604file-types = ["asm", "S", "nasm"]
2702file-types = ["asm", "S", "nasm"]
2605injection-regex = "n?asm"
2703injection-regex = "n?asm"
2704+roots = []
2606comment-token = ";"
2705comment-token = ";"
2607indent = { tab-width = 8, unit = " " }
2706indent = { tab-width = 8, unit = " " }
2608
2707
@@ -2615,6 +2714,7 @@ name = "gas"
2615scope = "source.gas"
2714scope = "source.gas"
2616file-types = ["s"]
2715file-types = ["s"]
2617injection-regex = "gas"
2716injection-regex = "gas"
2717+roots = []
2618comment-token = "#"
2718comment-token = "#"
2619indent = { tab-width = 8, unit = " " }
2719indent = { tab-width = 8, unit = " " }
2620
2720
@@ -2627,6 +2727,7 @@ name = "rst"
2627scope = "source.rst"
2727scope = "source.rst"
2628comment-token = ".."
2728comment-token = ".."
2629file-types = ["rst"]
2729file-types = ["rst"]
2730+roots = []
2630
2731
2631[[grammar]]
2732[[grammar]]
2632name = "rst"
2733name = "rst"
@@ -2637,6 +2738,7 @@ name = "capnp"
2637scope = "source.capnp"
2738scope = "source.capnp"
2638injection-regex = "capnp"
2739injection-regex = "capnp"
2639file-types = ["capnp"]
2740file-types = ["capnp"]
2741+roots = []
2640comment-token = "#"
2742comment-token = "#"
2641indent = { tab-width = 2, unit = " " }
2743indent = { tab-width = 2, unit = " " }
2642
2744
@@ -2662,6 +2764,7 @@ source = { git = "https://github.com/indoorvivants/tree-sitter-smithy", rev = "c
2662name = "vhdl"
2764name = "vhdl"
2663scope = "source.vhdl"
2765scope = "source.vhdl"
2664file-types = ["vhd", "vhdl"]
2766file-types = ["vhd", "vhdl"]
2767+roots = []
2665comment-token = "--"
2768comment-token = "--"
2666language-servers = [ "vhdl_ls" ]
2769language-servers = [ "vhdl_ls" ]
2667indent = { tab-width = 2, unit = " " }
2770indent = { tab-width = 2, unit = " " }
@@ -2673,6 +2776,7 @@ source = { git = "https://github.com/teburd/tree-sitter-vhdl", rev = "c57313adee
2673
2776
2674[[language]]
2777[[language]]
2675name = "rego"
2778name = "rego"
2779+roots = []
2676scope = "source.rego"
2780scope = "source.rego"
2677injection-regex = "rego"
2781injection-regex = "rego"
2678file-types = ["rego"]
2782file-types = ["rego"]
@@ -2683,7 +2787,7 @@ grammar = "rego"
2683
2787
2684[[grammar]]
2788[[grammar]]
2685name = "rego"
2789name = "rego"
2686−source = { git = "https://github.com/FallenAngel97/tree-sitter-rego", rev = "9ac75e71b2d791e0aadeef68098319d86a2a14cf" }
2790+source = { git = "https://github.com/FallenAngel97/tree-sitter-rego", rev = "b2667c975f07b33be3ceb83bea5cfbad88095866" }
2687
2791
2688[[language]]
2792[[language]]
2689name = "nim"
2793name = "nim"
@@ -2691,6 +2795,7 @@ scope = "source.nim"
2691injection-regex = "nim"
2795injection-regex = "nim"
2692file-types = ["nim", "nims", "nimble"]
2796file-types = ["nim", "nims", "nimble"]
2693shebangs = []
2797shebangs = []
2798+roots = []
2694comment-token = "#"
2799comment-token = "#"
2695indent = { tab-width = 2, unit = " " }
2800indent = { tab-width = 2, unit = " " }
2696language-servers = [ "nimlangserver" ]
2801language-servers = [ "nimlangserver" ]
@@ -2714,13 +2819,13 @@ file-types = [ "cabal" ]
2714roots = ["cabal.project", "Setup.hs"]
2819roots = ["cabal.project", "Setup.hs"]
2715indent = { tab-width = 2, unit = " " }
2820indent = { tab-width = 2, unit = " " }
2716comment-token = "--"
2821comment-token = "--"
2717−language-servers = [ "haskell-language-server" ]
2718
2822
2719[[language]]
2823[[language]]
2720name = "hurl"
2824name = "hurl"
2721scope = "source.hurl"
2825scope = "source.hurl"
2722injection-regex = "hurl"
2826injection-regex = "hurl"
2723file-types = ["hurl"]
2827file-types = ["hurl"]
2828+roots = []
2724comment-token = "#"
2829comment-token = "#"
2725indent = { tab-width = 2, unit = " " }
2830indent = { tab-width = 2, unit = " " }
2726
2831
@@ -2731,6 +2836,7 @@ source = { git = "https://github.com/pfeiferj/tree-sitter-hurl", rev = "264c4206
2731[[language]]
2836[[language]]
2732name = "markdoc"
2837name = "markdoc"
2733scope = "text.markdoc"
2838scope = "text.markdoc"
2839+roots = []
2734file-types = ["mdoc"]
2840file-types = ["mdoc"]
2735language-servers = [ "markdoc-ls" ]
2841language-servers = [ "markdoc-ls" ]
2736
2842
@@ -2743,6 +2849,7 @@ name = "opencl"
2743scope = "source.cl"
2849scope = "source.cl"
2744injection-regex = "(cl|opencl)"
2850injection-regex = "(cl|opencl)"
2745file-types = ["cl"]
2851file-types = ["cl"]
2852+roots = []
2746comment-token = "//"
2853comment-token = "//"
2747language-servers = [ "clangd" ]
2854language-servers = [ "clangd" ]
2748
2855
@@ -2755,6 +2862,7 @@ name = "just"
2755scope = "source.just"
2862scope = "source.just"
2756file-types = ["justfile", "Justfile", ".justfile", ".Justfile"]
2863file-types = ["justfile", "Justfile", ".justfile", ".Justfile"]
2757injection-regex = "just"
2864injection-regex = "just"
2865+roots = []
2758comment-token = "#"
2866comment-token = "#"
2759indent = { tab-width = 4, unit = "\t" }
2867indent = { tab-width = 4, unit = "\t" }
2760
2868
@@ -2762,25 +2870,12 @@ indent = { tab-width = 4, unit = "\t" }
2762name = "just"
2870name = "just"
2763source = { git = "https://github.com/IndianBoy42/tree-sitter-just", rev = "8af0aab79854aaf25b620a52c39485849922f766" }
2871source = { git = "https://github.com/IndianBoy42/tree-sitter-just", rev = "8af0aab79854aaf25b620a52c39485849922f766" }
2764
2872
2765−[[language]]
2766−name = "gn"
2767−scope = "source.gn"
2768−injection-regex = "gn"
2769−file-types = ["gn", "gni"]
2770−roots = []
2771−comment-token = "#"
2772−indent = { tab-width = 2, unit = " " }
2773−formatter = { command = "gn", args = ["format", "--stdin"] }
2774−
2775−[[grammar]]
2776−name = "gn"
2777−source = { git = "https://github.com/willcassella/tree-sitter-gn", rev = "e18d6e36a79b20dafb58f19d407bd38b0e60260e" }
2778−
2779[[language]]
2873[[language]]
2780name = "blueprint"
2874name = "blueprint"
2781scope = "source.blueprint"
2875scope = "source.blueprint"
2782injection-regex = "blueprint"
2876injection-regex = "blueprint"
2783file-types = ["blp"]
2877file-types = ["blp"]
2878+roots = []
2784comment-token = "//"
2879comment-token = "//"
2785language-servers = [ "blueprint-compiler" ]
2880language-servers = [ "blueprint-compiler" ]
2786indent = { tab-width = 4, unit = " " }
2881indent = { tab-width = 4, unit = " " }
@@ -2794,13 +2889,14 @@ name = "forth"
2794scope = "source.forth"
2889scope = "source.forth"
2795injection-regex = "forth"
2890injection-regex = "forth"
2796file-types = ["fs", "forth", "fth", "4th"]
2891file-types = ["fs", "forth", "fth", "4th"]
2892+roots = []
2797comment-token = "\\"
2893comment-token = "\\"
2798language-servers = [ "forth-lsp" ]
2894language-servers = [ "forth-lsp" ]
2799indent = { tab-width = 3, unit = " " }
2895indent = { tab-width = 3, unit = " " }
2800
2896
2801[[grammar]]
2897[[grammar]]
2802name = "forth"
2898name = "forth"
2803−source = { git = "https://github.com/alexanderbrevig/tree-sitter-forth", rev = "90189238385cf636b9ee99ce548b9e5b5e569d48" }
2899+source = { git = "https://github.com/alexanderbrevig/tree-sitter-forth", rev = "304ed77beb113e37af38b20ff14e3c37bf350d10" }
2804
2900
2805[[language]]
2901[[language]]
2806name = "fsharp"
2902name = "fsharp"
@@ -2822,6 +2918,7 @@ name = "t32"
2822scope = "source.t32"
2918scope = "source.t32"
2823injection-regex = "t32"
2919injection-regex = "t32"
2824file-types = ["cmm", "t32"]
2920file-types = ["cmm", "t32"]
2921+roots = []
2825comment-token = ";"
2922comment-token = ";"
2826indent = { tab-width = 2, unit = " " }
2923indent = { tab-width = 2, unit = " " }
2827
2924
@@ -2834,6 +2931,7 @@ name = "webc"
2834scope = "text.html.webc"
2931scope = "text.html.webc"
2835injection-regex = "webc"
2932injection-regex = "webc"
2836file-types = ["webc"]
2933file-types = ["webc"]
2934+roots = []
2837indent = { tab-width = 2, unit = " " }
2935indent = { tab-width = 2, unit = " " }
2838grammar = "html"
2936grammar = "html"
2839
2937
@@ -2842,6 +2940,7 @@ name = "typst"
2842scope = "source.typst"
2940scope = "source.typst"
2843injection-regex = "typst"
2941injection-regex = "typst"
2844file-types = ["typst", "typ"]
2942file-types = ["typst", "typ"]
2943+roots = []
2845comment-token = "//"
2944comment-token = "//"
2846language-servers = ["typst-lsp"]
2945language-servers = ["typst-lsp"]
2847indent = { tab-width = 2, unit = " " }
2946indent = { tab-width = 2, unit = " " }
@@ -2862,6 +2961,7 @@ name = "nunjucks"
2862scope = "text.html.nunjucks"
2961scope = "text.html.nunjucks"
2863injection-regex = "nunjucks"
2962injection-regex = "nunjucks"
2864file-types = ["njk"]
2963file-types = ["njk"]
2964+roots = []
2865indent = { tab-width = 2, unit = " " }
2965indent = { tab-width = 2, unit = " " }
2866grammar = "jinja2"
2966grammar = "jinja2"
2867
2967
@@ -2870,6 +2970,7 @@ name = "jinja"
2870scope = "text.html.jinja"
2970scope = "text.html.jinja"
2871injection-regex = "jinja"
2971injection-regex = "jinja"
2872file-types = ["jinja", "jinja2", "j2"]
2972file-types = ["jinja", "jinja2", "j2"]
2973+roots = []
2873indent = { tab-width = 2, unit = " " }
2974indent = { tab-width = 2, unit = " " }
2874grammar = "jinja2"
2975grammar = "jinja2"
2875
2976
@@ -2886,6 +2987,7 @@ name = "wren"
2886scope = "source.wren"
2987scope = "source.wren"
2887injection-regex = "wren"
2988injection-regex = "wren"
2888file-types = ["wren"]
2989file-types = ["wren"]
2990+roots = []
2889indent = { tab-width = 2, unit = " "}
2991indent = { tab-width = 2, unit = " "}
2890
2992
2891[[language]]
2993[[language]]
@@ -2894,6 +2996,7 @@ scope = "source.unison"
2894injection-regex = "unison"
2996injection-regex = "unison"
2895file-types = ["u"]
2997file-types = ["u"]
2896shebangs = []
2998shebangs = []
2999+roots = []
2897auto-format = false
3000auto-format = false
2898comment-token = "--"
3001comment-token = "--"
2899indent = { tab-width = 4, unit = " " }
3002indent = { tab-width = 4, unit = " " }
@@ -2913,6 +3016,7 @@ source = { git = "https://github.com/kylegoetz/tree-sitter-unison", rev = "98c4e
2913name = "todotxt"
3016name = "todotxt"
2914scope = "text.todotxt"
3017scope = "text.todotxt"
2915file-types = [{ suffix = ".todo.txt" }, "todotxt"]
3018file-types = [{ suffix = ".todo.txt" }, "todotxt"]
3019+roots = []
2916formatter = { command = "sort" }
3020formatter = { command = "sort" }
2917auto-format = true
3021auto-format = true
2918
3022
@@ -2924,6 +3028,7 @@ source = { git = "https://github.com/arnarg/tree-sitter-todotxt", rev = "0207f6a
2924name = "strace"
3028name = "strace"
2925scope = "source.strace"
3029scope = "source.strace"
2926file-types = ["strace"]
3030file-types = ["strace"]
3031+roots = []
2927
3032
2928[[grammar]]
3033[[grammar]]
2929name = "strace"
3034name = "strace"
@@ -2933,36 +3038,11 @@ source = { git = "https://github.com/sigmaSd/tree-sitter-strace", rev = "2b18fdf
2933name = "gemini"
3038name = "gemini"
2934scope = "source.gmi"
3039scope = "source.gmi"
2935file-types = ["gmi"]
3040file-types = ["gmi"]
2936−
2937−[[grammar]]
2938−name = "gemini"
2939−source = { git = "https://git.sr.ht/~nbsp/tree-sitter-gemini", rev = "3cc5e4bdf572d5df4277fc2e54d6299bd59a54b3" }
2940−
2941−[[language]]
2942−name = "agda"
2943−scope = "source.agda"
2944−injection-regex = "agda"
2945−file-types = ["agda"]
2946roots = []
3041roots = []
2947−comment-token = "--"
2948−# language-servers = [ "als" ]
2949−# the agda language server is of questionable functionality.
2950−auto-format = false
2951−indent = { tab-width = 2, unit = " " }
2952−
2953−[language.auto-pairs]
2954−'"' = '"'
2955−"'" = "'"
2956−'{' = '}'
2957−'(' = ')'
2958−'[' = ']'
2959−
2960−# [language.debugger]
2961−# ?? can this be used for proof assistant support? explore
2962
3042
2963[[grammar]]
3043[[grammar]]
2964−name = "agda"
3044+name = "gemini"
2965−source = { git = "https://github.com/tree-sitter/tree-sitter-agda", rev = "c21c3a0f996363ed17b8ac99d827fe5a4821f217" }
3045+source = { git = "https://git.sr.ht/~sfr/tree-sitter-gemini", rev = "3cc5e4bdf572d5df4277fc2e54d6299bd59a54b3" }
2966
3046
2967[[language]]
3047[[language]]
2968name = "templ"
3048name = "templ"
@@ -2976,33 +3056,3 @@ language-servers = [ "templ" ]
2976[[grammar]]
3056[[grammar]]
2977name = "templ"
3057name = "templ"
2978source = { git = "https://github.com/vrischmann/tree-sitter-templ", rev = "ea56ac0655243490a4929a988f4eaa91dfccc995" }
3058source = { git = "https://github.com/vrischmann/tree-sitter-templ", rev = "ea56ac0655243490a4929a988f4eaa91dfccc995" }
2979−
2980−[[language]]
2981−name = "dbml"
2982−scope = "source.dbml"
2983−injection-regex = "dbml"
2984−file-types = ["dbml"]
2985−comment-token = ";"
2986−indent = { tab-width = 2, unit = " " }
2987−
2988−[[grammar]]
2989−name = "dbml"
2990−source = { git = "https://github.com/dynamotn/tree-sitter-dbml", rev = "2e2fa5640268c33c3d3f27f7e676f631a9c68fd9" }
2991−
2992−[[language]]
2993−name = "log"
2994−scope = "source.log"
2995−file-types = ["log"]
2996−
2997−[[grammar]]
2998−name = "log"
2999−source = { git = "https://github.com/Tudyx/tree-sitter-log", rev = "62cfe307e942af3417171243b599cc7deac5eab9" }
3000−
3001−[[language]]
3002−name = "janet"
3003−scope = "source.janet"
3004−injection-regex = "janet"
3005−file-types = ["janet"]
3006−comment-token = "#"
3007−indent = { tab-width = 2, unit = " " }
3008−grammar = "clojure"
logo.svg+1−1
@@ -1 +1 @@
1−<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;" viewBox="663.38 37.57 575.35 903.75"><g transform="matrix(1,0,0,1,-31352.7,-1817.25)"><g transform="matrix(1,0,0,1,31062.7,-20.8972)"><g transform="matrix(1,0,0,1,-130.173,0.00185558)"><path style="fill:#706bc8;" d="M1083.58,1875.72L1635.06,2194.12C1649.8,2202.63 1658.88,2218.37 1658.88,2235.39C1658.88,2264.98 1658.88,2311.74 1658.88,2341.33C1658.88,2349.84 1656.61,2358.03 1652.5,2365.16C1652.5,2365.16 1214.7,2112.4 1107.2,2050.33C1092.58,2041.89 1083.58,2026.29 1083.58,2009.41C1083.58,1963.5 1083.58,1875.72 1083.58,1875.72Z"></path></g><g transform="matrix(1,0,0,1,-130.173,0.00185558)"><path style="fill:#55c5e4;" d="M1635.26,2604.84C1649.88,2613.28 1658.88,2628.87 1658.88,2645.75C1658.88,2691.67 1658.88,2779.44 1658.88,2779.44L1107.41,2461.05C1092.66,2452.53 1083.58,2436.8 1083.58,2419.78C1083.58,2390.19 1083.58,2343.42 1083.58,2313.84C1083.58,2305.32 1085.85,2297.13 1089.96,2290.01C1089.96,2290.01 1527.76,2542.77 1635.26,2604.84Z"></path></g><g transform="matrix(1,0,0,1,216.062,984.098)"><path style="fill:#84ddea;" d="M790.407,1432.56C785.214,1435.55 780.717,1439.9 777.509,1445.46C767.862,1462.16 773.473,1483.76 790.004,1493.59L789.998,1493.59L761.173,1476.95C746.427,1468.44 737.344,1452.71 737.344,1435.68C737.344,1406.09 737.344,1359.33 737.344,1329.74C737.344,1312.71 746.427,1296.98 761.173,1288.47L1259.59,1000.74L1259.83,1000.6C1264.92,997.617 1269.33,993.314 1272.48,987.844C1282.13,971.136 1276.52,949.544 1259.99,939.707L1260,939.707L1288.82,956.349C1303.57,964.862 1312.65,980.595 1312.65,997.622C1312.65,1027.21 1312.65,1073.97 1312.65,1103.56C1312.65,1120.59 1303.57,1136.32 1288.82,1144.83L1259.19,1161.94L1259.59,1161.68L790.407,1432.56Z"></path></g><g transform="matrix(1,0,0,1,216.062,984.098)"><path style="fill:#997bc8;" d="M790.407,1686.24C785.214,1689.23 780.717,1693.58 777.509,1699.13C767.862,1715.84 773.473,1737.43 790.004,1747.27L789.998,1747.27L761.173,1730.63C746.427,1722.12 737.344,1706.38 737.344,1689.36C737.344,1659.77 737.344,1613.01 737.344,1583.42C737.344,1566.39 746.427,1550.66 761.173,1542.15L1259.59,1254.42L1259.83,1254.28C1264.92,1251.29 1269.33,1246.99 1272.48,1241.52C1282.13,1224.81 1276.52,1203.22 1259.99,1193.38L1260,1193.38L1288.82,1210.03C1303.57,1218.54 1312.65,1234.27 1312.65,1251.3C1312.65,1280.89 1312.65,1327.65 1312.65,1357.24C1312.65,1374.26 1303.57,1390 1288.82,1398.51L1259.19,1415.61L1259.59,1415.36L790.407,1686.24Z"></path></g></g></g></svg>
1+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;" viewBox="663.38 37.57 575.35 903.75"> <g transform="matrix(1,0,0,1,-31352.7,-1817.25)"> <g transform="matrix(1,0,0,1,31062.7,-20.8972)"> <g transform="matrix(1,0,0,1,-130.173,0.00185558)"> <path d="M1083.58,1875.72L1635.06,2194.12C1649.8,2202.63 1658.88,2218.37 1658.88,2235.39C1658.88,2264.98 1658.88,2311.74 1658.88,2341.33C1658.88,2349.84 1656.61,2358.03 1652.5,2365.16C1652.5,2365.16 1214.7,2112.4 1107.2,2050.33C1092.58,2041.89 1083.58,2026.29 1083.58,2009.41C1083.58,1963.5 1083.58,1875.72 1083.58,1875.72Z" style="fill:#706bc8;"></path> </g> <g transform="matrix(1,0,0,1,-130.173,0.00185558)"> <path d="M1635.26,2604.84C1649.88,2613.28 1658.88,2628.87 1658.88,2645.75C1658.88,2691.67 1658.88,2779.44 1658.88,2779.44L1107.41,2461.05C1092.66,2452.53 1083.58,2436.8 1083.58,2419.78C1083.58,2390.19 1083.58,2343.42 1083.58,2313.84C1083.58,2305.32 1085.85,2297.13 1089.96,2290.01C1089.96,2290.01 1527.76,2542.77 1635.26,2604.84Z" style="fill:#55c5e4;"></path> </g> <g transform="matrix(1,0,0,1,216.062,984.098)"> <path d="M790.407,1432.56C785.214,1435.55 780.717,1439.9 777.509,1445.46C767.862,1462.16 773.473,1483.76 790.004,1493.59L789.998,1493.59L761.173,1476.95C746.427,1468.44 737.344,1452.71 737.344,1435.68C737.344,1406.09 737.344,1359.33 737.344,1329.74C737.344,1312.71 746.427,1296.98 761.173,1288.47L1259.59,1000.74L1259.83,1000.6C1264.92,997.617 1269.33,993.314 1272.48,987.844C1282.13,971.136 1276.52,949.544 1259.99,939.707L1260,939.707L1288.82,956.349C1303.57,964.862 1312.65,980.595 1312.65,997.622C1312.65,1027.21 1312.65,1073.97 1312.65,1103.56C1312.65,1120.59 1303.57,1136.32 1288.82,1144.83L1259.19,1161.94L1259.59,1161.68L790.407,1432.56Z" style="fill:#84ddea;"></path> </g> <g transform="matrix(1,0,0,1,216.062,984.098)"> <path d="M790.407,1686.24C785.214,1689.23 780.717,1693.58 777.509,1699.13C767.862,1715.84 773.473,1737.43 790.004,1747.27L789.998,1747.27L761.173,1730.63C746.427,1722.12 737.344,1706.38 737.344,1689.36C737.344,1659.77 737.344,1613.01 737.344,1583.42C737.344,1566.39 746.427,1550.66 761.173,1542.15L1259.59,1254.42L1259.83,1254.28C1264.92,1251.29 1269.33,1246.99 1272.48,1241.52C1282.13,1224.81 1276.52,1203.22 1259.99,1193.38L1260,1193.38L1288.82,1210.03C1303.57,1218.54 1312.65,1234.27 1312.65,1251.3C1312.65,1280.89 1312.65,1327.65 1312.65,1357.24C1312.65,1374.26 1303.57,1390 1288.82,1398.51L1259.19,1415.61L1259.59,1415.36L790.407,1686.24Z" style="fill:#997bc8;"></path></g></g></g> </svg>
runtime/queries/_typescript/highlights.scm+3−3
@@ -39,11 +39,11 @@
39 (identifier) @variable.parameter))
39 (identifier) @variable.parameter))
40
40
41; (p?: t)
41; (p?: t)
42−; (p?: t = 1) // Invalid but still possible to highlight.
42+; (p?: t = 1) // Invalid but still posible to hihglight.
43(optional_parameter
43(optional_parameter
44 (identifier) @variable.parameter)
44 (identifier) @variable.parameter)
45
45
46−; (...p?: t) // Invalid but still possible to highlight.
46+; (...p?: t) // Invalid but still posible to hihglight.
47(optional_parameter
47(optional_parameter
48 (rest_pattern
48 (rest_pattern
49 (identifier) @variable.parameter))
49 (identifier) @variable.parameter))
@@ -59,7 +59,7 @@
59 (pair_pattern
59 (pair_pattern
60 value: (identifier) @variable.parameter)))
60 value: (identifier) @variable.parameter)))
61
61
62−; ([ p ]?: t[]) // Invalid but still possible to highlight.
62+; ([ p ]?: t[]) // Invalid but still posible to hihglight.
63(optional_parameter
63(optional_parameter
64 (array_pattern
64 (array_pattern
65 (identifier) @variable.parameter))
65 (identifier) @variable.parameter))
runtime/queries/agda/highlights.scmdeleted−124
@@ -1,124 +0,0 @@
1−;; Punctuation
2−[ "." ";" ":"] @punctuation.delimiter
3−[ "(" ")" "{" "}" ] @punctuation.bracket
4−
5−;; Constants
6−(integer) @constant.numeric.integer
7−; (float) @constant.numeric.float
8−(literal) @string
9−
10−;; Pragmas and comments
11−(comment) @comment
12−(pragma) @attribute
13−(macro) @function.macro
14−
15−;; Imports
16−(module_name) @namespace
17−(import_directive (id) @namespace)
18−[(module) (import) (open)] @keyword.control.import
19−
20−;; Types
21−(typed_binding (expr) @type)
22−(record (expr) @type)
23−(data (expr) @type)
24−(signature (expr) @type)
25−(function (rhs (expr) @type))
26−; todo: these are too general. ideally, any nested (atom)
27−; https://github.com/tree-sitter/tree-sitter/issues/880
28−
29−;; Variables
30−(untyped_binding (atom) @variable)
31−(typed_binding (atom) @variable)
32−(field_name) @variable.other.member
33−
34−;; Functions
35−(function_name) @function
36−;(function (lhs
37−; . (atom) @function
38−; (atom) @variable.parameter))
39−; todo: currently fails to parse, upstream tree-sitter bug
40−
41−;; Data
42−[(data_name) (record_name)] @constructor
43−((atom) @constant.builtin.boolean
44− (#any-of? @constant.builtin.boolean "true" "false" "True" "False"))
45−
46−"Set" @type.builtin
47−
48−; postulate
49−; type_signature
50−; pattern
51−; id
52−; bid
53−; typed_binding
54−; primitive
55−; private
56−; record_signature
57−; record_assignments
58−; field_assignment
59−; module_assignment
60−; renaming
61−; import_directive
62−; lambda
63−; let
64−; instance
65−; generalize
66−; record
67−; fields
68−; syntax
69−; hole_name
70−; data_signature
71−
72−;; Keywords
73−[
74− "where"
75− "data"
76− "rewrite"
77− "postulate"
78− "public"
79− "private"
80− "tactic"
81− "Prop"
82− "quote"
83− "renaming"
84− "in"
85− "hiding"
86− "constructor"
87− "abstract"
88− "let"
89− "field"
90− "mutual"
91− "infix"
92− "infixl"
93− "infixr"
94− "record"
95− "overlap"
96− "instance"
97− "do"
98−] @keyword
99−
100−[
101− "="
102−] @operator
103−
104−; = | -> : ? \ .. ... λ ∀ →
105−; (_LAMBDA) (_FORALL) (_ARROW)
106−; "coinductive"
107−; "eta-equality"
108−; "field"
109−; "inductive"
110−; "interleaved"
111−; "macro"
112−; "no-eta-equality"
113−; "pattern"
114−; "primitive"
115−; "quoteTerm"
116−; "rewrite"
117−; "syntax"
118−; "unquote"
119−; "unquoteDecl"
120−; "unquoteDef"
121−; "using"
122−; "variable"
123−; "with"
124−
runtime/queries/c/indents.scm−13
@@ -36,16 +36,3 @@
36(parameter_list
36(parameter_list
37 . (parameter_declaration) @anchor
37 . (parameter_declaration) @anchor
38 (#set! "scope" "tail")) @align
38 (#set! "scope" "tail")) @align
39−(argument_list
40− . (_) @anchor
41− (#set! "scope" "tail")) @align
42−; These are a bit opinionated since some people just indent binary/ternary expressions spanning multiple lines.
43−; Since they are only triggered when a newline is inserted into an already complete binary/ternary expression,
44−; this should happen rarely, so it is not a big deal either way.
45−; Additionally, adding these queries has the advantage of preventing such continuation lines from being used
46−; as the baseline when the `hybrid` indent heuristic is used (which is desirable since their indentation is so inconsistent).
47−(binary_expression
48− (#set! "scope" "tail")) @anchor @align
49−(conditional_expression
50− "?" @anchor
51− (#set! "scope" "tail")) @align
runtime/queries/dbml/highlights.scmdeleted−44
@@ -1,44 +0,0 @@
1−
2−; comments highlighting
3−(comment) @comment
4−
5−; keyword highlighting
6−(keyword_def) @keyword
7−(keyword_enum) @keyword
8−(keyword_ref) @keyword
9−
10−; identify blocks and definitions
11−(definition) @function
12−
13−; for identifiers
14−(identifier) @variable
15−(type) @keyword
16−
17−; Highlight special types for database/data types
18−("Project" ) @type
19−("Table" ) @type
20−("TableGroup" ) @type
21−("database_type" ) @variable
22−
23−; string and number constants
24−("'''") @constant.character.escape
25−(string) @string
26−(number) @constant.numeric
27−
28−; brackets
29−[
30− "("
31− ")"
32− "{"
33− "}"
34− "["
35− "]"
36−] @punctuation.bracket
37−
38−; brackets
39−[
40− ":"
41− "."
42− ","
43−] @punctuation.delimiter
44−
runtime/queries/gleam/highlights.scm+5−16
@@ -21,8 +21,6 @@
21
21
22; Functions
22; Functions
23(unqualified_import (identifier) @function)
23(unqualified_import (identifier) @function)
24−(unqualified_import "type" (type_identifier) @type)
25−(unqualified_import (type_identifier) @constructor)
26(function
24(function
27 name: (identifier) @function)
25 name: (identifier) @function)
28(external_function
26(external_function
@@ -45,13 +43,6 @@
45(tuple_access
43(tuple_access
46 index: (integer) @variable.other.member)
44 index: (integer) @variable.other.member)
47
45
48−; Attributes
49−(attribute
50− "@" @attribute
51− name: (identifier) @attribute)
52−
53−(attribute_value (identifier) @constant)
54−
55; Type names
46; Type names
56(remote_type_identifier) @type
47(remote_type_identifier) @type
57(type_identifier) @type
48(type_identifier) @type
@@ -69,6 +60,10 @@
69(identifier) @variable
60(identifier) @variable
70(discard) @comment.unused
61(discard) @comment.unused
71
62
63+; Operators
64+(binary_expression
65+ operator: _ @operator)
66+
72; Keywords
67; Keywords
73[
68[
74 (visibility_modifier) ; "pub"
69 (visibility_modifier) ; "pub"
@@ -77,7 +72,6 @@
77 "assert"
72 "assert"
78 "case"
73 "case"
79 "const"
74 "const"
80− ; DEPRECATED: 'external' was removed in v0.30.
81 "external"
75 "external"
82 "fn"
76 "fn"
83 "if"
77 "if"
@@ -85,16 +79,11 @@
85 "let"
79 "let"
86 "panic"
80 "panic"
87 "todo"
81 "todo"
82+ "try"
88 "type"
83 "type"
89 "use"
84 "use"
90] @keyword
85] @keyword
91
86
92−; Operators
93−(binary_expression
94− operator: _ @operator)
95−(boolean_negation "!" @operator)
96−(integer_negation "-" @operator)
97−
98; Punctuation
87; Punctuation
99[
88[
100 "("
89 "("
runtime/queries/gn/highlights.scmdeleted−42
@@ -1,42 +0,0 @@
1−; Copyright (C) 2021 Will Cassella (github@willcassella.com)
2−;
3−; Licensed under the Apache License, Version 2.0 (the "License");
4−; you may not use this file except in compliance with the License.
5−; You may obtain a copy of the License at
6−;
7−; http://www.apache.org/licenses/LICENSE-2.0
8−;
9−; Unless required by applicable law or agreed to in writing, software
10−; distributed under the License is distributed on an "AS IS" BASIS,
11−; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12−; See the License for the specific language governing permissions and
13−; limitations under the License.
14−
15−(identifier) @variable.builtin
16−
17−(scope_access field: (_) @variable.other.member)
18−
19−(call target: (_) @function)
20−
21−[ "if" "else" ] @keyword.control.conditional
22−
23−[
24− (assign_op)
25− (arithmetic_binary_op)
26− (comparison_binary_op)
27− (equivalence_binary_op)
28− (logical_and_binary_op)
29− (logical_or_binary_op)
30− (negation_unary_op)
31−] @operator
32−
33−[ "(" ")" "[" "]" "{" "}" ] @punctuation.bracket
34−[ "." "," ] @punctuation.delimiter
35−
36−(string) @string
37−(string_escape) @constant.character.escape
38−(string_expansion [ "$" "${" "}" ] @constant.character.escape)
39−[ (integer) (hex) ] @constant.numeric
40−(boolean) @constant.builtin.boolean
41−
42−(comment) @comment
runtime/queries/gn/injections.scmdeleted−15
@@ -1,15 +0,0 @@
1−; Copyright (C) 2021 Will Cassella (github@willcassella.com)
2−;
3−; Licensed under the Apache License, Version 2.0 (the "License");
4−; you may not use this file except in compliance with the License.
5−; You may obtain a copy of the License at
6−;
7−; http://www.apache.org/licenses/LICENSE-2.0
8−;
9−; Unless required by applicable law or agreed to in writing, software
10−; distributed under the License is distributed on an "AS IS" BASIS,
11−; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12−; See the License for the specific language governing permissions and
13−; limitations under the License.
14−
15−((comment) @injection.content (#set! injection.language "comment"))
runtime/queries/gn/locals.scmdeleted−16
@@ -1,16 +0,0 @@
1−; Copyright (C) 2021 Will Cassella (github@willcassella.com)
2−;
3−; Licensed under the Apache License, Version 2.0 (the "License");
4−; you may not use this file except in compliance with the License.
5−; You may obtain a copy of the License at
6−;
7−; http://www.apache.org/licenses/LICENSE-2.0
8−;
9−; Unless required by applicable law or agreed to in writing, software
10−; distributed under the License is distributed on an "AS IS" BASIS,
11−; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12−; See the License for the specific language governing permissions and
13−; limitations under the License.
14−
15−(source_file) @local.scope
16−(assignment target: (identifier) @local.definition)
runtime/queries/janet/highlights.scmdeleted−1
@@ -1 +0,0 @@
1−; inherits: clojure
runtime/queries/log/highlights.scmdeleted−10
@@ -1,10 +0,0 @@
1−(trace) @comment
2−(debug) @hint
3−(info) @info
4−(warn) @warning
5−(error) @error
6−(year_month_day) @keyword
7−(time) @constant
8−(string_literal) @string
9−(number) @constant.numeric
10−(constant) @constant.builtin
runtime/queries/purescript/highlights.scm+4−19
@@ -1,19 +1,3 @@
1−; ----------------------------------------------------------------------------
2−; Record fields would need to come before literal strings in order to be captured correctly
3−
4− (record_accessor
5− field: [ (variable)
6− (string)
7− (triple_quote_string)
8− ] @variable.other.member)
9−
10− (exp_record_access
11− field: [ (variable)
12− (string)
13− (triple_quote_string)
14− ] @variable.other.member)
15−
16−
17; ----------------------------------------------------------------------------
1; ----------------------------------------------------------------------------
18; Literals and comments
2; Literals and comments
19
3
@@ -133,7 +117,8 @@
133
117
134 (row_field (field_name) @variable.other.member)
118 (row_field (field_name) @variable.other.member)
135 (record_field (field_name) @variable.other.member)
119 (record_field (field_name) @variable.other.member)
120+ (record_accessor (variable) @variable.other.member)
136− (record_field (field_pun) @variable.other.member)
121+ (exp_record_access (variable) @variable.other.member)
137
122
138 (signature name: (variable) @type)
123 (signature name: (variable) @type)
139 (function name: (variable) @function)
124 (function name: (variable) @function)
@@ -141,8 +126,8 @@
141 (derive_declaration (instance_name) @function)
126 (derive_declaration (instance_name) @function)
142
127
143 ; true or false
128 ; true or false
144− ((variable) @constant.builtin.boolean
129+((variable) @constant.builtin.boolean
145− (#match? @constant.builtin.boolean "^(true|false)$"))
130+ (#match? @constant.builtin.boolean "^(true|false)$"))
146
131
147 ; The former one works for `tree-sitter highlight` but not in Helix/Kakoune.
132 ; The former one works for `tree-sitter highlight` but not in Helix/Kakoune.
148 ; The latter two work in Helix (but not Kakoune) and are a good compromise between not highlighting anything at all
133 ; The latter two work in Helix (but not Kakoune) and are a good compromise between not highlighting anything at all
runtime/queries/python/highlights.scm−6
@@ -134,17 +134,14 @@
134 "//="
134 "//="
135 "/="
135 "/="
136 "&"
136 "&"
137− "&="
138 "%"
137 "%"
139 "%="
138 "%="
140 "^"
139 "^"
141− "^="
142 "+"
140 "+"
143 "->"
141 "->"
144 "+="
142 "+="
145 "<"
143 "<"
146 "<<"
144 "<<"
147− "<<="
148 "<="
145 "<="
149 "<>"
146 "<>"
150 "="
147 "="
@@ -153,11 +150,8 @@
153 ">"
150 ">"
154 ">="
151 ">="
155 ">>"
152 ">>"
156− ">>="
157 "|"
153 "|"
158− "|="
159 "~"
154 "~"
160− "@="
161] @operator
155] @operator
162
156
163[
157[
runtime/queries/smali/folds.scmdeleted−12
@@ -1,12 +0,0 @@
1−[
2− (annotation_directive)
3− (array_data_directive)
4− (field_definition)
5− (method_definition)
6− (packed_switch_directive)
7− (param_directive)
8− (parameter_directive)
9− (sparse_switch_directive)
10− (subannotation_directive)
11− (list)
12−] @fold
runtime/queries/smali/highlights.scmdeleted−216
@@ -1,216 +0,0 @@
1−; Types
2−
3−(class_identifier
4− (identifier) @type)
5−
6−(primitive_type) @type.builtin
7−
8−((class_identifier
9− . (identifier) @_first @type.builtin
10− (identifier) @type.builtin)
11− (#match? @_first "^(android|dalvik|java|kotlinx)$"))
12−
13−((class_identifier
14− . (identifier) @_first @type.builtin
15− . (identifier) @_second @type.builtin
16− (identifier) @type.builtin)
17− (#eq? @_first "com")
18− (#match? @_second "^(android|google)$"))
19−
20−; Methods
21−
22−(method_definition
23− (method_signature (method_identifier) @function.method))
24−
25−(expression
26− (opcode) @_invoke
27− (body
28− (full_method_signature
29− (method_signature (method_identifier) @function.method)))
30− (#match? @_invoke "^invoke"))
31−
32−(expression
33− (opcode) @_field_access
34− (body
35− (field_identifier) @variable.other.member)
36− (#match? @_field_access "^[is](get|put)-"))
37−
38−(method_handle
39− (full_method_signature
40− (method_signature (method_identifier) @function.method)))
41−
42−(custom_invoke
43− . (identifier) @function.method
44− (method_signature (method_identifier) @function.method))
45−
46−(annotation_value
47− (body
48− (method_signature (method_identifier) @function.method)))
49−
50−(annotation_value
51− (body
52− (full_method_signature
53− (method_signature (method_identifier) @function.method))))
54−
55−(field_definition
56− (body
57− (method_signature (method_identifier) @function.method)))
58−
59−(field_definition
60− (body
61− (full_method_signature
62− (method_signature (method_identifier) @function.method))))
63−
64−((method_identifier) @constructor
65− (#match? @constructor "^(<init>|<clinit>)$"))
66−
67−"constructor" @constructor
68−
69−; Fields
70−
71−[
72− (field_identifier)
73− (annotation_key)
74−] @variable.other.member
75−
76−((field_identifier) @constant
77− (#match? @constant "^[%u_]*$"))
78−
79−; Variables
80−
81−(variable) @variable.builtin
82−
83−(local_directive
84− (identifier) @variable)
85−
86−; Parameters
87−
88−(parameter) @variable.parameter
89−(param_identifier) @variable.parameter
90−
91−; Labels
92−
93−[
94− (label)
95− (jmp_label)
96−] @label
97−
98−; Operators
99−
100−; (opcode) @keyword.operator
101−
102−((opcode) @keyword.control.return
103− (#match? @keyword.control.return "^return"))
104−
105−((opcode) @keyword.control.conditional
106− (#match? @keyword.control.conditional "^if"))
107−
108−((opcode) @keyword.control.conditional
109− (#match? @keyword.control.conditional "^cmp"))
110−
111−((opcode) @keyword.control.exception
112− (#match? @keyword.control.exception "^throw"))
113−
114−[
115− "="
116− ".."
117−] @operator
118−
119−; Keywords
120−
121−[
122− ".class"
123− ".super"
124− ".implements"
125− ".field"
126− ".end field"
127− ".annotation"
128− ".end annotation"
129− ".subannotation"
130− ".end subannotation"
131− ".param"
132− ".end param"
133− ".parameter"
134− ".end parameter"
135− ".local"
136− ".end local"
137− ".restart local"
138− ".registers"
139− ".packed-switch"
140− ".end packed-switch"
141− ".sparse-switch"
142− ".end sparse-switch"
143− ".array-data"
144− ".end array-data"
145− ".enum"
146− (prologue_directive)
147− (epilogue_directive)
148−] @keyword
149−
150−[
151− ".source"
152−] @keyword.directive
153−
154−[
155− ".method"
156− ".end method"
157−] @keyword.function
158−
159−[
160− ".catch"
161− ".catchall"
162−] @keyword.control.exception
163−
164−; Literals
165−
166−(string) @string
167−(source_directive (string "\"" _ @string.special.url "\""))
168−(escape_sequence) @constant.character.escape
169−
170−(character) @constant.character
171−
172−"L" @punctuation
173−
174−(line_directive (number) @comment) @comment
175−(".locals" (number) @comment) @comment
176−
177−(number) @constant.numeric.integer
178−
179−[
180− (float)
181− (NaN)
182− (Infinity)
183−] @constant.numeric.float
184−
185−(boolean) @constant.builtin.boolean
186−
187−(null) @constant.builtin
188−
189−; Misc
190−
191−(annotation_visibility) @keyword.storage.modifier
192−
193−(access_modifier) @keyword.storage.type
194−
195−(array_type
196− "[" @punctuation.special)
197−
198−["{" "}"] @punctuation.bracket
199−
200−["(" ")"] @punctuation.bracket
201−
202−[
203− "->"
204− ","
205− ":"
206− ";"
207− "@"
208− "/"
209−] @punctuation.delimiter
210−
211−; Comments
212−
213−(comment) @comment
214−
215−(class_definition
216− (comment) @comment.block.documentation)
runtime/queries/smali/indents.scmdeleted−31
@@ -1,31 +0,0 @@
1−[
2− (annotation_directive)
3− (array_data_directive)
4− (field_definition)
5− (method_definition)
6− (packed_switch_directive)
7− (param_directive)
8− (parameter_directive)
9− (sparse_switch_directive)
10− (subannotation_directive)
11− (list)
12− "\{"
13−] @indent
14−
15−[
16− ".end annotation"
17− ".end array-data"
18− ".end field"
19− ".end method"
20− ".end packed-switch"
21− ".end param"
22− ".end parameter"
23− ".end sparse-switch"
24− ".end subannotation"
25− "\}"
26−] @outdent
27−
28−[
29− (ERROR)
30− (comment)
31−] @indent.always
runtime/queries/smali/injections.scmdeleted−2
@@ -1,2 +0,0 @@
1−((comment) @injection.content
2− (#set! injection.language "comment"))
runtime/queries/smali/locals.scmdeleted−42
@@ -1,42 +0,0 @@
1−[
2− (class_directive)
3− (expression)
4− (annotation_directive)
5− (array_data_directive)
6− (method_definition)
7− (packed_switch_directive)
8− (sparse_switch_directive)
9− (subannotation_directive)
10−] @local.scope
11−
12−[
13− (identifier)
14− (class_identifier)
15− (label)
16− (jmp_label)
17−] @local.reference
18−
19−(enum_reference
20− (field_identifier) @local.definition)
21−
22−((field_definition
23− (access_modifiers) @_mod
24− (field_identifier) @local.definition)
25− (#eq? @_mod "enum"))
26−
27−(field_definition
28− (field_identifier) @local.definition
29− (field_type) @local.definition)
30−
31−(annotation_key) @local.definition
32−
33−(method_definition
34− (method_signature (method_identifier) @local.definition))
35−
36−(param_identifier) @local.definition
37−
38−(annotation_directive
39− (class_identifier) @local.definition)
40−
41−(class_directive
42− (class_identifier) @local.definition)
runtime/queries/sql/highlights.scm+4−42
@@ -131,7 +131,6 @@
131 (keyword_partition)
131 (keyword_partition)
132 (keyword_group)
132 (keyword_group)
133 (keyword_with)
133 (keyword_with)
134− (keyword_without)
135 (keyword_as)
134 (keyword_as)
136 (keyword_having)
135 (keyword_having)
137 (keyword_limit)
136 (keyword_limit)
@@ -228,7 +227,6 @@
228 (keyword_input)
227 (keyword_input)
229 (keyword_name)
228 (keyword_name)
230 (keyword_oid)
229 (keyword_oid)
231− (keyword_oids)
232 (keyword_options)
230 (keyword_options)
233 (keyword_plpgsql)
231 (keyword_plpgsql)
234 (keyword_precision)
232 (keyword_precision)
@@ -266,44 +264,6 @@
266 (keyword_user)
264 (keyword_user)
267 (keyword_valid)
265 (keyword_valid)
268 (keyword_action)
266 (keyword_action)
269− (keyword_definer)
270− (keyword_invoker)
271− (keyword_security)
272− (keyword_extension)
273− (keyword_version)
274− (keyword_out)
275− (keyword_inout)
276− (keyword_variadic)
277− (keyword_session)
278− (keyword_isolation)
279− (keyword_level)
280− (keyword_serializable)
281− (keyword_repeatable)
282− (keyword_read)
283− (keyword_write)
284− (keyword_committed)
285− (keyword_uncommitted)
286− (keyword_deferrable)
287− (keyword_names)
288− (keyword_zone)
289− (keyword_immediate)
290− (keyword_deferred)
291− (keyword_constraints)
292− (keyword_snapshot)
293− (keyword_characteristics)
294− (keyword_off)
295− (keyword_follows)
296− (keyword_precedes)
297− (keyword_each)
298− (keyword_instead)
299− (keyword_of)
300− (keyword_initially)
301− (keyword_old)
302− (keyword_new)
303− (keyword_referencing)
304− (keyword_statement)
305− (keyword_execute)
306− (keyword_procedure)
307] @keyword
267] @keyword
308
268
309[
269[
@@ -413,8 +373,10 @@
413 ">="
373 ">="
414 ">"
374 ">"
415 "<>"
375 "<>"
416− (op_other)
376+ "->"
417− (op_unary_other)
377+ "->>"
378+ "#>"
379+ "#>>"
418] @operator
380] @operator
419
381
420[
382[
runtime/queries/yuck/highlights.scm+1−1
@@ -101,7 +101,7 @@
101(list
101(list
102 (symbol) @tag)
102 (symbol) @tag)
103
103
104−; Other stuff that has not been caught by the previous queries yet
104+; Other stuff that has not been catched by the previous queries yet
105
105
106(ident) @variable
106(ident) @variable
107(index) @variable
107(index) @variable
runtime/themes/README.md−8
@@ -6,12 +6,4 @@ If you submit a theme, please include a comment at the top with your name and em
6# Author : Name <email@my.domain>
6# Author : Name <email@my.domain>
7```
7```
8
8
9−If you are submitting a theme that is already published somewhere, then please
10−add the corresponding license file for it under `licenses/` with the following
11−name `theme_name.license` and add a comment at the top of the theme file:
12−
13−```toml
14−# License: <License specification>
15−```
16−
17We have a preview page for themes on our [wiki](https://github.com/helix-editor/helix/wiki/Themes)!
9We have a preview page for themes on our [wiki](https://github.com/helix-editor/helix/wiki/Themes)!
runtime/themes/darcula.toml+2−6
@@ -15,7 +15,7 @@
15"ui.statusline.select" = { bg = "orange", fg = "grey01" }
15"ui.statusline.select" = { bg = "orange", fg = "grey01" }
16"ui.help" = { fg = "grey04", bg = "grey01" }
16"ui.help" = { fg = "grey04", bg = "grey01" }
17"ui.cursor" = { fg = "grey04", modifiers = ["reversed"] }
17"ui.cursor" = { fg = "grey04", modifiers = ["reversed"] }
18−"ui.cursor.primary" = { fg = "grey02", bg = "grey05" }
18+"ui.cursor.primary" = { fg = "grey05", modifiers = ["reversed"] }
19"ui.cursor.match" = { fg = "white", modifiers = ["underlined"] }
19"ui.cursor.match" = { fg = "white", modifiers = ["underlined"] }
20"ui.cursorline.primary" = { bg = "grey02" }
20"ui.cursorline.primary" = { bg = "grey02" }
21"ui.cursorline.secondary" = { bg = "grey02" }
21"ui.cursorline.secondary" = { bg = "grey02" }
@@ -35,11 +35,7 @@
35"constant.numeric" = "lightblue"
35"constant.numeric" = "lightblue"
36"constant.character.escape" = "white"
36"constant.character.escape" = "white"
37"attribute" = "yellow"
37"attribute" = "yellow"
38−"type" = "white"
38+"type" = "orange"
39−"type.builtin" = "orange"
40−"type.parameter" = { fg = "white", modifiers = ["bold"] }
41−"type.enum" = "white"
42−"type.enum.variant" = "orange"
43"string" = "darkgreen"
39"string" = "darkgreen"
44"function" = "yellow"
40"function" = "yellow"
45"function.macro" = "green"
41"function.macro" = "green"
runtime/themes/horizon-dark.tomldeleted−80
@@ -1,80 +0,0 @@
1−# Syntax
2−string = "orange"
3−constant = "purple"
4−"constant.numeric" = "orange"
5−"constant.builtin" = "orange"
6−variable = "red"
7−comment = "light-gray"
8−special = "purple"
9−"punctuation.bracket" = "purple"
10−keyword = "purple"
11−function = "blue"
12−label = "orange"
13−type = "orange"
14−namespace = "orange"
15−
16−# User Interface
17−"ui.background" = { bg = "bg", fg = "gray" }
18−"ui.background.separator" = "light-gray"
19−"ui.text" = "white"
20−"ui.text.focus" = "green"
21−"ui.text.inactive" = "selection"
22−"ui.text.info" = "orange"
23−"ui.cursor" = { modifiers = ["reversed"] }
24−"ui.cursor.primary" = { modifiers = ["reversed"] }
25−"ui.cursor.match" = { bg = "selection" }
26−"ui.gutter" = "gray"
27−"ui.gutter.selected" = "light-gray"
28−"ui.selection" = { bg = "selection" }
29−"ui.virtual.indent-guide" = { fg = "gray"}
30−"ui.virtual.whitespace" = { fg = "light-gray"}
31−"ui.statusline" = { bg = "dark-bg", fg = "light-gray" }
32−"ui.popup" = { bg = "dark-bg", fg = "orange" }
33−"ui.help" = { bg = "dark-bg", fg = "orange" }
34−"ui.menu" = { bg = "dark-bg", fg = "light-gray" }
35−"ui.menu.selected" = { bg = "selection", fg = "orange" }
36−"ui.window" = "selection"
37−"ui.bufferline" = { bg = "dark-bg", fg = "light-gray" }
38−"ui.bufferline.active" = { bg = "dark-bg", fg = "orange" }
39−
40−# Diagnostics
41−"diagnostic" = { underline = { style = "curl" } }
42−"diagnostic.hint" = { underline = { color = "green", style = "curl" } }
43−"diagnostic.info" = { underline = { color = "blue", style = "curl" } }
44−"diagnostics.error" = { underline = { color = "red", style = "curl"} }
45−"diagnostics.warning" = { underline = { color = "orange", style = "curl"} }
46−
47−warning = { fg = "orange", modifiers = ["bold"] }
48−error = { fg = "red", modifiers = ["bold"] }
49−info = { fg = "blue", modifiers = ["bold"] }
50−hint = { fg = "green", modifiers = ["bold"] }
51−
52−# Markup
53−"markup.heading" = "pink"
54−"markup.list" = "light-gray"
55−"markup.list.checked" = "green"
56−"markup.list.unchecked" = "light-gray"
57−"markup.bold" = { modifiers = ["bold"] }
58−"markup.italic" = { modifiers = ["italic"] }
59−"markup.strikethrough" = { modifiers = ["crossed_out"] }
60−"markup.link" = "blue"
61−"markup.quote" = "orange"
62−"markup.raw" = "orange"
63−
64−"diff.plus" = "green"
65−"diff.minus" = "red"
66−"diff.delta" = "orange"
67−
68−[palette]
69−white = "#D5D8DA"
70−gray = "#2E303E"
71−light-gray = "#6C6F93"
72−bg = "#1C1E26"
73−dark-bg = "#16161C"
74−pink = "#EE64AE"
75−selection = "#353747"
76−green = "#27D796"
77−orange = "#FAB795"
78−purple = "#B877DB"
79−red = "#E95678"
80−blue = "#25B2BC"
runtime/themes/licenses/modus_vivendi.LICENSEdeleted−5
@@ -1,5 +0,0 @@
1−Copyright (C) 2020-2023 Free Software Foundation, Inc.
2−
3−Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, with the Front-Cover Texts being “A GNU Manual,” and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License.”
4−
5−(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU manual.”
runtime/themes/licenses/modus_vivendi_deuteranopia.LICENSEdeleted−5
@@ -1,5 +0,0 @@
1−Copyright (C) 2020-2023 Free Software Foundation, Inc.
2−
3−Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, with the Front-Cover Texts being “A GNU Manual,” and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License.”
4−
5−(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU manual.”
runtime/themes/licenses/modus_vivendi_tinted.LICENSEdeleted−5
@@ -1,5 +0,0 @@
1−Copyright (C) 2020-2023 Free Software Foundation, Inc.
2−
3−Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, with the Front-Cover Texts being “A GNU Manual,” and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License.”
4−
5−(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU manual.”
runtime/themes/licenses/modus_vivendi_tritanopia.LICENSEdeleted−5
@@ -1,5 +0,0 @@
1−Copyright (C) 2020-2023 Free Software Foundation, Inc.
2−
3−Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, with the Front-Cover Texts being “A GNU Manual,” and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License.”
4−
5−(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU manual.”
runtime/themes/licenses/poimandres.LICENSEdeleted−21
@@ -1,21 +0,0 @@
1−MIT License
2−
3−Copyright (c) 2023 drcmda
4−
5−Permission is hereby granted, free of charge, to any person obtaining a copy
6−of this software and associated documentation files (the "Software"), to deal
7−in the Software without restriction, including without limitation the rights
8−to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9−copies of the Software, and to permit persons to whom the Software is
10−furnished to do so, subject to the following conditions:
11−
12−The above copyright notice and this permission notice shall be included in all
13−copies or substantial portions of the Software.
14−
15−THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16−IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17−FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18−AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19−LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20−OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21−SOFTWARE.
runtime/themes/licenses/starlight.LICENSEdeleted−24
@@ -1,24 +0,0 @@
1−This is free and unencumbered software released into the public domain.
2−
3−Anyone is free to copy, modify, publish, use, compile, sell, or
4−distribute this software, either in source code form or as a compiled
5−binary, for any purpose, commercial or non-commercial, and by any
6−means.
7−
8−In jurisdictions that recognize copyright laws, the author or authors
9−of this software dedicate any and all copyright interest in the
10−software to the public domain. We make this dedication for the benefit
11−of the public at large and to the detriment of our heirs and
12−successors. We intend this dedication to be an overt act of
13−relinquishment in perpetuity of all present and future rights to this
14−software under copyright law.
15−
16−THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17−EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18−MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19−IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20−OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21−ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22−OTHER DEALINGS IN THE SOFTWARE.
23−
24−For more information, please refer to <https://unlicense.org>
runtime/themes/modus_operandi.tomldeleted−194
@@ -1,194 +0,0 @@
1−# Author: Alexis Mousset <contact@amousset.me>
2−# Adapted from https://protesilaos.com/emacs/modus-themes, by Protesilaos Stavrou
3−# Version 4.3.0
4−#
5−
6−# Syntax highlighting
7−# -------------------
8−"type" = "cyan-cooler"
9−"constructor" = "cyan-cooler"
10−
11−"constant" = "blue-cooler"
12−"constant.character.escape" = "magenta"
13−
14−"string" = "blue-warmer"
15−"string.regexp" = "magenta-faint"
16−"string.special" = "blue-faint" # used for colors in CSS
17−
18−"comment" = "fg-dim"
19−
20−"variable.parameter" = "cyan"
21−"variable.builtin" = "magenta-cooler"
22−"label" = "fg-dim" # used for language in markdown code blocks
23−"keyword" = "magenta-cooler"
24−"keyword.directive" = "red-cooler"
25−"function" = "magenta"
26−"function.macro" = "magenta-warmer"
27−
28−punctuation = "fg-dim"
29−"tag" = "magenta"
30−"attribute" = "cyan-cooler"
31−"namespace" = "blue-cooler"
32−"special" = "red-cooler"
33−
34−"markup.heading.marker" = "fg-dim"
35−"markup.heading.1" = { fg = "fg-main", modifiers = ["bold"] }
36−"markup.heading.2" = { fg = "yellow-faint", modifiers = ["bold"] }
37−"markup.heading.3" = { fg = "fg-alt", modifiers = ["bold"] }
38−"markup.heading.4" = { fg = "magenta", modifiers = ["bold"] }
39−"markup.heading.5" = { fg = "green-faint", modifiers = ["bold"] }
40−"markup.heading.6" = { fg = "red-faint", modifiers = ["bold"] }
41−"markup.list" = "fg-dim"
42−"markup.list.checked" = { fg = "yellow-warmer" }
43−"markup.list.unchecked" = { fg = "yellow-warmer" }
44−"markup.bold" = { modifiers = ["bold"] }
45−"markup.italic" = { modifiers = ["italic"] }
46−"markup.strikethrough" = { modifiers = ["crossed_out"] }
47−"markup.link.url" = { fg = "cyan" }
48−"markup.link.text" = { fg = "blue-warmer", modifiers = ["underlined"] }
49−"markup.raw.block" = { bg = "bg-dim" }
50−"markup.raw.inline" = { fg = "green-cooler" }
51−
52−"diff.plus" = { fg = "fg-added", bg = "bg-added" }
53−"diff.plus.gutter" = "green-intense"
54−"diff.minus" = { fg = "fg-removed", bg = "bg-removed" }
55−"diff.minus.gutter" = "red-intense"
56−"diff.delta" = { fg = "fg-changed", bg = "bg-changed" }
57−"diff.delta.gutter" = "yellow-intense"
58−
59−# User Interface
60−# --------------
61−
62−"ui.background" = { bg = "bg-main" }
63−
64−"ui.linenr" = { fg = "fg-dim", bg = "bg-dim" }
65−"ui.linenr.selected" = { fg = "fg-main", bg = "bg-active" }
66−
67−"ui.statusline" = { fg = "fg-mode-line-active", bg = "bg-mode-line-active" }
68−"ui.statusline.inactive" = { fg = "fg-mode-line-inactive", bg = "bg-mode-line-inactive" }
69−"ui.statusline.normal" = { fg = "blue-warmer" }
70−"ui.statusline.insert" = { fg = "green-warmer" }
71−"ui.statusline.select" = { fg = "magenta-warmer" }
72−
73−"ui.popup" = { fg = "fg-main", bg = "bg-dim" }
74−"ui.window" = { fg = "fg-dim" }
75−"ui.help" = { fg = "fg-main", bg = "bg-dim" }
76−"ui.gutter" = { bg = "bg-dim" }
77−"ui.text" = "fg-main"
78−"ui.text.focus" = { fg = "fg-main", bg = "bg-completion", modifiers = ["bold"] }
79−"ui.text.inactive" = { fg = "fg-dim" }
80−"ui.virtual" = "bg-active"
81−"ui.virtual.ruler" = { bg = "bg-dim" }
82−"ui.virtual.inlay-hint" = { fg = "fg-dim", modifiers = ["italic"] }
83−
84−"ui.selection" = { fg = "fg-main", bg = "bg-inactive" }
85−"ui.selection.primary" = { fg = "fg-main", bg = "bg-active" }
86−
87−"ui.cursor" = { fg = "bg-main", bg = "fg-main" }
88−"ui.cursor.primary" = { fg = "bg-main", bg = "fg-dim" }
89−"ui.cursor.match" = { bg = "bg-paren-match" }
90−"ui.cursorline.primary" = { bg = "bg-hl-line" }
91−
92−"ui.highlight" = { bg = "bg-hl-line" }
93−
94−"ui.menu" = { fg = "fg-main", bg = "bg-dim" }
95−"ui.menu.selected" = { fg = "fg-main", bg = "bg-completion", modifiers = ["bold"] }
96−"ui.menu.scroll" = { fg = "fg-dim", bg = "bg-cyan-intense" }
97−
98−"diagnostic.error" = { underline = { color = "red-intense", style = "curl" } }
99−"diagnostic.warning" = { underline = { color = "yellow-intense", style = "curl" } }
100−"diagnostic.info" = { underline = { color = "cyan-intense", style = "curl" } }
101−"diagnostic.hint" = { underline = { color = "blue-intense", style = "curl" } }
102−
103−error = "red"
104−warning = "yellow-warmer"
105−info = "cyan-cooler"
106−hint = "blue-cooler"
107−
108−[palette]
109−# Basic values
110−bg-main = "#ffffff"
111−bg-dim = "#f2f2f2"
112−fg-main = "#000000"
113−fg-dim = "#595959"
114−fg-alt = "#193668"
115−bg-active = "#c4c4c4"
116−bg-inactive = "#e0e0e0"
117−
118−# Common accent foregrounds
119−red = "#a60000"
120−red-warmer = "#972500"
121−red-cooler = "#a0132f"
122−red-faint = "#7f0000"
123−red-intense = "#d00000"
124−green = "#006800"
125−green-warmer = "#316500"
126−green-cooler = "#00663f"
127−green-faint = "#2a5045"
128−green-intense = "#008900"
129−yellow = "#6f5500"
130−yellow-warmer = "#884900"
131−yellow-cooler = "#7a4f2f"
132−yellow-faint = "#624416"
133−yellow-intense = "#808000"
134−blue = "#0031a9"
135−blue-warmer = "#354fcf"
136−blue-cooler = "#0000b0"
137−blue-faint = "#003497"
138−blue-intense = "#0000ff"
139−magenta = "#721045"
140−magenta-warmer = "#8f0075"
141−magenta-cooler = "#531ab6"
142−magenta-faint = "#7c318f"
143−magenta-intense = "#dd22dd"
144−cyan = "#005e8b"
145−cyan-warmer = "#3f578f"
146−cyan-cooler = "#005f5f"
147−cyan-faint = "#005077"
148−cyan-intense = "#008899"
149−
150−# Common accent backgrounds
151−bg-red-intense = "#ff8f88"
152−bg-green-intense = "#8adf80"
153−bg-yellow-intense = "#f3d000"
154−bg-blue-intense = "#bfc9ff"
155−bg-magenta-intense = "#dfa0f0"
156−bg-cyan-intense = "#a4d5f9"
157−
158−bg-red-subtle = "#ffcfbf"
159−bg-green-subtle = "#b3fabf"
160−bg-yellow-subtle = "#fff576"
161−bg-blue-subtle = "#ccdfff"
162−bg-magenta-subtle = "#ffddff"
163−bg-cyan-subtle = "#bfefff"
164−
165−bg-red-nuanced = "#fff1f0"
166−bg-green-nuanced = "#ecf7ed"
167−bg-yellow-nuanced = "#fff3da"
168−bg-blue-nuanced = "#f3f3ff"
169−bg-magenta-nuanced = "#fdf0ff"
170−bg-cyan-nuanced = "#ebf6fa"
171−
172−# Special purpose
173−bg-completion = "#c0deff"
174−bg-hl-line = "#dae5ec"
175−
176−bg-mode-line-active = "#c8c8c8"
177−fg-mode-line-active = "#000000"
178−bg-mode-line-inactive = "#e6e6e6"
179−fg-mode-line-inactive = "#585858"
180−
181−modeline-err = "#7f0000"
182−modeline-warning = "#5f0070"
183−modeline-info = "#002580"
184−
185−# Diffs
186−bg-added = "#c1f2d1"
187−fg-added = "#005000"
188−bg-changed = "#ffdfa9"
189−fg-changed = "#553d00"
190−bg-removed = "#ffd8d5"
191−fg-removed = "#8f1313"
192−
193−# Paren match
194−bg-paren-match = "#5fcfff"
runtime/themes/modus_operandi_deuteranopia.tomldeleted−46
@@ -1,46 +0,0 @@
1−# Author: Alexis Mousset <contact@amousset.me>
2−# modus_operandi.toml variant
3−#
4−# This variant is optimized for users with red-green color deficiency (deuteranopia)
5−
6−inherits = "modus_operandi"
7−
8−"constant.character.escape" = "magenta"
9−"comment" = "yellow-cooler"
10−"function" = "magenta"
11−"tag" = "magenta"
12−
13−"ui.cursor" = { fg = "bg-main", bg = "blue-intense" }
14−"ui.cursor.primary.normal" = { fg = "bg-main", bg = "blue-intense" }
15−
16−"diagnostic.error" = { underline = { color = "yellow-intense", style = "curl" } }
17−"diagnostic.warning" = { underline = { color = "magenta-faint", style = "curl" } }
18−"diagnostic.info" = { underline = { color = "cyan", style = "curl" } }
19−"diagnostic.hint" = { underline = { color = "blue", style = "curl" } }
20−
21−error = "yellow-intense"
22−warning = "magenta-faint"
23−info = "cyan"
24−hint = "blue"
25−
26−[palette]
27−
28−yellow = "#695500"
29−yellow-warmer = "#973300"
30−yellow-cooler = "#77492f"
31−
32−bg-mode-line-active = "#d0d6ff"
33−fg-mode-line-active = "#0f0f0f"
34−border-mode-line-active = "#4f4f74"
35−
36−modeline-err = "#603a00"
37−modeline-warning = "#454500"
38−modeline-info = "#023d92"
39−
40−# Diffs
41−bg-added = "#d5d7ff"
42−fg-added = "#303099"
43−bg-changed = "#eecfdf"
44−fg-changed = "#6f1343"
45−bg-removed = "#f4f099"
46−fg-removed = "#553d00"
runtime/themes/modus_operandi_tinted.tomldeleted−45
@@ -1,45 +0,0 @@
1−# Author: Alexis Mousset <contact@amousset.me>
2−# modus_operandi.toml variant
3−
4−inherits = "modus_operandi"
5−
6−"comment" = "red-faint"
7−
8−"ui.cursor.primary" = { fg = "bg-main", bg = "red" }
9−
10−[palette]
11−# Basic values
12−bg-main = "#fbf7f0"
13−bg-dim = "#efe9dd"
14−bg-active = "#c9b9b0"
15−bg-inactive = "#dfd5cf"
16−border = "#9f9690"
17−
18−# Common accent backgrounds
19−bg-red-nuanced = "#ffe8f0"
20−bg-green-nuanced = "#e0f5e0"
21−bg-yellow-nuanced = "#f9ead0"
22−bg-blue-nuanced = "#ebebff"
23−bg-magenta-nuanced = "#f6e7ff"
24−bg-cyan-nuanced = "#e1f3fc"
25−
26−# Special purpose
27−bg-completion = "#f0c1cf"
28−bg-hl-line = "#f1d5d0"
29−bg-region = "#c2bcb5"
30−
31−bg-mode-line-active = "#cab9b2"
32−border-mode-line-active = "#545454"
33−bg-mode-line-inactive = "#dfd9cf"
34−border-mode-line-inactive = "#a59a94"
35−
36−bg-tab-bar = "#e0d4ce"
37−bg-tab-current = "#fbf7f0"
38−bg-tab-other = "#c8b8b2"
39−
40−# Diffs
41−bg-added = "#c3ebc1"
42−bg-removed = "#f4d0cf"
43−
44−# Paren match
45−bg-paren-match = "#7fdfcf"
runtime/themes/modus_operandi_tritanopia.tomldeleted−73
@@ -1,73 +0,0 @@
1−# Author: Alexis Mousset <contact@amousset.me>
2−# modus_operandi.toml variant
3−#
4−# This variant is optimized for users with blue-yellow color deficiency (tritanopia)
5−
6−inherits = "modus_operandi"
7−
8−"type" = "blue-warmer"
9−"constructor" = "blue-warmer"
10−"constant" = "green-cooler"
11−"constant.character.escape" = "red-cooler"
12−"string" = "cyan"
13−"comment" = "red-faint"
14−"variable.parameter" = "cyan-cooler"
15−"keyword" = "red-cooler"
16−"keyword.directive" = "red-warmer"
17−"function" = "cyan-warmer"
18−"function.macro" = "magenta"
19−"tag" = "red-cooler"
20−
21−"markup.heading.2" = { fg = "red-faint", modifiers = ["bold"] }
22−"markup.heading.3" = { fg = "cyan-faint", modifiers = ["bold"] }
23−"markup.heading.6" = { fg = "magenta-faint", modifiers = ["bold"] }
24−"markup.link.url" = { fg = "cyan-cooler" }
25−"markup.link.text" = { fg = "cyan", modifiers = ["underlined"] }
26−
27−"ui.cursor" = { fg = "bg-main", bg = "red-intense" }
28−"ui.cursor.primary.normal" = { fg = "bg-main", bg = "red-intense" }
29−
30−"diagnostic.error" = { underline = { color = "red-warmer", style = "curl" } }
31−"diagnostic.warning" = { underline = { color = "magenta", style = "curl" } }
32−"diagnostic.info" = { underline = { color = "cyan", style = "curl" } }
33−"diagnostic.hint" = { underline = { color = "blue", style = "curl" } }
34−
35−error = "red-warmer"
36−warning = "magenta"
37−info = "cyan"
38−hint = "blue"
39−
40−[palette]
41−
42−# Common accent foregrounds
43−red-warmer = "#b21100"
44−red-faint = "#702000"
45−yellow = "#695500"
46−yellow-warmer = "#973300"
47−yellow-cooler = "#77492f"
48−magenta-intense = "#cd22bd"
49−cyan-faint = "#004f5f"
50−
51−# Special purpose
52−bg-completion = "#afdfef"
53−bg-hover = "#ffafbc"
54−bg-hover-secondary = "#9fdfff"
55−bg-hl-line = "#dfeaec"
56−
57−bg-char-0 = "#ff908f"
58−bg-char-1 = "#bfbfff"
59−bg-char-2 = "#5fcfdf"
60−
61−bg-mode-line-active = "#afe0f2"
62−fg-mode-line-active = "#0f0f0f"
63−border-mode-line-active = "#2f4f44"
64−
65−modeline-err = "#8f0000"
66−modeline-warning = "#6f306f"
67−modeline-info = "#00445f"
68−
69−# Diffs
70−bg-added = "#b5e7ff"
71−fg-added = "#005079"
72−bg-changed = "#eecfdf"
73−fg-changed = "#6f1343"
runtime/themes/modus_vivendi.tomldeleted−242
@@ -1,242 +0,0 @@
1−# Author: Matous Dzivjak <matousdzivjak@gmail.com>
2−# Adapted from https://protesilaos.com/emacs/modus-themes, by Protesilaos Stavrou
3−# Source: https://github.com/protesilaos/modus-themes/blob/main/modus-vivendi-theme.el
4−# Version 4.3.0
5−
6−# Syntax highlighting
7−# -------------------
8−"type" = "cyan-cooler"
9−"constructor" = "cyan-cooler"
10−
11−"constant" = "blue-cooler"
12−"constant.character.escape" = "magenta"
13−
14−"string" = "blue-warmer"
15−"string.regexp" = "magenta-faint"
16−"string.special" = "blue-faint" # used for colors in CSS
17−
18−"comment" = "fg-dim"
19−
20−"variable.parameter" = "cyan"
21−"variable.builtin" = "magenta-cooler"
22−"label" = "fg-dim" # used for language in markdown code blocks
23−"keyword" = "magenta-cooler"
24−"keyword.directive" = "red-cooler"
25−"function" = "magenta"
26−"function.macro" = "magenta-warmer"
27−
28−punctuation = "fg-dim"
29−"tag" = "magenta"
30−"attribute" = "cyan-cooler"
31−"namespace" = "blue-cooler"
32−"special" = "red-cooler"
33−
34−"markup.heading.marker" = "fg-dim"
35−"markup.heading.1" = { fg = "fg-main", modifiers = ["bold"] }
36−"markup.heading.2" = { fg = "yellow-faint", modifiers = ["bold"] }
37−"markup.heading.3" = { fg = "fg-alt", modifiers = ["bold"] }
38−"markup.heading.4" = { fg = "magenta", modifiers = ["bold"] }
39−"markup.heading.5" = { fg = "green-faint", modifiers = ["bold"] }
40−"markup.heading.6" = { fg = "red-faint", modifiers = ["bold"] }
41−"markup.list" = "fg-dim"
42−"markup.list.checked" = { fg = "yellow-warmer" }
43−"markup.list.unchecked" = { fg = "yellow-warmer" }
44−"markup.bold" = { modifiers = ["bold"] }
45−"markup.italic" = { modifiers = ["italic"] }
46−"markup.strikethrough" = { modifiers = ["crossed_out"] }
47−"markup.link.url" = { fg = "cyan" }
48−"markup.link.text" = { fg = "blue-warmer", modifiers = ["underlined"] }
49−"markup.raw.block" = { bg = "bg-dim" }
50−"markup.raw.inline" = { fg = "green-cooler" }
51−
52−"diff.plus" = { fg = "fg-added", bg = "bg-added" }
53−"diff.plus.gutter" = "green-intense"
54−"diff.minus" = { fg = "fg-removed", bg = "bg-removed" }
55−"diff.minus.gutter" = "red-intense"
56−"diff.delta" = { fg = "fg-changed", bg = "bg-changed" }
57−"diff.delta.gutter" = "yellow-intense"
58−
59−# User Interface
60−# --------------
61−
62−"ui.background" = { bg = "bg-main" }
63−
64−"ui.linenr" = { fg = "fg-dim", bg = "bg-dim" }
65−"ui.linenr.selected" = { fg = "fg-main", bg = "bg-active" }
66−
67−"ui.statusline" = { fg = "fg-mode-line-active", bg = "bg-mode-line-active" }
68−"ui.statusline.inactive" = { fg = "fg-mode-line-inactive", bg = "bg-mode-line-inactive" }
69−"ui.statusline.normal" = { fg = "blue-warmer" }
70−"ui.statusline.insert" = { fg = "green-warmer" }
71−"ui.statusline.select" = { fg = "magenta-warmer" }
72−
73−"ui.bufferline" = { bg = "bg-tab-bar" }
74−"ui.bufferline.active" = { bg = "bg-tab-current", fg = "fg-mode-line-active" }
75−
76−"ui.popup" = { fg = "fg-main", bg = "bg-dim" }
77−"ui.window" = { fg = "fg-dim" }
78−"ui.help" = { fg = "fg-main", bg = "bg-dim" }
79−"ui.gutter" = { bg = "bg-dim" }
80−"ui.text" = "fg-main"
81−"ui.text.focus" = { fg = "fg-main", bg = "bg-completion", modifiers = ["bold"] }
82−"ui.text.inactive" = { fg = "fg-dim" }
83−"ui.virtual" = "bg-active"
84−"ui.virtual.ruler" = { bg = "bg-dim" }
85−"ui.virtual.inlay-hint" = { fg = "fg-dim", modifiers = ["italic"] }
86−
87−"ui.selection" = { fg = "fg-main", bg = "bg-inactive" }
88−"ui.selection.primary" = { fg = "fg-main", bg = "bg-active" }
89−
90−"ui.cursor" = { fg = "bg-main", bg = "fg-main" }
91−"ui.cursor.primary" = { fg = "bg-main", bg = "fg-dim" }
92−"ui.cursor.match" = { bg = "bg-paren-match" }
93−"ui.cursorline.primary" = { bg = "bg-hl-line" }
94−
95−"ui.highlight" = { bg = "bg-hl-line" }
96−
97−"ui.menu" = { fg = "fg-main", bg = "bg-dim" }
98−"ui.menu.selected" = { fg = "fg-main", bg = "bg-completion", modifiers = ["bold"] }
99−"ui.menu.scroll" = { fg = "fg-dim", bg = "bg-cyan-intense" }
100−
101−"diagnostic.error" = { underline = { color = "red-intense", style = "curl" } }
102−"diagnostic.warning" = { underline = { color = "yellow-intense", style = "curl" } }
103−"diagnostic.info" = { underline = { color = "cyan-intense", style = "curl" } }
104−"diagnostic.hint" = { underline = { color = "blue-intense", style = "curl" } }
105−
106−error = "red"
107−warning = "yellow-warmer"
108−info = "cyan-cooler"
109−hint = "blue-cooler"
110−
111−[palette]
112−# Basic values
113−bg-main = "#000000"
114−bg-dim = "#1e1e1e"
115−fg-main = "#ffffff"
116−fg-dim = "#989898"
117−fg-alt = "#c6daff"
118−bg-active = "#535353"
119−bg-inactive = "#303030"
120−
121−# Common accent foregrounds
122−red = "#ff5f59"
123−red-warmer = "#ff6b55"
124−red-cooler = "#ff7f9f"
125−red-faint = "#ff9580"
126−red-intense = "#ff5f5f"
127−green = "#44bc44"
128−green-warmer = "#70b900"
129−green-cooler = "#00c06f"
130−green-faint = "#88ca9f"
131−green-intense = "#44df44"
132−yellow = "#d0bc00"
133−yellow-warmer = "#fec43f"
134−yellow-cooler = "#dfaf7a"
135−yellow-faint = "#d2b580"
136−yellow-intense = "#efef00"
137−blue = "#2fafff"
138−blue-warmer = "#79a8ff"
139−blue-cooler = "#00bcff"
140−blue-faint = "#82b0ec"
141−blue-intense = "#338fff"
142−magenta = "#feacd0"
143−magenta-warmer = "#f78fe7"
144−magenta-cooler = "#b6a0ff"
145−magenta-faint = "#caa6df"
146−magenta-intense = "#ff66ff"
147−cyan = "#00d3d0"
148−cyan-warmer = "#4ae2f0"
149−cyan-cooler = "#6ae4b9"
150−cyan-faint = "#9ac8e0"
151−cyan-intense = "#00eff0"
152−
153−# Uncommon accent foregrounds
154−rust = "#db7b5f"
155−gold = "#c0965b"
156−olive = "#9cbd6f"
157−slate = "#76afbf"
158−indigo = "#9099d9"
159−maroon = "#cf7fa7"
160−pink = "#d09dc0"
161−
162−# Common accent backgrounds
163−bg-red-intense = "#9d1f1f"
164−bg-green-intense = "#2f822f"
165−bg-yellow-intense = "#7a6100"
166−bg-blue-intense = "#1640b0"
167−bg-magenta-intense = "#7030af"
168−bg-cyan-intense = "#2266ae"
169−
170−bg-red-subtle = "#620f2a"
171−bg-green-subtle = "#00422a"
172−bg-yellow-subtle = "#4a4000"
173−bg-blue-subtle = "#242679"
174−bg-magenta-subtle = "#552f5f"
175−bg-cyan-subtle = "#004065"
176−
177−bg-red-nuanced = "#2c0614"
178−bg-green-nuanced = "#001904"
179−bg-yellow-nuanced = "#221000"
180−bg-blue-nuanced = "#0f0e39"
181−bg-magenta-nuanced = "#230631"
182−bg-cyan-nuanced = "#041529"
183−
184−# Uncommon accent backgrounds
185−bg-ochre = "#442c2f"
186−bg-lavender = "#38325c"
187−bg-sage = "#0f3d30"
188−
189−# Special purpose
190−bg-completion = "#2f447f"
191−bg-hover = "#45605e"
192−bg-hover-secondary = "#654a39"
193−bg-hl-line = "#2f3849"
194−bg-region = "#5a5a5a"
195−fg-region = "#ffffff"
196−
197−bg-char-0 = "#0050af"
198−bg-char-1 = "#7f1f7f"
199−bg-char-2 = "#625a00"
200−
201−bg-mode-line-active = "#505050"
202−fg-mode-line-active = "#ffffff"
203−border-mode-line-active = "#959595"
204−bg-mode-line-inactive = "#2d2d2d"
205−fg-mode-line-inactive = "#969696"
206−border-mode-line-inactive = "#606060"
207−
208−modeline-err = "#ffa9bf"
209−modeline-warning = "#dfcf43"
210−modeline-info = "#9fefff"
211−
212−bg-tab-bar = "#313131"
213−bg-tab-current = "#000000"
214−bg-tab-other = "#545454"
215−
216−# Diffs
217−bg-added = "#00381f"
218−bg-added-faint = "#002910"
219−bg-added-refine = "#034f2f"
220−bg-added-fringe = "#237f3f"
221−fg-added = "#a0e0a0"
222−fg-added-intense = "#80e080"
223−
224−bg-changed = "#363300"
225−bg-changed-faint = "#2a1f00"
226−bg-changed-refine = "#4a4a00"
227−bg-changed-fringe = "#8a7a00"
228−fg-changed = "#efef80"
229−fg-changed-intense = "#c0b05f"
230−
231−bg-removed = "#4f1119"
232−bg-removed-faint = "#380a0f"
233−bg-removed-refine = "#781a1f"
234−bg-removed-fringe = "#b81a1f"
235−fg-removed = "#ffbfbf"
236−fg-removed-intense = "#ff9095"
237−
238−bg-diff-context = "#1a1a1a"
239−
240−# Paren match
241−bg-paren-match = "#2f7f9f"
242−tg-paren-expression = "#453040"
runtime/themes/modus_vivendi_deuteranopia.tomldeleted−158
@@ -1,158 +0,0 @@
1−# Author: Matous Dzivjak <matousdzivjak@gmail.com>
2−# Adapted from https://protesilaos.com/emacs/modus-themes, by Protesilaos Stavrou
3−# Source: https://github.com/protesilaos/modus-themes/blob/main/modus-vivendi-deuteranopia-theme.el
4−# Version 4.3.0
5−
6−inherits = "modus_vivendi"
7−
8−"constant.character.escape" = "magenta"
9−"comment" = "yellow-cooler"
10−"function" = "magenta"
11−"tag" = "magenta"
12−
13−"ui.cursor" = { fg = "bg-main", bg = "blue-intense" }
14−"ui.cursor.primary.normal" = { fg = "bg-main", bg = "blue-intense" }
15−
16−"diagnostic.error" = { underline = { color = "yellow-intense", style = "curl" } }
17−"diagnostic.warning" = { underline = { color = "magenta-faint", style = "curl" } }
18−"diagnostic.info" = { underline = { color = "cyan", style = "curl" } }
19−"diagnostic.hint" = { underline = { color = "blue", style = "curl" } }
20−
21−error = "yellow-intense"
22−warning = "magenta-faint"
23−info = "cyan"
24−hint = "blue"
25−
26−[palette]
27−# Basic values
28−bg-main = "#000000"
29−bg-dim = "#1e1e1e"
30−fg-main = "#ffffff"
31−fg-dim = "#989898"
32−fg-alt = "#c6daff"
33−bg-active = "#535353"
34−bg-inactive = "#303030"
35−border = "#646464"
36−
37−# Common accent foregrounds
38−red = "#ff5f59"
39−red-warmer = "#ff6b55"
40−red-cooler = "#ff7f9f"
41−red-faint = "#ff9580"
42−red-intense = "#ff5f5f"
43−green = "#44bc44"
44−green-warmer = "#70b900"
45−green-cooler = "#00c06f"
46−green-faint = "#88ca9f"
47−green-intense = "#44df44"
48−yellow = "#cabf00"
49−yellow-warmer = "#ffa00f"
50−yellow-cooler = "#d8af7a"
51−yellow-faint = "#d2b580"
52−yellow-intense = "#efef00"
53−blue = "#2fafff"
54−blue-warmer = "#79a8ff"
55−blue-cooler = "#00bcff"
56−blue-faint = "#82b0ec"
57−blue-intense = "#338fff"
58−magenta = "#feacd0"
59−magenta-warmer = "#f78fe7"
60−magenta-cooler = "#b6a0ff"
61−magenta-faint = "#caa6df"
62−magenta-intense = "#ff66ff"
63−cyan = "#00d3d0"
64−cyan-warmer = "#4ae2f0"
65−cyan-cooler = "#6ae4b9"
66−cyan-faint = "#9ac8e0"
67−cyan-intense = "#00eff0"
68−
69−# Uncommon accent foregrounds
70−rust = "#db7b5f"
71−gold = "#c0965b"
72−olive = "#9cbd6f"
73−slate = "#76afbf"
74−indigo = "#9099d9"
75−maroon = "#cf7fa7"
76−pink = "#d09dc0"
77−
78−# Common accent backgrounds
79−bg-red-intense = "#9d1f1f"
80−bg-green-intense = "#2f822f"
81−bg-yellow-intense = "#7a6100"
82−bg-blue-intense = "#1640b0"
83−bg-magenta-intense = "#7030af"
84−bg-cyan-intense = "#2266ae"
85−
86−bg-red-subtle = "#620f2a"
87−bg-green-subtle = "#00422a"
88−bg-yellow-subtle = "#4a4000"
89−bg-blue-subtle = "#242679"
90−bg-magenta-subtle = "#552f5f"
91−bg-cyan-subtle = "#004065"
92−
93−bg-red-nuanced = "#2c0614"
94−bg-green-nuanced = "#001904"
95−bg-yellow-nuanced = "#221000"
96−bg-blue-nuanced = "#0f0e39"
97−bg-magenta-nuanced = "#230631"
98−bg-cyan-nuanced = "#041529"
99−
100−# Uncommon accent backgrounds
101−bg-ochre = "#442c2f"
102−bg-lavender = "#38325c"
103−bg-sage = "#0f3d30"
104−
105−# Special purpose
106−bg-completion = "#2f447f"
107−bg-hover = "#45605e"
108−bg-hover-secondary = "#654a39"
109−bg-hl-line = "#2f3849"
110−bg-region = "#5a5a5a"
111−fg-region = "#ffffff"
112−
113−bg-char-0 = "#0050af"
114−bg-char-1 = "#7f1f7f"
115−bg-char-2 = "#625a00"
116−
117−bg-mode-line-active = "#2a2a6a"
118−fg-mode-line-active = "#f0f0f0"
119−border-mode-line-active = "#8080a7"
120−bg-mode-line-inactive = "#2d2d2d"
121−fg-mode-line-inactive = "#969696"
122−border-mode-line-inactive = "#606060"
123−
124−modeline-err = "#e5bf00"
125−modeline-warning = "#c0cf35"
126−modeline-info = "#abeadf"
127−
128−bg-tab-bar = "#313131"
129−bg-tab-current = "#000000"
130−bg-tab-other = "#545454"
131−
132−# Diffs
133−bg-added = "#003066"
134−bg-added-faint = "#001a4f"
135−bg-added-refine = "#0f4a77"
136−bg-added-fringe = "#006fff"
137−fg-added = "#c4d5ff"
138−fg-added-intense = "#8080ff"
139−
140−bg-changed = "#2f123f"
141−bg-changed-faint = "#1f022f"
142−bg-changed-refine = "#3f325f"
143−bg-changed-fringe = "#7f55a0"
144−fg-changed = "#e3cfff"
145−fg-changed-intense = "#cf9fe2"
146−
147−bg-removed = "#3d3d00"
148−bg-removed-faint = "#281f00"
149−bg-removed-refine = "#555500"
150−bg-removed-fringe = "#d0c03f"
151−fg-removed = "#d4d48f"
152−fg-removed-intense = "#d0b05f"
153−
154−bg-diff-context = "#1a1a1a"
155−
156−# Paren match
157−bg-paren-match = "#2f7f9f"
158−bg-paren-expression = "#453040"
runtime/themes/modus_vivendi_tinted.tomldeleted−144
@@ -1,144 +0,0 @@
1−# Author: Matous Dzivjak <matousdzivjak@gmail.com>
2−# Adapted from: https://protesilaos.com/emacs/modus-themes, by Protesilaos Stavrou
3−# Source: https://github.com/protesilaos/modus-themes/blob/main/modus-vivendi-tinted-theme.el
4−# Version 4.3.0
5−
6−inherits = "modus_vivendi"
7−
8−"comment" = "red-faint"
9−
10−"ui.cursor.primary" = { fg = "bg-main", bg = "red" }
11−
12−[palette]
13−# Basic values
14−bg-main = "#0d0e1c"
15−bg-dim = "#1d2235"
16−fg-main = "#ffffff"
17−fg-dim = "#989898"
18−fg-alt = "#c6daff"
19−bg-active = "#4a4f69"
20−bg-inactive = "#2b3045"
21−border = "#61647a"
22−
23−# Common accent foregrounds
24−red = "#ff5f59"
25−red-warmer = "#ff6b55"
26−red-cooler = "#ff7f9f"
27−red-faint = "#ff9f80"
28−red-intense = "#ff5f5f"
29−green = "#44bc44"
30−green-warmer = "#70b900"
31−green-cooler = "#00c06f"
32−green-faint = "#88ca9f"
33−green-intense = "#44df44"
34−yellow = "#d0bc00"
35−yellow-warmer = "#fec43f"
36−yellow-cooler = "#dfaf7a"
37−yellow-faint = "#d2b580"
38−yellow-intense = "#efef00"
39−blue = "#2fafff"
40−blue-warmer = "#79a8ff"
41−blue-cooler = "#00bcff"
42−blue-faint = "#82b0ec"
43−blue-intense = "#338fff"
44−magenta = "#feacd0"
45−magenta-warmer = "#f78fe7"
46−magenta-cooler = "#b6a0ff"
47−magenta-faint = "#caa6df"
48−magenta-intense = "#ff66ff"
49−cyan = "#00d3d0"
50−cyan-warmer = "#4ae2f0"
51−cyan-cooler = "#6ae4b9"
52−cyan-faint = "#9ac8e0"
53−cyan-intense = "#00eff0"
54−
55−# Uncommon accent foregrounds
56−rust = "#db7b5f"
57−gold = "#c0965b"
58−olive = "#9cbd6f"
59−slate = "#76afbf"
60−indigo = "#9099d9"
61−maroon = "#cf7fa7"
62−pink = "#d09dc0"
63−
64−# Common accent backgrounds
65−bg-red-intense = "#9d1f1f"
66−bg-green-intense = "#2f822f"
67−bg-yellow-intense = "#7a6100"
68−bg-blue-intense = "#1640b0"
69−bg-magenta-intense = "#7030af"
70−bg-cyan-intense = "#2266ae"
71−
72−bg-red-subtle = "#620f2a"
73−bg-green-subtle = "#00422a"
74−bg-yellow-subtle = "#4a4000"
75−bg-blue-subtle = "#242679"
76−bg-magenta-subtle = "#552f5f"
77−bg-cyan-subtle = "#004065"
78−
79−bg-red-nuanced = "#350f14"
80−bg-green-nuanced = "#002718"
81−bg-yellow-nuanced = "#2c1f00"
82−bg-blue-nuanced = "#131c4d"
83−bg-magenta-nuanced = "#2f133f"
84−bg-cyan-nuanced = "#04253f"
85−
86−# Special purpose
87−bg-completion = "#483d8a"
88−bg-hover = "#45605e"
89−bg-hover-secondary = "#654a39"
90−bg-hl-line = "#303a6f"
91−bg-region = "#555a66"
92−fg-region = "#ffffff"
93−
94−bg-char-0 = "#0050af"
95−bg-char-1 = "#7f1f7f"
96−bg-char-2 = "#625a00"
97−
98−bg-mode-line-active = "#484d67"
99−fg-mode-line-active = "#ffffff"
100−border-mode-line-active = "#979797"
101−bg-mode-line-inactive = "#292d48"
102−fg-mode-line-inactive = "#969696"
103−border-mode-line-inactive = "#606270"
104−
105−modeline-err = "#ffa9bf"
106−modeline-warning = "#dfcf43"
107−modeline-info = "#9fefff"
108−
109−bg-tab-bar = "#2c3045"
110−bg-tab-current = "#0d0e1c"
111−bg-tab-other = "#4a4f6a"
112−
113−# Diffs
114−bg-added = "#003a2f"
115−bg-added-faint = "#002922"
116−bg-added-refine = "#035542"
117−bg-added-fringe = "#23884f"
118−fg-added = "#a0e0a0"
119−fg-added-intense = "#80e080"
120−
121−bg-changed = "#363300"
122−bg-changed-faint = "#2a1f00"
123−bg-changed-refine = "#4a4a00"
124−bg-changed-fringe = "#8f7a30"
125−fg-changed = "#efef80"
126−fg-changed-intense = "#c0b05f"
127−
128−bg-removed = "#4f1127"
129−bg-removed-faint = "#380a19"
130−bg-removed-refine = "#781a3a"
131−bg-removed-fringe = "#b81a26"
132−fg-removed = "#ffbfbf"
133−fg-removed-intense = "#ff9095"
134−
135−bg-diff-context = "#1a1f30"
136−
137−# Uncommon accent backgrounds
138−bg-ochre = "#442c2f"
139−bg-lavender = "#38325c"
140−bg-sage = "#0f3d30"
141−
142−# Paren match
143−bg-paren-match = "#2f7f9f"
144−bg-paren-expression = "#453040"
runtime/themes/modus_vivendi_tritanopia.tomldeleted−186
@@ -1,186 +0,0 @@
1−# Author: Matous Dzivjak <matousdzivjak@gmail.com>
2−# Adapted from https://protesilaos.com/emacs/modus-themes, by Protesilaos Stavrou
3−# Source: https://github.com/protesilaos/modus-themes/blob/main/modus-vivendi-tritanopia-theme.el
4−# Version 4.3.0
5−
6−inherits = "modus_vivendi"
7−
8−"type" = "blue-warmer"
9−"constructor" = "blue-warmer"
10−"constant" = "green-cooler"
11−"constant.character.escape" = "red-cooler"
12−"string" = "cyan"
13−"comment" = "red-faint"
14−"variable.parameter" = "cyan-cooler"
15−"keyword" = "red-cooler"
16−"keyword.directive" = "red-warmer"
17−"function" = "cyan-warmer"
18−"function.macro" = "magenta"
19−"tag" = "red-cooler"
20−
21−"markup.heading.2" = { fg = "red-faint", modifiers = ["bold"] }
22−"markup.heading.3" = { fg = "cyan-faint", modifiers = ["bold"] }
23−"markup.heading.6" = { fg = "magenta-faint", modifiers = ["bold"] }
24−"markup.link.url" = { fg = "cyan-cooler" }
25−"markup.link.text" = { fg = "cyan", modifiers = ["underlined"] }
26−
27−"ui.cursor" = { fg = "bg-main", bg = "red-intense" }
28−"ui.cursor.primary.normal" = { fg = "bg-main", bg = "red-intense" }
29−
30−"diagnostic.error" = { underline = { color = "red-warmer", style = "curl" } }
31−"diagnostic.warning" = { underline = { color = "magenta", style = "curl" } }
32−"diagnostic.info" = { underline = { color = "cyan", style = "curl" } }
33−"diagnostic.hint" = { underline = { color = "blue", style = "curl" } }
34−
35−error = "red-warmer"
36−warning = "magenta"
37−info = "cyan"
38−hint = "blue"
39−
40−[palette]
41−# Basic values
42−bg-main = "#000000"
43−bg-dim = "#1e1e1e"
44−fg-main = "#ffffff"
45−fg-dim = "#989898"
46−fg-alt = "#c6daff"
47−bg-active = "#535353"
48−bg-inactive = "#303030"
49−border = "#646464"
50−
51−# Common accent foregrounds
52−red = "#ff5f59"
53−red-warmer = "#ff6740"
54−red-cooler = "#ff6f9f"
55−red-faint = "#ff9070"
56−red-intense = "#ff5f5f"
57−green = "#44bc44"
58−green-warmer = "#70b900"
59−green-cooler = "#00c06f"
60−green-faint = "#88ca9f"
61−green-intense = "#44df44"
62−yellow = "#cabf00"
63−yellow-warmer = "#ffa00f"
64−yellow-cooler = "#d8af7a"
65−yellow-faint = "#d2b580"
66−yellow-intense = "#efef00"
67−blue = "#2fafff"
68−blue-warmer = "#79a8ff"
69−blue-cooler = "#00bcff"
70−blue-faint = "#82b0ec"
71−blue-intense = "#338fff"
72−magenta = "#feacd0"
73−magenta-warmer = "#f78fe7"
74−magenta-cooler = "#b6a0ff"
75−magenta-faint = "#caa6df"
76−magenta-intense = "#ef7fff"
77−cyan = "#00d3d0"
78−cyan-warmer = "#4ae2ff"
79−cyan-cooler = "#6ae4b9"
80−cyan-faint = "#7fdbdf"
81−cyan-intense = "#00eff0"
82−
83−# Uncommon accent foregrounds
84−rust = "#db7b5f"
85−gold = "#c0965b"
86−olive = "#9cbd6f"
87−slate = "#76afbf"
88−indigo = "#9099d9"
89−maroon = "#cf7fa7"
90−pink = "#d09dc0"
91−
92−# Common accent backgrounds
93−bg-red-intense = "#9d1f1f"
94−bg-green-intense = "#2f822f"
95−bg-yellow-intense = "#7a6100"
96−bg-blue-intense = "#1640b0"
97−bg-magenta-intense = "#7030af"
98−bg-cyan-intense = "#2266ae"
99−
100−bg-red-subtle = "#620f2a"
101−bg-green-subtle = "#00422a"
102−bg-yellow-subtle = "#4a4000"
103−bg-blue-subtle = "#242679"
104−bg-magenta-subtle = "#552f5f"
105−bg-cyan-subtle = "#004065"
106−
107−bg-red-nuanced = "#2c0614"
108−bg-green-nuanced = "#001904"
109−bg-yellow-nuanced = "#221000"
110−bg-blue-nuanced = "#0f0e39"
111−bg-magenta-nuanced = "#230631"
112−bg-cyan-nuanced = "#041529"
113−
114−# Uncommon accent backgrounds
115−bg-ochre = "#442c2f"
116−bg-lavender = "#38325c"
117−bg-sage = "#0f3d30"
118−
119−# Graphs
120−bg-graph-red-0 = "#b52c2c"
121−bg-graph-red-1 = "#702020"
122−bg-graph-green-0 = "#afd1c0"
123−bg-graph-green-1 = "#607a8f"
124−bg-graph-yellow-0 = "#facfd6"
125−bg-graph-yellow-1 = "#b57b85"
126−bg-graph-blue-0 = "#4f9fdf"
127−bg-graph-blue-1 = "#004559"
128−bg-graph-magenta-0 = "#b6427f"
129−bg-graph-magenta-1 = "#7f506f"
130−bg-graph-cyan-0 = "#57dfea"
131−bg-graph-cyan-1 = "#00808f"
132−
133−# Special purpose
134−bg-completion = "#004253"
135−bg-hover = "#8e3e3b"
136−bg-hover-secondary = "#00405f"
137−bg-hl-line = "#2f3849"
138−bg-region = "#5a5a5a"
139−fg-region = "#ffffff"
140−
141−bg-char-0 = "#922a00"
142−bg-char-1 = "#00709f"
143−bg-char-2 = "#5f3faf"
144−
145−bg-mode-line-active = "#003c52"
146−fg-mode-line-active = "#f0f0f0"
147−border-mode-line-active = "#5f8fb4"
148−bg-mode-line-inactive = "#2d2d2d"
149−fg-mode-line-inactive = "#969696"
150−border-mode-line-inactive = "#606060"
151−
152−modeline-err = "#ff7fbf"
153−modeline-warning = "#df9f93"
154−modeline-info = "#4fcfef"
155−
156−bg-tab-bar = "#313131"
157−bg-tab-current = "#000000"
158−bg-tab-other = "#545454"
159−
160−# Diffs
161−bg-added = "#004254"
162−bg-added-faint = "#003042"
163−bg-added-refine = "#004f7f"
164−bg-added-fringe = "#008fcf"
165−fg-added = "#9fdfdf"
166−fg-added-intense = "#50c0ef"
167−
168−bg-changed = "#2f123f"
169−bg-changed-faint = "#1f022f"
170−bg-changed-refine = "#3f325f"
171−bg-changed-fringe = "#7f55a0"
172−fg-changed = "#e3cfff"
173−fg-changed-intense = "#cf9fe2"
174−
175−bg-removed = "#4f1119"
176−bg-removed-faint = "#380a0f"
177−bg-removed-refine = "#781a1f"
178−bg-removed-fringe = "#b81a1f"
179−fg-removed = "#ffbfbf"
180−fg-removed-intense = "#ff9095"
181−
182−bg-diff-context = "#1a1a1a"
183−
184−# Paren match
185−bg-paren-match = "#2f7f9f"
186−bg-paren-expression = "#453040"
runtime/themes/naysayer.toml+2−2
@@ -20,13 +20,13 @@
20"ui.help" = { fg = "text", bg = "bg" }
20"ui.help" = { fg = "text", bg = "bg" }
21"ui.popup" = { fg = "text", bg = "bg" }
21"ui.popup" = { fg = "text", bg = "bg" }
22"ui.menu" = { fg = "text", bg = "bg" }
22"ui.menu" = { fg = "text", bg = "bg" }
23−"ui.menu.selected" = { fg = "text", bg = "bg", modifiers = ['underlined'] }
23+"ui.menu.selected" = { fg = "text", bg = "bg" }
24"ui.window" = { bg = "bg" }
24"ui.window" = { bg = "bg" }
25"diagnostic.error" = { bg = "error", fg = "text", modifiers = ["bold"] }
25"diagnostic.error" = { bg = "error", fg = "text", modifiers = ["bold"] }
26"diagnostic.warning" = { bg = "warning", fg = "text", modifiers = ["bold"] }
26"diagnostic.warning" = { bg = "warning", fg = "text", modifiers = ["bold"] }
27"diagnostic.hint" = { bg = "cyan", modifiers = ["bold"] }
27"diagnostic.hint" = { bg = "cyan", modifiers = ["bold"] }
28"ui.bufferline" = { fg = "text", bg = "bg" }
28"ui.bufferline" = { fg = "text", bg = "bg" }
29−"ui.bufferline.active" = { fg = "text", bg = "bg", modifiers = ['underlined'] }
29+"ui.bufferline.active" = { fg = "text", bg = "bg" }
30"ui.gutter.selected" = { bg = "highlight-line", modifiers = ["bold"] }
30"ui.gutter.selected" = { bg = "highlight-line", modifiers = ["bold"] }
31"ui.highlight" = { bg = "highlight-line" }
31"ui.highlight" = { bg = "highlight-line" }
32
32
runtime/themes/noctis.toml+25−25
@@ -7,8 +7,8 @@
7
7
8'property' = { fg = "red" } # Regex group names.
8'property' = { fg = "red" } # Regex group names.
9"warning" = { fg ="yellow", modifiers = ["bold"] } # Editor warnings.
9"warning" = { fg ="yellow", modifiers = ["bold"] } # Editor warnings.
10−"error" = { fg = "red", modifiers = ["bold"] } # Editor errors, like mis-typing a command.
10+"error" = { bg = "mid-green", fg = "red", modifiers = ["bold"] } # Editor errors, like mis-typing a command.
11−"info" = { fg = "mid-blue" } # Code diagnostic info in gutter (LSP).
11+"info" = { fg = "mid-blue", bg = "mid-green" } # Code diagnostic info in gutter (LSP).
12# ? Difference between info and hint ?
12# ? Difference between info and hint ?
13"hint" = { fg = "light-green", modifiers = ["bold"] } # Code diagnostics hint in gutter (LSP).
13"hint" = { fg = "light-green", modifiers = ["bold"] } # Code diagnostics hint in gutter (LSP).
14
14
@@ -21,14 +21,14 @@
21# UI ==============================
21# UI ==============================
22# For styling helix itself.
22# For styling helix itself.
23
23
24−'ui.background' = { fg = "autocomp-green", bg = "dark-green" } # Default background color.
24+'ui.background' = { bg = "dark-green"} # Default background color.
25'ui.window' = { fg = "mid-green" } # Window border between splits.
25'ui.window' = { fg = "mid-green" } # Window border between splits.
26
26
27'ui.gutter' = { } # Left gutter for diagnostics and breakpoints.
27'ui.gutter' = { } # Left gutter for diagnostics and breakpoints.
28
28
29'ui.text' = { fg = "white" } # Default text color.
29'ui.text' = { fg = "white" } # Default text color.
30'ui.text.focus' = { fg = "white", bg = "mid-green", modifiers = ["bold"] } # Selection highlight in buffer-picker or file-picker.
30'ui.text.focus' = { fg = "white", bg = "mid-green", modifiers = ["bold"] } # Selection highlight in buffer-picker or file-picker.
31−'ui.text.info' = { fg = "white" } # Info popup contents (space mode menu).
31+'ui.text.info' = { } # Info popup contents (space mode menu).
32
32
33'ui.cursor' = { fg = "dark-green", bg = "white" } # Fallback cursor colour, non-primary cursors when there are multiple (shift-c).
33'ui.cursor' = { fg = "dark-green", bg = "white" } # Fallback cursor colour, non-primary cursors when there are multiple (shift-c).
34'ui.cursor.primary' = { fg = "dark-green", bg = "light-blue" } # The primary cursor when there are multiple (shift-c).
34'ui.cursor.primary' = { fg = "dark-green", bg = "light-blue" } # The primary cursor when there are multiple (shift-c).
@@ -40,8 +40,8 @@
40'ui.selection.primary' = { bg = "autocomp-green" } # The primary selection when there are multiple.
40'ui.selection.primary' = { bg = "autocomp-green" } # The primary selection when there are multiple.
41'ui.cursorline.primary' = { bg = 'mid-green' }
41'ui.cursorline.primary' = { bg = 'mid-green' }
42
42
43−'ui.linenr' = { fg = "gray" } # Line numbers.
43+'ui.linenr' = { bg = "dark-green", fg = "gray" } # Line numbers.
44−'ui.linenr.selected' = { fg = "light-green", modifiers = [ "bold" ] } # Current line number.
44+'ui.linenr.selected' = { bg = "mid-green", fg = "light-green", modifiers = [ "bold" ] } # Current line number.
45
45
46'ui.virtual' = { fg = "mid-green" } # Namespace for additions to the editing area.
46'ui.virtual' = { fg = "mid-green" } # Namespace for additions to the editing area.
47'ui.virtual.ruler' = { bg = "mid-green" } # Vertical rulers (colored columns in editing area).
47'ui.virtual.ruler' = { bg = "mid-green" } # Vertical rulers (colored columns in editing area).
@@ -75,9 +75,9 @@
75#'type.builtin' = { } # Primitive types of the language (string, int, float).
75#'type.builtin' = { } # Primitive types of the language (string, int, float).
76#'type.enum.variant' = { } # A variant of an enum.
76#'type.enum.variant' = { } # A variant of an enum.
77
77
78−'constructor' = { fg = "light-blue", modifiers = ["bold"]} # Constructor method for a class or struct. And in some cases applies to module names
78+'constructor' = { fg = "mid-blue", modifiers = ["bold"]} # Constructor method for a class or struct. And in some cases applies to module names
79
79
80−'constant' = { fg = "light-blue", modifiers = ["bold"] } # Constant value
80+'constant' = { fg = "light-blue" } # Constant value
81'constant.builtin' = { fg = "mid-blue", modifiers = ["bold"] } # Special constants like `true`, `false`, `none`, etc.
81'constant.builtin' = { fg = "mid-blue", modifiers = ["bold"] } # Special constants like `true`, `false`, `none`, etc.
82'constant.builtin.boolean' = { } # True or False.
82'constant.builtin.boolean' = { } # True or False.
83'constant.character' = { fg = "light-green"} # Constant of character type.
83'constant.character' = { fg = "light-green"} # Constant of character type.
@@ -88,20 +88,21 @@
88
88
89'string' = { fg = "light-green" } # String literal.
89'string' = { fg = "light-green" } # String literal.
90'string.regexp' = { } # Regular expression literal.
90'string.regexp' = { } # Regular expression literal.
91−'string.special' = { fg = "red" } # Strings containing a path, URL, etc.
91+'string.special' = { fg = "light-blue" } # Strings containing a path, URL, etc.
92−# 'string.special.path' = { } # String containing a file path.
92+'string.special.path' = { } # String containing a file path.
93−# 'string.special.url' = { } # String containing a web URL.
93+'string.special.url' = { } # String containing a web URL.
94−# 'string.special.symbol' = { } # Erlang/Elixir atoms, Ruby symbols, Clojure keywords.
94+'string.special.symbol' = { } # Erlang/Elixir atoms, Ruby symbols, Clojure keywords.
95
95
96'comment' = { fg = "gray", modifiers = ["italic"] } # This is a comment.
96'comment' = { fg = "gray", modifiers = ["italic"] } # This is a comment.
97'comment.line' = { } # Line comments, like this.
97'comment.line' = { } # Line comments, like this.
98'comment.block' = { } # Block comments, like /* this */ in some languages.
98'comment.block' = { } # Block comments, like /* this */ in some languages.
99'comment.block.documentation' = { } # Doc comments, e.g '///' in rust.
99'comment.block.documentation' = { } # Doc comments, e.g '///' in rust.
100
100
101−'variable' = { fg = "light-orange" } # Variable names.
101+'variable' = { fg = "white" } # Variable names.
102−# 'variable.builtin' = { } # Language reserved variables: `this`, `self`, `super`, etc.
102+'variable.builtin' = { } # Language reserved variables: `this`, `self`, `super`, etc.
103−# 'variable.parameter' = { } # Function parameters.
103+'variable.parameter' = { } # Function parameters.
104−'variable.other.member' = { fg = "orange" } # Fields of composite data types (e.g. structs, unions).
104+'variable.other.member' = { } # Fields of composite data types (e.g. structs, unions).
105+'variable.function' = { } # ?
105
106
106'label' = { fg = "purple" } # Loop labels in rust.
107'label' = { fg = "purple" } # Loop labels in rust.
107
108
@@ -112,17 +113,17 @@
112'keyword' = { fg = "pink", modifiers = ["bold"] } # Language reserved keywords.
113'keyword' = { fg = "pink", modifiers = ["bold"] } # Language reserved keywords.
113'keyword.control' = { fg = "pink", modifiers = ["bold"] } # Control keywords.
114'keyword.control' = { fg = "pink", modifiers = ["bold"] } # Control keywords.
114'keyword.control.conditional' = { fg = "pink", modifiers = ["bold"] } # 'if', 'else', 'elif'.
115'keyword.control.conditional' = { fg = "pink", modifiers = ["bold"] } # 'if', 'else', 'elif'.
115−# 'keyword.control.repeat' = { } # 'for', 'while', 'loop'.
116+'keyword.control.repeat' = { } # 'for', 'while', 'loop'.
116'keyword.control.import' = { fg = "pink", modifiers = ["italic"] } # 'import', 'export' ('use'?).
117'keyword.control.import' = { fg = "pink", modifiers = ["italic"] } # 'import', 'export' ('use'?).
117−# 'keyword.control.return' = { } # 'return' in most languages.
118+'keyword.control.return' = { } # 'return' in most languages.
118'keyword.control.exception' = {fg = "pink", modifiers = ["bold"] } # 'raise' in python.
119'keyword.control.exception' = {fg = "pink", modifiers = ["bold"] } # 'raise' in python.
119−'keyword.operator' = { fg = "pink" } # 'or', 'and', 'in'.
120+'keyword.operator' = { } # 'or', 'and', 'in'.
120'keyword.directive' = { fg = "purple" } # Preprocessor directives (#if in C).
121'keyword.directive' = { fg = "purple" } # Preprocessor directives (#if in C).
121−'keyword.function' = { fg= "red" } # The keyword to define a function: 'def', 'fun', 'fn'.
122+'keyword.function' = { } # The keyword to define a function: 'def', 'fun', 'fn'.
122
123
123'operator' = { fg = "pink", modifiers = ["bold"] } # Logical (&&, ||) and - I assume - Mathematical (+, %) operators
124'operator' = { fg = "pink", modifiers = ["bold"] } # Logical (&&, ||) and - I assume - Mathematical (+, %) operators
124
125
125−'function' = { fg = "mid-blue"}
126+'function' = { fg = "dark-blue"}
126'function.builtin' = { fg = "dark-blue" }
127'function.builtin' = { fg = "dark-blue" }
127'function.method' = { fg = "dark-blue" } # Class / Struct methods.
128'function.method' = { fg = "dark-blue" } # Class / Struct methods.
128'function.macro' = { fg = "purple" } # Like macros in rust.
129'function.macro' = { fg = "purple" } # Like macros in rust.
@@ -180,8 +181,8 @@
180# Version control changes.
181# Version control changes.
181
182
182'diff.plus' = "light-green" # { } # Additions.
183'diff.plus' = "light-green" # { } # Additions.
183−'diff.minus' = "red" # { } # Deletions.
184+'diff.minus' = "yellow" # { } # Deletions.
184−'diff.delta' = "yellow" # { } # Modifications.
185+'diff.delta' = "red" # { } # Modifications.
185# 'diff.delta.moved' = { } # Renamed or moved files / changes.
186# 'diff.delta.moved' = { } # Renamed or moved files / changes.
186
187
187
188
@@ -196,9 +197,8 @@ yellow = "#ffd800"
196purple = "#918cff"
197purple = "#918cff"
197white = "#b1cace"
198white = "#b1cace"
198orange = "#ffa864"
199orange = "#ffa864"
199−light-orange = "#fff2c5"
200gray = "#5b858b" # mainly for comments/background text
200gray = "#5b858b" # mainly for comments/background text
201−light-gray = "#2a3c41" # used when whitespace rendering is enabled and for indent-guides
201+light-gray = "#354e51" # used when whitespace rendering is enabled and for indent-guides
202red = "#e34e1b"
202red = "#e34e1b"
203
203
204dark-blue = "#19a2b7"
204dark-blue = "#19a2b7"
runtime/themes/nord.toml−9
@@ -134,15 +134,6 @@
134"ui.bufferline" = { fg = "nord5", bg = "nord1" }
134"ui.bufferline" = { fg = "nord5", bg = "nord1" }
135"ui.bufferline.active" = { fg = "nord6", bg = "nord2", underline = { color = "nord8", style = "line" }, modifiers = [ "italic" ] }
135"ui.bufferline.active" = { fg = "nord6", bg = "nord2", underline = { color = "nord8", style = "line" }, modifiers = [ "italic" ] }
136
136
137−# Markup
138−"markup.heading" = "nord8"
139−"markup.list" = "nord9"
140−"markup.bold" = { modifiers = ["bold"] }
141−"markup.italic" = { modifiers = ["italic"] }
142−"markup.strikethrough" = { modifiers = ["crossed_out"] }
143−"markup.link.text" = "nord8"
144−"markup.raw" = "nord7"
145−
146[palette]
137[palette]
147# Polar Night is made up of four darker colors that are commonly used for base elements like backgrounds or text color in bright ambiance designs.
138# Polar Night is made up of four darker colors that are commonly used for base elements like backgrounds or text color in bright ambiance designs.
148#
139#
runtime/themes/papercolor-light.toml−3
@@ -26,9 +26,6 @@
26"ui.virtual.whitespace" = { fg = "regular5" }
26"ui.virtual.whitespace" = { fg = "regular5" }
27"ui.virtual.indent-guide" = { fg = "bright0" }
27"ui.virtual.indent-guide" = { fg = "bright0" }
28"ui.virtual.ruler" = { bg = "cursorline_secondary_bg", fg = "regular4" }
28"ui.virtual.ruler" = { bg = "cursorline_secondary_bg", fg = "regular4" }
29−"ui.virtual.inlay-hint" = { fg = "regular5", modifiers = ["italic"] }
30−"ui.virtual.inlay-hint.parameter" = { fg = "regular5", modifiers = ["italic"] }
31−"ui.virtual.inlay-hint.type" = { fg = "regular5", modifiers = ["bold", "italic"] }
32"ui.cursor.match" = { bg = "matchparen_bg", fg = "matchparen_fg" }
29"ui.cursor.match" = { bg = "matchparen_bg", fg = "matchparen_fg" }
33"ui.cursor" = { bg = "regular5", fg = "background" }
30"ui.cursor" = { bg = "regular5", fg = "background" }
34"ui.cursor.primary" = { bg = "foreground", fg = "background" }
31"ui.cursor.primary" = { bg = "foreground", fg = "background" }
runtime/themes/poimandres.tomldeleted−113
@@ -1,113 +0,0 @@
1−# Author: Ambuj Kumar <ambujs89@gmail.com>
2−# Ported from: https://github.com/drcmda/poimandres-theme
3−
4−attribute = { fg = "desaturatedBlue", modifiers = ["italic"] }
5−keyword = "brightMint"
6−"keyword.directive" = "gray"
7−"keyword.storage.type" = "desaturatedBlue"
8−"keyword.storage.modifier" = "lowerMint"
9−"keyword.other" = "brightMint"
10−"keyword.operator" = "desaturatedBlue"
11−namespace = "lightBlue"
12−punctuation = "gray"
13−"punctuation.bracket" = "desaturatedBlue"
14−operator = "desaturatedBlue"
15−special = "desaturatedBlue"
16−variable = "offWhite"
17−"variable.parameter" = { fg = "offWhite" }
18−"variable.builtin" = { fg = "lightBlue", modifiers = ["italic"] }
19−"variable.other" = "offWhite"
20−type = { fg = "gray.c0" }
21−"type.builtin" = { fg = "desaturatedBlue" }
22−constructor = "lightBlue"
23−function = "lightBlue"
24−"function.method" = { fg = "lightBlue" }
25−tag = "brightMint"
26−comment = { fg = "darkerGray.b0", modifiers = ["italic"] }
27−constant = "brightMint"
28−"constant.character.escape" = { fg = "offWhite" }
29−"constant.numeric" = { fg = "brightMint" }
30−"constant.builtin" = { fg = "hotRed" }
31−label = { fg = "gray.c0" }
32−string = { fg = "brightMint" }
33−
34−# Markup
35−"markup.heading" = { fg = "brightMint" }
36−"markup.bold" = { fg = "bluishGrayBrighter", modifiers = ["bold"] }
37−"markup.italic" = { fg = "bluishGrayBrighter", modifiers = ["italic"] }
38−"markup.strikethrough" = { modifiers = ["italic", "crossed_out"] }
39−
40−# UI
41−"markup.link.url" = { fg = "lightBlue", modifiers = ["underlined"] }
42−"markup.link.text" = { fg = "lightBlue", modifiers = ["underlined"] }
43−"markup.raw" = { fg = "lightBlue" }
44−
45−"ui.background" = { bg = "bg" }
46−"ui.background.separator" = { fg = "darkerGray" }
47−"ui.linenr" = "darkerGray.50"
48−"ui.linenr.selected" = "offWhite"
49−"ui.cursor" = { bg = "gray", fg = "bg" }
50−"ui.cursor.match" = { bg = "focus" }
51−"ui.cursorline" = { bg = "#242837" }
52−
53−"ui.popup" = { bg = "#20232d" }
54−"ui.window" = "gray"
55−
56−"ui.text" = "gray"
57−"ui.text.focus" = { fg = "offWhite", bg = "focus", modifiers = ["bold"] }
58−"ui.text.inactive" = "darkerGray"
59−"ui.virtual" = { fg = "darkerGray.b0" }
60−"ui.virtual.indent-guide" = "#303442"
61−
62−"ui.selection" = { bg = "focus" }
63−"ui.selection.primary" = { bg = "selection" }
64−
65−"ui.menu" = { fg = "offWhite", bg = "bg" }
66−"ui.menu.selected" = { fg = "bg", bg = "gray" }
67−"ui.menu.scroll" = { fg = "gray", bg = "bg" }
68−
69−"ui.statusline" = { fg = "offWhite", bg = "selection" }
70−"ui.statusline.inactive" = { fg = "lightBlue", bg = "bg" }
71−"ui.statusline.normal" = { bg = "lightBlue", fg = "bg", modifiers = ["bold"] }
72−"ui.statusline.insert" = { bg = "brightMint", fg = "bg", modifiers = ["bold"] }
73−"ui.statusline.select" = { bg = "hotRed", fg = "bg", modifiers = ["bold"] }
74−
75−"diagnostic.hint" = { underline = { color = "lowerMint", style = "curl" } }
76−"diagnostic.info" = { underline = { color = "lightBlue", style = "curl" } }
77−"diagnostic.warning" = { underline = { color = "brightYellow", style = "curl" } }
78−"diagnostic.error" = { underline = { color = "hotRed", style = "curl" } }
79−
80−hint = "lowerMint"
81−info = "lightBlue"
82−warning = "brightYellow"
83−error = "hotRed"
84−
85−# Version Control
86−"diff.plus" = "lowerMint"
87−"diff.minus" = "hotRed"
88−"diff.delta" = "lightBlue"
89−
90−[palette]
91−brightYellow = "#fffac2"
92−brightMint = "#5DE4c7"
93−lowerMint = "#5fb3a1"
94−blueishGreen = "#42675A"
95−lowerBlue = "#89ddff"
96−lightBlue = "#ADD7FF"
97−desaturatedBlue = "#91B4D5"
98−bluishGrayBrighter = "#7390AA"
99−hotRed = "#d0679d"
100−pink = "#f087bd"
101−gray = "#a6accd"
102−"gray.c0" = "#98a0c2"
103−darkerGray = "#767c9d"
104−"darkerGray.50" = "#404559"
105−"darkerGray.b0" = "#6c7494"
106−bluishGray = "#506477"
107−focus = "#303340"
108−bg = "#1b1e28"
109−offWhite = "#e4f0fb"
110−selection = "#30354a"
111−white = "#ffffff"
112−black = "#000000"
113−transparent = "#00000000"
runtime/themes/poimandres_storm.tomldeleted−19
@@ -1,19 +0,0 @@
1−# Author: Ambuj Kumar <ambujs89@gmail.com>
2−# Ported from: https://github.com/drcmda/poimandres-theme
3−
4−inherits = "poimandres"
5−
6−"ui.cursorline" = { bg = "#303747" }
7−"ui.popup" = { bg = "#2a303c" }
8−"ui.virtual.indent-guide" = "#3a4151"
9−
10−[palette]
11−"gray.c0" = "#98a2c4"
12−darkerGray = "#868cad"
13−"darkerGray.50" = "#4f576d"
14−"darkerGray.b0" = "#818cae"
15−bluishGray = "#607487"
16−focus = "#404350"
17−bg = "#252b37"
18−selection = "#3d455c"
19−black = "#101010"
runtime/themes/rose_pine.toml+28−30
@@ -10,7 +10,7 @@
10"ui.cursor" = { fg = "text", bg = "highlight_high" }
10"ui.cursor" = { fg = "text", bg = "highlight_high" }
11# "ui.cursor.select" = {}
11# "ui.cursor.select" = {}
12"ui.cursor.match" = { fg = "text", bg = "highlight_med" }
12"ui.cursor.match" = { fg = "text", bg = "highlight_med" }
13−"ui.cursor.primary" = { fg = "text", bg = "muted" }
13+"ui.cursor.primary" = { fg = "text", bg = "muted"}
14
14
15# "ui.gutter" = {}
15# "ui.gutter" = {}
16# "ui.gutter.selected" = {}
16# "ui.gutter.selected" = {}
@@ -18,8 +18,6 @@
18"ui.linenr" = { fg = "muted" }
18"ui.linenr" = { fg = "muted" }
19"ui.linenr.selected" = { fg = "text" }
19"ui.linenr.selected" = { fg = "text" }
20
20
21−"ui.bufferline" = { fg = "muted", bg = "base" }
22−"ui.bufferline.active" = { fg = "text", bg = "overlay" }
23"ui.statusline" = { fg = "subtle", bg = "surface" }
21"ui.statusline" = { fg = "subtle", bg = "surface" }
24"ui.statusline.inactive" = { fg = "muted", bg = "surface" }
22"ui.statusline.inactive" = { fg = "muted", bg = "surface" }
25"ui.statusline.normal" = { fg = "rose", bg = "rose_10" }
23"ui.statusline.normal" = { fg = "rose", bg = "rose_10" }
@@ -73,8 +71,8 @@
73"constructor" = "foam"
71"constructor" = "foam"
74
72
75"constant" = "foam"
73"constant" = "foam"
76−"constant.builtin" = "love"
74+"constant.builtin" = "rose"
77−"constant.builtin.boolean" = "rose"
75+# "constant.builtin.boolean" = ""
78"constant.character" = "gold"
76"constant.character" = "gold"
79"constant.character.escape" = "pine"
77"constant.character.escape" = "pine"
80"constant.numeric" = "gold"
78"constant.numeric" = "gold"
@@ -88,7 +86,7 @@
88# "string.special.url" = ""
86# "string.special.url" = ""
89# "string.special.symbol" = ""
87# "string.special.symbol" = ""
90
88
91−"comment" = { fg = "muted", modifiers = ["italic"] }
89+"comment" = { fg = "muted", modifiers = ["italic"]}
92# "comment.line" = ""
90# "comment.line" = ""
93# "comment.block" = ""
91# "comment.block" = ""
94# "comment.block.documentation" = ""
92# "comment.block.documentation" = ""
@@ -97,7 +95,7 @@
97"variable.builtin" = "love"
95"variable.builtin" = "love"
98"variable.parameter" = "iris"
96"variable.parameter" = "iris"
99# "variable.other" = ""
97# "variable.other" = ""
100−"variable.other.member" = "foam"
98+# "variable.other.member" = ""
101
99
102"label" = "foam"
100"label" = "foam"
103
101
@@ -122,7 +120,7 @@
122
120
123"operator" = "subtle"
121"operator" = "subtle"
124
122
125−"function" = "rose" # maybe pine
123+"function" = "rose" # maybe pine
126"function.builtin" = "love"
124"function.builtin" = "love"
127# "function.method" = ""
125# "function.method" = ""
128# "function.macro" = ""
126# "function.macro" = ""
@@ -130,7 +128,7 @@
130
128
131"tag" = "foam"
129"tag" = "foam"
132
130
133−"namespace" = "text"
131+"namespace" = "iris"
134
132
135"markup.heading.marker" = "muted"
133"markup.heading.marker" = "muted"
136"markup.heading" = { fg = "iris", modifiers = ["bold"] }
134"markup.heading" = { fg = "iris", modifiers = ["bold"] }
@@ -149,7 +147,7 @@
149"markup.italic" = { modifiers = ["italic"] }
147"markup.italic" = { modifiers = ["italic"] }
150"markup.strikethrough" = { modifiers = ["crossed_out"] }
148"markup.strikethrough" = { modifiers = ["crossed_out"] }
151"markup.link" = "iris"
149"markup.link" = "iris"
152−"markup.link.url" = { fg = "iris", underline = { color = "iris", style = "line" } }
150+"markup.link.url" = { fg = "iris", underline = { color = "iris", style = "line" } }
153"markup.link.label" = "subtle"
151"markup.link.label" = "subtle"
154"markup.link.text" = "text"
152"markup.link.text" = "text"
155"markup.quote" = "subtle"
153"markup.quote" = "subtle"
@@ -169,24 +167,24 @@
169# "diff.delta.moved" = ""
167# "diff.delta.moved" = ""
170
168
171[palette]
169[palette]
172−base = "#191724"
170+base = "#191724"
173−surface = "#1f1d2e"
171+surface = "#1f1d2e"
174−overlay = "#26233a"
172+overlay = "#26233a"
175−muted = "#6e6a86"
173+muted = "#6e6a86"
176−subtle = "#908caa"
174+subtle = "#908caa"
177−text = "#e0def4"
175+text = "#e0def4"
178−love = "#eb6f92"
176+love = "#eb6f92"
179−love_10 = "#311f30"
177+love_10 = "#311f30"
180−gold = "#f6c177"
178+gold = "#f6c177"
181−gold_10 = "#30282c"
179+gold_10 = "#30282c"
182−rose = "#ebbcba"
180+rose = "#ebbcba"
183−rose_10 = "#2f2834"
181+rose_10 = "#2f2834"
184−pine = "#31748f"
182+pine = "#31748f"
185−pine_10 = "#1a2030"
183+pine_10 = "#1a2030"
186−foam = "#9ccfd8"
184+foam = "#9ccfd8"
187−foam_10 = "#252937"
185+foam_10 = "#252937"
188−iris = "#c4a7e7"
186+iris = "#c4a7e7"
189−iris_10 = "#2b2539"
187+iris_10 = "#2b2539"
190−highlight_low = "#21202e"
188+highlight_low = "#21202e"
191−highlight_med = "#403d52"
189+highlight_med = "#403d52"
192highlight_high = "#524f67"
190highlight_high = "#524f67"
runtime/themes/starlight.tomldeleted−113
@@ -1,113 +0,0 @@
1−# Author : eemilhaa <eemil.haapanen@gmail.com>
2−# Palette from : https://github.com/CosmicToast/starlight
3−
4−# Syntax
5−"function" = "green"
6−"constructor" = "green"
7−
8−"type" = "cyan"
9−"string.special" = "cyan"
10−"string.regexp" = "cyan"
11−"constant" = "cyan"
12−"punctuation.special" = "cyan"
13−
14−"namespace" = "white"
15−"module" = "white"
16−"variable" = "white"
17−
18−"attribute" = "magenta"
19−"variable.parameter" = "magenta"
20−"variable.other.member" = "magenta"
21−"type.parameter" = "magenta"
22−
23−"keyword" = "blue"
24−"variable.builtin" = "blue"
25−"label" = "blue"
26−"tag" = "blue"
27−"operator" = "blue"
28−"special" = "blue"
29−
30−"string" = "yellow"
31−
32−"punctuation" = "punct"
33−
34−"comment" = "dark-fg"
35−
36−# Markup
37−"markup.heading.marker" = { fg = "blue", modifiers = ["bold"] }
38−"markup.heading" = { fg = "white", modifiers = ["bold"] }
39−"markup.list" = "blue"
40−"markup.bold" = { fg = "magenta", modifiers = ["bold"] }
41−"markup.italic" = { fg = "magenta", modifiers = ["italic"] }
42−"markup.strikethrough" = "red"
43−"markup.link" = "cyan"
44−"markup.link.text" = "yellow"
45−"markup.quote" = "magenta"
46−"markup.raw" = "green"
47−
48−# UI
49−"diff.plus" = "green"
50−"diff.minus" = "red"
51−"diff.delta" = "blue"
52−
53−"ui.background" = { fg = "dark-fg", bg = "dark-bg" }
54−"ui.cursor" = { fg = "black", bg = "light-fg" }
55−"ui.cursor.primary" = { fg = "black", bg = "yellow" }
56−"ui.cursor.match" = { fg = "black", bg = "dark-blue", modifiers = ["bold"] }
57−"ui.linenr" = "dark-fg"
58−"ui.linenr.selected" = "yellow"
59−"ui.statusline" = { fg = "light-fg", bg = "light-bg" }
60−"ui.statusline.inactive" = { fg = "dark-fg", bg = "light-bg" }
61−"ui.statusline.insert" = { fg = "black", bg = "green" }
62−"ui.statusline.select" = { fg = "black", bg = "magenta" }
63−"ui.statusline.normal" = { fg = "black", bg = "blue" }
64−"ui.popup" = { fg = "dark-fg", bg = "light-bg" }
65−"ui.window" = { fg = "light-bg", bg = "dark-bg" }
66−"ui.help" = { fg = "light-fg", bg = "light-bg" }
67−"ui.text" = "light-fg"
68−"ui.text.focus" = { fg = "white", bg = "light-bg", modifiers = ["bold"] }
69−"ui.virtual" = "dark-fg"
70−"ui.virtual.ruler" = { bg = "medium-bg" }
71−"ui.virtual.indent-guide" = "indent"
72−"ui.virtual.whitespace" = "indent"
73−"ui.menu" = { fg = "light-fg", bg = "light-bg" }
74−"ui.menu.selected" = { fg = "white", bg = "dark-fg", modifiers = ["bold"] }
75−"ui.selection" = { fg = "light-fg", bg = "dark-fg" }
76−"ui.selection.primary" = { fg = "white", bg = "dark-blue" }
77−"ui.highlight" = { bg = "light-bg" }
78−"ui.cursorline.primary" = { bg = "black" }
79−"ui.cursorcolumn.primary" = { bg = "black" }
80−"ui.bufferline.background" = { bg = "dark-bg" }
81−"ui.bufferline" = { fg = "light-fg", bg = "light-bg" }
82−"ui.bufferline.active" = { fg = "white", bg = "dark-fg" }
83−
84−"diagnostic.error" = { underline = { color = "red", style = "curl" } }
85−"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
86−"diagnostic.info" = { underline = { color = "blue", style = "curl" } }
87−"diagnostic.hint" = { underline = { color = "blue", style = "curl" } }
88−
89−"info" = "blue"
90−"hint" = "blue"
91−"warning" = "yellow"
92−"error" = "red"
93−
94−[palette]
95−# Colors
96−red = "#FF4D51"
97−green = "#35D450"
98−yellow = "#E9E836"
99−blue = "#5DC5F8"
100−dark-blue = "#24ACD4"
101−magenta = "#FEABF2"
102−cyan = "#24DFC4"
103−white = "#ffffff"
104−punct = "#C9C9C9"
105−
106−# Grays
107−black = "#1e1e1e"
108−dark-bg = "#242424"
109−medium-bg = "#2D2D2D"
110−light-bg = "#353535"
111−indent = "#616161"
112−dark-fg = "#929292"
113−light-fg = "#E6E6E6"
runtime/tutor−154
@@ -1186,160 +1186,6 @@ multiple cursors, they won't be uncommented but commented again.
1186
1186
1187
1187
1188
1188
1189−=================================================================
1190−= 12.1 USING MATCH MODE JUMP =
1191−=================================================================
1192−
1193−To switch to match mode from normal mode, type m. This feature
1194−is particularly useful for handling bracket pairs and their
1195−contents.
1196−
1197−There are several actions that can be performed in match mode,
1198−as indicated by the help pop-up. To jump to a matching bracket pair,
1199−simply press mm. For example on the lines below (starting with
1200−-->), move the cursor in normal mode to (, and then press mm to jump
1201−to the matching ). You can do the same on the line below: for example
1202−move to ], and press mm to jump to [ .
1203−
1204−--> you can (jump between matching parenthesis)
1205−--> or between matching [ square brackets ]
1206−--> now { you know the drill: this works with brackets too }
1207−
1208−
1209−
1210−
1211−=================================================================
1212−= 12.2 USING MATCH MODE SELECT INSIDE =
1213−=================================================================
1214−
1215−Match mode also lets you select the "inside" content between a
1216−pair of brackets or other delimiters. In the lines below:
1217−
1218−- move to the --> line, put your cursor in normal mode at any
1219−location between the parenthesis, for example at 'x', and press
1220−mi( or mi) to select the whole content inside the parenthesis
1221−(parenthesis excluded). As usual, you can then do anything you want
1222−with the selection (for example, press c to change it)
1223−
1224−--> outside and (inside x parenthesis) - and outside again
1225−
1226−Test below that you can do the same with [], or {}, or with
1227−nested combinations of these (this will act on the immediately
1228−surrounding matching pair). This also works with "" and similar
1229−
1230−--> test [ with square brackets ] !
1231−--> try ( with nested [ pairs of ( parenthesis) and "brackets" ])
1232−
1233−=================================================================
1234−= 12.3 USING MATCH MODE SELECT AROUND =
1235−=================================================================
1236−
1237−You can also select the "around" content, i.e. both the inside
1238−content and the delimiters themselves, by using the ma select.
1239−For example, move to the line under, move your cursor in normal
1240−mode to any position between the (), and select the content of
1241−the (), including the surrounding (), by typing ma( or ma). As
1242−usual, you can do anything you want with the selection, for
1243−example delete it all with ma(d .
1244−
1245−--> you ( select x around ) to include delimiters in the select
1246−
1247−This naturally works with other delimiters too:
1248−
1249−--> try [ with 'square' brackets ] too!
1250−
1251−
1252−
1253−
1254−
1255−=================================================================
1256−= 12.4 USING MATCH MODE SURROUND =
1257−=================================================================
1258−
1259−The match mode can also be used to add surrounding around the
1260−current selection. For example, move to the line below, then:
1261− * i) select the "select all of this" line segment (for example,
1262−move in normal mode the cursor to the start of select, then enter
1263−selection mode with v , then select the 4 next words with 4e ),
1264− * ii) press ms( or ms) to surround the selection with a pair of
1265−parenthesis.
1266−
1267−--> so, select all of this, and surround it with ()
1268−
1269−You can do the same with other delimiters: for example, ms' on
1270−WORD below to surround it with a pair of ''. You can try also
1271−with adding a surrounding pair of "", or {}, or [].
1272−
1273−--> surround this WORD !
1274−
1275−
1276−
1277−=================================================================
1278−= 12.5 USING MATCH MODE DELETE SURROUND =
1279−=================================================================
1280−
1281−You can delete surrounding pair of delimiters with the md
1282−command. On the line below, move the cursor anywhere
1283−within the pair of (), for example to the 'x', then from there,
1284−in normal mode, press md( or md) to delete the surrounding
1285−pair of parenthesis.
1286−
1287−--> delete (the x pair of parenthesis) from within!
1288−
1289−You can naturally delete other kinds of surroundings:
1290−
1291−--> delete (nested [delimiters]): "this" will delete the nearest
1292−matching surrounding pair.
1293−--> delete "layers "of" quote marks" too: this will delete the
1294−nearest previous and following quote marks
1295−
1296−Trying to delete unexisting surrounding delimiters print an error
1297−at the bottom bar and does nothing.
1298−
1299−=================================================================
1300−= 12.6 USING MATCH MODE REPLACE SURROUND =
1301−=================================================================
1302−
1303−You can replace surrounding pairs of delimiters with the mr
1304−command. On the line below, move the cursor to
1305−anywhere within the pair of (), for example on the 'x', then in
1306−normal mode, press mr([ to replace the pair of () with a pair
1307−of [].
1308−
1309−--> replace the (pair from x within), with something else
1310−
1311−This command will act on the closest enclosing pair, so you
1312−can try replacing different surrounding in the following:
1313−
1314−--> some (nested surroundings [can be replaced])
1315−--> this "works with 'other surroundings' too"
1316−
1317−You can try to replace a non existing pair: this will show
1318−an error warning at the bottom bar and do nothing.
1319−
1320−
1321−=================================================================
1322−= CHAPTER 12 RECAP =
1323−=================================================================
1324−
1325−You can enter the match mode with the m key; this will show the
1326−actions available in a popup. This will allow you to:
1327− * jump to matching pair of delimiters with mm (you must have a
1328− delimiter belonging to a pair under your cursor)
1329− * select inside a pair of delimiters surrounding your cursor
1330− (i.e. select the content but not the delimiters) with mi(
1331− and similar
1332− * select around a pair of delimiters surrounding your cursor
1333− (i.e. select the content and the delimiters) with ma( and
1334− similar
1335− * delete surrounding delimiters with md( and similar
1336− * add surrounding delimiters around the selection with ms(
1337− * replace a pair of delimiters surrounding your selection with
1338− mr([ to replace for example surrounding () with []
1339−
1340−
1341−
1342−
1343=================================================================
1189=================================================================
1344 This tutorial is still a work-in-progress.
1190 This tutorial is still a work-in-progress.
1345 More sections are planned.
1191 More sections are planned.
rust-toolchain.toml+2−2
@@ -1,3 +1,3 @@
1[toolchain]
1[toolchain]
2−channel = "1.70.0"
2+channel = "1.65.0"
3−components = ["rustfmt", "rust-src", "clippy"]
3+components = ["rustfmt", "rust-src"]
xtask/Cargo.toml+6−12
@@ -1,19 +1,13 @@
1[package]
1[package]
2name = "xtask"
2name = "xtask"
3−version.workspace = true
3+version = "0.6.0"
4−authors.workspace = true
5−edition.workspace = true
4+edition = "2021"
6−license.workspace = true
7−rust-version.workspace = true
8−categories.workspace = true
9−repository.workspace = true
10−homepage.workspace = true
11
5
12# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
6# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
13
7
14[dependencies]
8[dependencies]
15−helix-term = { path = "../helix-term" }
9+helix-term = { version = "0.6", path = "../helix-term" }
16−helix-core = { path = "../helix-core" }
10+helix-core = { version = "0.6", path = "../helix-core" }
17−helix-view = { path = "../helix-view" }
11+helix-view = { version = "0.6", path = "../helix-view" }
18−helix-loader = { path = "../helix-loader" }
12+helix-loader = { version = "0.6", path = "../helix-loader" }
19toml = "0.7"
13toml = "0.7"