on master help sign in
Cargo.lock+91−72
since splitsnapshots
unifiedsplit
@@ -62,9 +62,9 @@ dependencies = [
62
62
63[[package]]
63[[package]]
64name = "anyhow"
64name = "anyhow"
65−version = "1.0.75"
65+version = "1.0.76"
66source = "registry+https://github.com/rust-lang/crates.io-index"
66source = "registry+https://github.com/rust-lang/crates.io-index"
67−checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
67+checksum = "59d2a3357dde987206219e78ecfbbb6e8dad06cbb65292758d3270e6254f7355"
68
68
69[[package]]
69[[package]]
70name = "arc-swap"
70name = "arc-swap"
@@ -522,9 +522,9 @@ checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
522
522
523[[package]]
523[[package]]
524name = "gix"
524name = "gix"
525−version = "0.56.0"
525+version = "0.57.0"
526source = "registry+https://github.com/rust-lang/crates.io-index"
526source = "registry+https://github.com/rust-lang/crates.io-index"
527−checksum = "5b0dcdc9c60d66535897fa40a7ea2a635e72f99456b1d9ae86b7e170e80618cb"
527+checksum = "721c7497ab24b665ed5a1eb2b3526936aa60068e61ba260651f7e77c52feec69"
528dependencies = [
528dependencies = [
529 "gix-actor",
529 "gix-actor",
530 "gix-commitgraph",
530 "gix-commitgraph",
@@ -563,9 +563,9 @@ dependencies = [
563
563
564[[package]]
564[[package]]
565name = "gix-actor"
565name = "gix-actor"
566−version = "0.28.1"
566+version = "0.29.0"
567source = "registry+https://github.com/rust-lang/crates.io-index"
567source = "registry+https://github.com/rust-lang/crates.io-index"
568−checksum = "2eadca029ef716b4378f7afb19f7ee101fde9e58ba1f1445971315ac866db417"
568+checksum = "886014c4865b93ce268f1d3eddd4fd3261242c3f3ee61eb36009f913016a9059"
569dependencies = [
569dependencies = [
570 "bstr",
570 "bstr",
571 "btoi",
571 "btoi",
@@ -577,18 +577,18 @@ dependencies = [
577
577
578[[package]]
578[[package]]
579name = "gix-chunk"
579name = "gix-chunk"
580−version = "0.4.5"
580+version = "0.4.6"
581source = "registry+https://github.com/rust-lang/crates.io-index"
581source = "registry+https://github.com/rust-lang/crates.io-index"
582−checksum = "d411ecd9b558b0c20b3252b7e409eec48eabc41d18324954fe526bac6e2db55f"
582+checksum = "2ade37ef69870de0ed966b97c57a3a947a22ff3482a52c3b99b205f77bcb08fb"
583dependencies = [
583dependencies = [
584 "thiserror",
584 "thiserror",
585]
585]
586
586
587[[package]]
587[[package]]
588name = "gix-commitgraph"
588name = "gix-commitgraph"
589−version = "0.22.1"
589+version = "0.23.0"
590source = "registry+https://github.com/rust-lang/crates.io-index"
590source = "registry+https://github.com/rust-lang/crates.io-index"
591−checksum = "85a7007ba021f059803afaf6f8a48872422abc20550ac12ede6ddea2936cec36"
591+checksum = "e7559ea9cefee188cd88b05afcc8e3ef7a3cb4a5c647bccf06b981e591b02b77"
592dependencies = [
592dependencies = [
593 "bstr",
593 "bstr",
594 "gix-chunk",
594 "gix-chunk",
@@ -600,9 +600,9 @@ dependencies = [
600
600
601[[package]]
601[[package]]
602name = "gix-config"
602name = "gix-config"
603−version = "0.32.1"
603+version = "0.33.0"
604source = "registry+https://github.com/rust-lang/crates.io-index"
604source = "registry+https://github.com/rust-lang/crates.io-index"
605−checksum = "0341471d55d8676e98b88e121d7065dfa4c9c5acea4b6d6ecdd2846e85cce0c3"
605+checksum = "9c35dc7f9c00a42bbc9cfa1ca2ec0a78ad1b76ff0736d3d35dfd612962244467"
606dependencies = [
606dependencies = [
607 "bstr",
607 "bstr",
608 "gix-config-value",
608 "gix-config-value",
@@ -621,9 +621,9 @@ dependencies = [
621
621
622[[package]]
622[[package]]
623name = "gix-config-value"
623name = "gix-config-value"
624−version = "0.14.1"
624+version = "0.14.2"
625source = "registry+https://github.com/rust-lang/crates.io-index"
625source = "registry+https://github.com/rust-lang/crates.io-index"
626−checksum = "6419db582ea84dfb58c7e7b0af7fd62c808aa14954af2936a33f89b0f4ed018e"
626+checksum = "39f388cb2396aee82d6f460a2e7770659bdf8854e9e5478f7d2b1324a9698284"
627dependencies = [
627dependencies = [
628 "bitflags 2.4.1",
628 "bitflags 2.4.1",
629 "bstr",
629 "bstr",
@@ -634,9 +634,9 @@ dependencies = [
634
634
635[[package]]
635[[package]]
636name = "gix-date"
636name = "gix-date"
637−version = "0.8.1"
637+version = "0.8.2"
638source = "registry+https://github.com/rust-lang/crates.io-index"
638source = "registry+https://github.com/rust-lang/crates.io-index"
639−checksum = "468dfbe411f335f01525a1352271727f8e7772075a93fa747260f502086b30be"
639+checksum = "9d85f4a01e0d05c3de585e28bae514d4baf01655e3fc3f14ce6f30bf62405345"
640dependencies = [
640dependencies = [
641 "bstr",
641 "bstr",
642 "itoa",
642 "itoa",
@@ -646,9 +646,9 @@ dependencies = [
646
646
647[[package]]
647[[package]]
648name = "gix-diff"
648name = "gix-diff"
649−version = "0.38.0"
649+version = "0.39.0"
650source = "registry+https://github.com/rust-lang/crates.io-index"
650source = "registry+https://github.com/rust-lang/crates.io-index"
651−checksum = "8119a985887cfe68f4bdf92e51bd64bc758a73882d82fcfc03ebcb164441c85d"
651+checksum = "ac0e75f5afd2f6c47c800b6b0a000a08045739d0450d20482e8faa42543f62d1"
652dependencies = [
652dependencies = [
653 "bstr",
653 "bstr",
654 "gix-hash",
654 "gix-hash",
@@ -658,9 +658,9 @@ dependencies = [
658
658
659[[package]]
659[[package]]
660name = "gix-discover"
660name = "gix-discover"
661−version = "0.27.0"
661+version = "0.28.0"
662source = "registry+https://github.com/rust-lang/crates.io-index"
662source = "registry+https://github.com/rust-lang/crates.io-index"
663−checksum = "6fad89416ebe0b3b7df78464124e2a02417b6cd3743d48ad93df86f4d2929c07"
663+checksum = "f0b63ce2ad81632ac1a84ac370f85a5e580c3261580bd85ea17ff35d3a0bba18"
664dependencies = [
664dependencies = [
665 "bstr",
665 "bstr",
666 "dunce",
666 "dunce",
@@ -673,9 +673,9 @@ dependencies = [
673
673
674[[package]]
674[[package]]
675name = "gix-features"
675name = "gix-features"
676−version = "0.36.1"
676+version = "0.37.0"
677source = "registry+https://github.com/rust-lang/crates.io-index"
677source = "registry+https://github.com/rust-lang/crates.io-index"
678−checksum = "4d46a4a5c6bb5bebec9c0d18b65ada20e6517dbd7cf855b87dd4bbdce3a771b2"
678+checksum = "befe7edea299a824504b5acc96d7a3a538125b38c42f3a8379f6912a29c90c81"
679dependencies = [
679dependencies = [
680 "crc32fast",
680 "crc32fast",
681 "flate2",
681 "flate2",
@@ -691,18 +691,18 @@ dependencies = [
691
691
692[[package]]
692[[package]]
693name = "gix-fs"
693name = "gix-fs"
694−version = "0.8.1"
694+version = "0.9.0"
695source = "registry+https://github.com/rust-lang/crates.io-index"
695source = "registry+https://github.com/rust-lang/crates.io-index"
696−checksum = "20e86eb040f5776a5ade092282e51cdcad398adb77d948b88d17583c2ae4e107"
696+checksum = "007017ce93b819ea52c0ec68306f7d72212a2d307c3d70f1548c7141c015d0a1"
697dependencies = [
697dependencies = [
698 "gix-features",
698 "gix-features",
699]
699]
700
700
701[[package]]
701[[package]]
702name = "gix-glob"
702name = "gix-glob"
703−version = "0.14.1"
703+version = "0.15.0"
704source = "registry+https://github.com/rust-lang/crates.io-index"
704source = "registry+https://github.com/rust-lang/crates.io-index"
705−checksum = "5db19298c5eeea2961e5b3bf190767a2d1f09b8802aeb5f258e42276350aff19"
705+checksum = "61fb116c2516d3a1170e010118f639944a6389872c875a008960cdab2a44ac72"
706dependencies = [
706dependencies = [
707 "bitflags 2.4.1",
707 "bitflags 2.4.1",
708 "bstr",
708 "bstr",
@@ -712,9 +712,9 @@ dependencies = [
712
712
713[[package]]
713[[package]]
714name = "gix-hash"
714name = "gix-hash"
715−version = "0.13.3"
715+version = "0.14.0"
716source = "registry+https://github.com/rust-lang/crates.io-index"
716source = "registry+https://github.com/rust-lang/crates.io-index"
717−checksum = "1f8cf8c2266f63e582b7eb206799b63aa5fa68ee510ad349f637dfe2d0653de0"
717+checksum = "c52c3170a17b6031833cd2eb4ad7bc23f2755d06e6e70f78dec21d42e8fe1b30"
718dependencies = [
718dependencies = [
719 "faster-hex",
719 "faster-hex",
720 "thiserror",
720 "thiserror",
@@ -722,9 +722,9 @@ dependencies = [
722
722
723[[package]]
723[[package]]
724name = "gix-hashtable"
724name = "gix-hashtable"
725−version = "0.4.1"
725+version = "0.5.0"
726source = "registry+https://github.com/rust-lang/crates.io-index"
726source = "registry+https://github.com/rust-lang/crates.io-index"
727−checksum = "feb61880816d7ec4f0b20606b498147d480860ddd9133ba542628df2f548d3ca"
727+checksum = "40a838e6366a5e5b84668b6997ce0981b833136468e8ba949f424c0ef2927eba"
728dependencies = [
728dependencies = [
729 "gix-hash",
729 "gix-hash",
730 "hashbrown 0.14.3",
730 "hashbrown 0.14.3",
@@ -733,9 +733,9 @@ dependencies = [
733
733
734[[package]]
734[[package]]
735name = "gix-lock"
735name = "gix-lock"
736−version = "11.0.0"
736+version = "12.0.0"
737source = "registry+https://github.com/rust-lang/crates.io-index"
737source = "registry+https://github.com/rust-lang/crates.io-index"
738−checksum = "f4feb1dcd304fe384ddc22edba9dd56a42b0800032de6537728cea2f033a4f37"
738+checksum = "6cf112ddee94223c119a8534dad027740dc3aba3365ac5edeef8a7f6660c74db"
739dependencies = [
739dependencies = [
740 "gix-tempfile",
740 "gix-tempfile",
741 "gix-utils",
741 "gix-utils",
@@ -744,9 +744,9 @@ dependencies = [
744
744
745[[package]]
745[[package]]
746name = "gix-macros"
746name = "gix-macros"
747−version = "0.1.1"
747+version = "0.1.2"
748source = "registry+https://github.com/rust-lang/crates.io-index"
748source = "registry+https://github.com/rust-lang/crates.io-index"
749−checksum = "02a5bcaf6704d9354a3071cede7e77d366a5980c7352e102e2c2f9b645b1d3ae"
749+checksum = "fc207b64189cf71bcb17fc841ab99a5d63d0845546b611e2703ce467f659323a"
750dependencies = [
750dependencies = [
751 "proc-macro2",
751 "proc-macro2",
752 "quote",
752 "quote",
@@ -755,9 +755,9 @@ dependencies = [
755
755
756[[package]]
756[[package]]
757name = "gix-object"
757name = "gix-object"
758−version = "0.39.0"
758+version = "0.40.0"
759source = "registry+https://github.com/rust-lang/crates.io-index"
759source = "registry+https://github.com/rust-lang/crates.io-index"
760−checksum = "febf79c5825720c1c63fe974c7bbe695d0cb54aabad73f45671c60ce0e501e33"
760+checksum = "e4c77e47ffba92127faf632a841fce23d19547e269bd8b88e68961a70eab4e93"
761dependencies = [
761dependencies = [
762 "bstr",
762 "bstr",
763 "btoi",
763 "btoi",
@@ -774,9 +774,9 @@ dependencies = [
774
774
775[[package]]
775[[package]]
776name = "gix-odb"
776name = "gix-odb"
777−version = "0.55.0"
777+version = "0.56.0"
778source = "registry+https://github.com/rust-lang/crates.io-index"
778source = "registry+https://github.com/rust-lang/crates.io-index"
779−checksum = "1fae5f971540c99c6ecc8d4368ecc9d18a9dc8b9391025c68c4399747dc93bac"
779+checksum = "a3254f2005cc7553ea78e85e816a09150c6f7a64e6b7627b8d1fdc56721bea73"
780dependencies = [
780dependencies = [
781 "arc-swap",
781 "arc-swap",
782 "gix-date",
782 "gix-date",
@@ -793,9 +793,9 @@ dependencies = [
793
793
794[[package]]
794[[package]]
795name = "gix-pack"
795name = "gix-pack"
796−version = "0.45.0"
796+version = "0.46.0"
797source = "registry+https://github.com/rust-lang/crates.io-index"
797source = "registry+https://github.com/rust-lang/crates.io-index"
798−checksum = "4569491c92446fddf373456ff360aff9a9effd627b40a70f2d7914dcd75a3205"
798+checksum = "02ebc8cd657eec207d82d8f876ca402361308ecd3c87a47935b0299506257b4f"
799dependencies = [
799dependencies = [
800 "clru",
800 "clru",
801 "gix-chunk",
801 "gix-chunk",
@@ -813,9 +813,9 @@ dependencies = [
813
813
814[[package]]
814[[package]]
815name = "gix-path"
815name = "gix-path"
816−version = "0.10.1"
816+version = "0.10.2"
817source = "registry+https://github.com/rust-lang/crates.io-index"
817source = "registry+https://github.com/rust-lang/crates.io-index"
818−checksum = "d86d6fac2fabe07b67b7835f46d07571f68b11aa1aaecae94fe722ea4ef305e1"
818+checksum = "10931652a3da126990ac93bce1b1c600cc99d7c268d712b6360ed52174ce1b68"
819dependencies = [
819dependencies = [
820 "bstr",
820 "bstr",
821 "gix-trace",
821 "gix-trace",
@@ -826,9 +826,9 @@ dependencies = [
826
826
827[[package]]
827[[package]]
828name = "gix-quote"
828name = "gix-quote"
829−version = "0.4.8"
829+version = "0.4.9"
830source = "registry+https://github.com/rust-lang/crates.io-index"
830source = "registry+https://github.com/rust-lang/crates.io-index"
831−checksum = "4f84845efa535468bc79c5a87b9d29219f1da0313c8ecf0365a5daa7e72786f2"
831+checksum = "6c43530cb94a7759807e6f8d180e17ac9c65673b891645c6c433831dc0cf4342"
832dependencies = [
832dependencies = [
833 "bstr",
833 "bstr",
834 "btoi",
834 "btoi",
@@ -837,9 +837,9 @@ dependencies = [
837
837
838[[package]]
838[[package]]
839name = "gix-ref"
839name = "gix-ref"
840−version = "0.39.0"
840+version = "0.40.0"
841source = "registry+https://github.com/rust-lang/crates.io-index"
841source = "registry+https://github.com/rust-lang/crates.io-index"
842−checksum = "1ac23ed741583c792f573c028785db683496a6dfcd672ec701ee54ba6a77e1ff"
842+checksum = "baa951b3b850d6d1be4f900768e49af20b76bf9505beac22af723d57249a2f1d"
843dependencies = [
843dependencies = [
844 "gix-actor",
844 "gix-actor",
845 "gix-date",
845 "gix-date",
@@ -858,9 +858,9 @@ dependencies = [
858
858
859[[package]]
859[[package]]
860name = "gix-refspec"
860name = "gix-refspec"
861−version = "0.20.0"
861+version = "0.21.0"
862source = "registry+https://github.com/rust-lang/crates.io-index"
862source = "registry+https://github.com/rust-lang/crates.io-index"
863−checksum = "76d9d3b82e1ee78fc0dc1c37ea5ea76c2dbc73f407db155f0dfcea285e583bee"
863+checksum = "88c61f849d58c06e3068a0b601cf10127d2a07cdad00a725ed66cf303f76f6b3"
864dependencies = [
864dependencies = [
865 "bstr",
865 "bstr",
866 "gix-hash",
866 "gix-hash",
@@ -872,9 +872,9 @@ dependencies = [
872
872
873[[package]]
873[[package]]
874name = "gix-revision"
874name = "gix-revision"
875−version = "0.24.0"
875+version = "0.25.0"
876source = "registry+https://github.com/rust-lang/crates.io-index"
876source = "registry+https://github.com/rust-lang/crates.io-index"
877−checksum = "fe5dd51710ce5434bc315ea30394fab483c5377276494edd79222b321a5a9544"
877+checksum = "bcbbf91f4200c5c76802ef5f057b96f5a336827508881fe55a780be71a794d22"
878dependencies = [
878dependencies = [
879 "bstr",
879 "bstr",
880 "gix-date",
880 "gix-date",
@@ -888,9 +888,9 @@ dependencies = [
888
888
889[[package]]
889[[package]]
890name = "gix-revwalk"
890name = "gix-revwalk"
891−version = "0.10.0"
891+version = "0.11.0"
892source = "registry+https://github.com/rust-lang/crates.io-index"
892source = "registry+https://github.com/rust-lang/crates.io-index"
893−checksum = "69d4ed2493ca94a475fdf147138e1ef8bab3b6ebb56abf3d9bda1c05372ec1dd"
893+checksum = "33ab66354d83f70f2730391747d0c75f94ef3c3dd40ebde2e206db9faaf7a0a7"
894dependencies = [
894dependencies = [
895 "gix-commitgraph",
895 "gix-commitgraph",
896 "gix-date",
896 "gix-date",
@@ -903,21 +903,21 @@ dependencies = [
903
903
904[[package]]
904[[package]]
905name = "gix-sec"
905name = "gix-sec"
906−version = "0.10.1"
906+version = "0.10.2"
907source = "registry+https://github.com/rust-lang/crates.io-index"
907source = "registry+https://github.com/rust-lang/crates.io-index"
908−checksum = "a36ea2c5907d64a9b4b5d3cc9f430e6c30f0509646b5e38eb275ca57c5bf29e2"
908+checksum = "a9963f38a42144253ed4d571882d7db5ef644c12e6726e4b75135597cc9d0e1a"
909dependencies = [
909dependencies = [
910 "bitflags 2.4.1",
910 "bitflags 2.4.1",
911 "gix-path",
911 "gix-path",
912 "libc",
912 "libc",
913− "windows",
913+ "windows 0.52.0",
914]
914]
915
915
916[[package]]
916[[package]]
917name = "gix-tempfile"
917name = "gix-tempfile"
918−version = "11.0.0"
918+version = "12.0.0"
919source = "registry+https://github.com/rust-lang/crates.io-index"
919source = "registry+https://github.com/rust-lang/crates.io-index"
920−checksum = "05cc2205cf10d99f70b96e04e16c55d4c7cf33efc151df1f793e29fd12a931f8"
920+checksum = "e76a494bd530e1a1309188ff971825a24f159c76c2db0bf71fa5dfb469a2c915"
921dependencies = [
921dependencies = [
922 "gix-fs",
922 "gix-fs",
923 "libc",
923 "libc",
@@ -928,15 +928,15 @@ dependencies = [
928
928
929[[package]]
929[[package]]
930name = "gix-trace"
930name = "gix-trace"
931−version = "0.1.4"
931+version = "0.1.5"
932source = "registry+https://github.com/rust-lang/crates.io-index"
932source = "registry+https://github.com/rust-lang/crates.io-index"
933−checksum = "b686a35799b53a9825575ca3f06481d0a053a409c4d97ffcf5ddd67a8760b497"
933+checksum = "bda62acb44dd86a40c7c3762a5403cfc1ac789ea559df54085cedf79864f809e"
934
934
935[[package]]
935[[package]]
936name = "gix-traverse"
936name = "gix-traverse"
937−version = "0.35.0"
937+version = "0.36.0"
938source = "registry+https://github.com/rust-lang/crates.io-index"
938source = "registry+https://github.com/rust-lang/crates.io-index"
939−checksum = "df2112088122a0206592c84fbd42020db63b2ccaed66a0293779f2e5fbf80474"
939+checksum = "8661fab39985c9214e56d81a63ceb5886ac948cec2fba76c39494d1e0e307ea8"
940dependencies = [
940dependencies = [
941 "gix-commitgraph",
941 "gix-commitgraph",
942 "gix-date",
942 "gix-date",
@@ -950,9 +950,9 @@ dependencies = [
950
950
951[[package]]
951[[package]]
952name = "gix-url"
952name = "gix-url"
953−version = "0.25.2"
953+version = "0.26.0"
954source = "registry+https://github.com/rust-lang/crates.io-index"
954source = "registry+https://github.com/rust-lang/crates.io-index"
955−checksum = "0c427a1a11ccfa53a4a2da47d9442c2241deee63a154bc15cc14b8312fbc4005"
955+checksum = "10a0129c1e8b52736d7c5128300a4485dbc85863001371e2771ac1754bd89fd7"
956dependencies = [
956dependencies = [
957 "bstr",
957 "bstr",
958 "gix-features",
958 "gix-features",
@@ -964,18 +964,18 @@ dependencies = [
964
964
965[[package]]
965[[package]]
966name = "gix-utils"
966name = "gix-utils"
967−version = "0.1.6"
967+version = "0.1.7"
968source = "registry+https://github.com/rust-lang/crates.io-index"
968source = "registry+https://github.com/rust-lang/crates.io-index"
969−checksum = "9f82c41937f00e15a1f6cb0b55307f0ca1f77f4407ff2bf440be35aa688c6a3e"
969+checksum = "ab9277a5e32e85d53f738096d872a4a9b76067ad471894ad31bd99c8fa2da1dc"
970dependencies = [
970dependencies = [
971 "fastrand",
971 "fastrand",
972]
972]
973
973
974[[package]]
974[[package]]
975name = "gix-validate"
975name = "gix-validate"
976−version = "0.8.1"
976+version = "0.8.2"
977source = "registry+https://github.com/rust-lang/crates.io-index"
977source = "registry+https://github.com/rust-lang/crates.io-index"
978−checksum = "75b7d8e4274be69f284bbc7e6bb2ccf7065dbcdeba22d8c549f2451ae426883f"
978+checksum = "f805ebbdbaa4bfd98e2ee43e6d14099b8a4d9141f5d7b8202fea4d48e44263e7"
979dependencies = [
979dependencies = [
980 "bstr",
980 "bstr",
981 "thiserror",
981 "thiserror",
@@ -1286,7 +1286,7 @@ dependencies = [
1286 "iana-time-zone-haiku",
1286 "iana-time-zone-haiku",
1287 "js-sys",
1287 "js-sys",
1288 "wasm-bindgen",
1288 "wasm-bindgen",
1289− "windows",
1289+ "windows 0.48.0",
1290]
1290]
1291
1291
1292[[package]]
1292[[package]]
@@ -1624,9 +1624,9 @@ dependencies = [
1624
1624
1625[[package]]
1625[[package]]
1626name = "prodash"
1626name = "prodash"
1627−version = "26.2.2"
1627+version = "28.0.0"
1628source = "registry+https://github.com/rust-lang/crates.io-index"
1628source = "registry+https://github.com/rust-lang/crates.io-index"
1629−checksum = "794b5bf8e2d19b53dcdcec3e4bba628e20f5b6062503ba89281fa7037dd7bbcf"
1629+checksum = "744a264d26b88a6a7e37cbad97953fa233b94d585236310bcbc88474b4092d79"
1630
1630
1631[[package]]
1631[[package]]
1632name = "pulldown-cmark"
1632name = "pulldown-cmark"
@@ -2101,9 +2101,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
2101
2101
2102[[package]]
2102[[package]]
2103name = "tokio"
2103name = "tokio"
2104−version = "1.35.0"
2104+version = "1.35.1"
2105source = "registry+https://github.com/rust-lang/crates.io-index"
2105source = "registry+https://github.com/rust-lang/crates.io-index"
2106−checksum = "841d45b238a16291a4e1584e61820b8ae57d696cc5015c459c229ccc6990cc1c"
2106+checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
2107dependencies = [
2107dependencies = [
2108 "backtrace",
2108 "backtrace",
2109 "bytes",
2109 "bytes",
@@ -2384,6 +2384,25 @@ dependencies = [
2384 "windows-targets 0.48.0",
2384 "windows-targets 0.48.0",
2385]
2385]
2386
2386
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+
2387[[package]]
2406[[package]]
2388name = "windows-sys"
2407name = "windows-sys"
2389version = "0.45.0"
2408version = "0.45.0"
book/src/languages.md+1
@@ -69,6 +69,7 @@ These configuration keys are available:
69| `soft-wrap` | [editor.softwrap](./configuration.md#editorsoft-wrap-section)
69| `soft-wrap` | [editor.softwrap](./configuration.md#editorsoft-wrap-section)
70| `text-width` | Maximum line length. Used for the `:reflow` command and soft-wrapping if `soft-wrap.wrap-at-text-width` is set, defaults to `editor.text-width` |
70| `text-width` | Maximum line length. Used for the `:reflow` command and soft-wrapping if `soft-wrap.wrap-at-text-width` is set, defaults to `editor.text-width` |
71| `workspace-lsp-roots` | Directories relative to the workspace root that are treated as LSP roots. Should only be set in `.helix/config.toml`. Overwrites the setting of the same name in `config.toml` if set. |
71| `workspace-lsp-roots` | Directories relative to the workspace root that are treated as LSP roots. Should only be set in `.helix/config.toml`. Overwrites the setting of the same name in `config.toml` if set. |
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.
72
73
73### File-type detection and the `file-types` key
74### File-type detection and the `file-types` key
74
75
helix-core/src/diagnostic.rs+4
@@ -39,6 +39,10 @@ pub enum DiagnosticTag {
39#[derive(Debug, Clone)]
39#[derive(Debug, Clone)]
40pub struct Diagnostic {
40pub struct Diagnostic {
41 pub range: Range,
41 pub range: Range,
42+ // whether this diagnostic ends at the end of(or inside) a word
43+ pub ends_at_word: bool,
44+ pub starts_at_word: bool,
45+ pub zero_width: bool,
42 pub line: usize,
46 pub line: usize,
43 pub message: String,
47 pub message: String,
44 pub severity: Option<Severity>,
48 pub severity: Option<Severity>,
helix-core/src/syntax.rs+2
@@ -155,6 +155,8 @@ pub struct LanguageConfiguration {
155 /// Hardcoded LSP root directories relative to the workspace root, like `examples` or `tools/fuzz`.
155 /// Hardcoded LSP root directories relative to the workspace root, like `examples` or `tools/fuzz`.
156 /// Falling back to the current working directory if none are configured.
156 /// Falling back to the current working directory if none are configured.
157 pub workspace_lsp_roots: Option<Vec<PathBuf>>,
157 pub workspace_lsp_roots: Option<Vec<PathBuf>>,
158+ #[serde(default)]
159+ pub persistent_diagnostic_sources: Vec<String>,
158}
160}
159
161
160#[derive(Debug, PartialEq, Eq, Hash)]
162#[derive(Debug, PartialEq, Eq, Hash)]
helix-core/src/transaction.rs+73−14
@@ -1,7 +1,7 @@
1use ropey::RopeSlice;
1use ropey::RopeSlice;
2use smallvec::SmallVec;
2use smallvec::SmallVec;
3
3
4−use crate::{Range, Rope, Selection, Tendril};
4+use crate::{chars::char_is_word, Range, Rope, Selection, Tendril};
5use std::{borrow::Cow, iter::once};
5use std::{borrow::Cow, iter::once};
6
6
7/// (from, to, replacement)
7/// (from, to, replacement)
@@ -23,6 +23,30 @@ pub enum Operation {
23pub enum Assoc {
23pub enum Assoc {
24 Before,
24 Before,
25 After,
25 After,
26+ /// Acts like `After` if a word character is inserted
27+ /// after the position, otherwise acts like `Before`
28+ AfterWord,
29+ /// Acts like `Before` if a word character is inserted
30+ /// before the position, otherwise acts like `After`
31+ BeforeWord,
32+}
33+
34+impl Assoc {
35+ /// Whether to stick to gaps
36+ fn stay_at_gaps(self) -> bool {
37+ !matches!(self, Self::BeforeWord | Self::AfterWord)
38+ }
39+
40+ fn insert_offset(self, s: &str) -> usize {
41+ let chars = s.chars().count();
42+ match self {
43+ Assoc::After => chars,
44+ Assoc::AfterWord => s.chars().take_while(|&c| char_is_word(c)).count(),
45+ // return position before inserted text
46+ Assoc::Before => 0,
47+ Assoc::BeforeWord => chars - s.chars().rev().take_while(|&c| char_is_word(c)).count(),
48+ }
49+ }
26}
50}
27
51
28#[derive(Debug, Default, Clone, PartialEq, Eq)]
52#[derive(Debug, Default, Clone, PartialEq, Eq)]
@@ -415,8 +439,6 @@ impl ChangeSet {
415 map!(|pos, _| (old_end > pos).then_some(new_pos), i);
439 map!(|pos, _| (old_end > pos).then_some(new_pos), i);
416 }
440 }
417 Insert(s) => {
441 Insert(s) => {
418− let ins = s.chars().count();
419−
420 // a subsequent delete means a replace, consume it
442 // a subsequent delete means a replace, consume it
421 if let Some((_, Delete(len))) = iter.peek() {
443 if let Some((_, Delete(len))) = iter.peek() {
422 iter.next();
444 iter.next();
@@ -424,13 +446,13 @@ impl ChangeSet {
424 old_end = old_pos + len;
446 old_end = old_pos + len;
425 // in range of replaced text
447 // in range of replaced text
426 map!(
448 map!(
427− |pos, assoc| (old_end > pos).then(|| {
449+ |pos, assoc: Assoc| (old_end > pos).then(|| {
428 // at point or tracking before
450 // at point or tracking before
429− if pos == old_pos || assoc == Assoc::Before {
451+ if pos == old_pos && assoc.stay_at_gaps() {
430 new_pos
452 new_pos
431 } else {
453 } else {
432 // place to end of insert
454 // place to end of insert
433− new_pos + ins
455+ new_pos + assoc.insert_offset(s)
434 }
456 }
435 }),
457 }),
436 i
458 i
@@ -438,20 +460,15 @@ impl ChangeSet {
438 } else {
460 } else {
439 // at insert point
461 // at insert point
440 map!(
462 map!(
441− |pos, assoc| (old_pos == pos).then(|| {
463+ |pos, assoc: Assoc| (old_pos == pos).then(|| {
442 // return position before inserted text
464 // return position before inserted text
443− if assoc == Assoc::Before {
465+ new_pos + assoc.insert_offset(s)
444− new_pos
445− } else {
446− // after text
447− new_pos + ins
448− }
449 }),
466 }),
450 i
467 i
451 );
468 );
452 }
469 }
453
470
454− new_pos += ins;
471+ new_pos += s.chars().count();
455 }
472 }
456 }
473 }
457 old_pos = old_end;
474 old_pos = old_end;
@@ -884,6 +901,48 @@ mod test {
884 let mut positions = [4, 2];
901 let mut positions = [4, 2];
885 cs.update_positions(positions.iter_mut().map(|pos| (pos, Assoc::After)));
902 cs.update_positions(positions.iter_mut().map(|pos| (pos, Assoc::After)));
886 assert_eq!(positions, [4, 2]);
903 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);
887 }
946 }
888
947
889 #[test]
948 #[test]
helix-term/src/application.rs+80−38
@@ -1,6 +1,7 @@
1use arc_swap::{access::Map, ArcSwap};
1use arc_swap::{access::Map, ArcSwap};
2use futures_util::Stream;
2use futures_util::Stream;
3use helix_core::{
3use helix_core::{
4+ chars::char_is_word,
4 diagnostic::{DiagnosticTag, NumberOrString},
5 diagnostic::{DiagnosticTag, NumberOrString},
5 path::get_relative_path,
6 path::get_relative_path,
6 pos_at_coords, syntax, Selection,
7 pos_at_coords, syntax, Selection,
@@ -717,7 +718,7 @@ impl Application {
717 ));
718 ));
718 }
719 }
719 }
720 }
720− Notification::PublishDiagnostics(params) => {
721+ Notification::PublishDiagnostics(mut params) => {
721 let path = match params.uri.to_file_path() {
722 let path = match params.uri.to_file_path() {
722 Ok(path) => path,
723 Ok(path) => path,
723 Err(_) => {
724 Err(_) => {
@@ -731,31 +732,69 @@ impl Application {
731 return;
732 return;
732 }
733 }
733 let offset_encoding = language_server.offset_encoding();
734 let offset_encoding = language_server.offset_encoding();
734− let doc = self.editor.document_by_path_mut(&path).filter(|doc| {
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| {
735− if let Some(version) = params.version {
739+ if let Some(version) = params.version {
736− if version != doc.version() {
740+ if version != doc.version() {
737− log::info!("Version ({version}) is out of date for {path:?} (expected ({}), dropping PublishDiagnostic notification", doc.version());
741+ log::info!("Version ({version}) is out of date for {path:?} (expected ({}), dropping PublishDiagnostic notification", doc.version());
738− return false;
742+ return false;
743+ }
739 }
744 }
740− }
741−
742− true
745+ true
743− });
746+ });
744
747
745 if let Some(doc) = doc {
748 if let Some(doc) = doc {
746− let lang_conf = doc.language_config();
749+ let lang_conf = doc.language.clone();
747− let text = doc.text();
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+ }
748
782
783+ let unchaged_diag_sources = &unchaged_diag_sources_;
749− let diagnostics = params
784+ let diagnostics =
750− .diagnostics
751− .iter()
752− .filter_map(|diagnostic| {
785+ params.diagnostics.iter().filter_map(move |diagnostic| {
753 use helix_core::diagnostic::{Diagnostic, Range, Severity::*};
786 use helix_core::diagnostic::{Diagnostic, Range, Severity::*};
754 use lsp::DiagnosticSeverity;
787 use lsp::DiagnosticSeverity;
755
788
789+ if diagnostic.source.as_ref().map_or(false, |source| {
790+ unchaged_diag_sources.contains(source)
791+ }) {
792+ return None;
793+ }
794+
756 // TODO: convert inside server
795 // TODO: convert inside server
757 let start = if let Some(start) = lsp_pos_to_pos(
796 let start = if let Some(start) = lsp_pos_to_pos(
758− text,
797+ &text,
759 diagnostic.range.start,
798 diagnostic.range.start,
760 offset_encoding,
799 offset_encoding,
761 ) {
800 ) {
@@ -766,14 +805,13 @@ impl Application {
766 };
805 };
767
806
768 let end = if let Some(end) =
807 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)
770 {
809 {
771 end
810 end
772 } else {
811 } else {
773 log::warn!("lsp position out of bounds - {:?}", diagnostic);
812 log::warn!("lsp position out of bounds - {:?}", diagnostic);
774 return None;
813 return None;
775 };
814 };
776−
777 let severity =
815 let severity =
778 diagnostic.severity.map(|severity| match severity {
816 diagnostic.severity.map(|severity| match severity {
779 DiagnosticSeverity::ERROR => Error,
817 DiagnosticSeverity::ERROR => Error,
@@ -786,7 +824,7 @@ impl Application {
786 ),
824 ),
787 });
825 });
788
826
789− if let Some(lang_conf) = lang_conf {
827+ if let Some(lang_conf) = &lang_conf {
790 if let Some(severity) = severity {
828 if let Some(severity) = severity {
791 if severity < lang_conf.diagnostic_severity {
829 if severity < lang_conf.diagnostic_severity {
792 return None;
830 return None;
@@ -825,8 +863,17 @@ impl Application {
825 Vec::new()
863 Vec::new()
826 };
864 };
827
865
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+
828 Some(Diagnostic {
872 Some(Diagnostic {
829 range: Range { start, end },
873 range: Range { start, end },
874+ ends_at_word,
875+ starts_at_word,
876+ zero_width: start == end,
830 line: diagnostic.range.start.line as usize,
877 line: diagnostic.range.start.line as usize,
831 message: diagnostic.message.clone(),
878 message: diagnostic.message.clone(),
832 severity,
879 severity,
@@ -836,38 +883,33 @@ impl Application {
836 data: diagnostic.data.clone(),
883 data: diagnostic.data.clone(),
837 language_server_id: server_id,
884 language_server_id: server_id,
838 })
885 })
839− })
886+ });
840− .collect();
841
887
842− doc.replace_diagnostics(diagnostics, server_id);
888+ doc.replace_diagnostics(diagnostics, unchaged_diag_sources, server_id);
843 }
889 }
844
890
845− let mut diagnostics = params
891+ let diagnostics = params.diagnostics.into_iter().map(|d| (d, server_id));
846− .diagnostics
847− .into_iter()
848− .map(|d| (d, server_id))
849− .collect();
850
892
851 // Insert the original lsp::Diagnostics here because we may have no open document
893 // Insert the original lsp::Diagnostics here because we may have no open document
852 // for diagnosic message and so we can't calculate the exact position.
894 // for diagnosic message and so we can't calculate the exact position.
853 // When using them later in the diagnostics picker, we calculate them on-demand.
895 // 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) {
855 Entry::Occupied(o) => {
897 Entry::Occupied(o) => {
856 let current_diagnostics = o.into_mut();
898 let current_diagnostics = o.into_mut();
857 // there may entries of other language servers, which is why we can't overwrite the whole entry
899 // there may entries of other language servers, which is why we can't overwrite the whole entry
858 current_diagnostics.retain(|(_, lsp_id)| *lsp_id != server_id);
900 current_diagnostics.retain(|(_, lsp_id)| *lsp_id != server_id);
859− current_diagnostics.append(&mut diagnostics);
901+ current_diagnostics.extend(diagnostics);
860− // Sort diagnostics first by severity and then by line numbers.
861− // Note: The `lsp::DiagnosticSeverity` enum is already defined in decreasing order
862 current_diagnostics
902 current_diagnostics
863− .sort_unstable_by_key(|(d, _)| (d.severity, d.range.start));
903+ // Sort diagnostics first by severity and then by line numbers.
864− }
865− Entry::Vacant(v) => {
866− diagnostics
867− .sort_unstable_by_key(|(d, _)| (d.severity, d.range.start));
868− v.insert(diagnostics);
869 }
904 }
905+ Entry::Vacant(v) => v.insert(diagnostics.collect()),
870 };
906 };
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+ });
871 }
913 }
872 Notification::ShowMessage(params) => {
914 Notification::ShowMessage(params) => {
873 log::warn!("unhandled window/showMessage: {:?}", params);
915 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
19parking_lot = "0.12"
19parking_lot = "0.12"
20arc-swap = { version = "1.6.0" }
20arc-swap = { version = "1.6.0" }
21
21
22−gix = { version = "0.56.0", default-features = false , optional = true }
22+gix = { version = "0.57.0", default-features = false , optional = true }
23imara-diff = "0.1.5"
23imara-diff = "0.1.5"
24anyhow = "1"
24anyhow = "1"
25
25
helix-view/src/document.rs+57−20
@@ -1213,23 +1213,40 @@ impl Document {
1213
1213
1214 let changes = transaction.changes();
1214 let changes = transaction.changes();
1215
1215
1216− changes.update_positions(
1217− self.diagnostics
1218− .iter_mut()
1219− .map(|diagnostic| (&mut diagnostic.range.start, Assoc::After)),
1220− );
1221− changes.update_positions(
1222− self.diagnostics
1223− .iter_mut()
1224− .map(|diagnostic| (&mut diagnostic.range.end, Assoc::After)),
1225− );
1226− // map state.diagnostics over changes::map_pos too
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+ }));
1227− for diagnostic in &mut self.diagnostics {
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+ }
1228 diagnostic.line = self.text.char_to_line(diagnostic.range.start);
1239 diagnostic.line = self.text.char_to_line(diagnostic.range.start);
1240+ true
1229− }
1241+ });
1230
1242
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+ });
1233
1250
1234 // Update the inlay hint annotations' positions, helping ensure they are displayed in the proper place
1251 // Update the inlay hint annotations' positions, helping ensure they are displayed in the proper place
1235 let apply_inlay_hint_changes = |annotations: &mut Rc<[InlineAnnotation]>| {
1252 let apply_inlay_hint_changes = |annotations: &mut Rc<[InlineAnnotation]>| {
@@ -1706,13 +1723,33 @@ impl Document {
1706
1723
1707 pub fn replace_diagnostics(
1724 pub fn replace_diagnostics(
1708 &mut self,
1725 &mut self,
1709− mut diagnostics: Vec<Diagnostic>,
1726+ diagnostics: impl IntoIterator<Item = Diagnostic>,
1727+ unchanged_sources: &[String],
1710 language_server_id: usize,
1728 language_server_id: usize,
1711 ) {
1729 ) {
1730+ if unchanged_sources.is_empty() {
1712− self.clear_diagnostics(language_server_id);
1731+ self.clear_diagnostics(language_server_id);
1732+ } else {
1713− self.diagnostics.append(&mut diagnostics);
1733+ self.diagnostics.retain(|d| {
1714− self.diagnostics
1734+ if d.language_server_id != language_server_id {
1735+ return true;
1736+ }
1737+
1738+ if let Some(source) = &d.source {
1739+ unchanged_sources.contains(source)
1740+ } else {
1741+ false
1742+ }
1743+ });
1744+ }
1745+ self.diagnostics.extend(diagnostics);
1715− .sort_unstable_by_key(|diagnostic| diagnostic.range);
1746+ self.diagnostics.sort_unstable_by_key(|diagnostic| {
1747+ (
1748+ diagnostic.range,
1749+ diagnostic.severity,
1750+ diagnostic.language_server_id,
1751+ )
1752+ });
1716 }
1753 }
1717
1754
1718 pub fn clear_diagnostics(&mut self, language_server_id: usize) {
1755 pub fn clear_diagnostics(&mut self, language_server_id: usize) {
languages.toml+1
@@ -191,6 +191,7 @@ auto-format = true
191comment-token = "//"
191comment-token = "//"
192language-servers = [ "rust-analyzer" ]
192language-servers = [ "rust-analyzer" ]
193indent = { tab-width = 4, unit = " " }
193indent = { tab-width = 4, unit = " " }
194+persistent-diagnostic-sources = ["rustc", "clippy"]
194
195
195[language.auto-pairs]
196[language.auto-pairs]
196'(' = ')'
197'(' = ')'