perf: apply add_many()/remove_many() to the visual mode items for selection conflict detecting (#758)

This commit is contained in:
三咲雅 · Misaki Masa 2024-03-02 11:01:52 +08:00 committed by GitHub
parent fa2632eda9
commit 6a1063d376
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 186 additions and 175 deletions

187
Cargo.lock generated
View File

@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]] [[package]]
name = "ahash" name = "ahash"
version = "0.8.8" version = "0.8.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" checksum = "8b79b82693f705137f8fb9b37871d99e4f9a7df12b917eed79c3d3954830a60b"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"once_cell", "once_cell",
@ -72,9 +72,9 @@ dependencies = [
[[package]] [[package]]
name = "anstream" name = "anstream"
version = "0.6.12" version = "0.6.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb"
dependencies = [ dependencies = [
"anstyle", "anstyle",
"anstyle-parse", "anstyle-parse",
@ -120,9 +120,9 @@ dependencies = [
[[package]] [[package]]
name = "anyhow" name = "anyhow"
version = "1.0.79" version = "1.0.80"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1"
[[package]] [[package]]
name = "arc-swap" name = "arc-swap"
@ -214,9 +214,9 @@ dependencies = [
[[package]] [[package]]
name = "bstr" name = "bstr"
version = "1.9.0" version = "1.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706"
dependencies = [ dependencies = [
"memchr", "memchr",
"serde", "serde",
@ -224,9 +224,9 @@ dependencies = [
[[package]] [[package]]
name = "bumpalo" name = "bumpalo"
version = "3.15.0" version = "3.15.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d32a994c2b3ca201d9b263612a374263f05e7adde37c4707f693dcd375076d1f" checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b"
[[package]] [[package]]
name = "bytemuck" name = "bytemuck"
@ -263,12 +263,9 @@ dependencies = [
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.0.83" version = "1.0.88"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" checksum = "02f341c093d19155a6e41631ce5971aac4e9a868262212153124c15fa22d1cdc"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
@ -285,7 +282,7 @@ dependencies = [
"android-tzdata", "android-tzdata",
"iana-time-zone", "iana-time-zone",
"num-traits", "num-traits",
"windows-targets 0.52.0", "windows-targets 0.52.4",
] ]
[[package]] [[package]]
@ -348,7 +345,7 @@ dependencies = [
"heck", "heck",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.49", "syn 2.0.52",
] ]
[[package]] [[package]]
@ -431,9 +428,9 @@ dependencies = [
[[package]] [[package]]
name = "crossbeam-channel" name = "crossbeam-channel"
version = "0.5.11" version = "0.5.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95"
dependencies = [ dependencies = [
"crossbeam-utils", "crossbeam-utils",
] ]
@ -565,9 +562,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]] [[package]]
name = "erased-serde" name = "erased-serde"
version = "0.4.2" version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55d05712b2d8d88102bc9868020c9e5c7a1f5527c452b9b97450a1d006140ba7" checksum = "388979d208a049ffdfb22fa33b9c81942215b940910bccfe258caeb25d125cb3"
dependencies = [ dependencies = [
"serde", "serde",
] ]
@ -749,7 +746,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.49", "syn 2.0.52",
] ]
[[package]] [[package]]
@ -805,9 +802,9 @@ dependencies = [
[[package]] [[package]]
name = "gif" name = "gif"
version = "0.12.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2"
dependencies = [ dependencies = [
"color_quant", "color_quant",
"weezl", "weezl",
@ -827,9 +824,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
[[package]] [[package]]
name = "half" name = "half"
version = "2.3.1" version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" checksum = "b5eceaaeec696539ddaf7b333340f1af35a5aa87ae3e4f3ead0532f72affab2e"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"crunchy", "crunchy",
@ -853,9 +850,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]] [[package]]
name = "hermit-abi" name = "hermit-abi"
version = "0.3.6" version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
[[package]] [[package]]
name = "home" name = "home"
@ -917,9 +914,9 @@ checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed"
[[package]] [[package]]
name = "image" name = "image"
version = "0.24.8" version = "0.24.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23" checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"byteorder", "byteorder",
@ -941,9 +938,9 @@ checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284"
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "2.2.3" version = "2.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown", "hashbrown",
@ -1093,15 +1090,15 @@ dependencies = [
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.20" version = "0.4.21"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
[[package]] [[package]]
name = "lru" name = "lru"
version = "0.12.2" version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db2c024b41519440580066ba82aab04092b333e09066a5eb86c7c4890df31f22" checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc"
dependencies = [ dependencies = [
"hashbrown", "hashbrown",
] ]
@ -1180,9 +1177,9 @@ dependencies = [
[[package]] [[package]]
name = "mlua" name = "mlua"
version = "0.9.5" version = "0.9.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d3561f79659ff3afad7b25e2bf2ec21507fe601ebecb7f81088669ec4bfd51e" checksum = "868d02cb5eb97761bbf6bd6922c1c7a88b8ea252bbf43bd8350a0bf8497a1fc0"
dependencies = [ dependencies = [
"bstr", "bstr",
"erased-serde", "erased-serde",
@ -1221,7 +1218,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"regex", "regex",
"syn 2.0.49", "syn 2.0.52",
] ]
[[package]] [[package]]
@ -1444,9 +1441,9 @@ dependencies = [
[[package]] [[package]]
name = "png" name = "png"
version = "0.17.12" version = "0.17.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78c2378060fb13acff3ba0325b83442c1d2c44fbb76df481160ddc1687cce160" checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"crc32fast", "crc32fast",
@ -1543,9 +1540,9 @@ dependencies = [
[[package]] [[package]]
name = "rayon" name = "rayon"
version = "1.8.1" version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd"
dependencies = [ dependencies = [
"either", "either",
"rayon-core", "rayon-core",
@ -1643,9 +1640,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
[[package]] [[package]]
name = "ryu" name = "ryu"
version = "1.0.16" version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1"
[[package]] [[package]]
name = "safemem" name = "safemem"
@ -1670,9 +1667,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.196" version = "1.0.197"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
@ -1689,20 +1686,20 @@ dependencies = [
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.196" version = "1.0.197"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.49", "syn 2.0.52",
] ]
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.113" version = "1.0.114"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0"
dependencies = [ dependencies = [
"itoa", "itoa",
"ryu", "ryu",
@ -1804,12 +1801,12 @@ checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
[[package]] [[package]]
name = "socket2" name = "socket2"
version = "0.5.5" version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871"
dependencies = [ dependencies = [
"libc", "libc",
"windows-sys 0.48.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -1868,7 +1865,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"rustversion", "rustversion",
"syn 2.0.49", "syn 2.0.52",
] ]
[[package]] [[package]]
@ -1884,9 +1881,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.49" version = "2.0.52"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -1931,14 +1928,14 @@ checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.49", "syn 2.0.52",
] ]
[[package]] [[package]]
name = "thread_local" name = "thread_local"
version = "1.1.7" version = "1.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"once_cell", "once_cell",
@ -2050,7 +2047,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.49", "syn 2.0.52",
] ]
[[package]] [[package]]
@ -2143,7 +2140,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.49", "syn 2.0.52",
] ]
[[package]] [[package]]
@ -2217,9 +2214,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
[[package]] [[package]]
name = "unicode-normalization" name = "unicode-normalization"
version = "0.1.22" version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5"
dependencies = [ dependencies = [
"tinyvec", "tinyvec",
] ]
@ -2366,7 +2363,7 @@ dependencies = [
"once_cell", "once_cell",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.49", "syn 2.0.52",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -2388,7 +2385,7 @@ checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.49", "syn 2.0.52",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -2464,7 +2461,7 @@ version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [ dependencies = [
"windows-targets 0.52.0", "windows-targets 0.52.4",
] ]
[[package]] [[package]]
@ -2482,7 +2479,7 @@ version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [ dependencies = [
"windows-targets 0.52.0", "windows-targets 0.52.4",
] ]
[[package]] [[package]]
@ -2517,17 +2514,17 @@ dependencies = [
[[package]] [[package]]
name = "windows-targets" name = "windows-targets"
version = "0.52.0" version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b"
dependencies = [ dependencies = [
"windows_aarch64_gnullvm 0.52.0", "windows_aarch64_gnullvm 0.52.4",
"windows_aarch64_msvc 0.52.0", "windows_aarch64_msvc 0.52.4",
"windows_i686_gnu 0.52.0", "windows_i686_gnu 0.52.4",
"windows_i686_msvc 0.52.0", "windows_i686_msvc 0.52.4",
"windows_x86_64_gnu 0.52.0", "windows_x86_64_gnu 0.52.4",
"windows_x86_64_gnullvm 0.52.0", "windows_x86_64_gnullvm 0.52.4",
"windows_x86_64_msvc 0.52.0", "windows_x86_64_msvc 0.52.4",
] ]
[[package]] [[package]]
@ -2544,9 +2541,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]] [[package]]
name = "windows_aarch64_gnullvm" name = "windows_aarch64_gnullvm"
version = "0.52.0" version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9"
[[package]] [[package]]
name = "windows_aarch64_msvc" name = "windows_aarch64_msvc"
@ -2562,9 +2559,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]] [[package]]
name = "windows_aarch64_msvc" name = "windows_aarch64_msvc"
version = "0.52.0" version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675"
[[package]] [[package]]
name = "windows_i686_gnu" name = "windows_i686_gnu"
@ -2580,9 +2577,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]] [[package]]
name = "windows_i686_gnu" name = "windows_i686_gnu"
version = "0.52.0" version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3"
[[package]] [[package]]
name = "windows_i686_msvc" name = "windows_i686_msvc"
@ -2598,9 +2595,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]] [[package]]
name = "windows_i686_msvc" name = "windows_i686_msvc"
version = "0.52.0" version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02"
[[package]] [[package]]
name = "windows_x86_64_gnu" name = "windows_x86_64_gnu"
@ -2616,9 +2613,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]] [[package]]
name = "windows_x86_64_gnu" name = "windows_x86_64_gnu"
version = "0.52.0" version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03"
[[package]] [[package]]
name = "windows_x86_64_gnullvm" name = "windows_x86_64_gnullvm"
@ -2634,9 +2631,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]] [[package]]
name = "windows_x86_64_gnullvm" name = "windows_x86_64_gnullvm"
version = "0.52.0" version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177"
[[package]] [[package]]
name = "windows_x86_64_msvc" name = "windows_x86_64_msvc"
@ -2652,15 +2649,15 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]] [[package]]
name = "windows_x86_64_msvc" name = "windows_x86_64_msvc"
version = "0.52.0" version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8"
[[package]] [[package]]
name = "winnow" name = "winnow"
version = "0.6.1" version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d90f4e0f530c4c69f62b80d839e9ef3855edc9cba471a160c4d692deed62b401" checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]
@ -2869,7 +2866,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.49", "syn 2.0.52",
] ]
[[package]] [[package]]

