diff --git a/Cargo.lock b/Cargo.lock index a61f5cae..d800175d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" +checksum = "8b79b82693f705137f8fb9b37871d99e4f9a7df12b917eed79c3d3954830a60b" dependencies = [ "cfg-if", "once_cell", @@ -72,9 +72,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.12" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" dependencies = [ "anstyle", "anstyle-parse", @@ -120,9 +120,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" [[package]] name = "arc-swap" @@ -214,9 +214,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.9.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" +checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" dependencies = [ "memchr", "serde", @@ -224,9 +224,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.0" +version = "3.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a994c2b3ca201d9b263612a374263f05e7adde37c4707f693dcd375076d1f" +checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" [[package]] name = "bytemuck" @@ -263,12 +263,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "02f341c093d19155a6e41631ce5971aac4e9a868262212153124c15fa22d1cdc" [[package]] name = "cfg-if" @@ -285,7 +282,7 @@ dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -348,7 +345,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.52", ] [[package]] @@ -431,9 +428,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" dependencies = [ "crossbeam-utils", ] @@ -565,9 +562,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erased-serde" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55d05712b2d8d88102bc9868020c9e5c7a1f5527c452b9b97450a1d006140ba7" +checksum = "388979d208a049ffdfb22fa33b9c81942215b940910bccfe258caeb25d125cb3" dependencies = [ "serde", ] @@ -749,7 +746,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.52", ] [[package]] @@ -805,9 +802,9 @@ dependencies = [ [[package]] name = "gif" -version = "0.12.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" dependencies = [ "color_quant", "weezl", @@ -827,9 +824,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "half" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" +checksum = "b5eceaaeec696539ddaf7b333340f1af35a5aa87ae3e4f3ead0532f72affab2e" dependencies = [ "cfg-if", "crunchy", @@ -853,9 +850,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "home" @@ -917,9 +914,9 @@ checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" [[package]] name = "image" -version = "0.24.8" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" dependencies = [ "bytemuck", "byteorder", @@ -941,9 +938,9 @@ checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" [[package]] name = "indexmap" -version = "2.2.3" +version = "2.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" dependencies = [ "equivalent", "hashbrown", @@ -1093,15 +1090,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "lru" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2c024b41519440580066ba82aab04092b333e09066a5eb86c7c4890df31f22" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" dependencies = [ "hashbrown", ] @@ -1180,9 +1177,9 @@ dependencies = [ [[package]] name = "mlua" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3561f79659ff3afad7b25e2bf2ec21507fe601ebecb7f81088669ec4bfd51e" +checksum = "868d02cb5eb97761bbf6bd6922c1c7a88b8ea252bbf43bd8350a0bf8497a1fc0" dependencies = [ "bstr", "erased-serde", @@ -1221,7 +1218,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.49", + "syn 2.0.52", ] [[package]] @@ -1444,9 +1441,9 @@ dependencies = [ [[package]] name = "png" -version = "0.17.12" +version = "0.17.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c2378060fb13acff3ba0325b83442c1d2c44fbb76df481160ddc1687cce160" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -1543,9 +1540,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" dependencies = [ "either", "rayon-core", @@ -1643,9 +1640,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "safemem" @@ -1670,9 +1667,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] @@ -1689,20 +1686,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.52", ] [[package]] name = "serde_json" -version = "1.0.113" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -1804,12 +1801,12 @@ checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -1868,7 +1865,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.49", + "syn 2.0.52", ] [[package]] @@ -1884,9 +1881,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.49" +version = "2.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" dependencies = [ "proc-macro2", "quote", @@ -1931,14 +1928,14 @@ checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.52", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", @@ -2050,7 +2047,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.52", ] [[package]] @@ -2143,7 +2140,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.52", ] [[package]] @@ -2217,9 +2214,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] @@ -2366,7 +2363,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.52", "wasm-bindgen-shared", ] @@ -2388,7 +2385,7 @@ checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.52", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2464,7 +2461,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -2482,7 +2479,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -2517,17 +2514,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -2544,9 +2541,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" [[package]] name = "windows_aarch64_msvc" @@ -2562,9 +2559,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" [[package]] name = "windows_i686_gnu" @@ -2580,9 +2577,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" [[package]] name = "windows_i686_msvc" @@ -2598,9 +2595,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" [[package]] name = "windows_x86_64_gnu" @@ -2616,9 +2613,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" [[package]] name = "windows_x86_64_gnullvm" @@ -2634,9 +2631,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" [[package]] name = "windows_x86_64_msvc" @@ -2652,15 +2649,15 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "winnow" -version = "0.6.1" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d90f4e0f530c4c69f62b80d839e9ef3855edc9cba471a160c4d692deed62b401" +checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" dependencies = [ "memchr", ] @@ -2869,7 +2866,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.52", ] [[package]] diff --git a/yazi-config/preset/theme.toml b/yazi-config/preset/theme.toml index 707d7876..1a97c8bd 100644 --- a/yazi-config/preset/theme.toml +++ b/yazi-config/preset/theme.toml @@ -153,7 +153,7 @@ footer = { fg = "black", bg = "white" } [notify] title_info = { fg = "green" } -title_warn = { bg = "yellow" } +title_warn = { fg = "yellow" } title_error = { fg = "red" } # Icons diff --git a/yazi-core/src/manager/commands/create.rs b/yazi-core/src/manager/commands/create.rs index ba04c443..c4629302 100644 --- a/yazi-core/src/manager/commands/create.rs +++ b/yazi-core/src/manager/commands/create.rs @@ -1,4 +1,4 @@ -use std::path::{PathBuf, MAIN_SEPARATOR}; +use std::path::PathBuf; use tokio::fs; use yazi_config::popup::InputCfg; diff --git a/yazi-core/src/tab/commands/escape.rs b/yazi-core/src/tab/commands/escape.rs index ac7b4361..df142452 100644 --- a/yazi-core/src/tab/commands/escape.rs +++ b/yazi-core/src/tab/commands/escape.rs @@ -98,28 +98,25 @@ impl Tab { } 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 { return true; }; - let mut success = true; - for f in indices.iter().filter_map(|i| self.current.files.get(*i)) { - if state { - success &= self.selected.add(&f.url); - } else { - self.selected.remove(&f.url); - } - } + render!(); + let urls: Vec<_> = + indices.into_iter().filter_map(|i| self.current.files.get(i)).map(|f| &f.url).collect(); - if !success { + if !select { + self.selected.remove_many(&urls); + } else if self.selected.add_many(&urls) != urls.len() { Notify::_push_warn( "Escape visual mode", "Some files cannot be selected, due to path nesting conflict.", ); + return false; } - render!(); - success + true } } diff --git a/yazi-core/src/tab/commands/select.rs b/yazi-core/src/tab/commands/select.rs index 6ddfd0ec..7f35c385 100644 --- a/yazi-core/src/tab/commands/select.rs +++ b/yazi-core/src/tab/commands/select.rs @@ -1,8 +1,8 @@ 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> { url: Option>, @@ -30,10 +30,17 @@ impl<'a> Tab { return; }; - render!(match opt.state { - Some(true) => self.selected.add(&url), - Some(false) => self.selected.remove(&url), - None => self.selected.remove(&url) || self.selected.add(&url), - }); + let b = match opt.state { + Some(true) => render_and!(self.selected.add(&url)), + Some(false) => render_and!(self.selected.remove(&url)) | true, + 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.", + ); + } } } diff --git a/yazi-core/src/tab/commands/select_all.rs b/yazi-core/src/tab/commands/select_all.rs index d225ab23..606d03ae 100644 --- a/yazi-core/src/tab/commands/select_all.rs +++ b/yazi-core/src/tab/commands/select_all.rs @@ -1,6 +1,6 @@ use yazi_shared::{event::Cmd, render}; -use crate::tab::Tab; +use crate::{notify::Notify, tab::Tab}; pub struct Opt { state: Option, @@ -23,24 +23,22 @@ impl From> for Opt { impl Tab { pub fn select_all(&mut self, opt: impl Into) { - let mut b = false; - match opt.into().state { - Some(true) => { - for f in self.current.files.iter() { - b |= self.selected.add(&f.url); - } - } - 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); - } - } + let iter = self.current.files.iter().map(|f| &f.url); + let (removal, addition): (Vec<_>, Vec<_>) = match opt.into().state { + Some(true) => (vec![], iter.collect()), + Some(false) => (iter.collect(), vec![]), + 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.", + ); } - render!(b); } } diff --git a/yazi-core/src/tab/selected.rs b/yazi-core/src/tab/selected.rs index cbb8e842..5dbfcbcc 100644 --- a/yazi-core/src/tab/selected.rs +++ b/yazi-core/src/tab/selected.rs @@ -15,7 +15,8 @@ impl Deref for 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. /// @@ -40,10 +41,8 @@ impl Selected { /// /// # Returns /// - /// Returns `true` if all URLs were successfully added, or if the input list - /// is empty. Returns `false` if any URL could not be added due to the - /// existence of its parent directory in the structure, or if the URL itself - /// is already present. + /// Return the number of URLs that did not conflict, + /// even if they were already present in the structure and were not added. /// /// # Examples /// @@ -54,51 +53,57 @@ impl Selected { /// /// let url1 = Url::from("/a/b/c"); /// 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() { - return true; - } else if self.parents.contains_key(urls[0]) { - return false; + return 0; } + // If it has appeared as a child let mut parent = urls[0].parent_url(); let mut parents = vec![]; while let Some(u) = parent { if self.inner.contains(&u) { - return false; + return 0; } parent = u.parent_url(); parents.push(u); } - for u in parents { - *self.parents.entry(u).or_insert(0) += urls.len(); - } + let len = self.inner.len(); + self.inner.extend(urls.iter().map(|&&u| u.clone())); - self.inner.extend(urls.iter().map(|&u| u.clone())); - true + for u in parents { + *self.parents.entry(u).or_insert(0) += self.inner.len() - len; + } + urls.len() } - pub fn remove(&mut self, url: &Url) -> bool { - if !self.inner.remove(url) { - return false; + #[inline] + 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; } - let mut parent = url.parent_url(); + let mut parent = urls[0].parent_url(); while let Some(u) = parent { let n = self.parents.get_mut(&u).unwrap(); - if *n == 1 { + + *n -= count; + if *n == 0 { self.parents.remove(&u); - } else { - *n -= 1; } parent = u.parent_url(); } - true + count } pub fn clear(&mut self) { @@ -153,11 +158,14 @@ mod tests { fn insert_many_success() { let mut s = Selected::default(); - assert!(s.add_many(&[ - &Url::from("/parent/child1"), - &Url::from("/parent/child2"), - &Url::from("/parent/child3") - ])); + assert_eq!( + 3, + s.add_many(&[ + &Url::from("/parent/child1"), + &Url::from("/parent/child2"), + &Url::from("/parent/child3") + ]) + ); } #[test] @@ -165,7 +173,7 @@ mod tests { let mut s = Selected::default(); 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] @@ -173,14 +181,14 @@ mod tests { let mut s = Selected::default(); 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] fn insert_many_empty_urls_list() { let mut s = Selected::default(); - assert!(s.add_many(&[])); + assert_eq!(0, s.add_many(&[])); } #[test] @@ -188,14 +196,17 @@ mod tests { let mut s = Selected::default(); 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] fn insert_many_with_direct_parent_fails() { let mut s = Selected::default(); s.add(&Url::from("/a")); - assert!(!s.add_many(&[&Url::from("/a/b")])); + assert_eq!(0, s.add_many(&[&Url::from("/a/b")])); } #[test] @@ -203,14 +214,15 @@ mod tests { let mut s = Selected::default(); 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] fn insert_many_sibling_directories_success() { 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] @@ -218,7 +230,7 @@ mod tests { let mut s = Selected::default(); 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] @@ -228,7 +240,7 @@ mod tests { let child1 = Url::from("/parent/child1"); let child2 = Url::from("/parent/child2"); 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_eq!(s.inner.len(), 2); diff --git a/yazi-fm/src/lives/lives.rs b/yazi-fm/src/lives/lives.rs index bb7715d1..3cbc9b5d 100644 --- a/yazi-fm/src/lives/lives.rs +++ b/yazi-fm/src/lives/lives.rs @@ -4,7 +4,7 @@ use mlua::{Scope, Table}; use tracing::error; use yazi_config::LAYOUT; use yazi_plugin::{elements::RectRef, LUA}; -use yazi_shared::RoCell; +use yazi_shared::{Defer, RoCell}; use crate::Ctx; @@ -34,6 +34,7 @@ impl Lives { f: impl FnOnce(&Scope<'a, 'a>) -> mlua::Result, ) -> mlua::Result { let result = LUA.scope(|scope| { + let _defer = Defer::new(|| SCOPE.drop()); SCOPE.init(unsafe { mem::transmute(scope) }); 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")?, })); - SCOPE.drop(); Ok(ret) });