on 53bb62b help sign in
130 files changed+1196−4588
since splitsnapshots
unifiedsplit
.envrc−1 .github/ISSUE_TEMPLATE/bug_report.yaml−10 .github/workflows/build.yml+3−3 .github/workflows/cachix.yml+2−2 .github/workflows/release.yml+5−5 Cargo.lock+318−321 Cargo.toml−11 README.md+1−1 VERSION+1 book/src/configuration.md+8−25 book/src/generated/lang-support.md+6−12 book/src/generated/typable-cmd.md+1−2 book/src/guides/adding_languages.md−2 book/src/guides/indent.md−9 book/src/install.md+3 book/src/keymap.md+1−1 book/src/languages.md−2 book/src/themes.md+1−5 book/src/usage.md+2−2 docs/releases.md+5−12 flake.lock+35−12 flake.nix+14−12 grammars.nix+21−24 helix-core/Cargo.toml+10−11 helix-core/src/diagnostic.rs−4 helix-core/src/indent.rs+101−310 helix-core/src/syntax.rs+5−21 helix-core/src/transaction.rs+14−73 helix-core/tests/indent.rs+2−2 helix-dap/Cargo.toml+9−11 helix-event/Cargo.toml+7−8 helix-loader/Cargo.toml+10−11 helix-loader/build.rs+4−14 helix-lsp/Cargo.toml+14−15 helix-lsp/src/client.rs+9−83 helix-parsec/Cargo.toml+7−8 helix-term/Cargo.toml+21−25 helix-term/src/application.rs+46−95 helix-term/src/args.rs+1 helix-term/src/commands.rs+32−121 helix-term/src/commands/dap.rs+2−7 helix-term/src/commands/lsp.rs+2−12 helix-term/src/commands/typed.rs+16−97 helix-term/src/main.rs+5−7 helix-term/src/ui/completion.rs+1−17 helix-term/src/ui/document.rs+24−60 helix-term/src/ui/editor.rs+43−76 helix-term/src/ui/lsp.rs+1−3 helix-term/src/ui/menu.rs+13−34 helix-term/src/ui/picker.rs+3−7 helix-term/src/ui/popup.rs+7−27 helix-term/tests/test/commands.rs−46 helix-tui/Cargo.toml+13−13 helix-tui/src/buffer.rs+2−2 helix-vcs/Cargo.toml+11−12 helix-vcs/src/git.rs+4−4 helix-view/Cargo.toml+17−19 helix-view/src/document.rs+20−57 helix-view/src/editor.rs+11−31 helix-view/src/gutter.rs+2−1 helix-view/src/handlers/dap.rs+3−1 helix-view/src/register.rs+10−10 languages.toml+166−117 logo.svg+1−1 runtime/queries/_typescript/highlights.scm+3−5 runtime/queries/_typescript/locals.scm−17 runtime/queries/agda/highlights.scm−124 runtime/queries/c/indents.scm−13 runtime/queries/common-lisp/indents.scm−1 runtime/queries/dbml/highlights.scm−44 runtime/queries/gleam/highlights.scm+5−16 runtime/queries/gn/highlights.scm−42 runtime/queries/gn/injections.scm−15 runtime/queries/gn/locals.scm−16 runtime/queries/go/highlights.scm+4−12 runtime/queries/go/locals.scm+2−10 runtime/queries/haskell/highlights.scm+1−1 runtime/queries/janet/highlights.scm−1 runtime/queries/kdl/highlights.scm+4−4 runtime/queries/kdl/indents.scm−3 runtime/queries/kdl/textobjects.scm−27 runtime/queries/kotlin/highlights.scm+1−4 runtime/queries/kotlin/locals.scm−15 runtime/queries/log/highlights.scm−10 runtime/queries/ocaml/highlights.scm−2 runtime/queries/purescript/highlights.scm+9−48 runtime/queries/python/highlights.scm−6 runtime/queries/racket/indents.scm−1 runtime/queries/rust/highlights.scm−7 runtime/queries/rust/locals.scm+1−14 runtime/queries/scheme/indents.scm−43 runtime/queries/smali/folds.scm−12 runtime/queries/smali/highlights.scm−216 runtime/queries/smali/indents.scm−31 runtime/queries/smali/injections.scm−2 runtime/queries/smali/locals.scm−42 runtime/queries/sql/highlights.scm+4−42 runtime/queries/yuck/highlights.scm+1−1 runtime/themes/README.md−8 runtime/themes/darcula.toml+2−6 runtime/themes/everblush.toml−1 runtime/themes/horizon-dark.toml−80 runtime/themes/licenses/everforest.LICENSE−21 runtime/themes/licenses/modus_vivendi.LICENSE−5 runtime/themes/licenses/modus_vivendi_deuteranopia.LICENSE−5 runtime/themes/licenses/modus_vivendi_tinted.LICENSE−5 runtime/themes/licenses/modus_vivendi_tritanopia.LICENSE−5 runtime/themes/licenses/poimandres.LICENSE−21 runtime/themes/licenses/serika-syntax.LICENSE−21 runtime/themes/licenses/sonokai.LICENSE−21 runtime/themes/licenses/starlight.LICENSE−24 runtime/themes/modus_operandi.toml−194 runtime/themes/modus_operandi_deuteranopia.toml−46 runtime/themes/modus_operandi_tinted.toml−45 runtime/themes/modus_operandi_tritanopia.toml−73 runtime/themes/modus_vivendi.toml−242 runtime/themes/modus_vivendi_deuteranopia.toml−158 runtime/themes/modus_vivendi_tinted.toml−144 runtime/themes/modus_vivendi_tritanopia.toml−186 runtime/themes/naysayer.toml+2−2 runtime/themes/noctis.toml+25−25 runtime/themes/nord.toml−9 runtime/themes/papercolor-light.toml−4 runtime/themes/poimandres.toml−113 runtime/themes/poimandres_storm.toml−19 runtime/themes/rose_pine.toml+28−30 runtime/themes/starlight.toml−113 runtime/tutor−154 rust-toolchain.toml+2−2 xtask/Cargo.toml+6−12
.envrc−1
@@ -1,6 +1,5 @@
11watch_file shell.nix
22watch_file flake.lock
3−watch_file rust-toolchain.toml
43
54# try to use flakes, if it fails use normal nix (ie. shell.nix)
65use flake || use nix
.github/ISSUE_TEMPLATE/bug_report.yaml−10
@@ -55,16 +55,6 @@ body:
5555 placeholder: wezterm 20220101-133340-7edc5b5a
5656 validations:
5757 required: true
58− - type: input
59− id: installation-method
60− attributes:
61− label: Installation Method
62− description: >
63− How you installed Helix - from a package manager like Homebrew or the
64− AUR, built from source, downloaded a binary from the releases page, etc.
65− placeholder: "source / brew / nixpkgs / flake / releases page"
66− validations:
67− required: true
6858 - type: input
6959 id: helix-version
7060 attributes:
.github/workflows/build.yml+3−3
@@ -39,7 +39,7 @@ jobs:
3939 uses: actions/checkout@v4
4040
4141 - name: Install stable toolchain
42− uses: dtolnay/rust-toolchain@1.70
42+ uses: dtolnay/rust-toolchain@1.65
4343
4444 - uses: Swatinem/rust-cache@v2
4545 with:
@@ -70,7 +70,7 @@ jobs:
7070 uses: actions/checkout@v4
7171
7272 - name: Install stable toolchain
73− uses: dtolnay/rust-toolchain@1.70
73+ uses: dtolnay/rust-toolchain@1.65
7474 with:
7575 components: rustfmt, clippy
7676
@@ -97,7 +97,7 @@ jobs:
9797 uses: actions/checkout@v4
9898
9999 - name: Install stable toolchain
100− uses: dtolnay/rust-toolchain@1.70
100+ uses: dtolnay/rust-toolchain@1.65
101101
102102 - uses: Swatinem/rust-cache@v2
103103 with:
.github/workflows/cachix.yml+2−2
@@ -14,10 +14,10 @@ jobs:
1414 uses: actions/checkout@v4
1515
1616 - name: Install nix
17− uses: cachix/install-nix-action@v24
17+ uses: cachix/install-nix-action@v23
1818
1919 - name: Authenticate with Cachix
20− uses: cachix/cachix-action@v13
20+ uses: cachix/cachix-action@v12
2121 with:
2222 name: helix
2323 authToken: ${{ secrets.CACHIX_AUTH_TOKEN }}
.github/workflows/release.yml+5−5
@@ -36,7 +36,7 @@ jobs:
3636 - name: Bundle grammars
3737 run: tar cJf grammars.tar.xz -C runtime/grammars/sources .
3838
39− - uses: actions/upload-artifact@v4
39+ - uses: actions/upload-artifact@v3
4040 with:
4141 name: grammars
4242 path: grammars.tar.xz
@@ -106,7 +106,7 @@ jobs:
106106 uses: actions/checkout@v4
107107
108108 - name: Download grammars
109− uses: actions/download-artifact@v4
109+ uses: actions/download-artifact@v3
110110
111111 - name: Move grammars under runtime
112112 if: "!startsWith(matrix.os, 'windows')"
@@ -220,7 +220,7 @@ jobs:
220220 fi
221221 cp -r runtime dist
222222
223− - uses: actions/upload-artifact@v4
223+ - uses: actions/upload-artifact@v3
224224 with:
225225 name: bins-${{ matrix.build }}
226226 path: dist
@@ -233,7 +233,7 @@ jobs:
233233 - name: Checkout sources
234234 uses: actions/checkout@v4
235235
236− - uses: actions/download-artifact@v4
236+ - uses: actions/download-artifact@v3
237237
238238 - name: Build archive
239239 shell: bash
@@ -288,7 +288,7 @@ jobs:
288288 overwrite: true
289289
290290 - name: Upload binaries as artifact
291− uses: actions/upload-artifact@v4
291+ uses: actions/upload-artifact@v3
292292 if: env.preview == 'true'
293293 with:
294294 name: release
Cargo.lock+318−321
@@ -32,9 +32,18 @@ dependencies = [
3232
3333[[package]]
3434name = "aho-corasick"
35−version = "1.1.2"
35+version = "0.7.20"
3636source = "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"
3847dependencies = [
3948 "memchr",
4049]
@@ -62,9 +71,9 @@ dependencies = [
6271
6372[[package]]
6473name = "anyhow"
65−version = "1.0.76"
74+version = "1.0.75"
6675source = "registry+https://github.com/rust-lang/crates.io-index"
67−checksum = "59d2a3357dde987206219e78ecfbbb6e8dad06cbb65292758d3270e6254f7355"
76+checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
6877
6978[[package]]
7079name = "arc-swap"
@@ -107,12 +116,12 @@ checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
107116
108117[[package]]
109118name = "bstr"
110−version = "1.8.0"
119+version = "1.6.0"
111120source = "registry+https://github.com/rust-lang/crates.io-index"
112−checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c"
121+checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05"
113122dependencies = [
114123 "memchr",
115− "regex-automata",
124+ "regex-automata 0.3.9",
116125 "serde",
117126]
118127
@@ -131,6 +140,12 @@ version = "3.12.0"
131140source = "registry+https://github.com/rust-lang/crates.io-index"
132141checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
133142
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+
134149[[package]]
135150name = "bytes"
136151version = "1.4.0"
@@ -145,9 +160,9 @@ checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
145160
146161[[package]]
147162name = "cc"
148−version = "1.0.84"
163+version = "1.0.83"
149164source = "registry+https://github.com/rust-lang/crates.io-index"
150−checksum = "0f8e7c90afad890484a21653d08b6e209ae34770fb5ee298f9c699fcc1e5c856"
165+checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
151166dependencies = [
152167 "libc",
153168]
@@ -183,11 +198,13 @@ dependencies = [
183198
184199[[package]]
185200name = "clipboard-win"
186−version = "5.0.0"
201+version = "4.5.0"
187202source = "registry+https://github.com/rust-lang/crates.io-index"
188−checksum = "c57002a5d9be777c1ef967e33674dac9ebd310d8893e4e3437b14d5f0f6372cc"
203+checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362"
189204dependencies = [
190205 "error-code",
206+ "str-buf",
207+ "winapi",
191208]
192209
193210[[package]]
@@ -350,6 +367,27 @@ dependencies = [
350367 "syn 2.0.38",
351368]
352369
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+
353391[[package]]
354392name = "dunce"
355393version = "1.0.4"
@@ -388,19 +426,34 @@ checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1"
388426
389427[[package]]
390428name = "errno"
391−version = "0.3.8"
429+version = "0.3.1"
392430source = "registry+https://github.com/rust-lang/crates.io-index"
393−checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
431+checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
394432dependencies = [
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",
395445 "libc",
396− "windows-sys 0.52.0",
397446]
398447
399448[[package]]
400449name = "error-code"
401−version = "3.0.0"
450+version = "2.3.1"
402451source = "registry+https://github.com/rust-lang/crates.io-index"
403−checksum = "281e452d3bad4005426416cdba5ccfd4f5c1280e10099e21db27f7c1c28347fc"
452+checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21"
453+dependencies = [
454+ "libc",
455+ "str-buf",
456+]
404457
405458[[package]]
406459name = "etcetera"
@@ -415,9 +468,9 @@ dependencies = [
415468
416469[[package]]
417470name = "faster-hex"
418−version = "0.9.0"
471+version = "0.8.1"
419472source = "registry+https://github.com/rust-lang/crates.io-index"
420−checksum = "a2a2b11eda1d40935b26cf18f6833c526845ae8c41e58d09af6adeb6f0269183"
473+checksum = "239f7bfb930f820ab16a9cd95afc26f88264cf6905c960b340a615384aa3338a"
421474dependencies = [
422475 "serde",
423476]
@@ -458,26 +511,32 @@ dependencies = [
458511 "miniz_oxide",
459512]
460513
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+
461520[[package]]
462521name = "form_urlencoded"
463−version = "1.2.1"
522+version = "1.2.0"
464523source = "registry+https://github.com/rust-lang/crates.io-index"
465−checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
524+checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
466525dependencies = [
467526 "percent-encoding",
468527]
469528
470529[[package]]
471530name = "futures-core"
472−version = "0.3.30"
531+version = "0.3.29"
473532source = "registry+https://github.com/rust-lang/crates.io-index"
474−checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
533+checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c"
475534
476535[[package]]
477536name = "futures-executor"
478−version = "0.3.29"
537+version = "0.3.28"
479538source = "registry+https://github.com/rust-lang/crates.io-index"
480−checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc"
539+checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
481540dependencies = [
482541 "futures-core",
483542 "futures-task",
@@ -486,15 +545,15 @@ dependencies = [
486545
487546[[package]]
488547name = "futures-task"
489−version = "0.3.30"
548+version = "0.3.29"
490549source = "registry+https://github.com/rust-lang/crates.io-index"
491−checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
550+checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2"
492551
493552[[package]]
494553name = "futures-util"
495−version = "0.3.30"
554+version = "0.3.29"
496555source = "registry+https://github.com/rust-lang/crates.io-index"
497−checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
556+checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104"
498557dependencies = [
499558 "futures-core",
500559 "futures-task",
@@ -522,9 +581,9 @@ checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
522581
523582[[package]]
524583name = "gix"
525−version = "0.57.0"
584+version = "0.55.2"
526585source = "registry+https://github.com/rust-lang/crates.io-index"
527−checksum = "721c7497ab24b665ed5a1eb2b3526936aa60068e61ba260651f7e77c52feec69"
586+checksum = "002667cd1ebb789313d0d0afe3d23b2821cf3b0e91605095f0e6d8751f0ceeea"
528587dependencies = [
529588 "gix-actor",
530589 "gix-commitgraph",
@@ -563,46 +622,46 @@ dependencies = [
563622
564623[[package]]
565624name = "gix-actor"
566−version = "0.29.0"
625+version = "0.28.0"
567626source = "registry+https://github.com/rust-lang/crates.io-index"
568−checksum = "886014c4865b93ce268f1d3eddd4fd3261242c3f3ee61eb36009f913016a9059"
627+checksum = "948a5f9e43559d16faf583694f1c742eb401ce24ce8e6f2238caedea7486433c"
569628dependencies = [
570629 "bstr",
571630 "btoi",
572631 "gix-date",
573632 "itoa",
574633 "thiserror",
575− "winnow 0.5.28",
634+ "winnow 0.5.17",
576635]
577636
578637[[package]]
579638name = "gix-chunk"
580−version = "0.4.6"
639+version = "0.4.4"
581640source = "registry+https://github.com/rust-lang/crates.io-index"
582−checksum = "2ade37ef69870de0ed966b97c57a3a947a22ff3482a52c3b99b205f77bcb08fb"
641+checksum = "5b42ea64420f7994000130328f3c7a2038f639120518870436d31b8bde704493"
583642dependencies = [
584643 "thiserror",
585644]
586645
587646[[package]]
588647name = "gix-commitgraph"
589−version = "0.23.0"
648+version = "0.22.0"
590649source = "registry+https://github.com/rust-lang/crates.io-index"
591−checksum = "e7559ea9cefee188cd88b05afcc8e3ef7a3cb4a5c647bccf06b981e591b02b77"
650+checksum = "7e8bc78b1a6328fa6d8b3a53b6c73997af37fd6bfc1d6c49f149e63bda5cbb36"
592651dependencies = [
593652 "bstr",
594653 "gix-chunk",
595654 "gix-features",
596655 "gix-hash",
597− "memmap2",
656+ "memmap2 0.7.1",
598657 "thiserror",
599658]
600659
601660[[package]]
602661name = "gix-config"
603−version = "0.33.0"
662+version = "0.31.0"
604663source = "registry+https://github.com/rust-lang/crates.io-index"
605−checksum = "9c35dc7f9c00a42bbc9cfa1ca2ec0a78ad1b76ff0736d3d35dfd612962244467"
664+checksum = "5cae98c6b4c66c09379bc35274b172587d6b0ac369a416c39128ad8c6454f9bb"
606665dependencies = [
607666 "bstr",
608667 "gix-config-value",
@@ -616,14 +675,14 @@ dependencies = [
616675 "smallvec",
617676 "thiserror",
618677 "unicode-bom",
619− "winnow 0.5.28",
678+ "winnow 0.5.17",
620679]
621680
622681[[package]]
623682name = "gix-config-value"
624−version = "0.14.2"
683+version = "0.14.0"
625684source = "registry+https://github.com/rust-lang/crates.io-index"
626−checksum = "39f388cb2396aee82d6f460a2e7770659bdf8854e9e5478f7d2b1324a9698284"
685+checksum = "ea7505b97f4d8e7933e29735a568ba2f86d8de466669d9f0e8321384f9972f47"
627686dependencies = [
628687 "bitflags 2.4.1",
629688 "bstr",
@@ -634,9 +693,9 @@ dependencies = [
634693
635694[[package]]
636695name = "gix-date"
637−version = "0.8.2"
696+version = "0.8.0"
638697source = "registry+https://github.com/rust-lang/crates.io-index"
639−checksum = "9d85f4a01e0d05c3de585e28bae514d4baf01655e3fc3f14ce6f30bf62405345"
698+checksum = "fc7df669639582dc7c02737642f76890b03b5544e141caba68a7d6b4eb551e0d"
640699dependencies = [
641700 "bstr",
642701 "itoa",
@@ -646,11 +705,10 @@ dependencies = [
646705
647706[[package]]
648707name = "gix-diff"
649−version = "0.39.0"
708+version = "0.37.0"
650709source = "registry+https://github.com/rust-lang/crates.io-index"
651−checksum = "ac0e75f5afd2f6c47c800b6b0a000a08045739d0450d20482e8faa42543f62d1"
710+checksum = "931394f69fb8c9ed6afc0aae3487bd869e936339bcc13ed8884472af072e0554"
652711dependencies = [
653− "bstr",
654712 "gix-hash",
655713 "gix-object",
656714 "thiserror",
@@ -658,9 +716,9 @@ dependencies = [
658716
659717[[package]]
660718name = "gix-discover"
661−version = "0.28.0"
719+version = "0.26.0"
662720source = "registry+https://github.com/rust-lang/crates.io-index"
663−checksum = "f0b63ce2ad81632ac1a84ac370f85a5e580c3261580bd85ea17ff35d3a0bba18"
721+checksum = "a45d5cf0321178883e38705ab2b098f625d609a7d4c391b33ac952eff2c490f2"
664722dependencies = [
665723 "bstr",
666724 "dunce",
@@ -673,9 +731,9 @@ dependencies = [
673731
674732[[package]]
675733name = "gix-features"
676−version = "0.37.0"
734+version = "0.36.0"
677735source = "registry+https://github.com/rust-lang/crates.io-index"
678−checksum = "befe7edea299a824504b5acc96d7a3a538125b38c42f3a8379f6912a29c90c81"
736+checksum = "51f4365ba17c4f218d7fd9ec102b8d2d3cb0ca200a835e81151ace7778aec827"
679737dependencies = [
680738 "crc32fast",
681739 "flate2",
@@ -691,18 +749,18 @@ dependencies = [
691749
692750[[package]]
693751name = "gix-fs"
694−version = "0.9.0"
752+version = "0.8.0"
695753source = "registry+https://github.com/rust-lang/crates.io-index"
696−checksum = "007017ce93b819ea52c0ec68306f7d72212a2d307c3d70f1548c7141c015d0a1"
754+checksum = "8cd171c0cae97cd0dc57e7b4601cb1ebf596450e263ef3c02be9107272c877bd"
697755dependencies = [
698756 "gix-features",
699757]
700758
701759[[package]]
702760name = "gix-glob"
703−version = "0.15.0"
761+version = "0.14.0"
704762source = "registry+https://github.com/rust-lang/crates.io-index"
705−checksum = "61fb116c2516d3a1170e010118f639944a6389872c875a008960cdab2a44ac72"
763+checksum = "8fac08925dbc14d414bd02eb45ffb4cecd912d1fce3883f867bd0103c192d3e4"
706764dependencies = [
707765 "bitflags 2.4.1",
708766 "bstr",
@@ -712,9 +770,9 @@ dependencies = [
712770
713771[[package]]
714772name = "gix-hash"
715−version = "0.14.0"
773+version = "0.13.1"
716774source = "registry+https://github.com/rust-lang/crates.io-index"
717−checksum = "c52c3170a17b6031833cd2eb4ad7bc23f2755d06e6e70f78dec21d42e8fe1b30"
775+checksum = "1884c7b41ea0875217c1be9ce91322f90bde433e91d374d0e1276073a51ccc60"
718776dependencies = [
719777 "faster-hex",
720778 "thiserror",
@@ -722,20 +780,20 @@ dependencies = [
722780
723781[[package]]
724782name = "gix-hashtable"
725−version = "0.5.0"
783+version = "0.4.0"
726784source = "registry+https://github.com/rust-lang/crates.io-index"
727−checksum = "40a838e6366a5e5b84668b6997ce0981b833136468e8ba949f424c0ef2927eba"
785+checksum = "409268480841ad008e81c17ca5a293393fbf9f2b6c2f85b8ab9de1f0c5176a16"
728786dependencies = [
729787 "gix-hash",
730− "hashbrown 0.14.3",
788+ "hashbrown 0.14.2",
731789 "parking_lot",
732790]
733791
734792[[package]]
735793name = "gix-lock"
736−version = "12.0.0"
794+version = "11.0.0"
737795source = "registry+https://github.com/rust-lang/crates.io-index"
738−checksum = "6cf112ddee94223c119a8534dad027740dc3aba3365ac5edeef8a7f6660c74db"
796+checksum = "f4feb1dcd304fe384ddc22edba9dd56a42b0800032de6537728cea2f033a4f37"
739797dependencies = [
740798 "gix-tempfile",
741799 "gix-utils",
@@ -744,9 +802,9 @@ dependencies = [
744802
745803[[package]]
746804name = "gix-macros"
747−version = "0.1.2"
805+version = "0.1.0"
748806source = "registry+https://github.com/rust-lang/crates.io-index"
749−checksum = "fc207b64189cf71bcb17fc841ab99a5d63d0845546b611e2703ce467f659323a"
807+checksum = "9d8acb5ee668d55f0f2d19a320a3f9ef67a6999ad483e11135abcc2464ed18b6"
750808dependencies = [
751809 "proc-macro2",
752810 "quote",
@@ -755,9 +813,9 @@ dependencies = [
755813
756814[[package]]
757815name = "gix-object"
758−version = "0.40.0"
816+version = "0.38.0"
759817source = "registry+https://github.com/rust-lang/crates.io-index"
760−checksum = "e4c77e47ffba92127faf632a841fce23d19547e269bd8b88e68961a70eab4e93"
818+checksum = "740f2a44267f58770a1cb3a3d01d14e67b089c7136c48d4bddbb3cfd2bf86a51"
761819dependencies = [
762820 "bstr",
763821 "btoi",
@@ -769,14 +827,14 @@ dependencies = [
769827 "itoa",
770828 "smallvec",
771829 "thiserror",
772− "winnow 0.5.28",
830+ "winnow 0.5.17",
773831]
774832
775833[[package]]
776834name = "gix-odb"
777−version = "0.56.0"
835+version = "0.54.0"
778836source = "registry+https://github.com/rust-lang/crates.io-index"
779−checksum = "a3254f2005cc7553ea78e85e816a09150c6f7a64e6b7627b8d1fdc56721bea73"
837+checksum = "8630b56cb80d8fa684d383dad006a66401ee8314e12fbf0e566ddad8c115143b"
780838dependencies = [
781839 "arc-swap",
782840 "gix-date",
@@ -793,9 +851,9 @@ dependencies = [
793851
794852[[package]]
795853name = "gix-pack"
796−version = "0.46.0"
854+version = "0.44.0"
797855source = "registry+https://github.com/rust-lang/crates.io-index"
798−checksum = "02ebc8cd657eec207d82d8f876ca402361308ecd3c87a47935b0299506257b4f"
856+checksum = "1431ba2e30deff1405920693d54ab231c88d7c240dd6ccc936ee223d8f8697c3"
799857dependencies = [
800858 "clru",
801859 "gix-chunk",
@@ -805,7 +863,7 @@ dependencies = [
805863 "gix-object",
806864 "gix-path",
807865 "gix-tempfile",
808− "memmap2",
866+ "memmap2 0.7.1",
809867 "parking_lot",
810868 "smallvec",
811869 "thiserror",
@@ -813,9 +871,9 @@ dependencies = [
813871
814872[[package]]
815873name = "gix-path"
816−version = "0.10.2"
874+version = "0.10.0"
817875source = "registry+https://github.com/rust-lang/crates.io-index"
818−checksum = "10931652a3da126990ac93bce1b1c600cc99d7c268d712b6360ed52174ce1b68"
876+checksum = "6a1d370115171e3ae03c5c6d4f7d096f2981a40ddccb98dfd704c773530ba73b"
819877dependencies = [
820878 "bstr",
821879 "gix-trace",
@@ -826,9 +884,9 @@ dependencies = [
826884
827885[[package]]
828886name = "gix-quote"
829−version = "0.4.9"
887+version = "0.4.7"
830888source = "registry+https://github.com/rust-lang/crates.io-index"
831−checksum = "6c43530cb94a7759807e6f8d180e17ac9c65673b891645c6c433831dc0cf4342"
889+checksum = "475c86a97dd0127ba4465fbb239abac9ea10e68301470c9791a6dd5351cdc905"
832890dependencies = [
833891 "bstr",
834892 "btoi",
@@ -837,9 +895,9 @@ dependencies = [
837895
838896[[package]]
839897name = "gix-ref"
840−version = "0.40.0"
898+version = "0.38.0"
841899source = "registry+https://github.com/rust-lang/crates.io-index"
842−checksum = "baa951b3b850d6d1be4f900768e49af20b76bf9505beac22af723d57249a2f1d"
900+checksum = "0ec2f6d07ac88d2fb8007ee3fa3e801856fb9d82e7366ec0ca332eb2c9d74a52"
843901dependencies = [
844902 "gix-actor",
845903 "gix-date",
@@ -851,16 +909,16 @@ dependencies = [
851909 "gix-path",
852910 "gix-tempfile",
853911 "gix-validate",
854− "memmap2",
912+ "memmap2 0.7.1",
855913 "thiserror",
856− "winnow 0.5.28",
914+ "winnow 0.5.17",
857915]
858916
859917[[package]]
860918name = "gix-refspec"
861−version = "0.21.0"
919+version = "0.19.0"
862920source = "registry+https://github.com/rust-lang/crates.io-index"
863−checksum = "88c61f849d58c06e3068a0b601cf10127d2a07cdad00a725ed66cf303f76f6b3"
921+checksum = "ccb0974cc41dbdb43a180c7f67aa481e1c1e160fcfa8f4a55291fd1126c1a6e7"
864922dependencies = [
865923 "bstr",
866924 "gix-hash",
@@ -872,9 +930,9 @@ dependencies = [
872930
873931[[package]]
874932name = "gix-revision"
875−version = "0.25.0"
933+version = "0.23.0"
876934source = "registry+https://github.com/rust-lang/crates.io-index"
877−checksum = "bcbbf91f4200c5c76802ef5f057b96f5a336827508881fe55a780be71a794d22"
935+checksum = "2ca97ac73459a7f3766aa4a5638a6e37d56d4c7962bc1986fbaf4883d0772588"
878936dependencies = [
879937 "bstr",
880938 "gix-date",
@@ -888,9 +946,9 @@ dependencies = [
888946
889947[[package]]
890948name = "gix-revwalk"
891−version = "0.11.0"
949+version = "0.9.0"
892950source = "registry+https://github.com/rust-lang/crates.io-index"
893−checksum = "33ab66354d83f70f2730391747d0c75f94ef3c3dd40ebde2e206db9faaf7a0a7"
951+checksum = "a16d8c892e4cd676d86f0265bf9d40cefd73d8d94f86b213b8b77d50e77efae0"
894952dependencies = [
895953 "gix-commitgraph",
896954 "gix-date",
@@ -903,21 +961,21 @@ dependencies = [
903961
904962[[package]]
905963name = "gix-sec"
906−version = "0.10.2"
964+version = "0.10.0"
907965source = "registry+https://github.com/rust-lang/crates.io-index"
908−checksum = "a9963f38a42144253ed4d571882d7db5ef644c12e6726e4b75135597cc9d0e1a"
966+checksum = "92b9542ac025a8c02ed5d17b3fc031a111a384e859d0be3532ec4d58c40a0f28"
909967dependencies = [
910968 "bitflags 2.4.1",
911969 "gix-path",
912970 "libc",
913− "windows 0.52.0",
971+ "windows",
914972]
915973
916974[[package]]
917975name = "gix-tempfile"
918−version = "12.0.0"
976+version = "11.0.0"
919977source = "registry+https://github.com/rust-lang/crates.io-index"
920−checksum = "e76a494bd530e1a1309188ff971825a24f159c76c2db0bf71fa5dfb469a2c915"
978+checksum = "05cc2205cf10d99f70b96e04e16c55d4c7cf33efc151df1f793e29fd12a931f8"
921979dependencies = [
922980 "gix-fs",
923981 "libc",
@@ -928,15 +986,15 @@ dependencies = [
928986
929987[[package]]
930988name = "gix-trace"
931−version = "0.1.5"
989+version = "0.1.3"
932990source = "registry+https://github.com/rust-lang/crates.io-index"
933−checksum = "bda62acb44dd86a40c7c3762a5403cfc1ac789ea559df54085cedf79864f809e"
991+checksum = "96b6d623a1152c3facb79067d6e2ecdae48130030cf27d6eb21109f13bd7b836"
934992
935993[[package]]
936994name = "gix-traverse"
937−version = "0.36.0"
995+version = "0.34.0"
938996source = "registry+https://github.com/rust-lang/crates.io-index"
939−checksum = "8661fab39985c9214e56d81a63ceb5886ac948cec2fba76c39494d1e0e307ea8"
997+checksum = "14d050ec7d4e1bb76abf0636cf4104fb915b70e54e3ced9a4427c999100ff38a"
940998dependencies = [
941999 "gix-commitgraph",
9421000 "gix-date",
@@ -950,9 +1008,9 @@ dependencies = [
9501008
9511009[[package]]
9521010name = "gix-url"
953−version = "0.26.0"
1011+version = "0.25.1"
9541012source = "registry+https://github.com/rust-lang/crates.io-index"
955−checksum = "10a0129c1e8b52736d7c5128300a4485dbc85863001371e2771ac1754bd89fd7"
1013+checksum = "b1b9ac8ed32ad45f9fc6c5f8c0be2ed911e544a5a19afd62d95d524ebaa95671"
9561014dependencies = [
9571015 "bstr",
9581016 "gix-features",
@@ -964,18 +1022,18 @@ dependencies = [
9641022
9651023[[package]]
9661024name = "gix-utils"
967−version = "0.1.7"
1025+version = "0.1.5"
9681026source = "registry+https://github.com/rust-lang/crates.io-index"
969−checksum = "ab9277a5e32e85d53f738096d872a4a9b76067ad471894ad31bd99c8fa2da1dc"
1027+checksum = "b85d89dc728613e26e0ed952a19583744e7f5240fcd4aa30d6c824ffd8b52f0f"
9701028dependencies = [
9711029 "fastrand",
9721030]
9731031
9741032[[package]]
9751033name = "gix-validate"
976−version = "0.8.2"
1034+version = "0.8.0"
9771035source = "registry+https://github.com/rust-lang/crates.io-index"
978−checksum = "f805ebbdbaa4bfd98e2ee43e6d14099b8a4d9141f5d7b8202fea4d48e44263e7"
1036+checksum = "e05cab2b03a45b866156e052aa38619f4ece4adcb2f79978bfc249bc3b21b8c5"
9791037dependencies = [
9801038 "bstr",
9811039 "thiserror",
@@ -983,52 +1041,54 @@ dependencies = [
9831041
9841042[[package]]
9851043name = "globset"
986−version = "0.4.14"
1044+version = "0.4.13"
9871045source = "registry+https://github.com/rust-lang/crates.io-index"
988−checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
1046+checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d"
9891047dependencies = [
990− "aho-corasick",
1048+ "aho-corasick 1.0.2",
9911049 "bstr",
1050+ "fnv",
9921051 "log",
993− "regex-automata",
994− "regex-syntax",
1052+ "regex",
9951053]
9961054
9971055[[package]]
9981056name = "grep-matcher"
999−version = "0.1.7"
1057+version = "0.1.6"
10001058source = "registry+https://github.com/rust-lang/crates.io-index"
1001−checksum = "47a3141a10a43acfedc7c98a60a834d7ba00dfe7bec9071cbfc19b55b292ac02"
1059+checksum = "3902ca28f26945fe35cad349d776f163981d777fee382ccd6ef451126f51b319"
10021060dependencies = [
10031061 "memchr",
10041062]
10051063
10061064[[package]]
10071065name = "grep-regex"
1008−version = "0.1.12"
1066+version = "0.1.11"
10091067source = "registry+https://github.com/rust-lang/crates.io-index"
1010−checksum = "f748bb135ca835da5cbc67ca0e6955f968db9c5df74ca4f56b18e1ddbc68230d"
1068+checksum = "997598b41d53a37a2e3fc5300d5c11d825368c054420a9c65125b8fe1078463f"
10111069dependencies = [
1070+ "aho-corasick 0.7.20",
10121071 "bstr",
10131072 "grep-matcher",
10141073 "log",
1015− "regex-automata",
1016− "regex-syntax",
1074+ "regex",
1075+ "regex-syntax 0.6.29",
1076+ "thread_local",
10171077]
10181078
10191079[[package]]
10201080name = "grep-searcher"
1021−version = "0.1.13"
1081+version = "0.1.11"
10221082source = "registry+https://github.com/rust-lang/crates.io-index"
1023−checksum = "ba536ae4f69bec62d8839584dd3153d3028ef31bb229f04e09fb5a9e5a193c54"
1083+checksum = "5601c4b9f480f0c9ebb40b1f6cbf447b8a50c5369223937a6c5214368c58779f"
10241084dependencies = [
10251085 "bstr",
1086+ "bytecount",
10261087 "encoding_rs",
10271088 "encoding_rs_io",
10281089 "grep-matcher",
10291090 "log",
1030− "memchr",
1031− "memmap2",
1091+ "memmap2 0.5.10",
10321092]
10331093
10341094[[package]]
@@ -1039,9 +1099,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
10391099
10401100[[package]]
10411101name = "hashbrown"
1042−version = "0.14.3"
1102+version = "0.14.2"
10431103source = "registry+https://github.com/rust-lang/crates.io-index"
1044−checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
1104+checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156"
10451105dependencies = [
10461106 "ahash",
10471107 "allocator-api2",
@@ -1049,7 +1109,7 @@ dependencies = [
10491109
10501110[[package]]
10511111name = "helix-core"
1052−version = "23.10.0"
1112+version = "0.6.0"
10531113dependencies = [
10541114 "ahash",
10551115 "arc-swap",
@@ -1058,7 +1118,7 @@ dependencies = [
10581118 "dunce",
10591119 "encoding_rs",
10601120 "etcetera",
1061− "hashbrown 0.14.3",
1121+ "hashbrown 0.14.2",
10621122 "helix-loader",
10631123 "imara-diff",
10641124 "indoc",
@@ -1084,7 +1144,7 @@ dependencies = [
10841144
10851145[[package]]
10861146name = "helix-dap"
1087−version = "23.10.0"
1147+version = "0.6.0"
10881148dependencies = [
10891149 "anyhow",
10901150 "fern",
@@ -1099,7 +1159,7 @@ dependencies = [
10991159
11001160[[package]]
11011161name = "helix-event"
1102−version = "23.10.0"
1162+version = "0.6.0"
11031163dependencies = [
11041164 "parking_lot",
11051165 "tokio",
@@ -1107,7 +1167,7 @@ dependencies = [
11071167
11081168[[package]]
11091169name = "helix-loader"
1110−version = "23.10.0"
1170+version = "0.6.0"
11111171dependencies = [
11121172 "anyhow",
11131173 "cc",
@@ -1126,7 +1186,7 @@ dependencies = [
11261186
11271187[[package]]
11281188name = "helix-lsp"
1129−version = "23.10.0"
1189+version = "0.6.0"
11301190dependencies = [
11311191 "anyhow",
11321192 "futures-executor",
@@ -1148,11 +1208,11 @@ dependencies = [
11481208
11491209[[package]]
11501210name = "helix-parsec"
1151−version = "23.10.0"
1211+version = "0.6.0"
11521212
11531213[[package]]
11541214name = "helix-term"
1155−version = "23.10.0"
1215+version = "0.6.0"
11561216dependencies = [
11571217 "anyhow",
11581218 "arc-swap",
@@ -1177,7 +1237,6 @@ dependencies = [
11771237 "log",
11781238 "nucleo",
11791239 "once_cell",
1180− "open",
11811240 "pulldown-cmark",
11821241 "serde",
11831242 "serde_json",
@@ -1188,13 +1247,12 @@ dependencies = [
11881247 "tokio",
11891248 "tokio-stream",
11901249 "toml",
1191− "url",
11921250 "which",
11931251]
11941252
11951253[[package]]
11961254name = "helix-tui"
1197−version = "23.10.0"
1255+version = "0.6.0"
11981256dependencies = [
11991257 "bitflags 2.4.1",
12001258 "cassowary",
@@ -1210,7 +1268,7 @@ dependencies = [
12101268
12111269[[package]]
12121270name = "helix-vcs"
1213−version = "23.10.0"
1271+version = "0.6.0"
12141272dependencies = [
12151273 "anyhow",
12161274 "arc-swap",
@@ -1226,7 +1284,7 @@ dependencies = [
12261284
12271285[[package]]
12281286name = "helix-view"
1229−version = "23.10.0"
1287+version = "0.6.0"
12301288dependencies = [
12311289 "anyhow",
12321290 "arc-swap",
@@ -1268,11 +1326,11 @@ dependencies = [
12681326
12691327[[package]]
12701328name = "home"
1271−version = "0.5.5"
1329+version = "0.5.4"
12721330source = "registry+https://github.com/rust-lang/crates.io-index"
1273−checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"
1331+checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408"
12741332dependencies = [
1275− "windows-sys 0.48.0",
1333+ "winapi",
12761334]
12771335
12781336[[package]]
@@ -1286,7 +1344,7 @@ dependencies = [
12861344 "iana-time-zone-haiku",
12871345 "js-sys",
12881346 "wasm-bindgen",
1289− "windows 0.48.0",
1347+ "windows",
12901348]
12911349
12921350[[package]]
@@ -1301,9 +1359,9 @@ dependencies = [
13011359
13021360[[package]]
13031361name = "idna"
1304−version = "0.5.0"
1362+version = "0.4.0"
13051363source = "registry+https://github.com/rust-lang/crates.io-index"
1306−checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
1364+checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
13071365dependencies = [
13081366 "unicode-bidi",
13091367 "unicode-normalization",
@@ -1311,16 +1369,17 @@ dependencies = [
13111369
13121370[[package]]
13131371name = "ignore"
1314−version = "0.4.21"
1372+version = "0.4.20"
13151373source = "registry+https://github.com/rust-lang/crates.io-index"
1316−checksum = "747ad1b4ae841a78e8aba0d63adbfbeaea26b517b63705d47856b73015d27060"
1374+checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492"
13171375dependencies = [
1318− "crossbeam-deque",
13191376 "globset",
1377+ "lazy_static",
13201378 "log",
13211379 "memchr",
1322− "regex-automata",
1380+ "regex",
13231381 "same-file",
1382+ "thread_local",
13241383 "walkdir",
13251384 "winapi-util",
13261385]
@@ -1342,7 +1401,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
13421401checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
13431402dependencies = [
13441403 "equivalent",
1345− "hashbrown 0.14.3",
1404+ "hashbrown 0.14.2",
13461405]
13471406
13481407[[package]]
@@ -1351,25 +1410,6 @@ version = "2.0.4"
13511410source = "registry+https://github.com/rust-lang/crates.io-index"
13521411checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
13531412
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−
13731413[[package]]
13741414name = "itoa"
13751415version = "1.0.6"
@@ -1385,11 +1425,17 @@ dependencies = [
13851425 "wasm-bindgen",
13861426]
13871427
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+
13881434[[package]]
13891435name = "libc"
1390−version = "0.2.151"
1436+version = "0.2.149"
13911437source = "registry+https://github.com/rust-lang/crates.io-index"
1392−checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4"
1438+checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
13931439
13941440[[package]]
13951441name = "libloading"
@@ -1412,9 +1458,9 @@ dependencies = [
14121458
14131459[[package]]
14141460name = "linux-raw-sys"
1415−version = "0.4.11"
1461+version = "0.4.10"
14161462source = "registry+https://github.com/rust-lang/crates.io-index"
1417−checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829"
1463+checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f"
14181464
14191465[[package]]
14201466name = "lock_api"
@@ -1434,9 +1480,9 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
14341480
14351481[[package]]
14361482name = "lsp-types"
1437−version = "0.95.0"
1483+version = "0.94.1"
14381484source = "registry+https://github.com/rust-lang/crates.io-index"
1439−checksum = "158c1911354ef73e8fe42da6b10c0484cb65c7f1007f28022e847706c1ab6984"
1485+checksum = "c66bfd44a06ae10647fe3f8214762e9369fd4248df1350924b4ef9e770a85ea1"
14401486dependencies = [
14411487 "bitflags 1.3.2",
14421488 "serde",
@@ -1453,9 +1499,18 @@ checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c"
14531499
14541500[[package]]
14551501name = "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"
14571512source = "registry+https://github.com/rust-lang/crates.io-index"
1458−checksum = "deaba38d7abf1d4cca21cc89e932e542ba2b9258664d2a9ef0e61512039c9375"
1513+checksum = "f49388d20533534cd19360ad3d6a7dadc885944aa802ba3995040c5ec11288c6"
14591514dependencies = [
14601515 "libc",
14611516]
@@ -1480,14 +1535,14 @@ dependencies = [
14801535
14811536[[package]]
14821537name = "mio"
1483−version = "0.8.9"
1538+version = "0.8.6"
14841539source = "registry+https://github.com/rust-lang/crates.io-index"
1485−checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0"
1540+checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9"
14861541dependencies = [
14871542 "libc",
14881543 "log",
14891544 "wasi",
1490− "windows-sys 0.48.0",
1545+ "windows-sys 0.45.0",
14911546]
14921547
14931548[[package]]
@@ -1551,20 +1606,15 @@ dependencies = [
15511606
15521607[[package]]
15531608name = "once_cell"
1554−version = "1.19.0"
1609+version = "1.18.0"
15551610source = "registry+https://github.com/rust-lang/crates.io-index"
1556−checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
1611+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
15571612
15581613[[package]]
1559−name = "open"
1560−version = "5.0.1"
1614+name = "option-ext"
1615+version = "0.2.0"
15611616source = "registry+https://github.com/rust-lang/crates.io-index"
1562−checksum = "90878fb664448b54c4e592455ad02831e23a3f7e157374a8b95654731aac7349"
1563−dependencies = [
1564− "is-wsl",
1565− "libc",
1566− "pathdiff",
1567−]
1617+checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
15681618
15691619[[package]]
15701620name = "parking_lot"
@@ -1589,17 +1639,11 @@ dependencies = [
15891639 "windows-sys 0.45.0",
15901640]
15911641
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−
15981642[[package]]
15991643name = "percent-encoding"
1600−version = "2.3.1"
1644+version = "2.3.0"
16011645source = "registry+https://github.com/rust-lang/crates.io-index"
1602−checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
1646+checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
16031647
16041648[[package]]
16051649name = "pin-project-lite"
@@ -1624,9 +1668,9 @@ dependencies = [
16241668
16251669[[package]]
16261670name = "prodash"
1627−version = "28.0.0"
1671+version = "26.2.2"
16281672source = "registry+https://github.com/rust-lang/crates.io-index"
1629−checksum = "744a264d26b88a6a7e37cbad97953fa233b94d585236310bcbc88474b4092d79"
1673+checksum = "794b5bf8e2d19b53dcdcec3e4bba628e20f5b6062503ba89281fa7037dd7bbcf"
16301674
16311675[[package]]
16321676name = "pulldown-cmark"
@@ -1715,29 +1759,52 @@ dependencies = [
17151759 "bitflags 1.3.2",
17161760]
17171761
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+
17181773[[package]]
17191774name = "regex"
17201775version = "1.10.2"
17211776source = "registry+https://github.com/rust-lang/crates.io-index"
17221777checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
17231778dependencies = [
1724− "aho-corasick",
1779+ "aho-corasick 1.0.2",
17251780 "memchr",
1726− "regex-automata",
1727− "regex-syntax",
1781+ "regex-automata 0.4.3",
1782+ "regex-syntax 0.8.2",
17281783]
17291784
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+
17301791[[package]]
17311792name = "regex-automata"
17321793version = "0.4.3"
17331794source = "registry+https://github.com/rust-lang/crates.io-index"
17341795checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
17351796dependencies = [
1736− "aho-corasick",
1797+ "aho-corasick 1.0.2",
17371798 "memchr",
1738− "regex-syntax",
1799+ "regex-syntax 0.8.2",
17391800]
17401801
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+
17411808[[package]]
17421809name = "regex-syntax"
17431810version = "0.8.2"
@@ -1762,15 +1829,15 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
17621829
17631830[[package]]
17641831name = "rustix"
1765−version = "0.38.28"
1832+version = "0.38.21"
17661833source = "registry+https://github.com/rust-lang/crates.io-index"
1767−checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316"
1834+checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3"
17681835dependencies = [
17691836 "bitflags 2.4.1",
17701837 "errno",
17711838 "libc",
17721839 "linux-raw-sys",
1773− "windows-sys 0.52.0",
1840+ "windows-sys 0.48.0",
17741841]
17751842
17761843[[package]]
@@ -1802,18 +1869,18 @@ checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1"
18021869
18031870[[package]]
18041871name = "serde"
1805−version = "1.0.193"
1872+version = "1.0.190"
18061873source = "registry+https://github.com/rust-lang/crates.io-index"
1807−checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
1874+checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7"
18081875dependencies = [
18091876 "serde_derive",
18101877]
18111878
18121879[[package]]
18131880name = "serde_derive"
1814−version = "1.0.193"
1881+version = "1.0.190"
18151882source = "registry+https://github.com/rust-lang/crates.io-index"
1816−checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
1883+checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3"
18171884dependencies = [
18181885 "proc-macro2",
18191886 "quote",
@@ -1822,9 +1889,9 @@ dependencies = [
18221889
18231890[[package]]
18241891name = "serde_json"
1825−version = "1.0.108"
1892+version = "1.0.107"
18261893source = "registry+https://github.com/rust-lang/crates.io-index"
1827−checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b"
1894+checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65"
18281895dependencies = [
18291896 "itoa",
18301897 "ryu",
@@ -1910,18 +1977,18 @@ dependencies = [
19101977
19111978[[package]]
19121979name = "slotmap"
1913−version = "1.0.7"
1980+version = "1.0.6"
19141981source = "registry+https://github.com/rust-lang/crates.io-index"
1915−checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a"
1982+checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342"
19161983dependencies = [
19171984 "version_check",
19181985]
19191986
19201987[[package]]
19211988name = "smallvec"
1922−version = "1.11.2"
1989+version = "1.11.1"
19231990source = "registry+https://github.com/rust-lang/crates.io-index"
1924−checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"
1991+checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
19251992
19261993[[package]]
19271994name = "smartstring"
@@ -1942,9 +2009,9 @@ checksum = "f67ad224767faa3c7d8b6d91985b78e70a1324408abcb1cfcc2be4c06bc06043"
19422009
19432010[[package]]
19442011name = "socket2"
1945−version = "0.5.5"
2012+version = "0.5.3"
19462013source = "registry+https://github.com/rust-lang/crates.io-index"
1947−checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
2014+checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877"
19482015dependencies = [
19492016 "libc",
19502017 "windows-sys 0.48.0",
@@ -1956,6 +2023,12 @@ version = "1.1.0"
19562023source = "registry+https://github.com/rust-lang/crates.io-index"
19572024checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
19582025
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+
19592032[[package]]
19602033name = "str_indices"
19612034version = "0.4.1"
@@ -2028,24 +2101,34 @@ dependencies = [
20282101
20292102[[package]]
20302103name = "thiserror"
2031−version = "1.0.52"
2104+version = "1.0.50"
20322105source = "registry+https://github.com/rust-lang/crates.io-index"
2033−checksum = "83a48fd946b02c0a526b2e9481c8e2a17755e47039164a86c4070446e3a4614d"
2106+checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2"
20342107dependencies = [
20352108 "thiserror-impl",
20362109]
20372110
20382111[[package]]
20392112name = "thiserror-impl"
2040−version = "1.0.52"
2113+version = "1.0.50"
20412114source = "registry+https://github.com/rust-lang/crates.io-index"
2042−checksum = "e7fbe9b594d6568a6a1443250a7e67d80b74e1e96f6d1715e1e21cc1888291d3"
2115+checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8"
20432116dependencies = [
20442117 "proc-macro2",
20452118 "quote",
20462119 "syn 2.0.38",
20472120]
20482121
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+
20492132[[package]]
20502133name = "threadpool"
20512134version = "1.8.1"
@@ -2101,9 +2184,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
21012184
21022185[[package]]
21032186name = "tokio"
2104−version = "1.35.1"
2187+version = "1.33.0"
21052188source = "registry+https://github.com/rust-lang/crates.io-index"
2106−checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
2189+checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653"
21072190dependencies = [
21082191 "backtrace",
21092192 "bytes",
@@ -2120,9 +2203,9 @@ dependencies = [
21202203
21212204[[package]]
21222205name = "tokio-macros"
2123−version = "2.2.0"
2206+version = "2.1.0"
21242207source = "registry+https://github.com/rust-lang/crates.io-index"
2125−checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
2208+checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
21262209dependencies = [
21272210 "proc-macro2",
21282211 "quote",
@@ -2245,9 +2328,9 @@ checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
22452328
22462329[[package]]
22472330name = "url"
2248−version = "2.5.0"
2331+version = "2.4.1"
22492332source = "registry+https://github.com/rust-lang/crates.io-index"
2250−checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
2333+checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5"
22512334dependencies = [
22522335 "form_urlencoded",
22532336 "idna",
@@ -2263,9 +2346,9 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
22632346
22642347[[package]]
22652348name = "walkdir"
2266−version = "2.4.0"
2349+version = "2.3.3"
22672350source = "registry+https://github.com/rust-lang/crates.io-index"
2268−checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee"
2351+checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
22692352dependencies = [
22702353 "same-file",
22712354 "winapi-util",
@@ -2333,15 +2416,14 @@ checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d"
23332416
23342417[[package]]
23352418name = "which"
2336−version = "5.0.0"
2419+version = "4.4.1"
23372420source = "registry+https://github.com/rust-lang/crates.io-index"
2338−checksum = "9bf3ea8596f3a0dd5980b46430f2058dfe2c36a27ccfbb1845d6fbfcd9ba6e14"
2421+checksum = "8ad25fe5717e59ada8ea33511bbbf7420b11031730a24c65e82428766c307006"
23392422dependencies = [
2423+ "dirs",
23402424 "either",
2341− "home",
23422425 "once_cell",
23432426 "rustix",
2344− "windows-sys 0.48.0",
23452427]
23462428
23472429[[package]]
@@ -2384,25 +2466,6 @@ dependencies = [
23842466 "windows-targets 0.48.0",
23852467]
23862468
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−
24062469[[package]]
24072470name = "windows-sys"
24082471version = "0.45.0"
@@ -2421,15 +2484,6 @@ dependencies = [
24212484 "windows-targets 0.48.0",
24222485]
24232486
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−
24332487[[package]]
24342488name = "windows-targets"
24352489version = "0.42.2"
@@ -2460,21 +2514,6 @@ dependencies = [
24602514 "windows_x86_64_msvc 0.48.0",
24612515]
24622516
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−
24782517[[package]]
24792518name = "windows_aarch64_gnullvm"
24802519version = "0.42.2"
@@ -2487,12 +2526,6 @@ version = "0.48.0"
24872526source = "registry+https://github.com/rust-lang/crates.io-index"
24882527checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
24892528
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−
24962529[[package]]
24972530name = "windows_aarch64_msvc"
24982531version = "0.42.2"
@@ -2505,12 +2538,6 @@ version = "0.48.0"
25052538source = "registry+https://github.com/rust-lang/crates.io-index"
25062539checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
25072540
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−
25142541[[package]]
25152542name = "windows_i686_gnu"
25162543version = "0.42.2"
@@ -2523,12 +2550,6 @@ version = "0.48.0"
25232550source = "registry+https://github.com/rust-lang/crates.io-index"
25242551checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
25252552
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−
25322553[[package]]
25332554name = "windows_i686_msvc"
25342555version = "0.42.2"
@@ -2541,12 +2562,6 @@ version = "0.48.0"
25412562source = "registry+https://github.com/rust-lang/crates.io-index"
25422563checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
25432564
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−
25502565[[package]]
25512566name = "windows_x86_64_gnu"
25522567version = "0.42.2"
@@ -2559,12 +2574,6 @@ version = "0.48.0"
25592574source = "registry+https://github.com/rust-lang/crates.io-index"
25602575checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
25612576
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−
25682577[[package]]
25692578name = "windows_x86_64_gnullvm"
25702579version = "0.42.2"
@@ -2577,12 +2586,6 @@ version = "0.48.0"
25772586source = "registry+https://github.com/rust-lang/crates.io-index"
25782587checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
25792588
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−
25862589[[package]]
25872590name = "windows_x86_64_msvc"
25882591version = "0.42.2"
@@ -2595,12 +2598,6 @@ version = "0.48.0"
25952598source = "registry+https://github.com/rust-lang/crates.io-index"
25962599checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
25972600
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−
26042601[[package]]
26052602name = "winnow"
26062603version = "0.4.6"
@@ -2612,16 +2609,16 @@ dependencies = [
26122609
26132610[[package]]
26142611name = "winnow"
2615−version = "0.5.28"
2612+version = "0.5.17"
26162613source = "registry+https://github.com/rust-lang/crates.io-index"
2617−checksum = "6c830786f7720c2fd27a1a0e27a709dbd3c4d009b56d098fc742d4f4eab91fe2"
2614+checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c"
26182615dependencies = [
26192616 "memchr",
26202617]
26212618
26222619[[package]]
26232620name = "xtask"
2624−version = "23.10.0"
2621+version = "0.6.0"
26252622dependencies = [
26262623 "helix-core",
26272624 "helix-loader",
@@ -2632,18 +2629,18 @@ dependencies = [
26322629
26332630[[package]]
26342631name = "zerocopy"
2635−version = "0.7.31"
2632+version = "0.7.20"
26362633source = "registry+https://github.com/rust-lang/crates.io-index"
2637−checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d"
2634+checksum = "dd66a62464e3ffd4e37bd09950c2b9dd6c4f8767380fabba0d523f9a775bc85a"
26382635dependencies = [
26392636 "zerocopy-derive",
26402637]
26412638
26422639[[package]]
26432640name = "zerocopy-derive"
2644−version = "0.7.31"
2641+version = "0.7.20"
26452642source = "registry+https://github.com/rust-lang/crates.io-index"
2646−checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a"
2643+checksum = "255c4596d41e6916ced49cfafea18727b24d67878fa180ddfd69b9df34fd1726"
26472644dependencies = [
26482645 "proc-macro2",
26492646 "quote",
Cargo.toml−11
@@ -1,5 +1,4 @@
11[workspace]
2−resolver = "2"
32members = [
43 "helix-core",
54 "helix-view",
@@ -38,13 +37,3 @@ package.helix-term.opt-level = 2
3837[workspace.dependencies]
3938tree-sitter = { version = "0.20", git = "https://github.com/tree-sitter/tree-sitter", rev = "ab09ae20d640711174b8da8a654f6b3dec93da1a" }
4039nucleo = "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 @@
1818
1919![Screenshot](./screenshot.png)
2020
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.
2222
2323The editing model is very heavily based on Kakoune; during development I found
2424myself 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
6565| `workspace-lsp-roots` | Directories relative to the workspace root that are treated as LSP roots. Should only be set in `.helix/config.toml` | `[]` |
6666| `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` |
6767| `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`
7068
7169### `[editor.statusline]` Section
7270
@@ -168,31 +166,16 @@ All git related options are only enabled in a git repository.
168166
169167| Key | Description | Default |
170168|--|--|---------|
171−|`hidden` | Enables ignoring hidden files | `true`
172−|`follow-symlinks` | Follow symlinks instead of ignoring them | `true`
173−|`deduplicate-links` | Ignore symlinks that point at files already shown in the picker | `true`
174−|`parents` | Enables reading ignore files from parent directories | `true`
175−|`ignore` | Enables reading `.ignore` files | `true`
176−|`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`
178−|`git-exclude` | Enables reading `.git/info/exclude` files | `true`
169+|`hidden` | Enables ignoring hidden files | true
170+|`follow-symlinks` | Follow symlinks instead of ignoring them | true
171+|`deduplicate-links` | Ignore symlinks that point at files already shown in the picker | true
172+|`parents` | Enables reading ignore files from parent directories | true
173+|`ignore` | Enables reading `.ignore` files | true
174+|`git-ignore` | Enables reading `.gitignore` files | true
175+|`git-global` | Enables reading global `.gitignore`, whose path is specified in git's config: `core.excludefile` option | true
176+|`git-exclude` | Enables reading `.git/info/exclude` files | true
179177|`max-depth` | Set with an integer value for maximum depth to recurse | Defaults to `None`.
180178
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−
196179### `[editor.auto-pairs]` Section
197180
198181Enables automatic insertion of pairs to parentheses, brackets, etc. Can be a
book/src/generated/lang-support.md+6−12
@@ -1,6 +1,5 @@
11| Language | Syntax Highlighting | Treesitter Textobjects | Auto Indent | Default LSP |
22| --- | --- | --- | --- | --- |
3−| agda | ✓ | | | |
43| astro | ✓ | | | |
54| awk | ✓ | ✓ | | `awk-language-server` |
65| bash | ✓ | ✓ | ✓ | `bash-language-server` |
@@ -11,13 +10,13 @@
1110| blueprint | ✓ | | | `blueprint-compiler` |
1211| c | ✓ | ✓ | ✓ | `clangd` |
1312| c-sharp | ✓ | ✓ | | `OmniSharp` |
14−| cabal | | | | `haskell-language-server-wrapper` |
13+| cabal | | | | |
1514| cairo | ✓ | ✓ | ✓ | `cairo-language-server` |
1615| capnp | ✓ | | ✓ | |
1716| clojure | ✓ | | | `clojure-lsp` |
1817| cmake | ✓ | ✓ | ✓ | `cmake-language-server` |
1918| comment | ✓ | | | |
20−| common-lisp | ✓ | | ✓ | `cl-lsp` |
19+| common-lisp | ✓ | | | `cl-lsp` |
2120| cpon | ✓ | | ✓ | |
2221| cpp | ✓ | ✓ | ✓ | `clangd` |
2322| crystal | ✓ | ✓ | | `crystalline` |
@@ -25,7 +24,6 @@
2524| cue | ✓ | | | `cuelsp` |
2625| d | ✓ | ✓ | ✓ | `serve-d` |
2726| dart | ✓ | | ✓ | `dart` |
28−| dbml | ✓ | | | |
2927| devicetree | ✓ | | | |
3028| dhall | ✓ | ✓ | | `dhall-lsp-server` |
3129| diff | ✓ | | | |
@@ -56,7 +54,6 @@
5654| git-rebase | ✓ | | | |
5755| gleam | ✓ | ✓ | | `gleam` |
5856| glsl | ✓ | ✓ | ✓ | |
59−| gn | ✓ | | | |
6057| go | ✓ | ✓ | ✓ | `gopls`, `golangci-lint-langserver` |
6158| godot-resource | ✓ | | | |
6259| gomod | ✓ | | | `gopls` |
@@ -74,7 +71,6 @@
7471| idris | | | | `idris2-lsp` |
7572| iex | ✓ | | | |
7673| ini | ✓ | | | |
77−| janet | ✓ | | | |
7874| java | ✓ | ✓ | ✓ | `jdtls` |
7975| javascript | ✓ | ✓ | ✓ | `typescript-language-server` |
8076| jinja | ✓ | | | |
@@ -85,7 +81,7 @@
8581| jsx | ✓ | ✓ | ✓ | `typescript-language-server` |
8682| julia | ✓ | ✓ | ✓ | `julia` |
8783| just | ✓ | ✓ | ✓ | |
88−| kdl | ✓ | ✓ | ✓ | |
84+| kdl | ✓ | | | |
8985| kotlin | ✓ | | | `kotlin-language-server` |
9086| latex | ✓ | ✓ | | `texlab` |
9187| lean | ✓ | | | `lean` |
@@ -93,7 +89,6 @@
9389| llvm | ✓ | ✓ | ✓ | |
9490| llvm-mir | ✓ | ✓ | ✓ | |
9591| llvm-mir-yaml | ✓ | | ✓ | |
96−| log | ✓ | | | |
9792| lpf | ✓ | | | |
9893| lua | ✓ | ✓ | ✓ | `lua-language-server` |
9994| make | ✓ | | | |
@@ -109,7 +104,7 @@
109104| nickel | ✓ | | ✓ | `nls` |
110105| nim | ✓ | ✓ | ✓ | `nimlangserver` |
111106| nix | ✓ | | | `nil` |
112−| nu | ✓ | | | `nu` |
107+| nu | ✓ | | | |
113108| nunjucks | ✓ | | | |
114109| ocaml | ✓ | | ✓ | `ocamllsp` |
115110| ocaml-interface | ✓ | | | `ocamllsp` |
@@ -133,7 +128,7 @@
133128| python | ✓ | ✓ | ✓ | `pylsp` |
134129| qml | ✓ | | ✓ | `qmlls` |
135130| r | ✓ | | | `R` |
136−| racket | ✓ | | ✓ | `racket` |
131+| racket | ✓ | | | `racket` |
137132| regex | ✓ | | | |
138133| rego | ✓ | | | `regols` |
139134| rescript | ✓ | ✓ | | `rescript-language-server` |
@@ -145,10 +140,9 @@
145140| rust | ✓ | ✓ | ✓ | `rust-analyzer` |
146141| sage | ✓ | ✓ | | |
147142| scala | ✓ | | ✓ | `metals` |
148−| scheme | ✓ | | ✓ | |
143+| scheme | ✓ | | | |
149144| scss | ✓ | | | `vscode-css-language-server` |
150145| slint | ✓ | | ✓ | `slint-lsp` |
151−| smali | ✓ | | ✓ | |
152146| smithy | ✓ | | | `cs` |
153147| sml | ✓ | | | |
154148| solidity | ✓ | | | `solc` |
book/src/generated/typable-cmd.md+1−2
@@ -17,7 +17,7 @@
1717| `: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) |
1818| `:new`, `:n` | Create a new scratch buffer. |
1919| `: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.) |
2121| `:line-ending` | Set the document's default line ending. Options: crlf, lf. |
2222| `:earlier`, `:ear` | Jump back to an earlier point in edit history. Accepts a number of steps or a time span. |
2323| `:later`, `:lat` | Jump to a later point in edit history. Accepts a number of steps or a time span. |
@@ -85,4 +85,3 @@
8585| `:reset-diff-change`, `:diffget`, `:diffg` | Reset the diff change at the cursor position. |
8686| `:clear-register` | Clear given register. If no argument is provided, clear all registers. |
8787| `:redraw` | Clear and re-render the whole UI |
88−| `:move` | Move the current buffer and its corresponding file to a different path |
book/src/guides/adding_languages.md−2
@@ -36,7 +36,6 @@ below.
36363. Refer to the
3737 [tree-sitter website](https://tree-sitter.github.io/tree-sitter/syntax-highlighting#queries)
3838 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).
4039
4140> 💡 In Helix, the first matching query takes precedence when evaluating
4241> queries, which is different from other editors such as Neovim where the last
@@ -52,4 +51,3 @@ below.
5251 grammars.
5352- If a parser is causing a segfault, or you want to remove it, make sure to
5453 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,
1212multiple indent level increases that start on the same line only increase
1313the total indent level by 1. See [Capture types](#capture-types).
1414
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−
2415## Indent queries
2516
2617When 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
6565
6666### Fedora/RHEL
6767
68+Enable the `COPR` repository for Helix:
69+
6870```sh
71+sudo dnf copr enable varlad/helix
6972sudo dnf install helix
7073```
7174
book/src/keymap.md+1−1
@@ -25,7 +25,7 @@
2525
2626## Normal mode
2727
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`.
2929
3030### Movement
3131
book/src/languages.md−2
@@ -66,10 +66,8 @@ These configuration keys are available:
6666| `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) |
6767| `grammar` | The tree-sitter grammar to use (defaults to the value of `name`) |
6868| `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)
7069| `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` |
7170| `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.
7371
7472### File-type detection and the `file-types` key
7573
book/src/themes.md+1−5
@@ -155,7 +155,6 @@ We use a similar set of scopes as
155155
156156- `type` - Types
157157 - `builtin` - Primitive types provided by the language (`int`, `usize`)
158− - `parameter` - Generic type parameters (`T`)
159158 - `enum`
160159 - `variant`
161160- `constructor`
@@ -296,14 +295,11 @@ These scopes are used for theming the editor interface:
296295| `ui.statusline.insert` | Statusline mode during insert mode ([only if `editor.color-modes` is enabled][editor-section]) |
297296| `ui.statusline.select` | Statusline mode during select mode ([only if `editor.color-modes` is enabled][editor-section]) |
298297| `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 |
302298| `ui.popup` | Documentation popups (e.g. Space + k) |
303299| `ui.popup.info` | Prompt for multiple key options |
304300| `ui.window` | Borderlines separating splits |
305301| `ui.help` | Description box for commands |
306−| `ui.text` | Default text style, command prompts, popup text, etc. |
302+| `ui.text` | Command prompts, popup text, etc. |
307303| `ui.text.focus` | The currently selected line in the picker |
308304| `ui.text.inactive` | Same as `ui.text` but when the text is inactive (e.g. suggestions) |
309305| `ui.text.info` | The key: command text in `ui.popup.info` boxes |
book/src/usage.md+2−2
@@ -59,8 +59,8 @@ Some registers have special behavior when read from and written to.
5959| `#` | Selection indices (first selection is `1`, second is `2`, etc.) | This register is not writable |
6060| `.` | Contents of the current selections | This register is not writable |
6161| `%` | Name of the current file | This register is not writable |
62−| `+` | Reads from the system clipboard | Joins and yanks to the system clipboard |
63−| `*` | Reads from the primary clipboard | Joins and yanks to the primary clipboard |
62+| `*` | Reads from the system clipboard | Joins and yanks to the system clipboard |
63+| `+` | Reads from the primary clipboard | Joins and yanks to the primary clipboard |
6464
6565When yanking multiple selections to the clipboard registers, the selections
6666are joined with newlines. Pasting from these registers will paste multiple
docs/releases.md+5−12
@@ -1,23 +1,16 @@
11## Checklist
22
33Helix 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,
5−`22.05.1`. In these instructions we'll use `<tag>` as a placeholder for the tag
6−being published.
4+`YY.0M(.MICRO)`, for example, `22.05` for May of 2022. In these instructions
5+we'll use `<tag>` as a placeholder for the tag being published.
76
87* Merge the changelog PR
98* 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)
109* Tag and push
1110 * `git tag -s -m "<tag>" -a <tag> && git push`
1211 * 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
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`
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`
12+* Edit the `VERSION` file and change the date to the next planned release
13+ * Releases are planned to happen every two months, so `22.05` would change to `22.07`
2114* Wait for the Release CI to finish
2215 * It will automatically turn the git tag into a GitHub release when it uploads artifacts
2316* Edit the new release
@@ -64,4 +57,4 @@ versions for convenience:
6457> release. For the full log, check out the git log.
6558
6659Typically, 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 @@
22 "nodes": {
33 "crane": {
44 "inputs": {
5+ "flake-compat": "flake-compat",
6+ "flake-utils": [
7+ "flake-utils"
8+ ],
59 "nixpkgs": [
610 "nixpkgs"
11+ ],
12+ "rust-overlay": [
13+ "rust-overlay"
714 ]
815 },
916 "locked": {
10− "lastModified": 1701025348,
11− "narHash": "sha256-42GHmYH+GF7VjwGSt+fVT1CQuNpGanJbNgVHTAZppUM=",
17+ "lastModified": 1688772518,
18+ "narHash": "sha256-ol7gZxwvgLnxNSZwFTDJJ49xVY5teaSvF7lzlo3YQfM=",
1219 "owner": "ipetkov",
1320 "repo": "crane",
14− "rev": "42afaeb1a0325194a7cdb526332d2cb92fddd07b",
21+ "rev": "8b08e96c9af8c6e3a2b69af5a7fa168750fcf88e",
1522 "type": "github"
1623 },
1724 "original": {
@@ -20,16 +27,32 @@
2027 "type": "github"
2128 }
2229 },
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+ },
2346 "flake-utils": {
2447 "inputs": {
2548 "systems": "systems"
2649 },
2750 "locked": {
28− "lastModified": 1694529238,
29− "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
51+ "lastModified": 1689068808,
52+ "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=",
3053 "owner": "numtide",
3154 "repo": "flake-utils",
32− "rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
55+ "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4",
3356 "type": "github"
3457 },
3558 "original": {
@@ -40,11 +63,11 @@
4063 },
4164 "nixpkgs": {
4265 "locked": {
43− "lastModified": 1700794826,
44− "narHash": "sha256-RyJTnTNKhO0yqRpDISk03I/4A67/dp96YRxc86YOPgU=",
66+ "lastModified": 1690272529,
67+ "narHash": "sha256-MakzcKXEdv/I4qJUtq/k/eG+rVmyOZLnYNC2w1mB59Y=",
4568 "owner": "nixos",
4669 "repo": "nixpkgs",
47− "rev": "5a09cb4b393d58f9ed0d9ca1555016a8543c2ac8",
70+ "rev": "ef99fa5c5ed624460217c31ac4271cfb5cb2502c",
4871 "type": "github"
4972 },
5073 "original": {
@@ -72,11 +95,11 @@
7295 ]
7396 },
7497 "locked": {
75− "lastModified": 1701137803,
76− "narHash": "sha256-0LcPAdql5IhQSUXJx3Zna0dYTgdIoYO7zUrsKgiBd04=",
98+ "lastModified": 1690424156,
99+ "narHash": "sha256-Bpml+L280tHTQpwpC5/BJbU4HSvEzMvW8IZ4gAXimhE=",
77100 "owner": "oxalica",
78101 "repo": "rust-overlay",
79− "rev": "9dd940c967502f844eacea52a61e9596268d4f70",
102+ "rev": "f335a0213504c7e6481c359dc1009be9cf34432c",
80103 "type": "github"
81104 },
82105 "original": {
flake.nix+14−12
@@ -13,6 +13,8 @@
1313 };
1414 crane = {
1515 url = "github:ipetkov/crane";
16+ inputs.rust-overlay.follows = "rust-overlay";
17+ inputs.flake-utils.follows = "flake-utils";
1618 inputs.nixpkgs.follows = "nixpkgs";
1719 };
1820 };
@@ -121,18 +123,18 @@
121123 rustToolchain = pkgs.pkgsBuildHost.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
122124 craneLibMSRV = (crane.mkLib pkgs).overrideToolchain rustToolchain;
123125 craneLibStable = (crane.mkLib pkgs).overrideToolchain pkgs.pkgsBuildHost.rust-bin.stable.latest.default;
124− commonArgs = {
125− inherit stdenv;
126− inherit (craneLibMSRV.crateNameFromCargoToml {cargoToml = ./helix-term/Cargo.toml;}) pname;
127− inherit (craneLibMSRV.crateNameFromCargoToml {cargoToml = ./Cargo.toml;}) version;
128− src = filteredSource;
129− # disable fetching and building of tree-sitter grammars in the helix-term build.rs
130− HELIX_DISABLE_AUTO_GRAMMAR_BUILD = "1";
131− buildInputs = [stdenv.cc.cc.lib];
132− # disable tests
133− doCheck = false;
134− meta.mainProgram = "hx";
135− };
126+ commonArgs =
127+ {
128+ inherit stdenv;
129+ src = filteredSource;
130+ # disable fetching and building of tree-sitter grammars in the helix-term build.rs
131+ HELIX_DISABLE_AUTO_GRAMMAR_BUILD = "1";
132+ buildInputs = [stdenv.cc.cc.lib];
133+ # disable tests
134+ doCheck = false;
135+ meta.mainProgram = "hx";
136+ }
137+ // craneLibMSRV.crateNameFromCargoToml {cargoToml = ./helix-term/Cargo.toml;};
136138 cargoArtifacts = craneLibMSRV.buildDepsOnly commonArgs;
137139 in {
138140 packages = {
grammars.nix+21−24
@@ -5,7 +5,6 @@
55 runCommand,
66 yj,
77 includeGrammarIf ? _: true,
8− grammarOverlays ? [],
98 ...
109}: let
1110 # HACK: nix < 2.6 has a bug in the toml parser, so we convert to JSON
@@ -49,22 +48,22 @@
4948 then sourceGitHub
5049 else sourceGit;
5150 in
52− stdenv.mkDerivation {
51+ stdenv.mkDerivation rec {
5352 # see https://github.com/NixOS/nixpkgs/blob/fbdd1a7c0bc29af5325e0d7dd70e804a972eb465/pkgs/development/tools/parsing/tree-sitter/grammar.nix
5453
5554 pname = "helix-tree-sitter-${grammar.name}";
5655 version = grammar.source.rev;
5756
58− src = source;
59− sourceRoot = if builtins.hasAttr "subpath" grammar.source then
60− "source/${grammar.source.subpath}"
61− else
62− "source";
57+ src =
58+ if builtins.hasAttr "subpath" grammar.source
59+ then "${source}/${grammar.source.subpath}"
60+ else source;
6361
62+ dontUnpack = true;
6463 dontConfigure = true;
6564
6665 FLAGS = [
67− "-Isrc"
66+ "-I${src}/src"
6867 "-g"
6968 "-O3"
7069 "-fPIC"
@@ -77,13 +76,13 @@
7776 buildPhase = ''
7877 runHook preBuild
7978
80− if [[ -e src/scanner.cc ]]; then
81− $CXX -c src/scanner.cc -o scanner.o $FLAGS
82− elif [[ -e src/scanner.c ]]; then
83− $CC -c src/scanner.c -o scanner.o $FLAGS
79+ if [[ -e "$src/src/scanner.cc" ]]; then
80+ $CXX -c "$src/src/scanner.cc" -o scanner.o $FLAGS
81+ elif [[ -e "$src/src/scanner.c" ]]; then
82+ $CC -c "$src/src/scanner.c" -o scanner.o $FLAGS
8483 fi
8584
86− $CC -c src/parser.c -o parser.o $FLAGS
85+ $CC -c "$src/src/parser.c" -o parser.o $FLAGS
8786 $CXX -shared -o $NAME.so *.o
8887
8988 ls -al
@@ -106,17 +105,15 @@
106105 '';
107106 };
108107 grammarsToBuild = builtins.filter includeGrammarIf gitGrammars;
109− builtGrammars = builtins.map (grammar: {
110− inherit (grammar) name;
111− value = buildGrammar grammar;
112− }) 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
118− (name: artifact: "ln -s ${artifact}/${name}.so $out/${name}.so")
119− (lib.filterAttrs (n: v: lib.isDerivation v) overlayedGrammars);
108+ builtGrammars =
109+ builtins.map (grammar: {
110+ inherit (grammar) name;
111+ artifact = buildGrammar grammar;
112+ })
113+ grammarsToBuild;
114+ grammarLinks =
115+ builtins.map (grammar: "ln -s ${grammar.artifact}/${grammar.name}.so $out/${grammar.name}.so")
116+ builtGrammars;
120117in
121118 runCommand "consolidated-helix-grammars" {} ''
122119 mkdir -p $out
helix-core/Cargo.toml+10−11
@@ -1,22 +1,21 @@
11[package]
22name = "helix-core"
3+version = "0.6.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+edition = "2021"
6+license = "MPL-2.0"
37description = "Helix editor core editing primitives"
8+categories = ["editor"]
9+repository = "https://github.com/helix-editor/helix"
10+homepage = "https://helix-editor.com"
411include = ["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
1312
1413[features]
1514unicode-lines = ["ropey/unicode_lines"]
1615integration = []
1716
1817[dependencies]
19−helix-loader = { path = "../helix-loader" }
18+helix-loader = { version = "0.6", path = "../helix-loader" }
2019
2120ropey = { version = "1.6.1", default-features = false, features = ["simd"] }
2221smallvec = "1.11"
@@ -27,12 +26,12 @@ unicode-general-category = "0.6"
2726# slab = "0.4.2"
2827slotmap = "1.0"
2928tree-sitter.workspace = true
30−once_cell = "1.19"
29+once_cell = "1.18"
3130arc-swap = "1"
3231regex = "1"
3332bitflags = "2.4"
3433ahash = "0.8.6"
35−hashbrown = { version = "0.14.3", features = ["raw"] }
34+hashbrown = { version = "0.14.2", features = ["raw"] }
3635dunce = "1.0"
3736
3837log = "0.4"
helix-core/src/diagnostic.rs−4
@@ -39,10 +39,6 @@ pub enum DiagnosticTag {
3939#[derive(Debug, Clone)]
4040pub struct Diagnostic {
4141 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,
4642 pub line: usize,
4743 pub message: String,
4844 pub severity: Option<Severity>,
helix-core/src/indent.rs+101−310
@@ -4,11 +4,10 @@ use tree_sitter::{Query, QueryCursor, QueryPredicateArg};
44
55use crate::{
66 chars::{char_is_line_ending, char_is_whitespace},
7− find_first_non_whitespace_char,
87 graphemes::{grapheme_width, tab_width_at},
9− syntax::{IndentationHeuristic, LanguageConfiguration, RopeProvider, Syntax},
8+ syntax::{LanguageConfiguration, RopeProvider, Syntax},
109 tree_sitter::Node,
11− Position, Rope, RopeGraphemes, RopeSlice,
10+ Rope, RopeGraphemes, RopeSlice,
1211};
1312
1413/// Enum representing indentation style.
@@ -22,7 +21,7 @@ pub enum IndentStyle {
2221
2322// 16 spaces
2423const INDENTS: &str = " ";
25−pub const MAX_INDENT: u8 = 16;
24+const MAX_INDENT: u8 = 16;
2625
2726impl IndentStyle {
2827 /// 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
197196 len / indent_width
198197}
199198
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−
250199/// Computes for node and all ancestors whether they are the first node on their line.
251200/// The first entry in the return value represents the root node, the last one the node itself
252201fn 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
292241/// - max(0, indent - outdent) tabs, if tabs are used for indentation
293242/// - max(0, indent - outdent)*indent_width spaces, if spaces are used for indentation
294243#[derive(Default, Debug, PartialEq, Eq, Clone)]
295−pub struct Indentation<'a> {
244+pub struct Indentation {
296245 indent: usize,
297246 indent_always: usize,
298247 outdent: usize,
299248 outdent_always: usize,
300249 /// The alignment, as a string containing only tabs & spaces. Storing this as a string instead of e.g.
301250 /// the (visual) width ensures that the alignment is preserved even if the tab width changes.
302− align: Option<RopeSlice<'a>>,
251+ align: Option<String>,
303252}
304253
305−impl<'a> Indentation<'a> {
254+impl Indentation {
306255 /// Add some other [Indentation] to this.
307256 /// The added indent should be the total added indent from one line.
308257 /// 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) {
310259 // Align overrides the indent from outer scopes.
311260 if self.align.is_some() {
312261 return;
@@ -325,7 +274,7 @@ impl<'a> Indentation<'a> {
325274 /// Only captures that apply to the same line should be added together in this way (otherwise use `add_line`)
326275 /// and the captures should be added starting from the innermost tree-sitter node (currently this only matters
327276 /// 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) {
329278 match added {
330279 IndentCaptureType::Indent => {
331280 if self.indent_always == 0 {
@@ -354,62 +303,43 @@ impl<'a> Indentation<'a> {
354303 }
355304 }
356305 }
357− fn net_indent(&self) -> isize {
358− (self.indent + self.indent_always) as isize
359− - ((self.outdent + self.outdent_always) as isize)
360− }
361− /// Convert `self` into a string, taking into account the computed and actual indentation of some other line.
362− fn relative_indent(
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− ))
306+ fn into_string(self, indent_style: &IndentStyle) -> String {
307+ let indent = self.indent_always + self.indent;
308+ let outdent = self.outdent_always + self.outdent;
309+
310+ let indent_level = if indent >= outdent {
311+ indent - outdent
380312 } else {
381− // If the alignment of both lines is different, we cannot compare their indentation in any meaningful way
382− None
383− }
384− }
385− pub fn to_string(&self, indent_style: &IndentStyle, tab_width: usize) -> String {
386− add_indent_level(
387− self.align
388− .map_or_else(String::new, whitespace_with_same_width),
389− self.net_indent(),
390− indent_style,
391− tab_width,
392− )
313+ log::warn!("Encountered more outdent than indent nodes while calculating indentation: {} outdent, {} indent", self.outdent, self.indent);
314+ 0
315+ };
316+ let mut indent_string = if let Some(align) = self.align {
317+ align
318+ } else {
319+ String::new()
320+ };
321+ indent_string.push_str(&indent_style.as_str().repeat(indent_level));
322+ indent_string
393323 }
394324}
395325
396326/// An indent definition which corresponds to a capture from the indent query
397327#[derive(Debug)]
398−struct IndentCapture<'a> {
399− capture_type: IndentCaptureType<'a>,
328+struct IndentCapture {
329+ capture_type: IndentCaptureType,
400330 scope: IndentScope,
401331}
402332#[derive(Debug, Clone, PartialEq)]
403−enum IndentCaptureType<'a> {
333+enum IndentCaptureType {
404334 Indent,
405335 IndentAlways,
406336 Outdent,
407337 OutdentAlways,
408338 /// Alignment given as a string of whitespace
409− Align(RopeSlice<'a>),
339+ Align(String),
410340}
411341
412−impl<'a> IndentCaptureType<'a> {
342+impl IndentCaptureType {
413343 fn default_scope(&self) -> IndentScope {
414344 match self {
415345 IndentCaptureType::Indent | IndentCaptureType::IndentAlways => IndentScope::Tail,
@@ -441,8 +371,8 @@ enum ExtendCapture {
441371/// each node (identified by its ID) the relevant captures (already filtered
442372/// by predicates).
443373#[derive(Debug)]
444−struct IndentQueryResult<'a> {
445− indent_captures: HashMap<usize, Vec<IndentCapture<'a>>>,
374+struct IndentQueryResult {
375+ indent_captures: HashMap<usize, Vec<IndentCapture>>,
446376 extend_captures: HashMap<usize, Vec<ExtendCapture>>,
447377}
448378
@@ -463,14 +393,14 @@ fn get_node_end_line(node: Node, new_line_byte_pos: Option<usize>) -> usize {
463393 node_line
464394}
465395
466−fn query_indents<'a>(
396+fn query_indents(
467397 query: &Query,
468398 syntax: &Syntax,
469399 cursor: &mut QueryCursor,
470− text: RopeSlice<'a>,
400+ text: RopeSlice,
471401 range: std::ops::Range<usize>,
472402 new_line_byte_pos: Option<usize>,
473−) -> IndentQueryResult<'a> {
403+) -> IndentQueryResult {
474404 let mut indent_captures: HashMap<usize, Vec<IndentCapture>> = HashMap::new();
475405 let mut extend_captures: HashMap<usize, Vec<ExtendCapture>> = HashMap::new();
476406 cursor.set_byte_range(range);
@@ -558,7 +488,7 @@ fn query_indents<'a>(
558488 "outdent" => IndentCaptureType::Outdent,
559489 "outdent.always" => IndentCaptureType::OutdentAlways,
560490 // 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("")),
562492 "anchor" => {
563493 if anchor.is_some() {
564494 log::error!("Invalid indent query: Encountered more than one @anchor in the same match.")
@@ -630,10 +560,22 @@ fn query_indents<'a>(
630560 }
631561 Some(anchor) => anchor,
632562 };
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(
634567 text.line(anchor.start_position().row)
635568 .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);
637579 }
638580 indent_captures
639581 .entry(node_id)
@@ -719,20 +661,56 @@ fn extend_nodes<'a>(
719661 }
720662}
721663
722−/// Prepare an indent query by computing:
723−/// - The node from which to start the query (this is non-trivial due to `@extend` captures)
724−/// - The indent captures for all relevant nodes.
664+/// Use the syntax tree to determine the indentation for a given position.
665+/// This can be used in 2 ways:
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+/// ```
725700#[allow(clippy::too_many_arguments)]
726−fn init_indent_query<'a, 'b>(
701+pub fn treesitter_indent_for_pos(
727702 query: &Query,
728− syntax: &'a Syntax,
729− text: RopeSlice<'b>,
703+ syntax: &Syntax,
704+ indent_style: &IndentStyle,
730705 tab_width: usize,
731706 indent_width: usize,
707+ text: RopeSlice,
732708 line: usize,
733− byte_pos: usize,
734− new_line_byte_pos: Option<usize>,
735−) -> Option<(Node<'a>, HashMap<usize, Vec<IndentCapture<'b>>>)> {
709+ pos: usize,
710+ new_line: bool,
711+) -> Option<String> {
712+ let byte_pos = text.char_to_byte(pos);
713+ let new_line_byte_pos = new_line.then_some(byte_pos);
736714 // The innermost tree-sitter node which is considered for the indent
737715 // computation. It may change if some predeceding node is extended
738716 let mut node = syntax
@@ -776,6 +754,7 @@ fn init_indent_query<'a, 'b>(
776754 (query_result, deepest_preceding)
777755 })
778756 };
757+ let mut indent_captures = query_result.indent_captures;
779758 let extend_captures = query_result.extend_captures;
780759
781760 // Check for extend captures, potentially changing the node that the indent calculation starts with
@@ -790,68 +769,6 @@ fn init_indent_query<'a, 'b>(
790769 indent_width,
791770 );
792771 }
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− )?;
855772 let mut first_in_line = get_first_in_line(node, new_line.then_some(byte_pos));
856773
857774 let mut result = Indentation::default();
@@ -919,7 +836,7 @@ pub fn treesitter_indent_for_pos<'a>(
919836 break;
920837 }
921838 }
922− Some(result)
839+ Some(result.into_string(indent_style))
923840}
924841
925842/// Returns the indentation for a new line.
@@ -928,7 +845,6 @@ pub fn treesitter_indent_for_pos<'a>(
928845pub fn indent_for_newline(
929846 language_config: Option<&LanguageConfiguration>,
930847 syntax: Option<&Syntax>,
931− indent_heuristic: &IndentationHeuristic,
932848 indent_style: &IndentStyle,
933849 tab_width: usize,
934850 text: RopeSlice,
@@ -937,18 +853,14 @@ pub fn indent_for_newline(
937853 current_line: usize,
938854) -> String {
939855 let indent_width = indent_style.indent_width(tab_width);
940− if let (
941− IndentationHeuristic::TreeSitter | IndentationHeuristic::Hybrid,
942− Some(query),
943− Some(syntax),
944− ) = (
945− indent_heuristic,
856+ if let (Some(query), Some(syntax)) = (
946857 language_config.and_then(|config| config.indent_query()),
947858 syntax,
948859 ) {
949860 if let Some(indent) = treesitter_indent_for_pos(
950861 query,
951862 syntax,
863+ indent_style,
952864 tab_width,
953865 indent_width,
954866 text,
@@ -956,57 +868,9 @@ pub fn indent_for_newline(
956868 line_before_end_pos,
957869 true,
958870 ) {
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;
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);
871+ return indent;
1007872 };
1008873 }
1009− // Fallback in case we either don't have indent queries or they failed for some reason
1010874 let indent_level = indent_level_for_line(text.line(current_line), tab_width, indent_width);
1011875 indent_style.as_str().repeat(indent_level)
1012876}
@@ -1098,13 +962,10 @@ mod test {
1098962 ..Default::default()
1099963 };
1100964
1101− fn add_capture<'a>(
1102− mut indent: Indentation<'a>,
1103− capture: IndentCaptureType<'a>,
1104− ) -> Indentation<'a> {
965+ let add_capture = |mut indent: Indentation, capture| {
1105966 indent.add_capture(capture);
1106967 indent
1107− }
968+ };
1108969
1109970 // adding an indent to no indent makes an indent
1110971 assert_eq!(
@@ -1199,74 +1060,4 @@ mod test {
11991060 )
12001061 );
12011062 }
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− }
12721063}
helix-core/src/syntax.rs+5−21
@@ -101,8 +101,7 @@ pub struct LanguageConfiguration {
101101 pub file_types: Vec<FileType>, // filename extension or ends_with? <Gemfile, rb, etc>
102102 #[serde(default)]
103103 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>
106105 pub comment_token: Option<String>,
107106 pub text_width: Option<usize>,
108107 pub soft_wrap: Option<SoftWrap>,
@@ -155,8 +154,6 @@ pub struct LanguageConfiguration {
155154 /// Hardcoded LSP root directories relative to the workspace root, like `examples` or `tools/fuzz`.
156155 /// Falling back to the current working directory if none are configured.
157156 pub workspace_lsp_roots: Option<Vec<PathBuf>>,
158− #[serde(default)]
159− pub persistent_diagnostic_sources: Vec<String>,
160157}
161158
162159#[derive(Debug, PartialEq, Eq, Hash)]
@@ -214,7 +211,10 @@ impl<'de> Deserialize<'de> for FileType {
214211 {
215212 match map.next_entry::<String, String>()? {
216213 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))
218218 })),
219219 Some((key, _value)) => Err(serde::de::Error::custom(format!(
220220 "unknown key in `file-types` list: {}",
@@ -444,22 +444,6 @@ pub struct IndentationConfiguration {
444444 pub unit: String,
445445}
446446
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−
463447/// Configuration for auto pairs
464448#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
465449#[serde(rename_all = "kebab-case", deny_unknown_fields, untagged)]
helix-core/src/transaction.rs+14−73
@@ -1,7 +1,7 @@
11use ropey::RopeSlice;
22use smallvec::SmallVec;
33
4−use crate::{chars::char_is_word, Range, Rope, Selection, Tendril};
4+use crate::{Range, Rope, Selection, Tendril};
55use std::{borrow::Cow, iter::once};
66
77/// (from, to, replacement)
@@ -23,30 +23,6 @@ pub enum Operation {
2323pub enum Assoc {
2424 Before,
2525 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− }
5026}
5127
5228#[derive(Debug, Default, Clone, PartialEq, Eq)]
@@ -439,6 +415,8 @@ impl ChangeSet {
439415 map!(|pos, _| (old_end > pos).then_some(new_pos), i);
440416 }
441417 Insert(s) => {
418+ let ins = s.chars().count();
419+
442420 // a subsequent delete means a replace, consume it
443421 if let Some((_, Delete(len))) = iter.peek() {
444422 iter.next();
@@ -446,13 +424,13 @@ impl ChangeSet {
446424 old_end = old_pos + len;
447425 // in range of replaced text
448426 map!(
449− |pos, assoc: Assoc| (old_end > pos).then(|| {
427+ |pos, assoc| (old_end > pos).then(|| {
450428 // at point or tracking before
451− if pos == old_pos && assoc.stay_at_gaps() {
429+ if pos == old_pos || assoc == Assoc::Before {
452430 new_pos
453431 } else {
454432 // place to end of insert
455− new_pos + assoc.insert_offset(s)
433+ new_pos + ins
456434 }
457435 }),
458436 i
@@ -460,15 +438,20 @@ impl ChangeSet {
460438 } else {
461439 // at insert point
462440 map!(
463− |pos, assoc: Assoc| (old_pos == pos).then(|| {
441+ |pos, assoc| (old_pos == pos).then(|| {
464442 // 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+ }
466449 }),
467450 i
468451 );
469452 }
470453
471− new_pos += s.chars().count();
454+ new_pos += ins;
472455 }
473456 }
474457 old_pos = old_end;
@@ -901,48 +884,6 @@ mod test {
901884 let mut positions = [4, 2];
902885 cs.update_positions(positions.iter_mut().map(|pos| (pos, Assoc::After)));
903886 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);
946887 }
947888
948889 #[test]
helix-core/tests/indent.rs+2−2
@@ -210,6 +210,7 @@ fn test_treesitter_indent(
210210 let suggested_indent = treesitter_indent_for_pos(
211211 indent_query,
212212 &syntax,
213+ &indent_style,
213214 tab_width,
214215 indent_style.indent_width(tab_width),
215216 text,
@@ -217,8 +218,7 @@ fn test_treesitter_indent(
217218 text.line_to_char(i) + pos,
218219 false,
219220 )
220− .unwrap()
221− .to_string(&indent_style, tab_width);
221+ .unwrap();
222222 assert!(
223223 line.get_slice(..pos).map_or(false, |s| s == suggested_indent),
224224 "Wrong indentation for file {:?} on line {}:\n\"{}\" (original line)\n\"{}\" (suggested indentation)\n",
helix-dap/Cargo.toml+9−11
@@ -1,27 +1,25 @@
11[package]
22name = "helix-dap"
3+version = "0.6.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+edition = "2018"
6+license = "MPL-2.0"
37description = "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
10−repository.workspace = true
11−homepage.workspace = true
8+categories = ["editor"]
9+repository = "https://github.com/helix-editor/helix"
10+homepage = "https://helix-editor.com"
1211
1312# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
1413
1514[dependencies]
16−helix-core = { path = "../helix-core" }
17−
15+helix-core = { version = "0.6", path = "../helix-core" }
1816anyhow = "1.0"
1917log = "0.4"
2018serde = { version = "1.0", features = ["derive"] }
2119serde_json = "1.0"
2220thiserror = "1.0"
2321tokio = { 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"
2523
2624[dev-dependencies]
2725fern = "0.6"
helix-event/Cargo.toml+7−8
@@ -1,13 +1,12 @@
11[package]
22name = "helix-event"
3−version.workspace = true
4−authors.workspace = true
5−edition.workspace = true
6−license.workspace = true
7−rust-version.workspace = true
8−categories.workspace = true
9−repository.workspace = true
10−homepage.workspace = true
3+version = "0.6.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+edition = "2021"
6+license = "MPL-2.0"
7+categories = ["editor"]
8+repository = "https://github.com/helix-editor/helix"
9+homepage = "https://helix-editor.com"
1110
1211# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
1312
helix-loader/Cargo.toml+10−11
@@ -1,14 +1,13 @@
11[package]
22name = "helix-loader"
3−description = "Build bootstrapping for Helix crates"
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
10−repository.workspace = true
11−homepage.workspace = true
3+version = "0.6.0"
4+description = "A post-modern text editor."
5+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
6+edition = "2021"
7+license = "MPL-2.0"
8+categories = ["editor"]
9+repository = "https://github.com/helix-editor/helix"
10+homepage = "https://helix-editor.com"
1211
1312[[bin]]
1413name = "hx-loader"
@@ -20,9 +19,9 @@ serde = { version = "1.0", features = ["derive"] }
2019toml = "0.7"
2120etcetera = "0.8"
2221tree-sitter.workspace = true
23−once_cell = "1.19"
22+once_cell = "1.18"
2423log = "0.4"
25−which = "5.0.0"
24+which = "4.4"
2625
2726# TODO: these two should be on !wasm32 only
2827
helix-loader/build.rs+4−14
@@ -2,17 +2,7 @@ use std::borrow::Cow;
22use std::path::Path;
33use std::process::Command;
44
5−const MAJOR: &str = env!("CARGO_PKG_VERSION_MAJOR");
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−}
5+const VERSION: &str = include_str!("../VERSION");
166
177fn main() {
188 let git_hash = Command::new("git")
@@ -22,10 +12,9 @@ fn main() {
2212 .filter(|output| output.status.success())
2313 .and_then(|x| String::from_utf8(x.stdout).ok());
2414
25− let calver = get_calver();
2615 let version: Cow<_> = match &git_hash {
27− Some(git_hash) => format!("{} ({})", calver, &git_hash[..8]).into(),
28− None => calver.into(),
16+ Some(git_hash) => format!("{} ({})", VERSION, &git_hash[..8]).into(),
17+ None => VERSION.into(),
2918 };
3019
3120 println!(
@@ -33,6 +22,7 @@ fn main() {
3322 std::env::var("TARGET").unwrap()
3423 );
3524
25+ println!("cargo:rerun-if-changed=../VERSION");
3626 println!("cargo:rustc-env=VERSION_AND_GIT_HASH={}", version);
3727
3828 if git_hash.is_none() {
helix-lsp/Cargo.toml+14−15
@@ -1,32 +1,31 @@
11[package]
22name = "helix-lsp"
3+version = "0.6.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+edition = "2021"
6+license = "MPL-2.0"
37description = "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
10−repository.workspace = true
11−homepage.workspace = true
8+categories = ["editor"]
9+repository = "https://github.com/helix-editor/helix"
10+homepage = "https://helix-editor.com"
1211
1312# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
1413
1514[dependencies]
16−helix-core = { path = "../helix-core" }
17−helix-loader = { path = "../helix-loader" }
18−helix-parsec = { path = "../helix-parsec" }
15+helix-core = { version = "0.6", path = "../helix-core" }
16+helix-loader = { version = "0.6", path = "../helix-loader" }
17+helix-parsec = { version = "0.6", path = "../helix-parsec" }
1918
2019anyhow = "1.0"
2120futures-executor = "0.3"
2221futures-util = { version = "0.3", features = ["std", "async-await"], default-features = false }
23−globset = "0.4.14"
22+globset = "0.4.13"
2423log = "0.4"
25−lsp-types = { version = "0.95" }
24+lsp-types = { version = "0.94" }
2625serde = { version = "1.0", features = ["derive"] }
2726serde_json = "1.0"
2827thiserror = "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"] }
3029tokio-stream = "0.1.14"
31−which = "5.0.0"
30+which = "4.4"
3231parking_lot = "0.12.1"
helix-lsp/src/client.rs+9−83
@@ -401,22 +401,12 @@ impl Client {
401401 &self,
402402 params: R::Params,
403403 ) -> impl Future<Output = Result<Value>>
404− where
405− R::Params: serde::Serialize,
406− {
407− self.call_with_timeout::<R>(params, self.req_timeout)
408− }
409−
410− fn call_with_timeout<R: lsp::request::Request>(
411− &self,
412− params: R::Params,
413− timeout_secs: u64,
414− ) -> impl Future<Output = Result<Value>>
415404 where
416405 R::Params: serde::Serialize,
417406 {
418407 let server_tx = self.server_tx.clone();
419408 let id = self.next_request_id();
409+ let timeout_secs = self.req_timeout;
420410
421411 async move {
422412 use std::time::Duration;
@@ -558,11 +548,6 @@ impl Client {
558548 dynamic_registration: Some(true),
559549 relative_pattern_support: Some(false),
560550 }),
561− file_operations: Some(lsp::WorkspaceFileOperationsClientCapabilities {
562− will_rename: Some(true),
563− did_rename: Some(true),
564− ..Default::default()
565− }),
566551 ..Default::default()
567552 }),
568553 text_document: Some(lsp::TextDocumentClientCapabilities {
@@ -667,7 +652,6 @@ impl Client {
667652 version: Some(String::from(VERSION_AND_GIT_HASH)),
668653 }),
669654 locale: None, // TODO
670− work_done_progress_params: lsp::WorkDoneProgressParams::default(),
671655 };
672656
673657 self.request::<lsp::request::Initialize>(params).await
@@ -716,65 +700,6 @@ impl Client {
716700 })
717701 }
718702
719− pub fn prepare_file_rename(
720− &self,
721− old_uri: &lsp::Url,
722− new_uri: &lsp::Url,
723− ) -> Option<impl Future<Output = Result<lsp::WorkspaceEdit>>> {
724− let capabilities = self.capabilities.get().unwrap();
725−
726− // Return early if the server does not support willRename feature
727− match &capabilities.workspace {
728− Some(workspace) => match &workspace.file_operations {
729− Some(op) => {
730− op.will_rename.as_ref()?;
731− }
732− _ => return None,
733− },
734− _ => return None,
735− }
736−
737− let files = vec![lsp::FileRename {
738− old_uri: old_uri.to_string(),
739− new_uri: new_uri.to_string(),
740− }];
741− let request = self.call_with_timeout::<lsp::request::WillRenameFiles>(
742− lsp::RenameFilesParams { files },
743− 5,
744− );
745−
746− Some(async move {
747− let json = request.await?;
748− let response: Option<lsp::WorkspaceEdit> = serde_json::from_value(json)?;
749− Ok(response.unwrap_or_default())
750− })
751− }
752−
753− pub fn did_file_rename(
754− &self,
755− old_uri: &lsp::Url,
756− new_uri: &lsp::Url,
757− ) -> Option<impl Future<Output = std::result::Result<(), Error>>> {
758− let capabilities = self.capabilities.get().unwrap();
759−
760− // Return early if the server does not support DidRename feature
761− match &capabilities.workspace {
762− Some(workspace) => match &workspace.file_operations {
763− Some(op) => {
764− op.did_rename.as_ref()?;
765− }
766− _ => return None,
767− },
768− _ => return None,
769− }
770−
771− let files = vec![lsp::FileRename {
772− old_uri: old_uri.to_string(),
773− new_uri: new_uri.to_string(),
774− }];
775− Some(self.notify::<lsp::notification::DidRenameFiles>(lsp::RenameFilesParams { files }))
776− }
777−
778703 // -------------------------------------------------------------------------------------------
779704 // Text document
780705 // -------------------------------------------------------------------------------------------
@@ -970,19 +895,20 @@ impl Client {
970895 ) -> Option<impl Future<Output = Result<()>>> {
971896 let capabilities = self.capabilities.get().unwrap();
972897
973− let include_text = match &capabilities.text_document_sync.as_ref()? {
974− lsp::TextDocumentSyncCapability::Options(lsp::TextDocumentSyncOptions {
975− save: options,
898+ let include_text = match &capabilities.text_document_sync {
899+ Some(lsp::TextDocumentSyncCapability::Options(lsp::TextDocumentSyncOptions {
900+ save: Some(options),
976901 ..
977− }) => match options.as_ref()? {
902+ })) => match options {
978903 lsp::TextDocumentSyncSaveOptions::Supported(true) => false,
979904 lsp::TextDocumentSyncSaveOptions::SaveOptions(lsp_types::SaveOptions {
980905 include_text,
981906 }) => include_text.unwrap_or(false),
982− lsp::TextDocumentSyncSaveOptions::Supported(false) => return None,
907+ // Supported(false)
908+ _ => return None,
983909 },
984− // see: https://github.com/microsoft/language-server-protocol/issues/288
985− lsp::TextDocumentSyncCapability::Kind(..) => false,
910+ // unsupported
911+ _ => return None,
986912 };
987913
988914 Some(self.notify::<lsp::notification::DidSaveTextDocument>(
helix-parsec/Cargo.toml+7−8
@@ -1,14 +1,13 @@
11[package]
22name = "helix-parsec"
3+version = "0.6.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+edition = "2021"
6+license = "MPL-2.0"
37description = "Parser combinators for Helix"
8+categories = ["editor"]
9+repository = "https://github.com/helix-editor/helix"
10+homepage = "https://helix-editor.com"
411include = ["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
1312
1413[dependencies]
helix-term/Cargo.toml+21−25
@@ -1,16 +1,16 @@
11[package]
22name = "helix-term"
3+version = "0.6.0"
34description = "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"
411include = ["src/**/*", "README.md"]
512default-run = "hx"
6−version.workspace = true
7−authors.workspace = true
8−edition.workspace = true
9−license.workspace = true
10−rust-version.workspace = true
11−categories.workspace = true
12−repository.workspace = true
13−homepage.workspace = true
13+rust-version = "1.65"
1414
1515[features]
1616default = ["git"]
@@ -23,18 +23,18 @@ name = "hx"
2323path = "src/main.rs"
2424
2525[dependencies]
26−helix-core = { path = "../helix-core" }
27−helix-event = { path = "../helix-event" }
28−helix-view = { path = "../helix-view" }
29−helix-lsp = { path = "../helix-lsp" }
30−helix-dap = { path = "../helix-dap" }
31−helix-vcs = { path = "../helix-vcs" }
32−helix-loader = { path = "../helix-loader" }
26+helix-core = { version = "0.6", path = "../helix-core" }
27+helix-event = { version = "0.6", path = "../helix-event" }
28+helix-view = { version = "0.6", path = "../helix-view" }
29+helix-lsp = { version = "0.6", path = "../helix-lsp" }
30+helix-dap = { version = "0.6", path = "../helix-dap" }
31+helix-vcs = { version = "0.6", path = "../helix-vcs" }
32+helix-loader = { version = "0.6", path = "../helix-loader" }
3333
3434anyhow = "1"
35−once_cell = "1.19"
35+once_cell = "1.18"
3636
37−which = "5.0.0"
37+which = "4.4"
3838
3939tokio = { version = "1", features = ["rt", "rt-multi-thread", "io-util", "io-std", "time", "process", "macros", "fs", "parking_lot"] }
4040tui = { path = "../helix-tui", package = "helix-tui", default-features = false, features = ["crossterm"] }
@@ -57,10 +57,6 @@ pulldown-cmark = { version = "0.9", default-features = false }
5757# file type detection
5858content_inspector = "0.2.4"
5959
60−# opening URLs
61−open = "5.0.1"
62−url = "2.5.0"
63−
6460# config
6561toml = "0.7"
6662
@@ -68,18 +64,18 @@ serde_json = "1.0"
6864serde = { version = "1.0", features = ["derive"] }
6965
7066# ripgrep for global search
71−grep-regex = "0.1.12"
72−grep-searcher = "0.1.13"
67+grep-regex = "0.1.11"
68+grep-searcher = "0.1.11"
7369
7470[target.'cfg(not(windows))'.dependencies] # https://github.com/vorner/signal-hook/issues/100
7571signal-hook-tokio = { version = "0.3", features = ["futures-v0_3"] }
76−libc = "0.2.151"
72+libc = "0.2.149"
7773
7874[target.'cfg(target_os = "macos")'.dependencies]
7975crossterm = { version = "0.27", features = ["event-stream", "use-dev-tty"] }
8076
8177[build-dependencies]
82−helix-loader = { path = "../helix-loader" }
78+helix-loader = { version = "0.6", path = "../helix-loader" }
8379
8480[dev-dependencies]
8581smallvec = "1.11"
helix-term/src/application.rs+46−95
@@ -1,7 +1,6 @@
11use arc_swap::{access::Map, ArcSwap};
22use futures_util::Stream;
33use helix_core::{
4− chars::char_is_word,
54 diagnostic::{DiagnosticTag, NumberOrString},
65 path::get_relative_path,
76 pos_at_coords, syntax, Selection,
@@ -163,19 +162,14 @@ impl Application {
163162 // Unset path to prevent accidentally saving to the original tutor file.
164163 doc_mut!(editor).set_path(None);
165164 } else if !args.files.is_empty() {
166− let mut files_it = args.files.into_iter().peekable();
167−
168− // If the first file is a directory, skip it and open a picker
169− if let Some((first, _)) = files_it.next_if(|(p, _)| p.is_dir()) {
170− let picker = ui::file_picker(first, &config.load().editor);
165+ if args.open_cwd {
166+ // NOTE: The working directory is already set to args.files[0] in main()
167+ editor.new_file(Action::VerticalSplit);
168+ let picker = ui::file_picker(".".into(), &config.load().editor);
171169 compositor.push(Box::new(overlaid(picker)));
172− }
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;
177− for (file, pos) in files_it {
178− nr_of_files += 1;
170+ } else {
171+ let nr_of_files = args.files.len();
172+ for (i, (file, pos)) in args.files.into_iter().enumerate() {
179173 if file.is_dir() {
180174 return Err(anyhow::anyhow!(
181175 "expected a path to file, found a directory. (to open a directory pass it as first argument)"
@@ -187,7 +181,7 @@ impl Application {
187181 // option. If neither of those two arguments are passed
188182 // in, just load the files normally.
189183 let action = match args.split {
190− _ if nr_of_files == 1 => Action::VerticalSplit,
184+ _ if i == 0 => Action::VerticalSplit,
191185 Some(Layout::Vertical) => Action::VerticalSplit,
192186 Some(Layout::Horizontal) => Action::HorizontalSplit,
193187 None => Action::Load,
@@ -214,8 +208,6 @@ impl Application {
214208 // does not affect views without pos since it is at the top
215209 let (view, doc) = current!(editor);
216210 align_view(doc, view, Align::Center);
217− } else {
218− editor.new_file(Action::VerticalSplit);
219211 }
220212 } else if stdin().is_tty() || cfg!(feature = "integration") {
221213 editor.new_file(Action::VerticalSplit);
@@ -718,7 +710,7 @@ impl Application {
718710 ));
719711 }
720712 }
721− Notification::PublishDiagnostics(mut params) => {
713+ Notification::PublishDiagnostics(params) => {
722714 let path = match params.uri.to_file_path() {
723715 Ok(path) => path,
724716 Err(_) => {
@@ -732,69 +724,31 @@ impl Application {
732724 return;
733725 }
734726 let offset_encoding = language_server.offset_encoding();
735− // have to inline the function because of borrow checking...
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 {
740− if version != doc.version() {
741− log::info!("Version ({version}) is out of date for {path:?} (expected ({}), dropping PublishDiagnostic notification", doc.version());
742− return false;
743− }
727+ let doc = self.editor.document_by_path_mut(&path).filter(|doc| {
728+ if let Some(version) = params.version {
729+ if version != doc.version() {
730+ log::info!("Version ({version}) is out of date for {path:?} (expected ({}), dropping PublishDiagnostic notification", doc.version());
731+ return false;
744732 }
745− true
746− });
733+ }
734+
735+ true
736+ });
747737
748738 if let Some(doc) = doc {
749− let lang_conf = doc.language.clone();
750− let text = doc.text().clone();
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− }
739+ let lang_conf = doc.language_config();
740+ let text = doc.text();
782741
783− let unchaged_diag_sources = &unchaged_diag_sources_;
784− let diagnostics =
785− params.diagnostics.iter().filter_map(move |diagnostic| {
742+ let diagnostics = params
743+ .diagnostics
744+ .iter()
745+ .filter_map(|diagnostic| {
786746 use helix_core::diagnostic::{Diagnostic, Range, Severity::*};
787747 use lsp::DiagnosticSeverity;
788748
789− if diagnostic.source.as_ref().map_or(false, |source| {
790− unchaged_diag_sources.contains(source)
791− }) {
792− return None;
793− }
794−
795749 // TODO: convert inside server
796750 let start = if let Some(start) = lsp_pos_to_pos(
797− &text,
751+ text,
798752 diagnostic.range.start,
799753 offset_encoding,
800754 ) {
@@ -805,13 +759,14 @@ impl Application {
805759 };
806760
807761 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)
809763 {
810764 end
811765 } else {
812766 log::warn!("lsp position out of bounds - {:?}", diagnostic);
813767 return None;
814768 };
769+
815770 let severity =
816771 diagnostic.severity.map(|severity| match severity {
817772 DiagnosticSeverity::ERROR => Error,
@@ -824,7 +779,7 @@ impl Application {
824779 ),
825780 });
826781
827− if let Some(lang_conf) = &lang_conf {
782+ if let Some(lang_conf) = lang_conf {
828783 if let Some(severity) = severity {
829784 if severity < lang_conf.diagnostic_severity {
830785 return None;
@@ -863,17 +818,8 @@ impl Application {
863818 Vec::new()
864819 };
865820
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−
872821 Some(Diagnostic {
873822 range: Range { start, end },
874− ends_at_word,
875− starts_at_word,
876− zero_width: start == end,
877823 line: diagnostic.range.start.line as usize,
878824 message: diagnostic.message.clone(),
879825 severity,
@@ -883,33 +829,38 @@ impl Application {
883829 data: diagnostic.data.clone(),
884830 language_server_id: server_id,
885831 })
886− });
832+ })
833+ .collect();
887834
888− doc.replace_diagnostics(diagnostics, unchaged_diag_sources, server_id);
835+ doc.replace_diagnostics(diagnostics, server_id);
889836 }
890837
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();
892843
893844 // Insert the original lsp::Diagnostics here because we may have no open document
894845 // for diagnosic message and so we can't calculate the exact position.
895846 // 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) {
897848 Entry::Occupied(o) => {
898849 let current_diagnostics = o.into_mut();
899850 // there may entries of other language servers, which is why we can't overwrite the whole entry
900851 current_diagnostics.retain(|(_, lsp_id)| *lsp_id != server_id);
901− current_diagnostics.extend(diagnostics);
902− current_diagnostics
852+ current_diagnostics.append(&mut diagnostics);
903853 // 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);
904862 }
905− Entry::Vacant(v) => v.insert(diagnostics.collect()),
906863 };
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− });
913864 }
914865 Notification::ShowMessage(params) => {
915866 log::warn!("unhandled window/showMessage: {:?}", params);
helix-term/src/args.rs+1
@@ -17,6 +17,7 @@ pub struct Args {
1717 pub log_file: Option<PathBuf>,
1818 pub config_file: Option<PathBuf>,
1919 pub files: Vec<(PathBuf, Position)>,
20+ pub open_cwd: bool,
2021 pub working_directory: Option<PathBuf>,
2122}
2223
helix-term/src/commands.rs+32−121
@@ -60,13 +60,8 @@ use crate::{
6060
6161use crate::job::{self, Jobs};
6262use futures_util::{stream::FuturesUnordered, TryStreamExt};
63−use std::{
64− collections::{HashMap, HashSet},
65− fmt,
66− future::Future,
67− io::Read,
68− num::NonZeroUsize,
69−};
63+use std::{collections::HashMap, fmt, future::Future};
64+use std::{collections::HashSet, num::NonZeroUsize};
7065
7166use std::{
7267 borrow::Cow,
@@ -75,7 +70,6 @@ use std::{
7570
7671use once_cell::sync::Lazy;
7772use serde::de::{self, Deserialize, Deserializer};
78−use url::Url;
7973
8074use grep_regex::RegexMatcherBuilder;
8175use grep_searcher::{sinks, BinaryDetection, SearcherBuilder};
@@ -337,7 +331,7 @@ impl MappableCommand {
337331 goto_implementation, "Goto implementation",
338332 goto_file_start, "Goto line number <n> else file start",
339333 goto_file_end, "Goto file end",
340− goto_file, "Goto files/URLs in selection",
334+ goto_file, "Goto files in selection",
341335 goto_file_hsplit, "Goto files in selection (hsplit)",
342336 goto_file_vsplit, "Goto files in selection (vsplit)",
343337 goto_reference, "Goto references",
@@ -990,7 +984,6 @@ fn align_selections(cx: &mut Context) {
990984
991985 let transaction = Transaction::change(doc.text(), changes.into_iter());
992986 doc.apply(&transaction, view.id);
993− exit_select_mode(cx);
994987}
995988
996989fn goto_window(cx: &mut Context, align: Align) {
@@ -1196,53 +1189,10 @@ fn goto_file_impl(cx: &mut Context, action: Action) {
11961189 .to_string(),
11971190 );
11981191 }
1199−
12001192 for sel in paths {
12011193 let p = sel.trim();
1202− 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);
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());
1194+ if !p.is_empty() {
1195+ let path = &rel_path.join(p);
12461196 if path.is_dir() {
12471197 let picker = ui::file_picker(path.into(), &cx.editor.config());
12481198 cx.push_layer(Box::new(overlaid(picker)));
@@ -1253,23 +1203,6 @@ fn open_url(cx: &mut Context, url: Url, action: Action) {
12531203 }
12541204}
12551205
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−
12731206fn extend_word_impl<F>(cx: &mut Context, extend_fn: F)
12741207where
12751208 F: Fn(RopeSlice, Range, usize) -> Range,
@@ -1318,7 +1251,7 @@ fn extend_next_long_word_end(cx: &mut Context) {
13181251 extend_word_impl(cx, movement::move_next_long_word_end)
13191252}
13201253
1321−/// Separate branch to find_char designed only for `<ret>` char.
1254+/// Separate branch to find_char designed only for <ret> char.
13221255//
13231256// This is necessary because the one document can have different line endings inside. And we
13241257// cannot predict what character to find when <ret> is pressed. On the current line it can be `lf`
@@ -1594,7 +1527,6 @@ where
15941527 });
15951528
15961529 doc.apply(&transaction, view.id);
1597− exit_select_mode(cx);
15981530}
15991531
16001532fn switch_case(cx: &mut Context) {
@@ -3053,7 +2985,6 @@ fn insert_with_indent(cx: &mut Context, cursor_fallback: IndentFallbackPos) {
30532985 let indent = indent::indent_for_newline(
30542986 language_config,
30552987 syntax,
3056− &doc.config.load().indent_heuristic,
30572988 &doc.indent_style,
30582989 tab_width,
30592990 text,
@@ -3182,7 +3113,6 @@ fn open(cx: &mut Context, open: Open) {
31823113 let indent = indent::indent_for_newline(
31833114 doc.language_config(),
31843115 doc.syntax(),
3185− &doc.config.load().indent_heuristic,
31863116 &doc.indent_style,
31873117 doc.tab_width(),
31883118 text,
@@ -3722,7 +3652,6 @@ pub mod insert {
37223652 let indent = indent::indent_for_newline(
37233653 doc.language_config(),
37243654 doc.syntax(),
3725− &doc.config.load().indent_heuristic,
37263655 &doc.indent_style,
37273656 doc.tab_width(),
37283657 text,
@@ -3968,12 +3897,12 @@ fn yank(cx: &mut Context) {
39683897}
39693898
39703899fn yank_to_clipboard(cx: &mut Context) {
3971− yank_impl(cx.editor, '+');
3900+ yank_impl(cx.editor, '*');
39723901 exit_select_mode(cx);
39733902}
39743903
39753904fn yank_to_primary_clipboard(cx: &mut Context) {
3976− yank_impl(cx.editor, '*');
3905+ yank_impl(cx.editor, '+');
39773906 exit_select_mode(cx);
39783907}
39793908
@@ -4030,13 +3959,13 @@ fn yank_joined(cx: &mut Context) {
40303959
40313960fn yank_joined_to_clipboard(cx: &mut Context) {
40323961 let line_ending = doc!(cx.editor).line_ending;
4033− yank_joined_impl(cx.editor, line_ending.as_str(), '+');
3962+ yank_joined_impl(cx.editor, line_ending.as_str(), '*');
40343963 exit_select_mode(cx);
40353964}
40363965
40373966fn yank_joined_to_primary_clipboard(cx: &mut Context) {
40383967 let line_ending = doc!(cx.editor).line_ending;
4039− yank_joined_impl(cx.editor, line_ending.as_str(), '*');
3968+ yank_joined_impl(cx.editor, line_ending.as_str(), '+');
40403969 exit_select_mode(cx);
40413970}
40423971
@@ -4053,12 +3982,12 @@ fn yank_primary_selection_impl(editor: &mut Editor, register: char) {
40533982}
40543983
40553984fn yank_main_selection_to_clipboard(cx: &mut Context) {
4056− yank_primary_selection_impl(cx.editor, '+');
3985+ yank_primary_selection_impl(cx.editor, '*');
40573986 exit_select_mode(cx);
40583987}
40593988
40603989fn yank_main_selection_to_primary_clipboard(cx: &mut Context) {
4061− yank_primary_selection_impl(cx.editor, '*');
3990+ yank_primary_selection_impl(cx.editor, '+');
40623991 exit_select_mode(cx);
40633992}
40643993
@@ -4156,27 +4085,22 @@ pub(crate) fn paste_bracketed_value(cx: &mut Context, contents: String) {
41564085 };
41574086 let (view, doc) = current!(cx.editor);
41584087 paste_impl(&[contents], doc, view, paste, count, cx.editor.mode);
4159− exit_select_mode(cx);
41604088}
41614089
41624090fn paste_clipboard_after(cx: &mut Context) {
4163− paste(cx.editor, '+', Paste::After, cx.count());
4164− exit_select_mode(cx);
4091+ paste(cx.editor, '*', Paste::After, cx.count());
41654092}
41664093
41674094fn paste_clipboard_before(cx: &mut Context) {
4168− paste(cx.editor, '+', Paste::Before, cx.count());
4169− exit_select_mode(cx);
4095+ paste(cx.editor, '*', Paste::Before, cx.count());
41704096}
41714097
41724098fn paste_primary_clipboard_after(cx: &mut Context) {
4173− paste(cx.editor, '*', Paste::After, cx.count());
4174− exit_select_mode(cx);
4099+ paste(cx.editor, '+', Paste::After, cx.count());
41754100}
41764101
41774102fn paste_primary_clipboard_before(cx: &mut Context) {
4178− paste(cx.editor, '*', Paste::Before, cx.count());
4179− exit_select_mode(cx);
4103+ paste(cx.editor, '+', Paste::Before, cx.count());
41804104}
41814105
41824106fn replace_with_yanked(cx: &mut Context) {
@@ -4214,13 +4138,11 @@ fn replace_with_yanked_impl(editor: &mut Editor, register: char, count: usize) {
42144138}
42154139
42164140fn replace_selections_with_clipboard(cx: &mut Context) {
4217− replace_with_yanked_impl(cx.editor, '+', cx.count());
4218− exit_select_mode(cx);
4141+ replace_with_yanked_impl(cx.editor, '*', cx.count());
42194142}
42204143
42214144fn replace_selections_with_primary_clipboard(cx: &mut Context) {
4222− replace_with_yanked_impl(cx.editor, '*', cx.count());
4223− exit_select_mode(cx);
4145+ replace_with_yanked_impl(cx.editor, '+', cx.count());
42244146}
42254147
42264148fn paste(editor: &mut Editor, register: char, pos: Paste, count: usize) {
@@ -4238,7 +4160,6 @@ fn paste_after(cx: &mut Context) {
42384160 Paste::After,
42394161 cx.count(),
42404162 );
4241− exit_select_mode(cx);
42424163}
42434164
42444165fn paste_before(cx: &mut Context) {
@@ -4248,7 +4169,6 @@ fn paste_before(cx: &mut Context) {
42484169 Paste::Before,
42494170 cx.count(),
42504171 );
4251− exit_select_mode(cx);
42524172}
42534173
42544174fn get_lines(doc: &Document, view_id: ViewId) -> Vec<usize> {
@@ -4287,7 +4207,6 @@ fn indent(cx: &mut Context) {
42874207 }),
42884208 );
42894209 doc.apply(&transaction, view.id);
4290− exit_select_mode(cx);
42914210}
42924211
42934212fn unindent(cx: &mut Context) {
@@ -4327,7 +4246,6 @@ fn unindent(cx: &mut Context) {
43274246 let transaction = Transaction::change(doc.text(), changes.into_iter());
43284247
43294248 doc.apply(&transaction, view.id);
4330− exit_select_mode(cx);
43314249}
43324250
43334251fn format_selections(cx: &mut Context) {
@@ -4394,9 +4312,10 @@ fn join_selections_impl(cx: &mut Context, select_space: bool) {
43944312 use movement::skip_while;
43954313 let (view, doc) = current!(cx.editor);
43964314 let text = doc.text();
4397− let slice = text.slice(..);
4315+ let slice = doc.text().slice(..);
43984316
43994317 let mut changes = Vec::new();
4318+ let fragment = Tendril::from(" ");
44004319
44014320 for selection in doc.selection(view.id) {
44024321 let (start, mut end) = selection.line_range(slice);
@@ -4412,13 +4331,9 @@ fn join_selections_impl(cx: &mut Context, select_space: bool) {
44124331 let mut end = text.line_to_char(line + 1);
44134332 end = skip_while(slice, end, |ch| matches!(ch, ' ' | '\t')).unwrap_or(end);
44144333
4415− let separator = if end == line_end_char_index(&slice, line + 1) {
4416− // the joining line contains only space-characters => don't include a whitespace when joining
4417− None
4418− } else {
4419− Some(Tendril::from(" "))
4420− };
4421− changes.push((start, end, separator));
4334+ // need to skip from start, not end
4335+ let change = (start, end, Some(fragment.clone()));
4336+ changes.push(change);
44224337 }
44234338 }
44244339
@@ -4430,6 +4345,9 @@ fn join_selections_impl(cx: &mut Context, select_space: bool) {
44304345 changes.sort_unstable_by_key(|(from, _to, _text)| *from);
44314346 changes.dedup();
44324347
4348+ // TODO: joining multiple empty lines should be replaced by a single space.
4349+ // need to merge change ranges that touch
4350+
44334351 // select inserted spaces
44344352 let transaction = if select_space {
44354353 let ranges: SmallVec<_> = changes
@@ -4441,9 +4359,9 @@ fn join_selections_impl(cx: &mut Context, select_space: bool) {
44414359 })
44424360 .collect();
44434361 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)
44454363 } else {
4446− Transaction::change(text, changes.into_iter())
4364+ Transaction::change(doc.text(), changes.into_iter())
44474365 };
44484366
44494367 doc.apply(&transaction, view.id);
@@ -5609,18 +5527,12 @@ fn shell(cx: &mut compositor::Context, cmd: &str, behavior: &ShellBehavior) {
56095527 };
56105528
56115529 // These `usize`s cannot underflow because selection ranges cannot overlap.
5612− let anchor = to
5613− .checked_add_signed(offset)
5614− .expect("Selection ranges cannot overlap")
5615− .checked_sub(deleted_len)
5616− .expect("Selection ranges cannot overlap");
5530+ // Once the MSRV is 1.66.0 (mixed_integer_ops is stabilized), we can use checked
5531+ // arithmetic to assert this.
5532+ let anchor = (to as isize + offset - deleted_len as isize) as usize;
56175533 let new_range = Range::new(anchor, anchor + output_len).with_direction(range.direction());
56185534 ranges.push(new_range);
5619− offset = offset
5620− .checked_add_unsigned(output_len)
5621− .expect("Selection ranges cannot overlap")
5622− .checked_sub_unsigned(deleted_len)
5623− .expect("Selection ranges cannot overlap");
5535+ offset = offset + output_len as isize - deleted_len as isize;
56245536
56255537 changes.push((from, to, Some(output)));
56265538 }
@@ -5759,7 +5671,6 @@ fn increment_impl(cx: &mut Context, increment_direction: IncrementDirection) {
57595671 let transaction = Transaction::change(doc.text(), changes.into_iter());
57605672 let transaction = transaction.with_selection(new_selection);
57615673 doc.apply(&transaction, view.id);
5762− exit_select_mode(cx);
57635674 }
57645675}
57655676
helix-term/src/commands/dap.rs+2−7
@@ -8,7 +8,7 @@ use dap::{StackFrame, Thread, ThreadStates};
88use helix_core::syntax::{DebugArgumentValue, DebugConfigCompletion, DebugTemplate};
99use helix_dap::{self as dap, Client};
1010use helix_lsp::block_on;
11−use helix_view::{editor::Breakpoint, graphics::Margin};
11+use helix_view::editor::Breakpoint;
1212
1313use serde_json::{to_value, Value};
1414use tokio_stream::wrappers::UnboundedReceiverStream;
@@ -581,12 +581,7 @@ pub fn dap_variables(cx: &mut Context) {
581581 }
582582
583583 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);
590585 cx.replace_or_push_layer("dap-variables", popup);
591586}
592587
helix-term/src/commands/lsp.rs+2−12
@@ -23,7 +23,6 @@ use helix_core::{
2323use helix_view::{
2424 document::{DocumentInlayHints, DocumentInlayHintsId, Mode},
2525 editor::Action,
26− graphics::Margin,
2726 theme::Style,
2827 Document, View,
2928};
@@ -50,7 +49,7 @@ use std::{
5049/// If there is no configured language server that supports the feature, this displays a status message.
5150/// Using this macro in a context where the editor automatically queries the LSP
5251/// (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.
5453#[macro_export]
5554macro_rules! language_server_with_feature {
5655 ($editor:expr, $doc:expr, $feature:expr) => {{
@@ -745,16 +744,7 @@ pub fn code_action(cx: &mut Context) {
745744 });
746745 picker.move_down(); // pre-select the first item
747746
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)
755− .with_scrollbar(false)
756− .margin(margin);
757−
747+ let popup = Popup::new("code-action", picker).with_scrollbar(false);
758748 compositor.replace_or_push("code-action", popup);
759749 };
760750
helix-term/src/commands/typed.rs+16−97
@@ -6,9 +6,7 @@ use crate::job::Job;
66use super::*;
77
88use helix_core::fuzzy::fuzzy_match;
9−use helix_core::indent::MAX_INDENT;
10−use helix_core::{encoding, line_ending, path::get_canonicalized_path, shellwords::Shellwords};
11−use helix_lsp::{OffsetEncoding, Url};
9+use helix_core::{encoding, line_ending, shellwords::Shellwords};
1210use helix_view::document::DEFAULT_LANGUAGE_NAME;
1311use helix_view::editor::{Action, CloseError, ConfigEvent};
1412use serde_json::Value;
@@ -477,7 +475,8 @@ fn set_indent_style(
477475 cx.editor.set_status(match style {
478476 Tabs => "tabs".to_owned(),
479477 Spaces(1) => "1 space".to_owned(),
480− Spaces(n) => format!("{} spaces", n),
478+ Spaces(n) if (2..=8).contains(&n) => format!("{} spaces", n),
479+ _ => unreachable!(), // Shouldn't happen.
481480 });
482481 return Ok(());
483482 }
@@ -489,7 +488,7 @@ fn set_indent_style(
489488 Some(arg) => arg
490489 .parse::<u8>()
491490 .ok()
492− .filter(|n| (1..=MAX_INDENT).contains(n))
491+ .filter(|n| (1..=8).contains(n))
493492 .map(Spaces),
494493 _ => None,
495494 };
@@ -574,6 +573,7 @@ fn set_line_ending(
574573
575574 Ok(())
576575}
576+
577577fn earlier(
578578 cx: &mut compositor::Context,
579579 args: &[Cow<str>],
@@ -921,7 +921,7 @@ fn yank_main_selection_to_clipboard(
921921 return Ok(());
922922 }
923923
924− yank_primary_selection_impl(cx.editor, '+');
924+ yank_primary_selection_impl(cx.editor, '*');
925925 Ok(())
926926}
927927
@@ -956,7 +956,7 @@ fn yank_joined_to_clipboard(
956956 let doc = doc!(cx.editor);
957957 let default_sep = Cow::Borrowed(doc.line_ending.as_str());
958958 let separator = args.first().unwrap_or(&default_sep);
959− yank_joined_impl(cx.editor, separator, '+');
959+ yank_joined_impl(cx.editor, separator, '*');
960960 Ok(())
961961}
962962
@@ -969,7 +969,7 @@ fn yank_main_selection_to_primary_clipboard(
969969 return Ok(());
970970 }
971971
972− yank_primary_selection_impl(cx.editor, '*');
972+ yank_primary_selection_impl(cx.editor, '+');
973973 Ok(())
974974}
975975
@@ -985,7 +985,7 @@ fn yank_joined_to_primary_clipboard(
985985 let doc = doc!(cx.editor);
986986 let default_sep = Cow::Borrowed(doc.line_ending.as_str());
987987 let separator = args.first().unwrap_or(&default_sep);
988− yank_joined_impl(cx.editor, separator, '*');
988+ yank_joined_impl(cx.editor, separator, '+');
989989 Ok(())
990990}
991991
@@ -998,7 +998,7 @@ fn paste_clipboard_after(
998998 return Ok(());
999999 }
10001000
1001− paste(cx.editor, '+', Paste::After, 1);
1001+ paste(cx.editor, '*', Paste::After, 1);
10021002 Ok(())
10031003}
10041004
@@ -1011,7 +1011,7 @@ fn paste_clipboard_before(
10111011 return Ok(());
10121012 }
10131013
1014− paste(cx.editor, '+', Paste::Before, 1);
1014+ paste(cx.editor, '*', Paste::Before, 1);
10151015 Ok(())
10161016}
10171017
@@ -1024,7 +1024,7 @@ fn paste_primary_clipboard_after(
10241024 return Ok(());
10251025 }
10261026
1027− paste(cx.editor, '*', Paste::After, 1);
1027+ paste(cx.editor, '+', Paste::After, 1);
10281028 Ok(())
10291029}
10301030
@@ -1037,7 +1037,7 @@ fn paste_primary_clipboard_before(
10371037 return Ok(());
10381038 }
10391039
1040− paste(cx.editor, '*', Paste::Before, 1);
1040+ paste(cx.editor, '+', Paste::Before, 1);
10411041 Ok(())
10421042}
10431043
@@ -1050,7 +1050,7 @@ fn replace_selections_with_clipboard(
10501050 return Ok(());
10511051 }
10521052
1053− replace_with_yanked_impl(cx.editor, '+', 1);
1053+ replace_with_yanked_impl(cx.editor, '*', 1);
10541054 Ok(())
10551055}
10561056
@@ -1063,7 +1063,7 @@ fn replace_selections_with_primary_clipboard(
10631063 return Ok(());
10641064 }
10651065
1066− replace_with_yanked_impl(cx.editor, '*', 1);
1066+ replace_with_yanked_impl(cx.editor, '+', 1);
10671067 Ok(())
10681068}
10691069
@@ -2408,80 +2408,6 @@ fn redraw(
24082408 Ok(())
24092409}
24102410
2411−fn move_buffer(
2412− cx: &mut compositor::Context,
2413− args: &[Cow<str>],
2414− event: PromptEvent,
2415−) -> anyhow::Result<()> {
2416− if event != PromptEvent::Validate {
2417− return Ok(());
2418− }
2419−
2420− ensure!(args.len() == 1, format!(":move takes one argument"));
2421− let doc = doc!(cx.editor);
2422−
2423− let new_path = get_canonicalized_path(&PathBuf::from(args.first().unwrap().to_string()));
2424− let old_path = doc
2425− .path()
2426− .ok_or_else(|| anyhow!("Scratch buffer cannot be moved. Use :write instead"))?
2427− .clone();
2428− let old_path_as_url = doc.url().unwrap();
2429− let new_path_as_url = Url::from_file_path(&new_path).unwrap();
2430−
2431− let edits: Vec<(
2432− helix_lsp::Result<helix_lsp::lsp::WorkspaceEdit>,
2433− OffsetEncoding,
2434− String,
2435− )> = doc
2436− .language_servers()
2437− .map(|lsp| {
2438− (
2439− lsp.prepare_file_rename(&old_path_as_url, &new_path_as_url),
2440− lsp.offset_encoding(),
2441− lsp.name().to_owned(),
2442− )
2443− })
2444− .filter(|(f, _, _)| f.is_some())
2445− .map(|(f, encoding, name)| (helix_lsp::block_on(f.unwrap()), encoding, name))
2446− .collect();
2447−
2448− for (lsp_reply, encoding, name) in edits {
2449− match lsp_reply {
2450− Ok(edit) => {
2451− if let Err(e) = apply_workspace_edit(cx.editor, encoding, &edit) {
2452− log::error!(
2453− ":move command failed to apply edits from lsp {}: {:?}",
2454− name,
2455− e
2456− );
2457− };
2458− }
2459− Err(e) => {
2460− log::error!("LSP {} failed to treat willRename request: {:?}", name, e);
2461− }
2462− };
2463− }
2464−
2465− let doc = doc_mut!(cx.editor);
2466−
2467− doc.set_path(Some(new_path.as_path()));
2468− if let Err(e) = std::fs::rename(&old_path, &new_path) {
2469− doc.set_path(Some(old_path.as_path()));
2470− bail!("Could not move file: {}", e);
2471− };
2472−
2473− doc.language_servers().for_each(|lsp| {
2474− lsp.did_file_rename(&old_path_as_url, &new_path_as_url);
2475− });
2476−
2477− cx.editor
2478− .language_servers
2479− .file_event_handler
2480− .file_changed(new_path);
2481−
2482− Ok(())
2483−}
2484−
24852411pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[
24862412 TypableCommand {
24872413 name: "quit",
@@ -2605,7 +2531,7 @@ pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[
26052531 TypableCommand {
26062532 name: "indent-style",
26072533 aliases: &[],
2608− doc: "Set the indentation style for editing. ('t' for tabs or 1-16 for number of spaces.)",
2534+ doc: "Set the indentation style for editing. ('t' for tabs or 1-8 for number of spaces.)",
26092535 fun: set_indent_style,
26102536 signature: CommandSignature::none(),
26112537 },
@@ -3082,13 +3008,6 @@ pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[
30823008 fun: redraw,
30833009 signature: CommandSignature::none(),
30843010 },
3085− TypableCommand {
3086− name: "move",
3087− aliases: &[],
3088− doc: "Move the current buffer and its corresponding file to a different path",
3089− fun: move_buffer,
3090− signature: CommandSignature::positional(&[completers::filename]),
3091− },
30923011];
30933012
30943013pub static TYPABLE_COMMAND_MAP: Lazy<HashMap<&'static str, &'static TypableCommand>> =
helix-term/src/main.rs+5−7
@@ -116,18 +116,16 @@ FLAGS:
116116
117117 setup_logging(args.verbosity).context("failed to initialize logging")?;
118118
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−
124119 // NOTE: Set the working directory early so the correct configuration is loaded. Be aware that
125120 // Application::new() depends on this logic so it must be updated if this changes.
126121 if let Some(path) = &args.working_directory {
127122 helix_loader::set_current_working_dir(path)?;
128− } else 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
123+ }
124+
125+ // If the first file is a directory, it will be the working directory and a file picker will be opened
126+ if let Some((path, _)) = args.files.first().filter(|p| p.0.is_dir()) {
130127 helix_loader::set_current_working_dir(path)?;
128+ args.open_cwd = true; // Signal Application that we want to open the picker on "."
131129 }
132130
133131 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};
22use helix_view::{
33 document::SavePoint,
44 editor::CompleteAction,
5− graphics::Margin,
65 theme::{Modifier, Style},
76 ViewId,
87};
@@ -327,18 +326,9 @@ impl Completion {
327326 }
328327 };
329328 });
330−
331− let margin = if editor.menu_border() {
332− Margin::vertical(1)
333− } else {
334− Margin::none()
335− };
336−
337329 let popup = Popup::new(Self::ID, menu)
338330 .with_scrollbar(false)
339− .ignore_escape_key(true)
340− .margin(margin);
341−
331+ .ignore_escape_key(true);
342332 let mut completion = Self {
343333 popup,
344334 start_offset,
@@ -579,12 +569,6 @@ impl Component for Completion {
579569 // clear area
580570 let background = cx.editor.theme.get("ui.popup");
581571 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−
588572 markdown_doc.render(doc_area, surface, cx);
589573 }
590574}
helix-term/src/ui/document.rs+24−60
@@ -97,8 +97,7 @@ pub fn render_document(
9797 doc: &Document,
9898 offset: ViewPosition,
9999 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>,
102101 theme: &Theme,
103102 line_decoration: &mut [Box<dyn LineDecoration + '_>],
104103 translated_positions: &mut [TranslatedPosition],
@@ -110,8 +109,7 @@ pub fn render_document(
110109 offset,
111110 &doc.text_format(viewport.width, Some(theme)),
112111 doc_annotations,
113− syntax_highlight_iter,
114− overlay_highlight_iter,
112+ highlight_iter,
115113 theme,
116114 line_decoration,
117115 translated_positions,
@@ -159,8 +157,7 @@ pub fn render_text<'t>(
159157 offset: ViewPosition,
160158 text_fmt: &TextFormat,
161159 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>,
164161 theme: &Theme,
165162 line_decorations: &mut [Box<dyn LineDecoration + '_>],
166163 translated_positions: &mut [TranslatedPosition],
@@ -181,16 +178,10 @@ pub fn render_text<'t>(
181178
182179 let (mut formatter, mut first_visible_char_idx) =
183180 DocumentFormatter::new_at_prev_checkpoint(text, text_fmt, text_annotations, offset.anchor);
184− let mut syntax_styles = StyleIter {
181+ let mut styles = StyleIter {
185182 text_style: renderer.text_style,
186183 active_highlights: Vec::with_capacity(64),
187− highlight_iter: syntax_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,
184+ highlight_iter,
194185 theme,
195186 };
196187
@@ -202,10 +193,7 @@ pub fn render_text<'t>(
202193 };
203194 let mut is_in_indent_area = true;
204195 let mut last_line_indent_level = 0;
205− let mut syntax_style_span = syntax_styles
206− .next()
207− .unwrap_or_else(|| (Style::default(), usize::MAX));
208− let mut overlay_style_span = overlay_styles
196+ let mut style_span = styles
209197 .next()
210198 .unwrap_or_else(|| (Style::default(), usize::MAX));
211199
@@ -233,16 +221,9 @@ pub fn render_text<'t>(
233221
234222 // skip any graphemes on visual lines before the block start
235223 if pos.row < row_off {
236− if char_pos >= syntax_style_span.1 {
237− syntax_style_span = if let Some(syntax_style_span) = syntax_styles.next() {
238− syntax_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
224+ if char_pos >= style_span.1 {
225+ style_span = if let Some(style_span) = styles.next() {
226+ style_span
246227 } else {
247228 break;
248229 }
@@ -279,15 +260,8 @@ pub fn render_text<'t>(
279260 }
280261
281262 // acquire the correct grapheme style
282− if char_pos >= syntax_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));
263+ if char_pos >= style_span.1 {
264+ style_span = styles.next().unwrap_or((Style::default(), usize::MAX));
291265 }
292266 char_pos += grapheme.doc_chars();
293267
@@ -301,25 +275,22 @@ pub fn render_text<'t>(
301275 pos,
302276 );
303277
304− let (syntax_style, overlay_style) =
305− if let GraphemeSource::VirtualText { highlight } = grapheme.source {
306− let mut style = renderer.text_style;
307− if let Some(highlight) = highlight {
308− style = style.patch(theme.highlight(highlight.0))
309− }
310− (style, Style::default())
278+ let grapheme_style = if let GraphemeSource::VirtualText { highlight } = grapheme.source {
279+ let style = renderer.text_style;
280+ if let Some(highlight) = highlight {
281+ style.patch(theme.highlight(highlight.0))
311282 } else {
312− (syntax_style_span.0, overlay_style_span.0)
313− };
283+ style
284+ }
285+ } else {
286+ style_span.0
287+ };
314288
315− let is_virtual = grapheme.is_virtual();
289+ let virt = grapheme.is_virtual();
316290 renderer.draw_grapheme(
317291 grapheme.grapheme,
318− GraphemeStyle {
319− syntax_style,
320− overlay_style,
321− },
322− is_virtual,
292+ grapheme_style,
293+ virt,
323294 &mut last_line_indent_level,
324295 &mut is_in_indent_area,
325296 pos,
@@ -351,11 +322,6 @@ pub struct TextRenderer<'a> {
351322 pub viewport: Rect,
352323}
353324
354−pub struct GraphemeStyle {
355− syntax_style: Style,
356− overlay_style: Style,
357−}
358−
359325impl<'a> TextRenderer<'a> {
360326 pub fn new(
361327 surface: &'a mut Surface,
@@ -429,7 +395,7 @@ impl<'a> TextRenderer<'a> {
429395 pub fn draw_grapheme(
430396 &mut self,
431397 grapheme: Grapheme,
432− grapheme_style: GraphemeStyle,
398+ mut style: Style,
433399 is_virtual: bool,
434400 last_indent_level: &mut usize,
435401 is_in_indent_area: &mut bool,
@@ -439,11 +405,9 @@ impl<'a> TextRenderer<'a> {
439405 let is_whitespace = grapheme.is_whitespace();
440406
441407 // TODO is it correct to apply the whitespace style to all unicode white spaces?
442− let mut style = grapheme_style.syntax_style;
443408 if is_whitespace {
444409 style = style.patch(self.whitespace_style);
445410 }
446− style = style.patch(grapheme_style.overlay_style);
447411
448412 let width = grapheme.width();
449413 let space = if is_virtual { " " } else { &self.space };
helix-term/src/ui/editor.rs+43−76
@@ -124,20 +124,16 @@ impl EditorView {
124124 line_decorations.push(Box::new(line_decoration));
125125 }
126126
127− let syntax_highlights =
127+ let mut highlights =
128128 Self::doc_syntax_highlights(doc, view.offset.anchor, inner.height, theme);
129−
130− let mut overlay_highlights =
131− Self::empty_highlight_iter(doc, view.offset.anchor, inner.height);
132− let overlay_syntax_highlights = Self::overlay_syntax_highlights(
129+ let overlay_highlights = Self::overlay_syntax_highlights(
133130 doc,
134131 view.offset.anchor,
135132 inner.height,
136133 &text_annotations,
137134 );
138− if !overlay_syntax_highlights.is_empty() {
139− overlay_highlights =
140− Box::new(syntax::merge(overlay_highlights, overlay_syntax_highlights));
135+ if !overlay_highlights.is_empty() {
136+ highlights = Box::new(syntax::merge(highlights, overlay_highlights));
141137 }
142138
143139 for diagnostic in Self::doc_diagnostics_highlights(doc, theme) {
@@ -146,28 +142,29 @@ impl EditorView {
146142 if diagnostic.is_empty() {
147143 continue;
148144 }
149− overlay_highlights = Box::new(syntax::merge(overlay_highlights, diagnostic));
145+ highlights = Box::new(syntax::merge(highlights, diagnostic));
150146 }
151147
152− if is_focused {
148+ let highlights: Box<dyn Iterator<Item = HighlightEvent>> = if is_focused {
153149 let highlights = syntax::merge(
154− overlay_highlights,
150+ highlights,
155151 Self::doc_selection_highlights(
156152 editor.mode(),
157153 doc,
158154 view,
159155 theme,
160156 &config.cursor_shape,
161− self.terminal_focused,
162157 ),
163158 );
164159 let focused_view_elements = Self::highlight_focused_view_elements(view, doc, theme);
165160 if focused_view_elements.is_empty() {
166− overlay_highlights = Box::new(highlights)
161+ Box::new(highlights)
167162 } else {
168− overlay_highlights = Box::new(syntax::merge(highlights, focused_view_elements))
163+ Box::new(syntax::merge(highlights, focused_view_elements))
169164 }
170− }
165+ } else {
166+ Box::new(highlights)
167+ };
171168
172169 let gutter_overflow = view.gutter_offset(doc) == 0;
173170 if !gutter_overflow {
@@ -200,8 +197,7 @@ impl EditorView {
200197 doc,
201198 view.offset,
202199 &text_annotations,
203− syntax_highlights,
204− overlay_highlights,
200+ highlights,
205201 theme,
206202 &mut line_decorations,
207203 &mut translated_positions,
@@ -261,39 +257,27 @@ impl EditorView {
261257 .for_each(|area| surface.set_style(area, ruler_theme))
262258 }
263259
264− fn viewport_byte_range(
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(
260+ pub fn overlay_syntax_highlights(
280261 doc: &Document,
281262 anchor: usize,
282263 height: u16,
283− ) -> Box<dyn Iterator<Item = HighlightEvent>> {
264+ text_annotations: &TextAnnotations,
265+ ) -> Vec<(usize, std::ops::Range<usize>)> {
284266 let text = doc.text().slice(..);
285267 let row = text.char_to_line(anchor.min(text.len_chars()));
286268
287− // Calculate viewport byte ranges:
288− // Saturating subs to make it inclusive zero indexing.
289− let range = Self::viewport_byte_range(text, row, height);
290− Box::new(
291− [HighlightEvent::Source {
292− start: text.byte_to_char(range.start),
293− end: text.byte_to_char(range.end),
294− }]
295− .into_iter(),
296− )
269+ let range = {
270+ // Calculate viewport byte ranges:
271+ // Saturating subs to make it inclusive zero indexing.
272+ let last_line = text.len_lines().saturating_sub(1);
273+ let last_visible_line = (row + height as usize).saturating_sub(1).min(last_line);
274+ let start = text.line_to_byte(row.min(last_line));
275+ let end = text.line_to_byte(last_visible_line + 1);
276+
277+ start..end
278+ };
279+
280+ text_annotations.collect_overlay_highlights(range)
297281 }
298282
299283 /// Get syntax highlights for a document in a view represented by the first line
@@ -308,7 +292,16 @@ impl EditorView {
308292 let text = doc.text().slice(..);
309293 let row = text.char_to_line(anchor.min(text.len_chars()));
310294
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+ };
312305
313306 match doc.syntax() {
314307 Some(syntax) => {
@@ -341,20 +334,6 @@ impl EditorView {
341334 }
342335 }
343336
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−
358337 /// Get highlight spans for document diagnostics
359338 pub fn doc_diagnostics_highlights(
360339 doc: &Document,
@@ -421,7 +400,6 @@ impl EditorView {
421400 view: &View,
422401 theme: &Theme,
423402 cursor_shape_config: &CursorShapeConfig,
424− is_terminal_focused: bool,
425403 ) -> Vec<(usize, std::ops::Range<usize>)> {
426404 let text = doc.text().slice(..);
427405 let selection = doc.selection(view.id);
@@ -469,7 +447,7 @@ impl EditorView {
469447
470448 // Special-case: cursor at end of the rope.
471449 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 {
473451 // Bar and underline cursors are drawn by the terminal
474452 // BUG: If the editor area loses focus while having a bar or
475453 // underline cursor (eg. when a regex prompt has focus) then
@@ -492,17 +470,13 @@ impl EditorView {
492470 cursor_start
493471 };
494472 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 {
498474 spans.push((cursor_scope, cursor_start..range.head));
499475 }
500476 } else {
501477 // Reverse case.
502478 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 {
506480 spans.push((cursor_scope, range.head..cursor_end));
507481 }
508482 // non block cursors look like they exclude the cursor
@@ -1526,15 +1500,8 @@ impl Component for EditorView {
15261500
15271501 fn cursor(&self, _area: Rect, editor: &Editor) -> (Option<Position>, CursorKind) {
15281502 match editor.cursor() {
1529− // all block cursors are drawn manually
1530− (pos, CursorKind::Block) => {
1531− if self.terminal_focused {
1532− (pos, CursorKind::Hidden)
1533− } else {
1534− // use crossterm cursor when terminal loses focus
1535− (pos, CursorKind::Underline)
1536− }
1537− }
1503+ // All block cursors are drawn manually
1504+ (pos, CursorKind::Block) => (pos, CursorKind::Hidden),
15381505 cursor => cursor,
15391506 }
15401507 }
helix-term/src/ui/lsp.rs+1−3
@@ -92,9 +92,7 @@ impl Component for SignatureHelp {
9292 Some(doc) => Markdown::new(doc.clone(), Arc::clone(&self.config_loader)),
9393 };
9494 let sig_doc = sig_doc.parse(Some(&cx.editor.theme));
95− let sig_doc_area = area
96− .clip_top(sig_text_area.height + 2)
97− .clip_bottom(u16::from(cx.editor.popup_border()));
95+ let sig_doc_area = area.clip_top(sig_text_area.height + 2);
9896 let sig_doc_para = Paragraph::new(sig_doc)
9997 .wrap(Wrap { trim: false })
10098 .scroll((cx.scroll.unwrap_or_default() as u16, 0));
helix-term/src/ui/menu.rs+13−34
@@ -7,18 +7,11 @@ use crate::{
77use helix_core::fuzzy::MATCHER;
88use nucleo::pattern::{Atom, AtomKind, CaseMatching};
99use nucleo::{Config, Utf32Str};
10−use tui::{
11− buffer::Buffer as Surface,
12− widgets::{Block, Borders, Table, Widget},
13−};
10+use tui::{buffer::Buffer as Surface, widgets::Table};
1411
1512pub use tui::widgets::{Cell, Row};
1613
17−use helix_view::{
18− editor::SmartTabConfig,
19− graphics::{Margin, Rect},
20− Editor,
21−};
14+use helix_view::{editor::SmartTabConfig, graphics::Rect, Editor};
2215use tui::layout::Constraint;
2316
2417pub trait Item: Sync + Send + 'static {
@@ -329,15 +322,6 @@ impl<T: Item + 'static> Component for Menu<T> {
329322 let selected = theme.get("ui.menu.selected");
330323 surface.clear_with(area, style);
331324
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−
341325 let scroll = self.scroll;
342326
343327 let options: Vec<_> = self
@@ -378,19 +362,15 @@ impl<T: Item + 'static> Component for Menu<T> {
378362 false,
379363 );
380364
381− let render_borders = cx.editor.menu_border();
382−
383− if !render_borders {
384− if let Some(cursor) = self.cursor {
385− let offset_from_top = cursor - scroll;
386− let left = &mut surface[(area.left(), area.y + offset_from_top as u16)];
387− left.set_style(selected);
388− let right = &mut surface[(
389− area.right().saturating_sub(1),
390− area.y + offset_from_top as u16,
391− )];
392− right.set_style(selected);
393− }
365+ if let Some(cursor) = self.cursor {
366+ let offset_from_top = cursor - scroll;
367+ let left = &mut surface[(area.left(), area.y + offset_from_top as u16)];
368+ left.set_style(selected);
369+ let right = &mut surface[(
370+ area.right().saturating_sub(1),
371+ area.y + offset_from_top as u16,
372+ )];
373+ right.set_style(selected);
394374 }
395375
396376 let fits = len <= win_height;
@@ -405,13 +385,12 @@ impl<T: Item + 'static> Component for Menu<T> {
405385 for i in 0..win_height {
406386 cell = &mut surface[(area.right() - 1, area.top() + i as u16)];
407387
408− let half_block = if render_borders { "▌" } else { "▐" };
388+ cell.set_symbol("▐"); // right half block
409389
410390 if scroll_line <= i && i < scroll_line + scroll_height {
411391 // Draw scroll thumb
412− cell.set_symbol(half_block);
413392 cell.set_fg(scroll_style.fg.unwrap_or(helix_view::theme::Color::Reset));
414− } else if !render_borders {
393+ } else {
415394 // Draw scroll track
416395 cell.set_fg(scroll_style.bg.unwrap_or(helix_view::theme::Color::Reset));
417396 }
helix-term/src/ui/picker.rs+3−7
@@ -736,20 +736,17 @@ impl<T: Item + 'static> Picker<T> {
736736 }
737737 }
738738
739− let syntax_highlights = EditorView::doc_syntax_highlights(
739+ let mut highlights = EditorView::doc_syntax_highlights(
740740 doc,
741741 offset.anchor,
742742 area.height,
743743 &cx.editor.theme,
744744 );
745−
746− let mut overlay_highlights =
747− EditorView::empty_highlight_iter(doc, offset.anchor, area.height);
748745 for spans in EditorView::doc_diagnostics_highlights(doc, &cx.editor.theme) {
749746 if spans.is_empty() {
750747 continue;
751748 }
752− overlay_highlights = Box::new(helix_core::syntax::merge(overlay_highlights, spans));
749+ highlights = Box::new(helix_core::syntax::merge(highlights, spans));
753750 }
754751 let mut decorations: Vec<Box<dyn LineDecoration>> = Vec::new();
755752
@@ -780,8 +777,7 @@ impl<T: Item + 'static> Picker<T> {
780777 offset,
781778 // TODO: compute text annotations asynchronously here (like inlay hints)
782779 &TextAnnotations::default(),
783− syntax_highlights,
784− overlay_highlights,
780+ highlights,
785781 &cx.editor.theme,
786782 &mut decorations,
787783 &mut [],
helix-term/src/ui/popup.rs+7−27
@@ -3,10 +3,7 @@ use crate::{
33 compositor::{Callback, Component, Context, Event, EventResult},
44 ctrl, key,
55};
6−use tui::{
7− buffer::Buffer as Surface,
8− widgets::{Block, Borders, Widget},
9−};
6+use tui::buffer::Buffer as Surface;
107
118use helix_core::Position;
129use helix_view::{
@@ -255,29 +252,13 @@ impl<T: Component> Component for Popup<T> {
255252 let background = cx.editor.theme.get("ui.popup");
256253 surface.clear_with(area, background);
257254
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)
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−
255+ let inner = area.inner(&self.margin);
275256 self.contents.render(inner, surface, cx);
276257
277258 // render scrollbar if contents do not fit
278259 if self.has_scrollbar {
279− let win_height = (inner.height as usize).saturating_sub(2 * border);
280− let len = (self.child_size.1 as usize).saturating_sub(2 * border);
260+ let win_height = inner.height as usize;
261+ let len = self.child_size.1 as usize;
281262 let fits = len <= win_height;
282263 let scroll = self.scroll;
283264 let scroll_style = cx.editor.theme.get("ui.menu.scroll");
@@ -293,15 +274,14 @@ impl<T: Component> Component for Popup<T> {
293274
294275 let mut cell;
295276 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)];
297278
298− let half_block = if render_borders { "▌" } else { "▐" };
279+ cell.set_symbol("▐"); // right half block
299280
300281 if scroll_line <= i && i < scroll_line + scroll_height {
301282 // Draw scroll thumb
302− cell.set_symbol(half_block);
303283 cell.set_fg(scroll_style.fg.unwrap_or(helix_view::theme::Color::Reset));
304− } else if !render_borders {
284+ } else {
305285 // Draw scroll track
306286 cell.set_fg(scroll_style.bg.unwrap_or(helix_view::theme::Color::Reset));
307287 }
helix-term/tests/test/commands.rs−46
@@ -480,49 +480,3 @@ fn bar() {#(\n|)#\
480480
481481 Ok(())
482482}
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 @@
11[package]
22name = "helix-tui"
3−description = """A library to build rich terminal user interfaces or dashboards"""
3+version = "0.6.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+description = """
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"
413include = ["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
1314
1415[features]
1516default = ["crossterm"]
1617
1718[dependencies]
18−helix-view = { path = "../helix-view", features = ["term"] }
19−helix-core = { path = "../helix-core" }
20−
2119bitflags = "2.4"
2220cassowary = "0.3"
2321unicode-segmentation = "1.10"
2422crossterm = { version = "0.27", optional = true }
2523termini = "1.0"
2624serde = { version = "1", "optional" = true, features = ["derive"]}
27−once_cell = "1.19"
25+once_cell = "1.18"
2826log = "~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 {
213213 && y < self.area.bottom()
214214 }
215215
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.
217217 ///
218218 /// Global coordinates are offset by the Buffer's area offset (`x`/`y`).
219219 ///
@@ -242,7 +242,7 @@ impl Buffer {
242242 ((y - self.area.y) as usize) * (self.area.width as usize) + ((x - self.area.x) as usize)
243243 }
244244
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,
246246 /// or `None` if the coordinates are outside the buffer's area.
247247 fn index_of_opt(&self, x: u16, y: u16) -> Option<usize> {
248248 if self.in_bounds(x, y) {
helix-vcs/Cargo.toml+11−12
@@ -1,25 +1,24 @@
11[package]
22name = "helix-vcs"
3−version.workspace = true
4−authors.workspace = true
5−edition.workspace = true
6−license.workspace = true
7−rust-version.workspace = true
8−categories.workspace = true
9−repository.workspace = true
10−homepage.workspace = true
3+version = "0.6.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+edition = "2021"
6+license = "MPL-2.0"
7+categories = ["editor"]
8+repository = "https://github.com/helix-editor/helix"
9+homepage = "https://helix-editor.com"
1110
1211# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
1312
1413[dependencies]
15−helix-core = { path = "../helix-core" }
16−helix-event = { path = "../helix-event" }
14+helix-core = { version = "0.6", path = "../helix-core" }
15+helix-event = { version = "0.6", path = "../helix-event" }
1716
1817tokio = { version = "1", features = ["rt", "rt-multi-thread", "time", "sync", "parking_lot", "macros"] }
1918parking_lot = "0.12"
2019arc-swap = { version = "1.6.0" }
2120
22−gix = { version = "0.57.0", default-features = false , optional = true }
21+gix = { version = "0.55.0", default-features = false , optional = true }
2322imara-diff = "0.1.5"
2423anyhow = "1"
2524
@@ -29,4 +28,4 @@ log = "0.4"
2928git = ["gix"]
3029
3130[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;
33use std::path::Path;
44use std::sync::Arc;
55
6−use gix::objs::tree::EntryKind;
6+use gix::objs::tree::EntryMode;
77use gix::sec::trust::DefaultForLevel;
88use gix::{Commit, ObjectId, Repository, ThreadSafeRepository};
99
@@ -128,12 +128,12 @@ fn find_file_in_commit(repo: &Repository, commit: &Commit, file: &Path) -> Resul
128128 let tree_entry = tree
129129 .lookup_entry_by_path(rel_path, &mut Vec::new())?
130130 .context("file is untracked")?;
131− match tree_entry.mode().kind() {
131+ match tree_entry.mode() {
132132 // 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) => {
134134 bail!("entry at {} is not a file but a {mode:?}", file.display())
135135 }
136136 // found a file
137− EntryKind::Blob | EntryKind::BlobExecutable => Ok(tree_entry.object_id()),
137+ EntryMode::Blob | EntryMode::BlobExecutable => Ok(tree_entry.object_id()),
138138 }
139139}
helix-view/Cargo.toml+17−19
@@ -1,34 +1,32 @@
11[package]
22name = "helix-view"
3+version = "0.6.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+edition = "2021"
6+license = "MPL-2.0"
37description = "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
10−repository.workspace = true
11−homepage.workspace = true
8+categories = ["editor"]
9+repository = "https://github.com/helix-editor/helix"
10+homepage = "https://helix-editor.com"
1211
1312[features]
1413default = []
1514term = ["crossterm"]
1615
1716[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−
2517bitflags = "2.4"
2618anyhow = "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" }
2724crossterm = { version = "0.27", optional = true }
25+helix-vcs = { version = "0.6", path = "../helix-vcs" }
2826
2927# Conversion traits
30−once_cell = "1.19"
31−url = "2.5.0"
28+once_cell = "1.18"
29+url = "2"
3230
3331arc-swap = { version = "1.6.0" }
3432
@@ -45,12 +43,12 @@ serde_json = "1.0"
4543toml = "0.7"
4644log = "~0.4"
4745
48−which = "5.0.0"
46+which = "4.4"
4947parking_lot = "0.12.1"
5048
5149
5250[target.'cfg(windows)'.dependencies]
53−clipboard-win = { version = "5.0", features = ["std"] }
51+clipboard-win = { version = "4.5", features = ["std"] }
5452
5553[target.'cfg(unix)'.dependencies]
5654libc = "0.2"
helix-view/src/document.rs+20−57
@@ -1213,40 +1213,23 @@ impl Document {
12131213
12141214 let changes = transaction.changes();
12151215
1216− // map diagnostics over changes 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| {
1234− if diagnostic.range.start > diagnostic.range.end
1235− || (!diagnostic.zero_width && diagnostic.range.start == diagnostic.range.end)
1236− {
1237− return false;
1238− }
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+ );
1226+ // map state.diagnostics over changes::map_pos too
1227+ for diagnostic in &mut self.diagnostics {
12391228 diagnostic.line = self.text.char_to_line(diagnostic.range.start);
1240− true
1241− });
1229+ }
12421230
1243− self.diagnostics.sort_unstable_by_key(|diagnostic| {
1244− (
1245− diagnostic.range,
1246− diagnostic.severity,
1247− diagnostic.language_server_id,
1248− )
1249− });
1231+ self.diagnostics
1232+ .sort_unstable_by_key(|diagnostic| diagnostic.range);
12501233
12511234 // Update the inlay hint annotations' positions, helping ensure they are displayed in the proper place
12521235 let apply_inlay_hint_changes = |annotations: &mut Rc<[InlineAnnotation]>| {
@@ -1723,33 +1706,13 @@ impl Document {
17231706
17241707 pub fn replace_diagnostics(
17251708 &mut self,
1726− diagnostics: impl IntoIterator<Item = Diagnostic>,
1727− unchanged_sources: &[String],
1709+ mut diagnostics: Vec<Diagnostic>,
17281710 language_server_id: usize,
17291711 ) {
1730− if unchanged_sources.is_empty() {
1731− self.clear_diagnostics(language_server_id);
1732− } else {
1733− self.diagnostics.retain(|d| {
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);
1746− self.diagnostics.sort_unstable_by_key(|diagnostic| {
1747− (
1748− diagnostic.range,
1749− diagnostic.severity,
1750− diagnostic.language_server_id,
1751− )
1752− });
1712+ self.clear_diagnostics(language_server_id);
1713+ self.diagnostics.append(&mut diagnostics);
1714+ self.diagnostics
1715+ .sort_unstable_by_key(|diagnostic| diagnostic.range);
17531716 }
17541717
17551718 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};
4242pub use helix_core::diagnostic::Severity;
4343use helix_core::{
4444 auto_pairs::AutoPairs,
45− syntax::{self, AutoPairConfig, IndentationHeuristic, SoftWrap},
46− Change, LineEnding, Position, Selection, NATIVE_LINE_ENDING,
45+ syntax::{self, AutoPairConfig, SoftWrap},
46+ Change, LineEnding, NATIVE_LINE_ENDING,
4747};
48+use helix_core::{Position, Selection};
4849use helix_dap as dap;
4950use helix_lsp::lsp;
5051
@@ -290,11 +291,6 @@ pub struct Config {
290291 pub insert_final_newline: bool,
291292 /// Enables smart tab
292293 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,
298294}
299295
300296#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Eq, PartialOrd, Ord)]
@@ -731,7 +727,7 @@ pub struct WhitespaceCharacters {
731727impl Default for WhitespaceCharacters {
732728 fn default() -> Self {
733729 Self {
734− space: '·', // U+00B7
730+ space: '·', // U+00B7
735731 nbsp: '⍽', // U+237D
736732 tab: '→', // U+2192
737733 newline: '⏎', // U+23CE
@@ -759,13 +755,12 @@ impl Default for IndentGuidesConfig {
759755}
760756
761757/// Line ending configuration.
762−#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
758+#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
763759#[serde(rename_all = "lowercase")]
764760pub enum LineEndingConfig {
765761 /// The platform's native line ending.
766762 ///
767763 /// `crlf` on Windows, otherwise `lf`.
768− #[default]
769764 Native,
770765 /// Line feed.
771766 LF,
@@ -782,6 +777,12 @@ pub enum LineEndingConfig {
782777 Nel,
783778}
784779
780+impl Default for LineEndingConfig {
781+ fn default() -> Self {
782+ LineEndingConfig::Native
783+ }
784+}
785+
785786impl From<LineEndingConfig> for LineEnding {
786787 fn from(line_ending: LineEndingConfig) -> Self {
787788 match line_ending {
@@ -798,15 +799,6 @@ impl From<LineEndingConfig> for LineEnding {
798799 }
799800}
800801
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−
810802impl Default for Config {
811803 fn default() -> Self {
812804 Self {
@@ -854,8 +846,6 @@ impl Default for Config {
854846 default_line_ending: LineEndingConfig::default(),
855847 insert_final_newline: true,
856848 smart_tab: Some(SmartTabConfig::default()),
857− popup_border: PopupBorderConfig::None,
858− indent_heuristic: IndentationHeuristic::default(),
859849 }
860850 }
861851}
@@ -1075,16 +1065,6 @@ impl Editor {
10751065 }
10761066 }
10771067
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−
10881068 pub fn apply_motion<F: Fn(&mut Self) + 'static>(&mut self, motion: F) {
10891069 motion(self);
10901070 self.last_motion = Some(Box::new(motion));
helix-view/src/gutter.rs+2−1
@@ -9,7 +9,8 @@ use crate::{
99};
1010
1111fn 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()
1314}
1415
1516pub 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 {
369369 {
370370 Ok(process) => process,
371371 Err(err) => {
372− self.set_error(format!("Error starting external terminal: {}", err));
372+ // TODO replace the pretty print {:?} with a regular format {}
373+ // when the MSRV is raised to 1.60.0
374+ self.set_error(format!("Error starting external terminal: {:?}", err));
373375 return true;
374376 }
375377 };
helix-view/src/register.rs+10−10
@@ -75,8 +75,8 @@ impl Registers {
7575 self.clipboard_provider.as_ref(),
7676 self.inner.get(&name),
7777 match name {
78− '+' => ClipboardType::Clipboard,
79− '*' => ClipboardType::Selection,
78+ '*' => ClipboardType::Clipboard,
79+ '+' => ClipboardType::Selection,
8080 _ => unreachable!(),
8181 },
8282 )),
@@ -95,8 +95,8 @@ impl Registers {
9595 self.clipboard_provider.set_contents(
9696 values.join(NATIVE_LINE_ENDING.as_str()),
9797 match name {
98− '+' => ClipboardType::Clipboard,
99− '*' => ClipboardType::Selection,
98+ '*' => ClipboardType::Clipboard,
99+ '+' => ClipboardType::Selection,
100100 _ => unreachable!(),
101101 },
102102 )?;
@@ -118,8 +118,8 @@ impl Registers {
118118 '#' | '.' | '%' => Err(anyhow::anyhow!("Register {name} does not support pushing")),
119119 '*' | '+' => {
120120 let clipboard_type = match name {
121− '+' => ClipboardType::Clipboard,
122− '*' => ClipboardType::Selection,
121+ '*' => ClipboardType::Clipboard,
122+ '+' => ClipboardType::Selection,
123123 _ => unreachable!(),
124124 };
125125 let contents = self.clipboard_provider.get_contents(clipboard_type)?;
@@ -172,8 +172,8 @@ impl Registers {
172172 ('#', "<selection indices>"),
173173 ('.', "<selection contents>"),
174174 ('%', "<document path>"),
175− ('+', "<system clipboard>"),
176− ('*', "<primary clipboard>"),
175+ ('*', "<system clipboard>"),
176+ ('+', "<primary clipboard>"),
177177 ]
178178 .iter()
179179 .copied(),
@@ -190,8 +190,8 @@ impl Registers {
190190 match name {
191191 '*' | '+' => {
192192 self.clear_clipboard(match name {
193− '+' => ClipboardType::Clipboard,
194− '*' => ClipboardType::Selection,
193+ '*' => ClipboardType::Clipboard,
194+ '+' => ClipboardType::Selection,
195195 _ => unreachable!(),
196196 });
197197 self.inner.remove(&name);
languages.toml+166−117
@@ -3,7 +3,6 @@
33
44[language-server]
55
6−als = { command = "als" }
76awk-language-server = { command = "awk-language-server" }
87bash-language-server = { command = "bash-language-server", args = ["start"] }
98bass = { command = "bass", args = ["--lsp"] }
@@ -48,7 +47,6 @@ mint = { command = "mint", args = ["ls"] }
4847nil = { command = "nil" }
4948nimlangserver = { command = "nimlangserver" }
5049nls = { command = "nls" }
51−nu-lsp = { command = "nu", args = [ "--lsp" ] }
5250ocamllsp = { command = "ocamllsp" }
5351ols = { command = "ols", args = [] }
5452omnisharp = { command = "OmniSharp", args = [ "--languageserver" ] }
@@ -97,7 +95,7 @@ command = "ansible-language-server"
9795args = ["--stdio"]
9896
9997[language-server.lua-language-server]
100−command = "lua-language-server"
98+command = "lua-language-server"
10199
102100[language-server.lua-language-server.config.Lua.hint]
103101enable = true
@@ -191,7 +189,6 @@ auto-format = true
191189comment-token = "//"
192190language-servers = [ "rust-analyzer" ]
193191indent = { tab-width = 4, unit = " " }
194−persistent-diagnostic-sources = ["rustc", "clippy"]
195192
196193[language.auto-pairs]
197194'(' = ')'
@@ -252,6 +249,7 @@ name = "toml"
252249scope = "source.toml"
253250injection-regex = "toml"
254251file-types = ["toml", "poetry.lock", "Cargo.lock"]
252+roots = []
255253comment-token = "#"
256254language-servers = [ "taplo" ]
257255indent = { tab-width = 2, unit = " " }
@@ -265,6 +263,7 @@ name = "awk"
265263scope = "source.awk"
266264injection-regex = "awk"
267265file-types = ["awk", "gawk", "nawk", "mawk"]
266+roots = []
268267comment-token = "#"
269268language-servers = [ "awk-language-server" ]
270269indent = { tab-width = 2, unit = " " }
@@ -279,6 +278,7 @@ scope = "source.proto"
279278injection-regex = "protobuf"
280279file-types = ["proto"]
281280language-servers = [ "bufls", "pbkit" ]
281+roots = []
282282comment-token = "//"
283283indent = { tab-width = 2, unit = " " }
284284
@@ -307,6 +307,7 @@ scope = "source.fish"
307307injection-regex = "fish"
308308file-types = ["fish"]
309309shebangs = ["fish"]
310+roots = []
310311comment-token = "#"
311312indent = { tab-width = 4, unit = " " }
312313
@@ -320,6 +321,7 @@ scope = "source.mint"
320321injection-regex = "mint"
321322file-types = ["mint"]
322323shebangs = []
324+roots = []
323325comment-token = "//"
324326language-servers = [ "mint" ]
325327indent = { tab-width = 2, unit = " " }
@@ -347,9 +349,9 @@ file-types = [
347349 "jsonld",
348350 ".vuerc",
349351 "composer.lock",
350− ".watchmanconfig",
351− "avsc"
352+ ".watchmanconfig"
352353]
354+roots = []
353355language-servers = [ "vscode-json-language-server" ]
354356auto-format = true
355357indent = { tab-width = 2, unit = " " }
@@ -364,6 +366,7 @@ name = "json5"
364366scope = "source.json5"
365367injection-regex = "json5"
366368file-types = ["json5"]
369+roots = []
367370language-servers = []
368371comment-token = "//"
369372indent = { tab-width = 4, unit = " " }
@@ -378,6 +381,7 @@ name = "c"
378381scope = "source.c"
379382injection-regex = "c"
380383file-types = ["c"] # TODO: ["h"]
384+roots = []
381385comment-token = "//"
382386language-servers = [ "clangd" ]
383387indent = { tab-width = 2, unit = " " }
@@ -414,6 +418,7 @@ name = "cpp"
414418scope = "source.cpp"
415419injection-regex = "cpp"
416420file-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 = []
417422comment-token = "//"
418423language-servers = [ "clangd" ]
419424indent = { tab-width = 2, unit = " " }
@@ -546,6 +551,7 @@ name = "gomod"
546551scope = "source.gomod"
547552injection-regex = "gomod"
548553file-types = ["go.mod"]
554+roots = []
549555auto-format = true
550556comment-token = "//"
551557language-servers = [ "gopls" ]
@@ -560,6 +566,7 @@ name = "gotmpl"
560566scope = "source.gotmpl"
561567injection-regex = "gotmpl"
562568file-types = ["gotmpl"]
569+roots = []
563570comment-token = "//"
564571language-servers = [ "gopls" ]
565572indent = { tab-width = 2, unit = " " }
@@ -573,6 +580,7 @@ name = "gowork"
573580scope = "source.gowork"
574581injection-regex = "gowork"
575582file-types = ["go.work"]
583+roots = []
576584auto-format = true
577585comment-token = "//"
578586language-servers = [ "gopls" ]
@@ -589,6 +597,7 @@ injection-regex = "(js|javascript)"
589597language-id = "javascript"
590598file-types = ["js", "mjs", "cjs", "rules", "es6", "pac", "jakefile"]
591599shebangs = ["node"]
600+roots = []
592601comment-token = "//"
593602language-servers = [ "typescript-language-server" ]
594603indent = { tab-width = 2, unit = " " }
@@ -615,6 +624,7 @@ scope = "source.jsx"
615624injection-regex = "jsx"
616625language-id = "javascriptreact"
617626file-types = ["jsx"]
627+roots = []
618628comment-token = "//"
619629language-servers = [ "typescript-language-server" ]
620630indent = { tab-width = 2, unit = " " }
@@ -627,6 +637,7 @@ injection-regex = "(ts|typescript)"
627637file-types = ["ts", "mts", "cts"]
628638language-id = "typescript"
629639shebangs = ["deno", "ts-node"]
640+roots = []
630641language-servers = [ "typescript-language-server" ]
631642indent = { tab-width = 2, unit = " " }
632643
@@ -640,6 +651,7 @@ scope = "source.tsx"
640651injection-regex = "(tsx)" # |typescript
641652language-id = "typescriptreact"
642653file-types = ["tsx"]
654+roots = []
643655language-servers = [ "typescript-language-server" ]
644656indent = { tab-width = 2, unit = " " }
645657
@@ -652,6 +664,7 @@ name = "css"
652664scope = "source.css"
653665injection-regex = "css"
654666file-types = ["css", "scss"]
667+roots = []
655668language-servers = [ "vscode-css-language-server" ]
656669auto-format = true
657670indent = { tab-width = 2, unit = " " }
@@ -665,6 +678,7 @@ name = "scss"
665678scope = "source.scss"
666679injection-regex = "scss"
667680file-types = ["scss"]
681+roots = []
668682language-servers = [ "vscode-css-language-server" ]
669683auto-format = true
670684indent = { tab-width = 2, unit = " " }
@@ -678,6 +692,7 @@ name = "html"
678692scope = "text.html.basic"
679693injection-regex = "html"
680694file-types = ["html", "htm", "shtml", "xhtml", "xht", "jsp", "asp", "aspx", "jshtm", "volt", "rhtml"]
695+roots = []
681696language-servers = [ "vscode-html-language-server" ]
682697auto-format = true
683698indent = { tab-width = 2, unit = " " }
@@ -700,7 +715,7 @@ indent = { tab-width = 4, unit = " " }
700715
701716[[grammar]]
702717name = "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" }
704719
705720[[language]]
706721name = "nickel"
@@ -708,6 +723,7 @@ scope = "source.nickel"
708723injection-regex = "nickel"
709724file-types = ["ncl"]
710725shebangs = []
726+roots = []
711727comment-token = "#"
712728language-servers = [ "nls" ]
713729indent = { tab-width = 2, unit = " " }
@@ -728,6 +744,7 @@ scope = "source.nix"
728744injection-regex = "nix"
729745file-types = ["nix"]
730746shebangs = []
747+roots = []
731748comment-token = "#"
732749language-servers = [ "nil" ]
733750indent = { tab-width = 2, unit = " " }
@@ -777,6 +794,7 @@ file-types = [
777794 "Gymfile"
778795]
779796shebangs = ["ruby"]
797+roots = []
780798comment-token = "#"
781799language-servers = [ "solargraph" ]
782800indent = { tab-width = 2, unit = " " }
@@ -831,6 +849,7 @@ file-types = [
831849 "zshrc_Apple_Terminal"
832850]
833851shebangs = ["sh", "bash", "dash", "zsh"]
852+roots = []
834853comment-token = "#"
835854language-servers = [ "bash-language-server" ]
836855indent = { tab-width = 2, unit = " " }
@@ -858,6 +877,7 @@ name = "twig"
858877scope = "source.twig"
859878injection-regex = "twig"
860879file-types = ["twig"]
880+roots = []
861881indent = { tab-width = 2, unit = " " }
862882
863883[[grammar]]
@@ -869,6 +889,7 @@ name = "latex"
869889scope = "source.tex"
870890injection-regex = "tex"
871891file-types = ["tex", "sty", "cls", "Rd", "bbx", "cbx"]
892+roots = []
872893comment-token = "%"
873894language-servers = [ "texlab" ]
874895indent = { tab-width = 4, unit = "\t" }
@@ -882,6 +903,7 @@ name = "bibtex"
882903scope = "source.bib"
883904injection-regex = "bib"
884905file-types = ["bib"]
906+roots = []
885907comment-token = "%"
886908language-servers = [ "texlab" ]
887909indent = { tab-width = 4, unit = "\t" }
@@ -924,6 +946,7 @@ name = "lpf"
924946comment-token = "#"
925947scope = "source.lpf"
926948file-types = ["lpf"]
949+roots = []
927950
928951[[grammar]]
929952name = "lpf"
@@ -957,24 +980,12 @@ indent = { tab-width = 2, unit = " " }
957980name = "java"
958981source = { git = "https://github.com/tree-sitter/tree-sitter-java", rev = "09d650def6cdf7f479f4b78f595e9ef5b58ce31e" }
959982
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−
973983[[language]]
974984name = "ledger"
975985scope = "source.ledger"
976986injection-regex = "ledger"
977987file-types = ["ldg", "ledger", "journal"]
988+roots = []
978989comment-token = ";"
979990indent = { tab-width = 4, unit = " " }
980991
@@ -987,12 +998,13 @@ name = "beancount"
987998scope = "source.beancount"
988999injection-regex = "beancount"
9891000file-types = ["beancount", "bean"]
1001+roots = []
9901002comment-token = ";"
9911003indent = { tab-width = 2, unit = " " }
9921004
9931005[[grammar]]
9941006name = "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" }
9961008
9971009[[language]]
9981010name = "ocaml"
@@ -1000,6 +1012,7 @@ scope = "source.ocaml"
10001012injection-regex = "ocaml"
10011013file-types = ["ml"]
10021014shebangs = ["ocaml", "ocamlrun", "ocamlscript"]
1015+roots = []
10031016comment-token = "(**)"
10041017language-servers = [ "ocamllsp" ]
10051018indent = { tab-width = 2, unit = " " }
@@ -1019,6 +1032,7 @@ name = "ocaml-interface"
10191032scope = "source.ocaml.interface"
10201033file-types = ["mli"]
10211034shebangs = []
1035+roots = []
10221036comment-token = "(**)"
10231037language-servers = [ "ocamllsp" ]
10241038indent = { tab-width = 2, unit = " " }
@@ -1053,6 +1067,7 @@ name = "svelte"
10531067scope = "source.svelte"
10541068injection-regex = "svelte"
10551069file-types = ["svelte"]
1070+roots = []
10561071indent = { tab-width = 2, unit = " " }
10571072language-servers = [ "svelteserver" ]
10581073
@@ -1077,6 +1092,7 @@ source = { git = "https://github.com/ikatyang/tree-sitter-vue", rev = "91fe27547
10771092name = "yaml"
10781093scope = "source.yaml"
10791094file-types = ["yml", "yaml"]
1095+roots = []
10801096comment-token = "#"
10811097indent = { tab-width = 2, unit = " " }
10821098language-servers = [ "yaml-language-server", "ansible-language-server" ]
@@ -1104,6 +1120,7 @@ source = { git = "https://github.com/tree-sitter/tree-sitter-haskell", rev = "d7
11041120name = "haskell-persistent"
11051121scope = "source.persistentmodels"
11061122file-types = ["persistentmodels"]
1123+roots = []
11071124comment-token = "--"
11081125indent = { tab-width = 2, unit = " " }
11091126
@@ -1125,7 +1142,7 @@ formatter = { command = "purs-tidy", args = ["format"] }
11251142
11261143[[grammar]]
11271144name = "purescript"
1128−source = { git = "https://github.com/postsolar/tree-sitter-purescript", rev = "5ef5592674ea42de75fc2792972e4ea0b6e3da6c" }
1145+source = { git = "https://github.com/maskhjarna/tree-sitter-purescript", rev = "0e36a885a941078bf40e559026be425764dc27bf" }
11291146
11301147[[language]]
11311148name = "zig"
@@ -1169,6 +1186,7 @@ source = { git = "https://github.com/maxxnino/tree-sitter-zig", rev = "0d08703e4
11691186[[language]]
11701187name = "prolog"
11711188scope = "source.prolog"
1189+roots = []
11721190file-types = ["pl", "prolog"]
11731191shebangs = ["swipl"]
11741192comment-token = "%"
@@ -1178,6 +1196,7 @@ language-servers = [ "swipl" ]
11781196name = "tsq"
11791197scope = "source.tsq"
11801198file-types = ["tsq"]
1199+roots = []
11811200comment-token = ";"
11821201injection-regex = "tsq"
11831202indent = { tab-width = 2, unit = " " }
@@ -1190,6 +1209,7 @@ source = { git = "https://github.com/the-mikedavis/tree-sitter-tsq", rev = "48b5
11901209name = "cmake"
11911210scope = "source.cmake"
11921211file-types = ["cmake", "CMakeLists.txt"]
1212+roots = []
11931213comment-token = "#"
11941214indent = { tab-width = 2, unit = " " }
11951215language-servers = [ "cmake-language-server" ]
@@ -1205,6 +1225,7 @@ scope = "source.make"
12051225file-types = ["Makefile", "makefile", "make", "mk", "mak", "GNUmakefile", "OCamlMakefile"]
12061226shebangs = ["make", "gmake"]
12071227injection-regex = "(make|makefile|Makefile|mk)"
1228+roots = []
12081229comment-token = "#"
12091230indent = { tab-width = 4, unit = "\t" }
12101231
@@ -1216,6 +1237,7 @@ source = { git = "https://github.com/alemuller/tree-sitter-make", rev = "a4b9187
12161237name = "glsl"
12171238scope = "source.glsl"
12181239file-types = ["glsl", "vert", "tesc", "tese", "geom", "frag", "comp" ]
1240+roots = []
12191241comment-token = "//"
12201242indent = { tab-width = 4, unit = " " }
12211243injection-regex = "glsl"
@@ -1229,18 +1251,20 @@ name = "perl"
12291251scope = "source.perl"
12301252file-types = ["pl", "pm", "t", "psgi", "raku", "rakumod", "rakutest", "rakudoc", "nqp", "p6", "pl6", "pm6"]
12311253shebangs = ["perl"]
1254+roots = []
12321255comment-token = "#"
12331256language-servers = [ "perlnavigator" ]
12341257indent = { tab-width = 2, unit = " " }
12351258
12361259[[grammar]]
12371260name = "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" }
12391262
12401263[[language]]
12411264name = "pod"
12421265scope = "source.pod"
12431266injection-regex = "pod"
1267+roots = []
12441268file-types = ["pod"]
12451269
12461270[[grammar]]
@@ -1250,16 +1274,17 @@ source = { git = "https://github.com/tree-sitter-perl/tree-sitter-pod", rev = "d
12501274[[language]]
12511275name = "racket"
12521276scope = "source.racket"
1277+roots = []
12531278file-types = ["rkt", "rktd", "rktl", "scrbl"]
12541279shebangs = ["racket"]
12551280comment-token = ";"
1256−indent = { tab-width = 2, unit = " " }
12571281language-servers = [ "racket" ]
12581282grammar = "scheme"
12591283
12601284[[language]]
12611285name = "common-lisp"
12621286scope = "source.lisp"
1287+roots = []
12631288file-types = ["lisp", "asd", "cl", "l", "lsp", "ny", "podsl", "sexp"]
12641289shebangs = ["lisp", "sbcl", "ccl", "clisp", "ecl"]
12651290comment-token = ";"
@@ -1276,17 +1301,19 @@ grammar = "scheme"
12761301[[language]]
12771302name = "comment"
12781303scope = "scope.comment"
1304+roots = []
12791305file-types = []
12801306injection-regex = "comment"
12811307
12821308[[grammar]]
12831309name = "comment"
1284−source = { git = "https://github.com/stsewd/tree-sitter-comment", rev = "a37ca370310ac6f89b6e0ebf2b86b2219780494e" }
1310+source = { git = "https://github.com/stsewd/tree-sitter-comment", rev = "5dd3c62f1bbe378b220fe16b317b85247898639e" }
12851311
12861312[[language]]
12871313name = "wgsl"
12881314scope = "source.wgsl"
12891315file-types = ["wgsl"]
1316+roots = []
12901317comment-token = "//"
12911318language-servers = [ "wgsl_analyzer" ]
12921319indent = { tab-width = 4, unit = " " }
@@ -1298,6 +1325,7 @@ source = { git = "https://github.com/szebniok/tree-sitter-wgsl", rev = "272e89ef
12981325[[language]]
12991326name = "llvm"
13001327scope = "source.llvm"
1328+roots = []
13011329file-types = ["ll"]
13021330comment-token = ";"
13031331indent = { tab-width = 2, unit = " " }
@@ -1305,11 +1333,12 @@ injection-regex = "llvm"
13051333
13061334[[grammar]]
13071335name = "llvm"
1308−source = { git = "https://github.com/benwilliamgraham/tree-sitter-llvm", rev = "e9948edc41e9e5869af99dddb2b5ff5cc5581af6" }
1336+source = { git = "https://github.com/benwilliamgraham/tree-sitter-llvm", rev = "3b213925b9c4f42c1acfe2e10bfbb438d9c6834d" }
13091337
13101338[[language]]
13111339name = "llvm-mir"
13121340scope = "source.llvm_mir"
1341+roots = []
13131342file-types = []
13141343comment-token = ";"
13151344indent = { tab-width = 2, unit = " " }
@@ -1325,6 +1354,7 @@ name = "llvm-mir-yaml"
13251354#
13261355# grammar = "yaml"
13271356scope = "source.yaml"
1357+roots = []
13281358file-types = ["mir"]
13291359comment-token = "#"
13301360indent = { tab-width = 2, unit = " " }
@@ -1332,6 +1362,7 @@ indent = { tab-width = 2, unit = " " }
13321362[[language]]
13331363name = "tablegen"
13341364scope = "source.tablegen"
1365+roots = []
13351366file-types = ["td"]
13361367comment-token = "//"
13371368indent = { tab-width = 2, unit = " " }
@@ -1352,18 +1383,19 @@ indent = { tab-width = 2, unit = " " }
13521383
13531384[[grammar]]
13541385name = "markdown"
1355−source = { git = "https://github.com/MDeiml/tree-sitter-markdown", rev = "aaf76797aa8ecd9a5e78e0ec3681941de6c945ee", subpath = "tree-sitter-markdown" }
1386+source = { git = "https://github.com/MDeiml/tree-sitter-markdown", rev = "fa6bfd51727e4bef99f7eec5f43947f73d64ea7d", subpath = "tree-sitter-markdown" }
13561387
13571388[[language]]
13581389name = "markdown.inline"
13591390scope = "source.markdown.inline"
13601391injection-regex = "markdown\\.inline"
13611392file-types = []
1393+roots = []
13621394grammar = "markdown_inline"
13631395
13641396[[grammar]]
13651397name = "markdown_inline"
1366−source = { git = "https://github.com/MDeiml/tree-sitter-markdown", rev = "aaf76797aa8ecd9a5e78e0ec3681941de6c945ee", subpath = "tree-sitter-markdown-inline" }
1398+source = { git = "https://github.com/MDeiml/tree-sitter-markdown", rev = "fa6bfd51727e4bef99f7eec5f43947f73d64ea7d", subpath = "tree-sitter-markdown-inline" }
13671399
13681400[[language]]
13691401name = "dart"
@@ -1409,6 +1441,7 @@ source = { git = "https://github.com/camdencheek/tree-sitter-dockerfile", rev =
14091441[[language]]
14101442name = "git-commit"
14111443scope = "git.commitmsg"
1444+roots = []
14121445file-types = ["COMMIT_EDITMSG"]
14131446comment-token = "#"
14141447indent = { tab-width = 2, unit = " " }
@@ -1422,6 +1455,7 @@ source = { git = "https://github.com/the-mikedavis/tree-sitter-git-commit", rev
14221455[[language]]
14231456name = "diff"
14241457scope = "source.diff"
1458+roots = []
14251459file-types = ["diff", "patch", "rej"]
14261460injection-regex = "diff"
14271461comment-token = "#"
@@ -1434,6 +1468,7 @@ source = { git = "https://github.com/the-mikedavis/tree-sitter-diff", rev = "fd7
14341468[[language]]
14351469name = "git-rebase"
14361470scope = "source.gitrebase"
1471+roots = []
14371472file-types = ["git-rebase-todo"]
14381473injection-regex = "git-rebase"
14391474comment-token = "#"
@@ -1448,6 +1483,7 @@ name = "regex"
14481483scope = "source.regex"
14491484injection-regex = "regex"
14501485file-types = ["regex", ".Rbuildignore"]
1486+roots = []
14511487
14521488[[grammar]]
14531489name = "regex"
@@ -1456,6 +1492,7 @@ source = { git = "https://github.com/tree-sitter/tree-sitter-regex", rev = "e1cf
14561492[[language]]
14571493name = "git-config"
14581494scope = "source.gitconfig"
1495+roots = []
14591496file-types = [".gitmodules", ".gitconfig", { suffix = ".git/config" }, { suffix = ".config/git/config" }]
14601497injection-regex = "git-config"
14611498comment-token = "#"
@@ -1468,6 +1505,7 @@ source = { git = "https://github.com/the-mikedavis/tree-sitter-git-config", rev
14681505[[language]]
14691506name = "git-attributes"
14701507scope = "source.gitattributes"
1508+roots = []
14711509file-types = [".gitattributes"]
14721510injection-regex = "git-attributes"
14731511comment-token = "#"
@@ -1480,6 +1518,7 @@ source = { git = "https://github.com/mtoohey31/tree-sitter-gitattributes", rev =
14801518[[language]]
14811519name = "git-ignore"
14821520scope = "source.gitignore"
1521+roots = []
14831522file-types = [".gitignore", ".gitignore_global", ".ignore", ".prettierignore", ".eslintignore", ".npmignore", "CODEOWNERS"]
14841523injection-regex = "git-ignore"
14851524comment-token = "#"
@@ -1494,6 +1533,7 @@ name = "graphql"
14941533scope = "source.graphql"
14951534injection-regex = "graphql"
14961535file-types = ["gql", "graphql", "graphqls"]
1536+roots = []
14971537language-servers = [ "graphql-language-service" ]
14981538indent = { tab-width = 2, unit = " " }
14991539
@@ -1521,6 +1561,7 @@ name = "iex"
15211561scope = "source.iex"
15221562injection-regex = "iex"
15231563file-types = ["iex"]
1564+roots = []
15241565
15251566[[grammar]]
15261567name = "iex"
@@ -1539,7 +1580,7 @@ indent = { tab-width = 2, unit = " " }
15391580
15401581[[grammar]]
15411582name = "rescript"
1542−source = { git = "https://github.com/jaredramirez/tree-sitter-rescript", rev = "467dcf99f68c47823d7b378779a6b282d7ef9782" }
1583+source = { git = "https://github.com/jaredramirez/tree-sitter-rescript", rev = "65609807c628477f3b94052e7ef895885ac51c3c" }
15431584
15441585[[language]]
15451586name = "erlang"
@@ -1583,6 +1624,7 @@ scope = "source.hcl"
15831624injection-regex = "(hcl|tf|nomad)"
15841625language-id = "terraform"
15851626file-types = ["hcl", "tf", "nomad"]
1627+roots = []
15861628comment-token = "#"
15871629indent = { tab-width = 2, unit = " " }
15881630language-servers = [ "terraform-ls" ]
@@ -1597,6 +1639,7 @@ name = "tfvars"
15971639scope = "source.tfvars"
15981640language-id = "terraform-vars"
15991641file-types = ["tfvars"]
1642+roots = []
16001643comment-token = "#"
16011644indent = { tab-width = 2, unit = " " }
16021645language-servers = [ "terraform-ls" ]
@@ -1608,6 +1651,7 @@ name = "org"
16081651scope = "source.org"
16091652injection-regex = "org"
16101653file-types = ["org"]
1654+roots = []
16111655indent = { tab-width = 2, unit = " " }
16121656
16131657[[grammar]]
@@ -1619,6 +1663,7 @@ name = "solidity"
16191663scope = "source.sol"
16201664injection-regex = "(sol|solidity)"
16211665file-types = ["sol"]
1666+roots = []
16221667comment-token = "//"
16231668indent = { tab-width = 4, unit = " " }
16241669language-servers = [ "solc" ]
@@ -1640,13 +1685,14 @@ auto-format = true
16401685
16411686[[grammar]]
16421687name = "gleam"
1643−source = { git = "https://github.com/gleam-lang/tree-sitter-gleam", rev = "b2afa4fd6bb41a7bf912b034c653c90af7ae5122" }
1688+source = { git = "https://github.com/gleam-lang/tree-sitter-gleam", rev = "a59aadf3d7c11702cad244e7cd6b67b34ca9c16a" }
16441689
16451690[[language]]
16461691name = "ron"
16471692scope = "source.ron"
16481693injection-regex = "ron"
16491694file-types = ["ron"]
1695+roots = []
16501696comment-token = "//"
16511697indent = { tab-width = 4, unit = " " }
16521698
@@ -1660,6 +1706,7 @@ scope = "source.robot"
16601706injection-regex = "robot"
16611707file-types = ["robot", "resource"]
16621708comment-token = "#"
1709+roots = []
16631710indent = { tab-width = 4, unit = " " }
16641711language-servers = [ "robotframework_ls" ]
16651712
@@ -1673,6 +1720,7 @@ scope = "source.r"
16731720injection-regex = "(r|R)"
16741721file-types = ["r", "R", ".Rprofile", "Rprofile.site", ".RHistory"]
16751722shebangs = ["r", "R"]
1723+roots = []
16761724comment-token = "#"
16771725indent = { tab-width = 2, unit = " " }
16781726language-servers = [ "r" ]
@@ -1684,9 +1732,9 @@ source = { git = "https://github.com/r-lib/tree-sitter-r", rev = "cc04302e1bff76
16841732[[language]]
16851733name = "rmarkdown"
16861734scope = "source.rmd"
1687−language-id = "rmd"
16881735injection-regex = "(r|R)md"
16891736file-types = ["rmd", "Rmd"]
1737+roots = []
16901738indent = { tab-width = 2, unit = " " }
16911739grammar = "markdown"
16921740language-servers = [ "r" ]
@@ -1710,6 +1758,7 @@ name = "erb"
17101758scope = "text.html.erb"
17111759injection-regex = "erb"
17121760file-types = ["erb"]
1761+roots = []
17131762indent = { tab-width = 2, unit = " " }
17141763grammar = "embedded-template"
17151764
@@ -1718,6 +1767,7 @@ name = "ejs"
17181767scope = "text.html.ejs"
17191768injection-regex = "ejs"
17201769file-types = ["ejs"]
1770+roots = []
17211771indent = { tab-width = 2, unit = " " }
17221772grammar = "embedded-template"
17231773
@@ -1754,13 +1804,14 @@ source = { git = "https://github.com/phoenixframework/tree-sitter-heex", rev = "
17541804name = "sql"
17551805scope = "source.sql"
17561806file-types = ["sql", "dsql"]
1807+roots = []
17571808comment-token = "--"
17581809indent = { tab-width = 4, unit = " " }
17591810injection-regex = "sql"
17601811
17611812[[grammar]]
17621813name = "sql"
1763−source = { git = "https://github.com/DerekStride/tree-sitter-sql", rev = "25be0b8f17e9189ad9e1b875869d025c5aec1286" }
1814+source = { git = "https://github.com/DerekStride/tree-sitter-sql", rev = "eeab7240a11098724e6f95bc57cc3ceaf5487d5f" }
17641815
17651816[[language]]
17661817name = "gdscript"
@@ -1799,9 +1850,9 @@ scope = "source.nu"
17991850injection-regex = "nu"
18001851file-types = ["nu"]
18011852shebangs = ["nu"]
1853+roots = []
18021854comment-token = "#"
18031855indent = { tab-width = 2, unit = " " }
1804−language-servers = [ "nu-lsp" ]
18051856
18061857[[grammar]]
18071858name = "nu"
@@ -1812,6 +1863,7 @@ name = "vala"
18121863scope = "source.vala"
18131864injection-regex = "vala"
18141865file-types = ["vala", "vapi"]
1866+roots = []
18151867comment-token = "//"
18161868indent = { tab-width = 2, unit = " " }
18171869language-servers = [ "vala-language-server" ]
@@ -1825,6 +1877,7 @@ name = "hare"
18251877scope = "source.hare"
18261878injection-regex = "hare"
18271879file-types = ["ha"]
1880+roots = []
18281881comment-token = "//"
18291882indent = { tab-width = 8, unit = "\t" }
18301883
@@ -1837,6 +1890,7 @@ name = "devicetree"
18371890scope = "source.devicetree"
18381891injection-regex = "(dtsi?|devicetree|fdt)"
18391892file-types = ["dts", "dtsi"]
1893+roots = []
18401894comment-token = "//"
18411895indent = { tab-width = 4, unit = "\t" }
18421896
@@ -1849,6 +1903,7 @@ name = "cairo"
18491903scope = "source.cairo"
18501904injection-regex = "cairo"
18511905file-types = ["cairo"]
1906+roots = []
18521907comment-token = "//"
18531908indent = { tab-width = 4, unit = " " }
18541909# auto-format = true
@@ -1860,6 +1915,7 @@ name = "cpon"
18601915scope = "scope.cpon"
18611916injection-regex = "cpon"
18621917file-types = ["cpon", "cp"]
1918+roots = []
18631919auto-format = true
18641920comment-token = "//"
18651921indent = { tab-width = 2, unit = " " }
@@ -1886,7 +1942,8 @@ source = { git = "https://github.com/ap29600/tree-sitter-odin", rev = "b219207e4
18861942name = "meson"
18871943scope = "source.meson"
18881944injection-regex = "meson"
1889−file-types = ["meson.build", "meson_options.txt"]
1945+file-types = ["meson.build"]
1946+roots = []
18901947comment-token = "#"
18911948indent = { tab-width = 2, unit = " " }
18921949
@@ -1898,6 +1955,7 @@ source = { git = "https://github.com/staysail/tree-sitter-meson", rev = "32a83e8
18981955name = "sshclientconfig"
18991956scope = "source.sshclientconfig"
19001957file-types = [{ suffix = ".ssh/config" }, { suffix = "/etc/ssh/ssh_config" }]
1958+roots = []
19011959comment-token = "#"
19021960
19031961[[grammar]]
@@ -1910,6 +1968,7 @@ scope = "source.scheme"
19101968injection-regex = "scheme"
19111969file-types = ["ss", "scm"]
19121970shebangs = ["scheme", "guile", "chicken"]
1971+roots = []
19131972comment-token = ";"
19141973indent = { tab-width = 2, unit = " " }
19151974
@@ -1936,6 +1995,7 @@ source = {git = "https://github.com/v-analyzer/v-analyzer", subpath = "tree_sitt
19361995name = "verilog"
19371996scope = "source.verilog"
19381997file-types = ["v", "vh", "sv", "svh"]
1998+roots = []
19391999comment-token = "//"
19402000language-servers = [ "svlangserver" ]
19412001indent = { tab-width = 2, unit = " " }
@@ -1950,6 +2010,7 @@ name = "edoc"
19502010scope = "source.edoc"
19512011file-types = ["edoc", "edoc.in"]
19522012injection-regex = "edoc"
2013+roots = []
19532014indent = { tab-width = 4, unit = " " }
19542015
19552016[[grammar]]
@@ -1961,6 +2022,7 @@ name = "jsdoc"
19612022scope = "source.jsdoc"
19622023injection-regex = "jsdoc"
19632024file-types = ["jsdoc"]
2025+roots = []
19642026indent = { tab-width = 2, unit = " " }
19652027
19662028[[grammar]]
@@ -1972,6 +2034,7 @@ name = "openscad"
19722034scope = "source.openscad"
19732035injection-regex = "openscad"
19742036file-types = ["scad"]
2037+roots = []
19752038comment-token = "//"
19762039language-servers = [ "openscad-lsp" ]
19772040indent = { tab-width = 2, unit = "\t" }
@@ -2013,6 +2076,7 @@ name = "starlark"
20132076scope = "source.starlark"
20142077injection-regex = "(starlark|bzl|bazel)"
20152078file-types = ["bzl", "bazel", "BUILD", "star"]
2079+roots = []
20162080comment-token = "#"
20172081indent = { tab-width = 4, unit = " " }
20182082grammar = "python"
@@ -2021,6 +2085,7 @@ grammar = "python"
20212085name = "elvish"
20222086scope = "source.elvish"
20232087file-types = ["elv"]
2088+roots = []
20242089comment-token = "#"
20252090indent = { tab-width = 2, unit = " " }
20262091language-servers = [ "elvish" ]
@@ -2036,6 +2101,7 @@ scope = "source.idr"
20362101injection-regex = "idr"
20372102file-types = ["idr"]
20382103shebangs = []
2104+roots = []
20392105comment-token = "--"
20402106indent = { tab-width = 2, unit = " " }
20412107language-servers = [ "idris2-lsp" ]
@@ -2059,18 +2125,20 @@ name = "ungrammar"
20592125scope = "source.ungrammar"
20602126injection-regex = "ungrammar"
20612127file-types = ["ungram", "ungrammar"]
2128+roots = []
20622129comment-token = "//"
20632130indent = { tab-width = 2, unit = " " }
20642131
20652132[[grammar]]
20662133name = "ungrammar"
2067−source = { git = "https://github.com/Philipp-M/tree-sitter-ungrammar", rev = "a7e104629cff5a8b7367187610631e8f5eb7c6ea" }
2134+source = { git = "https://github.com/Philipp-M/tree-sitter-ungrammar", rev = "0113de880a58ea14f2a75802e9b99fcc25003d9c" }
20682135
20692136[[language]]
20702137name = "dot"
20712138scope = "source.dot"
20722139injection-regex = "dot"
20732140file-types = ["dot"]
2141+roots = []
20742142comment-token = "//"
20752143indent = { tab-width = 4, unit = " " }
20762144language-servers = [ "dot-language-server" ]
@@ -2100,6 +2168,7 @@ name = "slint"
21002168scope = "source.slint"
21012169injection-regex = "slint"
21022170file-types = ["slint"]
2171+roots = []
21032172comment-token = "//"
21042173indent = { tab-width = 4, unit = " " }
21052174language-servers = [ "slint-lsp" ]
@@ -2113,6 +2182,7 @@ name = "task"
21132182scope = "source.task"
21142183injection-regex = "task"
21152184file-types = ["task"]
2185+roots = []
21162186comment-token = "#"
21172187indent = { tab-width = 2, unit = " " }
21182188
@@ -2125,6 +2195,7 @@ name = "xit"
21252195scope = "source.xit"
21262196injection-regex = "xit"
21272197file-types = ["xit"]
2198+roots = []
21282199indent = { tab-width = 4, unit = " " }
21292200
21302201[[grammar]]
@@ -2149,6 +2220,7 @@ name = "pascal"
21492220scope = "source.pascal"
21502221injection-regex = "pascal"
21512222file-types = ["pas", "pp", "inc", "lpr", "lfm"]
2223+roots = []
21522224comment-token = "//"
21532225indent = { tab-width = 2, unit = " " }
21542226language-servers = [ "pasls" ]
@@ -2163,6 +2235,7 @@ scope = "source.sml"
21632235injection-regex = "sml"
21642236file-types = ["sml"]
21652237comment-token = "(*"
2238+roots = []
21662239
21672240[[grammar]]
21682241name = "sml"
@@ -2186,17 +2259,19 @@ name = "astro"
21862259scope = "source.astro"
21872260injection-regex = "astro"
21882261file-types = ["astro"]
2262+roots = []
21892263indent = { tab-width = 2, unit = " " }
21902264
21912265[[grammar]]
21922266name = "astro"
2193−source = { git = "https://github.com/virchau13/tree-sitter-astro", rev = "947e93089e60c66e681eba22283f4037841451e7" }
2267+source = { git = "https://github.com/virchau13/tree-sitter-astro", rev = "5f5c3e73c45967df9aa42f861fad2d77cd4e0900" }
21942268
21952269[[language]]
21962270name = "bass"
21972271scope = "source.bass"
21982272injection-regex = "bass"
21992273file-types = ["bass"]
2274+roots = []
22002275comment-token = ";"
22012276indent = { tab-width = 2, unit = " " }
22022277language-servers = [ "bass" ]
@@ -2210,6 +2285,7 @@ name = "wat"
22102285scope = "source.wat"
22112286comment-token = ";;"
22122287file-types = ["wat"]
2288+roots = []
22132289
22142290[[grammar]]
22152291name = "wat"
@@ -2220,6 +2296,7 @@ name = "wast"
22202296scope = "source.wast"
22212297comment-token = ";;"
22222298file-types = ["wast"]
2299+roots = []
22232300
22242301[[grammar]]
22252302name = "wast"
@@ -2229,6 +2306,7 @@ source = { git = "https://github.com/wasm-lsp/tree-sitter-wasm", rev = "2ca28a9f
22292306name = "d"
22302307scope = "source.d"
22312308file-types = [ "d", "dd" ]
2309+roots = []
22322310comment-token = "//"
22332311injection-regex = "d"
22342312indent = { tab-width = 4, unit = " "}
@@ -2237,12 +2315,13 @@ formatter = { command = "dfmt" }
22372315
22382316[[grammar]]
22392317name = "d"
2240−source = { git = "https://github.com/gdamore/tree-sitter-d", rev = "5566f8ce8fc24186fad06170bbb3c8d97c935d74" }
2318+source = { git = "https://github.com/gdamore/tree-sitter-d", rev="601c4a1e8310fb2f3c43fa8a923d0d27497f3c04" }
22412319
22422320[[language]]
22432321name = "vhs"
22442322scope = "source.vhs"
22452323file-types = ["tape"]
2324+roots = []
22462325comment-token = "#"
22472326indent = { tab-width = 2, unit = " " }
22482327grammar = "vhs"
@@ -2255,12 +2334,13 @@ source = { git = "https://github.com/charmbracelet/tree-sitter-vhs", rev = "c6d8
22552334name = "kdl"
22562335scope = "source.kdl"
22572336file-types = ["kdl"]
2337+roots = []
22582338comment-token = "//"
22592339injection-regex = "kdl"
22602340
22612341[[grammar]]
22622342name = "kdl"
2263−source = { git = "https://github.com/amaanq/tree-sitter-kdl", rev = "3ca569b9f9af43593c24f9e7a21f02f43a13bb88" }
2343+source = { git = "https://github.com/Unoqwy/tree-sitter-kdl", rev = "e1cd292c6d15df6610484e1d4b5c987ecad52373" }
22642344
22652345[[language]]
22662346name = "xml"
@@ -2320,11 +2400,10 @@ file-types = [
23202400 "xliff",
23212401 "xpdl",
23222402 "xul",
2323− "xoml",
2324− "musicxml",
2325− "glif"
2403+ "xoml"
23262404]
23272405indent = { tab-width = 2, unit = " " }
2406+roots = []
23282407
23292408[language.auto-pairs]
23302409'(' = ')'
@@ -2345,6 +2424,7 @@ scope = "source.dtd"
23452424injection-regex = "dtd"
23462425file-types = ["dtd", "ent"]
23472426indent = {tab-width = 2, unit = " "}
2427+roots = []
23482428
23492429[language.auto-pairs]
23502430'(' = ')'
@@ -2362,6 +2442,7 @@ name = "wit"
23622442scope = "source.wit"
23632443injection-regex = "wit"
23642444file-types = ["wit"]
2445+roots = []
23652446comment-token = "//"
23662447indent = { tab-width = 2, unit = " " }
23672448
@@ -2380,10 +2461,11 @@ source = { git = "https://github.com/hh9527/tree-sitter-wit", rev = "c917790ab9a
23802461[[language]]
23812462name = "env"
23822463scope = "source.env"
2383−file-types = [".env", ".env.local", ".env.development", ".env.production", ".env.dist", ".envrc", ".envrc.local", ".envrc.private"]
2464+file-types = [".env", ".env.local", ".env.development", ".env.production", ".env.dist", ".envrc"]
23842465injection-regex = "env"
23852466comment-token = "#"
23862467indent = { tab-width = 4, unit = "\t" }
2468+roots = []
23872469grammar = "bash"
23882470
23892471[[language]]
@@ -2416,6 +2498,7 @@ file-types = [
24162498injection-regex = "ini"
24172499comment-token = "#"
24182500indent = { tab-width = 4, unit = "\t" }
2501+roots = []
24192502
24202503[[grammar]]
24212504name = "ini"
@@ -2425,6 +2508,7 @@ source = { git = "https://github.com/justinmk/tree-sitter-ini", rev = "4d247fb87
24252508name = "bicep"
24262509scope = "source.bicep"
24272510file-types = ["bicep"]
2511+roots = []
24282512auto-format = true
24292513comment-token = "//"
24302514indent = { tab-width = 2, unit = " "}
@@ -2438,6 +2522,7 @@ source = { git = "https://github.com/the-mikedavis/tree-sitter-bicep", rev = "d8
24382522name = "qml"
24392523scope = "source.qml"
24402524file-types = ["qml"]
2525+roots = []
24412526language-servers = [ "qmlls" ]
24422527indent = { tab-width = 4, unit = " " }
24432528grammar = "qmljs"
@@ -2451,6 +2536,7 @@ name = "mermaid"
24512536scope = "source.mermaid"
24522537injection-regex = "mermaid"
24532538file-types = ["mermaid"]
2539+roots = []
24542540comment-token = "%%"
24552541indent = { tab-width = 4, unit = " " }
24562542
@@ -2464,6 +2550,7 @@ scope = "source.m"
24642550file-types = ["m"]
24652551comment-token = "%"
24662552shebangs = ["octave-cli", "matlab"]
2553+roots = []
24672554indent = { tab-width = 2, unit = " " }
24682555
24692556[[grammar]]
@@ -2488,6 +2575,7 @@ name = "dhall"
24882575scope = "source.dhall"
24892576injection-regex = "dhall"
24902577file-types = ["dhall"]
2578+roots = []
24912579comment-token = "--"
24922580indent = { tab-width = 2, unit = " " }
24932581language-servers = [ "dhall-lsp-server" ]
@@ -2502,6 +2590,7 @@ name = "sage"
25022590scope = "source.sage"
25032591file-types = ["sage"]
25042592injection-regex = "sage"
2593+roots = []
25052594comment-token = "#"
25062595indent = { tab-width = 4, unit = " " }
25072596grammar = "python"
@@ -2512,6 +2601,7 @@ scope = "source.msbuild"
25122601injection-regex = "msbuild"
25132602file-types = ["proj", "vbproj", "csproj", "fsproj", "targets", "props"]
25142603indent = { tab-width = 2, unit = " " }
2604+roots = []
25152605grammar = "xml"
25162606
25172607[language.auto-pairs]
@@ -2527,6 +2617,7 @@ name = "pem"
25272617scope = "source.pem"
25282618file-types = ["pem", "cert", "crt"]
25292619injection-regex = "pem"
2620+roots = []
25302621grammar = "pem"
25312622
25322623[[grammar]]
@@ -2537,6 +2628,7 @@ source = { git = "https://github.com/mtoohey31/tree-sitter-pem", rev = "be67a433
25372628name = "passwd"
25382629scope = "source.passwd"
25392630file-types = ["passwd"]
2631+roots = []
25402632
25412633[[grammar]]
25422634name = "passwd"
@@ -2546,6 +2638,7 @@ source = { git = "https://github.com/ath3/tree-sitter-passwd", rev = "20239395ea
25462638name = "hosts"
25472639scope = "source.hosts"
25482640file-types = ["hosts"]
2641+roots = []
25492642comment-token = "#"
25502643
25512644[[grammar]]
@@ -2557,18 +2650,20 @@ name = "uxntal"
25572650scope = "source.tal"
25582651injection-regex = "tal"
25592652file-types = ["tal"]
2653+roots = []
25602654auto-format = false
25612655comment-token = "("
25622656
25632657[[grammar]]
25642658name = "uxntal"
2565−source = { git = "https://github.com/Jummit/tree-sitter-uxntal", rev = "d68406066648cd6db4c6a2f11ec305af02079884" }
2659+source = { git = "https://github.com/Jummit/tree-sitter-uxntal", rev = "9297e95ef74380b0ad84c4fd98f91e9f6e4319e6" }
25662660
25672661[[language]]
25682662name = "yuck"
25692663scope = "source.yuck"
25702664injection-regex = "yuck"
25712665file-types = ["yuck"]
2666+roots = []
25722667comment-token = ";"
25732668indent = { tab-width = 2, unit = " " }
25742669
@@ -2581,6 +2676,7 @@ name = "prql"
25812676scope = "source.prql"
25822677injection-regex = "prql"
25832678file-types = ["prql"]
2679+roots = []
25842680comment-token = "#"
25852681indent = { tab-width = 4, unit = " " }
25862682
@@ -2592,6 +2688,7 @@ source = { git = "https://github.com/PRQL/tree-sitter-prql", rev = "09e158cd3650
25922688name = "po"
25932689scope = "source.po"
25942690file-types = ["po", "pot"]
2691+roots = []
25952692comment-token = "#"
25962693
25972694[[grammar]]
@@ -2603,6 +2700,7 @@ name = "nasm"
26032700scope = "source.nasm"
26042701file-types = ["asm", "S", "nasm"]
26052702injection-regex = "n?asm"
2703+roots = []
26062704comment-token = ";"
26072705indent = { tab-width = 8, unit = " " }
26082706
@@ -2615,6 +2713,7 @@ name = "gas"
26152713scope = "source.gas"
26162714file-types = ["s"]
26172715injection-regex = "gas"
2716+roots = []
26182717comment-token = "#"
26192718indent = { tab-width = 8, unit = " " }
26202719
@@ -2627,6 +2726,7 @@ name = "rst"
26272726scope = "source.rst"
26282727comment-token = ".."
26292728file-types = ["rst"]
2729+roots = []
26302730
26312731[[grammar]]
26322732name = "rst"
@@ -2637,6 +2737,7 @@ name = "capnp"
26372737scope = "source.capnp"
26382738injection-regex = "capnp"
26392739file-types = ["capnp"]
2740+roots = []
26402741comment-token = "#"
26412742indent = { tab-width = 2, unit = " " }
26422743
@@ -2662,6 +2763,7 @@ source = { git = "https://github.com/indoorvivants/tree-sitter-smithy", rev = "c
26622763name = "vhdl"
26632764scope = "source.vhdl"
26642765file-types = ["vhd", "vhdl"]
2766+roots = []
26652767comment-token = "--"
26662768language-servers = [ "vhdl_ls" ]
26672769indent = { tab-width = 2, unit = " " }
@@ -2673,6 +2775,7 @@ source = { git = "https://github.com/teburd/tree-sitter-vhdl", rev = "c57313adee
26732775
26742776[[language]]
26752777name = "rego"
2778+roots = []
26762779scope = "source.rego"
26772780injection-regex = "rego"
26782781file-types = ["rego"]
@@ -2683,7 +2786,7 @@ grammar = "rego"
26832786
26842787[[grammar]]
26852788name = "rego"
2686−source = { git = "https://github.com/FallenAngel97/tree-sitter-rego", rev = "9ac75e71b2d791e0aadeef68098319d86a2a14cf" }
2789+source = { git = "https://github.com/FallenAngel97/tree-sitter-rego", rev = "b2667c975f07b33be3ceb83bea5cfbad88095866" }
26872790
26882791[[language]]
26892792name = "nim"
@@ -2691,6 +2794,7 @@ scope = "source.nim"
26912794injection-regex = "nim"
26922795file-types = ["nim", "nims", "nimble"]
26932796shebangs = []
2797+roots = []
26942798comment-token = "#"
26952799indent = { tab-width = 2, unit = " " }
26962800language-servers = [ "nimlangserver" ]
@@ -2714,13 +2818,13 @@ file-types = [ "cabal" ]
27142818roots = ["cabal.project", "Setup.hs"]
27152819indent = { tab-width = 2, unit = " " }
27162820comment-token = "--"
2717−language-servers = [ "haskell-language-server" ]
27182821
27192822[[language]]
27202823name = "hurl"
27212824scope = "source.hurl"
27222825injection-regex = "hurl"
27232826file-types = ["hurl"]
2827+roots = []
27242828comment-token = "#"
27252829indent = { tab-width = 2, unit = " " }
27262830
@@ -2731,6 +2835,7 @@ source = { git = "https://github.com/pfeiferj/tree-sitter-hurl", rev = "264c4206
27312835[[language]]
27322836name = "markdoc"
27332837scope = "text.markdoc"
2838+roots = []
27342839file-types = ["mdoc"]
27352840language-servers = [ "markdoc-ls" ]
27362841
@@ -2743,6 +2848,7 @@ name = "opencl"
27432848scope = "source.cl"
27442849injection-regex = "(cl|opencl)"
27452850file-types = ["cl"]
2851+roots = []
27462852comment-token = "//"
27472853language-servers = [ "clangd" ]
27482854
@@ -2755,6 +2861,7 @@ name = "just"
27552861scope = "source.just"
27562862file-types = ["justfile", "Justfile", ".justfile", ".Justfile"]
27572863injection-regex = "just"
2864+roots = []
27582865comment-token = "#"
27592866indent = { tab-width = 4, unit = "\t" }
27602867
@@ -2762,25 +2869,12 @@ indent = { tab-width = 4, unit = "\t" }
27622869name = "just"
27632870source = { git = "https://github.com/IndianBoy42/tree-sitter-just", rev = "8af0aab79854aaf25b620a52c39485849922f766" }
27642871
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−
27792872[[language]]
27802873name = "blueprint"
27812874scope = "source.blueprint"
27822875injection-regex = "blueprint"
27832876file-types = ["blp"]
2877+roots = []
27842878comment-token = "//"
27852879language-servers = [ "blueprint-compiler" ]
27862880indent = { tab-width = 4, unit = " " }
@@ -2794,13 +2888,14 @@ name = "forth"
27942888scope = "source.forth"
27952889injection-regex = "forth"
27962890file-types = ["fs", "forth", "fth", "4th"]
2891+roots = []
27972892comment-token = "\\"
27982893language-servers = [ "forth-lsp" ]
27992894indent = { tab-width = 3, unit = " " }
28002895
28012896[[grammar]]
28022897name = "forth"
2803−source = { git = "https://github.com/alexanderbrevig/tree-sitter-forth", rev = "90189238385cf636b9ee99ce548b9e5b5e569d48" }
2898+source = { git = "https://github.com/alexanderbrevig/tree-sitter-forth", rev = "304ed77beb113e37af38b20ff14e3c37bf350d10" }
28042899
28052900[[language]]
28062901name = "fsharp"
@@ -2822,6 +2917,7 @@ name = "t32"
28222917scope = "source.t32"
28232918injection-regex = "t32"
28242919file-types = ["cmm", "t32"]
2920+roots = []
28252921comment-token = ";"
28262922indent = { tab-width = 2, unit = " " }
28272923
@@ -2834,6 +2930,7 @@ name = "webc"
28342930scope = "text.html.webc"
28352931injection-regex = "webc"
28362932file-types = ["webc"]
2933+roots = []
28372934indent = { tab-width = 2, unit = " " }
28382935grammar = "html"
28392936
@@ -2842,6 +2939,7 @@ name = "typst"
28422939scope = "source.typst"
28432940injection-regex = "typst"
28442941file-types = ["typst", "typ"]
2942+roots = []
28452943comment-token = "//"
28462944language-servers = ["typst-lsp"]
28472945indent = { tab-width = 2, unit = " " }
@@ -2862,6 +2960,7 @@ name = "nunjucks"
28622960scope = "text.html.nunjucks"
28632961injection-regex = "nunjucks"
28642962file-types = ["njk"]
2963+roots = []
28652964indent = { tab-width = 2, unit = " " }
28662965grammar = "jinja2"
28672966
@@ -2870,6 +2969,7 @@ name = "jinja"
28702969scope = "text.html.jinja"
28712970injection-regex = "jinja"
28722971file-types = ["jinja", "jinja2", "j2"]
2972+roots = []
28732973indent = { tab-width = 2, unit = " " }
28742974grammar = "jinja2"
28752975
@@ -2886,6 +2986,7 @@ name = "wren"
28862986scope = "source.wren"
28872987injection-regex = "wren"
28882988file-types = ["wren"]
2989+roots = []
28892990indent = { tab-width = 2, unit = " "}
28902991
28912992[[language]]
@@ -2894,6 +2995,7 @@ scope = "source.unison"
28942995injection-regex = "unison"
28952996file-types = ["u"]
28962997shebangs = []
2998+roots = []
28972999auto-format = false
28983000comment-token = "--"
28993001indent = { tab-width = 4, unit = " " }
@@ -2913,6 +3015,7 @@ source = { git = "https://github.com/kylegoetz/tree-sitter-unison", rev = "98c4e
29133015name = "todotxt"
29143016scope = "text.todotxt"
29153017file-types = [{ suffix = ".todo.txt" }, "todotxt"]
3018+roots = []
29163019formatter = { command = "sort" }
29173020auto-format = true
29183021
@@ -2924,6 +3027,7 @@ source = { git = "https://github.com/arnarg/tree-sitter-todotxt", rev = "0207f6a
29243027name = "strace"
29253028scope = "source.strace"
29263029file-types = ["strace"]
3030+roots = []
29273031
29283032[[grammar]]
29293033name = "strace"
@@ -2933,36 +3037,11 @@ source = { git = "https://github.com/sigmaSd/tree-sitter-strace", rev = "2b18fdf
29333037name = "gemini"
29343038scope = "source.gmi"
29353039file-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"]
29463040roots = []
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
29623041
29633042[[grammar]]
2964−name = "agda"
2965−source = { git = "https://github.com/tree-sitter/tree-sitter-agda", rev = "c21c3a0f996363ed17b8ac99d827fe5a4821f217" }
3043+name = "gemini"
3044+source = { git = "https://git.sr.ht/~sfr/tree-sitter-gemini", rev = "3cc5e4bdf572d5df4277fc2e54d6299bd59a54b3" }
29663045
29673046[[language]]
29683047name = "templ"
@@ -2976,33 +3055,3 @@ language-servers = [ "templ" ]
29763055[[grammar]]
29773056name = "templ"
29783057source = { 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−5
@@ -39,11 +39,11 @@
3939 (identifier) @variable.parameter))
4040
4141; (p?: t)
42−; (p?: t = 1) // Invalid but still possible to highlight.
42+; (p?: t = 1) // Invalid but still posible to hihglight.
4343(optional_parameter
4444 (identifier) @variable.parameter)
4545
46−; (...p?: t) // Invalid but still possible to highlight.
46+; (...p?: t) // Invalid but still posible to hihglight.
4747(optional_parameter
4848 (rest_pattern
4949 (identifier) @variable.parameter))
@@ -59,7 +59,7 @@
5959 (pair_pattern
6060 value: (identifier) @variable.parameter)))
6161
62−; ([ p ]?: t[]) // Invalid but still possible to highlight.
62+; ([ p ]?: t[]) // Invalid but still posible to hihglight.
6363(optional_parameter
6464 (array_pattern
6565 (identifier) @variable.parameter))
@@ -107,8 +107,6 @@
107107; Types
108108; -----
109109
110−(type_parameter
111− name: (type_identifier) @type.parameter)
112110(type_identifier) @type
113111(predefined_type) @type.builtin
114112
runtime/queries/_typescript/locals.scm−17
@@ -1,18 +1,6 @@
1−; Scopes
2−;-------
3−
4−[
5− (type_alias_declaration)
6− (class_declaration)
7− (interface_declaration)
8−] @local.scope
9−
101; Definitions
112;------------
123
13−(type_parameter
14− name: (type_identifier) @local.definition)
15−
164; Javascript and Typescript Treesitter grammars deviate when defining the
175; tree structure for parameters, so we need to address them in each specific
186; language instead of ecma.
@@ -26,8 +14,3 @@
2614; (i?: t = 1) // Invalid but still posible to hihglight.
2715(optional_parameter
2816 (identifier) @local.definition)
29−
30−; References
31−;-----------
32−
33−(type_identifier) @local.reference
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 @@
3636(parameter_list
3737 . (parameter_declaration) @anchor
3838 (#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/common-lisp/indents.scmdeleted−1
@@ -1 +0,0 @@
1−; inherits: scheme
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 @@
2121
2222; Functions
2323(unqualified_import (identifier) @function)
24−(unqualified_import "type" (type_identifier) @type)
25−(unqualified_import (type_identifier) @constructor)
2624(function
2725 name: (identifier) @function)
2826(external_function
@@ -45,13 +43,6 @@
4543(tuple_access
4644 index: (integer) @variable.other.member)
4745
48−; Attributes
49−(attribute
50− "@" @attribute
51− name: (identifier) @attribute)
52−
53−(attribute_value (identifier) @constant)
54−
5546; Type names
5647(remote_type_identifier) @type
5748(type_identifier) @type
@@ -69,6 +60,10 @@
6960(identifier) @variable
7061(discard) @comment.unused
7162
63+; Operators
64+(binary_expression
65+ operator: _ @operator)
66+
7267; Keywords
7368[
7469 (visibility_modifier) ; "pub"
@@ -77,7 +72,6 @@
7772 "assert"
7873 "case"
7974 "const"
80− ; DEPRECATED: 'external' was removed in v0.30.
8175 "external"
8276 "fn"
8377 "if"
@@ -85,16 +79,11 @@
8579 "let"
8680 "panic"
8781 "todo"
82+ "try"
8883 "type"
8984 "use"
9085] @keyword
9186
92−; Operators
93−(binary_expression
94− operator: _ @operator)
95−(boolean_negation "!" @operator)
96−(integer_negation "-" @operator)
97−
9887; Punctuation
9988[
10089 "("
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/go/highlights.scm+4−12
@@ -11,18 +11,6 @@
1111 function: (selector_expression
1212 field: (field_identifier) @function.method))
1313
14−
15−; Types
16−
17−(type_parameter_list
18− (parameter_declaration
19− name: (identifier) @type.parameter))
20−
21−((type_identifier) @type.builtin
22− (match? @type.builtin "^(any|bool|byte|comparable|complex128|complex64|error|float32|float64|int|int16|int32|int64|int8|rune|string|uint|uint16|uint32|uint64|uint8|uintptr)$"))
23−
24−(type_identifier) @type
25−
2614; Function definitions
2715
2816(function_declaration
@@ -42,6 +30,10 @@
4230(parameter_declaration (identifier) @variable.parameter)
4331(variadic_parameter_declaration (identifier) @variable.parameter)
4432
33+((type_identifier) @type.builtin
34+ (match? @type.builtin "^(any|bool|byte|comparable|complex128|complex64|error|float32|float64|int|int16|int32|int64|int8|rune|string|uint|uint16|uint32|uint64|uint8|uintptr)$"))
35+
36+(type_identifier) @type
4537(type_spec
4638 name: (type_identifier) @constructor)
4739(field_identifier) @variable.other.member
runtime/queries/go/locals.scm+2−10
@@ -1,17 +1,9 @@
11; Scopes
22
3−[
4− (function_declaration)
5− (type_declaration)
6− (block)
7−] @local.scope
3+(block) @local.scope
84
95; Definitions
106
11−(type_parameter_list
12− (parameter_declaration
13− name: (identifier) @local.definition))
14−
157(parameter_declaration (identifier) @local.definition)
168(variadic_parameter_declaration (identifier) @local.definition)
179
@@ -35,4 +27,4 @@
3527
3628(identifier) @local.reference
3729(field_identifier) @local.reference
38−(type_identifier) @local.reference
30+
runtime/queries/haskell/highlights.scm+1−1
@@ -124,7 +124,7 @@
124124;; Types
125125
126126(type) @type
127−(type_variable) @type.parameter
127+(type_variable) @type
128128
129129(constructor) @constructor
130130
runtime/queries/janet/highlights.scmdeleted−1
@@ -1 +0,0 @@
1−; inherits: clojure
runtime/queries/kdl/highlights.scm+4−4
@@ -1,12 +1,12 @@
1+(comment) @comment
12(single_line_comment) @comment
2−(multi_line_comment) @comment
33
44(node
5− (identifier) @variable)
6−
5+ name: (identifier) @function)
76(prop (identifier) @attribute)
7+(type) @type
88
9−(type (_) @type) @punctuation.bracket
9+(bare_identifier) @variable.other.member
1010
1111(keyword) @keyword
1212
runtime/queries/kdl/indents.scmdeleted−3
@@ -1,3 +0,0 @@
1−(node_children) @indent
2−
3− "}" @outdent
runtime/queries/kdl/textobjects.scmdeleted−27
@@ -1,27 +0,0 @@
1−(type (_) @test.inside) @test.around
2−
3−(node
4− children: (node_children)? @class.inside) @class.around
5−
6−(node
7− children: (node_children)? @function.inside) @function.around
8−
9−(node (identifier) @function.movement)
10−
11−[
12− (single_line_comment)
13− (multi_line_comment)
14−] @comment.inside
15−
16−[
17− (single_line_comment)+
18− (multi_line_comment)+
19−] @comment.around
20−
21−[
22− (prop)
23− (value)
24−] @parameter.inside
25−
26−(value (type) ? (_) @parameter.inside @parameter.movement . ) @parameter.around
27−
runtime/queries/kotlin/highlights.scm+1−4
@@ -244,10 +244,7 @@
244244 . (identifier)) @namespace
245245
246246((type_identifier) @type.builtin
247− (#match? @type.builtin "^(Byte|Short|Int|Long|UByte|UShort|UInt|ULong|Float|Double|Boolean|Char|String|Array|ByteArray|ShortArray|IntArray|LongArray|UByteArray|UShortArray|UIntArray|ULongArray|FloatArray|DoubleArray|BooleanArray|CharArray|Map|Set|List|EmptyMap|EmptySet|EmptyList|MutableMap|MutableSet|MutableList)$"))
248−
249−(type_parameter
250− (type_identifier) @type.parameter)
247+ (#match? @function.builtin "^(Byte|Short|Int|Long|UByte|UShort|UInt|ULong|Float|Double|Boolean|Char|String|Array|ByteArray|ShortArray|IntArray|LongArray|UByteArray|UShortArray|UIntArray|ULongArray|FloatArray|DoubleArray|BooleanArray|CharArray|Map|Set|List|EmptyMap|EmptySet|EmptyList|MutableMap|MutableSet|MutableList)$"))
251248
252249(type_identifier) @type
253250
runtime/queries/kotlin/locals.scmdeleted−15
@@ -1,15 +0,0 @@
1−; Scopes
2−
3−[
4− (class_declaration)
5− (function_declaration)
6−] @local.scope
7−
8−; Definitions
9−
10−(type_parameter
11− (type_identifier) @local.definition)
12−
13−; References
14−
15−(type_identifier) @local.reference
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/ocaml/highlights.scm−2
@@ -8,8 +8,6 @@
88
99[(class_name) (class_type_name) (type_constructor)] @type
1010
11−(type_variable) @type.parameter
12−
1311[(constructor_name) (tag)] @constructor
1412
1513; Functions
runtime/queries/purescript/highlights.scm+9−48
@@ -1,31 +1,17 @@
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−
171; ----------------------------------------------------------------------------
182; Literals and comments
193
204 (integer) @constant.numeric.integer
215 (exp_negation) @constant.numeric.integer
22− (exp_literal (number)) @constant.numeric.float
6+ (exp_literal (float)) @constant.numeric.float
237 (char) @constant.character
248 [
259 (string)
2610 (triple_quote_string)
2711 ] @string
2812
13+ (con_unit) @constant.builtin ; unit, as in ()
14+
2915 (comment) @comment
3016
3117
@@ -50,10 +36,6 @@
5036; ----------------------------------------------------------------------------
5137; Keywords, operators, includes
5238
53− ; This needs to come before the other "else" in
54− ; order to be highlighted correctly
55− (class_instance "else" @keyword)
56−
5739 [
5840 "if"
5941 "then"
@@ -71,20 +53,15 @@
7153 (operator)
7254 (constructor_operator)
7355 (type_operator)
56+ (tycon_arrow)
7457 (qualified_module) ; grabs the `.` (dot), ex: import System.IO
7558 (all_names)
76−
77− ; `_` wildcards in if-then-else and case-of expressions,
78− ; as well as record updates and operator sections
79− (wildcard)
8059 "="
8160 "|"
8261 "::"
8362 "∷"
8463 "=>"
8564 "⇒"
86− "<="
87− "⇐"
8865 "->"
8966 "→"
9067 "<-"
@@ -112,7 +89,6 @@
11289 "newtype"
11390 "type"
11491 "as"
115− "hiding"
11692 "do"
11793 "ado"
11894 "forall"
@@ -122,39 +98,24 @@
12298 "infixr"
12399 ] @keyword
124100
125− (type_role_declaration
126− "role" @keyword
127− role: (type_role) @keyword)
128−
129− (hole) @label
130101
131102; ----------------------------------------------------------------------------
132103; Functions and variables
133104
134− (row_field (field_name) @variable.other.member)
135− (record_field (field_name) @variable.other.member)
136− (record_field (field_pun) @variable.other.member)
137−
138105 (signature name: (variable) @type)
139106 (function name: (variable) @function)
140− (class_instance (instance_name) @function)
141− (derive_declaration (instance_name) @function)
142107
143108 ; true or false
144− ((variable) @constant.builtin.boolean
145− (#match? @constant.builtin.boolean "^(true|false)$"))
146−
147− ; 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
149− ; as an operator and leaving it to the child nodes, and highlighting everything as an operator.
150− (exp_ticked (_) @operator)
151− (exp_ticked (exp_name (variable) @operator))
152− (exp_ticked (exp_name (qualified_variable (variable) @operator)))
109+((variable) @constant.builtin.boolean
110+ (#match? @constant.builtin.boolean "^(true|false)$"))
153111
154112 (variable) @variable
155113
114+ (exp_infix (variable) @operator) ; consider infix functions as operators
115+
156116 ("@" @namespace) ; "as" pattern operator, e.g. x@Constructor
157117
118+
158119; ----------------------------------------------------------------------------
159120; Types
160121
runtime/queries/python/highlights.scm−6
@@ -134,17 +134,14 @@
134134 "//="
135135 "/="
136136 "&"
137− "&="
138137 "%"
139138 "%="
140139 "^"
141− "^="
142140 "+"
143141 "->"
144142 "+="
145143 "<"
146144 "<<"
147− "<<="
148145 "<="
149146 "<>"
150147 "="
@@ -153,11 +150,8 @@
153150 ">"
154151 ">="
155152 ">>"
156− ">>="
157153 "|"
158− "|="
159154 "~"
160− "@="
161155] @operator
162156
163157[
runtime/queries/racket/indents.scmdeleted−1
@@ -1 +0,0 @@
1−; inherits: scheme
runtime/queries/rust/highlights.scm−7
@@ -9,13 +9,6 @@
99; Types
1010; -------
1111
12−(type_parameters
13− (type_identifier) @type.parameter)
14−(constrained_type_parameter
15− left: (type_identifier) @type.parameter)
16−(optional_type_parameter
17− name: (type_identifier) @type.parameter)
18−
1912; ---
2013; Primitives
2114; ---
runtime/queries/rust/locals.scm+1−14
@@ -2,12 +2,6 @@
22
33[
44 (function_item)
5− (struct_item)
6− (enum_item)
7− (union_item)
8− (type_item)
9− (trait_item)
10− (impl_item)
115 (closure_expression)
126 (block)
137] @local.scope
@@ -17,15 +11,8 @@
1711(parameter
1812 (identifier) @local.definition)
1913
20−(type_parameters
21− (type_identifier) @local.definition)
22−(constrained_type_parameter
23− left: (type_identifier) @local.definition)
24−(optional_type_parameter
25− name: (type_identifier) @local.definition)
26−
2714(closure_parameters (identifier) @local.definition)
2815
2916; References
3017(identifier) @local.reference
31−(type_identifier) @local.reference
18+
runtime/queries/scheme/indents.scmdeleted−43
@@ -1,43 +0,0 @@
1−; This roughly follows the description at: https://github.com/ds26gte/scmindent#how-subforms-are-indented
2−
3−; Exclude literals in the first patterns, since different rules apply for them.
4−; Similarly, exclude certain keywords (detected by a regular expression).
5−; If a list has 2 elements on the first line, it is aligned to the second element.
6−(list . (_) @first . (_) @anchor
7− (#same-line? @first @anchor)
8− (#set! "scope" "tail")
9− (#not-kind-eq? @first "boolean") (#not-kind-eq? @first "character") (#not-kind-eq? @first "string") (#not-kind-eq? @first "number")
10− (#not-match? @first "def.*|let.*|set!")) @align
11−; If the first element in a list is also a list and on a line by itself, the outer list is aligned to it
12−(list . (list) @anchor .
13− (#set! "scope" "tail")
14− (#not-kind-eq? @first "boolean") (#not-kind-eq? @first "character") (#not-kind-eq? @first "string") (#not-kind-eq? @first "number")) @align
15−(list . (list) @anchor . (_) @second
16− (#not-same-line? @anchor @second)
17− (#set! "scope" "tail")
18− (#not-kind-eq? @first "boolean") (#not-kind-eq? @first "character") (#not-kind-eq? @first "string") (#not-kind-eq? @first "number")
19− (#not-match? @first "def.*|let.*|set!")) @align
20−; If the first element in a list is not a list and on a line by itself, the outer list is aligned to
21−; it plus 1 additional space. This cannot currently be modelled exactly by our indent queries,
22−; but the following is equivalent, assuming that:
23−; - the indent width is 2 (the default for scheme)
24−; - There is no space between the opening parenthesis of the list and the first element
25−(list . (_) @first .
26− (#not-kind-eq? @first "boolean") (#not-kind-eq? @first "character") (#not-kind-eq? @first "string") (#not-kind-eq? @first "number")
27− (#not-match? @first "def.*|let.*|set!")) @indent
28−(list . (_) @first . (_) @second
29− (#not-same-line? @first @second)
30− (#not-kind-eq? @first "boolean") (#not-kind-eq? @first "character") (#not-kind-eq? @first "string") (#not-kind-eq? @first "number")
31− (#not-match? @first "def.*|let.*|set!")) @indent
32−
33−; If the first element in a list is a literal, align the list to it
34−(list . [(boolean) (character) (string) (number)] @anchor
35− (#set! "scope" "tail")) @align
36−
37−; If the first element is among a set of predefined keywords, align the list to this element
38−; plus 1 space (using the same workaround as above for now). This is a simplification since actually
39−; the second line of the list should be indented by 2 spaces more in some cases. Supporting this would
40−; be possible but require significantly more patterns.
41−(list . (symbol) @first
42− (#match? @first "def.*|let.*|set!")) @indent
43−
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 @@
131131 (keyword_partition)
132132 (keyword_group)
133133 (keyword_with)
134− (keyword_without)
135134 (keyword_as)
136135 (keyword_having)
137136 (keyword_limit)
@@ -228,7 +227,6 @@
228227 (keyword_input)
229228 (keyword_name)
230229 (keyword_oid)
231− (keyword_oids)
232230 (keyword_options)
233231 (keyword_plpgsql)
234232 (keyword_precision)
@@ -266,44 +264,6 @@
266264 (keyword_user)
267265 (keyword_valid)
268266 (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)
307267] @keyword
308268
309269[
@@ -413,8 +373,10 @@
413373 ">="
414374 ">"
415375 "<>"
416− (op_other)
417− (op_unary_other)
376+ "->"
377+ "->>"
378+ "#>"
379+ "#>>"
418380] @operator
419381
420382[
runtime/queries/yuck/highlights.scm+1−1
@@ -101,7 +101,7 @@
101101(list
102102 (symbol) @tag)
103103
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
105105
106106(ident) @variable
107107(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
66# Author : Name <email@my.domain>
77```
88
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−
179We 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 @@
1515"ui.statusline.select" = { bg = "orange", fg = "grey01" }
1616"ui.help" = { fg = "grey04", bg = "grey01" }
1717"ui.cursor" = { fg = "grey04", modifiers = ["reversed"] }
18−"ui.cursor.primary" = { fg = "grey02", bg = "grey05" }
18+"ui.cursor.primary" = { fg = "grey05", modifiers = ["reversed"] }
1919"ui.cursor.match" = { fg = "white", modifiers = ["underlined"] }
2020"ui.cursorline.primary" = { bg = "grey02" }
2121"ui.cursorline.secondary" = { bg = "grey02" }
@@ -35,11 +35,7 @@
3535"constant.numeric" = "lightblue"
3636"constant.character.escape" = "white"
3737"attribute" = "yellow"
38−"type" = "white"
39−"type.builtin" = "orange"
40−"type.parameter" = { fg = "white", modifiers = ["bold"] }
41−"type.enum" = "white"
42−"type.enum.variant" = "orange"
38+"type" = "orange"
4339"string" = "darkgreen"
4440"function" = "yellow"
4541"function.macro" = "green"
runtime/themes/everblush.toml−1
@@ -68,7 +68,6 @@
6868"ui.virtual.whitespace" = { fg = "comment" }
6969"ui.virtual.wrap" = { fg = "comment" }
7070"ui.virtual.indent-guide" = { fg = "comment" }
71−"ui.virtual.inlay-hint" = { fg = "comment" }
7271"ui.window" = { fg = "black" }
7372
7473"error" = { fg = "red" }
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/everforest.LICENSEdeleted−21
@@ -1,21 +0,0 @@
1−MIT License
2−
3−Copyright (c) 2019 sainnhe
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/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/serika-syntax.LICENSEdeleted−21
@@ -1,21 +0,0 @@
1−MIT License
2−
3−Copyright (c) 2018 arturoalviar
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/sonokai.LICENSEdeleted−21
@@ -1,21 +0,0 @@
1−MIT License
2−
3−Copyright (c) 2020 sainnhe
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 @@
2020"ui.help" = { fg = "text", bg = "bg" }
2121"ui.popup" = { fg = "text", bg = "bg" }
2222"ui.menu" = { fg = "text", bg = "bg" }
23−"ui.menu.selected" = { fg = "text", bg = "bg", modifiers = ['underlined'] }
23+"ui.menu.selected" = { fg = "text", bg = "bg" }
2424"ui.window" = { bg = "bg" }
2525"diagnostic.error" = { bg = "error", fg = "text", modifiers = ["bold"] }
2626"diagnostic.warning" = { bg = "warning", fg = "text", modifiers = ["bold"] }
2727"diagnostic.hint" = { bg = "cyan", modifiers = ["bold"] }
2828"ui.bufferline" = { fg = "text", bg = "bg" }
29−"ui.bufferline.active" = { fg = "text", bg = "bg", modifiers = ['underlined'] }
29+"ui.bufferline.active" = { fg = "text", bg = "bg" }
3030"ui.gutter.selected" = { bg = "highlight-line", modifiers = ["bold"] }
3131"ui.highlight" = { bg = "highlight-line" }
3232
runtime/themes/noctis.toml+25−25
@@ -7,8 +7,8 @@
77
88'property' = { fg = "red" } # Regex group names.
99"warning" = { fg ="yellow", modifiers = ["bold"] } # Editor warnings.
10−"error" = { fg = "red", modifiers = ["bold"] } # Editor errors, like mis-typing a command.
11−"info" = { fg = "mid-blue" } # Code diagnostic info in gutter (LSP).
10+"error" = { bg = "mid-green", fg = "red", modifiers = ["bold"] } # Editor errors, like mis-typing a command.
11+"info" = { fg = "mid-blue", bg = "mid-green" } # Code diagnostic info in gutter (LSP).
1212# ? Difference between info and hint ?
1313"hint" = { fg = "light-green", modifiers = ["bold"] } # Code diagnostics hint in gutter (LSP).
1414
@@ -21,14 +21,14 @@
2121# UI ==============================
2222# For styling helix itself.
2323
24−'ui.background' = { fg = "autocomp-green", bg = "dark-green" } # Default background color.
24+'ui.background' = { bg = "dark-green"} # Default background color.
2525'ui.window' = { fg = "mid-green" } # Window border between splits.
2626
2727'ui.gutter' = { } # Left gutter for diagnostics and breakpoints.
2828
2929'ui.text' = { fg = "white" } # Default text color.
3030'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).
3232
3333'ui.cursor' = { fg = "dark-green", bg = "white" } # Fallback cursor colour, non-primary cursors when there are multiple (shift-c).
3434'ui.cursor.primary' = { fg = "dark-green", bg = "light-blue" } # The primary cursor when there are multiple (shift-c).
@@ -40,8 +40,8 @@
4040'ui.selection.primary' = { bg = "autocomp-green" } # The primary selection when there are multiple.
4141'ui.cursorline.primary' = { bg = 'mid-green' }
4242
43−'ui.linenr' = { fg = "gray" } # Line numbers.
44−'ui.linenr.selected' = { fg = "light-green", modifiers = [ "bold" ] } # Current line number.
43+'ui.linenr' = { bg = "dark-green", fg = "gray" } # Line numbers.
44+'ui.linenr.selected' = { bg = "mid-green", fg = "light-green", modifiers = [ "bold" ] } # Current line number.
4545
4646'ui.virtual' = { fg = "mid-green" } # Namespace for additions to the editing area.
4747'ui.virtual.ruler' = { bg = "mid-green" } # Vertical rulers (colored columns in editing area).
@@ -75,9 +75,9 @@
7575#'type.builtin' = { } # Primitive types of the language (string, int, float).
7676#'type.enum.variant' = { } # A variant of an enum.
7777
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
7979
80−'constant' = { fg = "light-blue", modifiers = ["bold"] } # Constant value
80+'constant' = { fg = "light-blue" } # Constant value
8181'constant.builtin' = { fg = "mid-blue", modifiers = ["bold"] } # Special constants like `true`, `false`, `none`, etc.
8282'constant.builtin.boolean' = { } # True or False.
8383'constant.character' = { fg = "light-green"} # Constant of character type.
@@ -88,20 +88,21 @@
8888
8989'string' = { fg = "light-green" } # String literal.
9090'string.regexp' = { } # Regular expression literal.
91−'string.special' = { fg = "red" } # Strings containing a path, URL, etc.
92−# 'string.special.path' = { } # String containing a file path.
93−# 'string.special.url' = { } # String containing a web URL.
94−# 'string.special.symbol' = { } # Erlang/Elixir atoms, Ruby symbols, Clojure keywords.
91+'string.special' = { fg = "light-blue" } # Strings containing a path, URL, etc.
92+'string.special.path' = { } # String containing a file path.
93+'string.special.url' = { } # String containing a web URL.
94+'string.special.symbol' = { } # Erlang/Elixir atoms, Ruby symbols, Clojure keywords.
9595
9696'comment' = { fg = "gray", modifiers = ["italic"] } # This is a comment.
9797'comment.line' = { } # Line comments, like this.
9898'comment.block' = { } # Block comments, like /* this */ in some languages.
9999'comment.block.documentation' = { } # Doc comments, e.g '///' in rust.
100100
101−'variable' = { fg = "light-orange" } # Variable names.
102−# 'variable.builtin' = { } # Language reserved variables: `this`, `self`, `super`, etc.
103−# 'variable.parameter' = { } # Function parameters.
104−'variable.other.member' = { fg = "orange" } # Fields of composite data types (e.g. structs, unions).
101+'variable' = { fg = "white" } # Variable names.
102+'variable.builtin' = { } # Language reserved variables: `this`, `self`, `super`, etc.
103+'variable.parameter' = { } # Function parameters.
104+'variable.other.member' = { } # Fields of composite data types (e.g. structs, unions).
105+'variable.function' = { } # ?
105106
106107'label' = { fg = "purple" } # Loop labels in rust.
107108
@@ -112,17 +113,17 @@
112113'keyword' = { fg = "pink", modifiers = ["bold"] } # Language reserved keywords.
113114'keyword.control' = { fg = "pink", modifiers = ["bold"] } # Control keywords.
114115'keyword.control.conditional' = { fg = "pink", modifiers = ["bold"] } # 'if', 'else', 'elif'.
115−# 'keyword.control.repeat' = { } # 'for', 'while', 'loop'.
116+'keyword.control.repeat' = { } # 'for', 'while', 'loop'.
116117'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.
118119'keyword.control.exception' = {fg = "pink", modifiers = ["bold"] } # 'raise' in python.
119−'keyword.operator' = { fg = "pink" } # 'or', 'and', 'in'.
120+'keyword.operator' = { } # 'or', 'and', 'in'.
120121'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'.
122123
123124'operator' = { fg = "pink", modifiers = ["bold"] } # Logical (&&, ||) and - I assume - Mathematical (+, %) operators
124125
125−'function' = { fg = "mid-blue"}
126+'function' = { fg = "dark-blue"}
126127'function.builtin' = { fg = "dark-blue" }
127128'function.method' = { fg = "dark-blue" } # Class / Struct methods.
128129'function.macro' = { fg = "purple" } # Like macros in rust.
@@ -180,8 +181,8 @@
180181# Version control changes.
181182
182183'diff.plus' = "light-green" # { } # Additions.
183−'diff.minus' = "red" # { } # Deletions.
184−'diff.delta' = "yellow" # { } # Modifications.
184+'diff.minus' = "yellow" # { } # Deletions.
185+'diff.delta' = "red" # { } # Modifications.
185186# 'diff.delta.moved' = { } # Renamed or moved files / changes.
186187
187188
@@ -196,9 +197,8 @@ yellow = "#ffd800"
196197purple = "#918cff"
197198white = "#b1cace"
198199orange = "#ffa864"
199−light-orange = "#fff2c5"
200200gray = "#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
202202red = "#e34e1b"
203203
204204dark-blue = "#19a2b7"
runtime/themes/nord.toml−9
@@ -134,15 +134,6 @@
134134"ui.bufferline" = { fg = "nord5", bg = "nord1" }
135135"ui.bufferline.active" = { fg = "nord6", bg = "nord2", underline = { color = "nord8", style = "line" }, modifiers = [ "italic" ] }
136136
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−
146137[palette]
147138# 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.
148139#
runtime/themes/papercolor-light.toml−4
@@ -26,9 +26,6 @@
2626"ui.virtual.whitespace" = { fg = "regular5" }
2727"ui.virtual.indent-guide" = { fg = "bright0" }
2828"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"] }
3229"ui.cursor.match" = { bg = "matchparen_bg", fg = "matchparen_fg" }
3330"ui.cursor" = { bg = "regular5", fg = "background" }
3431"ui.cursor.primary" = { bg = "foreground", fg = "background" }
@@ -55,7 +52,6 @@
5552
5653"type" = { fg = "bright2", modifiers = ["bold"] }
5754"type.builtin" = { fg = "bright2", modifiers = ["bold"] }
58−"type.parameter" = { fg = "foreground" }
5955"type.enum" = { fg = "foreground" }
6056"type.enum.variant" = { fg = "foreground" }
6157
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 @@
1010"ui.cursor" = { fg = "text", bg = "highlight_high" }
1111# "ui.cursor.select" = {}
1212"ui.cursor.match" = { fg = "text", bg = "highlight_med" }
13−"ui.cursor.primary" = { fg = "text", bg = "muted" }
13+"ui.cursor.primary" = { fg = "text", bg = "muted"}
1414
1515# "ui.gutter" = {}
1616# "ui.gutter.selected" = {}
@@ -18,8 +18,6 @@
1818"ui.linenr" = { fg = "muted" }
1919"ui.linenr.selected" = { fg = "text" }
2020
21−"ui.bufferline" = { fg = "muted", bg = "base" }
22−"ui.bufferline.active" = { fg = "text", bg = "overlay" }
2321"ui.statusline" = { fg = "subtle", bg = "surface" }
2422"ui.statusline.inactive" = { fg = "muted", bg = "surface" }
2523"ui.statusline.normal" = { fg = "rose", bg = "rose_10" }
@@ -73,8 +71,8 @@
7371"constructor" = "foam"
7472
7573"constant" = "foam"
76−"constant.builtin" = "love"
77−"constant.builtin.boolean" = "rose"
74+"constant.builtin" = "rose"
75+# "constant.builtin.boolean" = ""
7876"constant.character" = "gold"
7977"constant.character.escape" = "pine"
8078"constant.numeric" = "gold"
@@ -88,7 +86,7 @@
8886# "string.special.url" = ""
8987# "string.special.symbol" = ""
9088
91−"comment" = { fg = "muted", modifiers = ["italic"] }
89+"comment" = { fg = "muted", modifiers = ["italic"]}
9290# "comment.line" = ""
9391# "comment.block" = ""
9492# "comment.block.documentation" = ""
@@ -97,7 +95,7 @@
9795"variable.builtin" = "love"
9896"variable.parameter" = "iris"
9997# "variable.other" = ""
100−"variable.other.member" = "foam"
98+# "variable.other.member" = ""
10199
102100"label" = "foam"
103101
@@ -122,7 +120,7 @@
122120
123121"operator" = "subtle"
124122
125−"function" = "rose" # maybe pine
123+"function" = "rose" # maybe pine
126124"function.builtin" = "love"
127125# "function.method" = ""
128126# "function.macro" = ""
@@ -130,7 +128,7 @@
130128
131129"tag" = "foam"
132130
133−"namespace" = "text"
131+"namespace" = "iris"
134132
135133"markup.heading.marker" = "muted"
136134"markup.heading" = { fg = "iris", modifiers = ["bold"] }
@@ -149,7 +147,7 @@
149147"markup.italic" = { modifiers = ["italic"] }
150148"markup.strikethrough" = { modifiers = ["crossed_out"] }
151149"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" } }
153151"markup.link.label" = "subtle"
154152"markup.link.text" = "text"
155153"markup.quote" = "subtle"
@@ -169,24 +167,24 @@
169167# "diff.delta.moved" = ""
170168
171169[palette]
172−base = "#191724"
173−surface = "#1f1d2e"
174−overlay = "#26233a"
175−muted = "#6e6a86"
176−subtle = "#908caa"
177−text = "#e0def4"
178−love = "#eb6f92"
179−love_10 = "#311f30"
180−gold = "#f6c177"
181−gold_10 = "#30282c"
182−rose = "#ebbcba"
183−rose_10 = "#2f2834"
184−pine = "#31748f"
185−pine_10 = "#1a2030"
186−foam = "#9ccfd8"
187−foam_10 = "#252937"
188−iris = "#c4a7e7"
189−iris_10 = "#2b2539"
190−highlight_low = "#21202e"
191−highlight_med = "#403d52"
170+base = "#191724"
171+surface = "#1f1d2e"
172+overlay = "#26233a"
173+muted = "#6e6a86"
174+subtle = "#908caa"
175+text = "#e0def4"
176+love = "#eb6f92"
177+love_10 = "#311f30"
178+gold = "#f6c177"
179+gold_10 = "#30282c"
180+rose = "#ebbcba"
181+rose_10 = "#2f2834"
182+pine = "#31748f"
183+pine_10 = "#1a2030"
184+foam = "#9ccfd8"
185+foam_10 = "#252937"
186+iris = "#c4a7e7"
187+iris_10 = "#2b2539"
188+highlight_low = "#21202e"
189+highlight_med = "#403d52"
192190highlight_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.
11861186
11871187
11881188
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−
13431189=================================================================
13441190 This tutorial is still a work-in-progress.
13451191 More sections are planned.
rust-toolchain.toml+2−2
@@ -1,3 +1,3 @@
11[toolchain]
2−channel = "1.70.0"
3−components = ["rustfmt", "rust-src", "clippy"]
2+channel = "1.65.0"
3+components = ["rustfmt", "rust-src"]
xtask/Cargo.toml+6−12
@@ -1,19 +1,13 @@
11[package]
22name = "xtask"
3−version.workspace = true
4−authors.workspace = true
5−edition.workspace = true
6−license.workspace = true
7−rust-version.workspace = true
8−categories.workspace = true
9−repository.workspace = true
10−homepage.workspace = true
3+version = "0.6.0"
4+edition = "2021"
115
126# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
137
148[dependencies]
15−helix-term = { path = "../helix-term" }
16−helix-core = { path = "../helix-core" }
17−helix-view = { path = "../helix-view" }
18−helix-loader = { path = "../helix-loader" }
9+helix-term = { version = "0.6", path = "../helix-term" }
10+helix-core = { version = "0.6", path = "../helix-core" }
11+helix-view = { version = "0.6", path = "../helix-view" }
12+helix-loader = { version = "0.6", path = "../helix-loader" }
1913toml = "0.7"