View File

@ -153,7 +153,7 @@ footer = { fg = "black", bg = "white" }
[notify] [notify]
title_info = { fg = "green" } title_info = { fg = "green" }
title_warn = { bg = "yellow" } title_warn = { fg = "yellow" }
title_error = { fg = "red" } title_error = { fg = "red" }
# Icons # Icons

View File

@ -1,4 +1,4 @@
use std::path::{PathBuf, MAIN_SEPARATOR}; use std::path::PathBuf;
use tokio::fs; use tokio::fs;
use yazi_config::popup::InputCfg; use yazi_config::popup::InputCfg;

View File

@ -98,28 +98,25 @@ impl Tab {
} }
pub fn try_escape_visual(&mut self) -> bool { pub fn try_escape_visual(&mut self) -> bool {
let state = self.mode.is_select(); let select = self.mode.is_select();
let Some((_, indices)) = self.mode.take_visual() else { let Some((_, indices)) = self.mode.take_visual() else {
return true; return true;
}; };
let mut success = true; render!();
for f in indices.iter().filter_map(|i| self.current.files.get(*i)) { let urls: Vec<_> =
if state { indices.into_iter().filter_map(|i| self.current.files.get(i)).map(|f| &f.url).collect();
success &= self.selected.add(&f.url);
} else {
self.selected.remove(&f.url);
}
}
if !success { if !select {
self.selected.remove_many(&urls);
} else if self.selected.add_many(&urls) != urls.len() {
Notify::_push_warn( Notify::_push_warn(
"Escape visual mode", "Escape visual mode",
"Some files cannot be selected, due to path nesting conflict.", "Some files cannot be selected, due to path nesting conflict.",
); );
return false;
} }
render!(); true
success
} }
} }

