on master help sign in
11 files changed+332−157
since splitsnapshots
unifiedsplit
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/nord.toml+9
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/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#