mirror of
https://github.com/kristoferssolo/solorice.git
synced 2025-10-21 20:10:34 +00:00
Update 2025-07-16
This commit is contained in:
parent
1a19d1112b
commit
eb47813a34
@ -92,6 +92,7 @@ depends = [ "torrent", "zathura", "email" ]
|
||||
|
||||
[torrent.files]
|
||||
"config/rustmission.toml" = "~/.config/rustmission/config.toml"
|
||||
"config/traxor/" = "~/.config/traxor/"
|
||||
# "config/transmission-daemon.json" = "~/.config/transmission-daemon/settings.json"
|
||||
|
||||
[awesome.files]
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#? Config file for btop v. 1.4.3
|
||||
#? Config file for btop v. 1.4.4
|
||||
|
||||
#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes.
|
||||
#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes"
|
||||
@ -57,7 +57,7 @@ update_ms = 500
|
||||
|
||||
#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct",
|
||||
#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly.
|
||||
proc_sorting = "cpu direct"
|
||||
proc_sorting = "memory"
|
||||
|
||||
#* Reverse sorting order, True or False.
|
||||
proc_reversed = False
|
||||
@ -150,7 +150,7 @@ background_update = True
|
||||
custom_cpu_name = ""
|
||||
|
||||
#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ".
|
||||
#* Begin line with "exclude=" to change to exclude filter, otherwise defaults to "most include" filter. Example: disks_filter="exclude=/boot /home/user".
|
||||
#* Only disks matching the filter will be shown. Prepend exclude= to only show disks not matching the filter. Examples: disk_filter="/boot /home/user", disks_filter="exclude=/boot /home/user"
|
||||
disks_filter = "exclude=/boot"
|
||||
|
||||
#* Show graphs instead of meters for memory values.
|
||||
|
||||
27
config/traxor/config.toml
Normal file
27
config/traxor/config.toml
Normal file
@ -0,0 +1,27 @@
|
||||
[keybinds]
|
||||
quit = "q"
|
||||
next_tab = "l"
|
||||
prev_tab = "h"
|
||||
next_torrent = "j"
|
||||
prev_torrent = "k"
|
||||
switch_tab_1 = "1"
|
||||
switch_tab_2 = "2"
|
||||
switch_tab_3 = "3"
|
||||
toggle_torrent = "enter"
|
||||
toggle_all = "a"
|
||||
delete = "d"
|
||||
delete_force = "D"
|
||||
select = " "
|
||||
toggle_help = "?"
|
||||
|
||||
[colors]
|
||||
highlight_background = "magenta"
|
||||
highlight_foreground = "black"
|
||||
warning_foreground = "yellow"
|
||||
info_foreground = "blue"
|
||||
error_foreground = "red"
|
||||
|
||||
[log]
|
||||
traxor = "debug"
|
||||
ratatui = "warn"
|
||||
transmission_rpc = "warn"
|
||||
@ -5,57 +5,57 @@ hash = "50da29476e744dba37d77fb209328fd1"
|
||||
|
||||
[[plugin.deps]]
|
||||
use = "dedukun/relative-motions"
|
||||
rev = "2e3b617"
|
||||
hash = "b67ee12053113983273e9118a7d1272b"
|
||||
rev = "a603d9e"
|
||||
hash = "e02a788e5b8ae0fb47fd0193dda589cc"
|
||||
|
||||
[[plugin.deps]]
|
||||
use = "hankertrix/augment-command"
|
||||
rev = "a03a237"
|
||||
hash = "56dfc522998328d0c417226e88da862c"
|
||||
rev = "edc1bcf"
|
||||
hash = "d5874bfb59265c96e8d9d5ef53c9450"
|
||||
|
||||
[[plugin.deps]]
|
||||
use = "kirasok/torrent-preview"
|
||||
rev = "4ca5996"
|
||||
hash = "6af40ce6b2cd849b5fa32de04a598b06"
|
||||
rev = "f465282"
|
||||
hash = "b89b46a15035a51d010a254858ba9741"
|
||||
|
||||
[[plugin.deps]]
|
||||
use = "ndtoan96/ouch"
|
||||
rev = "1ee69a5"
|
||||
hash = "63679f3daf8551ff8755be38b5ced0f"
|
||||
rev = "0742fff"
|
||||
hash = "2bd799b42b8e42b8ef100310be71f8d1"
|
||||
|
||||
[[plugin.deps]]
|
||||
use = "pirafrank/what-size"
|
||||
rev = "0a4904c"
|
||||
hash = "fca231a128488a554823374f8f6d5241"
|
||||
rev = "d896656"
|
||||
hash = "62251f94eb67648d42cdfcfb8be0fad2"
|
||||
|
||||
[[plugin.deps]]
|
||||
use = "yazi-rs/plugins:git"
|
||||
rev = "86d28e4"
|
||||
hash = "e01006bfb38951ea89031bd918b20dbb"
|
||||
rev = "b886025"
|
||||
hash = "63b6c222bf2103b3023389dde5e2ecfe"
|
||||
|
||||
[[plugin.deps]]
|
||||
use = "yazi-rs/plugins:chmod"
|
||||
rev = "86d28e4"
|
||||
hash = "a030fe48d91b04341ad2fba9be957df"
|
||||
rev = "b886025"
|
||||
hash = "1adc12c2b2b025411ab61eb8f0879574"
|
||||
|
||||
[[plugin.deps]]
|
||||
use = "yazi-rs/plugins:full-border"
|
||||
rev = "86d28e4"
|
||||
rev = "b886025"
|
||||
hash = "3996fc74044bc44144b323686f887e1"
|
||||
|
||||
[[plugin.deps]]
|
||||
use = "yazi-rs/plugins:mount"
|
||||
rev = "86d28e4"
|
||||
hash = "b3f1d6ec3721d4061aad5f69cddb0cf9"
|
||||
rev = "b886025"
|
||||
hash = "f10a14e823382d90fab5b3ee54cb38fe"
|
||||
|
||||
[[plugin.deps]]
|
||||
use = "yazi-rs/plugins:smart-filter"
|
||||
rev = "86d28e4"
|
||||
hash = "f660384d7ed12ecd456efed313453310"
|
||||
rev = "b886025"
|
||||
hash = "a9d553bd19a3cd7f4eab3abaac5d67ff"
|
||||
|
||||
[[plugin.deps]]
|
||||
use = "yazi-rs/plugins:diff"
|
||||
rev = "86d28e4"
|
||||
rev = "b886025"
|
||||
hash = "47865a70cade14a0b9b6bc6a54f16bdb"
|
||||
|
||||
[[plugin.deps]]
|
||||
@ -70,8 +70,8 @@ hash = "9c68763dd4f2799f7cfee1e9c3e819a9"
|
||||
|
||||
[[plugin.deps]]
|
||||
use = "boydaihungst/mediainfo"
|
||||
rev = "a7d1aa6"
|
||||
hash = "844133c7247cda086819d63a9ca5e457"
|
||||
rev = "cc12f3f"
|
||||
hash = "b92e44ad5004f1b45e5c3d717a60ed24"
|
||||
|
||||
[[plugin.deps]]
|
||||
use = "iynaix/time-travel"
|
||||
|
||||
@ -94,6 +94,7 @@ ya pkg upgrade
|
||||
| `skip_single_subdirectory_on_leave` | `true` or `false` | `true` | Skip directories when there is only one subdirectory and no other files when leaving directories. This behaviour can be turned off by passing the `--no-skip` flag to the `leave` command. |
|
||||
| `smooth_scrolling` | `true` or `false` | `false` | Self-explanatory, this option enables smooth scrolling. |
|
||||
| `scroll_delay` | A floating point number, like `0.02`, `0.05`, `0.1`, etc. | `0.02` | The delay, in seconds, between each call of the `arrow` command to scroll through the file list. The smaller the `scroll_delay`, the faster the file list is scrolled. Avoid setting a `scroll_delay` that is more than `1` second. This is due to the plugin being asynchronous, which will result in the plugin continuing to call the `arrow` command even when the directory has changed, or when you are in a different application that doesn't block Yazi, resulting in unexpected behaviour. |
|
||||
| `create_item_delay` | A floating point number, like `0.25`, `0.1`, `1e-2`, etc. | `0.25` | The delay, in seconds, before calling the `reveal` command to reveal the created item. This delay is mainly to ensure a smooth experience using the plugin's `archive` and `create` commands, as the `reveal` command will create a dummy file that doesn't exist and reveal that before jumping to the created item. This delay is dependent on how fast your file system is. For the `Ext4` file system, it seems that a delay of `0.1` seconds is ideal, while a delay of `0.25` seconds for the `Btrfs` file system seems to be appropriate. |
|
||||
| `wraparound_file_navigation` | `true` or `false` | `true` | Wrap around from the bottom to the top or from the top to the bottom when using the `arrow` or `parent_arrow` command to navigate. |
|
||||
|
||||
If you would like to use the default configuration, which is shown below,
|
||||
@ -130,6 +131,7 @@ require("augment-command"):setup({
|
||||
skip_single_subdirectory_on_leave = true,
|
||||
smooth_scrolling = false,
|
||||
scroll_delay = 0.02,
|
||||
create_item_delay = 0.25,
|
||||
wraparound_file_navigation = true,
|
||||
})
|
||||
```
|
||||
@ -155,6 +157,7 @@ require("augment-command"):setup({
|
||||
extract_retries = 5,
|
||||
encrypt_archives = true,
|
||||
smooth_scrolling = true,
|
||||
create_item_delay = 0.1,
|
||||
wraparound_file_navigation = false,
|
||||
})
|
||||
```
|
||||
@ -1438,123 +1441,123 @@ You can view the full licence in the [`LICENSE`][Licence] file.
|
||||
|
||||
<!-- Open command -->
|
||||
|
||||
[open-prompt-video]: https://github.com/user-attachments/assets/a792f9d9-97f3-4fab-95cc-03b33c58dd47
|
||||
[open-behaviour-video]: https://github.com/user-attachments/assets/b2e56c10-91cd-4556-9f64-355aa8948832
|
||||
[open-auto-extract-archives-video]: https://github.com/user-attachments/assets/a406391a-b31d-4b45-afa1-b982ddd89eaf
|
||||
[open-recursively-extract-archives-video]: https://github.com/user-attachments/assets/a960f152-4391-4d55-bd0e-0a08efb42729
|
||||
[open-prompt-video]: https://github.com/user-attachments/assets/1d483b04-a74d-42d2-a94d-2e7b4923d62d
|
||||
[open-behaviour-video]: https://github.com/user-attachments/assets/78a02383-52ee-4268-9d8a-24790d15fb9e
|
||||
[open-auto-extract-archives-video]: https://github.com/user-attachments/assets/e720fef7-da81-455b-8c82-b338577a0aa2
|
||||
[open-recursively-extract-archives-video]: https://github.com/user-attachments/assets/614b4358-0c56-41de-a97c-c514693e0da1
|
||||
|
||||
<!-- Extract command -->
|
||||
|
||||
[extract-must-have-hovered-item-video]: https://github.com/user-attachments/assets/ed310a81-c482-4eed-9d54-5f50a7cc7637
|
||||
[extract-hovered-item-optional-video]: https://github.com/user-attachments/assets/85d5a6bf-ed35-4f9a-b782-faea119da7c5
|
||||
[extract-prompt-video]: https://github.com/user-attachments/assets/40f41727-7e55-44d8-816c-e706d09e27b8
|
||||
[extract-behaviour-video]: https://github.com/user-attachments/assets/6f4f68d4-d43c-4de6-8d85-7e22c0cc0cc6
|
||||
[extract-recursively-extract-archives-video]: https://github.com/user-attachments/assets/d9e7030c-9491-4dfa-a1f4-baf3a45eed64
|
||||
[extract-encrypted-archive-video]: https://github.com/user-attachments/assets/48acd16d-f285-4d58-94c3-b402d7784d94
|
||||
[extract-reveal-extracted-item-video]: https://github.com/user-attachments/assets/96d7fe43-024a-4b1e-b961-9ab9c708db83
|
||||
[extract-remove-extracted-archive-video]: https://github.com/user-attachments/assets/7b700ffc-3ce6-4185-a8b0-8ecfd09c2519
|
||||
[extract-must-have-hovered-item-video]: https://github.com/user-attachments/assets/86014955-9997-47e2-82fb-8de938044d31
|
||||
[extract-hovered-item-optional-video]: https://github.com/user-attachments/assets/509597c2-9df6-4199-900d-ad7f092a12b4
|
||||
[extract-prompt-video]: https://github.com/user-attachments/assets/85a85efe-cc25-45d2-9414-aa4935196cb4
|
||||
[extract-behaviour-video]: https://github.com/user-attachments/assets/db06f14e-7e9e-47a0-a6b3-a22f468be24d
|
||||
[extract-recursively-extract-archives-video]: https://github.com/user-attachments/assets/cd57721c-4461-42d2-8756-0928ac6bba34
|
||||
[extract-encrypted-archive-video]: https://github.com/user-attachments/assets/98341d53-9218-4817-960c-e0811f5505cd
|
||||
[extract-reveal-extracted-item-video]: https://github.com/user-attachments/assets/4ae1f884-5f12-4133-8757-18a1081be0e4
|
||||
[extract-remove-extracted-archive-video]: https://github.com/user-attachments/assets/2dd8467f-68a4-4560-b45e-4d2e2c635016
|
||||
|
||||
<!-- Enter command -->
|
||||
|
||||
[smart-enter-video]: https://github.com/user-attachments/assets/9fc60a42-8692-4ac8-8250-652958582b98
|
||||
[enter-skip-single-subdirectory-video]: https://github.com/user-attachments/assets/8069e828-d2dd-4c69-a0b8-fe13074de715
|
||||
[smart-enter-video]: https://github.com/user-attachments/assets/63f11df6-46a7-416a-bb11-fe72ce094a95
|
||||
[enter-skip-single-subdirectory-video]: https://github.com/user-attachments/assets/33b3a3de-bb42-4bbd-ac61-b292fb2d6f6a
|
||||
|
||||
<!-- Leave command -->
|
||||
|
||||
[leave-skip-single-subdirectory-video]: https://github.com/user-attachments/assets/01330321-b9f9-4dad-b339-8923509e759c
|
||||
[leave-skip-single-subdirectory-video]: https://github.com/user-attachments/assets/b842328f-9d5d-4ddb-b21d-88903f59858e
|
||||
|
||||
<!-- Rename command -->
|
||||
|
||||
[rename-must-have-hovered-item-video]: https://github.com/user-attachments/assets/b6ec96f9-c8a2-490c-9003-8c361e83e336
|
||||
[rename-hovered-item-optional-video]: https://github.com/user-attachments/assets/8bf0001d-6d39-4c4f-a364-b399e65208e8
|
||||
[rename-prompt-video]: https://github.com/user-attachments/assets/a3926488-f127-4d35-b9ab-7943f01abcb3
|
||||
[rename-behaviour-video]: https://github.com/user-attachments/assets/e3d65d76-34d5-45a4-918d-0b28e662840a
|
||||
[rename-must-have-hovered-item-video]: https://github.com/user-attachments/assets/afe0c9c6-9b0b-4077-8f0a-76feb33c5824
|
||||
[rename-hovered-item-optional-video]: https://github.com/user-attachments/assets/62cb647b-0519-4d1d-8d99-55b2c8eb6258
|
||||
[rename-prompt-video]: https://github.com/user-attachments/assets/48bf39cc-72db-4648-91d8-9c612fb144f7
|
||||
[rename-behaviour-video]: https://github.com/user-attachments/assets/4276eebb-87ae-4442-a0e8-01ef32f52137
|
||||
|
||||
<!-- Remove command -->
|
||||
|
||||
[remove-must-have-hovered-item-video]: https://github.com/user-attachments/assets/3366c9fa-1a4c-4c3c-a37d-70814d23828d
|
||||
[remove-hovered-item-optional-video]: https://github.com/user-attachments/assets/01a3fc57-cc90-47f5-b744-d3eed00ac237
|
||||
[remove-prompt-video]: https://github.com/user-attachments/assets/18940b9f-4f04-4ab3-a6a9-b35ee8084bd8
|
||||
[remove-behaviour-video]: https://github.com/user-attachments/assets/e524ecdb-f94b-4e6e-b5b2-967470ac3f87
|
||||
[remove-must-have-hovered-item-video]: https://github.com/user-attachments/assets/62422c9e-d81b-4789-8cf4-08178a7c2a0a
|
||||
[remove-hovered-item-optional-video]: https://github.com/user-attachments/assets/079a0ad4-f496-4d41-9374-d1cd13bd5aa7
|
||||
[remove-prompt-video]: https://github.com/user-attachments/assets/1dfffc05-99b8-4b1d-8a3e-b895e315b947
|
||||
[remove-behaviour-video]: https://github.com/user-attachments/assets/0aa35c6d-9897-45ed-8d60-fff4a9d1cb80
|
||||
|
||||
<!-- Copy command -->
|
||||
|
||||
[copy-must-have-hovered-item-video]: https://github.com/user-attachments/assets/d4ffa133-16d3-44f7-923d-bdd743fa4a77
|
||||
[copy-hovered-item-optional-video]: https://github.com/user-attachments/assets/d2a7f5cd-ab09-45fd-8865-068bb1c269f8
|
||||
[copy-prompt-video]: https://github.com/user-attachments/assets/41d372c5-2992-410c-97ae-aca2c6fea4ee
|
||||
[copy-behaviour-video]: https://github.com/user-attachments/assets/57658664-1a89-46c4-bb4b-3551b0061436
|
||||
[copy-must-have-hovered-item-video]: https://github.com/user-attachments/assets/ebbfa383-1771-4515-a30b-5f97142be249
|
||||
[copy-hovered-item-optional-video]: https://github.com/user-attachments/assets/44f62540-3778-42f2-bd1e-5b90e356198c
|
||||
[copy-prompt-video]: https://github.com/user-attachments/assets/2cd1421f-991f-4c66-85e5-283b541f7ff6
|
||||
[copy-behaviour-video]: https://github.com/user-attachments/assets/abf9e1a9-969f-4ac2-8e72-088b770ae902
|
||||
|
||||
<!-- Create command -->
|
||||
|
||||
[create-and-enter-directories-video]: https://github.com/user-attachments/assets/b27756db-f6ed-4598-b54f-214b7ccbe208
|
||||
[create-and-open-files-video]: https://github.com/user-attachments/assets/b7ff1e6c-4c70-4598-a5f6-a88e1559f5d9
|
||||
[create-and-open-files-and-directories-video]: https://github.com/user-attachments/assets/90dc6dd2-c39d-4ed5-a8b1-e17a18f0219f
|
||||
[create-behaviour-video]: https://github.com/user-attachments/assets/44bdc556-cde7-4ab9-b3c0-05c4f1fa3120
|
||||
[create-default-behaviour-video]: https://github.com/user-attachments/assets/4948fd32-27a9-4546-83f9-ad6fa9c6afa8
|
||||
[create-and-enter-directories-video]: https://github.com/user-attachments/assets/8355ebe5-9870-4dd8-b40b-3048c7636dc2
|
||||
[create-and-open-files-video]: https://github.com/user-attachments/assets/5ca0833b-f112-4469-a382-4e64c432731b
|
||||
[create-and-open-files-and-directories-video]: https://github.com/user-attachments/assets/4739a197-4b7e-461b-b257-1d6aa070bcd5
|
||||
[create-behaviour-video]: https://github.com/user-attachments/assets/158a429b-b217-4f3d-8f27-f0a3ea2e1cdc
|
||||
[create-default-behaviour-video]: https://github.com/user-attachments/assets/0a5e88af-eade-46dd-b76b-f80d6a87b8d4
|
||||
|
||||
<!-- Shell command -->
|
||||
|
||||
[shell-must-have-hovered-item-video]: https://github.com/user-attachments/assets/b68c51db-ccb7-447b-897e-fd99048c47c0
|
||||
[shell-hovered-item-optional-video]: https://github.com/user-attachments/assets/4643b23e-a2df-465f-8f62-3501747038b8
|
||||
[shell-prompt-video]: https://github.com/user-attachments/assets/929e6a68-7e3f-4614-8344-c0a482d471ad
|
||||
[shell-behaviour-video]: https://github.com/user-attachments/assets/3afd995a-225a-4cc1-8189-0241555a6345
|
||||
[shell-exit-if-directory-video]: https://github.com/user-attachments/assets/f7cef7a0-027b-462f-8fe0-b107e5844736
|
||||
[shell-must-have-hovered-item-video]: https://github.com/user-attachments/assets/52f9ecf1-877f-4377-921a-f954771a0496
|
||||
[shell-hovered-item-optional-video]: https://github.com/user-attachments/assets/c15adf88-dc08-4555-99d8-1968a804bf03
|
||||
[shell-prompt-video]: https://github.com/user-attachments/assets/90f3f1b7-1de5-494a-aca2-0810ef1218eb
|
||||
[shell-behaviour-video]: https://github.com/user-attachments/assets/9837752d-ec91-4af8-a22e-28b821508e22
|
||||
[shell-exit-if-directory-video]: https://github.com/user-attachments/assets/96b874dc-d97b-4ca8-a306-f8f243579142
|
||||
|
||||
<!-- Paste command -->
|
||||
|
||||
[smart-paste-video]: https://github.com/user-attachments/assets/946a8211-41a8-43a0-b56e-9c13f5a00f4d
|
||||
[smart-paste-video]: https://github.com/user-attachments/assets/d78e370b-1447-4dd7-8c1f-af56cd9eab6d
|
||||
|
||||
<!-- Tab create command -->
|
||||
|
||||
[smart-tab-create-video]: https://github.com/user-attachments/assets/4ea25adc-53d0-4086-b8b3-73dcea6d5932
|
||||
[smart-tab-create-video]: https://github.com/user-attachments/assets/16c50c24-70bc-47b7-9a1b-889c36ef6c70
|
||||
|
||||
<!-- Tab switch command -->
|
||||
|
||||
[smart-tab-switch-video]: https://github.com/user-attachments/assets/9e2190ad-1b4d-425e-90de-1eb41a445584
|
||||
[smart-tab-switch-video]: https://github.com/user-attachments/assets/1bec33d2-6d2a-421e-95e0-80d8e427cfa6
|
||||
|
||||
<!-- Quit command -->
|
||||
|
||||
[quit-with-confirmation-video]: https://github.com/user-attachments/assets/d3c71ae0-7024-4f06-9398-457cad0f5c1d
|
||||
[quit-with-confirmation-video]: https://github.com/user-attachments/assets/6ef5c012-77c1-4147-8032-4a9be7da6145
|
||||
|
||||
<!-- Arrow command -->
|
||||
|
||||
[smooth-arrow-video]: https://github.com/user-attachments/assets/04683520-6028-4246-b529-eac6d3a936cf
|
||||
[wraparound-arrow-video]: https://github.com/user-attachments/assets/f2555189-4628-4745-89f4-9ecb4ef070ab
|
||||
[smooth-wraparound-arrow-video]: https://github.com/user-attachments/assets/5d603738-a527-4e19-80fd-db41ae76e42b
|
||||
[smooth-arrow-video]: https://github.com/user-attachments/assets/c670a888-d168-4166-990c-d3a19b886dc3
|
||||
[wraparound-arrow-video]: https://github.com/user-attachments/assets/91b4f5c1-6ab7-4b58-96b1-194078e3e52e
|
||||
[smooth-wraparound-arrow-video]: https://github.com/user-attachments/assets/07bdd6d8-686e-49db-9073-874cefff6f8d
|
||||
|
||||
<!-- Parent arrow command -->
|
||||
|
||||
[parent-arrow-video]: https://github.com/user-attachments/assets/166a83d6-c7ef-4269-b725-62dde60f078f
|
||||
[smooth-parent-arrow-video]: https://github.com/user-attachments/assets/02a7090b-3373-43db-95ed-2b3a6fe683d3
|
||||
[wraparound-parent-arrow-video]: https://github.com/user-attachments/assets/229e11f8-a5e4-4237-93f3-d6c8875c9e78
|
||||
[smooth-wraparound-parent-arrow-video]: https://github.com/user-attachments/assets/7739afe5-e34d-466e-adf2-3e8a8732f04d
|
||||
[parent-arrow-video]: https://github.com/user-attachments/assets/67b4c0b5-5b94-4574-a7c1-0dda8e18b7b4
|
||||
[smooth-parent-arrow-video]: https://github.com/user-attachments/assets/1b7ac44c-f7bc-4847-aa8a-897380aed54e
|
||||
[wraparound-parent-arrow-video]: https://github.com/user-attachments/assets/ce35b55f-98dc-485d-a5e4-005ebe3ea169
|
||||
[smooth-wraparound-parent-arrow-video]: https://github.com/user-attachments/assets/5256f0c5-b96b-4f4c-ac1d-f4a3f087cc57
|
||||
|
||||
<!-- Archive command -->
|
||||
|
||||
[archive-must-have-hovered-item-video]: https://github.com/user-attachments/assets/6dac06c1-a69c-4b21-86f6-63f6cc693f22
|
||||
[archive-hovered-item-optional-video]: https://github.com/user-attachments/assets/b33fbcdf-1e00-49db-aede-99c2c3a26171
|
||||
[archive-prompt-video]: https://github.com/user-attachments/assets/ddc0a2e7-9b90-416f-97e3-57af5ad5f355
|
||||
[archive-behaviour-video]: https://github.com/user-attachments/assets/437254d2-4746-41e7-9500-13cef60764b7
|
||||
[archive-encrypt-files-video]: https://github.com/user-attachments/assets/d4269378-58ce-4b58-a420-13455576c58f
|
||||
[archive-reveal-created-archive-video]: https://github.com/user-attachments/assets/86f01452-42a4-4a97-9d31-ce6f9bc10407
|
||||
[archive-remove-archived-files-video]: https://github.com/user-attachments/assets/012ed8b5-57ae-4cb3-8bf7-4e0af6bdb0d2
|
||||
[archive-must-have-hovered-item-video]: https://github.com/user-attachments/assets/a49929b3-3b0d-4a50-b5d6-9dae7c119e7e
|
||||
[archive-hovered-item-optional-video]: https://github.com/user-attachments/assets/b1dfd41a-1125-4fc4-9fe7-dc5a0378b70b
|
||||
[archive-prompt-video]: https://github.com/user-attachments/assets/f247f71c-e846-4bff-a2cc-13fc645a2472
|
||||
[archive-behaviour-video]: https://github.com/user-attachments/assets/531b04e9-4fe6-4a39-9a7e-4b16deae87c6
|
||||
[archive-encrypt-files-video]: https://github.com/user-attachments/assets/8330a9db-ff74-4f37-8b21-113c7010e353
|
||||
[archive-reveal-created-archive-video]: https://github.com/user-attachments/assets/8ae784bc-e64e-4fd1-9ebc-93f759f5a3d7
|
||||
[archive-remove-archived-files-video]: https://github.com/user-attachments/assets/be37cb9d-8f1e-4548-98c0-33bcbd288b59
|
||||
|
||||
<!-- Emit command -->
|
||||
|
||||
[emit-yazi-command-video]: https://github.com/user-attachments/assets/d2fadf6b-1877-479f-9ac3-734cf227693f
|
||||
[emit-plugin-command-video]: https://github.com/user-attachments/assets/af28c33a-b915-413a-91b2-fc812c1d4d90
|
||||
[emit-augmented-command-video]: https://github.com/user-attachments/assets/08c2d3d6-8ae6-48e2-a045-9c9dc5d81bfd
|
||||
[emit-yazi-command-video]: https://github.com/user-attachments/assets/2f2a6231-b888-4041-be40-6d0adf6b1c8f
|
||||
[emit-plugin-command-video]: https://github.com/user-attachments/assets/a6f93fb1-3a86-4580-8f17-b75fd7ce6650
|
||||
[emit-augmented-command-video]: https://github.com/user-attachments/assets/68e64f0e-e9f4-4e1d-ae3e-0c339b89763c
|
||||
|
||||
<!-- Editor command -->
|
||||
|
||||
[editor-must-have-hovered-item-video]: https://github.com/user-attachments/assets/ca6d4bac-57be-487e-98e7-805b396fb3d3
|
||||
[editor-hovered-item-optional-video]: https://github.com/user-attachments/assets/3481a3be-d91c-4903-b7a1-80d3048fcf6b
|
||||
[editor-prompt-video]: https://github.com/user-attachments/assets/7cdb942f-0ad3-453c-93a5-ab89df5cd644
|
||||
[editor-behaviour-video]: https://github.com/user-attachments/assets/e7537e2e-56a0-4681-9820-5b48cd583bc8
|
||||
[editor-must-have-hovered-item-video]: https://github.com/user-attachments/assets/cefa765e-8ba1-407e-a144-b098641dde25
|
||||
[editor-hovered-item-optional-video]: https://github.com/user-attachments/assets/76cce397-b159-4967-8429-fc6d8d0944e0
|
||||
[editor-prompt-video]: https://github.com/user-attachments/assets/e6a9aef0-d31c-40e6-ac40-d091f8b67b25
|
||||
[editor-behaviour-video]: https://github.com/user-attachments/assets/21e8a73c-4a82-4f57-96c1-e3208ea073ab
|
||||
|
||||
<!-- Pager command -->
|
||||
|
||||
[pager-must-have-hovered-item-video]: https://github.com/user-attachments/assets/292f503e-c7b0-45ad-97b3-75325f8bb0e7
|
||||
[pager-hovered-item-optional-video]: https://github.com/user-attachments/assets/ca5f1126-4761-4289-a441-4b44c7234e57
|
||||
[pager-prompt-video]: https://github.com/user-attachments/assets/45d758e0-f95c-4e2e-92b2-094c2f475c00
|
||||
[pager-behaviour-video]: https://github.com/user-attachments/assets/547ebf9c-ab85-4e72-85c0-e130739b9e68
|
||||
[pager-must-have-hovered-item-video]: https://github.com/user-attachments/assets/09e5200f-3d68-4718-a34a-27dbd66f8fca
|
||||
[pager-hovered-item-optional-video]: https://github.com/user-attachments/assets/95b30bce-ef3f-4051-af7a-6f217dc1a828
|
||||
[pager-prompt-video]: https://github.com/user-attachments/assets/ab44b3ab-2938-405a-8a86-294bb23f652f
|
||||
[pager-behaviour-video]: https://github.com/user-attachments/assets/05085f86-a256-4ee8-a086-dc9cb9cddc9a
|
||||
|
||||
@ -79,6 +79,7 @@
|
||||
---@field skip_single_subdirectory_on_leave boolean Skip single subdir on leave
|
||||
---@field smooth_scrolling boolean Whether to smoothly scroll or not
|
||||
---@field scroll_delay number The scroll delay in seconds for smooth scrolling
|
||||
---@field create_item_delay number Delay in seconds before revealing
|
||||
---@field wraparound_file_navigation boolean Have wraparound navigation or not
|
||||
|
||||
-- The full configuration for the plugin
|
||||
@ -195,6 +196,7 @@ local DEFAULT_CONFIG = {
|
||||
skip_single_subdirectory_on_leave = true,
|
||||
smooth_scrolling = false,
|
||||
scroll_delay = 0.02,
|
||||
create_item_delay = 0.25,
|
||||
wraparound_file_navigation = true,
|
||||
}
|
||||
|
||||
@ -1027,6 +1029,10 @@ end
|
||||
local function get_sudo_edit_supported()
|
||||
--
|
||||
|
||||
-- If the platform is Windows, return false immediately
|
||||
-- as Windows does not have sudo
|
||||
if ya.target_family() == "windows" then return false end
|
||||
|
||||
-- Call the "sudo --help" command and get the handle
|
||||
--
|
||||
-- The "2>&1" redirects the standard error
|
||||
@ -3363,7 +3369,7 @@ local function execute_create(item_url, is_directory, args, config)
|
||||
end
|
||||
|
||||
-- Wait for a tiny bit for the file to be created
|
||||
ya.sleep(10e-2)
|
||||
ya.sleep(config.create_item_delay)
|
||||
|
||||
-- Reveal the created item
|
||||
ya.emit("reveal", { tostring(item_url) })
|
||||
@ -4213,7 +4219,7 @@ local function handle_parent_arrow(args, config)
|
||||
|
||||
-- If smooth scrolling is not wanted,
|
||||
-- call the function to execute the parent arrow command
|
||||
if not config.smooth_scrolling then execute_parent_arrow(args) end
|
||||
if not config.smooth_scrolling then return execute_parent_arrow(args) end
|
||||
|
||||
-- Otherwise, smooth scrolling is wanted,
|
||||
-- so get the number of steps from the arguments given
|
||||
@ -4450,7 +4456,7 @@ local function handle_archive(args, config)
|
||||
--
|
||||
|
||||
-- Wait for a tiny bit for the archive to be created
|
||||
ya.sleep(10e-2)
|
||||
ya.sleep(config.create_item_delay)
|
||||
|
||||
-- Reveal the archive
|
||||
ya.emit("reveal", { archive_path })
|
||||
|
||||
@ -22,7 +22,8 @@ return {
|
||||
|
||||
local value, event = ya.input {
|
||||
title = "Chmod:",
|
||||
position = { "top-center", y = 3, w = 40 },
|
||||
pos = { "top-center", y = 3, w = 40 },
|
||||
position = { "top-center", y = 3, w = 40 }, -- TODO: remove
|
||||
}
|
||||
if event ~= 1 then
|
||||
return
|
||||
|
||||
@ -34,6 +34,9 @@ run = "git"
|
||||
|
||||
## Advanced
|
||||
|
||||
> [!NOTE]
|
||||
> The following configuration must be put before `require("git"):setup()`
|
||||
|
||||
You can customize the [Style](https://yazi-rs.github.io/docs/plugins/layout#style) of the status sign with:
|
||||
|
||||
- `th.git.modified`
|
||||
|
||||
@ -5,6 +5,7 @@ local WINDOWS = ya.target_family() == "windows"
|
||||
-- The code of supported git status,
|
||||
-- also used to determine which status to show for directories when they contain different statuses
|
||||
-- see `bubble_up`
|
||||
---@enum CODES
|
||||
local CODES = {
|
||||
excluded = 100, -- ignored directory
|
||||
ignored = 6, -- ignored file
|
||||
@ -26,6 +27,8 @@ local PATTERNS = {
|
||||
{ "[AD][AD]", CODES.updated },
|
||||
}
|
||||
|
||||
---@param line string
|
||||
---@return CODES, string
|
||||
local function match(line)
|
||||
local signs = line:sub(1, 2)
|
||||
for _, p in ipairs(PATTERNS) do
|
||||
@ -41,9 +44,12 @@ local function match(line)
|
||||
else
|
||||
return code, path
|
||||
end
|
||||
---@diagnostic disable-next-line: missing-return
|
||||
end
|
||||
end
|
||||
|
||||
---@param cwd Url
|
||||
---@return string?
|
||||
local function root(cwd)
|
||||
local is_worktree = function(url)
|
||||
local file, head = io.open(tostring(url)), nil
|
||||
@ -64,6 +70,8 @@ local function root(cwd)
|
||||
until not cwd
|
||||
end
|
||||
|
||||
---@param changed Changes
|
||||
---@return Changes
|
||||
local function bubble_up(changed)
|
||||
local new, empty = {}, Url("")
|
||||
for path, code in pairs(changed) do
|
||||
@ -79,6 +87,10 @@ local function bubble_up(changed)
|
||||
return new
|
||||
end
|
||||
|
||||
---@param excluded string[]
|
||||
---@param cwd Url
|
||||
---@param repo Url
|
||||
---@return Changes
|
||||
local function propagate_down(excluded, cwd, repo)
|
||||
local new, rel = {}, cwd:strip_prefix(repo)
|
||||
for _, path in ipairs(excluded) do
|
||||
@ -95,7 +107,12 @@ local function propagate_down(excluded, cwd, repo)
|
||||
return new
|
||||
end
|
||||
|
||||
---@param cwd string
|
||||
---@param repo string
|
||||
---@param changed Changes
|
||||
local add = ya.sync(function(st, cwd, repo, changed)
|
||||
---@cast st State
|
||||
|
||||
st.dirs[cwd] = repo
|
||||
st.repos[repo] = st.repos[repo] or {}
|
||||
for path, code in pairs(changed) do
|
||||
@ -108,16 +125,29 @@ local add = ya.sync(function(st, cwd, repo, changed)
|
||||
st.repos[repo][path] = code
|
||||
end
|
||||
end
|
||||
-- TODO: remove this
|
||||
if ui.render then
|
||||
ui.render()
|
||||
else
|
||||
ya.render()
|
||||
end
|
||||
end)
|
||||
|
||||
---@param cwd string
|
||||
local remove = ya.sync(function(st, cwd)
|
||||
---@cast st State
|
||||
|
||||
local repo = st.dirs[cwd]
|
||||
if not repo then
|
||||
return
|
||||
end
|
||||
|
||||
-- TODO: remove this
|
||||
if ui.render then
|
||||
ui.render()
|
||||
else
|
||||
ya.render()
|
||||
end
|
||||
st.dirs[cwd] = nil
|
||||
if not st.repos[repo] then
|
||||
return
|
||||
@ -131,9 +161,11 @@ local remove = ya.sync(function(st, cwd)
|
||||
st.repos[repo] = nil
|
||||
end)
|
||||
|
||||
---@param st State
|
||||
---@param opts Options
|
||||
local function setup(st, opts)
|
||||
st.dirs = {} -- Mapping between a directory and its corresponding repository
|
||||
st.repos = {} -- Mapping between a repository and the status of each of its files
|
||||
st.dirs = {}
|
||||
st.repos = {}
|
||||
|
||||
opts = opts or {}
|
||||
opts.order = opts.order or 1500
|
||||
@ -174,6 +206,7 @@ local function setup(st, opts)
|
||||
end, opts.order)
|
||||
end
|
||||
|
||||
---@type UnstableFetcher
|
||||
local function fetch(_, job)
|
||||
local cwd = job.files[1].url.base
|
||||
local repo = root(cwd)
|
||||
|
||||
@ -1,9 +1,12 @@
|
||||
# mediainfo.yazi
|
||||
# mediainfo.yazi (fork)
|
||||
|
||||
<!--toc:start-->
|
||||
|
||||
- [mediainfo.yazi](#mediainfo-yazi)
|
||||
- [mediainfo.yazi (fork)](#mediainfoyazi-fork)
|
||||
- [Preview](#preview)
|
||||
- [Installation](#installation)
|
||||
- [Configuration:](#configuration)
|
||||
- [Custom theme](#custom-theme)
|
||||
<!--toc:end-->
|
||||
|
||||
This is a Yazi plugin for previewing media files. The preview shows thumbnail
|
||||
@ -31,11 +34,12 @@ using `ffmpeg` if available and media metadata using `mediainfo`.
|
||||

|
||||
|
||||
- SVG+XML file doesn't have useful information, so it only show the image preview.
|
||||
- There are more extensions which are supported by mediainfo. Just add file's MIME type to `previewers`, `preloaders`.
|
||||
- There are more file extensions which are supported by mediainfo. Just add file's MIME type to `previewers`, `preloaders`.
|
||||
Use `spotter` to determine File's MIME type. [Default is `<Tab>` key](https://github.com/sxyazi/yazi/blob/1a6abae974370702c8865459344bf256de58359e/yazi-config/preset/keymap-default.toml#L59)
|
||||
|
||||
## Installation
|
||||
|
||||
Install mediainfo CLI:
|
||||
- Install mediainfo CLI:
|
||||
|
||||
- [https://mediaarea.net/en/MediaInfo/Download](https://mediaarea.net/en/MediaInfo/Download)
|
||||
- Run this command in terminal to check if it's installed correctly:
|
||||
@ -44,22 +48,23 @@ Install mediainfo CLI:
|
||||
mediainfo --version
|
||||
```
|
||||
|
||||
- If it output `Not found` then add it to your PATH environment variable. It's better to ask ChatGPT to help you (Prompt: `Add MediaInfo CLI to PATH environment variable in Windows`).
|
||||
If it output `Not found` then add it to your PATH environment variable. It's better to ask ChatGPT to help you (Prompt: `Add MediaInfo CLI to PATH environment variable in Windows`).
|
||||
|
||||
Install + config this plugin:
|
||||
- Install this plugin:
|
||||
|
||||
```bash
|
||||
ya pkg add boydaihungst/mediainfo
|
||||
```
|
||||
|
||||
## Configuration:
|
||||
|
||||
> [!IMPORTANT] > `mediainfo` use video, image, svg, magick built-in plugins behind the scene to render preview image, song cover.
|
||||
> So you can remove those 3 plugins from `preloaders` and `previewers` sections in `yazi.toml`.
|
||||
|
||||
If you have cache problem, run this cmd, and follow the tips: `yazi --clear-cache`
|
||||
|
||||
```bash
|
||||
ya pkg add boydaihungst/mediainfo
|
||||
# or
|
||||
ya pack -a boydaihungst/mediainfo
|
||||
```
|
||||
Config folder for each OS: https://yazi-rs.github.io/docs/configuration/overview.
|
||||
|
||||
Config folder for each OS: https://yazi-rs.github.io/docs/configuration/overview
|
||||
Create `.../yazi/yazi.toml` and add:
|
||||
|
||||
```toml
|
||||
@ -68,22 +73,24 @@ Create `.../yazi/yazi.toml` and add:
|
||||
# Replace magick, image, video with mediainfo
|
||||
{ mime = "{audio,video,image}/*", run = "mediainfo" },
|
||||
{ mime = "application/subrip", run = "mediainfo" },
|
||||
# Adobe Illustrator
|
||||
{ mime = "application/postscript", run = "mediainfo" },
|
||||
]
|
||||
prepend_previewers = [
|
||||
# Replace magick, image, video with mediainfo
|
||||
{ mime = "{audio,video,image}/*", run = "mediainfo"},
|
||||
{ mime = "application/subrip", run = "mediainfo" },
|
||||
# Adobe Illustrator
|
||||
{ mime = "application/postscript", run = "mediainfo" },
|
||||
]
|
||||
# There are more extensions which are supported by mediainfo.
|
||||
# Just add file's MIME type to `previewers`, `preloaders` above.
|
||||
# https://mediaarea.net/en/MediaInfo/Support/Formats
|
||||
|
||||
```
|
||||
|
||||
## Custom theme
|
||||
|
||||
Using the same style with spotter
|
||||
Read more: https://github.com/sxyazi/yazi/pull/2391
|
||||
Using the same style with spotter. [Read more](https://github.com/sxyazi/yazi/pull/2391)
|
||||
|
||||
Edit or add `yazi/theme.toml`:
|
||||
|
||||
|
||||
@ -22,8 +22,26 @@ local magick_image_mimes = {
|
||||
["svg+xml"] = true,
|
||||
}
|
||||
|
||||
local seekable_mimes = {
|
||||
["application/postscript"] = true,
|
||||
["image/adobe.photoshop"] = true,
|
||||
}
|
||||
|
||||
local M = {}
|
||||
local suffix = "_mediainfo"
|
||||
local SHELL = os.getenv("SHELL") or ""
|
||||
|
||||
local function is_valid_utf8(str)
|
||||
return utf8.len(str) ~= nil
|
||||
end
|
||||
|
||||
local function path_quote(path)
|
||||
if not path or tostring(path) == "" then
|
||||
return path
|
||||
end
|
||||
local result = "'" .. string.gsub(tostring(path), "'", "'\\''") .. "'"
|
||||
return result
|
||||
end
|
||||
|
||||
local function read_mediainfo_cached_file(file_path)
|
||||
-- Open the file in read mode
|
||||
@ -37,6 +55,41 @@ local function read_mediainfo_cached_file(file_path)
|
||||
end
|
||||
end
|
||||
|
||||
local set_state = ya.sync(function(state, key, value)
|
||||
state[key] = value
|
||||
end)
|
||||
|
||||
local get_state = ya.sync(function(state, key)
|
||||
return state[key]
|
||||
end)
|
||||
|
||||
local force_render = ya.sync(function(_, _)
|
||||
(ui.render or ya.render)()
|
||||
end)
|
||||
|
||||
local function image_layer_count(job)
|
||||
local cache = ya.file_cache({ file = job.file, skip = 0 })
|
||||
if not cache then
|
||||
return 0
|
||||
end
|
||||
local layer_count = get_state("f" .. tostring(cache))
|
||||
if layer_count then
|
||||
return layer_count
|
||||
end
|
||||
local output, err = Command("identify"):arg({ tostring(job.file.url) }):output()
|
||||
if err then
|
||||
return 0
|
||||
end
|
||||
layer_count = 0
|
||||
for line in output.stdout:gmatch("[^\r\n]+") do
|
||||
if line:match("%S") then
|
||||
layer_count = layer_count + 1
|
||||
end
|
||||
end
|
||||
set_state("f" .. tostring(cache), layer_count)
|
||||
return layer_count
|
||||
end
|
||||
|
||||
function M:peek(job)
|
||||
local start = os.clock()
|
||||
local cache_img_url_no_skip = ya.file_cache({ file = job.file, skip = 0 })
|
||||
@ -46,21 +99,22 @@ function M:peek(job)
|
||||
local is_video = string.find(job.mime, "^video/")
|
||||
local is_audio = string.find(job.mime, "^audio/")
|
||||
local is_image = string.find(job.mime, "^image/")
|
||||
local is_seekable = seekable_mimes[job.mime] or is_video
|
||||
local cache_img_url = (is_audio or is_image) and cache_img_url_no_skip
|
||||
|
||||
if is_video then
|
||||
cache_img_url = ya.file_cache({ file = job.file, skip = math.min(90, job.skip) })
|
||||
if is_seekable then
|
||||
cache_img_url = ya.file_cache(job)
|
||||
end
|
||||
local ok, err = self:preload(job)
|
||||
if not ok or err then
|
||||
local preload_status, preload_err = self:preload(job)
|
||||
if not preload_status then
|
||||
return
|
||||
end
|
||||
local cache_mediainfo_path = tostring(cache_img_url_no_skip) .. suffix
|
||||
ya.sleep(math.max(0, rt.preview.image_delay / 1000 + start - os.clock()))
|
||||
local cache_mediainfo_path = tostring(cache_img_url_no_skip) .. suffix
|
||||
local output = read_mediainfo_cached_file(cache_mediainfo_path)
|
||||
|
||||
local lines = {}
|
||||
local max_lines = math.floor(job.area.h / 2)
|
||||
local limit = job.area.h
|
||||
local last_line = 0
|
||||
local is_wrap = rt.preview.wrap == "yes"
|
||||
|
||||
@ -68,8 +122,8 @@ function M:peek(job)
|
||||
local max_width = math.max(1, job.area.w)
|
||||
if output:match("^Error:") then
|
||||
job.args.force_reload_mediainfo = true
|
||||
local _ok, _err = self:preload(job)
|
||||
if not _ok or _err then
|
||||
preload_status, preload_err = self:preload(job)
|
||||
if not preload_status or preload_err then
|
||||
return
|
||||
end
|
||||
output = read_mediainfo_cached_file(cache_mediainfo_path)
|
||||
@ -90,37 +144,71 @@ function M:peek(job)
|
||||
end
|
||||
|
||||
if line then
|
||||
local line_height = math.max(1, is_wrap and math.ceil(line:width() / max_width) or 1)
|
||||
local line_height = math.max(1, is_wrap and math.ceil(ui.width(line) / max_width) or 1)
|
||||
if (last_line + line_height) > job.skip then
|
||||
table.insert(lines, line)
|
||||
end
|
||||
if (last_line + line_height) >= job.skip + max_lines then
|
||||
last_line = job.skip + max_lines
|
||||
if (last_line + line_height) >= job.skip + limit then
|
||||
last_line = job.skip + limit
|
||||
break
|
||||
end
|
||||
last_line = last_line + line_height
|
||||
end
|
||||
end
|
||||
end
|
||||
local mediainfo_height = math.min(max_lines, last_line)
|
||||
local mediainfo_height = math.min(limit, last_line)
|
||||
|
||||
if (job.skip > 0 and #lines == 0) and (not is_video or (is_video and job.skip >= 90)) then
|
||||
ya.emit("peek", { math.max(0, job.skip - max_lines), only_if = job.file.url, upper_bound = false })
|
||||
if
|
||||
(job.skip > 0 and #lines == 0)
|
||||
and (
|
||||
not is_seekable
|
||||
or (is_video and job.skip >= 90)
|
||||
or (
|
||||
(job.mime == "image/adobe.photoshop" or job.mime == "application/postscript")
|
||||
and image_layer_count(job) < (1 + math.floor(math.max(0, job.skip / (get_state("units") or 0))))
|
||||
)
|
||||
)
|
||||
then
|
||||
ya.emit(
|
||||
"peek",
|
||||
{ math.max(0, job.skip - (get_state("units") or limit)), only_if = job.file.url, upper_bound = true }
|
||||
)
|
||||
return
|
||||
end
|
||||
force_render()
|
||||
local rendered_img_rect = cache_img_url
|
||||
and fs.cha(cache_img_url)
|
||||
and ya.image_show(
|
||||
cache_img_url,
|
||||
ui.Rect({
|
||||
x = job.area.x,
|
||||
y = job.area.y,
|
||||
w = job.area.w,
|
||||
h = job.area.h - mediainfo_height,
|
||||
h = mediainfo_height > 0 and math.max(job.area.h - mediainfo_height, job.area.h / 2) or job.area.h,
|
||||
})
|
||||
)
|
||||
or nil
|
||||
|
||||
local image_height = rendered_img_rect and rendered_img_rect.h or 0
|
||||
|
||||
-- NOTE: Workaround case audio has no cover image. Prevent regenerate preview image
|
||||
if is_audio and image_height == 1 then
|
||||
local info = ya.image_info(cache_img_url)
|
||||
if not info or (info.w == 1 and info.h == 1) then
|
||||
image_height = 0
|
||||
end
|
||||
end
|
||||
|
||||
-- NOTE: Workaround case video.lua doesn't doesn't generate preview image because of `skip` overflow video duration
|
||||
if is_video and not rendered_img_rect then
|
||||
image_height = math.max(job.area.h - mediainfo_height, 0)
|
||||
end
|
||||
|
||||
-- Handle image preload error
|
||||
if preload_err then
|
||||
table.insert(lines, ui.Line(tostring(preload_err)):style(th.spot.title or ui.Style():fg("red")))
|
||||
end
|
||||
|
||||
ya.preview_widget(job, {
|
||||
ui.Text(lines)
|
||||
:area(ui.Rect({
|
||||
@ -136,6 +224,7 @@ end
|
||||
function M:seek(job)
|
||||
local h = cx.active.current.hovered
|
||||
if h and h.url == job.file.url then
|
||||
set_state("units", job.units)
|
||||
ya.emit("peek", {
|
||||
math.max(0, cx.active.preview.skip + job.units),
|
||||
only_if = job.file.url,
|
||||
@ -144,30 +233,31 @@ function M:seek(job)
|
||||
end
|
||||
|
||||
function M:preload(job)
|
||||
local cache_img_url_no_skip = ya.file_cache({ file = job.file, skip = 0 })
|
||||
local cache_img_url_no_skip_cha = cache_img_url_no_skip and fs.cha(cache_img_url_no_skip)
|
||||
if not cache_img_url_no_skip then
|
||||
local cache_img_url = ya.file_cache({ file = job.file, skip = 0 })
|
||||
if not cache_img_url then
|
||||
return true
|
||||
end
|
||||
local cache_mediainfo_url = Url(tostring(cache_img_url_no_skip) .. suffix)
|
||||
local cache_mediainfo_url = Url(tostring(cache_img_url) .. suffix)
|
||||
cache_img_url = seekable_mimes[job.mime] and ya.file_cache(job) or cache_img_url
|
||||
local cache_img_url_cha = cache_img_url and fs.cha(cache_img_url)
|
||||
local err_msg = ""
|
||||
-- seekable mimetype
|
||||
if job.mime and string.find(job.mime, "^video/") then
|
||||
local video = require("video")
|
||||
local cache_img_status, video_preload_err = video:preload({ file = job.file, skip = math.min(90, job.skip) })
|
||||
local is_valid_utf8_path = is_valid_utf8(tostring(job.file.url))
|
||||
-- video mimetype
|
||||
if job.mime then
|
||||
if string.find(job.mime, "^video/") then
|
||||
local cache_img_status, video_preload_err = require("video"):preload(job)
|
||||
if not cache_img_status and video_preload_err then
|
||||
err_msg = err_msg
|
||||
.. string.format("Failed to start `%s`, Do you have `%s` installed?\n", "ffmpeg", "ffmpeg")
|
||||
end
|
||||
end
|
||||
-- none-seekable mimetype
|
||||
if cache_img_url_no_skip and (not cache_img_url_no_skip_cha or cache_img_url_no_skip_cha.len <= 0) then
|
||||
-- audo and image mimetype
|
||||
elseif cache_img_url and (not cache_img_url_cha or cache_img_url_cha.len <= 0) then
|
||||
-- audio
|
||||
if job.mime and string.find(job.mime, "^audio/") then
|
||||
if string.find(job.mime, "^audio/") then
|
||||
local qv = 31 - math.floor(rt.preview.image_quality * 0.3)
|
||||
local status, _ = Command("ffmpeg"):arg({
|
||||
local audio_preload_output, audio_preload_err = Command("ffmpeg"):arg({
|
||||
"-v",
|
||||
"quiet",
|
||||
"error",
|
||||
"-threads",
|
||||
1,
|
||||
"-hwaccel",
|
||||
@ -188,45 +278,127 @@ function M:preload(job)
|
||||
"-f",
|
||||
"image2",
|
||||
"-y",
|
||||
tostring(cache_img_url_no_skip),
|
||||
}):status()
|
||||
|
||||
-- NOTE: Ignore this err msg because some audio types doesn't have cover image
|
||||
--
|
||||
-- if not status or not status.success then
|
||||
-- err_msg = err_msg
|
||||
-- .. string.format("Failed to start `%s`, Do you have `%s` installed?\n", "ffmpeg", "ffmpeg")
|
||||
-- end
|
||||
|
||||
tostring(cache_img_url),
|
||||
}):output()
|
||||
-- NOTE: Some audio types doesn't have cover image -> error ""
|
||||
if (audio_preload_output.stderr ~= nil and audio_preload_output.stderr ~= "") or audio_preload_err then
|
||||
err_msg = err_msg
|
||||
.. string.format("Failed to start `%s`, Do you have `%s` installed?\n", "ffmpeg", "ffmpeg")
|
||||
else
|
||||
cache_img_url_cha = fs.cha(cache_img_url)
|
||||
if not cache_img_url_cha then
|
||||
-- NOTE: Workaround case audio has no cover image. Prevent regenerate preview image
|
||||
audio_preload_output, audio_preload_err = require("magick")
|
||||
.with_limit()
|
||||
:arg({
|
||||
"-size",
|
||||
"1x1",
|
||||
"canvas:none",
|
||||
string.format("PNG32:%s", cache_img_url),
|
||||
})
|
||||
:output()
|
||||
if
|
||||
(audio_preload_output.stderr ~= nil and audio_preload_output.stderr ~= "")
|
||||
or audio_preload_err
|
||||
then
|
||||
err_msg = err_msg
|
||||
.. string.format(
|
||||
"Failed to start `%s`, Do you have `%s` installed?\n",
|
||||
"magick",
|
||||
"magick"
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
-- image
|
||||
elseif job.mime and string.find(job.mime, "^image/") then
|
||||
elseif string.find(job.mime, "^image/") or job.mime == "application/postscript" then
|
||||
local svg_plugin_ok, svg_plugin = pcall(require, "svg")
|
||||
local _, magick_plugin = pcall(require, "magick")
|
||||
local mime = job.mime:match(".*/(.*)$")
|
||||
|
||||
local image = magick_image_mimes[mime]
|
||||
and ((mime == "svg+xml" and svg_plugin_ok) and svg_plugin or require("magick"))
|
||||
local image_plugin = magick_image_mimes[mime]
|
||||
and ((mime == "svg+xml" and svg_plugin_ok) and svg_plugin or magick_plugin)
|
||||
or require("image")
|
||||
local no_skip_job = { skip = 0, file = job.file }
|
||||
-- image = ya.dict_merge(image, no_skip_job)
|
||||
local cache_img_status, image_preload_err = image:preload(no_skip_job)
|
||||
if not cache_img_status and image_preload_err then
|
||||
err_msg = err_msg .. "Failed to cache image , check cache folder permissions\n"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local cache_img_status, image_preload_err
|
||||
-- psd, ai, eps
|
||||
if mime == "adobe.photoshop" or job.mime == "application/postscript" then
|
||||
local layer_index = 0
|
||||
local units = get_state("units")
|
||||
if units ~= nil then
|
||||
local max_layer = image_layer_count(job)
|
||||
layer_index = math.floor(math.max(0, job.skip / units))
|
||||
if layer_index + 1 > max_layer then
|
||||
layer_index = max_layer - 1
|
||||
end
|
||||
end
|
||||
cache_img_status, image_preload_err = magick_plugin
|
||||
.with_limit()
|
||||
:arg({
|
||||
"-background",
|
||||
"none",
|
||||
tostring(job.file.url) .. "[" .. tostring(layer_index) .. "]",
|
||||
"-auto-orient",
|
||||
"-strip",
|
||||
"-resize",
|
||||
string.format("%dx%d>", rt.preview.max_width, rt.preview.max_height),
|
||||
"-quality",
|
||||
rt.preview.image_quality,
|
||||
string.format("PNG32:%s", cache_img_url),
|
||||
})
|
||||
:status()
|
||||
elseif mime == "svg+xml" and not is_valid_utf8_path then
|
||||
-- svg under invalid utf8 path
|
||||
cache_img_status, image_preload_err = magick_plugin
|
||||
.with_limit()
|
||||
:arg({
|
||||
"-background",
|
||||
"none",
|
||||
tostring(job.file.url),
|
||||
"-auto-orient",
|
||||
"-strip",
|
||||
"-flatten",
|
||||
"-resize",
|
||||
string.format("%dx%d>", rt.preview.max_width, rt.preview.max_height),
|
||||
"-quality",
|
||||
rt.preview.image_quality,
|
||||
string.format("PNG32:%s", cache_img_url),
|
||||
})
|
||||
:status()
|
||||
else
|
||||
-- other image
|
||||
local no_skip_job = { skip = 0, file = job.file, args = {} }
|
||||
cache_img_status, image_preload_err = image_plugin:preload(no_skip_job)
|
||||
end
|
||||
if not cache_img_status then
|
||||
err_msg = err_msg .. (image_preload_err and (tostring(image_preload_err)) or "")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
local cache_mediainfo_cha = fs.cha(cache_mediainfo_url)
|
||||
if cache_mediainfo_cha and not job.args.force_reload_mediainfo then
|
||||
return true
|
||||
return true, err_msg ~= "" and ("Error: " .. err_msg) or nil
|
||||
end
|
||||
local cmd = "mediainfo"
|
||||
local output, err = Command(cmd):arg({ tostring(job.file.url) }):stdout(Command.PIPED):output()
|
||||
local output, err
|
||||
if is_valid_utf8_path then
|
||||
output, err = Command(cmd):arg({ tostring(job.file.url) }):output()
|
||||
else
|
||||
cmd = "cd "
|
||||
.. path_quote(job.file.url.parent)
|
||||
.. " && "
|
||||
.. cmd
|
||||
.. " "
|
||||
.. path_quote(tostring(job.file.url.name))
|
||||
output, err = Command(SHELL):arg({ "-c", cmd }):arg({ tostring(job.file.url) }):output()
|
||||
end
|
||||
if err then
|
||||
err_msg = err_msg .. string.format("Failed to start `%s`, Do you have `%s` installed?\n", cmd, cmd)
|
||||
end
|
||||
return fs.write(
|
||||
cache_mediainfo_url,
|
||||
(err_msg ~= "" and "Error: " .. err_msg or "") .. (output and output.stdout or "")
|
||||
(err_msg ~= "" and ("Error: " .. err_msg) or "") .. (output and output.stdout or "")
|
||||
)
|
||||
end
|
||||
|
||||
|
||||
@ -7,7 +7,12 @@ local toggle_ui = ya.sync(function(self)
|
||||
else
|
||||
self.children = Modal:children_add(self, 10)
|
||||
end
|
||||
-- TODO: remove this
|
||||
if ui.render then
|
||||
ui.render()
|
||||
else
|
||||
ya.render()
|
||||
end
|
||||
end)
|
||||
|
||||
local subscribe = ya.sync(function(self)
|
||||
@ -18,7 +23,12 @@ end)
|
||||
local update_partitions = ya.sync(function(self, partitions)
|
||||
self.partitions = partitions
|
||||
self.cursor = math.max(0, math.min(self.cursor or 0, #self.partitions - 1))
|
||||
-- TODO: remove this
|
||||
if ui.render then
|
||||
ui.render()
|
||||
else
|
||||
ya.render()
|
||||
end
|
||||
end)
|
||||
|
||||
local active_partition = ya.sync(function(self) return self.partitions[self.cursor + 1] end)
|
||||
@ -29,7 +39,12 @@ local update_cursor = ya.sync(function(self, cursor)
|
||||
else
|
||||
self.cursor = ya.clamp(0, self.cursor + cursor, #self.partitions - 1)
|
||||
end
|
||||
-- TODO: remove this
|
||||
if ui.render then
|
||||
ui.render()
|
||||
else
|
||||
ya.render()
|
||||
end
|
||||
end)
|
||||
|
||||
local M = {
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||
### Yazi package manager
|
||||
```bash
|
||||
ya pack -a ndtoan96/ouch
|
||||
ya pkg add ndtoan96/ouch
|
||||
```
|
||||
|
||||
### Git
|
||||
@ -43,8 +43,12 @@ prepend_previewers = [
|
||||
{ mime = "application/x-bzip2", run = "ouch" },
|
||||
{ mime = "application/x-7z-compressed", run = "ouch" },
|
||||
{ mime = "application/x-rar", run = "ouch" },
|
||||
{ mime = "application/vnd.rar", run = "ouch" },
|
||||
{ mime = "application/x-xz", run = "ouch" },
|
||||
{ mime = "application/xz", run = "ouch" },
|
||||
{ mime = "application/x-zstd", run = "ouch" },
|
||||
{ mime = "application/zstd", run = "ouch" },
|
||||
{ mime = "application/java-archive", run = "ouch" },
|
||||
]
|
||||
```
|
||||
|
||||
|
||||
@ -126,6 +126,7 @@ function M:entry(job)
|
||||
title = "Create archive:",
|
||||
value = default_name .. "." .. default_fmt,
|
||||
position = { "top-center", y = 3, w = 40 },
|
||||
pos = { "top-center", y = 3, w = 40 },
|
||||
})
|
||||
if name_event ~= 1 then
|
||||
return
|
||||
@ -136,6 +137,7 @@ function M:entry(job)
|
||||
local confirm, confirm_event = ya.input({
|
||||
title = "Overwrite " .. output_name .. "? (y/N)",
|
||||
position = { "top-center", y = 3, w = 40 },
|
||||
pos = { "top-center", y = 3, w = 40 },
|
||||
})
|
||||
if not (confirm_event == 1 and confirm:lower() == "y") then
|
||||
return
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
A [Yazi](https://github.com/sxyazi/yazi) plugin based about vim motions.
|
||||
|
||||
https://github.com/dedukun/relative-motions.yazi/assets/25795432/04fb186a-5efe-442d-8d7b-2dccb6eee408
|
||||
<https://github.com/dedukun/relative-motions.yazi/assets/25795432/04fb186a-5efe-442d-8d7b-2dccb6eee408>
|
||||
|
||||
## Requirements
|
||||
|
||||
@ -11,7 +11,7 @@ https://github.com/dedukun/relative-motions.yazi/assets/25795432/04fb186a-5efe-4
|
||||
## Installation
|
||||
|
||||
```sh
|
||||
ya pack -a dedukun/relative-motions
|
||||
ya pkg add dedukun/relative-motions
|
||||
```
|
||||
|
||||
## Configuration
|
||||
@ -21,47 +21,47 @@ If you want to use the numbers directly to start a motion add this to your `keym
|
||||
<details>
|
||||
|
||||
```toml
|
||||
[[manager.prepend_keymap]]
|
||||
[[mgr.prepend_keymap]]
|
||||
on = [ "1" ]
|
||||
run = "plugin relative-motions 1"
|
||||
desc = "Move in relative steps"
|
||||
|
||||
[[manager.prepend_keymap]]
|
||||
[[mgr.prepend_keymap]]
|
||||
on = [ "2" ]
|
||||
run = "plugin relative-motions 2"
|
||||
desc = "Move in relative steps"
|
||||
|
||||
[[manager.prepend_keymap]]
|
||||
[[mgr.prepend_keymap]]
|
||||
on = [ "3" ]
|
||||
run = "plugin relative-motions 3"
|
||||
desc = "Move in relative steps"
|
||||
|
||||
[[manager.prepend_keymap]]
|
||||
[[mgr.prepend_keymap]]
|
||||
on = [ "4" ]
|
||||
run = "plugin relative-motions 4"
|
||||
desc = "Move in relative steps"
|
||||
|
||||
[[manager.prepend_keymap]]
|
||||
[[mgr.prepend_keymap]]
|
||||
on = [ "5" ]
|
||||
run = "plugin relative-motions 5"
|
||||
desc = "Move in relative steps"
|
||||
|
||||
[[manager.prepend_keymap]]
|
||||
[[mgr.prepend_keymap]]
|
||||
on = [ "6" ]
|
||||
run = "plugin relative-motions 6"
|
||||
desc = "Move in relative steps"
|
||||
|
||||
[[manager.prepend_keymap]]
|
||||
[[mgr.prepend_keymap]]
|
||||
on = [ "7" ]
|
||||
run = "plugin relative-motions 7"
|
||||
desc = "Move in relative steps"
|
||||
|
||||
[[manager.prepend_keymap]]
|
||||
[[mgr.prepend_keymap]]
|
||||
on = [ "8" ]
|
||||
run = "plugin relative-motions 8"
|
||||
desc = "Move in relative steps"
|
||||
|
||||
[[manager.prepend_keymap]]
|
||||
[[mgr.prepend_keymap]]
|
||||
on = [ "9" ]
|
||||
run = "plugin relative-motions 9"
|
||||
desc = "Move in relative steps"
|
||||
@ -72,7 +72,7 @@ desc = "Move in relative steps"
|
||||
Alternatively you can use a key to trigger a new motion without any initial value, for that add the following in `keymap.toml`:
|
||||
|
||||
```toml
|
||||
[[manager.prepend_keymap]]
|
||||
[[mgr.prepend_keymap]]
|
||||
on = [ "m" ]
|
||||
run = "plugin relative-motions"
|
||||
desc = "Trigger a new relative motion"
|
||||
|
||||
@ -40,7 +40,11 @@ local ENTER_MODE_CACHE_OR_FIRST = 2
|
||||
-----------------------------------------------
|
||||
|
||||
local render_motion_setup = ya.sync(function(_)
|
||||
if ui.render then
|
||||
ui.render()
|
||||
else
|
||||
ya.render()
|
||||
end
|
||||
|
||||
Status.motion = function() return ui.Span("") end
|
||||
|
||||
@ -60,7 +64,11 @@ local render_motion_setup = ya.sync(function(_)
|
||||
end)
|
||||
|
||||
local render_motion = ya.sync(function(_, motion_num, motion_cmd)
|
||||
if ui.render then
|
||||
ui.render()
|
||||
else
|
||||
ya.render()
|
||||
end
|
||||
|
||||
Status.motion = function(self)
|
||||
if not motion_num then
|
||||
@ -80,17 +88,29 @@ local render_motion = ya.sync(function(_, motion_num, motion_cmd)
|
||||
local separator_open = status_config.sep_right.open
|
||||
local separator_close = status_config.sep_right.close
|
||||
|
||||
-- TODO: REMOVE THIS IN NEXT RELEASE
|
||||
local bg_style
|
||||
if type(style.main.bg) == "function" then
|
||||
bg_style = style.main:bg()
|
||||
else
|
||||
bg_style = style.main.bg
|
||||
end
|
||||
|
||||
return ui.Line {
|
||||
ui.Span(separator_open):fg(style.main.bg),
|
||||
ui.Span(separator_open):fg(bg_style),
|
||||
motion_span:style(style.main),
|
||||
ui.Span(separator_close):fg(style.main.bg),
|
||||
ui.Span(separator_close):fg(bg_style),
|
||||
ui.Span(" "),
|
||||
}
|
||||
end
|
||||
end)
|
||||
|
||||
local render_numbers = ya.sync(function(_, mode)
|
||||
if ui.render then
|
||||
ui.render()
|
||||
else
|
||||
ya.render()
|
||||
end
|
||||
|
||||
Entity.number = function(_, index, total, file, hovered)
|
||||
local idx
|
||||
|
||||
@ -16,7 +16,8 @@ end)
|
||||
local function prompt()
|
||||
return ya.input {
|
||||
title = "Smart filter:",
|
||||
position = { "center", w = 50 },
|
||||
pos = { "center", w = 50 },
|
||||
position = { "center", w = 50 }, -- TODO: remove
|
||||
realtime = true,
|
||||
debounce = 0.1,
|
||||
}
|
||||
|
||||
@ -2,9 +2,7 @@ local M = {}
|
||||
|
||||
function M:peek(job)
|
||||
local child = Command("transmission-show")
|
||||
:args({
|
||||
tostring(job.file.url),
|
||||
})
|
||||
:arg(tostring(job.file.url))
|
||||
:stdout(Command.PIPED)
|
||||
:stderr(Command.PIPED)
|
||||
:spawn()
|
||||
@ -33,8 +31,8 @@ function M:peek(job)
|
||||
if job.skip > 0 and i < job.skip + limit then
|
||||
ya.manager_emit("peek", { math.max(0, i - limit), only_if = job.file.url, upper_bound = true })
|
||||
else
|
||||
lines = lines:gsub("\t", string.rep(" ", PREVIEW.tab_size))
|
||||
ya.preview_widgets(job, { ui.Text.parse(lines):area(job.area) })
|
||||
lines = lines:gsub("\t", string.rep(" ", rt.preview.tab_size))
|
||||
ya.preview_widget(job, { ui.Text.parse(lines):area(job.area) })
|
||||
end
|
||||
end
|
||||
|
||||
@ -43,4 +41,3 @@ function M:seek(job)
|
||||
end
|
||||
|
||||
return M
|
||||
|
||||
|
||||
@ -26,6 +26,13 @@ what-size supports Yazi on Linux, macOS, and Windows.
|
||||
|
||||
## Installation
|
||||
|
||||
```sh
|
||||
ya pkg add pirafrank/what-size
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
**DEPRECATED**
|
||||
```sh
|
||||
ya pack -a 'pirafrank/what-size'
|
||||
```
|
||||
@ -35,26 +42,26 @@ ya pack -a 'pirafrank/what-size'
|
||||
Add this to your `~/.config/yazi/keymap.toml`:
|
||||
|
||||
```toml
|
||||
[manager]
|
||||
prepend_keymap = [
|
||||
{ on = [ ".", "s" ], run = "plugin what-size", desc = "Calc size of selection or cwd" },
|
||||
]
|
||||
[[mgr.prepend_keymap]]
|
||||
on = [ ".", "s" ]
|
||||
run = "plugin what-size"
|
||||
desc = "Calc size of selection or cwd"
|
||||
```
|
||||
|
||||
If you want to copy the result to clipboard, you can add `--clipboard` or `-c` as 2nd positional argument:
|
||||
|
||||
```toml
|
||||
[manager]
|
||||
prepend_keymap = [
|
||||
{ on = [ ".", "s" ], run = "plugin what-size -- '--clipboard'", desc = "Calc size of selection or cwd" },
|
||||
]
|
||||
[[mgr.prepend_keymap]]
|
||||
on = [ ".", "s" ]
|
||||
run = "plugin what-size -- '--clipboard'"
|
||||
desc = "Calc size of selection or cwd"
|
||||
```
|
||||
|
||||
```toml
|
||||
[manager]
|
||||
prepend_keymap = [
|
||||
{ on = [ ".", "s" ], run = "plugin what-size -- '-c'", desc = "Calc size of selection or cwd" },
|
||||
]
|
||||
[[mgr.prepend_keymap]]
|
||||
on = [ ".", "s" ]
|
||||
run = "plugin what-size -- '-c'"
|
||||
desc = "Calc size of selection or cwd"
|
||||
```
|
||||
|
||||
Change to whatever keybinding you like.
|
||||
|
||||
@ -46,7 +46,13 @@ local function get_total_size(items)
|
||||
return total
|
||||
else
|
||||
local arg = ya.target_os() == "macos" and "-scA" or "-scb"
|
||||
local output, err = Command("du"):arg(arg):arg(items):output()
|
||||
-- pass args as string
|
||||
local cmd = Command("du"):arg(arg)
|
||||
for _, path in ipairs(items) do
|
||||
cmd = cmd:arg(path)
|
||||
end
|
||||
local output, err = cmd:output()
|
||||
|
||||
if not output then
|
||||
ya.err("Failed to run du: " .. err)
|
||||
end
|
||||
|
||||
Loading…
Reference in New Issue
Block a user