View File

@ -1,8 +1,8 @@
use std::borrow::Cow; use std::borrow::Cow;
use yazi_shared::{event::Cmd, fs::Url, render}; use yazi_shared::{event::Cmd, fs::Url, render, render_and};
use crate::tab::Tab; use crate::{notify::Notify, tab::Tab};
pub struct Opt<'a> { pub struct Opt<'a> {
url: Option<Cow<'a, Url>>, url: Option<Cow<'a, Url>>,
@ -30,10 +30,17 @@ impl<'a> Tab {
return; return;
}; };
render!(match opt.state { let b = match opt.state {
Some(true) => self.selected.add(&url), Some(true) => render_and!(self.selected.add(&url)),
Some(false) => self.selected.remove(&url), Some(false) => render_and!(self.selected.remove(&url)) | true,
None => self.selected.remove(&url) || self.selected.add(&url), None => render_and!(self.selected.remove(&url) || self.selected.add(&url)),
}); };
if !b {
Notify::_push_warn(
"Select one",
"This file cannot be selected, due to path nesting conflict.",
);
}
} }
} }

View File

@ -1,6 +1,6 @@
use yazi_shared::{event::Cmd, render}; use yazi_shared::{event::Cmd, render};
use crate::tab::Tab; use crate::{notify::Notify, tab::Tab};
pub struct Opt { pub struct Opt {
state: Option<bool>, state: Option<bool>,
@ -23,24 +23,22 @@ impl From<Option<bool>> for Opt {
impl Tab { impl Tab {
pub fn select_all(&mut self, opt: impl Into<Opt>) { pub fn select_all(&mut self, opt: impl Into<Opt>) {
let mut b = false; let iter = self.current.files.iter().map(|f| &f.url);
match opt.into().state { let (removal, addition): (Vec<_>, Vec<_>) = match opt.into().state {
Some(true) => { Some(true) => (vec![], iter.collect()),
for f in self.current.files.iter() { Some(false) => (iter.collect(), vec![]),
b |= self.selected.add(&f.url); None => iter.partition(|&u| self.selected.contains(u)),
};
render!(self.selected.remove_many(&removal) > 0);
let added = self.selected.add_many(&addition);
render!(added > 0);
if added != addition.len() {
Notify::_push_warn(
"Select all",
"Some files cannot be selected, due to path nesting conflict.",
);
} }
} }
Some(false) => {
for f in self.current.files.iter() {
b |= self.selected.remove(&f.url);
}
}
None => {
for f in self.current.files.iter() {
b |= self.selected.remove(&f.url) || self.selected.add(&f.url);
}
}
}
render!(b);
}
} }

View File

@ -15,7 +15,8 @@ impl Deref for Selected {
} }
impl Selected { impl Selected {
pub fn add(&mut self, url: &Url) -> bool { self.add_many(&[url]) } #[inline]
pub fn add(&mut self, url: &Url) -> bool { self.add_many(&[url]) == 1 }
/// Adds a list of URLs to the user structure. /// Adds a list of URLs to the user structure.
/// ///
@ -40,10 +41,8 @@ impl Selected {
/// ///
/// # Returns /// # Returns
/// ///
/// Returns `true` if all URLs were successfully added, or if the input list /// Return the number of URLs that did not conflict,
/// is empty. Returns `false` if any URL could not be added due to the /// even if they were already present in the structure and were not added.
/// existence of its parent directory in the structure, or if the URL itself
/// is already present.
/// ///
/// # Examples /// # Examples
/// ///
@ -54,51 +53,57 @@ impl Selected {
/// ///
/// let url1 = Url::from("/a/b/c"); /// let url1 = Url::from("/a/b/c");
/// let url2 = Url::from("/a/b/d"); /// let url2 = Url::from("/a/b/d");
/// assert!(s.add_many(&[&url1, &url2])); /// assert_eq!(2, s.add_many(&[&url1, &url2]));
/// ``` /// ```
pub fn add_many(&mut self, urls: &[&Url]) -> bool { pub fn add_many(&mut self, urls: &[&Url]) -> usize {
// If it has appeared as a parent
let urls: Vec<_> = urls.iter().filter(|&&u| !self.parents.contains_key(u)).collect();
if urls.is_empty() { if urls.is_empty() {
return true; return 0;
} else if self.parents.contains_key(urls[0]) {
return false;
} }
// If it has appeared as a child
let mut parent = urls[0].parent_url(); let mut parent = urls[0].parent_url();
let mut parents = vec![]; let mut parents = vec![];
while let Some(u) = parent { while let Some(u) = parent {
if self.inner.contains(&u) { if self.inner.contains(&u) {
return false; return 0;
} }
parent = u.parent_url(); parent = u.parent_url();
parents.push(u); parents.push(u);
} }
let len = self.inner.len();
self.inner.extend(urls.iter().map(|&&u| u.clone()));
for u in parents { for u in parents {
*self.parents.entry(u).or_insert(0) += urls.len(); *self.parents.entry(u).or_insert(0) += self.inner.len() - len;
}
urls.len()
} }
self.inner.extend(urls.iter().map(|&u| u.clone())); #[inline]
true pub fn remove(&mut self, url: &Url) -> bool { self.remove_many(&[url]) == 1 }
pub fn remove_many(&mut self, urls: &[&Url]) -> usize {
let count = urls.iter().map(|&u| self.inner.remove(u)).filter(|&b| b).count();
if count == 0 {
return 0;
} }
pub fn remove(&mut self, url: &Url) -> bool { let mut parent = urls[0].parent_url();
if !self.inner.remove(url) {
return false;
}
let mut parent = url.parent_url();
while let Some(u) = parent { while let Some(u) = parent {
let n = self.parents.get_mut(&u).unwrap(); let n = self.parents.get_mut(&u).unwrap();
if *n == 1 {
*n -= count;
if *n == 0 {
self.parents.remove(&u); self.parents.remove(&u);
} else {
*n -= 1;
} }
parent = u.parent_url(); parent = u.parent_url();
} }
true count
} }
pub fn clear(&mut self) { pub fn clear(&mut self) {
@ -153,11 +158,14 @@ mod tests {
fn insert_many_success() { fn insert_many_success() {
let mut s = Selected::default(); let mut s = Selected::default();
assert!(s.add_many(&[ assert_eq!(
3,
s.add_many(&[
&Url::from("/parent/child1"), &Url::from("/parent/child1"),
&Url::from("/parent/child2"), &Url::from("/parent/child2"),
&Url::from("/parent/child3") &Url::from("/parent/child3")
])); ])
);
} }
#[test] #[test]
@ -165,7 +173,7 @@ mod tests {
let mut s = Selected::default(); let mut s = Selected::default();
s.add(&Url::from("/parent")); s.add(&Url::from("/parent"));
assert!(!s.add_many(&[&Url::from("/parent/child1"), &Url::from("/parent/child2"),])); assert_eq!(0, s.add_many(&[&Url::from("/parent/child1"), &Url::from("/parent/child2")]));
} }
#[test] #[test]
@ -173,14 +181,14 @@ mod tests {
let mut s = Selected::default(); let mut s = Selected::default();
s.add(&Url::from("/parent/child1")); s.add(&Url::from("/parent/child1"));
assert!(s.add_many(&[&Url::from("/parent/child1"), &Url::from("/parent/child2")])); assert_eq!(2, s.add_many(&[&Url::from("/parent/child1"), &Url::from("/parent/child2")]));
} }
#[test] #[test]
fn insert_many_empty_urls_list() { fn insert_many_empty_urls_list() {
let mut s = Selected::default(); let mut s = Selected::default();
assert!(s.add_many(&[])); assert_eq!(0, s.add_many(&[]));
} }
#[test] #[test]
@ -188,14 +196,17 @@ mod tests {
let mut s = Selected::default(); let mut s = Selected::default();
s.add(&Url::from("/parent/child")); s.add(&Url::from("/parent/child"));
assert!(!s.add_many(&[&Url::from("/parent/child/child1"), &Url::from("/parent/child/child2")])); assert_eq!(
0,
s.add_many(&[&Url::from("/parent/child/child1"), &Url::from("/parent/child/child2")])
);
} }
#[test] #[test]
fn insert_many_with_direct_parent_fails() { fn insert_many_with_direct_parent_fails() {
let mut s = Selected::default(); let mut s = Selected::default();
s.add(&Url::from("/a")); s.add(&Url::from("/a"));
assert!(!s.add_many(&[&Url::from("/a/b")])); assert_eq!(0, s.add_many(&[&Url::from("/a/b")]));
} }
#[test] #[test]
@ -203,14 +214,15 @@ mod tests {
let mut s = Selected::default(); let mut s = Selected::default();
s.add(&Url::from("/a/b")); s.add(&Url::from("/a/b"));
assert!(!s.add_many(&[&Url::from("/a")])); assert_eq!(0, s.add_many(&[&Url::from("/a")]));
assert_eq!(1, s.add_many(&[&Url::from("/b"), &Url::from("/a")]));
} }
#[test] #[test]
fn insert_many_sibling_directories_success() { fn insert_many_sibling_directories_success() {
let mut s = Selected::default(); let mut s = Selected::default();
assert!(s.add_many(&[&Url::from("/a/b"), &Url::from("/a/c")])); assert_eq!(2, s.add_many(&[&Url::from("/a/b"), &Url::from("/a/c")]));
} }
#[test] #[test]
@ -218,7 +230,7 @@ mod tests {
let mut s = Selected::default(); let mut s = Selected::default();
s.add(&Url::from("/a/b")); s.add(&Url::from("/a/b"));
assert!(!s.add_many(&[&Url::from("/a/b/c")])); assert_eq!(0, s.add_many(&[&Url::from("/a/b/c")]));
} }
#[test] #[test]
@ -228,7 +240,7 @@ mod tests {
let child1 = Url::from("/parent/child1"); let child1 = Url::from("/parent/child1");
let child2 = Url::from("/parent/child2"); let child2 = Url::from("/parent/child2");
let child3 = Url::from("/parent/child3"); let child3 = Url::from("/parent/child3");
assert!(s.add_many(&[&child1, &child2, &child3])); assert_eq!(3, s.add_many(&[&child1, &child2, &child3]));
assert!(s.remove(&child1)); assert!(s.remove(&child1));
assert_eq!(s.inner.len(), 2); assert_eq!(s.inner.len(), 2);

View File

@ -4,7 +4,7 @@ use mlua::{Scope, Table};
use tracing::error; use tracing::error;
use yazi_config::LAYOUT; use yazi_config::LAYOUT;
use yazi_plugin::{elements::RectRef, LUA}; use yazi_plugin::{elements::RectRef, LUA};
use yazi_shared::RoCell; use yazi_shared::{Defer, RoCell};
use crate::Ctx; use crate::Ctx;
@ -34,6 +34,7 @@ impl Lives {
f: impl FnOnce(&Scope<'a, 'a>) -> mlua::Result<T>, f: impl FnOnce(&Scope<'a, 'a>) -> mlua::Result<T>,
) -> mlua::Result<T> { ) -> mlua::Result<T> {
let result = LUA.scope(|scope| { let result = LUA.scope(|scope| {
let _defer = Defer::new(|| SCOPE.drop());
SCOPE.init(unsafe { mem::transmute(scope) }); SCOPE.init(unsafe { mem::transmute(scope) });
LUA.set_named_registry_value("cx", scope.create_any_userdata_ref(cx)?)?; LUA.set_named_registry_value("cx", scope.create_any_userdata_ref(cx)?)?;
@ -58,7 +59,6 @@ impl Lives {
status: *globals.raw_get::<_, Table>("Status")?.raw_get::<_, RectRef>("area")?, status: *globals.raw_get::<_, Table>("Status")?.raw_get::<_, RectRef>("area")?,
})); }));
SCOPE.drop();
Ok(ret) Ok(ret)
}); });