on master help sign in
13 files changed+362−187
since splitsnapshots
unifiedsplit
.github/workflows/release.yml+5−5 Cargo.lock+101−82 book/src/languages.md+1 helix-core/src/diagnostic.rs+4 helix-core/src/syntax.rs+2 helix-core/src/transaction.rs+73−14 helix-term/src/application.rs+80−38 helix-vcs/Cargo.toml+1−1 helix-view/src/document.rs+57−20 languages.toml+3−1 logo.svg+1−1 runtime/themes/noctis.toml+25−25 runtime/themes/nord.toml+9
.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@v3
39+ - uses: actions/upload-artifact@v4
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@v3
109+ uses: actions/download-artifact@v4
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@v3
223+ - uses: actions/upload-artifact@v4
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@v3
236+ - uses: actions/download-artifact@v4
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@v3
291+ uses: actions/upload-artifact@v4
292292 if: env.preview == 'true'
293293 with:
294294 name: release
Cargo.lock+101−82
@@ -62,9 +62,9 @@ dependencies = [
6262
6363[[package]]
6464name = "anyhow"
65−version = "1.0.75"
65+version = "1.0.76"
6666source = "registry+https://github.com/rust-lang/crates.io-index"
67−checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
67+checksum = "59d2a3357dde987206219e78ecfbbb6e8dad06cbb65292758d3270e6254f7355"
6868
6969[[package]]
7070name = "arc-swap"
@@ -469,9 +469,9 @@ dependencies = [
469469
470470[[package]]
471471name = "futures-core"
472−version = "0.3.29"
472+version = "0.3.30"
473473source = "registry+https://github.com/rust-lang/crates.io-index"
474−checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c"
474+checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
475475
476476[[package]]
477477name = "futures-executor"
@@ -486,15 +486,15 @@ dependencies = [
486486
487487[[package]]
488488name = "futures-task"
489−version = "0.3.29"
489+version = "0.3.30"
490490source = "registry+https://github.com/rust-lang/crates.io-index"
491−checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2"
491+checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
492492
493493[[package]]
494494name = "futures-util"
495−version = "0.3.29"
495+version = "0.3.30"
496496source = "registry+https://github.com/rust-lang/crates.io-index"
497−checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104"
497+checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
498498dependencies = [
499499 "futures-core",
500500 "futures-task",
@@ -522,9 +522,9 @@ checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
522522
523523[[package]]
524524name = "gix"
525−version = "0.56.0"
525+version = "0.57.0"
526526source = "registry+https://github.com/rust-lang/crates.io-index"
527−checksum = "5b0dcdc9c60d66535897fa40a7ea2a635e72f99456b1d9ae86b7e170e80618cb"
527+checksum = "721c7497ab24b665ed5a1eb2b3526936aa60068e61ba260651f7e77c52feec69"
528528dependencies = [
529529 "gix-actor",
530530 "gix-commitgraph",
@@ -563,9 +563,9 @@ dependencies = [
563563
564564[[package]]
565565name = "gix-actor"
566−version = "0.28.1"
566+version = "0.29.0"
567567source = "registry+https://github.com/rust-lang/crates.io-index"
568−checksum = "2eadca029ef716b4378f7afb19f7ee101fde9e58ba1f1445971315ac866db417"
568+checksum = "886014c4865b93ce268f1d3eddd4fd3261242c3f3ee61eb36009f913016a9059"
569569dependencies = [
570570 "bstr",
571571 "btoi",
@@ -577,18 +577,18 @@ dependencies = [
577577
578578[[package]]
579579name = "gix-chunk"
580−version = "0.4.5"
580+version = "0.4.6"
581581source = "registry+https://github.com/rust-lang/crates.io-index"
582−checksum = "d411ecd9b558b0c20b3252b7e409eec48eabc41d18324954fe526bac6e2db55f"
582+checksum = "2ade37ef69870de0ed966b97c57a3a947a22ff3482a52c3b99b205f77bcb08fb"
583583dependencies = [
584584 "thiserror",
585585]
586586
587587[[package]]
588588name = "gix-commitgraph"
589−version = "0.22.1"
589+version = "0.23.0"
590590source = "registry+https://github.com/rust-lang/crates.io-index"
591−checksum = "85a7007ba021f059803afaf6f8a48872422abc20550ac12ede6ddea2936cec36"
591+checksum = "e7559ea9cefee188cd88b05afcc8e3ef7a3cb4a5c647bccf06b981e591b02b77"
592592dependencies = [
593593 "bstr",
594594 "gix-chunk",
@@ -600,9 +600,9 @@ dependencies = [
600600
601601[[package]]
602602name = "gix-config"
603−version = "0.32.1"
603+version = "0.33.0"
604604source = "registry+https://github.com/rust-lang/crates.io-index"
605−checksum = "0341471d55d8676e98b88e121d7065dfa4c9c5acea4b6d6ecdd2846e85cce0c3"
605+checksum = "9c35dc7f9c00a42bbc9cfa1ca2ec0a78ad1b76ff0736d3d35dfd612962244467"
606606dependencies = [
607607 "bstr",
608608 "gix-config-value",
@@ -621,9 +621,9 @@ dependencies = [
621621
622622[[package]]
623623name = "gix-config-value"
624−version = "0.14.1"
624+version = "0.14.2"
625625source = "registry+https://github.com/rust-lang/crates.io-index"
626−checksum = "6419db582ea84dfb58c7e7b0af7fd62c808aa14954af2936a33f89b0f4ed018e"
626+checksum = "39f388cb2396aee82d6f460a2e7770659bdf8854e9e5478f7d2b1324a9698284"
627627dependencies = [
628628 "bitflags 2.4.1",
629629 "bstr",
@@ -634,9 +634,9 @@ dependencies = [
634634
635635[[package]]
636636name = "gix-date"
637−version = "0.8.1"
637+version = "0.8.2"
638638source = "registry+https://github.com/rust-lang/crates.io-index"
639−checksum = "468dfbe411f335f01525a1352271727f8e7772075a93fa747260f502086b30be"
639+checksum = "9d85f4a01e0d05c3de585e28bae514d4baf01655e3fc3f14ce6f30bf62405345"
640640dependencies = [
641641 "bstr",
642642 "itoa",
@@ -646,9 +646,9 @@ dependencies = [
646646
647647[[package]]
648648name = "gix-diff"
649−version = "0.38.0"
649+version = "0.39.0"
650650source = "registry+https://github.com/rust-lang/crates.io-index"
651−checksum = "8119a985887cfe68f4bdf92e51bd64bc758a73882d82fcfc03ebcb164441c85d"
651+checksum = "ac0e75f5afd2f6c47c800b6b0a000a08045739d0450d20482e8faa42543f62d1"
652652dependencies = [
653653 "bstr",
654654 "gix-hash",
@@ -658,9 +658,9 @@ dependencies = [
658658
659659[[package]]
660660name = "gix-discover"
661−version = "0.27.0"
661+version = "0.28.0"
662662source = "registry+https://github.com/rust-lang/crates.io-index"
663−checksum = "6fad89416ebe0b3b7df78464124e2a02417b6cd3743d48ad93df86f4d2929c07"
663+checksum = "f0b63ce2ad81632ac1a84ac370f85a5e580c3261580bd85ea17ff35d3a0bba18"
664664dependencies = [
665665 "bstr",
666666 "dunce",
@@ -673,9 +673,9 @@ dependencies = [
673673
674674[[package]]
675675name = "gix-features"
676−version = "0.36.1"
676+version = "0.37.0"
677677source = "registry+https://github.com/rust-lang/crates.io-index"
678−checksum = "4d46a4a5c6bb5bebec9c0d18b65ada20e6517dbd7cf855b87dd4bbdce3a771b2"
678+checksum = "befe7edea299a824504b5acc96d7a3a538125b38c42f3a8379f6912a29c90c81"
679679dependencies = [
680680 "crc32fast",
681681 "flate2",
@@ -691,18 +691,18 @@ dependencies = [
691691
692692[[package]]
693693name = "gix-fs"
694−version = "0.8.1"
694+version = "0.9.0"
695695source = "registry+https://github.com/rust-lang/crates.io-index"
696−checksum = "20e86eb040f5776a5ade092282e51cdcad398adb77d948b88d17583c2ae4e107"
696+checksum = "007017ce93b819ea52c0ec68306f7d72212a2d307c3d70f1548c7141c015d0a1"
697697dependencies = [
698698 "gix-features",
699699]
700700
701701[[package]]
702702name = "gix-glob"
703−version = "0.14.1"
703+version = "0.15.0"
704704source = "registry+https://github.com/rust-lang/crates.io-index"
705−checksum = "5db19298c5eeea2961e5b3bf190767a2d1f09b8802aeb5f258e42276350aff19"
705+checksum = "61fb116c2516d3a1170e010118f639944a6389872c875a008960cdab2a44ac72"
706706dependencies = [
707707 "bitflags 2.4.1",
708708 "bstr",
@@ -712,9 +712,9 @@ dependencies = [
712712
713713[[package]]
714714name = "gix-hash"
715−version = "0.13.3"
715+version = "0.14.0"
716716source = "registry+https://github.com/rust-lang/crates.io-index"
717−checksum = "1f8cf8c2266f63e582b7eb206799b63aa5fa68ee510ad349f637dfe2d0653de0"
717+checksum = "c52c3170a17b6031833cd2eb4ad7bc23f2755d06e6e70f78dec21d42e8fe1b30"
718718dependencies = [
719719 "faster-hex",
720720 "thiserror",
@@ -722,9 +722,9 @@ dependencies = [
722722
723723[[package]]
724724name = "gix-hashtable"
725−version = "0.4.1"
725+version = "0.5.0"
726726source = "registry+https://github.com/rust-lang/crates.io-index"
727−checksum = "feb61880816d7ec4f0b20606b498147d480860ddd9133ba542628df2f548d3ca"
727+checksum = "40a838e6366a5e5b84668b6997ce0981b833136468e8ba949f424c0ef2927eba"
728728dependencies = [
729729 "gix-hash",
730730 "hashbrown 0.14.3",
@@ -733,9 +733,9 @@ dependencies = [
733733
734734[[package]]
735735name = "gix-lock"
736−version = "11.0.0"
736+version = "12.0.0"
737737source = "registry+https://github.com/rust-lang/crates.io-index"
738−checksum = "f4feb1dcd304fe384ddc22edba9dd56a42b0800032de6537728cea2f033a4f37"
738+checksum = "6cf112ddee94223c119a8534dad027740dc3aba3365ac5edeef8a7f6660c74db"
739739dependencies = [
740740 "gix-tempfile",
741741 "gix-utils",
@@ -744,9 +744,9 @@ dependencies = [
744744
745745[[package]]
746746name = "gix-macros"
747−version = "0.1.1"
747+version = "0.1.2"
748748source = "registry+https://github.com/rust-lang/crates.io-index"
749−checksum = "02a5bcaf6704d9354a3071cede7e77d366a5980c7352e102e2c2f9b645b1d3ae"
749+checksum = "fc207b64189cf71bcb17fc841ab99a5d63d0845546b611e2703ce467f659323a"
750750dependencies = [
751751 "proc-macro2",
752752 "quote",
@@ -755,9 +755,9 @@ dependencies = [
755755
756756[[package]]
757757name = "gix-object"
758−version = "0.39.0"
758+version = "0.40.0"
759759source = "registry+https://github.com/rust-lang/crates.io-index"
760−checksum = "febf79c5825720c1c63fe974c7bbe695d0cb54aabad73f45671c60ce0e501e33"
760+checksum = "e4c77e47ffba92127faf632a841fce23d19547e269bd8b88e68961a70eab4e93"
761761dependencies = [
762762 "bstr",
763763 "btoi",
@@ -774,9 +774,9 @@ dependencies = [
774774
775775[[package]]
776776name = "gix-odb"
777−version = "0.55.0"
777+version = "0.56.0"
778778source = "registry+https://github.com/rust-lang/crates.io-index"
779−checksum = "1fae5f971540c99c6ecc8d4368ecc9d18a9dc8b9391025c68c4399747dc93bac"
779+checksum = "a3254f2005cc7553ea78e85e816a09150c6f7a64e6b7627b8d1fdc56721bea73"
780780dependencies = [
781781 "arc-swap",
782782 "gix-date",
@@ -793,9 +793,9 @@ dependencies = [
793793
794794[[package]]
795795name = "gix-pack"
796−version = "0.45.0"
796+version = "0.46.0"
797797source = "registry+https://github.com/rust-lang/crates.io-index"
798−checksum = "4569491c92446fddf373456ff360aff9a9effd627b40a70f2d7914dcd75a3205"
798+checksum = "02ebc8cd657eec207d82d8f876ca402361308ecd3c87a47935b0299506257b4f"
799799dependencies = [
800800 "clru",
801801 "gix-chunk",
@@ -813,9 +813,9 @@ dependencies = [
813813
814814[[package]]
815815name = "gix-path"
816−version = "0.10.1"
816+version = "0.10.2"
817817source = "registry+https://github.com/rust-lang/crates.io-index"
818−checksum = "d86d6fac2fabe07b67b7835f46d07571f68b11aa1aaecae94fe722ea4ef305e1"
818+checksum = "10931652a3da126990ac93bce1b1c600cc99d7c268d712b6360ed52174ce1b68"
819819dependencies = [
820820 "bstr",
821821 "gix-trace",
@@ -826,9 +826,9 @@ dependencies = [
826826
827827[[package]]
828828name = "gix-quote"
829−version = "0.4.8"
829+version = "0.4.9"
830830source = "registry+https://github.com/rust-lang/crates.io-index"
831−checksum = "4f84845efa535468bc79c5a87b9d29219f1da0313c8ecf0365a5daa7e72786f2"
831+checksum = "6c43530cb94a7759807e6f8d180e17ac9c65673b891645c6c433831dc0cf4342"
832832dependencies = [
833833 "bstr",
834834 "btoi",
@@ -837,9 +837,9 @@ dependencies = [
837837
838838[[package]]
839839name = "gix-ref"
840−version = "0.39.0"
840+version = "0.40.0"
841841source = "registry+https://github.com/rust-lang/crates.io-index"
842−checksum = "1ac23ed741583c792f573c028785db683496a6dfcd672ec701ee54ba6a77e1ff"
842+checksum = "baa951b3b850d6d1be4f900768e49af20b76bf9505beac22af723d57249a2f1d"
843843dependencies = [
844844 "gix-actor",
845845 "gix-date",
@@ -858,9 +858,9 @@ dependencies = [
858858
859859[[package]]
860860name = "gix-refspec"
861−version = "0.20.0"
861+version = "0.21.0"
862862source = "registry+https://github.com/rust-lang/crates.io-index"
863−checksum = "76d9d3b82e1ee78fc0dc1c37ea5ea76c2dbc73f407db155f0dfcea285e583bee"
863+checksum = "88c61f849d58c06e3068a0b601cf10127d2a07cdad00a725ed66cf303f76f6b3"
864864dependencies = [
865865 "bstr",
866866 "gix-hash",
@@ -872,9 +872,9 @@ dependencies = [
872872
873873[[package]]
874874name = "gix-revision"
875−version = "0.24.0"
875+version = "0.25.0"
876876source = "registry+https://github.com/rust-lang/crates.io-index"
877−checksum = "fe5dd51710ce5434bc315ea30394fab483c5377276494edd79222b321a5a9544"
877+checksum = "bcbbf91f4200c5c76802ef5f057b96f5a336827508881fe55a780be71a794d22"
878878dependencies = [
879879 "bstr",
880880 "gix-date",
@@ -888,9 +888,9 @@ dependencies = [
888888
889889[[package]]
890890name = "gix-revwalk"
891−version = "0.10.0"
891+version = "0.11.0"
892892source = "registry+https://github.com/rust-lang/crates.io-index"
893−checksum = "69d4ed2493ca94a475fdf147138e1ef8bab3b6ebb56abf3d9bda1c05372ec1dd"
893+checksum = "33ab66354d83f70f2730391747d0c75f94ef3c3dd40ebde2e206db9faaf7a0a7"
894894dependencies = [
895895 "gix-commitgraph",
896896 "gix-date",
@@ -903,21 +903,21 @@ dependencies = [
903903
904904[[package]]
905905name = "gix-sec"
906−version = "0.10.1"
906+version = "0.10.2"
907907source = "registry+https://github.com/rust-lang/crates.io-index"
908−checksum = "a36ea2c5907d64a9b4b5d3cc9f430e6c30f0509646b5e38eb275ca57c5bf29e2"
908+checksum = "a9963f38a42144253ed4d571882d7db5ef644c12e6726e4b75135597cc9d0e1a"
909909dependencies = [
910910 "bitflags 2.4.1",
911911 "gix-path",
912912 "libc",
913− "windows",
913+ "windows 0.52.0",
914914]
915915
916916[[package]]
917917name = "gix-tempfile"
918−version = "11.0.0"
918+version = "12.0.0"
919919source = "registry+https://github.com/rust-lang/crates.io-index"
920−checksum = "05cc2205cf10d99f70b96e04e16c55d4c7cf33efc151df1f793e29fd12a931f8"
920+checksum = "e76a494bd530e1a1309188ff971825a24f159c76c2db0bf71fa5dfb469a2c915"
921921dependencies = [
922922 "gix-fs",
923923 "libc",
@@ -928,15 +928,15 @@ dependencies = [
928928
929929[[package]]
930930name = "gix-trace"
931−version = "0.1.4"
931+version = "0.1.5"
932932source = "registry+https://github.com/rust-lang/crates.io-index"
933−checksum = "b686a35799b53a9825575ca3f06481d0a053a409c4d97ffcf5ddd67a8760b497"
933+checksum = "bda62acb44dd86a40c7c3762a5403cfc1ac789ea559df54085cedf79864f809e"
934934
935935[[package]]
936936name = "gix-traverse"
937−version = "0.35.0"
937+version = "0.36.0"
938938source = "registry+https://github.com/rust-lang/crates.io-index"
939−checksum = "df2112088122a0206592c84fbd42020db63b2ccaed66a0293779f2e5fbf80474"
939+checksum = "8661fab39985c9214e56d81a63ceb5886ac948cec2fba76c39494d1e0e307ea8"
940940dependencies = [
941941 "gix-commitgraph",
942942 "gix-date",
@@ -950,9 +950,9 @@ dependencies = [
950950
951951[[package]]
952952name = "gix-url"
953−version = "0.25.2"
953+version = "0.26.0"
954954source = "registry+https://github.com/rust-lang/crates.io-index"
955−checksum = "0c427a1a11ccfa53a4a2da47d9442c2241deee63a154bc15cc14b8312fbc4005"
955+checksum = "10a0129c1e8b52736d7c5128300a4485dbc85863001371e2771ac1754bd89fd7"
956956dependencies = [
957957 "bstr",
958958 "gix-features",
@@ -964,18 +964,18 @@ dependencies = [
964964
965965[[package]]
966966name = "gix-utils"
967−version = "0.1.6"
967+version = "0.1.7"
968968source = "registry+https://github.com/rust-lang/crates.io-index"
969−checksum = "9f82c41937f00e15a1f6cb0b55307f0ca1f77f4407ff2bf440be35aa688c6a3e"
969+checksum = "ab9277a5e32e85d53f738096d872a4a9b76067ad471894ad31bd99c8fa2da1dc"
970970dependencies = [
971971 "fastrand",
972972]
973973
974974[[package]]
975975name = "gix-validate"
976−version = "0.8.1"
976+version = "0.8.2"
977977source = "registry+https://github.com/rust-lang/crates.io-index"
978−checksum = "75b7d8e4274be69f284bbc7e6bb2ccf7065dbcdeba22d8c549f2451ae426883f"
978+checksum = "f805ebbdbaa4bfd98e2ee43e6d14099b8a4d9141f5d7b8202fea4d48e44263e7"
979979dependencies = [
980980 "bstr",
981981 "thiserror",
@@ -1286,7 +1286,7 @@ dependencies = [
12861286 "iana-time-zone-haiku",
12871287 "js-sys",
12881288 "wasm-bindgen",
1289− "windows",
1289+ "windows 0.48.0",
12901290]
12911291
12921292[[package]]
@@ -1624,9 +1624,9 @@ dependencies = [
16241624
16251625[[package]]
16261626name = "prodash"
1627−version = "26.2.2"
1627+version = "28.0.0"
16281628source = "registry+https://github.com/rust-lang/crates.io-index"
1629−checksum = "794b5bf8e2d19b53dcdcec3e4bba628e20f5b6062503ba89281fa7037dd7bbcf"
1629+checksum = "744a264d26b88a6a7e37cbad97953fa233b94d585236310bcbc88474b4092d79"
16301630
16311631[[package]]
16321632name = "pulldown-cmark"
@@ -2028,18 +2028,18 @@ dependencies = [
20282028
20292029[[package]]
20302030name = "thiserror"
2031−version = "1.0.51"
2031+version = "1.0.52"
20322032source = "registry+https://github.com/rust-lang/crates.io-index"
2033−checksum = "f11c217e1416d6f036b870f14e0413d480dbf28edbee1f877abaf0206af43bb7"
2033+checksum = "83a48fd946b02c0a526b2e9481c8e2a17755e47039164a86c4070446e3a4614d"
20342034dependencies = [
20352035 "thiserror-impl",
20362036]
20372037
20382038[[package]]
20392039name = "thiserror-impl"
2040−version = "1.0.51"
2040+version = "1.0.52"
20412041source = "registry+https://github.com/rust-lang/crates.io-index"
2042−checksum = "01742297787513b79cf8e29d1056ede1313e2420b7b3b15d0a768b4921f549df"
2042+checksum = "e7fbe9b594d6568a6a1443250a7e67d80b74e1e96f6d1715e1e21cc1888291d3"
20432043dependencies = [
20442044 "proc-macro2",
20452045 "quote",
@@ -2101,9 +2101,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
21012101
21022102[[package]]
21032103name = "tokio"
2104−version = "1.35.0"
2104+version = "1.35.1"
21052105source = "registry+https://github.com/rust-lang/crates.io-index"
2106−checksum = "841d45b238a16291a4e1584e61820b8ae57d696cc5015c459c229ccc6990cc1c"
2106+checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
21072107dependencies = [
21082108 "backtrace",
21092109 "bytes",
@@ -2384,6 +2384,25 @@ dependencies = [
23842384 "windows-targets 0.48.0",
23852385]
23862386
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+
23872406[[package]]
23882407name = "windows-sys"
23892408version = "0.45.0"
book/src/languages.md+1
@@ -69,6 +69,7 @@ These configuration keys are available:
6969| `soft-wrap` | [editor.softwrap](./configuration.md#editorsoft-wrap-section)
7070| `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` |
7171| `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.
7273
7374### File-type detection and the `file-types` key
7475
helix-core/src/diagnostic.rs+4
@@ -39,6 +39,10 @@ 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,
4246 pub line: usize,
4347 pub message: String,
4448 pub severity: Option<Severity>,
helix-core/src/syntax.rs+2
@@ -155,6 +155,8 @@ pub struct LanguageConfiguration {
155155 /// Hardcoded LSP root directories relative to the workspace root, like `examples` or `tools/fuzz`.
156156 /// Falling back to the current working directory if none are configured.
157157 pub workspace_lsp_roots: Option<Vec<PathBuf>>,
158+ #[serde(default)]
159+ pub persistent_diagnostic_sources: Vec<String>,
158160}
159161
160162#[derive(Debug, PartialEq, Eq, Hash)]
helix-core/src/transaction.rs+73−14
@@ -1,7 +1,7 @@
11use ropey::RopeSlice;
22use smallvec::SmallVec;
33
4−use crate::{Range, Rope, Selection, Tendril};
4+use crate::{chars::char_is_word, Range, Rope, Selection, Tendril};
55use std::{borrow::Cow, iter::once};
66
77/// (from, to, replacement)
@@ -23,6 +23,30 @@ 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+ }
2650}
2751
2852#[derive(Debug, Default, Clone, PartialEq, Eq)]
@@ -415,8 +439,6 @@ impl ChangeSet {
415439 map!(|pos, _| (old_end > pos).then_some(new_pos), i);
416440 }
417441 Insert(s) => {
418− let ins = s.chars().count();
419−
420442 // a subsequent delete means a replace, consume it
421443 if let Some((_, Delete(len))) = iter.peek() {
422444 iter.next();
@@ -424,13 +446,13 @@ impl ChangeSet {
424446 old_end = old_pos + len;
425447 // in range of replaced text
426448 map!(
427− |pos, assoc| (old_end > pos).then(|| {
449+ |pos, assoc: Assoc| (old_end > pos).then(|| {
428450 // at point or tracking before
429− if pos == old_pos || assoc == Assoc::Before {
451+ if pos == old_pos && assoc.stay_at_gaps() {
430452 new_pos
431453 } else {
432454 // place to end of insert
433− new_pos + ins
455+ new_pos + assoc.insert_offset(s)
434456 }
435457 }),
436458 i
@@ -438,20 +460,15 @@ impl ChangeSet {
438460 } else {
439461 // at insert point
440462 map!(
441− |pos, assoc| (old_pos == pos).then(|| {
463+ |pos, assoc: Assoc| (old_pos == pos).then(|| {
442464 // return position before inserted text
443− if assoc == Assoc::Before {
444− new_pos
445− } else {
446− // after text
447− new_pos + ins
448− }
465+ new_pos + assoc.insert_offset(s)
449466 }),
450467 i
451468 );
452469 }
453470
454− new_pos += ins;
471+ new_pos += s.chars().count();
455472 }
456473 }
457474 old_pos = old_end;
@@ -884,6 +901,48 @@ mod test {
884901 let mut positions = [4, 2];
885902 cs.update_positions(positions.iter_mut().map(|pos| (pos, Assoc::After)));
886903 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);
887946 }
888947
889948 #[test]
helix-term/src/application.rs+80−38
@@ -1,6 +1,7 @@
11use arc_swap::{access::Map, ArcSwap};
22use futures_util::Stream;
33use helix_core::{
4+ chars::char_is_word,
45 diagnostic::{DiagnosticTag, NumberOrString},
56 path::get_relative_path,
67 pos_at_coords, syntax, Selection,
@@ -717,7 +718,7 @@ impl Application {
717718 ));
718719 }
719720 }
720− Notification::PublishDiagnostics(params) => {
721+ Notification::PublishDiagnostics(mut params) => {
721722 let path = match params.uri.to_file_path() {
722723 Ok(path) => path,
723724 Err(_) => {
@@ -731,31 +732,69 @@ impl Application {
731732 return;
732733 }
733734 let offset_encoding = language_server.offset_encoding();
734− let doc = self.editor.document_by_path_mut(&path).filter(|doc| {
735− if let Some(version) = params.version {
736− if version != doc.version() {
737− log::info!("Version ({version}) is out of date for {path:?} (expected ({}), dropping PublishDiagnostic notification", doc.version());
738− return false;
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+ }
739744 }
740− }
741−
742− true
743− });
745+ true
746+ });
744747
745748 if let Some(doc) = doc {
746− let lang_conf = doc.language_config();
747− let text = doc.text();
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+ }
748782
749− let diagnostics = params
750− .diagnostics
751− .iter()
752− .filter_map(|diagnostic| {
783+ let unchaged_diag_sources = &unchaged_diag_sources_;
784+ let diagnostics =
785+ params.diagnostics.iter().filter_map(move |diagnostic| {
753786 use helix_core::diagnostic::{Diagnostic, Range, Severity::*};
754787 use lsp::DiagnosticSeverity;
755788
789+ if diagnostic.source.as_ref().map_or(false, |source| {
790+ unchaged_diag_sources.contains(source)
791+ }) {
792+ return None;
793+ }
794+
756795 // TODO: convert inside server
757796 let start = if let Some(start) = lsp_pos_to_pos(
758− text,
797+ &text,
759798 diagnostic.range.start,
760799 offset_encoding,
761800 ) {
@@ -766,14 +805,13 @@ impl Application {
766805 };
767806
768807 let end = if let Some(end) =
769− lsp_pos_to_pos(text, diagnostic.range.end, offset_encoding)
808+ lsp_pos_to_pos(&text, diagnostic.range.end, offset_encoding)
770809 {
771810 end
772811 } else {
773812 log::warn!("lsp position out of bounds - {:?}", diagnostic);
774813 return None;
775814 };
776−
777815 let severity =
778816 diagnostic.severity.map(|severity| match severity {
779817 DiagnosticSeverity::ERROR => Error,
@@ -786,7 +824,7 @@ impl Application {
786824 ),
787825 });
788826
789− if let Some(lang_conf) = lang_conf {
827+ if let Some(lang_conf) = &lang_conf {
790828 if let Some(severity) = severity {
791829 if severity < lang_conf.diagnostic_severity {
792830 return None;
@@ -825,8 +863,17 @@ impl Application {
825863 Vec::new()
826864 };
827865
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+
828872 Some(Diagnostic {
829873 range: Range { start, end },
874+ ends_at_word,
875+ starts_at_word,
876+ zero_width: start == end,
830877 line: diagnostic.range.start.line as usize,
831878 message: diagnostic.message.clone(),
832879 severity,
@@ -836,38 +883,33 @@ impl Application {
836883 data: diagnostic.data.clone(),
837884 language_server_id: server_id,
838885 })
839− })
840− .collect();
886+ });
841887
842− doc.replace_diagnostics(diagnostics, server_id);
888+ doc.replace_diagnostics(diagnostics, unchaged_diag_sources, server_id);
843889 }
844890
845− let mut diagnostics = params
846− .diagnostics
847− .into_iter()
848− .map(|d| (d, server_id))
849− .collect();
891+ let diagnostics = params.diagnostics.into_iter().map(|d| (d, server_id));
850892
851893 // Insert the original lsp::Diagnostics here because we may have no open document
852894 // for diagnosic message and so we can't calculate the exact position.
853895 // When using them later in the diagnostics picker, we calculate them on-demand.
854− match self.editor.diagnostics.entry(params.uri) {
896+ let diagnostics = match self.editor.diagnostics.entry(params.uri) {
855897 Entry::Occupied(o) => {
856898 let current_diagnostics = o.into_mut();
857899 // there may entries of other language servers, which is why we can't overwrite the whole entry
858900 current_diagnostics.retain(|(_, lsp_id)| *lsp_id != server_id);
859− current_diagnostics.append(&mut diagnostics);
860− // Sort diagnostics first by severity and then by line numbers.
861− // Note: The `lsp::DiagnosticSeverity` enum is already defined in decreasing order
901+ current_diagnostics.extend(diagnostics);
862902 current_diagnostics
863− .sort_unstable_by_key(|(d, _)| (d.severity, d.range.start));
864− }
865− Entry::Vacant(v) => {
866− diagnostics
867− .sort_unstable_by_key(|(d, _)| (d.severity, d.range.start));
868− v.insert(diagnostics);
903+ // Sort diagnostics first by severity and then by line numbers.
869904 }
905+ Entry::Vacant(v) => v.insert(diagnostics.collect()),
870906 };
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+ });
871913 }
872914 Notification::ShowMessage(params) => {
873915 log::warn!("unhandled window/showMessage: {:?}", params);
helix-vcs/Cargo.toml+1−1
@@ -19,7 +19,7 @@ tokio = { version = "1", features = ["rt", "rt-multi-thread", "time", "sync", "p
1919parking_lot = "0.12"
2020arc-swap = { version = "1.6.0" }
2121
22−gix = { version = "0.56.0", default-features = false , optional = true }
22+gix = { version = "0.57.0", default-features = false , optional = true }
2323imara-diff = "0.1.5"
2424anyhow = "1"
2525
helix-view/src/document.rs+57−20
@@ -1213,23 +1213,40 @@ impl Document {
12131213
12141214 let changes = transaction.changes();
12151215
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 {
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+ }
12281239 diagnostic.line = self.text.char_to_line(diagnostic.range.start);
1229− }
1240+ true
1241+ });
12301242
1231− self.diagnostics
1232− .sort_unstable_by_key(|diagnostic| diagnostic.range);
1243+ self.diagnostics.sort_unstable_by_key(|diagnostic| {
1244+ (
1245+ diagnostic.range,
1246+ diagnostic.severity,
1247+ diagnostic.language_server_id,
1248+ )
1249+ });
12331250
12341251 // Update the inlay hint annotations' positions, helping ensure they are displayed in the proper place
12351252 let apply_inlay_hint_changes = |annotations: &mut Rc<[InlineAnnotation]>| {
@@ -1706,13 +1723,33 @@ impl Document {
17061723
17071724 pub fn replace_diagnostics(
17081725 &mut self,
1709− mut diagnostics: Vec<Diagnostic>,
1726+ diagnostics: impl IntoIterator<Item = Diagnostic>,
1727+ unchanged_sources: &[String],
17101728 language_server_id: usize,
17111729 ) {
1712− self.clear_diagnostics(language_server_id);
1713− self.diagnostics.append(&mut diagnostics);
1714− self.diagnostics
1715− .sort_unstable_by_key(|diagnostic| diagnostic.range);
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+ });
17161753 }
17171754
17181755 pub fn clear_diagnostics(&mut self, language_server_id: usize) {
languages.toml+3−1
@@ -191,6 +191,7 @@ auto-format = true
191191comment-token = "//"
192192language-servers = [ "rust-analyzer" ]
193193indent = { tab-width = 4, unit = " " }
194+persistent-diagnostic-sources = ["rustc", "clippy"]
194195
195196[language.auto-pairs]
196197'(' = ')'
@@ -2320,7 +2321,8 @@ file-types = [
23202321 "xpdl",
23212322 "xul",
23222323 "xoml",
2323− "musicxml"
2324+ "musicxml",
2325+ "glif"
23242326]
23252327indent = { tab-width = 2, unit = " " }
23262328
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 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>
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>
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" = { 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).
10+"error" = { fg = "red", modifiers = ["bold"] } # Editor errors, like mis-typing a command.
11+"info" = { fg = "mid-blue" } # 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' = { bg = "dark-green"} # Default background color.
24+'ui.background' = { fg = "autocomp-green", 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' = { } # Info popup contents (space mode menu).
31+'ui.text.info' = { fg = "white" } # 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' = { bg = "dark-green", fg = "gray" } # Line numbers.
44−'ui.linenr.selected' = { bg = "mid-green", fg = "light-green", modifiers = [ "bold" ] } # Current line number.
43+'ui.linenr' = { fg = "gray" } # Line numbers.
44+'ui.linenr.selected' = { 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 = "mid-blue", modifiers = ["bold"]} # Constructor method for a class or struct. And in some cases applies to module names
78+'constructor' = { fg = "light-blue", modifiers = ["bold"]} # Constructor method for a class or struct. And in some cases applies to module names
7979
80−'constant' = { fg = "light-blue" } # Constant value
80+'constant' = { fg = "light-blue", modifiers = ["bold"] } # 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,21 +88,20 @@
8888
8989'string' = { fg = "light-green" } # String literal.
9090'string.regexp' = { } # Regular expression literal.
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.
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.
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 = "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' = { } # ?
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).
106105
107106'label' = { fg = "purple" } # Loop labels in rust.
108107
@@ -113,17 +112,17 @@
113112'keyword' = { fg = "pink", modifiers = ["bold"] } # Language reserved keywords.
114113'keyword.control' = { fg = "pink", modifiers = ["bold"] } # Control keywords.
115114'keyword.control.conditional' = { fg = "pink", modifiers = ["bold"] } # 'if', 'else', 'elif'.
116−'keyword.control.repeat' = { } # 'for', 'while', 'loop'.
115+# 'keyword.control.repeat' = { } # 'for', 'while', 'loop'.
117116'keyword.control.import' = { fg = "pink", modifiers = ["italic"] } # 'import', 'export' ('use'?).
118−'keyword.control.return' = { } # 'return' in most languages.
117+# 'keyword.control.return' = { } # 'return' in most languages.
119118'keyword.control.exception' = {fg = "pink", modifiers = ["bold"] } # 'raise' in python.
120−'keyword.operator' = { } # 'or', 'and', 'in'.
119+'keyword.operator' = { fg = "pink" } # 'or', 'and', 'in'.
121120'keyword.directive' = { fg = "purple" } # Preprocessor directives (#if in C).
122−'keyword.function' = { } # The keyword to define a function: 'def', 'fun', 'fn'.
121+'keyword.function' = { fg= "red" } # The keyword to define a function: 'def', 'fun', 'fn'.
123122
124123'operator' = { fg = "pink", modifiers = ["bold"] } # Logical (&&, ||) and - I assume - Mathematical (+, %) operators
125124
126−'function' = { fg = "dark-blue"}
125+'function' = { fg = "mid-blue"}
127126'function.builtin' = { fg = "dark-blue" }
128127'function.method' = { fg = "dark-blue" } # Class / Struct methods.
129128'function.macro' = { fg = "purple" } # Like macros in rust.
@@ -181,8 +180,8 @@
181180# Version control changes.
182181
183182'diff.plus' = "light-green" # { } # Additions.
184−'diff.minus' = "yellow" # { } # Deletions.
185−'diff.delta' = "red" # { } # Modifications.
183+'diff.minus' = "red" # { } # Deletions.
184+'diff.delta' = "yellow" # { } # Modifications.
186185# 'diff.delta.moved' = { } # Renamed or moved files / changes.
187186
188187
@@ -197,8 +196,9 @@ yellow = "#ffd800"
197196purple = "#918cff"
198197white = "#b1cace"
199198orange = "#ffa864"
199+light-orange = "#fff2c5"
200200gray = "#5b858b" # mainly for comments/background text
201−light-gray = "#354e51" # used when whitespace rendering is enabled and for indent-guides
201+light-gray = "#2a3c41" # used when whitespace rendering is enabled and for indent-guides
202202red = "#e34e1b"
203203
204204dark-blue = "#19a2b7"
runtime/themes/nord.toml+9
@@ -134,6 +134,15 @@
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+
137146[palette]
138147# 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.
139148#