Showing preview only (2,014K chars total). Download the full file or copy to clipboard to get everything.
Repository: sxyazi/yazi
Branch: main
Commit: a246e9c7c06d
Files: 1064
Total size: 1.8 MB
Directory structure:
gitextract_ehhv1z_b/
├── .cargo/
│ └── config.toml
├── .envrc
├── .github/
│ ├── DISCUSSION_TEMPLATE/
│ │ └── 1-q-a.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug.yml
│ │ ├── config.yml
│ │ └── feature.yml
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── cachix.yml
│ ├── check.yml
│ ├── draft.yml
│ ├── lock.yml
│ ├── no-response.yml
│ ├── publish.yml
│ ├── test.yml
│ └── validate-form.yml
├── .gitignore
├── .luarc.json
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cargo.toml
├── LICENSE
├── LICENSE-ICONS
├── README.md
├── assets/
│ └── yazi.desktop
├── cspell.json
├── flake.nix
├── nix/
│ ├── shell.nix
│ ├── yazi-unwrapped.nix
│ └── yazi.nix
├── rustfmt.toml
├── scripts/
│ ├── build.sh
│ ├── bump.sh
│ ├── icons/
│ │ └── generate.lua
│ └── validate-form/
│ ├── main.js
│ └── package.json
├── snap/
│ └── snapcraft.yaml
├── stylua.toml
├── yazi-actor/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── actor.rs
│ ├── app/
│ │ ├── accept_payload.rs
│ │ ├── bootstrap.rs
│ │ ├── deprecate.rs
│ │ ├── focus.rs
│ │ ├── mod.rs
│ │ ├── mouse.rs
│ │ ├── plugin.rs
│ │ ├── plugin_do.rs
│ │ ├── quit.rs
│ │ ├── reflow.rs
│ │ ├── resize.rs
│ │ ├── resume.rs
│ │ ├── stop.rs
│ │ ├── title.rs
│ │ └── update_progress.rs
│ ├── cmp/
│ │ ├── arrow.rs
│ │ ├── close.rs
│ │ ├── mod.rs
│ │ ├── show.rs
│ │ └── trigger.rs
│ ├── confirm/
│ │ ├── arrow.rs
│ │ ├── close.rs
│ │ ├── mod.rs
│ │ └── show.rs
│ ├── context.rs
│ ├── core/
│ │ ├── mod.rs
│ │ └── preflight.rs
│ ├── help/
│ │ ├── arrow.rs
│ │ ├── escape.rs
│ │ ├── filter.rs
│ │ ├── mod.rs
│ │ └── toggle.rs
│ ├── input/
│ │ ├── close.rs
│ │ ├── complete.rs
│ │ ├── escape.rs
│ │ ├── mod.rs
│ │ └── show.rs
│ ├── lib.rs
│ ├── lives/
│ │ ├── core.rs
│ │ ├── file.rs
│ │ ├── files.rs
│ │ ├── filter.rs
│ │ ├── finder.rs
│ │ ├── folder.rs
│ │ ├── lives.rs
│ │ ├── mod.rs
│ │ ├── mode.rs
│ │ ├── preference.rs
│ │ ├── preview.rs
│ │ ├── ptr.rs
│ │ ├── selected.rs
│ │ ├── tab.rs
│ │ ├── tabs.rs
│ │ ├── task.rs
│ │ ├── tasks.rs
│ │ ├── which.rs
│ │ └── yanked.rs
│ ├── mgr/
│ │ ├── arrow.rs
│ │ ├── back.rs
│ │ ├── bulk_rename.rs
│ │ ├── cd.rs
│ │ ├── close.rs
│ │ ├── copy.rs
│ │ ├── create.rs
│ │ ├── displace.rs
│ │ ├── displace_do.rs
│ │ ├── download.rs
│ │ ├── enter.rs
│ │ ├── escape.rs
│ │ ├── filter.rs
│ │ ├── filter_do.rs
│ │ ├── find.rs
│ │ ├── find_arrow.rs
│ │ ├── find_do.rs
│ │ ├── follow.rs
│ │ ├── forward.rs
│ │ ├── hardlink.rs
│ │ ├── hidden.rs
│ │ ├── hover.rs
│ │ ├── leave.rs
│ │ ├── linemode.rs
│ │ ├── link.rs
│ │ ├── mod.rs
│ │ ├── open.rs
│ │ ├── open_do.rs
│ │ ├── paste.rs
│ │ ├── peek.rs
│ │ ├── quit.rs
│ │ ├── refresh.rs
│ │ ├── remove.rs
│ │ ├── rename.rs
│ │ ├── reveal.rs
│ │ ├── search.rs
│ │ ├── seek.rs
│ │ ├── shell.rs
│ │ ├── sort.rs
│ │ ├── spot.rs
│ │ ├── stash.rs
│ │ ├── suspend.rs
│ │ ├── tab_close.rs
│ │ ├── tab_create.rs
│ │ ├── tab_rename.rs
│ │ ├── tab_swap.rs
│ │ ├── tab_switch.rs
│ │ ├── toggle.rs
│ │ ├── toggle_all.rs
│ │ ├── unyank.rs
│ │ ├── update_files.rs
│ │ ├── update_mimes.rs
│ │ ├── update_paged.rs
│ │ ├── update_peeked.rs
│ │ ├── update_spotted.rs
│ │ ├── update_yanked.rs
│ │ ├── upload.rs
│ │ ├── visual_mode.rs
│ │ ├── watch.rs
│ │ └── yank.rs
│ ├── notify/
│ │ ├── mod.rs
│ │ ├── push.rs
│ │ └── tick.rs
│ ├── pick/
│ │ ├── arrow.rs
│ │ ├── close.rs
│ │ ├── mod.rs
│ │ └── show.rs
│ ├── spot/
│ │ ├── arrow.rs
│ │ ├── close.rs
│ │ ├── copy.rs
│ │ ├── mod.rs
│ │ └── swipe.rs
│ ├── tasks/
│ │ ├── arrow.rs
│ │ ├── cancel.rs
│ │ ├── close.rs
│ │ ├── inspect.rs
│ │ ├── mod.rs
│ │ ├── open_shell_compat.rs
│ │ ├── process_open.rs
│ │ ├── show.rs
│ │ └── update_succeed.rs
│ └── which/
│ ├── activate.rs
│ ├── dismiss.rs
│ └── mod.rs
├── yazi-adapter/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── adapter.rs
│ ├── adapters.rs
│ ├── drivers/
│ │ ├── chafa.rs
│ │ ├── iip.rs
│ │ ├── kgp.rs
│ │ ├── kgp_old.rs
│ │ ├── mod.rs
│ │ ├── sixel.rs
│ │ └── ueberzug.rs
│ ├── icc.rs
│ ├── image.rs
│ ├── info.rs
│ └── lib.rs
├── yazi-binding/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── access.rs
│ ├── calculator.rs
│ ├── cha.rs
│ ├── chan.rs
│ ├── chord_cow.rs
│ ├── color.rs
│ ├── composer.rs
│ ├── elements/
│ │ ├── align.rs
│ │ ├── area.rs
│ │ ├── bar.rs
│ │ ├── border.rs
│ │ ├── cell.rs
│ │ ├── clear.rs
│ │ ├── constraint.rs
│ │ ├── edge.rs
│ │ ├── elements.rs
│ │ ├── gauge.rs
│ │ ├── layout.rs
│ │ ├── line.rs
│ │ ├── list.rs
│ │ ├── mod.rs
│ │ ├── pad.rs
│ │ ├── pos.rs
│ │ ├── rect.rs
│ │ ├── renderable.rs
│ │ ├── row.rs
│ │ ├── span.rs
│ │ ├── table.rs
│ │ ├── text.rs
│ │ └── wrap.rs
│ ├── error.rs
│ ├── fd.rs
│ ├── file.rs
│ ├── handle.rs
│ ├── icon.rs
│ ├── id.rs
│ ├── image.rs
│ ├── input.rs
│ ├── iter.rs
│ ├── layer.rs
│ ├── lib.rs
│ ├── macros.rs
│ ├── mouse.rs
│ ├── path.rs
│ ├── permit.rs
│ ├── range.rs
│ ├── runtime.rs
│ ├── scheme.rs
│ ├── stage.rs
│ ├── style.rs
│ ├── url.rs
│ └── utils.rs
├── yazi-boot/
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ └── src/
│ ├── actions/
│ │ ├── actions.rs
│ │ ├── clear_cache.rs
│ │ ├── debug.rs
│ │ ├── mod.rs
│ │ ├── rustc.rs
│ │ ├── triple.rs
│ │ └── version.rs
│ ├── args.rs
│ ├── boot.rs
│ └── lib.rs
├── yazi-build/
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ └── src/
│ └── main.rs
├── yazi-cli/
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ └── src/
│ ├── args.rs
│ ├── dds/
│ │ ├── draw.rs
│ │ ├── exec.rs
│ │ ├── mod.rs
│ │ └── shot.rs
│ ├── main.rs
│ ├── package/
│ │ ├── add.rs
│ │ ├── delete.rs
│ │ ├── dependency.rs
│ │ ├── deploy.rs
│ │ ├── git.rs
│ │ ├── hash.rs
│ │ ├── install.rs
│ │ ├── mod.rs
│ │ ├── package.rs
│ │ └── upgrade.rs
│ └── shared/
│ ├── mod.rs
│ └── shared.rs
├── yazi-codegen/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ └── lib.rs
├── yazi-config/
│ ├── Cargo.toml
│ ├── README.md
│ ├── preset/
│ │ ├── README.md
│ │ ├── keymap-default.toml
│ │ ├── theme-dark.toml
│ │ ├── theme-light.toml
│ │ ├── vfs-default.toml
│ │ └── yazi-default.toml
│ └── src/
│ ├── icon.rs
│ ├── keymap/
│ │ ├── chord.rs
│ │ ├── cow.rs
│ │ ├── deserializers.rs
│ │ ├── key.rs
│ │ ├── keymap.rs
│ │ ├── mod.rs
│ │ └── rules.rs
│ ├── layout.rs
│ ├── lib.rs
│ ├── mgr/
│ │ ├── mgr.rs
│ │ ├── mod.rs
│ │ ├── mouse.rs
│ │ └── ratio.rs
│ ├── open/
│ │ ├── mod.rs
│ │ ├── open.rs
│ │ └── rule.rs
│ ├── opener/
│ │ ├── mod.rs
│ │ ├── opener.rs
│ │ └── rule.rs
│ ├── pattern.rs
│ ├── platform.rs
│ ├── plugin/
│ │ ├── fetcher.rs
│ │ ├── mod.rs
│ │ ├── plugin.rs
│ │ ├── preloader.rs
│ │ ├── previewer.rs
│ │ └── spotter.rs
│ ├── popup/
│ │ ├── confirm.rs
│ │ ├── input.rs
│ │ ├── mod.rs
│ │ ├── offset.rs
│ │ ├── options.rs
│ │ ├── origin.rs
│ │ ├── pick.rs
│ │ └── position.rs
│ ├── preset.rs
│ ├── preview/
│ │ ├── mod.rs
│ │ ├── preview.rs
│ │ └── wrap.rs
│ ├── priority.rs
│ ├── style.rs
│ ├── tasks/
│ │ ├── mod.rs
│ │ └── tasks.rs
│ ├── theme/
│ │ ├── filetype.rs
│ │ ├── flavor.rs
│ │ ├── icon.rs
│ │ ├── is.rs
│ │ ├── mod.rs
│ │ └── theme.rs
│ ├── utils.rs
│ ├── vfs/
│ │ ├── mod.rs
│ │ ├── service.rs
│ │ ├── services.rs
│ │ └── vfs.rs
│ ├── which/
│ │ ├── mod.rs
│ │ ├── sorting.rs
│ │ └── which.rs
│ └── yazi.rs
├── yazi-core/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── cmp/
│ │ ├── cmp.rs
│ │ └── mod.rs
│ ├── confirm/
│ │ ├── confirm.rs
│ │ └── mod.rs
│ ├── core.rs
│ ├── help/
│ │ ├── help.rs
│ │ └── mod.rs
│ ├── input/
│ │ ├── input.rs
│ │ └── mod.rs
│ ├── lib.rs
│ ├── mgr/
│ │ ├── mgr.rs
│ │ ├── mimetype.rs
│ │ ├── mod.rs
│ │ ├── tabs.rs
│ │ └── yanked.rs
│ ├── notify/
│ │ ├── message.rs
│ │ ├── mod.rs
│ │ └── notify.rs
│ ├── pick/
│ │ ├── mod.rs
│ │ └── pick.rs
│ ├── spot/
│ │ ├── mod.rs
│ │ └── spot.rs
│ ├── tab/
│ │ ├── backstack.rs
│ │ ├── finder.rs
│ │ ├── folder.rs
│ │ ├── history.rs
│ │ ├── mod.rs
│ │ ├── mode.rs
│ │ ├── preference.rs
│ │ ├── preview.rs
│ │ ├── selected.rs
│ │ └── tab.rs
│ ├── tasks/
│ │ ├── file.rs
│ │ ├── mod.rs
│ │ ├── prework.rs
│ │ ├── process.rs
│ │ └── tasks.rs
│ └── which/
│ ├── mod.rs
│ ├── sorter.rs
│ └── which.rs
├── yazi-dds/
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ └── src/
│ ├── client.rs
│ ├── ember/
│ │ ├── bulk.rs
│ │ ├── bye.rs
│ │ ├── cd.rs
│ │ ├── custom.rs
│ │ ├── delete.rs
│ │ ├── download.rs
│ │ ├── duplicate.rs
│ │ ├── ember.rs
│ │ ├── hey.rs
│ │ ├── hi.rs
│ │ ├── hover.rs
│ │ ├── load.rs
│ │ ├── mod.rs
│ │ ├── mount.rs
│ │ ├── move.rs
│ │ ├── rename.rs
│ │ ├── tab.rs
│ │ ├── trash.rs
│ │ └── yank.rs
│ ├── lib.rs
│ ├── macros.rs
│ ├── payload.rs
│ ├── pubsub.rs
│ ├── pump.rs
│ ├── sendable.rs
│ ├── server.rs
│ ├── spark/
│ │ ├── kind.rs
│ │ ├── mod.rs
│ │ └── spark.rs
│ ├── state.rs
│ └── stream.rs
├── yazi-emulator/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── brand.rs
│ ├── dimension.rs
│ ├── emulator.rs
│ ├── lib.rs
│ ├── mux.rs
│ └── unknown.rs
├── yazi-ffi/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── cf_dict.rs
│ ├── cf_string.rs
│ ├── disk_arbitration.rs
│ ├── io_kit.rs
│ └── lib.rs
├── yazi-fm/
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ └── src/
│ ├── app/
│ │ ├── app.rs
│ │ ├── mod.rs
│ │ └── render.rs
│ ├── cmp/
│ │ ├── cmp.rs
│ │ └── mod.rs
│ ├── confirm/
│ │ ├── body.rs
│ │ ├── buttons.rs
│ │ ├── confirm.rs
│ │ ├── list.rs
│ │ └── mod.rs
│ ├── dispatcher.rs
│ ├── executor.rs
│ ├── help/
│ │ ├── bindings.rs
│ │ ├── help.rs
│ │ └── mod.rs
│ ├── input/
│ │ ├── input.rs
│ │ └── mod.rs
│ ├── logs.rs
│ ├── main.rs
│ ├── mgr/
│ │ ├── mod.rs
│ │ ├── modal.rs
│ │ └── preview.rs
│ ├── notify/
│ │ ├── mod.rs
│ │ └── notify.rs
│ ├── panic.rs
│ ├── pick/
│ │ ├── list.rs
│ │ ├── mod.rs
│ │ └── pick.rs
│ ├── root.rs
│ ├── router.rs
│ ├── signals.rs
│ ├── spot/
│ │ ├── mod.rs
│ │ └── spot.rs
│ ├── tasks/
│ │ ├── list.rs
│ │ ├── mod.rs
│ │ ├── progress.rs
│ │ └── tasks.rs
│ └── which/
│ ├── cand.rs
│ ├── mod.rs
│ └── which.rs
├── yazi-fs/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── cha/
│ │ ├── cha.rs
│ │ ├── kind.rs
│ │ ├── mod.rs
│ │ ├── mode.rs
│ │ └── type.rs
│ ├── cwd.rs
│ ├── error/
│ │ ├── error.rs
│ │ ├── mod.rs
│ │ └── serde.rs
│ ├── file.rs
│ ├── files.rs
│ ├── filter.rs
│ ├── fns.rs
│ ├── hash.rs
│ ├── lib.rs
│ ├── mounts/
│ │ ├── linux.rs
│ │ ├── macos.rs
│ │ ├── mod.rs
│ │ ├── partition.rs
│ │ └── partitions.rs
│ ├── op.rs
│ ├── path/
│ │ ├── clean.rs
│ │ ├── expand.rs
│ │ ├── mod.rs
│ │ ├── path.rs
│ │ ├── percent.rs
│ │ └── relative.rs
│ ├── provider/
│ │ ├── attrs.rs
│ │ ├── capabilities.rs
│ │ ├── local/
│ │ │ ├── absolute.rs
│ │ │ ├── calculator.rs
│ │ │ ├── casefold.rs
│ │ │ ├── copier.rs
│ │ │ ├── dir_entry.rs
│ │ │ ├── gate.rs
│ │ │ ├── identical.rs
│ │ │ ├── local.rs
│ │ │ ├── mod.rs
│ │ │ └── read_dir.rs
│ │ ├── mod.rs
│ │ └── traits.rs
│ ├── scheme.rs
│ ├── sorter.rs
│ ├── sorting.rs
│ ├── splatter.rs
│ ├── stage.rs
│ ├── url.rs
│ └── xdg.rs
├── yazi-macro/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── actor.rs
│ ├── asset.rs
│ ├── context.rs
│ ├── event.rs
│ ├── fmt.rs
│ ├── fs.rs
│ ├── lib.rs
│ ├── log.rs
│ ├── module.rs
│ ├── platform.rs
│ ├── render.rs
│ └── stdio.rs
├── yazi-packing/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ └── lib.rs
├── yazi-parser/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── app/
│ │ ├── deprecate.rs
│ │ ├── mod.rs
│ │ ├── mouse.rs
│ │ ├── plugin.rs
│ │ ├── quit.rs
│ │ ├── reflow.rs
│ │ ├── resume.rs
│ │ ├── stop.rs
│ │ ├── title.rs
│ │ └── update_progress.rs
│ ├── arrow.rs
│ ├── cmp/
│ │ ├── close.rs
│ │ ├── mod.rs
│ │ ├── show.rs
│ │ └── trigger.rs
│ ├── confirm/
│ │ ├── close.rs
│ │ ├── mod.rs
│ │ └── show.rs
│ ├── help/
│ │ ├── mod.rs
│ │ └── toggle.rs
│ ├── input/
│ │ ├── close.rs
│ │ └── mod.rs
│ ├── lib.rs
│ ├── mgr/
│ │ ├── cd.rs
│ │ ├── close.rs
│ │ ├── copy.rs
│ │ ├── create.rs
│ │ ├── displace_do.rs
│ │ ├── download.rs
│ │ ├── escape.rs
│ │ ├── filter.rs
│ │ ├── find.rs
│ │ ├── find_arrow.rs
│ │ ├── find_do.rs
│ │ ├── hardlink.rs
│ │ ├── hidden.rs
│ │ ├── hover.rs
│ │ ├── linemode.rs
│ │ ├── link.rs
│ │ ├── mod.rs
│ │ ├── open.rs
│ │ ├── open_do.rs
│ │ ├── paste.rs
│ │ ├── peek.rs
│ │ ├── remove.rs
│ │ ├── rename.rs
│ │ ├── reveal.rs
│ │ ├── search.rs
│ │ ├── seek.rs
│ │ ├── shell.rs
│ │ ├── sort.rs
│ │ ├── spot.rs
│ │ ├── stash.rs
│ │ ├── tab_close.rs
│ │ ├── tab_create.rs
│ │ ├── tab_rename.rs
│ │ ├── tab_switch.rs
│ │ ├── toggle.rs
│ │ ├── toggle_all.rs
│ │ ├── update_files.rs
│ │ ├── update_mimes.rs
│ │ ├── update_paged.rs
│ │ ├── update_peeked.rs
│ │ ├── update_spotted.rs
│ │ ├── update_yanked.rs
│ │ ├── upload.rs
│ │ ├── visual_mode.rs
│ │ └── yank.rs
│ ├── notify/
│ │ ├── mod.rs
│ │ ├── push.rs
│ │ └── tick.rs
│ ├── pick/
│ │ ├── close.rs
│ │ ├── mod.rs
│ │ └── show.rs
│ ├── spot/
│ │ ├── copy.rs
│ │ └── mod.rs
│ ├── tasks/
│ │ ├── mod.rs
│ │ ├── process_open.rs
│ │ └── update_succeed.rs
│ ├── void.rs
│ └── which/
│ ├── activate.rs
│ └── mod.rs
├── yazi-plugin/
│ ├── Cargo.toml
│ ├── README.md
│ ├── preset/
│ │ ├── compat.lua
│ │ ├── components/
│ │ │ ├── current.lua
│ │ │ ├── entity.lua
│ │ │ ├── header.lua
│ │ │ ├── linemode.lua
│ │ │ ├── marker.lua
│ │ │ ├── modal.lua
│ │ │ ├── parent.lua
│ │ │ ├── preview.lua
│ │ │ ├── progress.lua
│ │ │ ├── rail.lua
│ │ │ ├── root.lua
│ │ │ ├── status.lua
│ │ │ ├── tab.lua
│ │ │ ├── tabs.lua
│ │ │ └── tasks.lua
│ │ ├── plugins/
│ │ │ ├── archive.lua
│ │ │ ├── code.lua
│ │ │ ├── dds.lua
│ │ │ ├── empty.lua
│ │ │ ├── extract.lua
│ │ │ ├── file.lua
│ │ │ ├── folder.lua
│ │ │ ├── font.lua
│ │ │ ├── fzf.lua
│ │ │ ├── image.lua
│ │ │ ├── init.lua
│ │ │ ├── json.lua
│ │ │ ├── magick.lua
│ │ │ ├── mime-dir.lua
│ │ │ ├── mime-local.lua
│ │ │ ├── mime-remote.lua
│ │ │ ├── mime.lua
│ │ │ ├── multi.lua
│ │ │ ├── noop.lua
│ │ │ ├── null.lua
│ │ │ ├── pdf.lua
│ │ │ ├── session.lua
│ │ │ ├── svg.lua
│ │ │ ├── vfs.lua
│ │ │ ├── video.lua
│ │ │ └── zoxide.lua
│ │ ├── setup.lua
│ │ └── ya.lua
│ └── src/
│ ├── elements/
│ │ ├── elements.rs
│ │ └── mod.rs
│ ├── external/
│ │ ├── fd.rs
│ │ ├── highlighter.rs
│ │ ├── mod.rs
│ │ ├── rg.rs
│ │ └── rga.rs
│ ├── fs/
│ │ ├── fs.rs
│ │ ├── mod.rs
│ │ └── op.rs
│ ├── isolate/
│ │ ├── entry.rs
│ │ ├── fetch.rs
│ │ ├── isolate.rs
│ │ ├── mod.rs
│ │ ├── peek.rs
│ │ ├── preload.rs
│ │ ├── seek.rs
│ │ └── spot.rs
│ ├── lib.rs
│ ├── loader/
│ │ ├── chunk.rs
│ │ ├── loader.rs
│ │ ├── mod.rs
│ │ └── require.rs
│ ├── lua.rs
│ ├── process/
│ │ ├── child.rs
│ │ ├── command.rs
│ │ ├── mod.rs
│ │ ├── output.rs
│ │ ├── process.rs
│ │ └── status.rs
│ ├── pubsub/
│ │ ├── mod.rs
│ │ └── pubsub.rs
│ ├── runtime/
│ │ ├── mod.rs
│ │ ├── plugin.rs
│ │ ├── runtime.rs
│ │ └── term.rs
│ ├── theme/
│ │ ├── mod.rs
│ │ └── theme.rs
│ └── utils/
│ ├── app.rs
│ ├── cache.rs
│ ├── call.rs
│ ├── image.rs
│ ├── json.rs
│ ├── layer.rs
│ ├── log.rs
│ ├── mod.rs
│ ├── preview.rs
│ ├── process.rs
│ ├── spot.rs
│ ├── sync.rs
│ ├── target.rs
│ ├── text.rs
│ ├── time.rs
│ ├── user.rs
│ └── utils.rs
├── yazi-proxy/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── app.rs
│ ├── cmp.rs
│ ├── confirm.rs
│ ├── input.rs
│ ├── lib.rs
│ ├── macros.rs
│ ├── mgr.rs
│ ├── notify.rs
│ ├── pick.rs
│ ├── tasks.rs
│ └── which.rs
├── yazi-scheduler/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── fetch/
│ │ ├── fetch.rs
│ │ ├── in.rs
│ │ ├── mod.rs
│ │ ├── out.rs
│ │ └── progress.rs
│ ├── file/
│ │ ├── file.rs
│ │ ├── in.rs
│ │ ├── macros.rs
│ │ ├── mod.rs
│ │ ├── out.rs
│ │ ├── progress.rs
│ │ ├── transaction.rs
│ │ └── traverse.rs
│ ├── hook/
│ │ ├── hook.rs
│ │ ├── in.rs
│ │ ├── macros.rs
│ │ └── mod.rs
│ ├── lib.rs
│ ├── macros.rs
│ ├── ongoing.rs
│ ├── op.rs
│ ├── out.rs
│ ├── plugin/
│ │ ├── in.rs
│ │ ├── macros.rs
│ │ ├── mod.rs
│ │ ├── out.rs
│ │ ├── plugin.rs
│ │ └── progress.rs
│ ├── preload/
│ │ ├── in.rs
│ │ ├── mod.rs
│ │ ├── out.rs
│ │ ├── preload.rs
│ │ └── progress.rs
│ ├── process/
│ │ ├── in.rs
│ │ ├── macros.rs
│ │ ├── mod.rs
│ │ ├── out.rs
│ │ ├── process.rs
│ │ ├── progress.rs
│ │ └── shell.rs
│ ├── progress.rs
│ ├── runner.rs
│ ├── scheduler.rs
│ ├── size/
│ │ ├── in.rs
│ │ ├── mod.rs
│ │ ├── out.rs
│ │ ├── progress.rs
│ │ └── size.rs
│ ├── snap.rs
│ └── task.rs
├── yazi-sftp/
│ ├── Cargo.toml
│ ├── LICENSE
│ ├── README.md
│ └── src/
│ ├── de.rs
│ ├── error.rs
│ ├── fs/
│ │ ├── attrs.rs
│ │ ├── dir_entry.rs
│ │ ├── file.rs
│ │ ├── flags.rs
│ │ ├── mod.rs
│ │ └── read_dir.rs
│ ├── id.rs
│ ├── lib.rs
│ ├── macros.rs
│ ├── operator.rs
│ ├── packet.rs
│ ├── path.rs
│ ├── receiver.rs
│ ├── requests/
│ │ ├── close.rs
│ │ ├── extended.rs
│ │ ├── fstat.rs
│ │ ├── init.rs
│ │ ├── lstat.rs
│ │ ├── mkdir.rs
│ │ ├── mod.rs
│ │ ├── open.rs
│ │ ├── open_dir.rs
│ │ ├── read.rs
│ │ ├── read_dir.rs
│ │ ├── readlink.rs
│ │ ├── realpath.rs
│ │ ├── remove.rs
│ │ ├── rename.rs
│ │ ├── rmdir.rs
│ │ ├── set_stat.rs
│ │ ├── stat.rs
│ │ ├── symlink.rs
│ │ └── write.rs
│ ├── responses/
│ │ ├── attrs.rs
│ │ ├── data.rs
│ │ ├── extended.rs
│ │ ├── handle.rs
│ │ ├── mod.rs
│ │ ├── name.rs
│ │ ├── status.rs
│ │ └── version.rs
│ ├── ser.rs
│ └── session.rs
├── yazi-shared/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── alias.rs
│ ├── bytes.rs
│ ├── chars.rs
│ ├── completion_token.rs
│ ├── condition.rs
│ ├── data/
│ │ ├── any.rs
│ │ ├── data.rs
│ │ ├── de.rs
│ │ ├── key.rs
│ │ └── mod.rs
│ ├── debounce.rs
│ ├── env.rs
│ ├── errors/
│ │ ├── mod.rs
│ │ └── peek.rs
│ ├── event/
│ │ ├── action.rs
│ │ ├── cow.rs
│ │ ├── event.rs
│ │ └── mod.rs
│ ├── id.rs
│ ├── last_value.rs
│ ├── layer.rs
│ ├── lib.rs
│ ├── loc/
│ │ ├── able.rs
│ │ ├── buf.rs
│ │ ├── loc.rs
│ │ └── mod.rs
│ ├── localset.rs
│ ├── natsort.rs
│ ├── os.rs
│ ├── path/
│ │ ├── buf.rs
│ │ ├── component.rs
│ │ ├── components.rs
│ │ ├── conversion.rs
│ │ ├── cow.rs
│ │ ├── display.rs
│ │ ├── error.rs
│ │ ├── kind.rs
│ │ ├── like.rs
│ │ ├── mod.rs
│ │ ├── path.rs
│ │ └── view.rs
│ ├── pool/
│ │ ├── cow.rs
│ │ ├── mod.rs
│ │ ├── pool.rs
│ │ ├── ptr.rs
│ │ ├── symbol.rs
│ │ └── traits.rs
│ ├── predictor.rs
│ ├── ro_cell.rs
│ ├── scheme/
│ │ ├── cow.rs
│ │ ├── encode.rs
│ │ ├── kind.rs
│ │ ├── mod.rs
│ │ ├── ref.rs
│ │ ├── scheme.rs
│ │ └── traits.rs
│ ├── shell/
│ │ ├── error.rs
│ │ ├── mod.rs
│ │ ├── unix.rs
│ │ └── windows.rs
│ ├── source.rs
│ ├── strand/
│ │ ├── buf.rs
│ │ ├── conversion.rs
│ │ ├── cow.rs
│ │ ├── error.rs
│ │ ├── extensions.rs
│ │ ├── kind.rs
│ │ ├── like.rs
│ │ ├── mod.rs
│ │ ├── strand.rs
│ │ └── view.rs
│ ├── sync_cell.rs
│ ├── terminal.rs
│ ├── tests.rs
│ ├── throttle.rs
│ ├── time.rs
│ ├── translit/
│ │ ├── mod.rs
│ │ ├── table.rs
│ │ └── traits.rs
│ ├── url/
│ │ ├── buf.rs
│ │ ├── component.rs
│ │ ├── components.rs
│ │ ├── cov.rs
│ │ ├── cow.rs
│ │ ├── display.rs
│ │ ├── encode.rs
│ │ ├── like.rs
│ │ ├── mod.rs
│ │ ├── traits.rs
│ │ └── url.rs
│ ├── utf8.rs
│ └── wtf8/
│ ├── mod.rs
│ ├── validator.rs
│ └── wtf8.rs
├── yazi-shim/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── crossterm/
│ │ ├── if.rs
│ │ ├── mod.rs
│ │ ├── restore_background.rs
│ │ ├── restore_cursor.rs
│ │ └── set_background.rs
│ ├── lib.rs
│ ├── ratatui/
│ │ ├── mod.rs
│ │ └── paragraph.rs
│ └── twox.rs
├── yazi-term/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── lib.rs
│ ├── option.rs
│ ├── semaphore.rs
│ ├── state.rs
│ └── term.rs
├── yazi-tty/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── handle.rs
│ ├── lib.rs
│ ├── tty.rs
│ └── windows.rs
├── yazi-vfs/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── cha.rs
│ ├── file.rs
│ ├── files.rs
│ ├── fns.rs
│ ├── lib.rs
│ ├── op.rs
│ └── provider/
│ ├── calculator.rs
│ ├── copier.rs
│ ├── dir_entry.rs
│ ├── gate.rs
│ ├── mod.rs
│ ├── provider.rs
│ ├── providers.rs
│ ├── read_dir.rs
│ ├── rw_file.rs
│ └── sftp/
│ ├── absolute.rs
│ ├── conn.rs
│ ├── gate.rs
│ ├── metadata.rs
│ ├── mod.rs
│ ├── read_dir.rs
│ └── sftp.rs
├── yazi-watcher/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── backend.rs
│ ├── lib.rs
│ ├── local/
│ │ ├── linked.rs
│ │ ├── local.rs
│ │ └── mod.rs
│ ├── remote/
│ │ ├── mod.rs
│ │ └── remote.rs
│ ├── reporter.rs
│ ├── watched.rs
│ ├── watchee.rs
│ └── watcher.rs
└── yazi-widgets/
├── Cargo.toml
├── README.md
└── src/
├── clear.rs
├── clipboard.rs
├── input/
│ ├── actor/
│ │ ├── actor.rs
│ │ ├── backspace.rs
│ │ ├── backward.rs
│ │ ├── casefy.rs
│ │ ├── complete.rs
│ │ ├── delete.rs
│ │ ├── escape.rs
│ │ ├── forward.rs
│ │ ├── insert.rs
│ │ ├── kill.rs
│ │ ├── mod.rs
│ │ ├── move.rs
│ │ ├── paste.rs
│ │ ├── redo.rs
│ │ ├── replace.rs
│ │ ├── type.rs
│ │ ├── undo.rs
│ │ ├── visual.rs
│ │ └── yank.rs
│ ├── event.rs
│ ├── input.rs
│ ├── mod.rs
│ ├── mode.rs
│ ├── op.rs
│ ├── opt.rs
│ ├── parser/
│ │ ├── backspace.rs
│ │ ├── backward.rs
│ │ ├── casefy.rs
│ │ ├── complete.rs
│ │ ├── delete.rs
│ │ ├── forward.rs
│ │ ├── insert.rs
│ │ ├── kill.rs
│ │ ├── mod.rs
│ │ ├── move.rs
│ │ └── paste.rs
│ ├── separator.rs
│ ├── snap.rs
│ ├── snaps.rs
│ └── widget.rs
├── lib.rs
├── scrollable.rs
└── step.rs
================================================
FILE CONTENTS
================================================
================================================
FILE: .cargo/config.toml
================================================
[env]
MACOSX_DEPLOYMENT_TARGET = "10.12"
JEMALLOC_SYS_WITH_LG_PAGE = "16"
# environment variable for tikv-jemalloc-sys
#
# https://jemalloc.net/jemalloc.3.html#opt.narenas
# narenas is the maximum number of arenas to use for automatic multiplexing
# of threads and arenas. The default is four times the number of CPUs,
# or one if there is a single CPU.
#
# Improve memory efficiency by reducing fragmentation and ensuring all threads allocate from the same pool
JEMALLOC_SYS_WITH_MALLOC_CONF = "narenas:1"
[target.aarch64-apple-darwin]
rustflags = [ "-Ctarget-cpu=apple-m1" ]
================================================
FILE: .envrc
================================================
use flake
================================================
FILE: .github/DISCUSSION_TEMPLATE/1-q-a.yml
================================================
body:
- type: dropdown
id: os
attributes:
label: What system are you running Yazi on?
options:
- Linux X11
- Linux Wayland
- macOS
- Windows
- Windows WSL
- FreeBSD X11
- FreeBSD Wayland
- Android
validations:
required: true
- type: input
id: terminal
attributes:
label: What terminal are you running Yazi in?
placeholder: "ex: kitty v0.32.2"
validations:
required: true
- type: textarea
id: debug
attributes:
label: "`yazi --debug` output"
description: Please run `yazi --debug` and paste the debug information here.
render: Shell
validations:
required: true
- type: textarea
id: description
attributes:
label: Describe the question
description: A clear and concise description of what the question is
placeholder: Tell us what you want to know
validations:
required: true
- type: textarea
id: other
attributes:
label: Anything else?
description: |
Add any other context about the problem here. You can attach screenshots by clicking
this area to highlight it and then drag the files in.
- type: checkboxes
id: checklist
attributes:
label: Checklist
description: Before submitting the post, please make sure you have completed the following
options:
- label: I have read all the documentation
required: true
- label: I have searched the existing discussions/issues
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/bug.yml
================================================
name: 🐞 Bug Report
description: Create a report to help us improve
labels: [bug]
assignees: []
body:
- type: dropdown
id: os
attributes:
label: What system are you running Yazi on?
options:
- Linux X11
- Linux Wayland
- macOS
- Windows
- Windows WSL
- FreeBSD X11
- FreeBSD Wayland
- Android
validations:
required: true
- type: input
id: terminal
attributes:
label: What terminal are you running Yazi in?
placeholder: "ex: kitty v0.32.2"
validations:
required: true
- type: textarea
id: debug
attributes:
label: "`yazi --debug` output"
description: Please run `yazi --debug` and paste the debug information here.
render: Shell
validations:
required: true
- type: textarea
id: description
attributes:
label: Describe the bug
description: A clear and concise description of what the bug is
placeholder: Tell us what happened
validations:
required: true
- type: textarea
id: reproducer
attributes:
label: Minimal reproducer
description: A [minimal reproducer](https://stackoverflow.com/help/minimal-reproducible-example) is required, otherwise the issue might be closed without further notice.
placeholder: |
Please include as much information as possible that can help to reproduce and understand the issue.
validations:
required: true
- type: textarea
id: other
attributes:
label: Anything else?
description: |
Add any other context about the problem here. You can attach screenshots by clicking
this area to highlight it and then drag the files in.
- type: checkboxes
id: checklist
attributes:
label: Checklist
description: Before submitting the issue, please make sure you have completed the following
options:
- label: I tried the [latest nightly build](https://yazi-rs.github.io/docs/installation#binaries), and the issue is still reproducible
required: true
- label: I updated the debug information (`yazi --debug`) input box to the nightly that I tried
required: true
- label: I can reproduce it after disabling all custom configs/plugins (`mv ~/.config/yazi ~/.config/yazi-backup`)
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: 🚧 Build Issues
url: https://github.com/sxyazi/yazi/discussions/new?category=3-build-issues
about: If you have issues building Yazi from source code
- name: 📝 Documentation Improvement
url: https://github.com/yazi-rs/yazi-rs.github.io
about: If you'd like to help improve the documentation
- name: 💬 GitHub Discussions
url: https://github.com/sxyazi/yazi/discussions/new?category=1-q-a
about: When you have questions that are not bug reports or feature requests
- name: 🌐 Discord Server / Telegram Group
url: https://github.com/sxyazi/yazi#discussion
about: If you'd prefer more realtime conversation with the community
================================================
FILE: .github/ISSUE_TEMPLATE/feature.yml
================================================
name: 💡 Feature Request
description: Suggest an idea for this project
labels: [feature]
assignees: []
body:
- type: textarea
id: debug
attributes:
label: "`yazi --debug` output"
description: Please run `yazi --debug` and paste the debug information here.
render: Shell
validations:
required: true
- type: textarea
id: problem
attributes:
label: Please describe the problem you're trying to solve
description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
validations:
required: true
- type: checkboxes
id: contribute
attributes:
label: Would you be willing to contribute this feature?
description: The feature has a much higher chance of completion if you are willing to get involved!
options:
- label: Yes, I'll give it a shot
- type: textarea
id: solution
attributes:
label: Describe the solution you'd like
description: A clear and concise description of what you want to happen.
validations:
required: true
- type: textarea
id: context
attributes:
label: Additional context
description: Add any other context or screenshots about the feature request here.
- type: checkboxes
id: checklist
attributes:
label: Checklist
description: Before submitting the issue, please make sure you have completed the following
options:
- label: I have searched the existing issues/discussions
required: true
- label: The [latest nightly build](https://yazi-rs.github.io/docs/installation/#binaries) doesn't already have this feature
required: true
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
commit-message:
prefix: "ci"
- package-ecosystem: "npm"
directory: "/scripts/validate-form"
schedule:
interval: "weekly"
commit-message:
prefix: "ci"
================================================
FILE: .github/pull_request_template.md
================================================
## Which issue does this PR resolve?
<!--
For any fixes and enhancements, we usually require an associated issue to be filed where clearly detailed your proposed changes and why they are necessary, which ensures we are aligned and reduces the risk of re-work.
You can use GitHub syntax to link an issue to this PR, such as `Resolves #1000`, which indicates this PR will resolve issue #1000.
-->
Resolves #
## Rationale of this PR
<!--
A clear and concise description of the rationale of the changes, to help our reviewers understand your intent and why it is necessary.
If it has already been detailed in the associated issue, please skip this section.
-->
================================================
FILE: .github/workflows/cachix.yml
================================================
name: Cachix
on:
push:
branches: [main]
permissions:
contents: read
jobs:
publish:
name: Publish Flake
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v6
- name: Install Nix
uses: cachix/install-nix-action@v31
- name: Authenticate with Cachix
uses: cachix/cachix-action@v16
with:
name: yazi
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
- name: Build Flake
run: nix build -L
================================================
FILE: .github/workflows/check.yml
================================================
name: Check
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
SCCACHE_GHA_ENABLED: true
RUSTC_WRAPPER: sccache
permissions:
contents: read
jobs:
clippy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup Rust toolchain
run: |
rustup toolchain install stable --profile minimal
rustup component add clippy
- name: Setup sccache
uses: mozilla-actions/sccache-action@v0.0.9
- name: Clippy
run: cargo clippy --all
rustfmt:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup Rust toolchain
run: |
rustup toolchain install nightly --profile minimal
rustup component add rustfmt --toolchain nightly
- name: Setup sccache
uses: mozilla-actions/sccache-action@v0.0.9
- name: Rustfmt
run: rustfmt +nightly --check **/*.rs
stylua:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
- uses: JohnnyMorganz/stylua-action@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
version: latest
args: --color always --check .
================================================
FILE: .github/workflows/draft.yml
================================================
name: Draft
on:
push:
branches: [main]
tags: ["v[0-9]+.[0-9]+.[0-9]+"]
workflow_dispatch:
env:
SCCACHE_GHA_ENABLED: true
permissions:
contents: read
jobs:
build-unix:
strategy:
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
- os: ubuntu-latest
target: aarch64-unknown-linux-gnu
gcc: gcc-aarch64-linux-gnu
- os: ubuntu-latest
target: i686-unknown-linux-gnu
gcc: gcc-i686-linux-gnu
- os: ubuntu-latest
target: riscv64gc-unknown-linux-gnu
gcc: gcc-riscv64-linux-gnu
- os: ubuntu-latest
target: sparc64-unknown-linux-gnu
gcc: gcc-sparc64-linux-gnu
- os: macos-latest
target: x86_64-apple-darwin
- os: macos-latest
target: aarch64-apple-darwin
runs-on: ${{ matrix.os }}
env:
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc
CARGO_TARGET_I686_UNKNOWN_LINUX_GNU_LINKER: i686-linux-gnu-gcc
CARGO_TARGET_RISCV64GC_UNKNOWN_LINUX_GNU_LINKER: riscv64-linux-gnu-gcc
CARGO_TARGET_SPARC64_UNKNOWN_LINUX_GNU_LINKER: sparc64-linux-gnu-gcc
steps:
- uses: actions/checkout@v6
- name: Install gcc
if: matrix.gcc != ''
run: sudo apt update && sudo apt install -yq ${{ matrix.gcc }}
- uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Setup sccache
uses: mozilla-actions/sccache-action@v0.0.9
- name: Build
run: ./scripts/build.sh ${{ matrix.target }}
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: ${{ matrix.target }}
path: |
yazi-${{ matrix.target }}.zip
yazi-${{ matrix.target }}.deb
build-windows:
strategy:
matrix:
include:
- os: windows-latest
target: x86_64-pc-windows-msvc
- os: windows-latest
target: aarch64-pc-windows-msvc
runs-on: ${{ matrix.os }}
env:
RUSTC_WRAPPER: sccache
YAZI_GEN_COMPLETIONS: true
CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_LINKER: lld-link.exe
CARGO_TARGET_AARCH64_PC_WINDOWS_MSVC_LINKER: lld-link.exe
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Setup sccache
uses: mozilla-actions/sccache-action@v0.0.9
- name: Build
run: cargo build --profile release-windows --locked --target ${{ matrix.target }}
- name: Pack artifact
env:
TARGET_NAME: yazi-${{ matrix.target }}
run: |
New-Item -ItemType Directory -Path ${env:TARGET_NAME}
Copy-Item -Path "target\${{ matrix.target }}\release-windows\ya.exe" -Destination ${env:TARGET_NAME}
Copy-Item -Path "target\${{ matrix.target }}\release-windows\yazi.exe" -Destination ${env:TARGET_NAME}
Copy-Item -Path "yazi-boot\completions" -Destination ${env:TARGET_NAME} -Recurse
Copy-Item -Path "README.md", "LICENSE" -Destination ${env:TARGET_NAME}
Compress-Archive -Path ${env:TARGET_NAME} -DestinationPath "${env:TARGET_NAME}.zip"
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: ${{ matrix.target }}
path: yazi-${{ matrix.target }}.zip
build-musl:
runs-on: ubuntu-latest
strategy:
matrix:
include:
- target: x86_64-unknown-linux-musl
- target: aarch64-unknown-linux-musl
container:
image: docker://ghcr.io/cross-rs/${{ matrix.target }}:edge
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Setup sccache
uses: mozilla-actions/sccache-action@v0.0.9
- name: Build
run: ./scripts/build.sh ${{ matrix.target }}
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: ${{ matrix.target }}
path: |
yazi-${{ matrix.target }}.zip
yazi-${{ matrix.target }}.deb
build-snap:
strategy:
matrix:
include:
- os: ubuntu-latest
arch: amd64
- os: ubuntu-24.04-arm
arch: arm64
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup LXD
uses: canonical/setup-lxd@v1
- name: Setup snapcraft
run: sudo snap install --classic snapcraft
- name: Build snap
run: snapcraft --verbose
- name: Rename snap
run: mv yazi_*.snap yazi-${{ matrix.arch }}.snap
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: snap-${{ matrix.arch }}
path: yazi-${{ matrix.arch }}.snap
snap:
runs-on: ubuntu-latest
needs: [build-snap]
steps:
- uses: actions/download-artifact@v8
with:
pattern: snap-*
merge-multiple: true
- name: Setup snapcraft
run: sudo snap install --classic snapcraft
- name: Push snap to candidate channel
if: startsWith(github.ref, 'refs/tags/')
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_TOKEN }}
run: |
parallel 'snapcraft upload -v --release latest/candidate {}' ::: yazi-*.snap || true
- name: Push snap to edge channel
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_TOKEN }}
run: |
parallel 'snapcraft upload -v --release latest/edge {}' ::: yazi-*.snap || true
draft:
if: startsWith(github.ref, 'refs/tags/')
permissions:
contents: write
runs-on: ubuntu-latest
needs: [build-unix, build-windows, build-musl, build-snap]
steps:
- uses: actions/download-artifact@v8
with:
merge-multiple: true
- name: Draft
uses: softprops/action-gh-release@v2
with:
draft: true
files: |
yazi-*.zip
yazi-*.deb
yazi-*.snap
generate_release_notes: true
nightly:
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
permissions:
contents: write
runs-on: ubuntu-latest
needs: [build-unix, build-windows, build-musl, build-snap]
steps:
- run: |
echo 'NIGHTLY_BODY<<EOF' >> $GITHUB_ENV
echo "From commit: ${GITHUB_SHA:0:8}" >> $GITHUB_ENV
echo "Generated on: $(date -u +"%Y-%m-%d %H:%M") UTC" >> $GITHUB_ENV
echo "Nightly changelog: https://github.com/sxyazi/yazi/blob/main/CHANGELOG.md#unreleased" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
- uses: actions/checkout@v6
- uses: actions/download-artifact@v8
with:
merge-multiple: true
- name: Update the tag
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git tag --force nightly && git push --force origin tag nightly
- name: Nightly
uses: softprops/action-gh-release@v2
with:
tag_name: nightly
prerelease: true
files: |
yazi-*.zip
yazi-*.deb
yazi-*.snap
name: Nightly Build
body: ${{ env.NIGHTLY_BODY }}
target_commitish: ${{ github.sha }}
================================================
FILE: .github/workflows/lock.yml
================================================
name: Lock Threads
on:
schedule:
- cron: "5 3 * * *"
workflow_dispatch:
concurrency:
group: lock
jobs:
lock:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
discussions: write
steps:
- uses: dessant/lock-threads@v6
with:
issue-inactive-days: "30"
issue-comment: >
I'm going to lock this issue because it has been closed for _30 days_. ⏳
This helps our maintainers find and focus on the active issues.
If you have found a problem that seems similar to this, please file a new
issue and complete the issue template so we can capture all the details
necessary to investigate further.
pr-inactive-days: "30"
discussion-inactive-days: "30"
process-only: "issues,prs,discussions"
================================================
FILE: .github/workflows/no-response.yml
================================================
name: No Response
on:
issue_comment:
types: [created]
schedule:
- cron: "10 * * * *"
jobs:
no-response:
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- uses: lee-dohm/no-response@v0.5.0
with:
token: ${{ github.token }}
daysUntilClose: 7
responseRequiredLabel: waiting on op
================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish
on:
release:
types: [published]
permissions:
contents: read
jobs:
winget:
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v8
with:
merge-multiple: true
- name: Publish to Winget
uses: vedantmgoyal9/winget-releaser@main
with:
identifier: sxyazi.yazi
installers-regex: 'yazi-(x86_64|aarch64)-pc-windows-msvc\.zip$'
token: ${{ secrets.WINGET_TOKEN }}
snapcraft:
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v8
with:
merge-multiple: true
- name: Promote snap to stable
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_TOKEN }}
run: |
sudo snap install --classic snapcraft
snapcraft promote yazi --from-channel latest/candidate --to-channel latest/stable --yes
================================================
FILE: .github/workflows/test.yml
================================================
name: Test
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
SCCACHE_GHA_ENABLED: true
RUSTC_WRAPPER: sccache
CARGO_TERM_COLOR: always
permissions:
contents: read
jobs:
test:
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v6
- name: Setup Rust toolchain
run: rustup toolchain install stable --profile minimal
- name: Setup sccache
uses: mozilla-actions/sccache-action@v0.0.9
- name: Build
run: cargo build --verbose
- name: Test
run: cargo test --workspace --verbose
================================================
FILE: .github/workflows/validate-form.yml
================================================
name: Validate Form
on:
issues:
types: [opened, edited]
schedule:
- cron: "20 * * * *"
jobs:
check-version:
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- uses: actions/checkout@v6
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 20
- name: Install Dependencies
run: |
cd scripts/validate-form
npm ci
- name: Validate Form
uses: actions/github-script@v8
with:
script: |
const script = require('./scripts/validate-form/main.js')
await script({github, context, core})
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .gitignore
================================================
target/
yazi-*/completions
node_modules/
.DS_Store
result
result-*
.direnv
.idea/
.vscode/
*.snap
================================================
FILE: .luarc.json
================================================
{
"$schema": "https://raw.githubusercontent.com/LuaLS/vscode-lua/master/setting/schema.json",
"runtime.version": "Lua 5.5",
"runtime.special": {
"fail": "error"
},
"workspace.library": ["~/.config/yazi/plugins/types.yazi/"],
"diagnostics.disable": ["redefined-local"]
}
================================================
FILE: CHANGELOG.md
================================================
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/):
- `Added` for new features.
- `Changed` for changes in existing functionality.
- `Deprecated` for soon-to-be removed features.
- `Fixed` for any bug fixes.
- `Improved` for performance improvements.
## [Unreleased]
### Added
- Custom tab name ([#3666])
- New `--in` for `search` action to set search directory ([#3696])
- Multi-file spotter ([#3733])
- Certificate authentication for SFTP VFS provider ([#3716])
- New `hovered` condition specifying different icons for hovered files ([#3728])
- Allow using `ps.sub()` in `init.lua` directly without a plugin ([#3638])
- New `ya.exec()` API and `ya exec` subcommand to execute an action and await its result ([#3780])
- New `sort_fallback` option to control fallback sorting behavior ([#3077])
- New `fs.access()` API to access the filesystem ([#3668])
- New `relay-notify-push` DDS event to customize the notification handler ([#3642])
- New `ind-app-title` DDS event to customize the app title ([#3684])
- New `ind-hidden` and `key-hidden` DDS events to change hidden status in Lua ([#3748])
- New `marker_symbol` option to specify the symbol used for marking files ([#3689])
- New `fs.unique()` creates a unique file or directory ([#3677])
- New `download` DDS event fires when remote files are downloaded ([#3687])
- New `ind-which-activate` DDS event to change the which component behavior ([#3608])
- New `hey` DDS event fires when static messages are restored from persistence ([#3725])
- New `cx.which` API to access the which component state ([#3617])
- New experimental `ya.co()` API that creates a coroutine ([#3757])
### Changed
- Upgrade Lua to 5.5 ([#3633])
- Change preset <kbd>t</kbd> for creating tabs to <kbd>t</kbd> ⇒ <kbd>t</kbd> to avoid conflict with new <kbd>t</kbd> ⇒ <kbd>r</kbd> for renaming tabs ([#3666])
- Remove `title_format` in favor of new `ind-app-title` DDS event for flexible title customization ([#3684])
- Remove `micro_workers` and `macro_workers` in favor of finer control over concurrent workers ([#3661])
### Deprecated
- Deprecate `fs.unique_name()` in favor of `fs.unique()` to fix a TOCTOU race condition ([#3677])
### Fixed
- Chafa v1.18.1 causes random ghost keypresses when previewing images ([#3678])
- Be a little defensive while parsing the output of `7zz -ba` ([#3744])
- Make `ya pkg` ignore default remote name in user Git config ([#3648])
- Archive extraction fails for target paths with non-ASCII characters on Windows ([#3607])
- Escape backslashes in ImageMagick font path parameter ([#3708])
### Improved
- Reduce memory allocations by using Lua 5.5 external strings ([#3634])
- Reuse previewed and spotted widgets when possible ([#3765])
## [v26.1.22]
### Added
- Tree view for the preset archive previewer ([#3525])
- Support compressed tarballs (`.tar.gz`, `.tar.bz2`, etc.) in the preset archive previewer ([#3518])
- Check and refresh the file list when the terminal gains focus ([#3561])
- Experimental module-level async support ([#3594])
- Disable ANSI escape sequences in `ya pkg` when stdout is not a TTY ([#3566])
- New `Path.os()` API creates an OS-native `Path` ([#3541])
### Fixed
- Smart-case in interactive `cd` broken due to a typo ([#3540])
- Fix shell formatting for non-spread opener rules ([#3532])
- `sort extension` excludes directories since only files have extensions ([#3582])
- Account for URL covariance in `Url:join()` ([#3514])
## [v26.1.4]
### Added
- Support VFS for preset previewers that rely on external commands ([#3477])
- Support 8-bit images in RGB, CIELAB, and GRAY color spaces ([#3358])
### Fixed
- `ya pkg` fails to write `package.toml` when the config directory does not exist ([#3482])
- A race condition generating unique filenames for concurrent file operations ([#3494])
## [v25.12.29]
### Added
- Remote file management ([#3396])
- Virtual file system ([#3034], [#3035], [#3094], [#3108], [#3187], [#3203])
- Shell formatting ([#3232])
- Multi-entry support for plugin system ([#3154])
- Zoom in or out of the preview image ([#2864])
- Improve the UX of the pick and input components ([#2906], [#2935])
- Show progress of each task in task manager ([#3121], [#3131], [#3134])
- New `fs.copy()` and `fs.rename()` APIs ([#3467])
- New experimental `ya.async()` API ([#3422])
- New `overall` option to set the overall background color ([#3317])
- Rounded corners for indicator bar ([#3419])
- New `bulk_rename` action always renames files with the editor ([#2984])
- `key-*` DDS events to allow changing or canceling user key events ([#3005], [#3037])
- New `--bg` specifying image background color in the preset SVG and ImageMagick previewers ([#3189])
- `filter` by full path (prefix + filename) in search view instead of just filename ([#2915])
- New `casefy` action for case conversion of the input content ([#3235])
- Allow dynamic adjustment of layout ratio via `rt.mgr.ratio` ([#2964])
- Support `.deb` packages ([#2807], [#3128], [#3209])
- Port several widespread GUI keys to the input component ([#2849])
- Support invalid UTF-8 paths throughout the codebase ([#2884], [#2889], [#2890], [#2895], [#3023], [#3290], [#3369])
- Allow upgrading only specific packages with `ya pkg` ([#2841])
- Respect the user's `image_filter` setting in the preset ImageMagick previewer ([#3286])
- New `duplicate` DDS event for copying files ([#3456])
- New `ind-sort` and `key-sort` DDS events to change sorting in Lua ([#3391])
- Allow custom mouse click behavior for individual files ([#2925])
- Display newlines in input as spaces to improve readability ([#2932])
- Fill in error messages if preview fails ([#2917], [#3383], [#3387])
- Search view shares file selection and yank state ([#2855])
- Offload mimetype fetching on opening files to the task scheduler ([#3141])
- Increase terminal response timeout to better tolerate slow SSH network environments ([#2843])
### Changed
- Rename `name` to `url` for open, fetchers, spotters, preloaders, previewers, filetype, and `globs` icon rules to support virtual file system ([#3034])
- Rename `mime` fetcher to `mime.local`, and introduce `mime.dir` fetcher to support folder MIME types ([#3222])
- Reclassify `hovered` and `preview_hovered` under `[mgr]` of `theme.toml` into `[indicator]` as `current` and `preview`, respectively ([#3419])
- Remove `$0` parameter in opener rules to make the `open` action work under empty directories ([#3226])
- Return `Path` instead of `Url` from `Url:strip_prefix()` and `File.link_to` to enforce type safety ([#3361], [#3385])
- Use `body` instead of the term `content` in confirmations ([#2921])
- Use `u16` instead of `u32` as the type of `max_width` and `max_height` options to avoid memory exhaustion ([#3313])
- Implement `__pairs` metamethod instead of `__index` for the callback argument of the `@yank` DDS event ([#2997])
### Deprecated
- Deprecate `$n`, `$@` (\*nix) and `%n`, `%*` (Windows) in `shell` action and opener rules in favor of new shell formatting ([#3232])
- Deprecate `ya.hide`, `ya.render`, and `ya.truncate` in favor of `ui.hide`, `ui.render`, and `ui.truncate` ([#2939])
- Deprecate `position` property of `ya.input()` in favor of `pos` to align with `ya.confirm()` and its type `ui.Pos` ([#2921])
- Deprecate `cx.tasks.progress` in favor of `cx.tasks.summary` ([#3131])
- Deprecate `frag` properly of `Url` in favor of `domain` ([#3034])
- Deprecate `ui.Rect.default` in favor of `ui.Rect {}` ([#2927])
### Fixed
- User-prepended open rules do not override presets ([#3360])
- Respect user's system media opener instead of hardcoding `mpv` ([#2959])
- Incorrect `$0` and `$@` parameters in `shell` action under empty directories ([#3225])
- Avoid appending a newline when reading clipboard contents ([#3059])
- Renew package `rev` only when it's empty ([#3200])
- Suspend only when there is a parent process ([#3008])
- Preserve open order for files with post-resolved MIME types ([#2931])
- A race condition in concurrent directory loading on a slow device ([#3271])
- Erase overlapping image portions when previewing errors ([#3067])
- Force Git checkout for plugin cache repositories ([#3169])
- Check compatibility when reusing previewer bytecode cache ([#3190])
- Disable kitty keyboard protocol on Windows due to `crossterm` inability to handle it ([#3250])
- Prevent quotes in file(1) arguments from being stripped under MSYS2 ([#3364])
- Expose `ya` CLI in the Snap build ([#2904])
- Fallback to `PollWatcher` for file changes watching on NetBSD ([#2941])
- Generate unique image IDs for Kgp to tolerate tmux ([#3038])
### Improved
- Make copy, cut, delete, link, hardlink, download, and upload tasks immediately cancellable ([#3429])
- Make preload tasks discardable ([#2875])
- Reduce file change event frequency ([#2820])
- Upload and download of a single file over SFTP in chunks concurrently ([#3393])
- Do not listen for file changes in inactive tabs ([#2958])
- Switch to a higher-performance hash algorithm ([#3083])
- Sequence-based rendering merge strategy ([#2861])
- Store only `Urn` instead of full `Url` in find results ([#2914])
- Zero-copy `UrlBuf` to `Url` conversion ([#3117])
- String interning to reduce memory usage of mimetype and URL domain ([#3084], [#3091])
- Do not pre-allocate memory for Lua tables ([#2879])
- Copy-on-write on command data, and avoid converting primitive types to strings thereby allocating memory ([#2862])
- Use `AnyUserData::type_id()` to reduce stack pushes ([#2834])
- App data instead of Lua registry to reduce stack pushes ([#2880])
## [v25.5.31]
### Fixed
- Expose `ui.Wrap` ([#2810])
- `forward --end-of-word` of the input should consider the mode's delta ([#2811])
- Make every effort to carry hidden states for dummy files ([#2814])
## [v25.5.28]
### Added
- Redesign tabs ([#2745])
- Support embedded cover for video preview ([#2640])
- Calculate real-time directory size in spotter ([#2695])
- Truncate long items in the file list ([#2754], [#2759], [#2778])
- Obscure input component for inputting passwords ([#2675])
- Improve path auto-completion results ([#2765])
- New `ya pkg` subcommand ([#2770])
- New `ya.emit()` API ([#2653])
- New `fs.calc_size()` API ([#2691])
- Allow custom exit code with `quit --code` ([#2609])
- New `--hovered` for the `copy` action ([#2709])
- `s` and `S` keybinds in the input component ([#2678])
- Limit memory usage for previewing large images ([#2602])
- Show error when image preview fails ([#2706])
- New `ui.Align`, `ui.Wrap`, and `ui.Edge` ([#2802])
- Make `ui.Line` renderable ([#2743])
- Checks in `ya pub` and `ya emit` subcommands to verify receiver exists and has necessary abilities ([#2696])
- Make the hover state for `reveal`, `sort`, and `hidden` actions stable ([#2657])
- New `--no-dummy` option for `reveal` action ([#2664])
- Fall back to `CSI 16 t` when PowerShell OpenSSH returns a fake terminal size ([#2636])
### Changed
- Deprecate `[manager]` in favor of `[mgr]` to make it consistent with other APIs ([#2803])
- Remove `tab_width` as it no longer needs to be set manually ([#2745])
- Move `tab_active` and `tab_inactive` to a dedicated `[tabs]` section ([#2745])
- Remove `sixel_fraction` as it's no longer needed ([#2707])
### Deprecated
- Deprecate `ya.mgr_emit()`, `ya.app_emit()` and `ya.input_emit()` ([#2653])
- Deprecate `ya.preview_widgets()` ([#2706])
- Deprecate the `Command:args()` method ([#2752])
- Deprecate the `ya pack` subcommand in favor of `ya pkg` ([#2770])
- Deprecate `LEFT`, `CENTER`, and `RIGHT` on `ui.Line` and `ui.Text` in favor of `ui.Align` ([#2802])
- Deprecate `NONE`, `TOP`, `RIGHT`, `BOTTOM`, `LEFT`, and `ALL` on `ui.Bar` and `ui.Border` in favor of `ui.Edge` ([#2802])
- Deprecate `WRAP_NO`, `WRAP` and `WRAP_TRIM` on `ui.Text` in favor of `ui.Wrap` ([#2802])
### Fixed
- Respect the user's `max_width` setting in the preset video previewer ([#2560])
- Reverse the mixing order of theme and flavor configuration ([#2594])
- No title is set when starts the first time ([#2700])
- `ya pub-to 0` checks if any peer is able to receive the message ([#2697])
- Detach background and orphan processes from the controlling terminal with `setsid()` ([#2723])
- Always try to create state directory before draining DDS data ([#2769])
- Avoid tmux interfering with kitty graphical sequences ([#2734])
### Improved
- Double directory size calculation speed ([#2683])
- 9x faster Sixel image preview ([#2707])
- Remove intermediate variables in natural sorting algorithm to avoid unnecessary allocation ([#2764])
- Avoid unnecessary memory allocation in `ya.truncate()` ([#2753])
## [v25.4.8]
### Added
- Enhance `fzf` integration ([#2553])
- Platform-specific key binding ([#2526])
- Custom search engine Lua API ([#2452])
- New `follow` action to follow files pointed to by symlinks ([#2543])
- Allow `tab_swap` to cycle tabs ([#2456])
- Show error message when directory fails to load ([#2527])
- New `symlink_target` to style the target of symbolic links ([#2522])
- Use Yazi in Helix directly without Zellij or tmux ([#2461])
- New `<C-A>` and `<C-E>` keybindings to select entire line for the input component ([#2439])
- New `fs.expand_url()` API ([#2476])
- New `ui.Text:scroll()` API for setting text to scroll horizontally or vertically ([#2589])
- Allow initializing input when opening it with actions like `rename`, `create`, `find`, `filter`, etc. ([#2578])
- New `@sync peek` annotation for sync previewers ([#2487])
- New `ya.id("app")` to get `YAZI_ID` in plugins ([#2503])
- New `base` field for the `Url` ([#2492])
- New `rt.term` exports terminal emulator information ([#2442])
- Allow bulk renaming to include trailing content in addition to the required new names ([#2494])
- Log `tmux` call execution time to logs ([#2444])
### Changed
- Navigation wraparound with new `arrow prev` and `arrow next` actions ([#2485], [#2540])
- Swap default key bindings for fzf and zoxide ([#2546])
- Switch to `resvg` as the SVG renderer ([#2581])
- Make `frag`, `name`, `stem`, `ext`, and `parent` on `Url`, `name` on `tab::Tab`, and `is_hovered` on `fs::File` properties ([#2572])
- Replace `tasks_show` and `close_input` with `tasks:show` and `input:close` ([#2530])
- Replace `sync = true` with the `@sync peek` annotation ([#2487])
### Deprecated
- Deprecate `ui.Padding` and `ui.Rect:padding()` ([#2574])
### Fixed
- Always show the size in the status bar even in empty directories ([#2449])
- Remove the temporary extraction directory forcefully ([#2458])
- Align the behavior of the end-of-options marker (`--`) with that of the shell ([#2431])
- Respect hidden status of directory junctions and symlinks themselves on Windows ([#2471])
### Improved
- Rewrite config parser to double the startup speed ([#2508])
- Lazy compile and cache lua plugins as binary bytecode ([#2490])
- Faster image preview with optimized `magick` arguments ([#2533])
- Cache UserData fields ([#2572])
## [v25.3.2]
### Added
- Expose all theme fields in Lua ([#2405])
- Expose almost the entirety of the user's configuration in Lua ([#2413])
### Fixed
- `STDIN_FILENO` poll always returns 0 under SSH ([#2427])
- Ignore stdin redirection to ensure always accessing the real tty ([#2425])
- Incorrect deprecation warning when the plugin doesn't exist ([#2418])
## [v25.2.26]
### Added
- Allow to specify layer for keymap actions ([#2399])
- New `rt` and `th` allow to access user configuration and theme scheme in sync/async plugins consistently ([#2389], [#2392], [#2393], [#2397])
- New `tbl_col` and `tbl_cell` in theme system for spotter table styling ([#2391])
- Allow different separators to be applied individually to the left and right sides of the status bar ([#2313])
- `ripgrep-all` support for the `search` action ([#2383])
- Respect the user's `max_width` setting in the preset PDF preloader ([#2331])
- Respect the user's `wrap` setting in the preset JSON previewer ([#2337])
- Respect the user's `image_alloc` setting in the preset ImageMagick previewer ([#2403])
- New `external` and `removable` fields in the `fs.partitions()` API ([#2343])
- CSI-based Vim and Neovim built-in terminal detection for better accuracy ([#2327])
### Changed
- Replace `separator_open` and `separator_close` with `sep_left` and `sep_right` ([#2313])
- Rename the `[completion]` component to `[cmp]` ([#2399])
### Deprecated
- Deprecate `MANAGER`, `PREVIEW`, `PLUGIN`, and `THEME` in favor of `rt` and `th` ([#2389])
- Deprecate `ya.manager_emit()` in favor of `ya.mgr_emit()` ([#2397])
### Fixed
- Didn't reset previous `Cha` when loading directories in chunks ([#2366])
- Load mount points with the best effort even if the `/dev/disk/by-label` directory does not exist ([#2326])
- Add maximum preview limit under `/proc` virtual file system ([#2355])
## [v25.2.11]
### Added
- New `overall` option under `[status]` to allow specifying the overall style of the status bar ([#2321])
- Reduce terminal response wait timeout ([#2314])
### Fixed
- Unable to delete sealed files on Windows due to platform differences ([#2319])
- Reverse the order of CSI-based and environment-based terminal detection ([#2310])
## [v25.2.7]
### Added
- Mount manager ([#2199])
- New `ya.confirm()` API ([#2095])
- New `arrow top` and `arrow bot` actions to jump to the top and bottom ([#2294])
- Support end of options (`--`) marker for all actions ([#2298])
- Replace mode and Vim motions (`W`, `E`, `B`, `^`, `_`) for inputs ([#2143])
- New `ya pack -d` subcommand to delete packages ([#2181])
- `ya pack` supports adding and deleting multiple packages at once ([#2257])
- Theme support for the spotter border and title ([#2002])
- Use positional argument instead of `--args` for the `plugin` action ([#2299])
- Support and hide Windows system files by default ([#2149])
- New `--no-cwd-file` option for the `close` action ([#2185])
- Prompt users missing fzf in the zoxide plugin ([#2122])
- More decent package locking mechanism ([#2168])
- Custom modal component API ([#2205])
- Support local `tmux` image preview over SSH
- New `@since` plugin annotation to specify the minimum supported Yazi version ([#2290])
- Allow preloaders to return an optional `Error` to describe the failure ([#2253])
- ARM64 Snap package ([#2188])
- Support `package.toml` as a symlink ([#2245])
- New `cx.layer` API to determine the current UI layer ([#2247])
- Channel and multi-concurrent task join support for the plugin system ([#2210])
- Support `application/mbox` mimetype ([#2173])
- `cbr` and `cbz` as valid archive extensions ([#2077])
### Deprecated
- Deprecate `--args` in the `plugin` action in favor of a 2nd positional parameter ([#2299])
- Deprecate plugin entry file `init.lua` in favor of `main.lua` ([#2168])
- Deprecate `arrow -99999999` and `arrow 99999999` in favor of `arrow top` and `arrow bot` ([#2294])
- Deprecate the numeric return value of preloaders in favor of a boolean return value ([#2253])
- Deprecate `ya.md5()` in favor of `ya.hash()` ([#2168])
### Fixed
- `before_ext` excludes directories since only files have extensions ([#2132])
- Element style of `ui.Text` was not applied to the entire area ([#2093])
- Incorrect monorepo sub-plugin path resolution ([#2186])
- Use `u32` for parsing Linux partition blocks ([#2234])
- Unmangle the hexadecimal space strings (`"\x20"`) in Linux partition labels ([#2233])
- JSON value `null` should be deserialized as Lua `nil`, not lightweight userdata `null` ([#2242])
- Don't check if has a hovered file in advance, only do so when `--hovered` is explicitly specified ([#2105])
- Handle broken pipe errors gracefully ([#2110])
### Improved
- Detach the watch registration from the main thread ([#2224])
## [v0.4.2]
### Added
- More supported archive formats to the preset config ([#1926])
- New `fs.create()` Lua API ([#2068])
- New `--cwd` parameter for the `shell` action and `fs.cwd()` API ([#2060])
- Allow `noop` for single-key chords by removing the mixing length limit ([#2064])
- Support for Android platform in the `for` qualifier of opener ([#2041])
### Fixed
- Set the current working directory in a thread-safe way ([#2043])
- Interactive `cd` autocomplete doesn't follow the latest `CWD` changes ([#2025])
- Offset cursor shift when deleting multiple files in bulk ([#2030])
- Missing a render after resuming from an external blocking process ([#2071])
- Missing a hover after reordering from an external plugin ([#2072])
- Use a less intrusive `DSR` instead of `DA1` workaround to forward terminal responses twice in tmux ([#2058])
- `allow-passthrough` must be set to `on` to prevent `tmux` from forwarding the real terminal's response to the inactive pane ([#2052])
## [v0.4.1]
### Fixed
- Correctly handle CRLF on Windows in preset archive and JSON plugins ([#2017])
- Failed to parse certain image dimensions for Überzug++ backend ([#2020])
- Disable passthrough when the user launches Yazi in Neovim inside tmux ([#2014])
## [v0.4.0]
### Added
- Spotter ([#1802])
- Support transparent image preview ([#1556])
- Auto switch between dark and light icons/flavors based on terminal backgrounds ([#1946])
- Allow disabling certain preset keybinds with the new `noop` virtual action ([#1882])
- New `ya emit` and `ya emit-to` subcommands to emit actions to a specified instance for execution ([#1979])
- Custom styles for the `confirm` component ([#1789])
- Make the builtin `extract` plugin support compressed tarballs (`*.tar.gz`, `*.tar.bz2`, etc.) ([#1583])
- Launch from preset settings if the user's config cannot be parsed ([#1832])
- Prioritize paths that need to be processed first during bulk renaming ([#1801])
- New `copy --separator` option to allow specifying the path separator ([#1877])
- Set a different input title for `create --dir` ([#1650])
- Include package revision hash in `ya pack --list` ([#1884])
- New `load` DDS event ([#1980])
- New log system ([#1945])
- New `ui.Text` and `ui.Table` layout elements ([#1776])
- Support passing arguments to previewer/preloader/spotter/fetcher ([#1966])
- Move notification from top-right to bottom-right corner to avoid covering content as much as possible ([#1984])
- Append the suffix to the end instead of start when generating unique filenames for directories ([#1784])
- Allow overriding and rewriting the sync methods of built-in plugins ([#1695])
- Fallback to `CSI 16 t` for certain terminals that do not support `TIOCGWINSZ` ([#2004])
- Support calling methods in built-in plugins with arbitrary types of arguments (`self` can now be omitted) ([#1666])
- Support `assets` installation for the `ya pack` subcommand ([#1973])
- Complete and consistent support for the `ui.Style()` API
- Image ICC profiles for better color accuracy ([#1808])
- Support reading non-UTF8 data with `Child:read_line()` API ([#1816])
- New `area()` method for renderable elements ([#1667])
- `yazi --debug` supports detecting whether `tmux` is built with `--enable-sixel` ([#1762])
### Changed
- Eliminate the `x-` prefix in MIME types ([#1927])
- Remove the `vnd.` prefix from mimetype to solve differences introduced in the newest `file(1)` v5.46 ([#1995])
- Rename the term `select` to `toggle` to reserve `select` for future use ([#1773])
- Correct the misuse of the term `ctime` and unify others ([#1761])
- Replace `ffmpegthumbnailer` with `ffmpeg` as the video preview backend to support spotter ([#1928])
- Use an `Error` userdata instead of a plain error code for I/O errors ([#1939])
- Remove `ui.ListItem` since it's no longer necessary ([#1772])
- Decouple coordinates from `ui.List`, `ui.Bar`, `ui.Border`, and `ui.Gauge` ([#1782])
- Make `backspace` action not close the input even when value is empty ([#1680])
- Remove the meaningless `--confirm` option to simplify the `shell` action ([#1982])
- Use `dark` and `light` instead of `use` under `[flavor]` to support auto-switching between light and dark modes ([#1946])
- Unify the `fg_dark` and `fg_light` into one `fg` since `fg_light` is redundant and never used ([#1946])
- Extend the available styles for `mode` by separating `mode` from the `separator` styles ([#1953])
### Deprecated
- Deprecate `--sync` option for the `plugin` action ([#1891])
- Deprecate `ui.Paragraph` in favor of `ui.Text` ([#1776])
- Deprecate the task info of `peek()`, `seek()`, and `preload()` from `self` in favor of a `job` parameter ([#1966])
- Deprecate parameter list of `entry()` from its first argument in favor of a `job` parameter ([#1966])
- Deprecate the number of units of `seek()` from its first argument in favor of a `job` parameter ([#1966])
### Fixed
- Introduce a new `btime` term to align `ctime` with Unix ([#1761])
- Match icon by extension case-insensitively ([#1614])
- Copy the CWD path with `c => d` regardless even if the directory is empty ([#1849])
- Respect the `image_quality` setting in preset PDF previewer ([#2006])
- Images were not cleared when closing a tab in front of the current tab ([#1792])
- Replace control characters to printable characters in plain text preview ([#1704])
- One file's MIME type changed multiple times without triggering a preview again ([#1682])
- Reset image rendering and skip peeking if the TUI in the background ([#1833])
- File upserting should handle deleting in edge cases where the source and target URNs are different ([#1737])
- Revise `revision` if the new file list is empty but the previous one was not ([#2003])
- Update `rustix` to fix the `enable_raw_mode()` error on WSL/Android
### Improved
- Merge multiple file operations into one to greatly speed up updates in large directories ([#1745])
- Eliminate all memory reallocations during sorting ([#1846])
- Introduce URN to speed up large directory sorting, updating, locating ([#1622], [#1652], [#1648])
- Improve jemalloc memory allocator efficiency ([#1689])
- Lazy load `ui`, `ya`, `fs`, and `ps` ([#1903])
- Avoid unnecessary allocations in base64 encoding of inline image protocol ([#1639])
- Introduce copy-on-write for event system to eliminate all memory reallocations ([#1962])
- Apply rotate in place to images with orientation ([#1807])
- Introduce reflow for the rendering engine ([#1863])
## [v0.3.3]
### Added
- `size` linemode supports showing the file count for directories ([#1591])
- Support image preview in Windows Terminal ([#1588])
- Add `is_absolute`, `has_root`, `starts_with`, `ends_with`, `strip_prefix` to `Url` ([#1605])
### Fixed
- Keybindings disappear when mixing presets with a wrong filter condition ([#1568])
- Squeeze `offset` of the file list after resizing window ([#1500])
- Check compositor support status before using ueberzug wayland output ([#1566])
- Fallback to `PollWatcher` for file changes watching on WSL ([#1574])
### Improved
- Truncate long lists in confirm dialogs ([#1590])
## [v0.3.2]
### Added
- New confirm component ([#1167])
- Word wrapping in `code` previewer ([#1159])
- New `--dir` option for `create` action ([#1505])
- New `ext()` method for `Url` ([#1528])
- Make the builtin `code` previewer handle invalid carriage return chars and binary streams better ([#1550])
### Fixed
- Wait till mimetype is resolved to avoid preview flickering ([#1542])
- Use a different cache directory for each user to avoid permission issues ([#1541])
- Filter out candidates that overlap with longer key chords from the which component ([#1562])
- Overlong single-line text preview containing escape sequences was not being properly escaped ([#1497])
### Improved
- New `image_delay` option debounces image previews to avoid lag caused by terminal image decoding during fast scrolling ([#1512])
- Only scan the first 1024 bytes to detect if it's binary, apply `\r` fixes only to content within the visible range, avoid unnecessary allocations during natural sorting ([#1551])
## [v0.3.1]
### Added
- Start with multiple tabs with different paths ([#1443])
- Key notion shorthands such as `<C-S-x>` as `<C-X>` ([#1448])
- Support `F13` - `F19` keys ([#1446])
- New `--cursor` for the `shell` action ([#1422])
- New `search_do` action to make it easier to achieve a flat view ([#1431])
- Portrait orientation preview for EXIF image ([#1412])
- Keybinding for the `hardlink` action ([#1461])
- New `empty` previewer for empty and `/proc/*` files ([#1482])
- Note about filtering in the help menu ([#1361])
- New `tab` DDS event on tab switch ([#1474])
- New `status()` method for `Command` ([#1473])
### Fixed
- Directory loading status ([#1439])
- Resolve relative path when expanding path ([#1428])
- DDS static messages only work when at least two instances are running ([#1467])
- Escape files containing special `\x1b` characters and render it as plain text ([#1395])
- 7zip shows different error messages for wrong password ([#1451])
- 7zip shows different error messages for RAR and ZIP files ([#1468])
- Newly created directories with the same name causing a false positive in directory loading optimization due to having the same modification time ([#1434])
- Close stdin before waiting for child process ([#1464])
## [v0.3.0]
### Added
- Package manager ([#985], [#1110])
- Support mouse event ([#1038], [#1139], [#1232])
- New `extract` built-in plugin for archive extracting ([#1321])
- Redesign icons ([#1086])
- Font preview ([#1048])
- SVG, HEIC, AVIF, and JPEG XL preview support ([#1050], [#1249])
- Simplify keybindings ([#1241])
- New `hardlink` action to create hard links ([#1268])
- Keep file creation time on macOS and Windows ([#1169])
- Sort randomly ([#1291])
- New linemode to show file ownership ([#1238])
- New linemode to show file ctime ([#1295])
- New `--hovered` option for the `rename` and `remove` actions ([#1227])
- Support Super/Command/Windows key with `D-` notation ([#1069])
- Interactive `cd` path auto-completion supports `~` expansion ([#1081])
- Preview files containing non-UTF-8 characters ([#958])
- Expand Windows paths like "D:" that only have a drive letter but no root ([#948])
- Close confirmation dialogs and exit automatically when the ongoing task gone ([#997])
- Case-insensitive special keys in keymappings ([#1082])
- Transliteration for natural sorting ([#1053])
- New `ya.clipboard()` API ([#980])
- New `debounce` option for the `ya.input()` API ([#1025])
- Support `yazi-cli` for Nix flake ([#944])
- Support `stdin` and pipe for `Child` API ([#1033])
- New `ya sub` subcommand to subscribe to DDS events ([#1004])
- Allow specifying `$YAZI_ID` with a command-line argument ([#1305])
- DDS client-server version check ([#1111])
- New `bulk` DDS event ([#937])
- Support `cargo binstall yazi-fm` and `cargo binstall yazi-cli` ([#1003])
- Show `ya` CLI version in the `yazi --debug` output ([#1005])
- Detect terminal type in tmux with CSI sequence in passthrough mode ([#977])
### Changed
- Use Ctrl+c instead of Ctrl+q as the universal close key to follow the conventions
- Replace Alt+k/Alt+j with K/J as the `seek` keybindings to avoid Alt key not working in certain terminals
- Replace Ctrl+Enter with Shift+Enter as the alternative key for Shift+o so that it corresponds to Enter being `o` (without Shift)
- keep original state of `sort` action in favor of specifying `yes` or `no` to explicitly apply a new state to its `--reverse`, `--dir-first`, and `--translit`
- Move `mime` plugin from `[plugin.preloaders]` to `[plugin.fetchers]` of yazi.toml
- Turn `success` and `code` into properties of `Status` instead of methods
- Remove `fs.cha_follow(url)` in favor of `fs.cha(url, true)`
- Rename `is_block_device`, `is_char_device`, and `is_socket` of `Cha` to `is_block`, `is_char`, and `is_sock` for simplicity
### Fixed
- Different filenames should be treated as the same file on case-insensitive file systems ([#1151])
- Suppress warnings for different name representations of the same file in the case-insensitive file system when renaming ([#1185])
- Avoid duplicate candidates in the `which` component ([#975])
- Sixel support from certain `st` forks cannot be detected ([#1094])
- Move the DDS socket file out of the cache directory to avoid being affected by `yazi --clear-cache`
- Build `jemalloc` with 64KB pagesize on linux/arm64 ([#1270])
- Cursor gets out of sync occasionally at image previewing through IIP under tmux ([#1070])
### Improved
- Reimplement and significantly speed up archive previewing ([#1220])
## [v0.2.5]
### Added
- Data distribution service ([#826], [#855], [#861], [#867], [#868], [#871], [#880], [#895], [#913], [#928], [#933], [#940])
- Re-implement fzf and zoxide as built-in plugins ([#884], [#881])
- Preserve files' modified at timestamp while copying ([#926])
- New `--orphan` option for `shell` action ([#887])
- Smart-case for completion of interactive `cd` paths ([#910])
- Allow creating a tab with the startup directory through `tab_create` without specifying a path ([#917])
- Bunch of new debugging information to `yazi --debug` ([#824])
- Time-based selection order preservation ([#843])
- Placeholder message when there are no files in the list ([#900])
- Enhance `ya.dbg()` and `ya.err()` by support arbitrary types ([#835])
- Trigger path completion with both `/` and `\` on Windows ([#909])
- Allow opening interactively with the `--chosen-file` flag ([#920])
- Support `YAZI_FILE_ONE` in the preset `file` previewer ([#846])
### Deprecated
- Deprecate the `jump` action in favor of `plugin fzf` and `plugin zoxide` ([#884], [#881])
### Fixed
- Kill all spawned processes on exit ([#812])
- Prevent pasting a directory into itself ([#925])
- Use `BTreeSet` for selected files to maintain order ([#799])
- CJK text rendering issue where the input popup component overlaps with images ([#879])
### Improved
- Accelerate kitty graphics protocol encoding by avoiding string reallocation ([#837])
- Wrap stderr with `BufWriter` to avoid frequent system calls thereby increase rendering frame rate ([#849])
- Switch to `globset` to reduce CPU time spent on matching icons ([#908])
- Re-implement file watcher in an async way ([#877])
- Cache each file's icon to avoid redundant calculations at rendering ([#931])
- Port `require()` and `ya.sync()` to Rust to avoid plugin information initialization ([#853])
## [v0.2.4]
### Added
- Vim-like notification with new `ya.notify()` API ([#659], [#749], [#780])
- New `ya.input()` API to request user input ([#762])
- Cross-directory selection ([#693])
- Colorize the icons ([#683])
- Flavors ([#753])
- New counter component shows the number of yanked/selected items ([#646])
- New `scrolloff` option to keep a margin when scrolling ([#679])
- New `<Home>`, `<End>`, and `<Delete>` keybindings for inputs ([#665])
- New `<C-p>` and `<C-n>` for the select component to move the cursor up/down ([#779])
- New `Ctrl+[` as an alternative to the escape key ([#763])
- New option `--hovered` for the `open` action allows only to open the currently hovered file ([#687])
- Support musl builds for Linux ([#759])
- New `--debug` flag to print debug information ([#794])
- Send a foreground notification to the user when the process fails to run ([#775])
- Nested conflict detection for cross-directory selections ([#689])
- New `prepend_rules` and `append_rules` for `[open]` and `[icon]` ([#754], [#670])
- Call sync functions within an async plugin ([#649])
- Allow access to complete app data from all tabs ([#644])
- Ability to sort candidates in the which component ([#662])
- Expose selected/yanked files as Lua API ([#674])
- New `cx.yanked` API to access yanked files ([#788])
- New `$0` (Unix) / `%0` (Windows) to access the hovered file in `shell` action ([#738])
- New `ya.hide()` API to hide the UI temporarily ([#792])
- Allow both `/` and `\` for folder creation on Windows ([#751])
- New `parse()` method for the line elements to parse ANSI sequences
- New `ui.Clear` component to clear areas ([#786])
- Support `YAZI_FILE_ONE` environment variable for `file(1)` path ([#752])
- Merge wildcard preloader and previewer rules via `append_preloaders` and `append_previewers`
### Deprecated
- Deprecate the `exec` property in yazi.toml, keymap.toml, and theme.toml in favor of `run`
### Fixed
- Rendering fails when no file type style is matched ([#721])
### Improved
- Cache loaded plugins ([#710])
- Cheaper sync context initialization ([#643])
- Prefer `raw_get()` and `raw_set()`
## [v0.2.3]
### Added
- Preview image over SSH ([#585])
- New `unyank` action ([#313])
- Customize number of columns of the which component ([#571])
- Support passing arguments to plugin ([#587])
- New `image_quality` and `sixel_fraction` options to configure the image preview quality ([#576])
- New `ya.which()` API for custom key events ([#617])
- New `ya.quote()` API to quote strings safely
- `plugin` action for each layer
- Plugin-specific state persistence ([#590])
- Allow to configure image filter ([#586])
- Shorten unit names and add more units to `ya.readable_size()`
- Support char device in `[filetype]` ([#628])
- File hidden attributes on Windows ([#632])
- Make `trash` crate optional on Android ([#600])
### Fixed
- Parent folder not tracking CWD ([#581])
- Input offset is not reset when renaming with `--cursor=start` and the filename is too long ([#575])
### Improved
- Read directory in bulk in the background at startup ([#599])
- Lazy sorting when loading large directories to reduce CPU consumption ([#607])
## [v0.2.2]
### Added
- `prepend_keymap` and `append_keymap` for configuration mixing ([#546])
- `file(1)` as the file fallback previewer ([#543])
- Submit both completion and input with a single press of enter ([#565])
- Allow the spawned child processes to suspend ([#556])
- New `ya.host_name()` API ([#550])
- Desktop entry and logo ([#534])
- Snap package ([#531])
- Support Windows ARM64 ([#558])
- Image preview in Tabby terminal ([#569])
### Fixed
- Can't display file name with invalid UTF-8 ([#529])
### Improved
- New event system allows multiple actions to reuse a single render ([#561])
## [v0.2.1]
### Fixed
- Renaming may cause a crash when encountering Unicode characters ([#519])
## [v0.2.0]
### Added
- New `filter` action to filter files on the fly ([#454])
- Sort by file extension ([#405])
- Custom preloader and previewer ([#401])
- New `plugin` action to run Lua plugins
- Auto-completion for input component ([#324], [#353], [#352])
- Start with the specified file hovers over ([#358])
- Emacs readline keybindings for inputs ([#345], [#382])
- New `--empty` and `--cursor` options for the `rename` action ([#513])
- New `--follow` option for `paste` action ([#436])
- Make `copy` action work over SSH with OSC 52 ([#447])
- New `reveal` action ([#341])
- Support colored icons ([#503])
- Support highlighting specific file types ([#510])
- Make the position of input and select components customizable ([#361])
- New `prepend_preloaders`, `append_preloaders`, `prepend_previewers`, `append_previewers` options for configuration mixing
- Cursor and page key navigation parity with Vim bindings ([#386])
- Use terminal ANSI colors for code highlighting by default
- New `image_alloc` and `image_bound` options to control image preview memory usage ([#376])
- New `suppress_preload` option to hide preload tasks ([#430])
- New kitty graphics protocol implementation for better compatibility with `tmux` through Unicode placeholders ([#365])
- New `ya.user_name()` and `ya.group_name()` API ([#469])
- New `ya.render()` to trigger a UI render
- Image orientation support ([#488])
- Raise open file descriptors limit at startup ([#342])
- Support image preview on WSL ([#315])
- Fine-grained scheduling priority ([#462])
- New `YAZI_LEVEL` environment variable to indicate the nested level ([#514])
- New `QuadrantInside` and `QuadrantOutside` border type
### Changed
- Rename the option `layout` to `ratio` to make it more self-explanatory
- Rename the `peek` action to `seek` to better convey the action of "seeking for" content to preview
- Rename the `--dir_first` option of `sort` action to `--dir-first` to make it consistent with the style of other actions
- Replace `[plugins.preload]` with the `init.lua` entry file
### Fixed
- `jq` previews empty when the user sets `tab_size=8` ([#320])
- Precache n-1 and n+1 pages ([#349])
- Popup components being covered by previewed images ([#360])
- Rust panics instead of returning an error when file times are invalid ([#357])
- Clear Sixel image with empty characters instead of `\x2B[K` to be compatible with GNOME VTE ([#309])
- Use `WAYLAND_DISPLAY` and `DISPLAY` to detect Wayland/X11 when `XDG_SESSION_TYPE` is not set ([#312])
### Improved
- Chunk loading for MIME types ([#467])
- Fallback to plain highlighter for long text ([#329])
- Reduce peak memory footprint during decoding large images ([#375])
- Clear only necessary cells when hiding images ([#369])
- New UI rendering architecture ([#468])
- Partial rendering progress and composite into a complete UI to reduce CPU consumption caused by frequent progress updates ([#509])
## [v0.1.5]
### Added
- New `find` action to find files ([#104])
- Linemode to show extra file info ([#291])
- New `sort_sensitive` option ([#155])
- Cross-platform opener rules ([#289])
- Multiple openers for a single open rule ([#154])
- Vim-like `gg`, `G` in the preset key mappings for boundary jumps
- Theme system ([#161])
- New `--force` option for `remove`, `create`, `rename` actions ([#179], [#208])
- Image preview within tmux ([#147])
- New `link` action creates symlinks to the yanked files ([#167])
- New `orphan` option for opener rules to detach processes from the task scheduler ([#216])
- New `backward` and `forward` actions
- New `--smart` option for the `find` action to support smart case ([#240])
- Sorting for each tab individually ([#131])
- Suspend process with `Ctrl+z` ([#120])
- Percentage values for the `arrow` action to scroll half/full page (with newly added Vi-like `<C-u>`, `<C-d>`, `<C-b>`, and `<C-f>` keybindings) ([#213])
- Show keywords when in search mode ([#152])
- Tab switch wraparound ([#160])
- Highlight matched keywords in find mode ([#211])
- Customizable main UI border styles ([#278])
- `<BackTab>` key notion ([#209])
- Use of environment variables in `cd` paths ([#241])
- Nix Flakes package ([#205])
- New `V`, `D`, `C` Vim-like keybindings for the input component
- New `--no-cwd-file` option for the `quit` action to exit without writing the CWD file ([#245])
- Fallback to built-in code highlighting if `jq` is not installed ([#151])
- New `realtime` option for the input to support real-time input feedback ([#127])
- RGBA-16 image preview ([#250])
- FreeBSD and NetBSD support ([#169], [#178])
- Trash files on NetBSD ([#251])
- Image preview support on Mintty (Git Bash) terminal
### Changed
- Make glob expressions case-insensitive by default (with new `\s` for sensitive) ([#156])
- Make help items filtering case-insensitive
### Fixed
- `show_hidden` not properly applied to hovered folder ([#124])
- Notification of file changes in linked directories ([#121])
- Restore default cursor style when closing input from insert mode
- Task manager cursor position not reset after task cancellation
- Redirect clipboard process' stderr to /dev/null
- Delegate the `SIGINT` signal of processes with `orphan=true` to their parent ([#290])
- Inconsistent `Shift` key behavior on Unix and Windows ([#174])
### Improved
- Load large folders in chunks ([#117])
- Reimplemented natural sorting algorithm for ~6x faster case-insensitive sorting
- Kill process immediately after getting enough JSON or archive preview content to avoid wasting CPU resources ([#128])
## [v0.1.4]
### Added
- Help menu ([#93])
- Scrollable preview ([#86])
- Natural sorting ([#82])
- Windows support
- New `copy` action to copy file paths to clipboard ([#72])
- File chooser mode ([#69])
- Show symlink path ([#67])
- Respect `$EDITOR` environment variable when opening text files ([#91])
- Customizable main UI layout ratio ([#76])
- Allow accessing selected files when running shell commands ([#73])
- Update MIME type when file changes are detected ([#78])
- More clipboard backend: `xclip` and `xsel`, and Windows ([#74], [#75])
- New `cache_dir` option ([#96])
- New `YAZI_CONFIG_HOME` to specify the configuration directory ([#97])
- Black Box terminal image preview support ([#99])
### Deprecated
- Deprecate `--cwd` in favor of the positional argument ([#100])
### Fixed
- Make file(1) follow symbolic links when fetching file MIME type ([#77])
- Wrong height of the select component ([#65])
- Regression causing UI tearing when previewing images
- Specify `doNotMoveCursor` to make WezTerm render images sensibly
## [v0.1.3]
### Added
- Bulk rename ([#50])
- PDF preview and precache ([#18])
- New `sort_dir_first` option ([#49])
- Code highlighting supports more languages ([#22])
- Change the shell CWD on exit with the shell wrapper ([#40])
- Allow customizing the display name of openers ([#31])
- New `shell` action ([#24])
- Command template support for the `shell` action ([#48])
- Interactive `cd` ([#43])
- Show the output of running tasks in real time ([#17])
- Allow using the current directory name as tab name ([#41])
- Custom status bar separator ([#30])
- Fallback for opening files when no openers are available
- Preview files with `inode/empty` and `application/json` MIME types
- Transparent image support for the Sixel backend ([#14])
- Refresh image preview after terminal restoration
- New `micro_workers`, `macro_workers`, and `bizarre_retry` options to control task concurrency ([#53])
### Fixed
- PDF cache cannot be generated with a large `max_width` value ([#28])
- `show_hidden` option not working ([#47])
- Wrong task name when `shell` action has no arguments
### Improved
- Make code highlighting discardable ([#20])
- Improved performance of highlighting large JSON files ([#23])
- Wrap `stdout` with `BufWriter` to improve image preview performance ([#55])
- Improved bulk rename performance ([#54])
## [v0.1.2]
### Added
- New `sort` action to change sorting method on the fly ([#7])
- Which-key component to support multi-key chords ([#4])
- Hover the cursor over newly created files automatically ([#10])
- Make folders openable ([#9])
- Several default goto key mappings
- Support Überzug++ as the image preview backend for X11/Wayland ([#12])
- Cut input content to the system clipboard ([#6])
- Input component supports `undo` for cursor position
- Support for bracketed paste ([#5])
### Improved
- Cache directory size to avoid redundant calculations ([#11])
## [v0.1.1]
### Added
- Arrow keys are now bound for navigation by default (along with existing Vim-style bindings)
- Horizontal scrolling support for the `input` component
- Visual mode for the input component
- New `yank` and `paste` actions for the input component
- New `undo` and `redo` actions for the `input` component
### Fixed
- Cannot delete the last character of the input if at the end of the word
### Improved
- Decode images in a dedicated blocking thread to avoid blocking the UI
## [v0.1.0]
### Added
- Preset configurations
- New `open` action
- Select component for interactive `open`
- Plain text and archive preview
- Search files with `fd` and `rg`
- Jump around with `fzf` and `zoxide`
- Flat view for search results
- Precache images and videos
- Return to its parents if the CWD no longer exists
- Confirm when deleting files or exiting
- Custom status bar colors
### Fixed
- Build errors on Linux
- Number of remaining tasks cannot be updated
<!-- Link definitions -->
[Unreleased]: https://github.com/sxyazi/yazi/compare/shipped...HEAD
[v0.1.0]: https://github.com/sxyazi/yazi/releases/tag/v0.1.0
[v0.1.1]: https://github.com/sxyazi/yazi/compare/v0.1.0...v0.1.1
[v0.1.2]: https://github.com/sxyazi/yazi/compare/v0.1.1...v0.1.2
[v0.1.3]: https://github.com/sxyazi/yazi/compare/v0.1.2...v0.1.3
[v0.1.4]: https://github.com/sxyazi/yazi/compare/v0.1.3...v0.1.4
[v0.1.5]: https://github.com/sxyazi/yazi/compare/v0.1.4...v0.1.5
[v0.2.0]: https://github.com/sxyazi/yazi/compare/v0.1.5...v0.2.0
[v0.2.1]: https://github.com/sxyazi/yazi/compare/v0.2.0...v0.2.1
[v0.2.2]: https://github.com/sxyazi/yazi/compare/v0.2.1...v0.2.2
[v0.2.3]: https://github.com/sxyazi/yazi/compare/v0.2.2...v0.2.3
[v0.2.4]: https://github.com/sxyazi/yazi/compare/v0.2.3...v0.2.4
[v0.2.5]: https://github.com/sxyazi/yazi/compare/v0.2.4...v0.2.5
[v0.3.0]: https://github.com/sxyazi/yazi/compare/v0.2.5...v0.3.0
[v0.3.1]: https://github.com/sxyazi/yazi/compare/v0.3.0...v0.3.1
[v0.3.2]: https://github.com/sxyazi/yazi/compare/v0.3.1...v0.3.2
[v0.3.3]: https://github.com/sxyazi/yazi/compare/v0.3.2...v0.3.3
[v0.4.0]: https://github.com/sxyazi/yazi/compare/v0.3.3...v0.4.0
[v0.4.1]: https://github.com/sxyazi/yazi/compare/v0.4.0...v0.4.1
[v0.4.2]: https://github.com/sxyazi/yazi/compare/v0.4.1...v0.4.2
[v25.2.7]: https://github.com/sxyazi/yazi/compare/v0.4.2...v25.2.7
[v25.2.11]: https://github.com/sxyazi/yazi/compare/v25.2.7...v25.2.11
[v25.2.26]: https://github.com/sxyazi/yazi/compare/v25.2.11...v25.2.26
[v25.3.2]: https://github.com/sxyazi/yazi/compare/v25.2.26...v25.3.2
[v25.4.8]: https://github.com/sxyazi/yazi/compare/v25.3.2...v25.4.8
[v25.5.28]: https://github.com/sxyazi/yazi/compare/v25.4.8...v25.5.28
[v25.5.31]: https://github.com/sxyazi/yazi/compare/v25.5.28...v25.5.31
[v25.12.29]: https://github.com/sxyazi/yazi/compare/v25.5.31...v25.12.29
[v26.1.4]: https://github.com/sxyazi/yazi/compare/v25.12.29...v26.1.4
[v26.1.22]: https://github.com/sxyazi/yazi/compare/v26.1.4...v26.1.22
[#4]: https://github.com/sxyazi/yazi/pull/4
[#5]: https://github.com/sxyazi/yazi/pull/5
[#6]: https://github.com/sxyazi/yazi/pull/6
[#7]: https://github.com/sxyazi/yazi/pull/7
[#9]: https://github.com/sxyazi/yazi/pull/9
[#10]: https://github.com/sxyazi/yazi/pull/10
[#11]: https://github.com/sxyazi/yazi/pull/11
[#12]: https://github.com/sxyazi/yazi/pull/12
[#14]: https://github.com/sxyazi/yazi/pull/14
[#17]: https://github.com/sxyazi/yazi/pull/17
[#18]: https://github.com/sxyazi/yazi/pull/18
[#20]: https://github.com/sxyazi/yazi/pull/20
[#22]: https://github.com/sxyazi/yazi/pull/22
[#23]: https://github.com/sxyazi/yazi/pull/23
[#24]: https://github.com/sxyazi/yazi/pull/24
[#28]: https://github.com/sxyazi/yazi/pull/28
[#30]: https://github.com/sxyazi/yazi/pull/30
[#31]: https://github.com/sxyazi/yazi/pull/31
[#40]: https://github.com/sxyazi/yazi/pull/40
[#41]: https://github.com/sxyazi/yazi/pull/41
[#43]: https://github.com/sxyazi/yazi/pull/43
[#47]: https://github.com/sxyazi/yazi/pull/47
[#48]: https://github.com/sxyazi/yazi/pull/48
[#49]: https://github.com/sxyazi/yazi/pull/49
[#50]: https://github.com/sxyazi/yazi/pull/50
[#53]: https://github.com/sxyazi/yazi/pull/53
[#54]: https://github.com/sxyazi/yazi/pull/54
[#55]: https://github.com/sxyazi/yazi/pull/55
[#65]: https://github.com/sxyazi/yazi/pull/65
[#67]: https://github.com/sxyazi/yazi/pull/67
[#69]: https://github.com/sxyazi/yazi/pull/69
[#72]: https://github.com/sxyazi/yazi/pull/72
[#73]: https://github.com/sxyazi/yazi/pull/73
[#74]: https://github.com/sxyazi/yazi/pull/74
[#75]: https://github.com/sxyazi/yazi/pull/75
[#76]: https://github.com/sxyazi/yazi/pull/76
[#77]: https://github.com/sxyazi/yazi/pull/77
[#78]: https://github.com/sxyazi/yazi/pull/78
[#82]: https://github.com/sxyazi/yazi/pull/82
[#86]: https://github.com/sxyazi/yazi/pull/86
[#91]: https://github.com/sxyazi/yazi/pull/91
[#93]: https://github.com/sxyazi/yazi/pull/93
[#96]: https://github.com/sxyazi/yazi/pull/96
[#97]: https://github.com/sxyazi/yazi/pull/97
[#99]: https://github.com/sxyazi/yazi/pull/99
[#100]: https://github.com/sxyazi/yazi/pull/100
[#104]: https://github.com/sxyazi/yazi/pull/104
[#117]: https://github.com/sxyazi/yazi/pull/117
[#120]: https://github.com/sxyazi/yazi/pull/120
[#121]: https://github.com/sxyazi/yazi/pull/121
[#124]: https://github.com/sxyazi/yazi/pull/124
[#127]: https://github.com/sxyazi/yazi/pull/127
[#128]: https://github.com/sxyazi/yazi/pull/128
[#131]: https://github.com/sxyazi/yazi/pull/131
[#147]: https://github.com/sxyazi/yazi/pull/147
[#151]: https://github.com/sxyazi/yazi/pull/151
[#152]: https://github.com/sxyazi/yazi/pull/152
[#154]: https://github.com/sxyazi/yazi/pull/154
[#155]: https://github.com/sxyazi/yazi/pull/155
[#156]: https://github.com/sxyazi/yazi/pull/156
[#160]: https://github.com/sxyazi/yazi/pull/160
[#161]: https://github.com/sxyazi/yazi/pull/161
[#167]: https://github.com/sxyazi/yazi/pull/167
[#169]: https://github.com/sxyazi/yazi/pull/169
[#174]: https://github.com/sxyazi/yazi/pull/174
[#178]: https://github.com/sxyazi/yazi/pull/178
[#179]: https://github.com/sxyazi/yazi/pull/179
[#205]: https://github.com/sxyazi/yazi/pull/205
[#208]: https://github.com/sxyazi/yazi/pull/208
[#209]: https://github.com/sxyazi/yazi/pull/209
[#211]: https://github.com/sxyazi/yazi/pull/211
[#213]: https://github.com/sxyazi/yazi/pull/213
[#216]: https://github.com/sxyazi/yazi/pull/216
[#240]: https://github.com/sxyazi/yazi/pull/240
[#241]: https://github.com/sxyazi/yazi/pull/241
[#245]: https://github.com/sxyazi/yazi/pull/245
[#250]: https://github.com/sxyazi/yazi/pull/250
[#251]: https://github.com/sxyazi/yazi/pull/251
[#278]: https://github.com/sxyazi/yazi/pull/278
[#289]: https://github.com/sxyazi/yazi/pull/289
[#290]: https://github.com/sxyazi/yazi/pull/290
[#291]: https://github.com/sxyazi/yazi/pull/291
[#309]: https://github.com/sxyazi/yazi/pull/309
[#312]: https://github.com/sxyazi/yazi/pull/312
[#313]: https://github.com/sxyazi/yazi/pull/313
[#315]: https://github.com/sxyazi/yazi/pull/315
[#320]: https://github.com/sxyazi/yazi/pull/320
[#324]: https://github.com/sxyazi/yazi/pull/324
[#329]: https://github.com/sxyazi/yazi/pull/329
[#341]: https://github.com/sxyazi/yazi/pull/341
[#342]: https://github.com/sxyazi/yazi/pull/342
[#345]: https://github.com/sxyazi/yazi/pull/345
[#349]: https://github.com/sxyazi/yazi/pull/349
[#352]: https://github.com/sxyazi/yazi/pull/352
[#353]: https://github.com/sxyazi/yazi/pull/353
[#357]: https://github.com/sxyazi/yazi/pull/357
[#358]: https://github.com/sxyazi/yazi/pull/358
[#360]: https://github.com/sxyazi/yazi/pull/360
[#361]: https://github.com/sxyazi/yazi/pull/361
[#365]: https://github.com/sxyazi/yazi/pull/365
[#369]: https://github.com/sxyazi/yazi/pull/369
[#375]: https://github.com/sxyazi/yazi/pull/375
[#376]: https://github.com/sxyazi/yazi/pull/376
[#382]: https://github.com/sxyazi/yazi/pull/382
[#386]: https://github.com/sxyazi/yazi/pull/386
[#401]: https://github.com/sxyazi/yazi/pull/401
[#405]: https://github.com/sxyazi/yazi/pull/405
[#430]: https://github.com/sxyazi/yazi/pull/430
[#436]: https://github.com/sxyazi/yazi/pull/436
[#447]: https://github.com/sxyazi/yazi/pull/447
[#454]: https://github.com/sxyazi/yazi/pull/454
[#462]: https://github.com/sxyazi/yazi/pull/462
[#467]: https://github.com/sxyazi/yazi/pull/467
[#468]: https://github.com/sxyazi/yazi/pull/468
[#469]: https://github.com/sxyazi/yazi/pull/469
[#488]: https://github.com/sxyazi/yazi/pull/488
[#503]: https://github.com/sxyazi/yazi/pull/503
[#509]: https://github.com/sxyazi/yazi/pull/509
[#510]: https://github.com/sxyazi/yazi/pull/510
[#513]: https://github.com/sxyazi/yazi/pull/513
[#514]: https://github.com/sxyazi/yazi/pull/514
[#519]: https://github.com/sxyazi/yazi/pull/519
[#529]: https://github.com/sxyazi/yazi/pull/529
[#531]: https://github.com/sxyazi/yazi/pull/531
[#534]: https://github.com/sxyazi/yazi/pull/534
[#543]: https://github.com/sxyazi/yazi/pull/543
[#546]: https://github.com/sxyazi/yazi/pull/546
[#550]: https://github.com/sxyazi/yazi/pull/550
[#556]: https://github.com/sxyazi/yazi/pull/556
[#558]: https://github.com/sxyazi/yazi/pull/558
[#561]: https://github.com/sxyazi/yazi/pull/561
[#565]: https://github.com/sxyazi/yazi/pull/565
[#569]: https://github.com/sxyazi/yazi/pull/569
[#571]: https://github.com/sxyazi/yazi/pull/571
[#575]: https://github.com/sxyazi/yazi/pull/575
[#576]: https://github.com/sxyazi/yazi/pull/576
[#581]: https://github.com/sxyazi/yazi/pull/581
[#585]: https://github.com/sxyazi/yazi/pull/585
[#586]: https://github.com/sxyazi/yazi/pull/586
[#587]: https://github.com/sxyazi/yazi/pull/587
[#590]: https://github.com/sxyazi/yazi/pull/590
[#599]: https://github.com/sxyazi/yazi/pull/599
[#600]: https://github.com/sxyazi/yazi/pull/600
[#607]: https://github.com/sxyazi/yazi/pull/607
[#617]: https://github.com/sxyazi/yazi/pull/617
[#628]: https://github.com/sxyazi/yazi/pull/628
[#632]: https://github.com/sxyazi/yazi/pull/632
[#643]: https://github.com/sxyazi/yazi/pull/643
[#644]: https://github.com/sxyazi/yazi/pull/644
[#646]: https://github.com/sxyazi/yazi/pull/646
[#649]: https://github.com/sxyazi/yazi/pull/649
[#659]: https://github.com/sxyazi/yazi/pull/659
[#662]: https://github.com/sxyazi/yazi/pull/662
[#665]: https://github.com/sxyazi/yazi/pull/665
[#670]: https://github.com/sxyazi/yazi/pull/670
[#674]: https://github.com/sxyazi/yazi/pull/674
[#679]: https://github.com/sxyazi/yazi/pull/679
[#683]: https://github.com/sxyazi/yazi/pull/683
[#687]: https://github.com/sxyazi/yazi/pull/687
[#689]: https://github.com/sxyazi/yazi/pull/689
[#693]: https://github.com/sxyazi/yazi/pull/693
[#710]: https://github.com/sxyazi/yazi/pull/710
[#721]: https://github.com/sxyazi/yazi/pull/721
[#738]: https://github.com/sxyazi/yazi/pull/738
[#749]: https://github.com/sxyazi/yazi/pull/749
[#751]: https://github.com/sxyazi/yazi/pull/751
[#752]: https://github.com/sxyazi/yazi/pull/752
[#753]: https://github.com/sxyazi/yazi/pull/753
[#754]: https://github.com/sxyazi/yazi/pull/754
[#759]: https://github.com/sxyazi/yazi/pull/759
[#762]: https://github.com/sxyazi/yazi/pull/762
[#763]: https://github.com/sxyazi/yazi/pull/763
[#775]: https://github.com/sxyazi/yazi/pull/775
[#779]: https://github.com/sxyazi/yazi/pull/779
[#780]: https://github.com/sxyazi/yazi/pull/780
[#786]: https://github.com/sxyazi/yazi/pull/786
[#788]: https://github.com/sxyazi/yazi/pull/788
[#792]: https://github.com/sxyazi/yazi/pull/792
[#794]: https://github.com/sxyazi/yazi/pull/794
[#799]: https://github.com/sxyazi/yazi/pull/799
[#812]: https://github.com/sxyazi/yazi/pull/812
[#824]: https://github.com/sxyazi/yazi/pull/824
[#826]: https://github.com/sxyazi/yazi/pull/826
[#835]: https://github.com/sxyazi/yazi/pull/835
[#837]: https://github.com/sxyazi/yazi/pull/837
[#843]: https://github.com/sxyazi/yazi/pull/843
[#846]: https://github.com/sxyazi/yazi/pull/846
[#849]: https://github.com/sxyazi/yazi/pull/849
[#853]: https://github.com/sxyazi/yazi/pull/853
[#855]: https://github.com/sxyazi/yazi/pull/855
[#861]: https://github.com/sxyazi/yazi/pull/861
[#867]: https://github.com/sxyazi/yazi/pull/867
[#868]: https://github.com/sxyazi/yazi/pull/868
[#871]: https://github.com/sxyazi/yazi/pull/871
[#877]: https://github.com/sxyazi/yazi/pull/877
[#879]: https://github.com/sxyazi/yazi/pull/879
[#880]: https://github.com/sxyazi/yazi/pull/880
[#881]: https://github.com/sxyazi/yazi/pull/881
[#884]: https://github.com/sxyazi/yazi/pull/884
[#887]: https://github.com/sxyazi/yazi/pull/887
[#895]: https://github.com/sxyazi/yazi/pull/895
[#900]: https://github.com/sxyazi/yazi/pull/900
[#908]: https://github.com/sxyazi/yazi/pull/908
[#909]: https://github.com/sxyazi/yazi/pull/909
[#910]: https://github.com/sxyazi/yazi/pull/910
[#913]: https://github.com/sxyazi/yazi/pull/913
[#917]: https://github.com/sxyazi/yazi/pull/917
[#920]: https://github.com/sxyazi/yazi/pull/920
[#925]: https://github.com/sxyazi/yazi/pull/925
[#926]: https://github.com/sxyazi/yazi/pull/926
[#928]: https://github.com/sxyazi/yazi/pull/928
[#931]: https://github.com/sxyazi/yazi/pull/931
[#933]: https://github.com/sxyazi/yazi/pull/933
[#937]: https://github.com/sxyazi/yazi/pull/937
[#940]: https://github.com/sxyazi/yazi/pull/940
[#944]: https://github.com/sxyazi/yazi/pull/944
[#948]: https://github.com/sxyazi/yazi/pull/948
[#958]: https://github.com/sxyazi/yazi/pull/958
[#975]: https://github.com/sxyazi/yazi/pull/975
[#977]: https://github.com/sxyazi/yazi/pull/977
[#980]: https://github.com/sxyazi/yazi/pull/980
[#985]: https://github.com/sxyazi/yazi/pull/985
[#997]: https://github.com/sxyazi/yazi/pull/997
[#1003]: https://github.com/sxyazi/yazi/pull/1003
[#1004]: https://github.com/sxyazi/yazi/pull/1004
[#1005]: https://github.com/sxyazi/yazi/pull/1005
[#1025]: https://github.com/sxyazi/yazi/pull/1025
[#1033]: https://github.com/sxyazi/yazi/pull/1033
[#1038]: https://github.com/sxyazi/yazi/pull/1038
[#1048]: https://github.com/sxyazi/yazi/pull/1048
[#1050]: https://github.com/sxyazi/yazi/pull/1050
[#1053]: https://github.com/sxyazi/yazi/pull/1053
[#1069]: https://github.com/sxyazi/yazi/pull/1069
[#1070]: https://github.com/sxyazi/yazi/pull/1070
[#1081]: https://github.com/sxyazi/yazi/pull/1081
[#1082]: https://github.com/sxyazi/yazi/pull/1082
[#1086]: https://github.com/sxyazi/yazi/pull/1086
[#1094]: https://github.com/sxyazi/yazi/pull/1094
[#1110]: https://github.com/sxyazi/yazi/pull/1110
[#1111]: https://github.com/sxyazi/yazi/pull/1111
[#1139]: https://github.com/sxyazi/yazi/pull/1139
[#1151]: https://github.com/sxyazi/yazi/pull/1151
[#1159]: https://github.com/sxyazi/yazi/pull/1159
[#1167]: https://github.com/sxyazi/yazi/pull/1167
[#1169]: https://github.com/sxyazi/yazi/pull/1169
[#1185]: https://github.com/sxyazi/yazi/pull/1185
[#1220]: https://github.com/sxyazi/yazi/pull/1220
[#1227]: https://github.com/sxyazi/yazi/pull/1227
[#1232]: https://github.com/sxyazi/yazi/pull/1232
[#1238]: https://github.com/sxyazi/yazi/pull/1238
[#1241]: https://github.com/sxyazi/yazi/pull/1241
[#1249]: https://github.com/sxyazi/yazi/pull/1249
[#1268]: https://github.com/sxyazi/yazi/pull/1268
[#1270]: https://github.com/sxyazi/yazi/pull/1270
[#1291]: https://github.com/sxyazi/yazi/pull/1291
[#1295]: https://github.com/sxyazi/yazi/pull/1295
[#1305]: https://github.com/sxyazi/yazi/pull/1305
[#1321]: https://github.com/sxyazi/yazi/pull/1321
[#1361]: https://github.com/sxyazi/yazi/pull/1361
[#1395]: https://github.com/sxyazi/yazi/pull/1395
[#1412]: https://github.com/sxyazi/yazi/pull/1412
[#1422]: https://github.com/sxyazi/yazi/pull/1422
[#1428]: https://github.com/sxyazi/yazi/pull/1428
[#1431]: https://github.com/sxyazi/yazi/pull/1431
[#1434]: https://github.com/sxyazi/yazi/pull/1434
[#1439]: https://github.com/sxyazi/yazi/pull/1439
[#1443]: https://github.com/sxyazi/yazi/pull/1443
[#1446]: https://github.com/sxyazi/yazi/pull/1446
[#1448]: https://github.com/sxyazi/yazi/pull/1448
[#1451]: https://github.com/sxyazi/yazi/pull/1451
[#1461]: https://github.com/sxyazi/yazi/pull/1461
[#1464]: https://github.com/sxyazi/yazi/pull/1464
[#1467]: https://github.com/sxyazi/yazi/pull/1467
[#1468]: https://github.com/sxyazi/yazi/pull/1468
[#1473]: https://github.com/sxyazi/yazi/pull/1473
[#1474]: https://github.com/sxyazi/yazi/pull/1474
[#1482]: https://github.com/sxyazi/yazi/pull/1482
[#1497]: https://github.com/sxyazi/yazi/pull/1497
[#1500]: https://github.com/sxyazi/yazi/pull/1500
[#1505]: https://github.com/sxyazi/yazi/pull/1505
[#1512]: https://github.com/sxyazi/yazi/pull/1512
[#1528]: https://github.com/sxyazi/yazi/pull/1528
[#1541]: https://github.com/sxyazi/yazi/pull/1541
[#1542]: https://github.com/sxyazi/yazi/pull/1542
[#1550]: https://github.com/sxyazi/yazi/pull/1550
[#1551]: https://github.com/sxyazi/yazi/pull/1551
[#1556]: https://github.com/sxyazi/yazi/pull/1556
[#1562]: https://github.com/sxyazi/yazi/pull/1562
[#1566]: https://github.com/sxyazi/yazi/pull/1566
[#1568]: https://github.com/sxyazi/yazi/pull/1568
[#1574]: https://github.com/sxyazi/yazi/pull/1574
[#1583]: https://github.com/sxyazi/yazi/pull/1583
[#1588]: https://github.com/sxyazi/yazi/pull/1588
[#1590]: https://github.com/sxyazi/yazi/pull/1590
[#1591]: https://github.com/sxyazi/yazi/pull/1591
[#1605]: https://github.com/sxyazi/yazi/pull/1605
[#1614]: https://github.com/sxyazi/yazi/pull/1614
[#1622]: https://github.com/sxyazi/yazi/pull/1622
[#1639]: https://github.com/sxyazi/yazi/pull/1639
[#1648]: https://github.com/sxyazi/yazi/pull/1648
[#1650]: https://github.com/sxyazi/yazi/pull/1650
[#1652]: https://github.com/sxyazi/yazi/pull/1652
[#1666]: https://github.com/sxyazi/yazi/pull/1666
[#1667]: https://github.com/sxyazi/yazi/pull/1667
[#1680]: https://github.com/sxyazi/yazi/pull/1680
[#1682]: https://github.com/sxyazi/yazi/pull/1682
[#1689]: https://github.com/sxyazi/yazi/pull/1689
[#1695]: https://github.com/sxyazi/yazi/pull/1695
[#1704]: https://github.com/sxyazi/yazi/pull/1704
[#1737]: https://github.com/sxyazi/yazi/pull/1737
[#1745]: https://github.com/sxyazi/yazi/pull/1745
[#1761]: https://github.com/sxyazi/yazi/pull/1761
[#1762]: https://github.com/sxyazi/yazi/pull/1762
[#1772]: https://github.com/sxyazi/yazi/pull/1772
[#1773]: https://github.com/sxyazi/yazi/pull/1773
[#1776]: https://github.com/sxyazi/yazi/pull/1776
[#1782]: https://github.com/sxyazi/yazi/pull/1782
[#1784]: https://github.com/sxyazi/yazi/pull/1784
[#1789]: https://github.com/sxyazi/yazi/pull/1789
[#1792]: https://github.com/sxyazi/yazi/pull/1792
[#1801]: https://github.com/sxyazi/yazi/pull/1801
[#1802]: https://github.com/sxyazi/yazi/pull/1802
[#1807]: https://github.com/sxyazi/yazi/pull/1807
[#1808]: https://github.com/sxyazi/yazi/pull/1808
[#1816]: https://github.com/sxyazi/yazi/pull/1816
[#1832]: https://github.com/sxyazi/yazi/pull/1832
[#1833]: https://github.com/sxyazi/yazi/pull/1833
[#1846]: https://github.com/sxyazi/yazi/pull/1846
[#1849]: https://github.com/sxyazi/yazi/pull/1849
[#1863]: https://github.com/sxyazi/yazi/pull/1863
[#1877]: https://github.com/sxyazi/yazi/pull/1877
[#1882]: https://github.com/sxyazi/yazi/pull/1882
[#1884]: https://github.com/sxyazi/yazi/pull/1884
[#1891]: https://github.com/sxyazi/yazi/pull/1891
[#1903]: https://github.com/sxyazi/yazi/pull/1903
[#1926]: https://github.com/sxyazi/yazi/pull/1926
[#1927]: https://github.com/sxyazi/yazi/pull/1927
[#1928]: https://github.com/sxyazi/yazi/pull/1928
[#1939]: https://github.com/sxyazi/yazi/pull/1939
[#1945]: https://github.com/sxyazi/yazi/pull/1945
[#1946]: https://github.com/sxyazi/yazi/pull/1946
[#1953]: https://github.com/sxyazi/yazi/pull/1953
[#1962]: https://github.com/sxyazi/yazi/pull/1962
[#1966]: https://github.com/sxyazi/yazi/pull/1966
[#1973]: https://github.com/sxyazi/yazi/pull/1973
[#1979]: https://github.com/sxyazi/yazi/pull/1979
[#1980]: https://github.com/sxyazi/yazi/pull/1980
[#1982]: https://github.com/sxyazi/yazi/pull/1982
[#1984]: https://github.com/sxyazi/yazi/pull/1984
[#1995]: https://github.com/sxyazi/yazi/pull/1995
[#2002]: https://github.com/sxyazi/yazi/pull/2002
[#2003]: https://github.com/sxyazi/yazi/pull/2003
[#2004]: https://github.com/sxyazi/yazi/pull/2004
[#2006]: https://github.com/sxyazi/yazi/pull/2006
[#2014]: https://github.com/sxyazi/yazi/pull/2014
[#2017]: https://github.com/sxyazi/yazi/pull/2017
[#2020]: https://github.com/sxyazi/yazi/pull/2020
[#2025]: https://github.com/sxyazi/yazi/pull/2025
[#2030]: https://github.com/sxyazi/yazi/pull/2030
[#2041]: https://github.com/sxyazi/yazi/pull/2041
[#2043]: https://github.com/sxyazi/yazi/pull/2043
[#2052]: https://github.com/sxyazi/yazi/pull/2052
[#2058]: https://github.com/sxyazi/yazi/pull/2058
[#2060]: https://github.com/sxyazi/yazi/pull/2060
[#2064]: https://github.com/sxyazi/yazi/pull/2064
[#2068]: https://github.com/sxyazi/yazi/pull/2068
[#2071]: https://github.com/sxyazi/yazi/pull/2071
[#2072]: https://github.com/sxyazi/yazi/pull/2072
[#2077]: https://github.com/sxyazi/yazi/pull/2077
[#2093]: https://github.com/sxyazi/yazi/pull/2093
[#2095]: https://github.com/sxyazi/yazi/pull/2095
[#2105]: https://github.com/sxyazi/yazi/pull/2105
[#2110]: https://github.com/sxyazi/yazi/pull/2110
[#2122]: https://github.com/sxyazi/yazi/pull/2122
[#2132]: https://github.com/sxyazi/yazi/pull/2132
[#2143]: https://github.com/sxyazi/yazi/pull/2143
[#2149]: https://github.com/sxyazi/yazi/pull/2149
[#2168]: https://github.com/sxyazi/yazi/pull/2168
[#2173]: https://github.com/sxyazi/yazi/pull/2173
[#2181]: https://github.com/sxyazi/yazi/pull/2181
[#2185]: https://github.com/sxyazi/yazi/pull/2185
[#2186]: https://github.com/sxyazi/yazi/pull/2186
[#2188]: https://github.com/sxyazi/yazi/pull/2188
[#2199]: https://github.com/sxyazi/yazi/pull/2199
[#2205]: https://github.com/sxyazi/yazi/pull/2205
[#2210]: https://github.com/sxyazi/yazi/pull/2210
[#2224]: https://github.com/sxyazi/yazi/pull/2224
[#2233]: https://github.com/sxyazi/yazi/pull/2233
[#2234]: https://github.com/sxyazi/yazi/pull/2234
[#2242]: https://github.com/sxyazi/yazi/pull/2242
[#2245]: https://github.com/sxyazi/yazi/pull/2245
[#2247]: https://github.com/sxyazi/yazi/pull/2247
[#2253]: https://github.com/sxyazi/yazi/pull/2253
[#2257]: https://github.com/sxyazi/yazi/pull/2257
[#2290]: https://github.com/sxyazi/yazi/pull/2290
[#2294]: https://github.com/sxyazi/yazi/pull/2294
[#2298]: https://github.com/sxyazi/yazi/pull/2298
[#2299]: https://github.com/sxyazi/yazi/pull/2299
[#2310]: https://github.com/sxyazi/yazi/pull/2310
[#2313]: https://github.com/sxyazi/yazi/pull/2313
[#2314]: https://github.com/sxyazi/yazi/pull/2314
[#2319]: https://github.com/sxyazi/yazi/pull/2319
[#2321]: https://github.com/sxyazi/yazi/pull/2321
[#2326]: https://github.com/sxyazi/yazi/pull/2326
[#2327]: https://github.com/sxyazi/yazi/pull/2327
[#2331]: https://github.com/sxyazi/yazi/pull/2331
[#2337]: https://github.com/sxyazi/yazi/pull/2337
[#2343]: https://github.com/sxyazi/yazi/pull/2343
[#2355]: https://github.com/sxyazi/yazi/pull/2355
[#2366]: https://github.com/sxyazi/yazi/pull/2366
[#2383]: https://github.com/sxyazi/yazi/pull/2383
[#2389]: https://github.com/sxyazi/yazi/pull/2389
[#2391]: https://github.com/sxyazi/yazi/pull/2391
[#2392]: https://github.com/sxyazi/yazi/pull/2392
[#2393]: https://github.com/sxyazi/yazi/pull/2393
[#2397]: https://github.com/sxyazi/yazi/pull/2397
[#2399]: https://github.com/sxyazi/yazi/pull/2399
[#2403]: https://github.com/sxyazi/yazi/pull/2403
[#2405]: https://github.com/sxyazi/yazi/pull/2405
[#2413]: https://github.com/sxyazi/yazi/pull/2413
[#2418]: https://github.com/sxyazi/yazi/pull/2418
[#2425]: https://github.com/sxyazi/yazi/pull/2425
[#2427]: https://github.com/sxyazi/yazi/pull/2427
[#2431]: https://github.com/sxyazi/yazi/pull/2431
[#2439]: https://github.com/sxyazi/yazi/pull/2439
[#2442]: https://github.com/sxyazi/yazi/pull/2442
[#2444]: https://github.com/sxyazi/yazi/pull/2444
[#2449]: https://github.com/sxyazi/yazi/pull/2449
[#2452]: https://github.com/sxyazi/yazi/pull/2452
[#2456]: https://github.com/sxyazi/yazi/pull/2456
[#2458]: https://github.com/sxyazi/yazi/pull/2458
[#2461]: https://github.com/sxyazi/yazi/pull/2461
[#2471]: https://github.com/sxyazi/yazi/pull/2471
[#2476]: https://github.com/sxyazi/yazi/pull/2476
[#2485]: https://github.com/sxyazi/yazi/pull/2485
[#2487]: https://github.com/sxyazi/yazi/pull/2487
[#2490]: https://github.com/sxyazi/yazi/pull/2490
[#2492]: https://github.com/sxyazi/yazi/pull/2492
[#2494]: https://github.com/sxyazi/yazi/pull/2494
[#2503]: https://github.com/sxyazi/yazi/pull/2503
[#2508]: https://github.com/sxyazi/yazi/pull/2508
[#2522]: https://github.com/sxyazi/yazi/pull/2522
[#2526]: https://github.com/sxyazi/yazi/pull/2526
[#2527]: https://github.com/sxyazi/yazi/pull/2527
[#2530]: https://github.com/sxyazi/yazi/pull/2530
[#2533]: https://github.com/sxyazi/yazi/pull/2533
[#2540]: https://github.com/sxyazi/yazi/pull/2540
[#2543]: https://github.com/sxyazi/yazi/pull/2543
[#2546]: https://github.com/sxyazi/yazi/pull/2546
[#2553]: https://github.com/sxyazi/yazi/pull/2553
[#2560]: https://github.com/sxyazi/yazi/pull/2560
[#2572]: https://github.com/sxyazi/yazi/pull/2572
[#2574]: https://github.com/sxyazi/yazi/pull/2574
[#2578]: https://github.com/sxyazi/yazi/pull/2578
[#2581]: https://github.com/sxyazi/yazi/pull/2581
[#2589]: https://github.com/sxyazi/yazi/pull/2589
[#2594]: https://github.com/sxyazi/yazi/pull/2594
[#2602]: https://github.com/sxyazi/yazi/pull/2602
[#2609]: https://github.com/sxyazi/yazi/pull/2609
[#2636]: https://github.com/sxyazi/yazi/pull/2636
[#2640]: https://github.com/sxyazi/yazi/pull/2640
[#2653]: https://github.com/sxyazi/yazi/pull/2653
[#2657]: https://github.com/sxyazi/yazi/pull/2657
[#2664]: https://github.com/sxyazi/yazi/pull/2664
[#2675]: https://github.com/sxyazi/yazi/pull/2675
[#2678]: https://github.com/sxyazi/yazi/pull/2678
[#2683]: https://github.com/sxyazi/yazi/pull/2683
[#2691]: https://github.com/sxyazi/yazi/pull/2691
[#2695]: https://github.com/sxyazi/yazi/pull/2695
[#2696]: https://github.com/sxyazi/yazi/pull/2696
[#2697]: https://github.com/sxyazi/yazi/pull/2697
[#2700]: https://github.com/sxyazi/yazi/pull/2700
[#2706]: https://github.com/sxyazi/yazi/pull/2706
[#2707]: https://github.com/sxyazi/yazi/pull/2707
[#2709]: https://github.com/sxyazi/yazi/pull/2709
[#2723]: https://github.com/sxyazi/yazi/pull/2723
[#2734]: https://github.com/sxyazi/yazi/pull/2734
[#2743]: https://github.com/sxyazi/yazi/pull/2743
[#2745]: https://github.com/sxyazi/yazi/pull/2745
[#2752]: https://github.com/sxyazi/yazi/pull/2752
[#2753]: https://github.com/sxyazi/yazi/pull/2753
[#2754]: https://github.com/sxyazi/yazi/pull/2754
[#2759]: https://github.com/sxyazi/yazi/pull/2759
[#2764]: https://github.com/sxyazi/yazi/pull/2764
[#2765]: https://github.com/sxyazi/yazi/pull/2765
[#2769]: https://github.com/sxyazi/yazi/pull/2769
[#2770]: https://github.com/sxyazi/yazi/pull/2770
[#2778]: https://github.com/sxyazi/yazi/pull/2778
[#2802]: https://github.com/sxyazi/yazi/pull/2802
[#2803]: https://github.com/sxyazi/yazi/pull/2803
[#2807]: https://github.com/sxyazi/yazi/pull/2807
[#2810]: https://github.com/sxyazi/yazi/pull/2810
[#2811]: https://github.com/sxyazi/yazi/pull/2811
[#2814]: https://github.com/sxyazi/yazi/pull/2814
[#2820]: https://github.com/sxyazi/yazi/pull/2820
[#2834]: https://github.com/sxyazi/yazi/pull/2834
[#2841]: https://github.com/sxyazi/yazi/pull/2841
[#2843]: https://github.com/sxyazi/yazi/pull/2843
[#2849]: https://github.com/sxyazi/yazi/pull/2849
[#2855]: https://github.com/sxyazi/yazi/pull/2855
[#2861]: https://github.com/sxyazi/yazi/pull/2861
[#2862]: https://github.com/sxyazi/yazi/pull/2862
[#2864]: https://github.com/sxyazi/yazi/pull/2864
[#2875]: https://github.com/sxyazi/yazi/pull/2875
[#2879]: https://github.com/sxyazi/yazi/pull/2879
[#2880]: https://github.com/sxyazi/yazi/pull/2880
[#2884]: https://github.com/sxyazi/yazi/pull/2884
[#2889]: https://github.com/sxyazi/yazi/pull/2889
[#2890]: https://github.com/sxyazi/yazi/pull/2890
[#2895]: https://github.com/sxyazi/yazi/pull/2895
[#2904]: https://github.com/sxyazi/yazi/pull/2904
[#2906]: https://github.com/sxyazi/yazi/pull/2906
[#2914]: https://github.com/sxyazi/yazi/pull/2914
[#2915]: https://github.com/sxyazi/yazi/pull/2915
[#2917]: https://github.com/sxyazi/yazi/pull/2917
[#2921]: https://github.com/sxyazi/yazi/pull/2921
[#2925]: https://github.com/sxyazi/yazi/pull/2925
[#2927]: https://github.com/sxyazi/yazi/pull/2927
[#2931]: https://github.com/sxyazi/yazi/pull/2931
[#2932]: https://github.com/sxyazi/yazi/pull/2932
[#2935]: https://github.com/sxyazi/yazi/pull/2935
[#2939]: https://github.com/sxyazi/yazi/pull/2939
[#2941]: https://github.com/sxyazi/yazi/pull/2941
[#2958]: https://github.com/sxyazi/yazi/pull/2958
[#2959]: https://github.com/sxyazi/yazi/pull/2959
[#2964]: https://github.com/sxyazi/yazi/pull/2964
[#2984]: https://github.com/sxyazi/yazi/pull/2984
[#2997]: https://github.com/sxyazi/yazi/pull/2997
[#3005]: https://github.com/sxyazi/yazi/pull/3005
[#3008]: https://github.com/sxyazi/yazi/pull/3008
[#3023]: https://github.com/sxyazi/yazi/pull/3023
[#3034]: https://github.com/sxyazi/yazi/pull/3034
[#3035]: https://github.com/sxyazi/yazi/pull/3035
[#3037]: https://github.com/sxyazi/yazi/pull/3037
[#3038]: https://github.com/sxyazi/yazi/pull/3038
[#3059]: https://github.com/sxyazi/yazi/pull/3059
[#3067]: https://github.com/sxyazi/yazi/pull/3067
[#3077]: https://github.com/sxyazi/yazi/pull/3077
[#3083]: https://github.com/sxyazi/yazi/pull/3083
[#3084]: https://github.com/sxyazi/yazi/pull/3084
[#3091]: https://github.com/sxyazi/yazi/pull/3091
[#3094]: https://github.com/sxyazi/yazi/pull/3094
[#3108]: https://github.com/sxyazi/yazi/pull/3108
[#3117]: https://github.com/sxyazi/yazi/pull/3117
[#3121]: https://github.com/sxyazi/yazi/pull/3121
[#3128]: https://github.com/sxyazi/yazi/pull/3128
[#3131]: https://github.com/sxyazi/yazi/pull/3131
[#3134]: https://github.com/sxyazi/yazi/pull/3134
[#3141]: https://github.com/sxyazi/yazi/pull/3141
[#3154]: https://github.com/sxyazi/yazi/pull/3154
[#3166]: https://github.com/sxyazi/yazi/pull/3166
[#3169]: https://github.com/sxyazi/yazi/pull/3169
[#3170]: https://github.com/sxyazi/yazi/pull/3170
[#3172]: https://github.com/sxyazi/yazi/pull/3172
[#3187]: https://github.com/sxyazi/yazi/pull/3187
[#3189]: https://github.com/sxyazi/yazi/pull/3189
[#3190]: https://github.com/sxyazi/yazi/pull/3190
[#3198]: https://github.com/sxyazi/yazi/pull/3198
[#3200]: https://github.com/sxyazi/yazi/pull/3200
[#3201]: https://github.com/sxyazi/yazi/pull/3201
[#3203]: https://github.com/sxyazi/yazi/pull/3203
[#3209]: https://github.com/sxyazi/yazi/pull/3209
[#3222]: https://github.com/sxyazi/yazi/pull/3222
[#3225]: https://github.com/sxyazi/yazi/pull/3225
[#3226]: https://github.com/sxyazi/yazi/pull/3226
[#3232]: https://github.com/sxyazi/yazi/pull/3232
[#3235]: https://github.com/sxyazi/yazi/pull/3235
[#3243]: https://github.com/sxyazi/yazi/pull/3243
[#3250]: https://github.com/sxyazi/yazi/pull/3250
[#3264]: https://github.com/sxyazi/yazi/pull/3264
[#3268]: https://github.com/sxyazi/yazi/pull/3268
[#3271]: https://github.com/sxyazi/yazi/pull/3271
[#3286]: https://github.com/sxyazi/yazi/pull/3286
[#3290]: https://github.com/sxyazi/yazi/pull/3290
[#3313]: https://github.com/sxyazi/yazi/pull/3313
[#3317]: https://github.com/sxyazi/yazi/pull/3317
[#3358]: https://github.com/sxyazi/yazi/pull/3358
[#3360]: https://github.com/sxyazi/yazi/pull/3360
[#3361]: https://github.com/sxyazi/yazi/pull/3361
[#3364]: https://github.com/sxyazi/yazi/pull/3364
[#3369]: https://github.com/sxyazi/yazi/pull/3369
[#3383]: https://github.com/sxyazi/yazi/pull/3383
[#3385]: https://github.com/sxyazi/yazi/pull/3385
[#3387]: https://github.com/sxyazi/yazi/pull/3387
[#3391]: https://github.com/sxyazi/yazi/pull/3391
[#3393]: https://github.com/sxyazi/yazi/pull/3393
[#3396]: https://github.com/sxyazi/yazi/pull/3396
[#3419]: https://github.com/sxyazi/yazi/pull/3419
[#3422]: https://github.com/sxyazi/yazi/pull/3422
[#3429]: https://github.com/sxyazi/yazi/pull/3429
[#3456]: https://github.com/sxyazi/yazi/pull/3456
[#3467]: https://github.com/sxyazi/yazi/pull/3467
[#3477]: https://github.com/sxyazi/yazi/pull/3477
[#3482]: https://github.com/sxyazi/yazi/pull/3482
[#3494]: https://github.com/sxyazi/yazi/pull/3494
[#3514]: https://github.com/sxyazi/yazi/pull/3514
[#3518]: https://github.com/sxyazi/yazi/pull/3518
[#3525]: https://github.com/sxyazi/yazi/pull/3525
[#3532]: https://github.com/sxyazi/yazi/pull/3532
[#3540]: https://github.com/sxyazi/yazi/pull/3540
[#3541]: https://github.com/sxyazi/yazi/pull/3541
[#3561]: https://github.com/sxyazi/yazi/pull/3561
[#3566]: https://github.com/sxyazi/yazi/pull/3566
[#3582]: https://github.com/sxyazi/yazi/pull/3582
[#3594]: https://github.com/sxyazi/yazi/pull/3594
[#3607]: https://github.com/sxyazi/yazi/pull/3607
[#3608]: https://github.com/sxyazi/yazi/pull/3608
[#3617]: https://github.com/sxyazi/yazi/pull/3617
[#3633]: https://github.com/sxyazi/yazi/pull/3633
[#3634]: https://github.com/sxyazi/yazi/pull/3634
[#3638]: https://github.com/sxyazi/yazi/pull/3638
[#3642]: https://github.com/sxyazi/yazi/pull/3642
[#3648]: https://github.com/sxyazi/yazi/pull/3648
[#3661]: https://github.com/sxyazi/yazi/pull/3661
[#3666]: https://github.com/sxyazi/yazi/pull/3666
[#3668]: https://github.com/sxyazi/yazi/pull/3668
[#3677]: https://github.com/sxyazi/yazi/pull/3677
[#3678]: https://github.com/sxyazi/yazi/pull/3678
[#3684]: https://github.com/sxyazi/yazi/pull/3684
[#3687]: https://github.com/sxyazi/yazi/pull/3687
[#3689]: https://github.com/sxyazi/yazi/pull/3689
[#3696]: https://github.com/sxyazi/yazi/pull/3696
[#3708]: https://github.com/sxyazi/yazi/pull/3708
[#3716]: https://github.com/sxyazi/yazi/pull/3716
[#3725]: https://github.com/sxyazi/yazi/pull/3725
[#3728]: https://github.com/sxyazi/yazi/pull/3728
[#3733]: https://github.com/sxyazi/yazi/pull/3733
[#3744]: https://github.com/sxyazi/yazi/pull/3744
[#3748]: https://github.com/sxyazi/yazi/pull/3748
[#3757]: https://github.com/sxyazi/yazi/pull/3757
[#3765]: https://github.com/sxyazi/yazi/pull/3765
[#3780]: https://github.com/sxyazi/yazi/pull/3780
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct
## Goal
Our goal is to create a welcoming and safe space where anyone can contribute and seek help for this project in a respectful, collaborative
and harassment-free way.
All contributions are welcome and encourage everyone to participate regardless of age, body size, disability, ethnicity, sex characteristics,
gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion,
or sexual identity and orientation.
## Standards
Our standards are as follows:
- Respect different viewpoints and opinions
- Do not harass, attack, or discriminate against others for any reason. We have zero tolerance for harassment
- Communicate professionally and constructively. Do not post spam or go off-topic
- Assume goodwill in conversations. Misunderstandings happen, so give others the benefit of the doubt before jumping to conclusions
Examples of unacceptable behavior include:
- Trolling, insulting or derogatory comments, and personal attacks
- Harassing or bullying another person
- Publishing others' private information without their explicit permission
- Posting things unrelated to the topic being discussed
- Other conduct that could reasonably be considered inappropriate in a professional setting
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported here: https://discord.com/users/638378964804698112
All reporters are guaranteed privacy, and your reports will always be kept private and secure.
All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate.
The following is a list of consequences that you may face if you are found to be breaking the terms of the CoC.
### 1. Correction
A private warning with an explanation as to why the behavior was not appropriate.
### 2. Warning
A private or public warning with consequences for continued behavior.
### 3. Temporary Ban
A temporary ban from any sort of interaction or public communication with the community for a specified period of time.
### 4. Permanent Ban
A permanent ban from any sort of public interaction within the community.
## Scope
This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the
community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official
social media account, or acting as an appointed representative at an online or offline event.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Yazi
Thank you for your interest in contributing to Yazi! We welcome contributions in the form of bug reports, feature requests, documentation improvements, and code changes.
This guide will help you understand how to contribute to the project.
## Table of Contents
1. [Getting Started](#getting-started)
2. [Project Structure](#project-structure)
3. [Development Setup](#development-setup)
4. [How to Contribute](#how-to-contribute)
5. [Pull Requests](#pull-requests)
## Getting Started
### Prerequisites
Before you begin, ensure you have met the following requirements:
- Rust installed on your machine. You can download it from [rustup.rs](https://rustup.rs).
- Familiarity with Git and GitHub.
### Fork the Repository
1. Fork the [Yazi repository](https://github.com/sxyazi/yazi) to your GitHub account.
2. Clone your fork to your local machine:
```sh
git clone https://github.com/<your-username>/yazi.git
```
3. Set up the upstream remote:
```sh
git remote add upstream https://github.com/sxyazi/yazi.git
```
## Project Structure
A brief overview of the project's structure:
```sh
.
├── assets/ # Assets like images and fonts
├── nix/ # Nix-related configurations
├── scripts/ # Helper scripts used by CI/CD
├── snap/ # Snapcraft configuration
├── yazi-adapter/ # Yazi image adapter
├── yazi-binding/ # Yazi Lua bindings
├── yazi-boot/ # Yazi bootstrapper
├── yazi-cli/ # Yazi command-line interface
├── yazi-codegen/ # Yazi code generator
├── yazi-config/ # Yazi configuration file parser
├── yazi-core/ # Yazi core logic
├── yazi-dds/ # Yazi data distribution service
├── yazi-ffi/ # Yazi foreign function interface
├── yazi-fm/ # Yazi file manager
├── yazi-fs/ # Yazi file system
├── yazi-macro/ # Yazi macros
├── yazi-plugin/ # Yazi plugin system
├── yazi-proxy/ # Yazi event proxy
├── yazi-scheduler/ # Yazi task scheduler
├── yazi-shared/ # Yazi shared library
├── yazi-term/ # Yazi terminal extensions
├── yazi-widgets/ # Yazi user interface widgets
├── .github/ # GitHub-specific files and workflows
├── Cargo.toml # Rust workflow configuration
└── README.md # Project overview
```
## Development Setup
1. Ensure the latest stable Rust is installed:
```sh
rustc --version
cargo --version
```
2. Build the project:
```sh
cargo build
```
3. Run the tests:
```sh
cargo test --workspace --verbose
```
4. Format the code (requires `rustfmt` nightly):
```sh
rustup component add rustfmt --toolchain nightly
rustfmt +nightly **/*.rs
```
## How to Contribute
### Reporting Bugs
If you encounter a bug and have found a way to reliably reproduce it on the latest `main` branch, please file a [bug report](https://github.com/sxyazi/yazi/issues/new?template=bug.yml) with a [minimal reproducer](https://stackoverflow.com/help/minimal-reproducible-example).
### Suggesting Features
If you want to request a feature, please file a [feature request](https://github.com/sxyazi/yazi/issues/new?template=feature.yml). Please make sure to search for existing issues and discussions before submitting.
### Improving Documentation
Yazi's documentation placed at [yazi-rs/yazi-rs.github.io](https://github.com/yazi-rs/yazi-rs.github.io), contributions related to documentation need to be made there.
### Improving Icons
Yazi's icon originates from [`nvim-web-devicons`](https://github.com/nvim-tree/nvim-web-devicons), and it is periodically grabbed and updated with the latest changes from upstream via [`generate.lua`](https://github.com/sxyazi/yazi/blob/main/scripts/icons/generate.lua).
Contributions related to the icon should be made upstream to facilitate easier automation of this process.
### Submitting Code Changes
1. Create a new branch for your changes:
```sh
git checkout -b your-branch-name
```
2. Make your changes. Ensure that your code follows the project's [coding style](https://github.com/sxyazi/yazi/blob/main/rustfmt.toml) and passes all tests.
3. Commit your changes with a descriptive commit message:
```sh
git commit -m "feat: an awesome feature"
```
4. Push your changes to your fork:
```sh
git push origin your-branch-name
```
## Pull Requests
If you have an idea, before raising a pull request, we encourage you to file an issue to propose it, ensuring that we are aligned and reducing the risk of re-work.
We want you to succeed, and it can be discouraging to find that a lot of re-work is needed.
### Process
1. Ensure your fork is up-to-date with the upstream repository:
```sh
git fetch upstream
git checkout main
git merge upstream/main
```
2. Rebase your feature branch onto the `main` branch:
```sh
git checkout your-branch-name
git rebase main
```
3. Create a pull request to the `main` branch of the upstream repository. Follow the pull request template and ensure that:
- Your code passes all tests and lints.
- Your pull request description clearly explains the changes and why they are needed.
4. Address any review comments. Make sure to push updates to the same branch on your fork.
================================================
FILE: Cargo.toml
================================================
[workspace]
resolver = "3"
members = [ "yazi-*" ]
default-members = [ "yazi-fm", "yazi-cli" ]
[workspace.package]
edition = "2024"
version = "26.2.2"
license = "MIT"
authors = [ "sxyazi <sxyazi@gmail.com>" ]
homepage = "https://yazi-rs.github.io"
repository = "https://github.com/sxyazi/yazi"
rust-version = "1.92.0"
[profile.dev]
debug = "line-tables-only"
[profile.release]
codegen-units = 1
lto = true
panic = "abort"
strip = true
[profile.release-windows]
inherits = "release"
panic = "unwind"
[profile.dev-opt]
inherits = "release"
codegen-units = 256
incremental = true
lto = false
[profile.dev.package."*"]
debug = false
[workspace.dependencies]
ansi-to-tui = "8.0.1"
anyhow = "1.0.102"
base64 = "0.22.1"
bitflags = { version = "2.11.0", features = [ "serde" ] }
chrono = "0.4.44"
clap = { version = "4.6.0", features = [ "derive" ] }
core-foundation-sys = "0.8.7"
crossterm = { version = "0.29.0", features = [ "event-stream" ] }
dirs = "6.0.0"
dyn-clone = "1.0.20"
either = { version = "1.15.0" }
foldhash = "0.2.0"
futures = "0.3.32"
globset = "0.4.18"
hashbrown = { version = "0.16.1", features = [ "serde" ] }
indexmap = { version = "2.13.0", features = [ "serde" ] }
libc = "0.2.183"
lru = "0.16.3"
mlua = { version = "0.11.6", features = [ "anyhow", "async", "error-send", "lua55", "macros", "serde" ] }
objc2 = "0.6.4"
ordered-float = { version = "5.1.0", features = [ "serde" ] }
parking_lot = "0.12.5"
paste = "1.0.15"
percent-encoding = "2.3.2"
rand = { version = "0.9.2", default-features = false, features = [ "os_rng", "small_rng", "std" ] }
ratatui = { version = "0.30.0", features = [ "serde", "unstable-rendered-line-info", "unstable-widget-ref" ] }
regex = "1.12.3"
russh = { version = "0.57.1", default-features = false, features = [ "ring", "rsa" ] }
scopeguard = "1.2.0"
serde = { version = "1.0.228", features = [ "derive" ] }
serde_json = "1.0.149"
serde_with = "3.18.0"
syntect = { version = "5.3.0", default-features = false, features = [ "parsing", "plist-load", "regex-onig" ] }
thiserror = "2.0.18"
tokio = { version = "1.50.0", features = [ "full" ] }
tokio-stream = "0.1.18"
tokio-util = "0.7.18"
toml = { version = "1.0.7" }
tracing = { version = "0.1.44", features = [ "max_level_debug", "release_max_level_debug" ] }
twox-hash = { version = "2.1.2", default-features = false, features = [ "std", "random", "xxhash3_128" ] }
typed-path = "0.12.3"
unicode-width = { version = "0.2.2", default-features = false }
uzers = "0.12.2"
[workspace.lints.clippy]
format_push_string = "warn"
if_same_then_else = "allow"
implicit_clone = "warn"
len_without_is_empty = "allow"
missing_safety_doc = "allow"
module_inception = "allow"
option_map_unit_fn = "allow"
unit_arg = "allow"
use_self = "warn"
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2023 - sxyazi
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: LICENSE-ICONS
================================================
MIT License
Copyright (c) 2023 nvim-tree
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
<div align="center">
<sup>Special thanks to:</sup><br>
|<a href="https://go.warp.dev/yazi" target="_blank"><img alt="Warp sponsorship" width=350 src="https://github.com/warpdotdev/brand-assets/blob/main/Github/Sponsor/Warp-Github-LG-02.png"><br><b>Warp, built for coding with multiple AI agents</b><br><sup>Available for macOS, Linux and Windows</sup></a>|<a href="https://git-tower.com/?utm_source=yazi&utm_medium=referral" target="_blank"><img alt="Tower sponsorship" width=350 src="https://github.com/user-attachments/assets/c561a30f-2c5e-4f33-bbec-2bf9df26431a"><br><b>The most powerful Git client for Mac and Windows</b></a>|
|-|-|
</div>
## Yazi - ⚡️ Blazing Fast Terminal File Manager
Yazi (means "duck") is a terminal file manager written in Rust, based on non-blocking async I/O. It aims to provide an efficient, user-friendly, and customizable file management experience.
💡 A new article explaining its internal workings: [Why is Yazi Fast?](https://yazi-rs.github.io/blog/why-is-yazi-fast)
- 🚀 **Full Asynchronous Support**: All I/O operations are asynchronous, CPU tasks are spread across multiple threads, making the most of available resources.
- 💪 **Powerful Async Task Scheduling and Management**: Provides real-time progress updates, task cancellation, and internal task priority assignment.
- 🖼️ **Built-in Support for Multiple Image Protocols**: Also integrated with Überzug++ and Chafa, covering almost all terminals.
- 🌟 **Built-in Code Highlighting and Image Decoding**: Combined with the pre-loading mechanism, greatly accelerates image and normal file loading.
- 🔌 **Concurrent Plugin System**: UI plugins (rewriting most of the UI), functional plugins, custom previewer/preloader/spotter/fetcher; Just some pieces of Lua.
- ☁️ **Virtual Filesystem**: Remote file management, custom search engines.
- 📡 **Data Distribution Service**: Built on a client-server architecture (no additional server process required), integrated with a Lua-based publish-subscribe model, achieving cross-instance communication and state persistence.
- 📦 **Package Manager**: Install plugins and themes with one command, keeping them up-to-date, or pin them to a specific version.
- 🧰 Integration with ripgrep, fd, fzf, zoxide
- 💫 Vim-like input/pick/confirm/which/notify component, auto-completion for cd paths
- 🏷️ Multi-Tab Support, Cross-directory selection, Scrollable Preview (for videos, PDFs, archives, code, directories, etc.)
- 🔄 Bulk Renaming, Archive Extraction, Visual Mode, File Chooser, [Git Integration](https://github.com/yazi-rs/plugins/tree/main/git.yazi), [Mount Manager](https://github.com/yazi-rs/plugins/tree/main/mount.yazi)
- 🎨 Theme System, Mouse Support, Trash Bin, Custom Layouts, CSI u, OSC 52
- ... and more!
https://github.com/sxyazi/yazi/assets/17523360/92ff23fa-0cd5-4f04-b387-894c12265cc7
## Project status
Public beta, can be used as a daily driver.
Yazi is currently in heavy development, expect breaking changes.
## Documentation
- Usage: https://yazi-rs.github.io/docs/installation
- Features: https://yazi-rs.github.io/features
## Discussion
- Discord Server (English mainly): https://discord.gg/qfADduSdJu
- Telegram Group (Chinese mainly): https://t.me/yazi_rs
## Image Preview
| Platform | Protocol | Support |
| ---------------------------------------------------------------------------- | -------------------------------------- | ---------------------------------------- |
| [kitty](https://github.com/kovidgoyal/kitty) (>= 0.28.0) | [Kitty unicode placeholders][kgp] | ✅ Built-in |
| [iTerm2](https://iterm2.com) | [Inline images protocol][iip] | ✅ Built-in |
| [WezTerm](https://github.com/wez/wezterm) | [Inline images protocol][iip] | ✅ Built-in |
| [Konsole](https://invent.kde.org/utilities/konsole) | [Kitty old protocol][kgp-old] | ✅ Built-in |
| [foot](https://codeberg.org/dnkl/foot) | [Sixel graphics format][sixel] | ✅ Built-in |
| [Ghostty](https://github.com/ghostty-org/ghostty) | [Kitty unicode placeholders][kgp] | ✅ Built-in |
| [Windows Terminal](https://github.com/microsoft/terminal) (>= v1.22.10352.0) | [Sixel graphics format][sixel] | ✅ Built-in |
| [st with Sixel patch](https://github.com/bakkeby/st-flexipatch) | [Sixel graphics format][sixel] | ✅ Built-in |
| [Warp](https://www.warp.dev) (macOS/Linux only) | [Inline images protocol][iip] | ✅ Built-in |
| [Tabby](https://github.com/Eugeny/tabby) | [Inline images protocol][iip] | ✅ Built-in |
| [VSCode](https://github.com/microsoft/vscode) | [Inline images protocol][iip] | ✅ Built-in |
| [Rio](https://github.com/raphamorim/rio) | [Inline images protocol][iip] | ❌ Rio renders images at incorrect sizes |
| [Black Box](https://gitlab.gnome.org/raggesilver/blackbox) | [Sixel graphics format][sixel] | ✅ Built-in |
| [Bobcat](https://github.com/ismail-yilmaz/Bobcat) | [Inline images protocol][iip] | ✅ Built-in |
| X11 / Wayland | Window system protocol | ☑️ [Überzug++][ueberzug] required |
| Fallback | [ASCII art (Unicode block)][ascii-art] | ☑️ [Chafa][chafa] required (>= 1.16.0) |
See https://yazi-rs.github.io/docs/image-preview for details.
<!-- Protocols -->
[kgp]: https://sw.kovidgoyal.net/kitty/graphics-protocol/#unicode-placeholders
[kgp-old]: https://github.com/sxyazi/yazi/blob/main/yazi-adapter/src/drivers/kgp_old.rs
[iip]: https://iterm2.com/documentation-images.html
[sixel]: https://www.vt100.net/docs/vt3xx-gp/chapter14.html
[ascii-art]: https://en.wikipedia.org/wiki/ASCII_art
<!-- Dependencies -->
[ueberzug]: https://github.com/jstkdng/ueberzugpp
[chafa]: https://hpjansson.org/chafa/
## Special Thanks
<img alt="RustRover logo" align="right" width="200" src="https://resources.jetbrains.com/storage/products/company/brand/logos/RustRover.svg">
Thanks to RustRover team for providing open-source licenses to support the maintenance of Yazi.
Active code contributors can contact @sxyazi to get a license (if any are still available).
## License
Yazi is MIT-licensed. For more information check the [LICENSE](LICENSE) file.
================================================
FILE: assets/yazi.desktop
================================================
[Desktop Entry]
Name=Yazi File Manager
Icon=yazi
Comment=Blazing fast terminal file manager written in Rust, based on async I/O
Terminal=true
TryExec=yazi
Exec=yazi %u
Type=Application
MimeType=inode/directory
Categories=System;FileManager;FileTools;ConsoleOnly
Keywords=File;Manager;Explorer;Browser;Launcher
================================================
FILE: cspell.json
================================================
{"version":"0.2","flagWords":[],"words":["Punct","KEYMAP","splitn","crossterm","YAZI","peekable","ratatui","syntect","pbpaste","pbcopy","oneshot","Posix","Lsar","XADDOS","zoxide","cands","Deque","precache","imageops","IFBLK","IFCHR","IFDIR","IFIFO","IFLNK","IFMT","IFSOCK","IRGRP","IROTH","IRUSR","ISGID","ISUID","ISVTX","IWGRP","IWOTH","IWUSR","IXGRP","IXOTH","IXUSR","libc","winsize","TIOCGWINSZ","xpixel","ypixel","ioerr","appender","Catppuccin","macchiato","gitmodules","Dotfiles","bashprofile","vimrc","flac","webp","exiftool","mediainfo","ripgrep","indexmap","indexmap","unwatch","canonicalize","serde","fsevent","Ueberzug","iterm","wezterm","sixel","chafa","ueberzugpp","Konsole","Überzug","pkgs","pdftoppm","poppler","singlefile","jpegopt","EXIF","rustfmt","mktemp","nanos","xclip","xsel","natord","Mintty","nixos","nixpkgs","SIGTSTP","SIGCONT","SIGCONT","mlua","nonstatic","userdata","metatable","natsort","backstack","luajit","Succ","Succ","cand","fileencoding","foldmethod","lightgreen","darkgray","lightred","lightyellow","lightcyan","nushell","msvc","aarch","linemode","sxyazi","rsplit","ZELLIJ","bitflags","bitflags","USERPROFILE","Neovim","vergen","gitcl","Renderable","preloaders","prec","Upserting","prio","Ghostty","Catmull","Lanczos","cmds","unyank","scrolloff","headsup","unsub","uzers","scopeguard","SPDLOG","globset","filetime","magick","magick","prefetcher","Prework","prefetchers","PREWORKERS","conds","translit","rxvt","Urxvt","realpath","realname","REPARSE","hardlink","hardlinking","nlink","nlink","linemodes","SIGSTOP","sevenzip","rsplitn","replacen","DECSET","DECRQM","repeek","cwds","tcsi","Hyprland","Wayfire","SWAYSOCK","btime","nsec","codegen","gethostname","fchmod","fdfind","Rustc","rustc","ffprobe","vframes","luma","obase","outln","errln","tmtheme","twox","cfgs","fstype","objc","rdev","runloop","exfat","rclone","DECRQSS","DECSCUSR","libvterm","Uninit","lockin","rposition","resvg","foldhash","tilded","futs","chdir","hashbrown","JEMALLOC","RUSTFLAGS","RDONLY","GETPATH","fcntl","casefold","inodes","Splatable","casefied","thiserror","memchr","memmem","russh","deadpool","keepalive","nodelay","publickey","deadpool","initing","treelize","TOCTOU","fellback","watchee"],"language":"en"}
================================================
FILE: flake.nix
================================================
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
flake-utils.url = "github:numtide/flake-utils";
rust-overlay = {
url = "github:oxalica/rust-overlay";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs =
{
self,
nixpkgs,
rust-overlay,
flake-utils,
...
}:
flake-utils.lib.eachDefaultSystem (
system:
let
pkgs = import nixpkgs {
inherit system;
overlays = [ rust-overlay.overlays.default ];
};
toolchain = pkgs.rust-bin.stable.latest.default;
rustPlatform = pkgs.makeRustPlatform {
cargo = toolchain;
rustc = toolchain;
};
rev = self.shortRev or self.dirtyShortRev or "dirty";
date = self.lastModifiedDate or self.lastModified or "19700101";
version =
(builtins.fromTOML (builtins.readFile ./Cargo.toml)).workspace.package.version
+ "pre${builtins.substring 0 8 date}_${rev}";
in
{
packages = {
yazi-unwrapped = pkgs.callPackage ./nix/yazi-unwrapped.nix {
inherit
version
rev
date
rustPlatform
;
};
yazi = pkgs.callPackage ./nix/yazi.nix {
inherit (self.packages.${system}) yazi-unwrapped;
};
default = self.packages.${system}.yazi;
};
devShells = {
default = pkgs.callPackage ./nix/shell.nix {
inherit toolchain;
inherit (self.packages.${system}) yazi yazi-unwrapped;
};
};
formatter = pkgs.nixfmt-tree;
}
)
// {
overlays = {
default = self.overlays.yazi;
yazi = _: prev: {
inherit (self.packages.${prev.stdenv.system}) yazi yazi-unwrapped;
};
};
};
}
================================================
FILE: nix/shell.nix
================================================
{
mkShell,
yazi,
toolchain,
nodePackages,
yazi-unwrapped,
}:
mkShell {
packages = yazi.passthru.runtimePaths ++ [
(toolchain.override {
extensions = [
"rust-src"
"rustfmt"
"rust-analyzer"
"clippy"
];
})
nodePackages.cspell
];
inputsFrom = [ yazi-unwrapped ];
env.RUST_BACKTRACE = "1";
}
================================================
FILE: nix/yazi-unwrapped.nix
================================================
{
rustPlatform,
version ? "git",
rev ? "unknown",
date ? "19700101",
lib,
installShellFiles,
fetchFromGitHub,
rust-jemalloc-sys,
imagemagick,
}:
let
src = lib.fileset.toSource {
root = ../.;
fileset = lib.fileset.unions [
../assets
../Cargo.toml
../Cargo.lock
(lib.fileset.fromSource (lib.sources.sourceByRegex ../. [ "^yazi-.*" ]))
];
};
in
rustPlatform.buildRustPackage (finalAttrs: {
pname = "yazi";
inherit version src;
cargoLock = {
lockFile = "${src}/Cargo.lock";
#outputHashes = {
# "mlua-0.10.0" = "sha256-Xg6/jc+UP8tbJJ6x1sbAgt8ZHt051xEBBcjmikQqYlw=";
#};
};
env = {
YAZI_GEN_COMPLETIONS = true;
VERGEN_GIT_SHA = rev;
VERGEN_BUILD_DATE = builtins.concatStringsSep "-" (builtins.match "(.{4})(.{2})(.{2}).*" date);
};
nativeBuildInputs = [
installShellFiles
imagemagick
];
buildInputs = [
rust-jemalloc-sys
];
postInstall = ''
installShellCompletion --cmd yazi \
--bash ./yazi-boot/completions/yazi.bash \
--fish ./yazi-boot/completions/yazi.fish \
--zsh ./yazi-boot/completions/_yazi
# Resize logo
for RES in 16 24 32 48 64 128 256; do
mkdir -p $out/share/icons/hicolor/"$RES"x"$RES"/apps
magick assets/logo.png -resize "$RES"x"$RES" $out/share/icons/hicolor/"$RES"x"$RES"/apps/yazi.png
done
installManPage ${finalAttrs.passthru.srcs.man_src}/yazi{.1,-config.5}
mkdir -p $out/share/applications
install -m644 assets/yazi.desktop $out/share/applications/
'';
passthru.srcs = {
man_src = fetchFromGitHub {
name = "manpages"; # needed to ensure name is unique
owner = "yazi-rs";
repo = "manpages";
rev = "8950e968f4a1ad0b83d5836ec54a070855068dbf";
hash = "sha256-kEVXejDg4ChFoMNBvKlwdFEyUuTcY2VuK9j0PdafKus=";
};
};
meta = {
description = "Blazing fast terminal file manager written in Rust, based on async I/O";
homepage = "https://github.com/sxyazi/yazi";
license = lib.licenses.mit;
mainProgram = "yazi";
};
})
================================================
FILE: nix/yazi.nix
================================================
{
lib,
formats,
runCommand,
makeWrapper,
runtimeDeps ? (ps: ps),
# deps
file,
yazi-unwrapped,
# default optional deps
jq,
poppler-utils,
_7zz,
ffmpeg,
fd,
ripgrep,
resvg,
fzf,
zoxide,
imagemagick,
chafa,
settings ? { },
plugins ? { },
flavors ? { },
initLua ? null,
}:
let
inherit (lib)
concatStringsSep
concatMapStringsSep
optionalString
makeBinPath
mapAttrsToList
;
defaultDeps = [
jq
poppler-utils
_7zz
ffmpeg
fd
ripgrep
resvg
fzf
zoxide
imagemagick
chafa
];
runtimePaths = [ file ] ++ (runtimeDeps defaultDeps);
settingsFormat = formats.toml { };
files = [
"yazi"
"theme"
"keymap"
];
configHome =
if (settings == { } && initLua == null && plugins == { } && flavors == { }) then
null
else
runCommand "YAZI_CONFIG_HOME" { } ''
mkdir -p $out
${concatMapStringsSep "\n" (
name:
optionalString (settings ? ${name} && settings.${name} != { }) ''
ln -s ${settingsFormat.generate "${name}.toml" settings.${name}} $out/${name}.toml
''
) files}
mkdir $out/plugins
${optionalString (plugins != { }) ''
${concatStringsSep "\n" (
mapAttrsToList (name: value: "ln -s ${value} $out/plugins/${name}") plugins
)}
''}
mkdir $out/flavors
${optionalString (flavors != { }) ''
${concatStringsSep "\n" (
mapAttrsToList (name: value: "ln -s ${value} $out/flavors/${name}") flavors
)}
''}
${optionalString (initLua != null) "ln -s ${initLua} $out/init.lua"}
'';
in
runCommand yazi-unwrapped.name
{
inherit (yazi-unwrapped) pname version meta;
nativeBuildInputs = [ makeWrapper ];
passthru.runtimePaths = runtimePaths;
}
''
mkdir -p $out/bin
ln -s ${yazi-unwrapped}/share $out/share
ln -s ${yazi-unwrapped}/bin/ya $out/bin/ya
makeWrapper ${yazi-unwrapped}/bin/yazi $out/bin/yazi \
--prefix PATH : "${makeBinPath runtimePaths}" \
${optionalString (configHome != null) "--set YAZI_CONFIG_HOME ${configHome}"}
''
================================================
FILE: rustfmt.toml
================================================
color = "Never"
condense_wildcard_suffixes = true
edition = "2024"
enum_discrim_align_threshold = 99
fn_single_line = true
format_code_in_doc_comments = false
format_generated_files = false
format_macro_matchers = true
format_macro_bodies = true
format_strings = false
hard_tabs = true
hex_literal_case = "Lower"
show_parse_errors = false
imports_indent = "Visual"
imports_layout = "Horizontal"
imports_granularity = "Crate"
newline_style = "Unix"
normalize_comments = true
normalize_doc_attributes = false
overflow_delimited_expr = true
reorder_impl_items = true
group_imports = "StdExternalCrate"
reorder_modules = true
struct_field_align_threshold = 99
tab_spaces = 2
unstable_features = true
use_field_init_shorthand = true
use_small_heuristics = "Max"
use_try_shorthand = true
style_edition = "2024"
wrap_comments = true
================================================
FILE: scripts/build.sh
================================================
#!/usr/bin/env bash
set -euo pipefail
export ARTIFACT_NAME="yazi-$1"
export YAZI_GEN_COMPLETIONS=1
# Build the target
git config --global --add safe.directory "*"
cargo build --release --locked --target "$1"
# Copy the binaries to a known location
mkdir -p "target/release"
cp "target/$1/release/ya" "target/release/ya"
cp "target/$1/release/yazi" "target/release/yazi"
# Package deb
if [[ "$ARTIFACT_NAME" == *-linux-* ]] && { [[ "$ARTIFACT_NAME" == *-aarch64-* ]] || [[ "$ARTIFACT_NAME" == *-x86_64-* ]]; }; then
cargo install cargo-deb
cargo deb -p yazi-packing --no-build --target "$1" -o "$ARTIFACT_NAME.deb"
fi
# Create the artifact
mkdir -p "$ARTIFACT_NAME/completions"
cp "target/release/ya" "$ARTIFACT_NAME"
cp "target/release/yazi" "$ARTIFACT_NAME"
cp yazi-cli/completions/* "$ARTIFACT_NAME/completions"
cp yazi-boot/completions/* "$ARTIFACT_NAME/completions"
cp README.md LICENSE "$ARTIFACT_NAME"
# Zip the artifact
if ! command -v zip &> /dev/null; then
apt-get update && apt-get install -yq zip
fi
zip -r "$ARTIFACT_NAME.zip" "$ARTIFACT_NAME"
================================================
FILE: scripts/bump.sh
================================================
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR/.."
echo "Bumping version: $1"
TOML_FILES="$(git ls-files '*Cargo.toml')"
perl -pi -e 's/^version .*= .*$/version = "'"$1"'"/' -- $TOML_FILES
perl -pi -e 's/^(yazi-[a-z]+)\s*=\s*{.*$/\1 = { path = "..\/\1", version = "'"$1"'" }/' -- $TOML_FILES
# Insert "## [v$1]" after "## [Unreleased]"
perl -0777 -pe "s/^(## \[Unreleased\]\s*)/\\1## [v$1]\n\n/m" -i CHANGELOG.md
# Determine previous version and append compare link
prev_ver=$(grep -oE '^\[v[0-9][^]]+\]' CHANGELOG.md | tail -n1 | tr -d '[]')
link="\[v$1\]: https://github.com/sxyazi/yazi/compare/$prev_ver...v$1"
perl -pi -e 's{(\['"$prev_ver"'\]:[^\n]+\n)}{$1'"$link"'\n}s' CHANGELOG.md
ESLINT_USE_FLAT_CONFIG=true eslint -c ~/.config/rules/eslint/eslint.config.cjs --fix -- $TOML_FILES
================================================
FILE: scripts/icons/generate.lua
================================================
local dark = {
icons_by_filename = require("default.icons_by_filename"),
icons_by_file_extension = require("default.icons_by_file_extension"),
}
local light = {
icons_by_filename = require("light.icons_by_filename"),
icons_by_file_extension = require("light.icons_by_file_extension"),
}
function rearrange(by)
local map = {}
local source = by == "exts" and "icons_by_file_extension" or "icons_by_filename"
for k, v in pairs(dark[source]) do
map[k] = map[k] or {}
map[k].icon = v.icon
map[k].fg_dark = v.color:lower()
end
for k, v in pairs(light[source]) do
map[k].fg_light = v.color:lower()
end
return map
end
function dump(map)
local list = {}
for k, v in pairs(map) do
list[#list + 1] = { name = k, text = v.icon, fg_dark = v.fg_dark, fg_light = v.fg_light }
end
table.sort(list, function(a, b) return a.name:lower() < b.name:lower() end)
local dark, light = "", ""
for _, v in ipairs(list) do
-- stylua: ignore
dark = dark .. string.format('\t{ name = "%s", text = "%s", fg = "%s" },\n', v.name, v.text, v.fg_dark)
light = light .. string.format('\t{ name = "%s", text = "%s", fg = "%s" },\n', v.name, v.text, v.fg_light)
end
return dark, light
end
function save(typ, files, exts)
local p = string.format("../../yazi-config/preset/theme-%s.toml", typ)
local s = io.open(p, "r"):read("*a")
s = s:gsub("files = %[\n(.-)\n%]", string.format("files = [\n%s]", files))
s = s:gsub("exts = %[\n(.-)\n%]", string.format("exts = [\n%s]", exts))
io.open(p, "w"):write(s)
end
local dark_files, light_files = dump(rearrange("files"))
local dark_exts, light_exts = dump(rearrange("exts"))
save("dark", dark_files, dark_exts)
save("light", light_files, light_exts)
================================================
FILE: scripts/validate-form/main.js
================================================
const LABEL_NAME = "needs info"
const RE_VERSION = /Yazi\s+Version\s*:\s\d+\.\d+\.\d+\s\(/gm
const RE_DEPENDENCIES = /Dependencies\s+[/a-z]+\s*:\s/gm
const RE_CHECKLIST = /#{3}\s+Checklist\s+(?:^-\s+\[x]\s+.+?(?:\n|\r\n|$)){2}/gm
function bugReportBody(creator, content, hash) {
if (RE_DEPENDENCIES.test(content) && RE_CHECKLIST.test(content) && new RegExp(` \\(${hash}[a-f0-9]? `).test(content)) {
return null
}
return `Hey @${creator}, thank you for opening the issue to help improve Yazi, appreciate it!
I noticed that you did not correctly follow the issue template. Please ensure that:
- The bug can still be reproduced on the [newest nightly build](https://yazi-rs.github.io/docs/installation/#binaries).
- The debug information (\`yazi --debug\`) is updated for the newest nightly.
- The non-optional items in the checklist are checked.
Issues with \`${LABEL_NAME}\` will be marked ready once edited with the proper content, or closed after 2 days of inactivity.
Our maintainers work on Yazi in their free time, this helps them work efficiently, understand your setup quickly, and find a more appropriate solution. Thanks for your understanding! 🙏
`
}
function featureRequestBody(creator, content) {
if (RE_VERSION.test(content) && RE_DEPENDENCIES.test(content) && RE_CHECKLIST.test(content)) {
return null
}
return `Hey @${creator}, thank you for opening the issue to help improve Yazi, appreciate it!
I noticed that you did not correctly follow the issue template. Please ensure that:
- The requested feature does not exist in the [newest nightly build](https://yazi-rs.github.io/docs/installation/#binaries).
- The debug information (\`yazi --debug\`) is updated for the newest nightly.
- The non-optional items in the checklist are checked.
Issues with \`${LABEL_NAME}\` will be marked ready once edited with the proper content, or closed after 2 days of inactivity.
Our maintainers work on Yazi in their free time, this helps them work efficiently, understand your setup quickly, and find a more appropriate solution. Thanks for your understanding! 🙏
`
}
module.exports = async ({ github, context, core }) => {
async function nightlyHash() {
try {
const { data: tagRef } = await github.rest.git.getRef({ owner: "sxyazi", repo: "yazi", ref: "tags/nightly" })
return tagRef.object.sha.slice(0, 7)
} catch (e) {
if (e.status === 404) {
core.error("Nightly tag not found")
} else {
core.error(`Error fetching nightly version: ${e.message}`)
}
return null
}
}
async function hasLabel(id, label) {
try {
const { data: labels } = await github.rest.issues.listLabelsOnIssue({
...context.repo,
issue_number: id,
})
return labels.some(l => l.name === label)
} catch (e) {
core.error(`Error checking labels: ${e.message}`)
return false
}
}
async function lastLabeledAt(id) {
try {
const { data: events } = await github.rest.issues.listEvents({
...context.repo,
issue_number: id,
per_page: 100,
})
const all = events.filter(v => v.event === "labeled" && v.label?.name === LABEL_NAME)
return all.at(-1)?.created_at
} catch (e) {
core.error(`Error getting label timestamp: ${e.message}`)
return null
}
}
async function removedLabelManually(id) {
try {
const { data: events } = await github.rest.issues.listEvents({
...context.repo,
issue_number: id,
per_page: 100,
})
const all = events.filter(v => v.event === "unlabeled" && v.label?.name === LABEL_NAME)
return all.length === 0 ? false : !all.at(-1).actor.login.endsWith("[bot]")
} catch (e) {
core.error(`Error checking label removal history: ${e.message}`)
return false
}
}
async function updateLabels(id, mark, body) {
try {
const marked = await hasLabel(id, LABEL_NAME)
if (!mark && marked) {
await github.rest.issues.removeLabel({
...context.repo,
issue_number: id,
name: LABEL_NAME,
})
await hideOldComments(id)
} else if (mark && !marked && !await removedLabelManually(id)) {
await github.rest.issues.addLabels({
...context.repo,
issue_number: id,
labels: [LABEL_NAME],
})
await hideOldComments(id)
await github.rest.issues.createComment({
...context.repo,
issue_number: id,
body,
})
}
} catch (e) {
core.error(`Error updating labels: ${e.message}`)
}
}
async function hideOldComments(id) {
try {
const comments = await github.paginate(github.rest.issues.listComments, {
...context.repo,
issue_number: id,
per_page: 100,
})
for (const c of comments) {
const byBot = c.user?.login?.endsWith("[bot]") || c.user?.type === "Bot"
const contains = c?.body?.includes("or closed after 2 days of inactivity")
if (!byBot || !contains || !c.node_id) continue
try {
await github.graphql(
`mutation($subjectId: ID!, $classifier: ReportedContentClassifiers!) {
minimizeComment(input: {subjectId: $subjectId, classifier: $classifier}) {
minimizedComment { isMinimized }
}
}`,
{ subjectId: c.node_id, classifier: "OUTDATED" },
)
} catch (e) {
core.error(`Error minimizing comment ${c.id}: ${e.message}`)
}
}
} catch (e) {
core.error(`Error listing comments: ${e.message}`)
}
}
async function closeOldIssues() {
try {
const { data: issues } = await github.rest.issues.listForRepo({
...context.repo,
state: "open",
labels: LABEL_NAME,
})
const now = new Date()
const twoDaysAgo = new Date(now - 2 * 24 * 60 * 60 * 1000)
for (const issue of issues) {
const markedAt = new Date(await lastLabeledAt(issue.number) || issue.created_at)
if (markedAt < twoDaysAgo) {
await github.rest.issues.update({
...context.repo,
issue_number: issue.number,
state: "closed",
state_reason: "not_planned",
})
await github.rest.issues.createComment({
...context.repo,
issue_number: issue.number,
body: `This issue has been automatically closed because it was marked as \`${LABEL_NAME}\` for more than 2 days without updates.
If the problem persists, please file a new issue and complete the issue template so we can capture all the details necessary to investigate further.`,
})
}
}
} catch (e) {
core.error(`Error checking old issues: ${e.message}`)
}
}
async function closeUnsupportedIssue(id) {
try {
await github.rest.issues.update({
...context.repo,
issue_number: id,
state: "closed",
state_reason: "not_planned",
})
await github.rest.issues.createComment({
...context.repo,
issue_number: id,
body: `Unsupported issue template.
Either the [Bug Report](https://github.com/sxyazi/yazi/issues/new?template=bug.yml) or [Feature Request](https://github.com/sxyazi/yazi/issues/new?template=feature.yml) template should be used.`,
})
} catch (e) {
core.error(`Error closing unsupported issue: ${e.message}`)
}
}
async function main() {
const hash = await nightlyHash()
if (!hash) return
if (context.eventName === "schedule") {
await closeOldIssues()
return
}
if (context.eventName === "issues") {
const id = context.payload.issue.number
const content = context.payload.issue.body || ""
const creator = context.payload.issue.user.login
if (await hasLabel(id, "bug")) {
const body = bugReportBody(creator, content, hash)
await updateLabels(id, !!body, body)
} else if (await hasLabel(id, "feature")) {
const body = featureRequestBody(creator, content)
await updateLabels(id, !!body, body)
} else if (context.payload.action === "opened") {
await closeUnsupportedIssue(id)
}
}
}
await main()
}
================================================
FILE: scripts/validate-form/package.json
================================================
{
"name": "validate-form",
"version": "1.0.0",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"private": true,
"dependencies": {
"@actions/core": "^3.0.0",
"@actions/github": "^9.0.0"
}
}
================================================
FILE: snap/snapcraft.yaml
================================================
name: yazi
base: core24
adopt-info: yazi
summary: Blazing fast terminal file manager written in Rust, based on async I/O.
description: |
Yazi is a terminal file manager written in Rust, based on non-blocking async I/O.
It aims to provide an efficient, user-friendly, and customizable file management experience.
license: MIT
grade: stable
confinement: classic
platforms:
amd64:
arm64:
apps:
yazi:
command: yazi
environment:
PATH: $SNAP/bin:$SNAP/usr/bin:$PATH
ya:
command: ya
environment:
PATH: $SNAP/bin:$SNAP/usr/bin:$PATH
parts:
yazi:
plugin: rust
source: https://github.com/sxyazi/yazi.git
stage-snaps:
- jq
stage-packages:
- 7zip-standalone
- chafa
- fd-find
- ffmpeg
# - fzf
- libglu1-mesa
- libglut3.12
- poppler-utils
- ripgrep
- wl-clipboard
- xclip
- zoxide
override-build: |
craftctl default
craftctl set version=$(git describe --tags --abbrev=0)
build-attributes:
- enable-patchelf
organize:
# Ubuntu's `fd` package installs a binary named `fdfind`. Rename it in the snap.
usr/bin/fdfind: usr/bin/fd
prime:
# Remove unused items bought in by dependency packages
- -usr/bin/fc-*
- -usr/bin/ffplay
- -usr/bin/pdfattach
- -usr/bin/pdfdetach
- -usr/bin/pdffonts
- -usr/bin/pdfimages
- -usr/bin/pdfinfo
- -usr/bin/pdfseparate
- -usr/bin/pdfsig
- -usr/bin/pdftocairo
- -usr/bin/pdftohtml
- -usr/bin/pdftops
- -usr/bin/pdftotext
- -usr/bin/pdfunite
# Remove unused libraries identified by snapcraft's linter
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_bad_*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_civil_time.so.*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_cord*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_examine_stack.so.*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_exponential_biased.so.*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_failure_signal_handler.so.*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_flags*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_hash*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_log_severity.so.*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_periodic_sampler.so.*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_random*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_raw_hash_set.so.*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_scoped_set_env.so.*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_statusor.so.*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_status.so.*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_strerror.so.*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libabsl_str_format_internal.so.*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libcaca++.so.0.99.20
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libcjson_utils.so.1.7.17
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libfftw3_omp.so.3.6.10
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libfftw3_threads.so.3.6.10
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libflite_cmu_grapheme_lang.so.2.2
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libflite_cmu_grapheme_lex.so.2.2
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libflite_cmu_indic_lang.so.2.2
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libflite_cmu_indic_lex.so.2.2
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libflite_cmu_time_awb.so.2.2
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libfreebl3.so
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libfreeblpriv3.so
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libGLX_mesa.so.0.0.0
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libhwy_contrib.so.1.0.7
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libhwy_test.so.1.0.7
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libicui18n.so.74.2
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libicuio.so.74.2
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libicutest.so.74.2
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libicutu.so.74.2
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libjacknet.so.0.1.0
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libjackserver.so.0.1.0
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libnssckbi.so
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libnssdbm3.so
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libpulse-simple.so.0.1.1
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libsoftokn3.so
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libsphinxad.so.3.0.0
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libssl3.so
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libtheora.so.0.3.10
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libxcb-dri2.so.0.0.0
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libxcb-glx.so.0.0.0
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libxcb-present.so.0.0.0
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libxcb-sync.so.1.0.0
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libxshmfence.so.1.0.0
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libzvbi-chains.so.0.0.0
# The Ubuntu `imagemagick` package does not ship a `magick` binary,
# which `yazi` looks for. Building the package oursleves yields the
# expected binary without much overhead, and works across platforms.
magick:
plugin: autotools
source: https://github.com/ImageMagick/ImageMagick.git
source-type: git
source-tag: 7.1.2-0
source-depth: 1
stage-packages:
- libgomp1
autotools-configure-parameters:
- --prefix=/usr
build-attributes:
- enable-patchelf
prime:
- usr/bin/magick
- usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libgomp.so.1
- usr/lib/libMagickCore-7.Q16HDRI.so*
- usr/lib/libMagickWand-7.Q16HDRI.so*
cleanup:
after: [yazi, magick]
plugin: nil
build-packages:
- patchelf
build-snaps:
- core24
override-prime: |
# Ubuntu's /usr/bin/7zz is a simple bash wrapper that just exec's
# /usr/lib/7zip/7zz - this just shortcuts that and places the actual
# executable at $SNAP/usr/bin/7zz.
mv $CRAFT_PRIME/usr/lib/7zip/7zz $CRAFT_PRIME/usr/bin/7zz
# Ensure we don't ship duplicates of files that exist in the core24
# snap.
cd /snap/core24/current
find . -type f,l -exec rm -rf "${CRAFT_PRIME}/{}" \;
================================================
FILE: stylua.toml
================================================
syntax = "Lua54"
indent_width = 2
call_parentheses = "NoSingleTable"
collapse_simple_statement = "FunctionOnly"
[sort_requires]
enabled = true
================================================
FILE: yazi-actor/Cargo.toml
================================================
[package]
name = "yazi-actor"
description = "Yazi actor model"
version.workspace = true
edition.workspace = true
license.workspace = true
authors.workspace = true
homepage.workspace = true
repository.workspace = true
rust-version.workspace = true
[lints]
workspace = true
[features]
default = [ "vendored-lua" ]
vendored-lua = [ "mlua/vendored" ]
[dependencies]
yazi-binding = { path = "../yazi-binding", version = "26.2.2" }
yazi-boot = { path = "../yazi-boot", version = "26.2.2" }
yazi-config = { path = "../yazi-config", version = "26.2.2" }
yazi-core = { path = "../yazi-core", version = "26.2.2" }
yazi-dds = { path = "../yazi-dds", version = "26.2.2" }
yazi-emulator = { path = "../yazi-emulator", version = "26.2.2" }
yazi-fs = { path = "../yazi-fs", version = "26.2.2" }
yazi-macro = { path = "../yazi-macro", version = "26.2.2" }
yazi-parser = { path = "../yazi-parser", version = "26.2.2" }
yazi-plugin = { path = "../yazi-plugin", version = "26.2.2" }
yazi-proxy = { path = "../yazi-proxy", version = "26.2.2" }
yazi-scheduler = { path = "../yazi-scheduler", version = "26.2.2" }
yazi-shared = { path = "../yazi-shared", version = "26.2.2" }
yazi-term = { path = "../yazi-term", version = "26.2.2" }
yazi-tty = { path = "../yazi-tty", version = "26.2.2" }
yazi-vfs = { path = "../yazi-vfs", version = "26.2.2" }
yazi-watcher = { path = "../yazi-watcher", version = "26.2.2" }
yazi-widgets = { path = "../yazi-widgets", version = "26.2.2" }
# External dependencies
anyhow = { workspace = true }
crossterm = { workspace = true }
either = { workspace = true }
futures = { workspace = true }
hashbrown = { workspace = true }
mlua = { workspace = true }
paste = { workspace = true }
ratatui = { workspace = true }
scopeguard = { workspace = true }
tokio = { workspace = true }
tokio-stream = { workspace = true }
tracing = { workspace = true }
[target."cfg(unix)".dependencies]
libc = { workspace = true }
[target.'cfg(target_os = "macos")'.dependencies]
crossterm = { workspace = true, features = [ "use-dev-tty", "libc" ] }
================================================
FILE: yazi-actor/README.md
================================================
# yazi-actor
This crate is part of [Yazi][source], and it is not supposed to be used outside, as there are no guarantees about the stability of its API.
[source]: https://github.com/sxyazi/yazi
================================================
FILE: yazi-actor/src/actor.rs
================================================
use anyhow::Result;
use yazi_dds::spark::SparkKind;
use yazi_shared::data::Data;
use crate::Ctx;
pub trait Actor {
type Options;
const NAME: &str;
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data>;
fn hook(_cx: &Ctx, _opt: &Self::Options) -> Option<SparkKind> { None }
}
================================================
FILE: yazi-actor/src/app/accept_payload.rs
================================================
use anyhow::Result;
use mlua::IntoLua;
use tracing::error;
use yazi_actor::lives::Lives;
use yazi_binding::runtime_scope;
use yazi_dds::{LOCAL, Payload, REMOTE};
use yazi_macro::succ;
use yazi_plugin::LUA;
use yazi_shared::data::Data;
use crate::{Actor, Ctx};
pub struct AcceptPayload;
impl Actor for AcceptPayload {
type Options = Payload<'static>;
const NAME: &str = "accept_payload";
fn act(cx: &mut Ctx, payload: Payload) -> Result<Data> {
let kind = payload.body.kind();
let lock = if payload.receiver == 0 || payload.receiver != payload.sender {
REMOTE.read()
} else {
LOCAL.read()
};
let Some(handlers) = lock.get(kind).filter(|&m| !m.is_empty()).cloned() else { succ!() };
drop(lock);
let kind = kind.to_owned();
succ!(Lives::scope(cx.core, || {
let body = payload.body.into_lua(&LUA)?;
for (id, cb) in handlers {
if let Err(e) = runtime_scope!(LUA, &id, cb.call::<()>(body.clone())) {
error!("Failed to run `{kind}` event handler in your `{id}` plugin: {e}");
}
}
Ok(())
})?);
}
}
================================================
FILE: yazi-actor/src/app/bootstrap.rs
================================================
use anyhow::Result;
use yazi_actor::Ctx;
use yazi_boot::BOOT;
use yazi_macro::{act, succ};
use yazi_parser::{VoidOpt, mgr::CdSource};
use yazi_shared::{data::Data, strand::StrandLike, url::UrlLike};
use crate::Actor;
pub struct Bootstrap;
impl Actor for Bootstrap {
type Options = VoidOpt;
const NAME: &str = "bootstrap";
fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
cx.mgr.tabs.resize_with(BOOT.files.len(), Default::default);
for (i, file) in BOOT.files.iter().enumerate().rev() {
cx.tab = i;
if file.is_empty() {
act!(mgr:cd, cx, (BOOT.cwds[i].clone(), CdSource::Tab))?;
} else if let Ok(u) = BOOT.cwds[i].try_join(file) {
act!(mgr:reveal, cx, (u, CdSource::Tab))?;
}
}
succ!();
}
}
================================================
FILE: yazi-actor/src/app/deprecate.rs
================================================
use anyhow::Result;
use yazi_macro::act;
use yazi_parser::{app::DeprecateOpt, notify::{PushLevel, PushOpt}};
use yazi_shared::data::Data;
use crate::{Actor, Ctx};
pub struct Deprecate;
impl Actor for Deprecate {
type Options = DeprecateOpt;
const NAME: &str = "deprecate";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
act!(notify:push, cx, PushOpt {
title: "Deprecated API".to_owned(),
content: opt.content.into_owned(),
level: PushLevel::Warn,
timeout: std::time::Duration::from_secs(20),
})
}
}
================================================
FILE: yazi-actor/src/app/focus.rs
================================================
use anyhow::Result;
use yazi_actor::Ctx;
use yazi_macro::act;
use yazi_parser::VoidOpt;
use yazi_shared::data::Data;
use crate::Actor;
pub struct Focus;
impl Actor for Focus {
type Options = VoidOpt;
const NAME: &str = "focus";
fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> { act!(mgr:refresh, cx) }
}
================================================
FILE: yazi-actor/src/app/mod.rs
================================================
yazi_macro::mod_flat!(
accept_payload
bootstrap
deprecate
focus
mouse
plugin
plugin_do
quit
reflow
resize
resume
stop
title
update_progress
);
================================================
FILE: yazi-actor/src/app/mouse.rs
================================================
use anyhow::Result;
use crossterm::event::MouseEventKind;
use mlua::{ObjectLike, Table};
use tracing::error;
use yazi_actor::lives::Lives;
use yazi_binding::runtime_scope;
use yazi_config::YAZI;
use yazi_macro::succ;
use yazi_parser::app::MouseOpt;
use yazi_plugin::LUA;
use yazi_shared::data::Data;
use crate::{Actor, Ctx};
pub struct Mouse;
impl Actor for Mouse {
type Options = MouseOpt;
const NAME: &str = "mouse";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
let event = yazi_binding::MouseEvent::from(opt.event);
let Some(size) = cx.term.as_ref().and_then(|t| t.size().ok()) else { succ!() };
let area = yazi_binding::elements::Rect::from(size);
let result = Lives::scope(cx.core, move || {
let root = runtime_scope!(LUA, "root", {
LUA.globals().raw_get::<Table>("Root")?.call_method::<Table>("new", area)
})?;
if matches!(event.kind, MouseEventKind::Down(_) if YAZI.mgr.mouse_events.get().draggable()) {
root.raw_set("_drag_start", event)?;
}
match event.kind {
MouseEventKind::Down(_) => root.call_method("click", (event, false))?,
MouseEventKind::Up(_) => root.call_method("click", (event, true))?,
MouseEventKind::ScrollDown => root.call_method("scroll", (event, 1))?,
MouseEventKind::ScrollUp => root.call_method("scroll", (event, -1))?,
MouseEventKind::ScrollRight => root.call_method("touch", (event, 1))?,
MouseEventKind::ScrollLeft => root.call_method("touch", (event, -1))?,
MouseEventKind::Moved => root.call_method("move", event)?,
MouseEventKind::Drag(_) => root.call_method("drag", event)?,
}
Ok(())
});
if let Err(ref e) = result {
error!("{e}");
}
succ!(result?);
}
}
================================================
FILE: yazi-actor/src/app/plugin.rs
================================================
use anyhow::Result;
use yazi_macro::{act, succ};
use yazi_parser::app::{PluginMode, PluginOpt};
use yazi_plugin::loader::LOADER;
use yazi_proxy::{AppProxy, NotifyProxy};
use yazi_shared::data::Data;
use crate::{Actor, Ctx};
pub struct Plugin;
impl Actor for Plugin {
type Options = PluginOpt;
const NAME: &str = "plugin";
fn act(cx: &mut Ctx, mut opt: Self::Options) -> Result<Data> {
let mut hits = false;
if let Some(chunk) = LOADER.read().get(&*opt.id) {
hits = true;
opt.mode = opt.mode.auto_then(chunk.sync_entry);
}
if opt.mode == PluginMode::Async {
succ!(cx.core.tasks.scheduler.plugin_entry(opt));
} else if opt.mode == PluginMode::Sync && hits {
return act!(app:plugin_do, cx, opt);
}
tokio::spawn(async move {
match LOADER.ensure(&opt.id, |_| ()).await {
Ok(()) => AppProxy::plugin_do(opt),
Err(e) => NotifyProxy::push_error("Plugin load failed", e),
}
});
succ!();
}
}
================================================
FILE: yazi-actor/src/app/plugin_do.rs
================================================
use anyhow::Result;
use mlua::ObjectLike;
use scopeguard::defer;
use tracing::{error, warn};
use yazi_binding::runtime_mut;
use yazi_dds::Sendable;
use yazi_macro::succ;
use yazi_parser::app::{PluginMode, PluginOpt};
use yazi_plugin::{LUA, loader::{LOADER, Loader}};
use yazi_proxy::NotifyProxy;
use yazi_shared::data::Data;
use crate::{Actor, Ctx, lives::Lives};
pub struct PluginDo;
impl Actor for PluginDo {
type Options = PluginOpt;
const NAME: &str = "plugin_do";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
let loader = LOADER.read();
let Some(chunk) = loader.get(&*opt.id) else {
succ!(warn!("plugin `{}` not found", opt.id));
};
if let Err(e) = Loader::compatible_or_error(&opt.id, chunk) {
succ!(NotifyProxy::push_error("Incompatible plugin", e));
}
if opt.mode.auto_then(chunk.sync_entry) != PluginMode::Sync {
succ!(cx.core.tasks.scheduler.plugin_entry(opt));
}
let blocking = runtime_mut!(LUA)?.critical_push(&opt.id, true);
defer! { _ = runtime_mut!(LUA).map(|mut r| r.critical_pop(blocking)) }
let plugin = match LOADER.load_chunk(&LUA, &opt.id, chunk) {
Ok(t) => t,
Err(e) => succ!(warn!("{e}")),
};
drop(loader);
let result = Lives::scope(cx.core, || {
if let Some(cb) = opt.callback {
cb(&LUA, plugin)
} else {
let job = LUA.create_table_from([("args", Sendable::args_to_table(&LUA, opt.args)?)])?;
plugin.call_method("entry", job)
}
});
if let Err(ref e) = result {
error!("Sync plugin `{}` failed: {e}", opt.id);
}
succ!(result?);
}
}
================================================
FILE: yazi-actor/src/app/quit.rs
================================================
use anyhow::Result;
use yazi_boot::ARGS;
use yazi_fs::provider::{Provider, local::Local};
use yazi_parser::app::QuitOpt;
use yazi_shared::{data::Data, strand::{StrandBuf, StrandLike, ToStrand}};
use yazi_term::Term;
use crate::{Actor, Ctx};
pub struct Quit;
impl Actor for Quit {
type Options = QuitOpt;
const NAME: &str = "quit";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
cx.tasks.shutdown();
cx.mgr.shutdown();
futures::executor::block_on(async {
_ = futures::join!(
yazi_dds::shutdown(),
yazi_dds::STATE.drain(),
Self::cwd_to_file(cx, opt.no_cwd_file),
Self::selected_to_file(opt.selected)
);
});
Term::goodbye(|| opt.code);
}
}
impl Quit {
async fn cwd_to_file(cx: &Ctx<'_>, no: bool) {
if let Some(p) = ARGS.cwd_file.as_ref().filter(|_| !no) {
let cwd = cx.mgr.cwd().to_strand();
Local::regular(p).write(cwd.encoded_bytes()).await.ok();
}
}
async fn selected_to_file(selected: Option<StrandBuf>) {
if let (Some(s), Some(p)) = (selected, &ARGS.chooser_file) {
Local::regular(p).write(s.encoded_bytes()).await.ok();
}
}
}
================================================
FILE: yazi-actor/src/app/reflow.rs
================================================
use anyhow::Result;
use mlua::Value;
use ratatui::layout::Position;
use tracing::error;
use yazi_actor::lives::Lives;
use yazi_config::LAYOUT;
use yazi_macro::{render, succ};
use yazi_parser::app::ReflowOpt;
use yazi_shared::data::Data;
use crate::{Actor, Ctx};
pub struct Reflow;
impl Actor for Reflow {
type Options = ReflowOpt;
const NAME: &str = "reflow";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
let Some(size) = cx.term.as_ref().and_then(|t| t.size().ok()) else { succ!() };
let mut layout = LAYOUT.get();
let result = Lives::scope(cx.core, || {
let comps = (opt.reflow)((Position::ORIGIN, size).into())?;
for v in comps.sequence_values::<Value>() {
let Value::Table(t) = v? else {
error!("`reflow()` must return a table of components");
continue;
};
let id: mlua::String = t.get("_id")?;
match &*id.as_bytes() {
b"current" => layout.current = *t.raw_get::<yazi_binding::elements::Rect>("_area")?,
b"preview" => layout.preview = *t.raw_get::<yazi_binding::elements::Rect>("_area")?,
b"progress" => layout.progress = *t.raw_get::<yazi_binding::elements::Rect>("_area")?,
_ => {}
}
}
Ok(())
});
if layout != LAYOUT.get() {
LAYOUT.set(layout);
render!();
}
if let Err(ref e) = result {
error!("Failed to `reflow()` the `Root` component:\n{e}");
}
succ!();
}
}
================================================
FILE: yazi-actor/src/app/resize.rs
================================================
use anyhow::Result;
use yazi_actor::Ctx;
use yazi_macro::act;
use yazi_parser::app::ReflowOpt;
use yazi_shared::data::Data;
use crate::Actor;
pub struct Resize;
impl Actor for Resize {
type Options = ReflowOpt;
const NAME: &str = "resize";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
act!(app:reflow, cx, opt)?;
cx.current_mut().arrow(0);
cx.parent_mut().map(|f| f.arrow(0));
cx.current_mut().sync_page(true);
act!(mgr:peek, cx)
}
}
================================================
FILE: yazi-actor/src/app/resume.rs
================================================
use anyhow::Result;
use yazi_macro::{act, render, succ};
use yazi_parser::app::ResumeOpt;
use yazi_shared::data::Data;
use yazi_term::Term;
use crate::{Actor, Ctx};
pub struct Resume;
impl Actor for Resume {
type Options = ResumeOpt;
const NAME: &str = "resume";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
cx.active_mut().preview.reset();
*cx.term = Some(Term::start()?);
// While the app resumes, it's possible that the terminal size has changed.
// We need to trigger a resize, and render the UI based on the resized area.
act!(app:resize, cx, opt.reflow)?;
opt.tx.send((true, opt.token))?;
act!(app:title, cx).ok();
succ!(render!());
}
}
================================================
FILE: yazi-actor/src/app/stop.rs
================================================
use anyhow::Result;
use yazi_macro::succ;
use yazi_parser::app::StopOpt;
use yazi_shared::data::Data;
use crate::{Actor, Ctx};
pub struct Stop;
impl Actor for Stop {
type Options = StopOpt;
const NAME: &str = "stop";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
cx.active_mut().preview.reset_image();
// We need to destroy the `term` first before stopping the `signals`
// to prevent any signal from triggering the term to render again
// while the app is being suspended.
*cx.term = None;
opt.tx.send((false, opt.token))?;
succ!();
}
}
================================================
FILE: yazi-actor/src/app/title.rs
================================================
use anyhow::Result;
use crossterm::{execute, terminal::SetTitle};
use yazi_actor::Ctx;
use yazi_dds::spark::SparkKind;
use yazi_macro::succ;
use yazi_parser::app::TitleOpt;
use yazi_shared::{Source, data::Data};
use yazi_term::TermState;
use yazi_tty::TTY;
use crate::Actor;
pub struct Title;
impl Actor for Title {
type Options = TitleOpt;
const NAME: &str = "title";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
let s = opt.value.unwrap_or_else(|| format!("Yazi: {}", cx.tab().name()).into());
execute!(TTY.writer(), SetTitle(&s))?;
yazi_term::STATE.set(TermState { title: !s.is_empty(), ..yazi_term::STATE.get() });
succ!()
}
fn hook(cx: &Ctx, _opt: &Self::Options) -> Option<SparkKind> {
match cx.source() {
Source::Ind => Some(SparkKind::IndAppTitle),
_ => None,
}
}
}
================================================
FILE: yazi-actor/src/app/update_progress.rs
================================================
use anyhow::Result;
use yazi_actor::Ctx;
use yazi_macro::{act, render, render_partial, succ};
use yazi_parser::app::UpdateProgressOpt;
use yazi_shared::data::Data;
use crate::Actor;
pub struct UpdateProgress;
impl Actor for UpdateProgress {
type Options = UpdateProgressOpt;
const NAME: &str = "update_progress";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
// Update the progress of all tasks.
let tasks = &mut cx.tasks;
let progressed = tasks.summary != opt.summary;
tasks.summary = opt.summary;
// If the task manager is visible, update the snaps with a full render.
if tasks.visible {
let new = tasks.paginate();
if tasks.snaps != new {
tasks.snaps = new;
act!(tasks:arrow, cx)?;
succ!(render!());
}
}
if !progressed {
succ!()
} else if tasks.summary.total == 0 {
succ!(render!())
} else {
succ!(render_partial!())
}
}
}
================================================
FILE: yazi-actor/src/cmp/arrow.rs
================================================
use anyhow::Result;
use yazi_macro::{render, succ};
use yazi_parser::ArrowOpt;
use yazi_shared::data::Data;
use yazi_widgets::Scrollable;
use crate::{Actor, Ctx};
pub struct Arrow;
impl Actor for Arrow {
type Options = ArrowOpt;
const NAME: &str = "arrow";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
succ!(render!(cx.cmp.scroll(opt.step)));
}
}
================================================
FILE: yazi-actor/src/cmp/close.rs
================================================
use std::mem;
use anyhow::Result;
use yazi_macro::{act, render, succ};
use yazi_parser::cmp::CloseOpt;
use yazi_shared::data::Data;
use yazi_widgets::input::parser::CompleteOpt;
use crate::{Actor, Ctx};
pub struct Close;
impl Actor for Close {
type Options = CloseOpt;
const NAME: &str = "close";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
let cmp = &mut cx.cmp;
if let Some(item) = cmp.selected().filter(|_| opt.submit).cloned() {
return act!(input:complete, cx, CompleteOpt { name: item.name, is_dir: item.is_dir, ticket: cmp.ticket });
}
cmp.caches.clear();
cmp.ticket = Default::default();
cmp.handle.take().map(|h| h.abort());
succ!(render!(mem::replace(&mut cmp.visible, false)));
}
}
================================================
FILE: yazi-actor/src/cmp/mod.rs
================================================
yazi_macro::mod_flat!(arrow close show trigger);
================================================
FILE: yazi-actor/src/cmp/show.rs
================================================
use std::{mem, ops::ControlFlow};
use anyhow::Result;
use yazi_macro::{render, succ};
use yazi_parser::cmp::{CmpItem, ShowOpt};
use yazi_shared::{data::Data, path::{AsPath, PathDyn}, strand::StrandLike};
use crate::{Actor, Ctx};
const LIMIT: usize = 30;
pub struct Show;
impl Actor for Show {
type Options = ShowOpt;
const NAME: &str = "show";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
let cmp = &mut cx.cmp;
if cmp.ticket != opt.ticket {
succ!();
}
if !opt.cache.is_empty() {
cmp.caches.insert(opt.cache_name.clone(), opt.cache);
}
let Some(cache) = cmp.caches.get(&opt.cache_name) else {
succ!();
};
cmp.matches = Self::match_candidates(opt.word.as_path(), cache);
if cmp.matches.is_empty() {
succ!(render!(mem::replace(&mut cmp.visible, false)));
}
cmp.offset = 0;
cmp.cursor = 0;
cmp.visible = true;
succ!(render!());
}
}
impl Show {
fn match_candidates(word: PathDyn, cache: &[CmpItem]) -> Vec<CmpItem> {
let smart = !word.encoded_bytes().iter().any(|&b| b.is_ascii_uppercase());
let flow = cache.iter().try_fold((Vec::new(), Vec::new()), |(mut exact, mut fuzzy), item| {
let starts_with = if smart {
item.name.starts_with_ignore_ascii_case(word)
} else {
item.name.starts_with(word)
};
if starts_with {
exact.push(item);
if exact.len() >= LIMIT {
return ControlFlow::Break((exact, fuzzy));
}
} else if fuzzy.len() < LIMIT - exact.len() && item.name.contains(word) {
// Here we don't break the control flow, since we want more exact matching.
fuzzy.push(item)
}
ControlFlow::Continue((exact, fuzzy))
});
let (exact, fuzzy) = match flow {
ControlFlow::Continue(v) => v,
ControlFlow::Break(v) => v,
};
let it = fuzzy.into_iter().take(LIMIT - exact.len());
exact.into_iter().chain(it).cloned().collect()
}
}
================================================
FILE: yazi-actor/src/cmp/trigger.rs
================================================
use std::{io, mem};
use anyhow::Result;
use yazi_fs::{path::clean_url, provider::{DirReader, FileHolder}};
use yazi_macro::{act, render, succ};
use yazi_parser::cmp::{CmpItem, ShowOpt, TriggerOpt};
use yazi_proxy::CmpProxy;
use yazi_shared::{AnyAsciiChar, BytePredictor, data::Data, natsort, path::{AsPath, PathBufDyn, PathLike}, scheme::{SchemeCow, SchemeLike}, strand::{AsStrand, StrandLike}, url::{UrlBuf, UrlCow, UrlLike}};
use yazi_vfs::provider;
use crate::{Actor, Ctx};
pub struct Trigger;
impl Actor for Trigger {
type Options = TriggerOpt;
const NAME: &str = "trigger";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
if opt.ticket.is_some_and(|t| t != cx.cmp.ticket) {
succ!();
} else if opt.ticket.is_none() {
cx.cmp.ticket = cx.input.ticket.current();
}
cx.cmp.handle.take().map(|h| h.abort());
let Some((parent, word)) = Self::split_url(&opt.word) else {
return act!(cmp:close, cx, false);
};
let ticket = cx.cmp.ticket;
if cx.cmp.caches.contains_key(&parent) {
return act!(cmp:show, cx, ShowOpt { cache: vec![], cache_name: parent, word, ticket });
}
cx.cmp.handle = Some(tokio::spawn(async move {
let mut dir = provider::read_dir(&parent).await?;
let mut cache = vec![];
// "/" is both a directory separator and the root directory per se
// As there's no parent directory for the FS root, it is a special case
if parent.loc() == "/" {
cache.push(CmpItem { name: Default::default(), is_dir: true });
}
while let Ok(Some(ent)) = dir.next().await {
if let Ok(ft) = ent.file_type().await {
cache.push(CmpItem { name: ent.name().into_owned(), is_dir: ft.is_dir() });
}
}
if !cache.is_empty() {
cache
.sort_unstable_by(|a, b| natsort(a.name.encoded_bytes(), b.name.encoded_bytes(), false));
CmpProxy::show(ShowOpt { cache, cache_name: parent, word, ticket });
}
Ok::<_, io::Error>(())
}));
succ!(render!(mem::replace(&mut cx.cmp.visible, false)));
}
}
impl Trigger {
fn split_url(s: &str) -> Option<(UrlBuf, PathBufDyn)> {
let sep = if cfg!(windows) {
AnyAsciiChar::new(b"/\\").unwrap()
} else {
AnyAsciiChar::new(b"/").unwrap()
};
let (scheme, path) = SchemeCow::parse(s.as_bytes()).ok()?;
if path.is_empty() && !sep.predicate(s.bytes().last()?) {
return None; // We don't complete a `sftp://test`, but `sftp://test/`
}
// Scheme
let scheme = scheme.zeroed();
if scheme.is_local() && path.as_strand() == "~" {
return None; // We don't complete a `~`, but `~/`
}
// Child
let child = path.rsplit_pred(sep).map_or(path.as_path(), |(_, c)| c).to_owned();
// Parent
let url = UrlCow::try_from((scheme.clone().zeroed(), path)).ok()?;
let abs = if let Some(u) = provider::try_absolute(&url) { u } else { url };
let parent = abs.loc().try_strip_suffix(&child).ok()?;
Some((clean_url(UrlCow::try_from((scheme, parent)).ok()?), child))
}
}
#[cfg(test)]
mod tests {
use yazi_fs::CWD;
use yazi_shared::url::UrlLike;
use super::*;
fn compare(s: &str, parent: &str, child: &str) {
let (mut p, c) = Trigger::split_url(s).unwrap();
if let Ok(u) = p.try_strip_prefix(yazi_fs::CWD.load().as_ref()) {
p = UrlBuf::Regular(u.as_os().unwrap().into());
}
assert_eq!((p, c.to_str().unwrap()), (parent.parse().unwrap(), child));
}
#[cfg(unix)]
#[test]
fn test_split() {
yazi_shared::init_tests();
yazi_fs::init();
assert_eq!(Trigger::split_url(""), None);
assert_eq!(Trigger::split_url("sftp://test"), None);
compare(" ", "", " ");
compare("/", "/", "");
compare("//", "/", "");
compare("///", "/", "");
compare("/foo", "/", "foo");
compare("//foo", "/", "foo");
compare("///foo", "/", "foo");
compare("/foo/", "/foo/", "");
compare("//foo/", "/foo/", "");
compare("/foo/bar", "/foo/", "bar");
compare("///foo/bar", "/foo/", "bar");
CWD.set(&"sftp://test".parse::<UrlBuf>().unwrap(), || {});
compare("sftp://test/a", "sftp://test/.", "a");
compare("sftp://test//a", "sftp://test//", "a");
compare("sftp://test2/a", "sftp://test2/.", "a");
compare("sftp://test2//a", "sftp://test2//", "a");
}
#[cfg(windows)]
#[test]
fn test_split() {
yazi_fs::init();
compare("foo", "", "foo");
compare(r"foo\", r"foo\", "");
compare(r"foo\bar", r"foo\", "bar");
compare(r"foo\bar\", r"foo\bar\", "");
compare(r"C:\", r"C:\", "");
compare(r"C:\foo", r"C:\", "foo");
compare(r"C:\foo\", r"C:\foo\", "");
compare(r"C:\foo\bar", r"C:\foo\", "bar");
}
}
================================================
FILE: yazi-actor/src/confirm/arrow.rs
================================================
use anyhow::Result;
use yazi_macro::{render, succ};
use yazi_parser::ArrowOpt;
use yazi_shared::data::Data;
use crate::{Actor, Ctx};
pub struct Arrow;
impl Actor for Arrow {
type Options = ArrowOpt;
const NAME: &str = "arrow";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
let confirm = &mut cx.core.confirm;
let area = cx.core.mgr.area(confirm.position);
let len = confirm.list.line_count(area.width);
let old = confirm.offset;
confirm.offset = opt.step.add(confirm.offset, len, area.height as _);
succ!(render!(old != confirm.offset));
}
}
================================================
FILE: yazi-actor/src/confirm/close.rs
================================================
use anyhow::Result;
use yazi_macro::{render, succ};
use yazi_parser::confirm::CloseOpt;
use yazi_shared::data::Data;
use crate::{Actor, Ctx};
pub struct Close;
impl Actor for Close {
type Options = CloseOpt;
const NAME: &str = "close";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
cx.confirm.token.complete(opt.submit);
cx.confirm.visible = false;
succ!(render!());
}
}
================================================
FILE: yazi-actor/src/confirm/mod.rs
================================================
yazi_macro::mod_flat!(arrow close show);
================================================
FILE: yazi-actor/src/confirm/show.rs
================================================
use anyhow::Result;
use yazi_macro::{act, render, succ};
use yazi_parser::confirm::ShowOpt;
use yazi_shared::data::Data;
use crate::{Actor, Ctx};
pub struct Show;
impl Actor for Show {
type Options = ShowOpt;
const NAME: &str = "show";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
act!(confirm:close, cx)?;
let confirm = &mut cx.confirm;
confirm.title = opt.cfg.title;
confirm.body = opt.cfg.body;
confirm.list = opt.cfg.list;
confirm.position = opt.cfg.position;
confirm.offset = 0;
confirm.token = opt.token;
confirm.visible = true;
succ!(render!());
}
}
================================================
FILE: yazi-actor/src/context.rs
================================================
use std::ops::{Deref, DerefMut};
use anyhow::{Result, anyhow};
use yazi_core::{Core, mgr::Tabs, tab::{Folder, Tab}, tasks::Tasks};
use yazi_fs::File;
use yazi_shared::{Id, Source, event::Action, url::UrlBuf};
use yazi_term::Term;
pub struct Ctx<'a> {
pub core: &'a mut Core,
pub term: &'a mut Option<Term>,
pub tab: usize,
pub level: usize,
pub source: Source,
#[cfg(debug_assertions)]
pub backtrace: Vec<&'static str>,
}
impl Deref for Ctx<'_> {
type Target = Core;
fn deref(&self) -> &Self::Target { self.core }
}
impl DerefMut for Ctx<'_> {
fn deref_mut(&mut self) -> &mut Self::Target { self.core }
}
impl<'a> Ctx<'a> {
#[inline]
pub fn new(action: &Action, core: &'a mut Core, term: &'a mut Option<Term>) -> Result<Self> {
let tab = if let Ok(id) = action.get::<Id>("tab") {
core
.mgr
.tabs
.iter()
.position(|t| t.id == id)
.ok_or_else(|| anyhow!("Tab with id {id} not found"))?
} else {
core.mgr.tabs.cursor
};
Ok(Self {
core,
term,
tab,
level: 0,
source: action.source,
#[cfg(debug_assertions)]
backtrace: vec![],
})
}
#[inline]
pub fn renew<'b>(cx: &'a mut Ctx<'b>) -> Self {
let tab = cx.core.mgr.tabs.cursor;
Self {
core: cx.core,
term: cx.term,
tab,
level: cx.level,
source: cx.source,
#[cfg(debug_assertions)]
backtrace: vec![],
}
}
#[inline]
pub fn active(core: &'a mut Core, term: &'a mut Option<Term>) -> Self {
let tab = core.mgr.tabs.cursor;
Self {
core,
term,
tab,
level: 0,
source: Source::Unknown,
#[cfg(debug_assertions)]
backtrace: vec![],
}
}
}
impl<'a> Ctx<'a> {
#[inline]
pub fn tabs(&self) -> &Tabs { &self.mgr.tabs }
#[inline]
pub fn tabs_mut(&mut self) -> &mut Tabs { &mut self.mgr.tabs }
#[inline]
pub fn tab(&self) -> &Tab { &self.tabs()[self.tab] }
#[inline]
pub fn tab_mut(&mut self) -> &mut Tab { &mut self.core.mgr.tabs[self.tab] }
#[inline]
pub fn cwd(&self) -> &UrlBuf { self.tab().cwd() }
#[inline]
pub fn parent(&self) -> Option<&Folder> { self.tab().parent.as_ref() }
#[inline]
pub fn parent_mut(&mut self) -> Option<&mut Folder> { self.tab_mut().parent.as_mut() }
#[inline]
pub fn current(&self) -> &Folder { &self.tab().current }
#[inline]
pub fn current_mut(&mut self) -> &mut Folder { &mut self.tab_mut().current }
#[inline]
pub fn hovered(&self) -> Option<&File> { self.tab().hovered() }
#[inline]
pub fn hovered_folder(&self) -> Option<&Folder> { self.tab().hovered_folder() }
#[inline]
pub fn hovered_folder_mut(&mut self) -> Option<&mut Folder> {
self.tab_mut().hovered_folder_mut()
}
#[inline]
pub fn tasks(&self) -> &Tasks { &self.tasks }
#[inline]
pub fn source(&self) -> Source { if self.level != 1 { Source::Ind } else { self.source } }
}
================================================
FILE: yazi-actor/src/core/mod.rs
================================================
yazi_macro::mod_flat!(preflight);
================================================
FILE: yazi-actor/src/core/preflight.rs
================================================
use anyhow::Result;
use mlua::{ErrorContext, ExternalError, IntoLua, Value};
use yazi_binding::runtime_scope;
use yazi_dds::{LOCAL, spark::{Spark, SparkKind}};
use yazi_plugin::LUA;
use crate::{Ctx, lives::Lives};
pub struct Preflight;
impl Preflight {
pub fn act<'a>(cx: &mut Ctx, opt: (SparkKind, Spark<'a>)) -> Result<Spark<'a>> {
let kind = opt.0;
let Some(handlers) = LOCAL.read().get(kind.as_ref()).filter(|&m| !m.is_empty()).cloned() else {
return Ok(opt.1);
};
Ok(Lives::scope(cx.core, || {
let mut body = opt.1.into_lua(&LUA)?;
for (id, cb) in handlers {
match runtime_scope!(LUA, &id, cb.call::<Value>(&body)) {
Ok(Value::Nil) => {
Err(format!("`{kind}` event cancelled by `{id}` plugin on preflight").into_lua_err())?
}
Ok(v) => body = v,
Err(e) => Err(
format!("Failed to run `{kind}` event handler in `{id}` plugin: {e}").into_lua_err(),
)?,
};
}
Spark::from_lua(&LUA, kind, body)
.with_context(|e| format!("Unexpected return type from `{kind}` event handlers: {e}"))
})?)
}
}
================================================
FILE: yazi-actor/src/help/arrow.rs
================================================
use anyhow::Result;
use yazi_macro::{render, succ};
use yazi_parser::ArrowOpt;
use yazi_shared::data::Data;
use yazi_widgets::Scrollable;
use crate::{Actor, Ctx};
pub struct Arrow;
impl Actor for Arrow {
type Options = ArrowOpt;
const NAME: &str = "arrow";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
succ!(render!(cx.help.scroll(opt.step)));
}
}
================================================
FILE: yazi-actor/src/help/escape.rs
================================================
use anyhow::Result;
use yazi_macro::{act, render, succ};
use yazi_parser::VoidOpt;
use yazi_shared::data::Data;
use crate::{Actor, Ctx};
pub struct Escape;
impl Actor for Escape {
type Options = VoidOpt;
const NAME: &str = "escape";
fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
if cx.help.keyword().is_none() {
return act!(help:toggle, cx, cx.help.layer);
}
let help = &mut cx.help;
help.keyword = String::new();
help.in_filter = None;
help.filter_apply();
succ!(render!());
}
}
================================================
FILE: yazi-actor/src/help/filter.rs
================================================
use anyhow::Result;
use yazi_macro::{render, succ};
use yazi_parser::VoidOpt;
use yazi_shared::data::Data;
use crate::{Actor, Ctx};
pub struct Filter;
impl Actor for Filter {
type Options = VoidOpt;
const NAME: &str = "filter";
fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
let help = &mut cx.help;
help.in_filter = Some(Default::default());
help.filter_apply();
succ!(render!());
}
}
================================================
FILE: yazi-actor/src/help/mod.rs
================================================
yazi_macro::mod_flat!(arrow escape filter toggle);
================================================
FILE: yazi-actor/src/help/toggle.rs
================================================
use anyhow::Result;
use yazi_macro::{render, succ};
use yazi_parser::help::ToggleOpt;
use yazi_shared::data::Data;
use crate::{Actor, Ctx};
pub struct Toggle;
impl Actor for Toggle {
type Options = ToggleOpt;
const NAME: &str = "toggle";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
let help = &mut cx.help;
help.visible = !help.visible;
help.layer = opt.layer;
help.keyword = String::new();
help.in_filter = None;
help.filter_apply();
help.offset = 0;
help.cursor = 0;
succ!(render!());
}
}
================================================
FILE: yazi-actor/src/input/close.rs
================================================
use anyhow::Result;
use yazi_macro::{act, render, succ};
use yazi_parser::input::CloseOpt;
use yazi_shared::data::Data;
use yazi_widgets::input::InputEvent;
use crate::{Actor, Ctx};
pub struct Close;
impl Actor for Close {
type Options = CloseOpt;
const NAME: &str = "close";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
let input = &mut cx.input;
input.visible = false;
input.ticket.next();
if let Some(tx) = input.tx.take() {
let value = input.snap().value.clone();
_ = tx.send(if opt.submit { InputEvent::Submit(value) } else { InputEvent::Cancel(value) });
}
act!(cmp:close, cx)?;
succ!(render!());
}
}
================================================
FILE: yazi-actor/src/input/complete.rs
================================================
use anyhow::Result;
use yazi_macro::{act, succ};
use yazi_shared::data::Data;
use yazi_widgets::input::parser::CompleteOpt;
use crate::{Actor, Ctx};
pub struct Complete;
impl Actor for Complete {
type Options = CompleteOpt;
const NAME: &str = "complete";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
let input = &mut cx.input;
if !input.visible || input.ticket.current() != opt.ticket {
succ!();
}
act!(complete, input, opt)
}
}
================================================
FILE: yazi-actor/src/input/escape.rs
================================================
use anyhow::Result;
use yazi_macro::{act, render, succ};
use yazi_parser::VoidOpt;
use yazi_shared::data::Data;
use yazi_widgets::input::InputOp;
use crate::{Actor, Ctx};
pub struct Escape;
impl Actor for Escape {
type Options = VoidOpt;
const NAME: &str = "escape";
fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
use yazi_widgets::input::InputMode as M;
let input = &mut cx.input;
let mode = input.snap().mode;
match mode {
M::Normal if input.snap_mut().op == InputOp::None => act!(input:close, cx),
M::Insert => act!(cmp:close, cx),
M::Normal | M::Replace => Ok(().into()),
}?;
act!(escape, cx.input)?;
succ!(render!());
}
}
================================================
FILE: yazi-actor/src/input/mod.rs
================================================
yazi_macro::mod_flat!(close complete escape show);
================================================
FILE: yazi-actor/src/input/show.rs
================================================
use std::ops::DerefMut;
use anyhow::Result;
use yazi_macro::{act, render, succ};
use yazi_shared::data::Data;
use yazi_widgets::input::InputOpt;
use crate::{Actor, Ctx};
pub struct Show;
impl Actor for Show {
type Options = InputOpt;
const NAME: &str = "show";
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
act!(input:close, cx)?;
let input = &mut cx.input;
input.visible = true;
input.title = opt.cfg.title.clone();
input.position = opt.cfg.position;
*input.deref_mut() = yazi_widgets::input::Input::new(opt)?;
succ!(render!());
}
}
================================================
FILE: yazi-actor/src/lib.rs
================================================
extern crate self as yazi_actor;
yazi_macro::mod_pub!(app cmp confirm core help input lives mgr notify pick spot tasks which);
yazi_macro::mod_flat!(actor context);
================================================
FILE: yazi-actor/src/lives/core.rs
================================================
use std::ops::Deref;
use mlua::{AnyUserData, IntoLua, MetaMethod, UserData, Value};
use paste::paste;
use super::{Lives, PtrCell};
pub(super) struct Core {
inner: PtrCell<yazi_core::Core>,
c_active: Option<Value>,
c_tabs: Option<Value>,
c_tasks: Option<Value>,
c_yanked: Option<Value>,
c_layer: Option<Value>,
c_which: Option<Value>,
}
impl Deref for Core {
type Target = yazi_core::Core;
fn deref(&self) -> &Self::Target { &self.inner }
}
impl Core {
pub(super) fn make(inner: &yazi_core::Core) -> mlua::Result<AnyUserData> {
Lives::scoped_userdata(Self {
inner: inner.into(),
c_active: None,
c_tabs: None,
c_tasks: None,
c_yanked: None,
c_layer: None,
c_which: None,
})
}
}
impl UserData for Core {
fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
methods.add_meta_method_mut(MetaMethod::Index, |lua, me, key: mlua::String| {
macro_rules! reuse {
($key:ident, $value:expr) => {
match paste! { &me.[<c_ $key>] } {
Some(v) => v.clone(),
None => {
let v = $value?.into_lua(lua)?;
paste! { me.[<c_ $key>] = Some(v.clone()); };
v
}
}
};
}
Ok(match &*key.as_bytes() {
b"active" => reuse!(active, super::Tab::make(me.active())),
b"tabs" => reuse!(tabs, super::Tabs::make(&me.mgr.tabs)),
b"tasks" => reuse!(tasks, super::Tasks::make(&me.tasks)),
b"yanked" => reuse!(yanked, super::Yanked::make(&me.mgr.yanked)),
b"layer" => {
reuse!(layer, Ok::<_, mlua::Error>(yazi_binding::Layer::from(me.layer())))
}
b"which" => reuse!(which, super::Which::make(&me.which)),
_ => Value::Nil,
})
});
}
}
================================================
FILE: yazi-actor/src/lives/file.rs
================================================
use std::{ops::Deref, ptr};
use mlua::{AnyUserData, IntoLua, UserData, UserDataFields, UserDataMethods, Value};
use yazi_binding::{Range, Style, cached_field};
use yazi_config::THEME;
use yazi_shared::{path::AsPath, url::UrlLike};
use super::Lives;
use crate::lives::PtrCell;
pub(super) struct File {
idx: usize,
folder: PtrCell<yazi_core::tab::Folder>,
tab: PtrCell<yazi_core::tab::Tab>,
v_cha: Option<Value>,
v_url: Option<Value>,
v_link_to: Option<Value>,
v_name: Option<Value>,
v_path: Option<Value>,
v_cache: Option<Value>,
v_bare: Option<Value>,
}
impl Deref for File {
type Target = yazi_fs::File;
fn deref(&self) -> &Self::Target { &self.folder.files[self.idx] }
}
impl AsRef<yazi_fs::File> for File {
fn as_ref(&self) -> &yazi_fs::File { self }
}
impl File {
pub(super) fn make(
idx: usize,
folder: &yazi_core::tab::Folder,
tab: &yazi_core::tab::Tab,
) -> mlua::Result<AnyUserData> {
use hashbrown::hash_map::Entry;
Ok(match super::FILE_CACHE.borrow_mut().entry(PtrCell(&folder.files[idx])) {
Entry::Occupied(oe) => oe.into_mut().clone(),
Entry::Vacant(ve) => {
let ud = Lives::scoped_userdata(Self {
idx,
folder: folder.into(),
tab: tab.into(),
v_cha: None,
v_url: None,
v_link_to: None,
v_name: None,
v_path: None,
v_cache: None,
v_bare: None,
})?;
ve.insert(ud.clone());
ud
}
})
}
#[inline]
fn is_hovered(&self) -> bool { self.idx == self.folder.cursor }
}
impl UserData for File {
fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
yazi_binding::impl_file_fields!(fields);
cached_field!(fields, bare, |_, me| Ok(yazi_binding::File::new(&**me)));
fields.add_field_method_get("idx", |_, me| Ok(me.idx + 1));
fields.add_field_method_get("is_hovered", |_, me| Ok(me.is_hovered()));
fields.add_field_method_get("in_current", |_, me| Ok(ptr::eq(&*me.folder, &me.tab.current)));
fields.add_field_method_get("in_preview", |_, me| {
Ok(me.idx == me.folder.cursor && me.tab.hovered().is_some_and(|f| f.url == me.folder.url))
});
}
fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
yazi_binding::impl_file_methods!(methods);
methods.add_method("icon", |_, me, ()| {
use yazi_binding::Icon;
// TODO: use a cache
Ok(yazi_config::THEME.icon.matches(me, me.is_hovered()).map(Icon::from))
});
methods.add_method("size", |_, me, ()| {
Ok(if me.is_dir() { me.folder.files.sizes.get(&me.urn()).copied() } else { Some(me.len) })
});
methods.add_method("mime", |lua, me, ()| {
lua.named_registry_value::<AnyUserData>("cx")?.borrow_scoped(|core: &yazi_core::Core| {
gitextract_ehhv1z_b/
├── .cargo/
│ └── config.toml
├── .envrc
├── .github/
│ ├── DISCUSSION_TEMPLATE/
│ │ └── 1-q-a.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug.yml
│ │ ├── config.yml
│ │ └── feature.yml
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── cachix.yml
│ ├── check.yml
│ ├── draft.yml
│ ├── lock.yml
│ ├── no-response.yml
│ ├── publish.yml
│ ├── test.yml
│ └── validate-form.yml
├── .gitignore
├── .luarc.json
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cargo.toml
├── LICENSE
├── LICENSE-ICONS
├── README.md
├── assets/
│ └── yazi.desktop
├── cspell.json
├── flake.nix
├── nix/
│ ├── shell.nix
│ ├── yazi-unwrapped.nix
│ └── yazi.nix
├── rustfmt.toml
├── scripts/
│ ├── build.sh
│ ├── bump.sh
│ ├── icons/
│ │ └── generate.lua
│ └── validate-form/
│ ├── main.js
│ └── package.json
├── snap/
│ └── snapcraft.yaml
├── stylua.toml
├── yazi-actor/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── actor.rs
│ ├── app/
│ │ ├── accept_payload.rs
│ │ ├── bootstrap.rs
│ │ ├── deprecate.rs
│ │ ├── focus.rs
│ │ ├── mod.rs
│ │ ├── mouse.rs
│ │ ├── plugin.rs
│ │ ├── plugin_do.rs
│ │ ├── quit.rs
│ │ ├── reflow.rs
│ │ ├── resize.rs
│ │ ├── resume.rs
│ │ ├── stop.rs
│ │ ├── title.rs
│ │ └── update_progress.rs
│ ├── cmp/
│ │ ├── arrow.rs
│ │ ├── close.rs
│ │ ├── mod.rs
│ │ ├── show.rs
│ │ └── trigger.rs
│ ├── confirm/
│ │ ├── arrow.rs
│ │ ├── close.rs
│ │ ├── mod.rs
│ │ └── show.rs
│ ├── context.rs
│ ├── core/
│ │ ├── mod.rs
│ │ └── preflight.rs
│ ├── help/
│ │ ├── arrow.rs
│ │ ├── escape.rs
│ │ ├── filter.rs
│ │ ├── mod.rs
│ │ └── toggle.rs
│ ├── input/
│ │ ├── close.rs
│ │ ├── complete.rs
│ │ ├── escape.rs
│ │ ├── mod.rs
│ │ └── show.rs
│ ├── lib.rs
│ ├── lives/
│ │ ├── core.rs
│ │ ├── file.rs
│ │ ├── files.rs
│ │ ├── filter.rs
│ │ ├── finder.rs
│ │ ├── folder.rs
│ │ ├── lives.rs
│ │ ├── mod.rs
│ │ ├── mode.rs
│ │ ├── preference.rs
│ │ ├── preview.rs
│ │ ├── ptr.rs
│ │ ├── selected.rs
│ │ ├── tab.rs
│ │ ├── tabs.rs
│ │ ├── task.rs
│ │ ├── tasks.rs
│ │ ├── which.rs
│ │ └── yanked.rs
│ ├── mgr/
│ │ ├── arrow.rs
│ │ ├── back.rs
│ │ ├── bulk_rename.rs
│ │ ├── cd.rs
│ │ ├── close.rs
│ │ ├── copy.rs
│ │ ├── create.rs
│ │ ├── displace.rs
│ │ ├── displace_do.rs
│ │ ├── download.rs
│ │ ├── enter.rs
│ │ ├── escape.rs
│ │ ├── filter.rs
│ │ ├── filter_do.rs
│ │ ├── find.rs
│ │ ├── find_arrow.rs
│ │ ├── find_do.rs
│ │ ├── follow.rs
│ │ ├── forward.rs
│ │ ├── hardlink.rs
│ │ ├── hidden.rs
│ │ ├── hover.rs
│ │ ├── leave.rs
│ │ ├── linemode.rs
│ │ ├── link.rs
│ │ ├── mod.rs
│ │ ├── open.rs
│ │ ├── open_do.rs
│ │ ├── paste.rs
│ │ ├── peek.rs
│ │ ├── quit.rs
│ │ ├── refresh.rs
│ │ ├── remove.rs
│ │ ├── rename.rs
│ │ ├── reveal.rs
│ │ ├── search.rs
│ │ ├── seek.rs
│ │ ├── shell.rs
│ │ ├── sort.rs
│ │ ├── spot.rs
│ │ ├── stash.rs
│ │ ├── suspend.rs
│ │ ├── tab_close.rs
│ │ ├── tab_create.rs
│ │ ├── tab_rename.rs
│ │ ├── tab_swap.rs
│ │ ├── tab_switch.rs
│ │ ├── toggle.rs
│ │ ├── toggle_all.rs
│ │ ├── unyank.rs
│ │ ├── update_files.rs
│ │ ├── update_mimes.rs
│ │ ├── update_paged.rs
│ │ ├── update_peeked.rs
│ │ ├── update_spotted.rs
│ │ ├── update_yanked.rs
│ │ ├── upload.rs
│ │ ├── visual_mode.rs
│ │ ├── watch.rs
│ │ └── yank.rs
│ ├── notify/
│ │ ├── mod.rs
│ │ ├── push.rs
│ │ └── tick.rs
│ ├── pick/
│ │ ├── arrow.rs
│ │ ├── close.rs
│ │ ├── mod.rs
│ │ └── show.rs
│ ├── spot/
│ │ ├── arrow.rs
│ │ ├── close.rs
│ │ ├── copy.rs
│ │ ├── mod.rs
│ │ └── swipe.rs
│ ├── tasks/
│ │ ├── arrow.rs
│ │ ├── cancel.rs
│ │ ├── close.rs
│ │ ├── inspect.rs
│ │ ├── mod.rs
│ │ ├── open_shell_compat.rs
│ │ ├── process_open.rs
│ │ ├── show.rs
│ │ └── update_succeed.rs
│ └── which/
│ ├── activate.rs
│ ├── dismiss.rs
│ └── mod.rs
├── yazi-adapter/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── adapter.rs
│ ├── adapters.rs
│ ├── drivers/
│ │ ├── chafa.rs
│ │ ├── iip.rs
│ │ ├── kgp.rs
│ │ ├── kgp_old.rs
│ │ ├── mod.rs
│ │ ├── sixel.rs
│ │ └── ueberzug.rs
│ ├── icc.rs
│ ├── image.rs
│ ├── info.rs
│ └── lib.rs
├── yazi-binding/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── access.rs
│ ├── calculator.rs
│ ├── cha.rs
│ ├── chan.rs
│ ├── chord_cow.rs
│ ├── color.rs
│ ├── composer.rs
│ ├── elements/
│ │ ├── align.rs
│ │ ├── area.rs
│ │ ├── bar.rs
│ │ ├── border.rs
│ │ ├── cell.rs
│ │ ├── clear.rs
│ │ ├── constraint.rs
│ │ ├── edge.rs
│ │ ├── elements.rs
│ │ ├── gauge.rs
│ │ ├── layout.rs
│ │ ├── line.rs
│ │ ├── list.rs
│ │ ├── mod.rs
│ │ ├── pad.rs
│ │ ├── pos.rs
│ │ ├── rect.rs
│ │ ├── renderable.rs
│ │ ├── row.rs
│ │ ├── span.rs
│ │ ├── table.rs
│ │ ├── text.rs
│ │ └── wrap.rs
│ ├── error.rs
│ ├── fd.rs
│ ├── file.rs
│ ├── handle.rs
│ ├── icon.rs
│ ├── id.rs
│ ├── image.rs
│ ├── input.rs
│ ├── iter.rs
│ ├── layer.rs
│ ├── lib.rs
│ ├── macros.rs
│ ├── mouse.rs
│ ├── path.rs
│ ├── permit.rs
│ ├── range.rs
│ ├── runtime.rs
│ ├── scheme.rs
│ ├── stage.rs
│ ├── style.rs
│ ├── url.rs
│ └── utils.rs
├── yazi-boot/
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ └── src/
│ ├── actions/
│ │ ├── actions.rs
│ │ ├── clear_cache.rs
│ │ ├── debug.rs
│ │ ├── mod.rs
│ │ ├── rustc.rs
│ │ ├── triple.rs
│ │ └── version.rs
│ ├── args.rs
│ ├── boot.rs
│ └── lib.rs
├── yazi-build/
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ └── src/
│ └── main.rs
├── yazi-cli/
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ └── src/
│ ├── args.rs
│ ├── dds/
│ │ ├── draw.rs
│ │ ├── exec.rs
│ │ ├── mod.rs
│ │ └── shot.rs
│ ├── main.rs
│ ├── package/
│ │ ├── add.rs
│ │ ├── delete.rs
│ │ ├── dependency.rs
│ │ ├── deploy.rs
│ │ ├── git.rs
│ │ ├── hash.rs
│ │ ├── install.rs
│ │ ├── mod.rs
│ │ ├── package.rs
│ │ └── upgrade.rs
│ └── shared/
│ ├── mod.rs
│ └── shared.rs
├── yazi-codegen/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ └── lib.rs
├── yazi-config/
│ ├── Cargo.toml
│ ├── README.md
│ ├── preset/
│ │ ├── README.md
│ │ ├── keymap-default.toml
│ │ ├── theme-dark.toml
│ │ ├── theme-light.toml
│ │ ├── vfs-default.toml
│ │ └── yazi-default.toml
│ └── src/
│ ├── icon.rs
│ ├── keymap/
│ │ ├── chord.rs
│ │ ├── cow.rs
│ │ ├── deserializers.rs
│ │ ├── key.rs
│ │ ├── keymap.rs
│ │ ├── mod.rs
│ │ └── rules.rs
│ ├── layout.rs
│ ├── lib.rs
│ ├── mgr/
│ │ ├── mgr.rs
│ │ ├── mod.rs
│ │ ├── mouse.rs
│ │ └── ratio.rs
│ ├── open/
│ │ ├── mod.rs
│ │ ├── open.rs
│ │ └── rule.rs
│ ├── opener/
│ │ ├── mod.rs
│ │ ├── opener.rs
│ │ └── rule.rs
│ ├── pattern.rs
│ ├── platform.rs
│ ├── plugin/
│ │ ├── fetcher.rs
│ │ ├── mod.rs
│ │ ├── plugin.rs
│ │ ├── preloader.rs
│ │ ├── previewer.rs
│ │ └── spotter.rs
│ ├── popup/
│ │ ├── confirm.rs
│ │ ├── input.rs
│ │ ├── mod.rs
│ │ ├── offset.rs
│ │ ├── options.rs
│ │ ├── origin.rs
│ │ ├── pick.rs
│ │ └── position.rs
│ ├── preset.rs
│ ├── preview/
│ │ ├── mod.rs
│ │ ├── preview.rs
│ │ └── wrap.rs
│ ├── priority.rs
│ ├── style.rs
│ ├── tasks/
│ │ ├── mod.rs
│ │ └── tasks.rs
│ ├── theme/
│ │ ├── filetype.rs
│ │ ├── flavor.rs
│ │ ├── icon.rs
│ │ ├── is.rs
│ │ ├── mod.rs
│ │ └── theme.rs
│ ├── utils.rs
│ ├── vfs/
│ │ ├── mod.rs
│ │ ├── service.rs
│ │ ├── services.rs
│ │ └── vfs.rs
│ ├── which/
│ │ ├── mod.rs
│ │ ├── sorting.rs
│ │ └── which.rs
│ └── yazi.rs
├── yazi-core/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── cmp/
│ │ ├── cmp.rs
│ │ └── mod.rs
│ ├── confirm/
│ │ ├── confirm.rs
│ │ └── mod.rs
│ ├── core.rs
│ ├── help/
│ │ ├── help.rs
│ │ └── mod.rs
│ ├── input/
│ │ ├── input.rs
│ │ └── mod.rs
│ ├── lib.rs
│ ├── mgr/
│ │ ├── mgr.rs
│ │ ├── mimetype.rs
│ │ ├── mod.rs
│ │ ├── tabs.rs
│ │ └── yanked.rs
│ ├── notify/
│ │ ├── message.rs
│ │ ├── mod.rs
│ │ └── notify.rs
│ ├── pick/
│ │ ├── mod.rs
│ │ └── pick.rs
│ ├── spot/
│ │ ├── mod.rs
│ │ └── spot.rs
│ ├── tab/
│ │ ├── backstack.rs
│ │ ├── finder.rs
│ │ ├── folder.rs
│ │ ├── history.rs
│ │ ├── mod.rs
│ │ ├── mode.rs
│ │ ├── preference.rs
│ │ ├── preview.rs
│ │ ├── selected.rs
│ │ └── tab.rs
│ ├── tasks/
│ │ ├── file.rs
│ │ ├── mod.rs
│ │ ├── prework.rs
│ │ ├── process.rs
│ │ └── tasks.rs
│ └── which/
│ ├── mod.rs
│ ├── sorter.rs
│ └── which.rs
├── yazi-dds/
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ └── src/
│ ├── client.rs
│ ├── ember/
│ │ ├── bulk.rs
│ │ ├── bye.rs
│ │ ├── cd.rs
│ │ ├── custom.rs
│ │ ├── delete.rs
│ │ ├── download.rs
│ │ ├── duplicate.rs
│ │ ├── ember.rs
│ │ ├── hey.rs
│ │ ├── hi.rs
│ │ ├── hover.rs
│ │ ├── load.rs
│ │ ├── mod.rs
│ │ ├── mount.rs
│ │ ├── move.rs
│ │ ├── rename.rs
│ │ ├── tab.rs
│ │ ├── trash.rs
│ │ └── yank.rs
│ ├── lib.rs
│ ├── macros.rs
│ ├── payload.rs
│ ├── pubsub.rs
│ ├── pump.rs
│ ├── sendable.rs
│ ├── server.rs
│ ├── spark/
│ │ ├── kind.rs
│ │ ├── mod.rs
│ │ └── spark.rs
│ ├── state.rs
│ └── stream.rs
├── yazi-emulator/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── brand.rs
│ ├── dimension.rs
│ ├── emulator.rs
│ ├── lib.rs
│ ├── mux.rs
│ └── unknown.rs
├── yazi-ffi/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── cf_dict.rs
│ ├── cf_string.rs
│ ├── disk_arbitration.rs
│ ├── io_kit.rs
│ └── lib.rs
├── yazi-fm/
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ └── src/
│ ├── app/
│ │ ├── app.rs
│ │ ├── mod.rs
│ │ └── render.rs
│ ├── cmp/
│ │ ├── cmp.rs
│ │ └── mod.rs
│ ├── confirm/
│ │ ├── body.rs
│ │ ├── buttons.rs
│ │ ├── confirm.rs
│ │ ├── list.rs
│ │ └── mod.rs
│ ├── dispatcher.rs
│ ├── executor.rs
│ ├── help/
│ │ ├── bindings.rs
│ │ ├── help.rs
│ │ └── mod.rs
│ ├── input/
│ │ ├── input.rs
│ │ └── mod.rs
│ ├── logs.rs
│ ├── main.rs
│ ├── mgr/
│ │ ├── mod.rs
│ │ ├── modal.rs
│ │ └── preview.rs
│ ├── notify/
│ │ ├── mod.rs
│ │ └── notify.rs
│ ├── panic.rs
│ ├── pick/
│ │ ├── list.rs
│ │ ├── mod.rs
│ │ └── pick.rs
│ ├── root.rs
│ ├── router.rs
│ ├── signals.rs
│ ├── spot/
│ │ ├── mod.rs
│ │ └── spot.rs
│ ├── tasks/
│ │ ├── list.rs
│ │ ├── mod.rs
│ │ ├── progress.rs
│ │ └── tasks.rs
│ └── which/
│ ├── cand.rs
│ ├── mod.rs
│ └── which.rs
├── yazi-fs/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── cha/
│ │ ├── cha.rs
│ │ ├── kind.rs
│ │ ├── mod.rs
│ │ ├── mode.rs
│ │ └── type.rs
│ ├── cwd.rs
│ ├── error/
│ │ ├── error.rs
│ │ ├── mod.rs
│ │ └── serde.rs
│ ├── file.rs
│ ├── files.rs
│ ├── filter.rs
│ ├── fns.rs
│ ├── hash.rs
│ ├── lib.rs
│ ├── mounts/
│ │ ├── linux.rs
│ │ ├── macos.rs
│ │ ├── mod.rs
│ │ ├── partition.rs
│ │ └── partitions.rs
│ ├── op.rs
│ ├── path/
│ │ ├── clean.rs
│ │ ├── expand.rs
│ │ ├── mod.rs
│ │ ├── path.rs
│ │ ├── percent.rs
│ │ └── relative.rs
│ ├── provider/
│ │ ├── attrs.rs
│ │ ├── capabilities.rs
│ │ ├── local/
│ │ │ ├── absolute.rs
│ │ │ ├── calculator.rs
│ │ │ ├── casefold.rs
│ │ │ ├── copier.rs
│ │ │ ├── dir_entry.rs
│ │ │ ├── gate.rs
│ │ │ ├── identical.rs
│ │ │ ├── local.rs
│ │ │ ├── mod.rs
│ │ │ └── read_dir.rs
│ │ ├── mod.rs
│ │ └── traits.rs
│ ├── scheme.rs
│ ├── sorter.rs
│ ├── sorting.rs
│ ├── splatter.rs
│ ├── stage.rs
│ ├── url.rs
│ └── xdg.rs
├── yazi-macro/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── actor.rs
│ ├── asset.rs
│ ├── context.rs
│ ├── event.rs
│ ├── fmt.rs
│ ├── fs.rs
│ ├── lib.rs
│ ├── log.rs
│ ├── module.rs
│ ├── platform.rs
│ ├── render.rs
│ └── stdio.rs
├── yazi-packing/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ └── lib.rs
├── yazi-parser/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── app/
│ │ ├── deprecate.rs
│ │ ├── mod.rs
│ │ ├── mouse.rs
│ │ ├── plugin.rs
│ │ ├── quit.rs
│ │ ├── reflow.rs
│ │ ├── resume.rs
│ │ ├── stop.rs
│ │ ├── title.rs
│ │ └── update_progress.rs
│ ├── arrow.rs
│ ├── cmp/
│ │ ├── close.rs
│ │ ├── mod.rs
│ │ ├── show.rs
│ │ └── trigger.rs
│ ├── confirm/
│ │ ├── close.rs
│ │ ├── mod.rs
│ │ └── show.rs
│ ├── help/
│ │ ├── mod.rs
│ │ └── toggle.rs
│ ├── input/
│ │ ├── close.rs
│ │ └── mod.rs
│ ├── lib.rs
│ ├── mgr/
│ │ ├── cd.rs
│ │ ├── close.rs
│ │ ├── copy.rs
│ │ ├── create.rs
│ │ ├── displace_do.rs
│ │ ├── download.rs
│ │ ├── escape.rs
│ │ ├── filter.rs
│ │ ├── find.rs
│ │ ├── find_arrow.rs
│ │ ├── find_do.rs
│ │ ├── hardlink.rs
│ │ ├── hidden.rs
│ │ ├── hover.rs
│ │ ├── linemode.rs
│ │ ├── link.rs
│ │ ├── mod.rs
│ │ ├── open.rs
│ │ ├── open_do.rs
│ │ ├── paste.rs
│ │ ├── peek.rs
│ │ ├── remove.rs
│ │ ├── rename.rs
│ │ ├── reveal.rs
│ │ ├── search.rs
│ │ ├── seek.rs
│ │ ├── shell.rs
│ │ ├── sort.rs
│ │ ├── spot.rs
│ │ ├── stash.rs
│ │ ├── tab_close.rs
│ │ ├── tab_create.rs
│ │ ├── tab_rename.rs
│ │ ├── tab_switch.rs
│ │ ├── toggle.rs
│ │ ├── toggle_all.rs
│ │ ├── update_files.rs
│ │ ├── update_mimes.rs
│ │ ├── update_paged.rs
│ │ ├── update_peeked.rs
│ │ ├── update_spotted.rs
│ │ ├── update_yanked.rs
│ │ ├── upload.rs
│ │ ├── visual_mode.rs
│ │ └── yank.rs
│ ├── notify/
│ │ ├── mod.rs
│ │ ├── push.rs
│ │ └── tick.rs
│ ├── pick/
│ │ ├── close.rs
│ │ ├── mod.rs
│ │ └── show.rs
│ ├── spot/
│ │ ├── copy.rs
│ │ └── mod.rs
│ ├── tasks/
│ │ ├── mod.rs
│ │ ├── process_open.rs
│ │ └── update_succeed.rs
│ ├── void.rs
│ └── which/
│ ├── activate.rs
│ └── mod.rs
├── yazi-plugin/
│ ├── Cargo.toml
│ ├── README.md
│ ├── preset/
│ │ ├── compat.lua
│ │ ├── components/
│ │ │ ├── current.lua
│ │ │ ├── entity.lua
│ │ │ ├── header.lua
│ │ │ ├── linemode.lua
│ │ │ ├── marker.lua
│ │ │ ├── modal.lua
│ │ │ ├── parent.lua
│ │ │ ├── preview.lua
│ │ │ ├── progress.lua
│ │ │ ├── rail.lua
│ │ │ ├── root.lua
│ │ │ ├── status.lua
│ │ │ ├── tab.lua
│ │ │ ├── tabs.lua
│ │ │ └── tasks.lua
│ │ ├── plugins/
│ │ │ ├── archive.lua
│ │ │ ├── code.lua
│ │ │ ├── dds.lua
│ │ │ ├── empty.lua
│ │ │ ├── extract.lua
│ │ │ ├── file.lua
│ │ │ ├── folder.lua
│ │ │ ├── font.lua
│ │ │ ├── fzf.lua
│ │ │ ├── image.lua
│ │ │ ├── init.lua
│ │ │ ├── json.lua
│ │ │ ├── magick.lua
│ │ │ ├── mime-dir.lua
│ │ │ ├── mime-local.lua
│ │ │ ├── mime-remote.lua
│ │ │ ├── mime.lua
│ │ │ ├── multi.lua
│ │ │ ├── noop.lua
│ │ │ ├── null.lua
│ │ │ ├── pdf.lua
│ │ │ ├── session.lua
│ │ │ ├── svg.lua
│ │ │ ├── vfs.lua
│ │ │ ├── video.lua
│ │ │ └── zoxide.lua
│ │ ├── setup.lua
│ │ └── ya.lua
│ └── src/
│ ├── elements/
│ │ ├── elements.rs
│ │ └── mod.rs
│ ├── external/
│ │ ├── fd.rs
│ │ ├── highlighter.rs
│ │ ├── mod.rs
│ │ ├── rg.rs
│ │ └── rga.rs
│ ├── fs/
│ │ ├── fs.rs
│ │ ├── mod.rs
│ │ └── op.rs
│ ├── isolate/
│ │ ├── entry.rs
│ │ ├── fetch.rs
│ │ ├── isolate.rs
│ │ ├── mod.rs
│ │ ├── peek.rs
│ │ ├── preload.rs
│ │ ├── seek.rs
│ │ └── spot.rs
│ ├── lib.rs
│ ├── loader/
│ │ ├── chunk.rs
│ │ ├── loader.rs
│ │ ├── mod.rs
│ │ └── require.rs
│ ├── lua.rs
│ ├── process/
│ │ ├── child.rs
│ │ ├── command.rs
│ │ ├── mod.rs
│ │ ├── output.rs
│ │ ├── process.rs
│ │ └── status.rs
│ ├── pubsub/
│ │ ├── mod.rs
│ │ └── pubsub.rs
│ ├── runtime/
│ │ ├── mod.rs
│ │ ├── plugin.rs
│ │ ├── runtime.rs
│ │ └── term.rs
│ ├── theme/
│ │ ├── mod.rs
│ │ └── theme.rs
│ └── utils/
│ ├── app.rs
│ ├── cache.rs
│ ├── call.rs
│ ├── image.rs
│ ├── json.rs
│ ├── layer.rs
│ ├── log.rs
│ ├── mod.rs
│ ├── preview.rs
│ ├── process.rs
│ ├── spot.rs
│ ├── sync.rs
│ ├── target.rs
│ ├── text.rs
│ ├── time.rs
│ ├── user.rs
│ └── utils.rs
├── yazi-proxy/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── app.rs
│ ├── cmp.rs
│ ├── confirm.rs
│ ├── input.rs
│ ├── lib.rs
│ ├── macros.rs
│ ├── mgr.rs
│ ├── notify.rs
│ ├── pick.rs
│ ├── tasks.rs
│ └── which.rs
├── yazi-scheduler/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── fetch/
│ │ ├── fetch.rs
│ │ ├── in.rs
│ │ ├── mod.rs
│ │ ├── out.rs
│ │ └── progress.rs
│ ├── file/
│ │ ├── file.rs
│ │ ├── in.rs
│ │ ├── macros.rs
│ │ ├── mod.rs
│ │ ├── out.rs
│ │ ├── progress.rs
│ │ ├── transaction.rs
│ │ └── traverse.rs
│ ├── hook/
│ │ ├── hook.rs
│ │ ├── in.rs
│ │ ├── macros.rs
│ │ └── mod.rs
│ ├── lib.rs
│ ├── macros.rs
│ ├── ongoing.rs
│ ├── op.rs
│ ├── out.rs
│ ├── plugin/
│ │ ├── in.rs
│ │ ├── macros.rs
│ │ ├── mod.rs
│ │ ├── out.rs
│ │ ├── plugin.rs
│ │ └── progress.rs
│ ├── preload/
│ │ ├── in.rs
│ │ ├── mod.rs
│ │ ├── out.rs
│ │ ├── preload.rs
│ │ └── progress.rs
│ ├── process/
│ │ ├── in.rs
│ │ ├── macros.rs
│ │ ├── mod.rs
│ │ ├── out.rs
│ │ ├── process.rs
│ │ ├── progress.rs
│ │ └── shell.rs
│ ├── progress.rs
│ ├── runner.rs
│ ├── scheduler.rs
│ ├── size/
│ │ ├── in.rs
│ │ ├── mod.rs
│ │ ├── out.rs
│ │ ├── progress.rs
│ │ └── size.rs
│ ├── snap.rs
│ └── task.rs
├── yazi-sftp/
│ ├── Cargo.toml
│ ├── LICENSE
│ ├── README.md
│ └── src/
│ ├── de.rs
│ ├── error.rs
│ ├── fs/
│ │ ├── attrs.rs
│ │ ├── dir_entry.rs
│ │ ├── file.rs
│ │ ├── flags.rs
│ │ ├── mod.rs
│ │ └── read_dir.rs
│ ├── id.rs
│ ├── lib.rs
│ ├── macros.rs
│ ├── operator.rs
│ ├── packet.rs
│ ├── path.rs
│ ├── receiver.rs
│ ├── requests/
│ │ ├── close.rs
│ │ ├── extended.rs
│ │ ├── fstat.rs
│ │ ├── init.rs
│ │ ├── lstat.rs
│ │ ├── mkdir.rs
│ │ ├── mod.rs
│ │ ├── open.rs
│ │ ├── open_dir.rs
│ │ ├── read.rs
│ │ ├── read_dir.rs
│ │ ├── readlink.rs
│ │ ├── realpath.rs
│ │ ├── remove.rs
│ │ ├── rename.rs
│ │ ├── rmdir.rs
│ │ ├── set_stat.rs
│ │ ├── stat.rs
│ │ ├── symlink.rs
│ │ └── write.rs
│ ├── responses/
│ │ ├── attrs.rs
│ │ ├── data.rs
│ │ ├── extended.rs
│ │ ├── handle.rs
│ │ ├── mod.rs
│ │ ├── name.rs
│ │ ├── status.rs
│ │ └── version.rs
│ ├── ser.rs
│ └── session.rs
├── yazi-shared/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── alias.rs
│ ├── bytes.rs
│ ├── chars.rs
│ ├── completion_token.rs
│ ├── condition.rs
│ ├── data/
│ │ ├── any.rs
│ │ ├── data.rs
│ │ ├── de.rs
│ │ ├── key.rs
│ │ └── mod.rs
│ ├── debounce.rs
│ ├── env.rs
│ ├── errors/
│ │ ├── mod.rs
│ │ └── peek.rs
│ ├── event/
│ │ ├── action.rs
│ │ ├── cow.rs
│ │ ├── event.rs
│ │ └── mod.rs
│ ├── id.rs
│ ├── last_value.rs
│ ├── layer.rs
│ ├── lib.rs
│ ├── loc/
│ │ ├── able.rs
│ │ ├── buf.rs
│ │ ├── loc.rs
│ │ └── mod.rs
│ ├── localset.rs
│ ├── natsort.rs
│ ├── os.rs
│ ├── path/
│ │ ├── buf.rs
│ │ ├── component.rs
│ │ ├── components.rs
│ │ ├── conversion.rs
│ │ ├── cow.rs
│ │ ├── display.rs
│ │ ├── error.rs
│ │ ├── kind.rs
│ │ ├── like.rs
│ │ ├── mod.rs
│ │ ├── path.rs
│ │ └── view.rs
│ ├── pool/
│ │ ├── cow.rs
│ │ ├── mod.rs
│ │ ├── pool.rs
│ │ ├── ptr.rs
│ │ ├── symbol.rs
│ │ └── traits.rs
│ ├── predictor.rs
│ ├── ro_cell.rs
│ ├── scheme/
│ │ ├── cow.rs
│ │ ├── encode.rs
│ │ ├── kind.rs
│ │ ├── mod.rs
│ │ ├── ref.rs
│ │ ├── scheme.rs
│ │ └── traits.rs
│ ├── shell/
│ │ ├── error.rs
│ │ ├── mod.rs
│ │ ├── unix.rs
│ │ └── windows.rs
│ ├── source.rs
│ ├── strand/
│ │ ├── buf.rs
│ │ ├── conversion.rs
│ │ ├── cow.rs
│ │ ├── error.rs
│ │ ├── extensions.rs
│ │ ├── kind.rs
│ │ ├── like.rs
│ │ ├── mod.rs
│ │ ├── strand.rs
│ │ └── view.rs
│ ├── sync_cell.rs
│ ├── terminal.rs
│ ├── tests.rs
│ ├── throttle.rs
│ ├── time.rs
│ ├── translit/
│ │ ├── mod.rs
│ │ ├── table.rs
│ │ └── traits.rs
│ ├── url/
│ │ ├── buf.rs
│ │ ├── component.rs
│ │ ├── components.rs
│ │ ├── cov.rs
│ │ ├── cow.rs
│ │ ├── display.rs
│ │ ├── encode.rs
│ │ ├── like.rs
│ │ ├── mod.rs
│ │ ├── traits.rs
│ │ └── url.rs
│ ├── utf8.rs
│ └── wtf8/
│ ├── mod.rs
│ ├── validator.rs
│ └── wtf8.rs
├── yazi-shim/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── crossterm/
│ │ ├── if.rs
│ │ ├── mod.rs
│ │ ├── restore_background.rs
│ │ ├── restore_cursor.rs
│ │ └── set_background.rs
│ ├── lib.rs
│ ├── ratatui/
│ │ ├── mod.rs
│ │ └── paragraph.rs
│ └── twox.rs
├── yazi-term/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── lib.rs
│ ├── option.rs
│ ├── semaphore.rs
│ ├── state.rs
│ └── term.rs
├── yazi-tty/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── handle.rs
│ ├── lib.rs
│ ├── tty.rs
│ └── windows.rs
├── yazi-vfs/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── cha.rs
│ ├── file.rs
│ ├── files.rs
│ ├── fns.rs
│ ├── lib.rs
│ ├── op.rs
│ └── provider/
│ ├── calculator.rs
│ ├── copier.rs
│ ├── dir_entry.rs
│ ├── gate.rs
│ ├── mod.rs
│ ├── provider.rs
│ ├── providers.rs
│ ├── read_dir.rs
│ ├── rw_file.rs
│ └── sftp/
│ ├── absolute.rs
│ ├── conn.rs
│ ├── gate.rs
│ ├── metadata.rs
│ ├── mod.rs
│ ├── read_dir.rs
│ └── sftp.rs
├── yazi-watcher/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── backend.rs
│ ├── lib.rs
│ ├── local/
│ │ ├── linked.rs
│ │ ├── local.rs
│ │ └── mod.rs
│ ├── remote/
│ │ ├── mod.rs
│ │ └── remote.rs
│ ├── reporter.rs
│ ├── watched.rs
│ ├── watchee.rs
│ └── watcher.rs
└── yazi-widgets/
├── Cargo.toml
├── README.md
└── src/
├── clear.rs
├── clipboard.rs
├── input/
│ ├── actor/
│ │ ├── actor.rs
│ │ ├── backspace.rs
│ │ ├── backward.rs
│ │ ├── casefy.rs
│ │ ├── complete.rs
│ │ ├── delete.rs
│ │ ├── escape.rs
│ │ ├── forward.rs
│ │ ├── insert.rs
│ │ ├── kill.rs
│ │ ├── mod.rs
│ │ ├── move.rs
│ │ ├── paste.rs
│ │ ├── redo.rs
│ │ ├── replace.rs
│ │ ├── type.rs
│ │ ├── undo.rs
│ │ ├── visual.rs
│ │ └── yank.rs
│ ├── event.rs
│ ├── input.rs
│ ├── mod.rs
│ ├── mode.rs
│ ├── op.rs
│ ├── opt.rs
│ ├── parser/
│ │ ├── backspace.rs
│ │ ├── backward.rs
│ │ ├── casefy.rs
│ │ ├── complete.rs
│ │ ├── delete.rs
│ │ ├── forward.rs
│ │ ├── insert.rs
│ │ ├── kill.rs
│ │ ├── mod.rs
│ │ ├── move.rs
│ │ └── paste.rs
│ ├── separator.rs
│ ├── snap.rs
│ ├── snaps.rs
│ └── widget.rs
├── lib.rs
├── scrollable.rs
└── step.rs
Showing preview only (443K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5242 symbols across 788 files)
FILE: scripts/validate-form/main.js
constant LABEL_NAME (line 1) | const LABEL_NAME = "needs info"
constant RE_VERSION (line 2) | const RE_VERSION = /Yazi\s+Version\s*:\s\d+\.\d+\.\d+\s\(/gm
constant RE_DEPENDENCIES (line 3) | const RE_DEPENDENCIES = /Dependencies\s+[/a-z]+\s*:\s/gm
constant RE_CHECKLIST (line 4) | const RE_CHECKLIST = /#{3}\s+Checklist\s+(?:^-\s+\[x]\s+.+?(?:\n|\r\n|$)...
function bugReportBody (line 6) | function bugReportBody(creator, content, hash) {
function featureRequestBody (line 25) | function featureRequestBody(creator, content) {
function nightlyHash (line 45) | async function nightlyHash() {
function hasLabel (line 59) | async function hasLabel(id, label) {
function lastLabeledAt (line 72) | async function lastLabeledAt(id) {
function removedLabelManually (line 88) | async function removedLabelManually(id) {
function updateLabels (line 104) | async function updateLabels(id, mark, body) {
function hideOldComments (line 133) | async function hideOldComments(id) {
function closeOldIssues (line 164) | async function closeOldIssues() {
function closeUnsupportedIssue (line 197) | async function closeUnsupportedIssue(id) {
function main (line 216) | async function main() {
FILE: yazi-actor/src/actor.rs
type Actor (line 7) | pub trait Actor {
constant NAME (line 10) | const NAME: &str;
method act (line 12) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data>;
method hook (line 14) | fn hook(_cx: &Ctx, _opt: &Self::Options) -> Option<SparkKind> { None }
FILE: yazi-actor/src/app/accept_payload.rs
type AcceptPayload (line 13) | pub struct AcceptPayload;
type Options (line 16) | type Options = Payload<'static>;
constant NAME (line 18) | const NAME: &str = "accept_payload";
method act (line 20) | fn act(cx: &mut Ctx, payload: Payload) -> Result<Data> {
FILE: yazi-actor/src/app/bootstrap.rs
type Bootstrap (line 10) | pub struct Bootstrap;
type Options (line 13) | type Options = VoidOpt;
constant NAME (line 15) | const NAME: &str = "bootstrap";
method act (line 17) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/app/deprecate.rs
type Deprecate (line 8) | pub struct Deprecate;
type Options (line 11) | type Options = DeprecateOpt;
constant NAME (line 13) | const NAME: &str = "deprecate";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/app/focus.rs
type Focus (line 9) | pub struct Focus;
type Options (line 12) | type Options = VoidOpt;
constant NAME (line 14) | const NAME: &str = "focus";
method act (line 16) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> { act!(mgr:refres...
FILE: yazi-actor/src/app/mouse.rs
type Mouse (line 15) | pub struct Mouse;
type Options (line 18) | type Options = MouseOpt;
constant NAME (line 20) | const NAME: &str = "mouse";
method act (line 22) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/app/plugin.rs
type Plugin (line 10) | pub struct Plugin;
type Options (line 13) | type Options = PluginOpt;
constant NAME (line 15) | const NAME: &str = "plugin";
method act (line 17) | fn act(cx: &mut Ctx, mut opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/app/plugin_do.rs
type PluginDo (line 15) | pub struct PluginDo;
type Options (line 18) | type Options = PluginOpt;
constant NAME (line 20) | const NAME: &str = "plugin_do";
method act (line 22) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/app/quit.rs
type Quit (line 10) | pub struct Quit;
method cwd_to_file (line 35) | async fn cwd_to_file(cx: &Ctx<'_>, no: bool) {
method selected_to_file (line 42) | async fn selected_to_file(selected: Option<StrandBuf>) {
type Options (line 13) | type Options = QuitOpt;
constant NAME (line 15) | const NAME: &str = "quit";
method act (line 17) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/app/reflow.rs
type Reflow (line 13) | pub struct Reflow;
type Options (line 16) | type Options = ReflowOpt;
constant NAME (line 18) | const NAME: &str = "reflow";
method act (line 20) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/app/resize.rs
type Resize (line 9) | pub struct Resize;
type Options (line 12) | type Options = ReflowOpt;
constant NAME (line 14) | const NAME: &str = "resize";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/app/resume.rs
type Resume (line 9) | pub struct Resume;
type Options (line 12) | type Options = ResumeOpt;
constant NAME (line 14) | const NAME: &str = "resume";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/app/stop.rs
type Stop (line 8) | pub struct Stop;
type Options (line 11) | type Options = StopOpt;
constant NAME (line 13) | const NAME: &str = "stop";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/app/title.rs
type Title (line 13) | pub struct Title;
type Options (line 16) | type Options = TitleOpt;
constant NAME (line 18) | const NAME: &str = "title";
method act (line 20) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
method hook (line 28) | fn hook(cx: &Ctx, _opt: &Self::Options) -> Option<SparkKind> {
FILE: yazi-actor/src/app/update_progress.rs
type UpdateProgress (line 9) | pub struct UpdateProgress;
type Options (line 12) | type Options = UpdateProgressOpt;
constant NAME (line 14) | const NAME: &str = "update_progress";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/cmp/arrow.rs
type Arrow (line 9) | pub struct Arrow;
type Options (line 12) | type Options = ArrowOpt;
constant NAME (line 14) | const NAME: &str = "arrow";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/cmp/close.rs
type Close (line 11) | pub struct Close;
type Options (line 14) | type Options = CloseOpt;
constant NAME (line 16) | const NAME: &str = "close";
method act (line 18) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/cmp/show.rs
constant LIMIT (line 10) | const LIMIT: usize = 30;
type Show (line 12) | pub struct Show;
method match_candidates (line 45) | fn match_candidates(word: PathDyn, cache: &[CmpItem]) -> Vec<CmpItem> {
type Options (line 15) | type Options = ShowOpt;
constant NAME (line 17) | const NAME: &str = "show";
method act (line 19) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/cmp/trigger.rs
type Trigger (line 13) | pub struct Trigger;
method split_url (line 67) | fn split_url(s: &str) -> Option<(UrlBuf, PathBufDyn)> {
type Options (line 16) | type Options = TriggerOpt;
constant NAME (line 18) | const NAME: &str = "trigger";
method act (line 20) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
function compare (line 104) | fn compare(s: &str, parent: &str, child: &str) {
function test_split (line 114) | fn test_split() {
function test_split (line 144) | fn test_split() {
FILE: yazi-actor/src/confirm/arrow.rs
type Arrow (line 8) | pub struct Arrow;
type Options (line 11) | type Options = ArrowOpt;
constant NAME (line 13) | const NAME: &str = "arrow";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/confirm/close.rs
type Close (line 8) | pub struct Close;
type Options (line 11) | type Options = CloseOpt;
constant NAME (line 13) | const NAME: &str = "close";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/confirm/show.rs
type Show (line 8) | pub struct Show;
type Options (line 11) | type Options = ShowOpt;
constant NAME (line 13) | const NAME: &str = "show";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/context.rs
type Ctx (line 9) | pub struct Ctx<'a> {
type Target (line 20) | type Target = Core;
method deref (line 22) | fn deref(&self) -> &Self::Target { self.core }
method deref_mut (line 26) | fn deref_mut(&mut self) -> &mut Self::Target { self.core }
function new (line 31) | pub fn new(action: &Action, core: &'a mut Core, term: &'a mut Option<Ter...
function renew (line 55) | pub fn renew<'b>(cx: &'a mut Ctx<'b>) -> Self {
function active (line 69) | pub fn active(core: &'a mut Core, term: &'a mut Option<Term>) -> Self {
function tabs (line 85) | pub fn tabs(&self) -> &Tabs { &self.mgr.tabs }
function tabs_mut (line 88) | pub fn tabs_mut(&mut self) -> &mut Tabs { &mut self.mgr.tabs }
function tab (line 91) | pub fn tab(&self) -> &Tab { &self.tabs()[self.tab] }
function tab_mut (line 94) | pub fn tab_mut(&mut self) -> &mut Tab { &mut self.core.mgr.tabs[self.tab] }
function cwd (line 97) | pub fn cwd(&self) -> &UrlBuf { self.tab().cwd() }
function parent (line 100) | pub fn parent(&self) -> Option<&Folder> { self.tab().parent.as_ref() }
function parent_mut (line 103) | pub fn parent_mut(&mut self) -> Option<&mut Folder> { self.tab_mut().par...
function current (line 106) | pub fn current(&self) -> &Folder { &self.tab().current }
function current_mut (line 109) | pub fn current_mut(&mut self) -> &mut Folder { &mut self.tab_mut().curre...
function hovered (line 112) | pub fn hovered(&self) -> Option<&File> { self.tab().hovered() }
function hovered_folder (line 115) | pub fn hovered_folder(&self) -> Option<&Folder> { self.tab().hovered_fol...
function hovered_folder_mut (line 118) | pub fn hovered_folder_mut(&mut self) -> Option<&mut Folder> {
function tasks (line 123) | pub fn tasks(&self) -> &Tasks { &self.tasks }
function source (line 126) | pub fn source(&self) -> Source { if self.level != 1 { Source::Ind } else...
FILE: yazi-actor/src/core/preflight.rs
type Preflight (line 9) | pub struct Preflight;
method act (line 12) | pub fn act<'a>(cx: &mut Ctx, opt: (SparkKind, Spark<'a>)) -> Result<Sp...
FILE: yazi-actor/src/help/arrow.rs
type Arrow (line 9) | pub struct Arrow;
type Options (line 12) | type Options = ArrowOpt;
constant NAME (line 14) | const NAME: &str = "arrow";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/help/escape.rs
type Escape (line 8) | pub struct Escape;
type Options (line 11) | type Options = VoidOpt;
constant NAME (line 13) | const NAME: &str = "escape";
method act (line 15) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/help/filter.rs
type Filter (line 8) | pub struct Filter;
type Options (line 11) | type Options = VoidOpt;
constant NAME (line 13) | const NAME: &str = "filter";
method act (line 15) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/help/toggle.rs
type Toggle (line 8) | pub struct Toggle;
type Options (line 11) | type Options = ToggleOpt;
constant NAME (line 13) | const NAME: &str = "toggle";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/input/close.rs
type Close (line 9) | pub struct Close;
type Options (line 12) | type Options = CloseOpt;
constant NAME (line 14) | const NAME: &str = "close";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/input/complete.rs
type Complete (line 8) | pub struct Complete;
type Options (line 11) | type Options = CompleteOpt;
constant NAME (line 13) | const NAME: &str = "complete";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/input/escape.rs
type Escape (line 9) | pub struct Escape;
type Options (line 12) | type Options = VoidOpt;
constant NAME (line 14) | const NAME: &str = "escape";
method act (line 16) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/input/show.rs
type Show (line 10) | pub struct Show;
type Options (line 13) | type Options = InputOpt;
constant NAME (line 15) | const NAME: &str = "show";
method act (line 17) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/lives/core.rs
type Core (line 8) | pub(super) struct Core {
method make (line 26) | pub(super) fn make(inner: &yazi_core::Core) -> mlua::Result<AnyUserDat...
type Target (line 20) | type Target = yazi_core::Core;
method deref (line 22) | fn deref(&self) -> &Self::Target { &self.inner }
method add_methods (line 41) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-actor/src/lives/file.rs
type File (line 11) | pub(super) struct File {
method as_ref (line 34) | fn as_ref(&self) -> &yazi_fs::File { self }
method make (line 38) | pub(super) fn make(
method is_hovered (line 70) | fn is_hovered(&self) -> bool { self.idx == self.folder.cursor }
type Target (line 28) | type Target = yazi_fs::File;
method deref (line 30) | fn deref(&self) -> &Self::Target { &self.folder.files[self.idx] }
method add_fields (line 74) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
method add_methods (line 86) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-actor/src/lives/files.rs
type Files (line 8) | pub(super) struct Files {
method make (line 23) | pub(super) fn make(
type Target (line 17) | type Target = yazi_fs::Files;
method deref (line 19) | fn deref(&self) -> &Self::Target { &self.folder.files }
method add_fields (line 33) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
method add_methods (line 37) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-actor/src/lives/filter.rs
type Filter (line 7) | pub(super) struct Filter {
method make (line 18) | pub(super) fn make(inner: &yazi_fs::Filter) -> mlua::Result<AnyUserDat...
type Target (line 12) | type Target = yazi_fs::Filter;
method deref (line 14) | fn deref(&self) -> &Self::Target { &self.inner }
method add_methods (line 24) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-actor/src/lives/finder.rs
type Finder (line 7) | pub(super) struct Finder {
method make (line 18) | pub(super) fn make(inner: &yazi_core::tab::Finder) -> mlua::Result<Any...
type Target (line 12) | type Target = yazi_core::tab::Finder;
method deref (line 14) | fn deref(&self) -> &Self::Target { &self.inner }
method add_methods (line 24) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-actor/src/lives/folder.rs
type Folder (line 9) | pub(super) struct Folder {
method make (line 28) | pub(super) fn make(
type Target (line 22) | type Target = yazi_core::tab::Folder;
method deref (line 24) | fn deref(&self) -> &Self::Target { &self.inner }
method add_fields (line 56) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
FILE: yazi-actor/src/lives/lives.rs
type Lives (line 16) | pub struct Lives;
method scope (line 19) | pub fn scope<T, F>(core: &yazi_core::Core, f: F) -> mlua::Result<T>
method scoped_userdata (line 44) | pub(crate) fn scoped_userdata<T>(data: T) -> mlua::Result<AnyUserData>
FILE: yazi-actor/src/lives/mode.rs
type Mode (line 7) | pub(super) struct Mode {
method make (line 18) | pub(super) fn make(inner: &yazi_core::tab::Mode) -> mlua::Result<AnyUs...
type Target (line 12) | type Target = yazi_core::tab::Mode;
method deref (line 14) | fn deref(&self) -> &Self::Target { &self.inner }
method add_fields (line 24) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
method add_methods (line 30) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-actor/src/lives/preference.rs
type Preference (line 8) | pub(super) struct Preference {
method make (line 24) | pub(super) fn make(inner: &yazi_core::tab::Preference) -> mlua::Result...
type Target (line 18) | type Target = yazi_core::tab::Preference;
method deref (line 20) | fn deref(&self) -> &Self::Target { &self.inner }
method add_fields (line 37) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
FILE: yazi-actor/src/lives/preview.rs
type Preview (line 9) | pub(super) struct Preview {
method make (line 22) | pub(super) fn make(tab: &yazi_core::tab::Tab) -> mlua::Result<AnyUserD...
type Target (line 16) | type Target = yazi_core::tab::Preview;
method deref (line 18) | fn deref(&self) -> &Self::Target { &self.tab.preview }
method add_fields (line 28) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
FILE: yazi-actor/src/lives/ptr.rs
type PtrCell (line 3) | pub(super) struct PtrCell<T>(pub(super) *const T);
type Target (line 6) | type Target = T;
method deref (line 8) | fn deref(&self) -> &Self::Target { unsafe { &*self.0 } }
function from (line 12) | fn from(value: &T) -> Self { Self(value) }
method clone (line 16) | fn clone(&self) -> Self { *self }
method eq (line 22) | fn eq(&self, other: &Self) -> bool { self.0.addr() == other.0.addr() }
method hash (line 28) | fn hash<H: Hasher>(&self, state: &mut H) { state.write_usize(self.0.addr...
function as_static (line 33) | pub(super) fn as_static(&self) -> &'static T { unsafe { &*self.0 } }
FILE: yazi-actor/src/lives/selected.rs
type Selected (line 7) | pub(super) struct Selected;
method make (line 10) | pub(super) fn make(inner: &yazi_core::tab::Selected) -> mlua::Result<A...
FILE: yazi-actor/src/lives/tab.rs
type Tab (line 8) | pub(super) struct Tab {
method make (line 28) | pub(super) fn make(inner: &yazi_core::tab::Tab) -> mlua::Result<AnyUse...
type Target (line 22) | type Target = yazi_core::tab::Tab;
method deref (line 24) | fn deref(&self) -> &Self::Target { &self.inner }
method add_fields (line 45) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
method add_methods (line 67) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-actor/src/lives/tabs.rs
type Tabs (line 7) | pub(super) struct Tabs {
method make (line 18) | pub(super) fn make(inner: &yazi_core::mgr::Tabs) -> mlua::Result<AnyUs...
type Target (line 12) | type Target = yazi_core::mgr::Tabs;
method deref (line 14) | fn deref(&self) -> &Self::Target { &self.inner }
method add_fields (line 24) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
method add_methods (line 28) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-actor/src/lives/task.rs
type TaskSnap (line 8) | pub(super) struct TaskSnap {
method make (line 22) | pub(super) fn make(inner: &yazi_scheduler::TaskSnap) -> mlua::Result<A...
type Target (line 16) | type Target = yazi_scheduler::TaskSnap;
method deref (line 18) | fn deref(&self) -> &Self::Target { &self.inner }
method add_fields (line 28) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
FILE: yazi-actor/src/lives/tasks.rs
type Tasks (line 9) | pub(super) struct Tasks {
method make (line 23) | pub(super) fn make(inner: &yazi_core::tasks::Tasks) -> mlua::Result<An...
type Target (line 17) | type Target = yazi_core::tasks::Tasks;
method deref (line 19) | fn deref(&self) -> &Self::Target { &self.inner }
method add_fields (line 34) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
FILE: yazi-actor/src/lives/which.rs
type Which (line 8) | pub(super) struct Which {
method make (line 22) | pub(super) fn make(inner: &yazi_core::which::Which) -> mlua::Result<An...
type Target (line 16) | type Target = yazi_core::which::Which;
method deref (line 18) | fn deref(&self) -> &Self::Target { &self.inner }
method add_fields (line 28) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
FILE: yazi-actor/src/lives/yanked.rs
type Yanked (line 8) | pub(super) struct Yanked {
method make (line 20) | pub(super) fn make(inner: &yazi_core::mgr::Yanked) -> mlua::Result<Any...
type Target (line 14) | type Target = yazi_core::mgr::Yanked;
method deref (line 16) | fn deref(&self) -> &Self::Target { &self.inner }
method add_fields (line 34) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
method add_methods (line 38) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-actor/src/mgr/arrow.rs
type Arrow (line 8) | pub struct Arrow;
type Options (line 11) | type Options = ArrowOpt;
constant NAME (line 13) | const NAME: &str = "arrow";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/back.rs
type Back (line 8) | pub struct Back;
type Options (line 11) | type Options = VoidOpt;
constant NAME (line 13) | const NAME: &str = "back";
method act (line 15) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/bulk_rename.rs
type BulkRename (line 23) | pub struct BulkRename;
method r#do (line 89) | async fn r#do(
method opener (line 160) | fn opener() -> Option<&'static OpenerRule> {
method replace_url (line 164) | fn replace_url(url: &UrlBuf, take: usize, rep: &StrandBuf) -> Result<U...
method output_failed (line 168) | async fn output_failed(failed: Vec<(Tuple, Tuple, anyhow::Error)>) -> ...
method prioritized_paths (line 183) | fn prioritized_paths(old: Vec<Tuple>, new: Vec<Tuple>) -> Vec<(Tuple, ...
type Options (line 26) | type Options = VoidOpt;
constant NAME (line 28) | const NAME: &str = "bulk_rename";
method act (line 30) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
type Tuple (line 224) | struct Tuple(usize, StrandBuf);
method new (line 247) | fn new(index: usize, inner: impl Into<StrandBuf>) -> Self { Self(index...
type Target (line 227) | type Target = StrandBuf;
method deref (line 229) | fn deref(&self) -> &Self::Target { &self.1 }
method eq (line 233) | fn eq(&self, other: &Self) -> bool { self.1 == other.1 }
method hash (line 239) | fn hash<H: std::hash::Hasher>(&self, state: &mut H) { self.1.hash(state); }
method as_strand (line 243) | fn as_strand(&self) -> Strand<'_> { self.1.as_strand() }
function test_sort (line 256) | fn test_sort() {
FILE: yazi-actor/src/mgr/cd.rs
type Cd (line 18) | pub struct Cd;
method cd_interactive (line 64) | fn cd_interactive(cx: &Ctx) -> Result<Data> {
type Options (line 21) | type Options = CdOpt;
constant NAME (line 23) | const NAME: &str = "cd";
method act (line 25) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/close.rs
type Close (line 8) | pub struct Close;
type Options (line 11) | type Options = CloseOpt;
constant NAME (line 13) | const NAME: &str = "close";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/copy.rs
type Copy (line 9) | pub struct Copy;
type Options (line 12) | type Options = CopyOpt;
constant NAME (line 14) | const NAME: &str = "copy";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/create.rs
type Create (line 14) | pub struct Create;
method r#do (line 49) | async fn r#do(new: UrlBuf, dir: bool) -> Result<()> {
type Options (line 17) | type Options = CreateOpt;
constant NAME (line 19) | const NAME: &str = "create";
method act (line 21) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/displace.rs
type Displace (line 10) | pub struct Displace;
type Options (line 13) | type Options = VoidOpt;
constant NAME (line 15) | const NAME: &str = "displace";
method act (line 17) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/displace_do.rs
type DisplaceDo (line 9) | pub struct DisplaceDo;
type Options (line 12) | type Options = DisplaceDoOpt;
constant NAME (line 14) | const NAME: &str = "displace_do";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/download.rs
type Download (line 15) | pub struct Download;
method prepare (line 75) | async fn prepare(urls: &[UrlCow<'_>]) {
type Options (line 18) | type Options = DownloadOpt;
constant NAME (line 20) | const NAME: &str = "download";
method act (line 22) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/enter.rs
type Enter (line 8) | pub struct Enter;
type Options (line 11) | type Options = VoidOpt;
constant NAME (line 13) | const NAME: &str = "enter";
method act (line 15) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/escape.rs
type Escape (line 9) | pub struct Escape;
type Options (line 12) | type Options = EscapeOpt;
constant NAME (line 14) | const NAME: &str = "escape";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
type EscapeFind (line 46) | pub struct EscapeFind;
type Options (line 49) | type Options = VoidOpt;
constant NAME (line 51) | const NAME: &str = "escape_find";
method act (line 53) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
type EscapeVisual (line 59) | pub struct EscapeVisual;
type Options (line 62) | type Options = VoidOpt;
constant NAME (line 64) | const NAME: &str = "escape_visual";
method act (line 66) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
type EscapeFilter (line 91) | pub struct EscapeFilter;
type Options (line 94) | type Options = VoidOpt;
constant NAME (line 96) | const NAME: &str = "escape_filter";
method act (line 98) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
type EscapeSelect (line 110) | pub struct EscapeSelect;
type Options (line 113) | type Options = VoidOpt;
constant NAME (line 115) | const NAME: &str = "escape_select";
method act (line 117) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
type EscapeSearch (line 134) | pub struct EscapeSearch;
type Options (line 137) | type Options = VoidOpt;
constant NAME (line 139) | const NAME: &str = "escape_search";
method act (line 141) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/filter.rs
type Filter (line 15) | pub struct Filter;
type Options (line 18) | type Options = FilterOpt;
constant NAME (line 20) | const NAME: &str = "filter";
method act (line 22) | fn act(_: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/filter_do.rs
type FilterDo (line 9) | pub struct FilterDo;
type Options (line 12) | type Options = FilterOpt;
constant NAME (line 14) | const NAME: &str = "filter_do";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/find.rs
type Find (line 15) | pub struct Find;
type Options (line 18) | type Options = FindOpt;
constant NAME (line 20) | const NAME: &str = "find";
method act (line 22) | fn act(_: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/find_arrow.rs
type FindArrow (line 8) | pub struct FindArrow;
type Options (line 11) | type Options = FindArrowOpt;
constant NAME (line 13) | const NAME: &str = "find_arrow";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/find_do.rs
type FindDo (line 9) | pub struct FindDo;
type Options (line 12) | type Options = FindDoOpt;
constant NAME (line 14) | const NAME: &str = "find_do";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/follow.rs
type Follow (line 9) | pub struct Follow;
type Options (line 12) | type Options = VoidOpt;
constant NAME (line 14) | const NAME: &str = "follow";
method act (line 16) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/forward.rs
type Forward (line 8) | pub struct Forward;
type Options (line 11) | type Options = VoidOpt;
constant NAME (line 13) | const NAME: &str = "forward";
method act (line 15) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/hardlink.rs
type Hardlink (line 8) | pub struct Hardlink;
type Options (line 11) | type Options = HardlinkOpt;
constant NAME (line 13) | const NAME: &str = "hardlink";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/hidden.rs
type Hidden (line 11) | pub struct Hidden;
type Options (line 14) | type Options = HiddenOpt;
constant NAME (line 16) | const NAME: &str = "hidden";
method act (line 18) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
method hook (line 55) | fn hook(cx: &Ctx, _: &Self::Options) -> Option<SparkKind> {
FILE: yazi-actor/src/mgr/hover.rs
type Hover (line 9) | pub struct Hover;
type Options (line 12) | type Options = HoverOpt;
constant NAME (line 14) | const NAME: &str = "hover";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/leave.rs
type Leave (line 8) | pub struct Leave;
type Options (line 11) | type Options = VoidOpt;
constant NAME (line 13) | const NAME: &str = "leave";
method act (line 15) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/linemode.rs
type Linemode (line 8) | pub struct Linemode;
type Options (line 11) | type Options = LinemodeOpt;
constant NAME (line 13) | const NAME: &str = "linemode";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/link.rs
type Link (line 8) | pub struct Link;
type Options (line 11) | type Options = LinkOpt;
constant NAME (line 13) | const NAME: &str = "link";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/open.rs
type Open (line 12) | pub struct Open;
type Options (line 15) | type Options = OpenOpt;
constant NAME (line 17) | const NAME: &str = "open";
method act (line 19) | fn act(cx: &mut Ctx, mut opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/open_do.rs
type OpenDo (line 11) | pub struct OpenDo;
method match_and_open (line 62) | fn match_and_open(cx: &Ctx, cwd: UrlCow<'static>, targets: Vec<(UrlCow...
type Options (line 14) | type Options = OpenDoOpt;
constant NAME (line 16) | const NAME: &str = "open_do";
method act (line 18) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/paste.rs
type Paste (line 8) | pub struct Paste;
type Options (line 11) | type Options = PasteOpt;
constant NAME (line 13) | const NAME: &str = "paste";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/peek.rs
type Peek (line 8) | pub struct Peek;
type Options (line 11) | type Options = PeekOpt;
constant NAME (line 13) | const NAME: &str = "peek";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/quit.rs
type Quit (line 14) | pub struct Quit;
method with_selected (line 67) | pub(super) fn with_selected<I>(selected: I)
type Options (line 17) | type Options = QuitOpt;
constant NAME (line 19) | const NAME: &str = "quit";
method act (line 21) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
method hook (line 61) | fn hook(cx: &Ctx, _opt: &Self::Options) -> Option<SparkKind> {
FILE: yazi-actor/src/mgr/refresh.rs
type Refresh (line 12) | pub struct Refresh;
method cwd_changed (line 38) | fn cwd_changed() {
method trigger_dirs (line 45) | fn trigger_dirs(folders: &[&Folder]) {
type Options (line 15) | type Options = VoidOpt;
constant NAME (line 17) | const NAME: &str = "refresh";
method act (line 19) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/remove.rs
type Remove (line 10) | pub struct Remove;
type Options (line 13) | type Options = RemoveOpt;
constant NAME (line 15) | const NAME: &str = "remove";
method act (line 17) | fn act(cx: &mut Ctx, mut opt: Self::Options) -> Result<Data> {
type RemoveDo (line 48) | pub struct RemoveDo;
type Options (line 51) | type Options = RemoveOpt;
constant NAME (line 53) | const NAME: &str = "remove_do";
method act (line 55) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/rename.rs
type Rename (line 15) | pub struct Rename;
method r#do (line 68) | async fn r#do(tab: Id, old: UrlBuf, new: UrlBuf) -> Result<()> {
method empty_url_part (line 100) | fn empty_url_part(url: &UrlBuf, by: &str) -> String {
type Options (line 18) | type Options = RenameOpt;
constant NAME (line 20) | const NAME: &str = "rename";
method act (line 22) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/reveal.rs
type Reveal (line 9) | pub struct Reveal;
type Options (line 12) | type Options = RevealOpt;
constant NAME (line 14) | const NAME: &str = "reveal";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/search.rs
type Search (line 17) | pub struct Search;
type Options (line 20) | type Options = SearchOpt;
constant NAME (line 22) | const NAME: &str = "search";
method act (line 24) | fn act(cx: &mut Ctx, mut opt: Self::Options) -> Result<Data> {
type SearchDo (line 43) | pub struct SearchDo;
type Options (line 46) | type Options = SearchOpt;
constant NAME (line 48) | const NAME: &str = "search_do";
method act (line 50) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
type SearchStop (line 101) | pub struct SearchStop;
type Options (line 104) | type Options = VoidOpt;
constant NAME (line 106) | const NAME: &str = "search_stop";
method act (line 108) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/seek.rs
type Seek (line 10) | pub struct Seek;
type Options (line 13) | type Options = SeekOpt;
constant NAME (line 15) | const NAME: &str = "seek";
method act (line 17) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/shell.rs
type Shell (line 13) | pub struct Shell;
type Options (line 16) | type Options = ShellOpt;
constant NAME (line 18) | const NAME: &str = "shell";
method act (line 20) | fn act(cx: &mut Ctx, mut opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/sort.rs
type Sort (line 11) | pub struct Sort;
type Options (line 14) | type Options = SortOpt;
constant NAME (line 16) | const NAME: &str = "sort";
method act (line 18) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
method hook (line 62) | fn hook(cx: &Ctx, _: &Self::Options) -> Option<SparkKind> {
FILE: yazi-actor/src/mgr/spot.rs
type Spot (line 8) | pub struct Spot;
type Options (line 11) | type Options = SpotOpt;
constant NAME (line 13) | const NAME: &str = "spot";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/stash.rs
type Stash (line 9) | pub struct Stash;
type Options (line 12) | type Options = StashOpt;
constant NAME (line 14) | const NAME: &str = "stash";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
method hook (line 24) | fn hook(cx: &Ctx, _opt: &Self::Options) -> Option<SparkKind> {
FILE: yazi-actor/src/mgr/suspend.rs
type Suspend (line 8) | pub struct Suspend;
type Options (line 11) | type Options = VoidOpt;
constant NAME (line 13) | const NAME: &str = "suspend";
method act (line 15) | fn act(_: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/tab_close.rs
type TabClose (line 8) | pub struct TabClose;
type Options (line 11) | type Options = TabCloseOpt;
constant NAME (line 13) | const NAME: &str = "tab_close";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/tab_create.rs
constant MAX_TABS (line 10) | const MAX_TABS: usize = 9;
type TabCreate (line 12) | pub struct TabCreate;
type Options (line 15) | type Options = TabCreateOpt;
constant NAME (line 17) | const NAME: &str = "tab_create";
method act (line 19) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/tab_rename.rs
type TabRename (line 13) | pub struct TabRename;
type Options (line 16) | type Options = TabRenameOpt;
constant NAME (line 18) | const NAME: &str = "tab_rename";
method act (line 20) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/tab_swap.rs
type TabSwap (line 9) | pub struct TabSwap;
type Options (line 12) | type Options = ArrowOpt;
constant NAME (line 14) | const NAME: &str = "tab_swap";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/tab_switch.rs
type TabSwitch (line 8) | pub struct TabSwitch;
type Options (line 11) | type Options = TabSwitchOpt;
constant NAME (line 13) | const NAME: &str = "tab_switch";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/toggle.rs
type Toggle (line 9) | pub struct Toggle;
type Options (line 12) | type Options = ToggleOpt;
constant NAME (line 14) | const NAME: &str = "toggle";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/toggle_all.rs
type ToggleAll (line 9) | pub struct ToggleAll;
type Options (line 12) | type Options = ToggleAllOpt;
constant NAME (line 14) | const NAME: &str = "toggle_all";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/unyank.rs
type Unyank (line 8) | pub struct Unyank;
type Options (line 11) | type Options = VoidOpt;
constant NAME (line 13) | const NAME: &str = "unyank";
method act (line 15) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/update_files.rs
type UpdateFiles (line 11) | pub struct UpdateFiles;
method update_tab (line 42) | fn update_tab(cx: &mut Ctx, op: FilesOp) -> Result<Data> {
method update_parent (line 57) | fn update_parent(cx: &mut Ctx, op: FilesOp) -> Result<Data> {
method update_current (line 74) | fn update_current(cx: &mut Ctx, op: FilesOp) -> Result<Data> {
method update_hovered (line 88) | fn update_hovered(cx: &mut Ctx, op: FilesOp) -> Result<Data> {
method update_history (line 98) | fn update_history(cx: &mut Ctx, op: FilesOp) -> Result<Data> {
type Options (line 14) | type Options = UpdateFilesOpt;
constant NAME (line 16) | const NAME: &str = "update_files";
method act (line 18) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/update_mimes.rs
type UpdateMimes (line 10) | pub struct UpdateMimes;
type Options (line 13) | type Options = UpdateMimesOpt;
constant NAME (line 15) | const NAME: &str = "update_mimes";
method act (line 17) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/update_paged.rs
type UpdatePaged (line 8) | pub struct UpdatePaged;
type Options (line 11) | type Options = UpdatePagedOpt;
constant NAME (line 13) | const NAME: &str = "update_paged";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/update_peeked.rs
type UpdatePeeked (line 8) | pub struct UpdatePeeked;
type Options (line 11) | type Options = UpdatePeekedOpt;
constant NAME (line 13) | const NAME: &str = "update_peeked";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/update_spotted.rs
type UpdateSpotted (line 8) | pub struct UpdateSpotted;
type Options (line 11) | type Options = UpdateSpottedOpt;
constant NAME (line 13) | const NAME: &str = "update_spotted";
method act (line 15) | fn act(cx: &mut Ctx, mut opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/update_yanked.rs
type UpdateYanked (line 9) | pub struct UpdateYanked;
type Options (line 12) | type Options = UpdateYankedOpt<'static>;
constant NAME (line 14) | const NAME: &str = "update_yanked";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/upload.rs
type Upload (line 8) | pub struct Upload;
type Options (line 11) | type Options = UploadOpt;
constant NAME (line 13) | const NAME: &str = "upload";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/visual_mode.rs
type VisualMode (line 11) | pub struct VisualMode;
type Options (line 14) | type Options = VisualModeOpt;
constant NAME (line 16) | const NAME: &str = "visual_mode";
method act (line 18) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/watch.rs
type Watch (line 10) | pub struct Watch;
type Options (line 13) | type Options = VoidOpt;
constant NAME (line 15) | const NAME: &str = "watch";
method act (line 17) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/mgr/yank.rs
type Yank (line 9) | pub struct Yank;
type Options (line 12) | type Options = YankOpt;
constant NAME (line 14) | const NAME: &str = "yank";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/notify/push.rs
type Push (line 12) | pub struct Push;
type Options (line 15) | type Options = PushOpt;
constant NAME (line 17) | const NAME: &str = "push";
method act (line 19) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
method hook (line 32) | fn hook(cx: &Ctx, _: &Self::Options) -> Option<SparkKind> {
FILE: yazi-actor/src/notify/tick.rs
type Tick (line 14) | pub struct Tick;
type Options (line 17) | type Options = TickOpt;
constant NAME (line 19) | const NAME: &str = "tick";
method act (line 21) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/pick/arrow.rs
type Arrow (line 9) | pub struct Arrow;
type Options (line 12) | type Options = ArrowOpt;
constant NAME (line 14) | const NAME: &str = "arrow";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/pick/close.rs
type Close (line 8) | pub struct Close;
type Options (line 11) | type Options = CloseOpt;
constant NAME (line 13) | const NAME: &str = "close";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/pick/show.rs
type Show (line 8) | pub struct Show;
type Options (line 11) | type Options = ShowOpt;
constant NAME (line 13) | const NAME: &str = "show";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/spot/arrow.rs
type Arrow (line 8) | pub struct Arrow;
type Options (line 11) | type Options = ArrowOpt;
constant NAME (line 13) | const NAME: &str = "arrow";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/spot/close.rs
type Close (line 8) | pub struct Close;
type Options (line 11) | type Options = VoidOpt;
constant NAME (line 13) | const NAME: &str = "close";
method act (line 15) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/spot/copy.rs
type Copy (line 9) | pub struct Copy;
type Options (line 12) | type Options = CopyOpt;
constant NAME (line 14) | const NAME: &str = "copy";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/spot/swipe.rs
type Swipe (line 8) | pub struct Swipe;
type Options (line 11) | type Options = ArrowOpt;
constant NAME (line 13) | const NAME: &str = "swipe";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/tasks/arrow.rs
type Arrow (line 9) | pub struct Arrow;
type Options (line 12) | type Options = ArrowOpt;
constant NAME (line 14) | const NAME: &str = "arrow";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/tasks/cancel.rs
type Cancel (line 8) | pub struct Cancel;
type Options (line 11) | type Options = VoidOpt;
constant NAME (line 13) | const NAME: &str = "cancel";
method act (line 15) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/tasks/close.rs
type Close (line 8) | pub struct Close;
type Options (line 11) | type Options = VoidOpt;
constant NAME (line 13) | const NAME: &str = "close";
method act (line 15) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/tasks/inspect.rs
type Inspect (line 17) | pub struct Inspect;
type Options (line 20) | type Options = VoidOpt;
constant NAME (line 22) | const NAME: &str = "inspect";
method act (line 24) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/tasks/open_shell_compat.rs
type OpenShellCompat (line 8) | pub struct OpenShellCompat;
type Options (line 12) | type Options = ProcessOpenOpt;
constant NAME (line 14) | const NAME: &str = "open_shell_compat";
method act (line 16) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/tasks/process_open.rs
type ProcessOpen (line 8) | pub struct ProcessOpen;
type Options (line 11) | type Options = ProcessOpenOpt;
constant NAME (line 13) | const NAME: &str = "process_open";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/tasks/show.rs
type Show (line 8) | pub struct Show;
type Options (line 11) | type Options = VoidOpt;
constant NAME (line 13) | const NAME: &str = "show";
method act (line 15) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/tasks/update_succeed.rs
type UpdateSucceed (line 8) | pub struct UpdateSucceed;
type Options (line 11) | type Options = UpdateSucceedOpt;
constant NAME (line 13) | const NAME: &str = "update_succeed";
method act (line 15) | fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
FILE: yazi-actor/src/which/activate.rs
type Activate (line 10) | pub struct Activate;
type Options (line 13) | type Options = ActivateOpt;
constant NAME (line 15) | const NAME: &str = "activate";
method act (line 17) | fn act(cx: &mut Ctx, mut opt: Self::Options) -> Result<Data> {
method hook (line 35) | fn hook(cx: &Ctx, _opt: &Self::Options) -> Option<SparkKind> {
FILE: yazi-actor/src/which/dismiss.rs
type Dismiss (line 8) | pub struct Dismiss;
type Options (line 11) | type Options = VoidOpt;
constant NAME (line 13) | const NAME: &str = "dismiss";
method act (line 15) | fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
FILE: yazi-adapter/src/adapter.rs
type Adapter (line 12) | pub enum Adapter {
method image_show (line 39) | pub async fn image_show<P>(self, path: P, max: Rect) -> Result<Rect>
method image_hide (line 58) | pub fn image_hide(self) -> Result<()> {
method image_erase (line 62) | pub fn image_erase(self, area: Rect) -> Result<()> {
method shown_load (line 74) | pub fn shown_load(self) -> Option<Rect> { SHOWN.get() }
method shown_store (line 77) | pub(super) fn shown_store(area: Rect) { SHOWN.set(Some(area)); }
method start (line 79) | pub(super) fn start(self) { drivers::Ueberzug::start(self); }
method needs_ueberzug (line 82) | pub(super) fn needs_ueberzug(self) -> bool {
method matches (line 88) | pub fn matches(emulator: &Emulator) -> Self {
method fmt (line 25) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
FILE: yazi-adapter/src/adapters.rs
type Adapters (line 5) | pub(super) struct Adapters(Vec<Adapter>);
method from (line 18) | fn from(value: &yazi_emulator::Emulator) -> Self { value.kind.either_i...
method from (line 22) | fn from(value: yazi_emulator::Brand) -> Self {
method from (line 52) | fn from(value: yazi_emulator::Unknown) -> Self {
type Target (line 8) | type Target = Vec<Adapter>;
method deref (line 10) | fn deref(&self) -> &Self::Target { &self.0 }
method deref_mut (line 14) | fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 }
FILE: yazi-adapter/src/drivers/chafa.rs
type Chafa (line 12) | pub(crate) struct Chafa;
method image_show (line 15) | pub(crate) async fn image_show(path: PathBuf, max: Rect) -> Result<Rec...
method image_erase (line 71) | pub(crate) fn image_erase(area: Rect) -> Result<()> {
FILE: yazi-adapter/src/drivers/iip.rs
type Iip (line 13) | pub(crate) struct Iip;
method image_show (line 16) | pub(crate) async fn image_show(path: PathBuf, max: Rect) -> Result<Rec...
method image_erase (line 29) | pub(crate) fn image_erase(area: Rect) -> Result<()> {
method encode (line 40) | async fn encode(img: DynamicImage) -> Result<Vec<u8>> {
FILE: yazi-adapter/src/drivers/kgp.rs
type Kgp (line 314) | pub(crate) struct Kgp;
method image_show (line 317) | pub(crate) async fn image_show(path: PathBuf, max: Rect) -> Result<Rec...
method image_erase (line 333) | pub(crate) fn image_erase(area: Rect) -> Result<()> {
method encode (line 346) | async fn encode(img: DynamicImage) -> Result<Vec<u8>> {
method place (line 383) | fn place(area: &Rect) -> Result<Vec<u8>> {
method image_id (line 401) | fn image_id() -> u32 {
FILE: yazi-adapter/src/drivers/kgp_old.rs
type KgpOld (line 13) | pub(crate) struct KgpOld;
method image_show (line 16) | pub(crate) async fn image_show(path: PathBuf, max: Rect) -> Result<Rec...
method image_erase (line 29) | pub(crate) fn image_erase(_: Rect) -> Result<()> {
method encode (line 36) | async fn encode(img: DynamicImage) -> Result<Vec<u8>> {
FILE: yazi-adapter/src/drivers/sixel.rs
type Sixel (line 13) | pub(crate) struct Sixel;
method image_show (line 21) | pub(crate) async fn image_show(path: PathBuf, max: Rect) -> Result<Rec...
method image_erase (line 34) | pub(crate) fn image_erase(area: Rect) -> Result<()> {
method encode (line 45) | async fn encode(img: DynamicImage) -> Result<Vec<u8>> {
method quantify (line 117) | fn quantify(rgb: &RgbImage, alpha: bool) -> Result<QuantizeOutput<Srgb...
type QuantizeOutput (line 15) | struct QuantizeOutput<T> {
FILE: yazi-adapter/src/drivers/ueberzug.rs
type Cmd (line 14) | type Cmd = Option<(PathBuf, Rect)>;
type Ueberzug (line 18) | pub(crate) struct Ueberzug;
method start (line 21) | pub(crate) fn start(adapter: Adapter) {
method image_show (line 46) | pub(crate) async fn image_show(path: PathBuf, max: Rect) -> Result<Rec...
method image_erase (line 70) | pub(crate) fn image_erase(_: Rect) -> Result<()> {
method supported_compositor (line 81) | pub(crate) fn supported_compositor() -> bool {
method create_demon (line 87) | fn create_demon(adapter: Adapter) -> Result<Child> {
method adjust_rect (line 103) | fn adjust_rect(mut rect: Rect) -> Rect {
method send_command (line 114) | async fn send_command(adapter: Adapter, child: &mut Child, cmd: Cmd) -...
FILE: yazi-adapter/src/icc.rs
type Icc (line 5) | pub(super) struct Icc;
method transform (line 7) | pub(super) fn transform(mut decoder: impl ImageDecoder) -> anyhow::Res...
method color_type_to_layout (line 49) | fn color_type_to_layout(color_type: ColorType) -> Option<Layout> {
method requires_transform (line 59) | fn requires_transform(profile: &ColorProfile) -> bool {
FILE: yazi-adapter/src/image.rs
type Image (line 12) | pub struct Image;
method precache (line 15) | pub async fn precache(src: PathBuf, cache: &Path) -> Result<()> {
method downscale (line 43) | pub(super) async fn downscale(path: PathBuf, rect: Rect) -> Result<Dyn...
method max_pixel (line 66) | pub(super) fn max_pixel(rect: Rect) -> (u16, u16) {
method pixel_area (line 75) | pub(super) fn pixel_area(size: (u32, u32), rect: Rect) -> Rect {
method filter (line 86) | fn filter() -> FilterType {
method decode_from (line 97) | async fn decode_from(path: PathBuf) -> Result<(DynamicImage, Orientati...
method flip_size (line 121) | fn flip_size(orientation: Orientation, (w, h): (u16, u16)) -> (u32, u3...
FILE: yazi-adapter/src/info.rs
type ImageFormat (line 5) | pub type ImageFormat = image::ImageFormat;
type ImageColor (line 6) | pub type ImageColor = image::ColorType;
type ImageOrientation (line 7) | pub type ImageOrientation = image::metadata::Orientation;
type ImageInfo (line 10) | pub struct ImageInfo {
method new (line 19) | pub async fn new(path: PathBuf) -> image::ImageResult<Self> {
FILE: yazi-adapter/src/lib.rs
function init (line 16) | pub fn init() -> anyhow::Result<()> {
FILE: yazi-binding/src/access.rs
type Access (line 7) | pub struct Access(yazi_vfs::provider::Gate);
method add_methods (line 10) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/calculator.rs
type SizeCalculator (line 5) | pub enum SizeCalculator {
method add_fields (line 11) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
method add_methods (line 20) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/cha.rs
type Cha (line 7) | pub struct Cha(pub yazi_fs::cha::Cha);
method install (line 16) | pub fn install(lua: &Lua) -> mlua::Result<()> {
type Target (line 10) | type Target = yazi_fs::cha::Cha;
method deref (line 12) | fn deref(&self) -> &Self::Target { &self.0 }
method add_fields (line 53) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
method add_methods (line 78) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/chan.rs
type MpscTx (line 7) | pub struct MpscTx<T: FromLua + 'static>(pub tokio::sync::mpsc::Sender<T>);
type MpscRx (line 8) | pub struct MpscRx<T: IntoLua + 'static>(pub tokio::sync::mpsc::Receiver<...
method add_methods (line 11) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
method add_methods (line 22) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
type MpscUnboundedTx (line 33) | pub struct MpscUnboundedTx<T: FromLua + 'static>(pub tokio::sync::mpsc::...
type MpscUnboundedRx (line 34) | pub struct MpscUnboundedRx<T: IntoLua + 'static>(pub tokio::sync::mpsc::...
method add_methods (line 37) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
method add_methods (line 46) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
type OneshotTx (line 57) | pub struct OneshotTx<T: FromLua + 'static>(pub Option<tokio::sync::onesh...
type OneshotRx (line 58) | pub struct OneshotRx<T: IntoLua + 'static>(pub Option<tokio::sync::onesh...
method add_methods (line 61) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
method add_methods (line 75) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/chord_cow.rs
type ChordCow (line 5) | pub struct ChordCow(pub yazi_config::keymap::ChordCow);
method from (line 8) | fn from(value: yazi_config::keymap::ChordCow) -> Self { Self(value) }
function from (line 12) | fn from(value: ChordCow) -> Self { value.0 }
FILE: yazi-binding/src/color.rs
type Color (line 6) | pub struct Color(pub ratatui::style::Color);
method from_lua (line 9) | fn from_lua(value: Value, _: &Lua) -> mlua::Result<Self> {
FILE: yazi-binding/src/composer.rs
type ComposerGet (line 4) | pub type ComposerGet = fn(&Lua, &[u8]) -> mlua::Result<Value>;
type ComposerSet (line 5) | pub type ComposerSet = fn(&Lua, &[u8], Value) -> mlua::Result<Value>;
type Composer (line 7) | pub struct Composer<G, S> {
function new (line 20) | pub fn new(get: G, set: S) -> Self { Self { get, set, parent: None, cach...
function with_parent (line 23) | pub fn with_parent(get: G, set: S, p_get: G, p_set: S) -> Self {
method add_methods (line 33) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/elements/align.rs
type Align (line 6) | pub struct Align(pub(super) ratatui::layout::Alignment);
method compose (line 15) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
type Target (line 9) | type Target = ratatui::layout::Alignment;
method deref (line 11) | fn deref(&self) -> &Self::Target { &self.0 }
method from_lua (line 21) | fn from_lua(value: Value, _: &Lua) -> mlua::Result<Self> {
FILE: yazi-binding/src/elements/area.rs
constant EXPECTED (line 7) | const EXPECTED: &str = "expected a Pos or Rect";
type Area (line 10) | pub enum Area {
method size (line 20) | pub fn size(self) -> ratatui::layout::Size {
method inner (line 29) | pub fn inner(self, padding: ratatui::widgets::Padding) -> Self {
method transform (line 39) | pub fn transform(
method from (line 51) | fn from(rect: Rect) -> Self { Self::Rect(rect) }
method from (line 55) | fn from(rect: ratatui::layout::Rect) -> Self { Self::Rect(rect.into()) }
type Error (line 59) | type Error = mlua::Error;
method try_from (line 61) | fn try_from(value: AnyUserData) -> Result<Self, Self::Error> {
method default (line 16) | fn default() -> Self { Self::Rect(Default::default()) }
method from_lua (line 73) | fn from_lua(value: Value, _: &Lua) -> mlua::Result<Self> {
method into_lua (line 82) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
method fmt (line 91) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
FILE: yazi-binding/src/elements/bar.rs
type Bar (line 7) | pub struct Bar {
method compose (line 16) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
method render (line 27) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method render (line 36) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method add_methods (line 80) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/elements/border.rs
constant PLAIN (line 8) | const PLAIN: u8 = 0;
constant ROUNDED (line 9) | const ROUNDED: u8 = 1;
constant DOUBLE (line 10) | const DOUBLE: u8 = 2;
constant THICK (line 11) | const THICK: u8 = 3;
constant QUADRANT_INSIDE (line 12) | const QUADRANT_INSIDE: u8 = 4;
constant QUADRANT_OUTSIDE (line 13) | const QUADRANT_OUTSIDE: u8 = 5;
type Border (line 16) | pub struct Border {
method compose (line 27) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
method render (line 48) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method render (line 69) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method add_methods (line 78) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/elements/cell.rs
type Cell (line 6) | pub struct Cell {
function from (line 11) | fn from(value: Cell) -> Self { Self::new(value.text) }
method from_lua (line 15) | fn from_lua(value: Value, lua: &Lua) -> mlua::Result<Self> {
FILE: yazi-binding/src/elements/clear.rs
type Clear (line 7) | pub struct Clear {
method compose (line 12) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
method render (line 23) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method render (line 32) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method add_methods (line 41) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/elements/constraint.rs
type Constraint (line 4) | pub struct Constraint(pub(super) ratatui::layout::Constraint);
method compose (line 7) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
function from (line 24) | fn from(value: Constraint) -> Self { value.0 }
FILE: yazi-binding/src/elements/edge.rs
type Edge (line 7) | pub struct Edge(pub Borders);
method compose (line 16) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
type Target (line 10) | type Target = Borders;
method deref (line 12) | fn deref(&self) -> &Self::Target { &self.0 }
method from_lua (line 31) | fn from_lua(value: Value, _: &Lua) -> mlua::Result<Self> {
FILE: yazi-binding/src/elements/elements.rs
function compose (line 7) | pub fn compose(p_get: ComposerGet, p_set: ComposerSet) -> Composer<Compo...
function render_once (line 39) | pub fn render_once<F>(value: Value, buf: &mut ratatui::buffer::Buffer, t...
FILE: yazi-binding/src/elements/gauge.rs
type Gauge (line 8) | pub struct Gauge {
method compose (line 18) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
method render (line 29) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method render (line 47) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method add_methods (line 56) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/elements/layout.rs
constant HORIZONTAL (line 5) | const HORIZONTAL: bool = true;
constant VERTICAL (line 6) | const VERTICAL: bool = false;
type Layout (line 9) | pub struct Layout {
method compose (line 16) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
method add_methods (line 27) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/elements/line.rs
constant EXPECTED (line 11) | const EXPECTED: &str = "expected a string, Span, Line, or a table of them";
type Line (line 14) | pub struct Line {
method compose (line 31) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
type Error (line 55) | type Error = mlua::Error;
method try_from (line 57) | fn try_from(tb: Table) -> Result<Self, Self::Error> {
type Target (line 21) | type Target = ratatui::text::Line<'static>;
method deref (line 23) | fn deref(&self) -> &Self::Target { &self.inner }
method deref_mut (line 27) | fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner }
function from (line 80) | fn from(value: Line) -> Self { value.inner }
method render (line 84) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method render (line 93) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method from_lua (line 102) | fn from_lua(value: Value, _: &Lua) -> mlua::Result<Self> {
method add_methods (line 124) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
function truncate (line 232) | fn truncate(s: &str, max: usize, rtl: bool) -> String {
function test_truncate (line 246) | fn test_truncate() {
function test_truncate_rtl (line 260) | fn test_truncate_rtl() {
function test_truncate_oboe (line 274) | fn test_truncate_oboe() {
function test_truncate_exact (line 285) | fn test_truncate_exact() {
function test_truncate_overflow (line 294) | fn test_truncate_overflow() {
FILE: yazi-binding/src/elements/list.rs
type List (line 8) | pub struct List {
method compose (line 15) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
method render (line 28) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method render (line 37) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method add_methods (line 46) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/elements/pad.rs
type Pad (line 6) | pub struct Pad(ratatui::widgets::Padding);
method from (line 15) | fn from(pad: ratatui::widgets::Padding) -> Self { Self(pad) }
method compose (line 19) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
type Output (line 64) | type Output = Self;
method add (line 66) | fn add(self, rhs: ratatui::widgets::Padding) -> Self::Output {
method add_assign (line 77) | fn add_assign(&mut self, rhs: ratatui::widgets::Padding) { *self = *se...
type Target (line 9) | type Target = ratatui::widgets::Padding;
method deref (line 11) | fn deref(&self) -> &Self::Target { &self.0 }
method add_fields (line 55) | fn add_fields<F: mlua::UserDataFields<Self>>(fields: &mut F) {
FILE: yazi-binding/src/elements/pos.rs
constant EXPECTED (line 7) | const EXPECTED: &str = "expected a Pos";
type Pos (line 10) | pub struct Pos {
method from (line 23) | fn from(value: yazi_config::popup::Position) -> Self {
type Error (line 33) | type Error = mlua::Error;
method try_from (line 35) | fn try_from(t: Table) -> Result<Self, Self::Error> {
method compose (line 67) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
method with_height (line 76) | pub fn with_height(mut self, height: u16) -> Self {
type Target (line 17) | type Target = yazi_config::popup::Position;
method deref (line 19) | fn deref(&self) -> &Self::Target { &self.inner }
function from (line 29) | fn from(value: Pos) -> Self { value.inner }
method from_lua (line 51) | fn from_lua(value: Value, _: &Lua) -> mlua::Result<Self> {
method add_fields (line 83) | fn add_fields<F: mlua::UserDataFields<Self>>(fields: &mut F) {
method add_methods (line 92) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/elements/rect.rs
type Rect (line 8) | pub struct Rect(pub ratatui::layout::Rect);
method from (line 17) | fn from(rect: ratatui::layout::Rect) -> Self { Self(rect) }
method from (line 21) | fn from(size: ratatui::layout::Size) -> Self {
method compose (line 27) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
method pad (line 42) | pub(super) fn pad(self, pad: Pad) -> Self {
type Target (line 11) | type Target = ratatui::layout::Rect;
method deref (line 13) | fn deref(&self) -> &Self::Target { &self.0 }
method add_fields (line 54) | fn add_fields<F: mlua::UserDataFields<Self>>(fields: &mut F) {
method add_methods (line 71) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/elements/renderable.rs
type Renderable (line 10) | pub enum Renderable {
method area (line 22) | pub fn area(&self) -> Area {
method with_area (line 35) | pub fn with_area(mut self, area: impl Into<Area>) -> Self {
method render_with (line 50) | pub fn render_with<T>(self, buf: &mut ratatui::buffer::Buffer, trans: T)
type Error (line 60) | type Error = mlua::Error;
method try_from (line 62) | fn try_from(ud: &AnyUserData) -> Result<Self, Self::Error> {
method from (line 78) | fn from(error: Error) -> Self {
method render (line 88) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method render (line 106) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method from_lua (line 124) | fn from_lua(value: Value, _: &Lua) -> mlua::Result<Self> {
FILE: yazi-binding/src/elements/row.rs
constant EXPECTED (line 5) | const EXPECTED: &str = "expected a Row";
type Row (line 8) | pub struct Row {
method compose (line 17) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
function from (line 30) | fn from(value: Row) -> Self {
method from_lua (line 40) | fn from_lua(value: Value, _: &Lua) -> mlua::Result<Self> {
method add_methods (line 55) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/elements/span.rs
constant EXPECTED (line 6) | const EXPECTED: &str = "expected a string or Span";
type Span (line 8) | pub struct Span(pub(super) ratatui::text::Span<'static>);
method compose (line 21) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
method truncate (line 30) | pub(super) fn truncate(&mut self, max: usize) -> usize {
type Target (line 11) | type Target = ratatui::text::Span<'static>;
method deref (line 13) | fn deref(&self) -> &Self::Target { &self.0 }
method deref_mut (line 17) | fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 }
method from_lua (line 62) | fn from_lua(value: Value, _: &Lua) -> mlua::Result<Self> {
method add_methods (line 78) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/elements/table.rs
type Table (line 9) | pub struct Table {
method compose (line 33) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
method selected_cell (line 44) | pub fn selected_cell(&self) -> Option<&ratatui::text::Text<'_>> {
method len (line 50) | pub fn len(&self) -> usize { self.rows.len() }
method select (line 52) | pub fn select(&mut self, idx: Option<usize>) {
method selected (line 58) | pub fn selected(&self) -> Option<usize> {
type Error (line 64) | type Error = mlua::Error;
method try_from (line 66) | fn try_from(value: AnyUserData) -> Result<Self, Self::Error> { value.t...
method render (line 70) | fn render(mut self, rect: ratatui::layout::Rect, buf: &mut ratatui::buff...
method render (line 99) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method add_methods (line 108) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/elements/text.rs
constant EXPECTED (line 10) | const EXPECTED: &str = "expected a string, Line, Span, or a table of them";
type Text (line 13) | pub struct Text {
method compose (line 23) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
type Error (line 37) | type Error = mlua::Error;
method try_from (line 39) | fn try_from(tb: Table) -> Result<Self, Self::Error> {
function from (line 58) | fn from(value: Text) -> Self { value.inner }
function from (line 62) | fn from(mut value: Text) -> Self {
method render (line 78) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method render (line 91) | fn render(self, rect: ratatui::layout::Rect, buf: &mut ratatui::buffer::...
method from_lua (line 104) | fn from_lua(value: Value, _: &Lua) -> mlua::Result<Self> {
method add_methods (line 122) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/elements/wrap.rs
type Wrap (line 7) | pub struct Wrap(pub(super) Option<ratatui::widgets::Wrap>);
method compose (line 16) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
method from (line 26) | fn from(value: ratatui::widgets::Wrap) -> Self { Self(Some(value)) }
method from (line 30) | fn from(value: PreviewWrap) -> Self {
type Target (line 10) | type Target = Option<ratatui::widgets::Wrap>;
method deref (line 12) | fn deref(&self) -> &Self::Target { &self.0 }
function from (line 22) | fn from(value: Wrap) -> Self { value.0 }
method from_lua (line 39) | fn from_lua(value: Value, _: &Lua) -> mlua::Result<Self> {
method into_lua (line 61) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
FILE: yazi-binding/src/error.rs
type Error (line 8) | pub enum Error {
method install (line 16) | pub fn install(lua: &Lua) -> mlua::Result<()> {
method custom (line 33) | pub fn custom(msg: impl Into<SStr>) -> Self { Self::Custom(msg.into()) }
method into_string (line 35) | pub fn into_string(self) -> SStr {
method fmt (line 46) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method add_fields (line 57) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
method add_methods (line 74) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/fd.rs
type Fd (line 6) | pub struct Fd(pub yazi_vfs::provider::RwFile);
method add_methods (line 9) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/file.rs
type FileRef (line 7) | pub type FileRef = UserDataRef<File>;
constant EXPECTED (line 9) | const EXPECTED: &str = "expected a table, File, or fs::File";
type File (line 12) | pub struct File {
method new (line 35) | pub fn new(inner: impl Into<yazi_fs::File>) -> Self {
method install (line 48) | pub fn install(lua: &Lua) -> mlua::Result<()> {
type Error (line 54) | type Error = mlua::Error;
method try_from (line 56) | fn try_from(value: Table) -> Result<Self, Self::Error> {
type Error (line 66) | type Error = mlua::Error;
method try_from (line 68) | fn try_from(value: AnyUserData) -> Result<Self, Self::Error> {
type Target (line 25) | type Target = yazi_fs::File;
method deref (line 27) | fn deref(&self) -> &Self::Target { &self.inner }
function from (line 31) | fn from(value: File) -> Self { value.inner }
method from_lua (line 74) | fn from_lua(value: Value, _: &Lua) -> mlua::Result<Self> {
method add_fields (line 84) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
method add_methods (line 88) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/handle.rs
type Handle (line 4) | pub enum Handle {
method add_methods (line 9) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/icon.rs
type Icon (line 7) | pub struct Icon {
method from (line 21) | fn from(icon: &'static yazi_config::Icon) -> Self {
type Target (line 15) | type Target = yazi_config::Icon;
method deref (line 17) | fn deref(&self) -> &Self::Target { self.inner }
method add_fields (line 27) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
FILE: yazi-binding/src/id.rs
type Id (line 6) | pub struct Id(pub yazi_shared::Id);
type Target (line 9) | type Target = yazi_shared::Id;
method deref (line 11) | fn deref(&self) -> &Self::Target { &self.0 }
method from_lua (line 15) | fn from_lua(value: Value, _: &Lua) -> mlua::Result<Self> {
method add_fields (line 25) | fn add_fields<F: mlua::UserDataFields<Self>>(fields: &mut F) {
FILE: yazi-binding/src/image.rs
type ImageInfo (line 5) | pub struct ImageInfo(yazi_adapter::ImageInfo);
method from (line 14) | fn from(value: yazi_adapter::ImageInfo) -> Self { Self(value) }
type Target (line 8) | type Target = yazi_adapter::ImageInfo;
method deref (line 10) | fn deref(&self) -> &Self::Target { &self.0 }
method add_fields (line 18) | fn add_fields<F: mlua::UserDataFields<Self>>(fields: &mut F) {
type ImageFormat (line 28) | struct ImageFormat(yazi_adapter::ImageFormat);
method add_methods (line 31) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
type ImageColor (line 58) | struct ImageColor(yazi_adapter::ImageColor);
method add_methods (line 61) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/input.rs
type InputRx (line 8) | pub struct InputRx<T: StreamExt<Item = InputEvent>> {
function new (line 13) | pub fn new(inner: T) -> Self { Self { inner } }
function consume (line 15) | pub async fn consume(inner: T) -> (Option<String>, u8) {
function parse (line 20) | fn parse(res: InputEvent) -> (Option<String>, u8) {
method add_methods (line 31) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/iter.rs
type Iter (line 3) | pub struct Iter<I: Iterator<Item = T>, T> {
function new (line 16) | pub fn new(iter: I, len: Option<usize>) -> Self { Self { iter, len, coun...
function into_iter (line 24) | pub fn into_iter(self, lua: &Lua) -> impl Iterator<Item = mlua::Result<T...
method add_methods (line 38) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/layer.rs
type Layer (line 4) | pub struct Layer(yazi_shared::Layer);
method from (line 7) | fn from(event: yazi_shared::Layer) -> Self { Self(event) }
method add_methods (line 11) | fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/mouse.rs
type MouseEvent (line 7) | pub struct MouseEvent(crossterm::event::MouseEvent);
method from (line 16) | fn from(event: crossterm::event::MouseEvent) -> Self { Self(event) }
type Target (line 10) | type Target = crossterm::event::MouseEvent;
method deref (line 12) | fn deref(&self) -> &Self::Target { &self.0 }
method add_fields (line 20) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
FILE: yazi-binding/src/path.rs
type PathRef (line 9) | pub type PathRef = UserDataRef<Path>;
type Path (line 12) | pub struct Path {
method new (line 40) | pub fn new(path: impl Into<PathBufDyn>) -> Self {
method install (line 51) | pub fn install(lua: &Lua) -> mlua::Result<()> {
method ends_with (line 63) | fn ends_with(&self, child: Value) -> mlua::Result<bool> {
method join (line 73) | fn join(&self, other: Value) -> mlua::Result<Self> {
method starts_with (line 86) | fn starts_with(&self, base: Value) -> mlua::Result<bool> {
method strip_prefix (line 96) | fn strip_prefix(&self, base: Value) -> mlua::Result<Option<Self>> {
type Target (line 22) | type Target = PathBufDyn;
method deref (line 24) | fn deref(&self) -> &Self::Target { &self.inner }
method from (line 28) | fn from(value: Path) -> Self { value.inner }
method as_strand (line 32) | fn as_strand(&self) -> Strand<'_> { self.inner.as_strand() }
method as_strand (line 36) | fn as_strand(&self) -> Strand<'_> { self.inner.as_strand() }
method add_fields (line 112) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
method add_methods (line 128) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/permit.rs
type PermitRef (line 7) | pub type PermitRef = mlua::UserDataRef<Permit>;
type Permit (line 9) | pub struct Permit {
method new (line 21) | pub fn new<F>(inner: SemaphorePermit<'static>, f: F) -> Self
method dropping (line 28) | fn dropping(&mut self) -> impl Future<Output = ()> + 'static {
type Target (line 15) | type Target = Option<SemaphorePermit<'static>>;
method deref (line 17) | fn deref(&self) -> &Self::Target { &self.inner }
method drop (line 44) | fn drop(&mut self) { tokio::spawn(self.dropping()); }
method add_methods (line 48) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/range.rs
type Range (line 3) | pub struct Range<T>(std::ops::Range<T>);
function from (line 6) | fn from(value: std::ops::Range<T>) -> Self { Self(value) }
method into_lua (line 13) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
FILE: yazi-binding/src/runtime.rs
type Runtime (line 8) | pub struct Runtime {
method new_isolate (line 20) | pub fn new_isolate(id: &str) -> Self {
method push (line 24) | pub fn push(&mut self, id: &str) { self.frames.push_back(RuntimeFrame ...
method pop (line 26) | pub fn pop(&mut self) -> Result<RuntimeFrame> {
method critical_push (line 30) | pub fn critical_push(&mut self, id: &str, blocking: bool) -> bool {
method critical_pop (line 35) | pub fn critical_pop(&mut self, blocking: bool) -> Result<RuntimeFrame> {
method current (line 40) | pub fn current(&self) -> Result<&str> {
method current_owned (line 44) | pub fn current_owned(&self) -> Result<String> { self.current().map(ToO...
method get_block (line 46) | pub fn get_block(&self, id: &str, calls: usize) -> Option<Function> {
method put_block (line 50) | pub fn put_block(&mut self, f: &Function) -> Option<usize> {
type RuntimeFrame (line 15) | pub struct RuntimeFrame {
FILE: yazi-binding/src/scheme.rs
type Scheme (line 9) | pub struct Scheme {
method new (line 23) | pub fn new(scheme: impl Into<yazi_shared::scheme::Scheme>) -> Self {
type Target (line 17) | type Target = yazi_shared::scheme::Scheme;
method deref (line 19) | fn deref(&self) -> &Self::Target { &self.inner }
method add_fields (line 29) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
FILE: yazi-binding/src/stage.rs
type FolderStage (line 3) | pub struct FolderStage(yazi_fs::FolderStage);
method new (line 6) | pub fn new(inner: yazi_fs::FolderStage) -> Self { Self(inner) }
method add_methods (line 10) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/style.rs
type Style (line 6) | pub struct Style(pub ratatui::style::Style);
method compose (line 9) | pub fn compose(lua: &Lua) -> mlua::Result<Value> {
method from (line 20) | fn from(value: yazi_config::Style) -> Self { Self(value.into()) }
method from_lua (line 24) | fn from_lua(value: Value, _: &Lua) -> mlua::Result<Self> {
method add_methods (line 34) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/url.rs
type UrlRef (line 10) | pub type UrlRef = UserDataRef<Url>;
constant EXPECTED (line 12) | const EXPECTED: &str = "expected a string, Url, or Path";
type Url (line 15) | pub struct Url {
type Error (line 59) | type Error = mlua::Error;
method try_from (line 61) | fn try_from(value: &[u8]) -> mlua::Result<Self> { Ok(Self::new(UrlCow:...
method new (line 65) | pub fn new(url: impl Into<yazi_shared::url::UrlBuf>) -> Self {
method install (line 84) | pub fn install(lua: &Lua) -> mlua::Result<()> {
method ends_with (line 105) | fn ends_with(&self, child: Value) -> mlua::Result<bool> {
method hash (line 113) | fn hash(&self, long: Option<bool>) -> mlua::Result<String> {
method join (line 121) | fn join(&self, lua: &Lua, other: Value) -> mlua::Result<Value> {
method starts_with (line 144) | fn starts_with(&self, base: Value) -> mlua::Result<bool> {
method strip_prefix (line 152) | fn strip_prefix(&self, base: Value) -> mlua::Result<Option<Path>> {
type Target (line 33) | type Target = yazi_shared::url::UrlBuf;
method deref (line 35) | fn deref(&self) -> &Self::Target { &self.inner }
method as_url (line 39) | fn as_url(&self) -> yazi_shared::url::Url<'_> { self.inner.as_url() }
method as_url (line 43) | fn as_url(&self) -> yazi_shared::url::Url<'_> { self.inner.as_url() }
function from (line 47) | fn from(value: Url) -> Self { value.inner }
function from (line 51) | fn from(value: Url) -> Self { Self(value.inner) }
function from (line 55) | fn from(value: Url) -> Self { value.inner.into() }
method add_fields (line 168) | fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
method add_methods (line 199) | fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
FILE: yazi-binding/src/utils.rs
constant SER_OPT (line 3) | pub const SER_OPT: SerializeOptions =
function get_metatable (line 6) | pub fn get_metatable(lua: &Lua, value: impl IntoLua) -> mlua::Result<Tab...
FILE: yazi-boot/build.rs
function main (line 10) | fn main() -> Result<(), Box<dyn Error>> {
FILE: yazi-boot/src/actions/actions.rs
type Actions (line 3) | pub struct Actions;
method act (line 6) | pub(crate) fn act(args: &crate::Args) {
FILE: yazi-boot/src/actions/clear_cache.rs
method clear_cache (line 7) | pub(super) fn clear_cache() {
FILE: yazi-boot/src/actions/debug.rs
method debug (line 12) | pub(super) fn debug() -> Result<String, std::fmt::Error> {
method config_state (line 130) | fn config_state(name: &str) -> String {
method process_output (line 140) | fn process_output(name: impl AsRef<OsStr>, arg: impl AsRef<OsStr>) -> St...
method file1_output (line 165) | fn file1_output() -> String {
FILE: yazi-boot/src/actions/rustc.rs
method rustc (line 4) | pub(super) fn rustc() -> String {
FILE: yazi-boot/src/actions/triple.rs
method triple (line 4) | pub(super) fn triple() -> String {
FILE: yazi-boot/src/actions/version.rs
method version (line 4) | pub fn version() -> &'static str {
FILE: yazi-boot/src/args.rs
type Args (line 9) | pub struct Args {
FILE: yazi-boot/src/boot.rs
type Boot (line 10) | pub struct Boot {
method parse_entries (line 24) | async fn parse_entries(entries: &[UrlBuf]) -> (Vec<UrlBuf>, Vec<Strand...
method from (line 54) | fn from(args: &crate::Args) -> Self {
FILE: yazi-boot/src/lib.rs
function init (line 11) | pub fn init() {
function init_default (line 18) | pub fn init_default() {
FILE: yazi-build/build.rs
function main (line 5) | fn main() -> Result<(), Box<dyn Error>> {
function flash (line 55) | fn flash<R: Read + Send + 'static>(src: R) -> thread::JoinHandle<()> {
FILE: yazi-build/src/main.rs
function main (line 1) | fn main() {
FILE: yazi-cli/build.rs
function main (line 10) | fn main() -> Result<(), Box<dyn Error>> {
function generate (line 24) | fn generate() -> Result<(), Box<dyn Error>> {
FILE: yazi-cli/src/args.rs
type Args (line 9) | pub(super) struct Args {
type Command (line 19) | pub(super) enum Command {
type CommandEmit (line 38) | pub(super) struct CommandEmit {
type CommandEmitTo (line 47) | pub(super) struct CommandEmitTo {
type CommandExec (line 58) | pub(super) struct CommandExec {
type CommandPkg (line 67) | pub(super) enum CommandPkg {
type CommandPub (line 95) | pub(super) struct CommandPub {
method receiver (line 112) | pub(super) fn receiver() -> Result<Id> {
type CommandPubTo (line 122) | pub(super) struct CommandPubTo {
type CommandSub (line 141) | pub(super) struct CommandSub {
FILE: yazi-cli/src/dds/draw.rs
method draw (line 14) | pub(crate) async fn draw(kinds: HashSet<&str>) -> Result<()> {
FILE: yazi-cli/src/dds/exec.rs
method exec (line 13) | pub(crate) async fn exec(cmd: CommandExec) -> anyhow::Result<Data> {
method ask (line 38) | async fn ask(kind: &str, receiver: Id, body: &str, reply_kind: &str) -> ...
FILE: yazi-cli/src/dds/mod.rs
type Dds (line 3) | pub(crate) struct Dds;
FILE: yazi-cli/src/dds/shot.rs
method shot (line 14) | pub(crate) async fn shot(kind: &str, receiver: Id, body: &str) -> Result...
method ensure_version (line 46) | pub(super) fn ensure_version(version: Option<&str>) -> Result<()> {
method ensure_ability (line 57) | pub(super) fn ensure_ability(peers: &HashMap<Id, Peer>, kind: &str, rece...
FILE: yazi-cli/src/main.rs
function main (line 12) | async fn main() -> ExitCode {
function run (line 32) | async fn run() -> anyhow::Result<()> {
FILE: yazi-cli/src/package/add.rs
method add (line 7) | pub(super) async fn add(&mut self) -> Result<()> {
FILE: yazi-cli/src/package/delete.rs
method delete (line 9) | pub(super) async fn delete(&self) -> Result<()> {
method delete_assets (line 24) | pub(super) async fn delete_assets(&self) -> Result<()> {
method delete_sources (line 42) | pub(super) async fn delete_sources(&self) -> Result<()> {
FILE: yazi-cli/src/package/dependency.rs
type Dependency (line 11) | pub(crate) struct Dependency {
method local (line 25) | pub(super) fn local(&self) -> PathBuf {
method remote (line 31) | pub(super) fn remote(&self) -> String {
method target (line 36) | pub(super) fn target(&self) -> PathBuf {
method identical (line 44) | pub(super) fn identical(&self, other: &Self) -> bool {
method header (line 48) | pub(super) fn header(&self, s: &str) -> Result<()> {
method plugin_files (line 69) | pub(super) async fn plugin_files(dir: &Path) -> io::Result<Vec<String>> {
method flavor_files (line 86) | pub(super) fn flavor_files() -> Vec<String> {
method deserialize (line 123) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
type Err (line 95) | type Err = anyhow::Error;
method from_str (line 97) | fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
method serialize (line 146) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
FILE: yazi-cli/src/package/deploy.rs
method deploy (line 11) | pub(super) async fn deploy(&mut self) -> Result<()> {
method deploy_assets (line 42) | async fn deploy_assets(from: PathBuf, to: PathBuf) -> Result<()> {
method deploy_sources (line 59) | async fn deploy_sources(from: &Path, to: &Path, is_flavor: bool) -> Resu...
FILE: yazi-cli/src/package/git.rs
type Git (line 7) | pub(super) struct Git;
method clone (line 10) | pub(super) async fn clone(url: &str, path: &Path) -> Result<()> {
method fetch (line 14) | pub(super) async fn fetch(path: &Path) -> Result<()> {
method checkout (line 18) | pub(super) async fn checkout(path: &Path, rev: &str) -> Result<()> {
method pull (line 22) | pub(super) async fn pull(path: &Path) -> Result<()> {
method revision (line 28) | pub(super) async fn revision(path: &Path) -> Result<String> {
method exec (line 45) | async fn exec(f: impl FnOnce(&mut Command) -> &mut Command) -> Result<...
FILE: yazi-cli/src/package/hash.rs
method hash (line 9) | pub(crate) async fn hash(&self) -> Result<String> {
method hash_check (line 45) | pub(super) async fn hash_check(&self) -> Result<()> {
FILE: yazi-cli/src/package/install.rs
method install (line 7) | pub(super) async fn install(&mut self) -> Result<()> {
FILE: yazi-cli/src/package/mod.rs
function init (line 6) | pub(super) fn init() -> anyhow::Result<()> {
FILE: yazi-cli/src/package/package.rs
type Package (line 11) | pub(crate) struct Package {
method load (line 17) | pub(crate) async fn load() -> Result<Self> {
method add_many (line 22) | pub(crate) async fn add_many(&mut self, uses: &[String]) -> Result<()> {
method delete_many (line 31) | pub(crate) async fn delete_many(&mut self, uses: &[String]) -> Result<...
method install (line 40) | pub(crate) async fn install(&mut self) -> Result<()> {
method upgrade_many (line 58) | pub(crate) async fn upgrade_many(&mut self, uses: &[String]) -> Result...
method print (line 78) | pub(crate) fn print(&self) -> Result<()> {
method add (line 100) | async fn add(&mut self, r#use: &str) -> Result<()> {
method delete (line 119) | async fn delete(&mut self, r#use: &str) -> Result<()> {
method save (line 133) | async fn save(&self) -> Result<()> {
method toml (line 138) | fn toml() -> PathBuf { Xdg::config_dir().join("package.toml") }
method identical (line 140) | fn identical(&self, other: &Dependency) -> Option<&Dependency> {
method deserialize (line 146) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
method serialize (line 170) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
FILE: yazi-cli/src/package/upgrade.rs
method upgrade (line 6) | pub(super) async fn upgrade(&mut self) -> Result<()> {
FILE: yazi-cli/src/shared/shared.rs
function must_exists (line 8) | pub async fn must_exists(path: impl AsRef<Path>) -> bool {
function maybe_exists (line 13) | pub async fn maybe_exists(path: impl AsRef<Path>) -> bool {
function copy_and_seal (line 20) | pub async fn copy_and_seal(from: &Path, to: &Path) -> io::Result<()> {
function remove_sealed (line 34) | pub async fn remove_sealed(p: &Path) -> io::Result<()> {
FILE: yazi-codegen/src/lib.rs
function deserialize_over (line 6) | pub fn deserialize_over(input: TokenStream) -> TokenStream {
function deserialize_over1 (line 20) | pub fn deserialize_over1(input: TokenStream) -> TokenStream {
function deserialize_over2 (line 70) | pub fn deserialize_over2(input: TokenStream) -> TokenStream {
function from_lua (line 112) | pub fn from_lua(input: TokenStream) -> TokenStream {
FILE: yazi-config/src/icon.rs
type Icon (line 4) | pub struct Icon {
FILE: yazi-config/src/keymap/chord.rs
type Chord (line 13) | pub struct Chord {
method on (line 33) | pub fn on(&self) -> String { self.on.iter().map(ToString::to_string).c...
method run (line 35) | pub fn run(&self) -> String {
method desc (line 41) | pub fn desc(&self) -> Option<Cow<'_, str>> {
method desc_or_run (line 45) | pub fn desc_or_run(&self) -> Cow<'_, str> { self.desc().unwrap_or_else...
method contains (line 47) | pub fn contains(&self, s: &str) -> bool {
method noop (line 55) | pub(super) fn noop(&self) -> bool {
method reshape (line 61) | pub(super) fn reshape(mut self, layer: Layer) -> Result<Self> {
method eq (line 23) | fn eq(&self, other: &Self) -> bool { self.on == other.on }
method hash (line 29) | fn hash<H: Hasher>(&self, state: &mut H) { self.on.hash(state) }
FILE: yazi-config/src/keymap/cow.rs
type ChordCow (line 8) | pub enum ChordCow {
method from (line 14) | fn from(c: Chord) -> Self { Self::Owned(c) }
method from (line 18) | fn from(c: &'static Chord) -> Self { Self::Borrowed(c) }
method into_seq (line 40) | pub fn into_seq(self) -> Vec<ActionCow> {
type Target (line 22) | type Target = Chord;
method deref (line 24) | fn deref(&self) -> &Self::Target {
method default (line 33) | fn default() -> Self {
FILE: yazi-config/src/keymap/deserializers.rs
function deserialize_on (line 9) | pub(super) fn deserialize_on<'de, D>(deserializer: D) -> Result<Vec<Key>...
function deserialize_run (line 47) | pub(super) fn deserialize_run<'de, D>(deserializer: D) -> Result<Vec<Act...
FILE: yazi-config/src/keymap/key.rs
type Key (line 7) | pub struct Key {
method plain (line 17) | pub fn plain(&self) -> Option<char> {
method from (line 32) | fn from(value: KeyEvent) -> Self {
method default (line 26) | fn default() -> Self {
type Err (line 61) | type Err = anyhow::Error;
method from_str (line 63) | fn from_str(s: &str) -> Result<Self, Self::Err> {
method fmt (line 138) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
FILE: yazi-config/src/keymap/keymap.rs
type Keymap (line 10) | pub struct Keymap {
method get (line 22) | pub fn get(&self, layer: Layer) -> &[Chord] {
method read (line 40) | pub(crate) fn read() -> Result<String> {
method reshape (line 46) | pub(crate) fn reshape(self) -> Result<Self> {
FILE: yazi-config/src/keymap/rules.rs
type KeymapRules (line 13) | pub struct KeymapRules {
method reshape (line 28) | pub(crate) fn reshape(self, layer: Layer) -> Result<Self> {
type Target (line 22) | type Target = Vec<Chord>;
method deref (line 24) | fn deref(&self) -> &Self::Target { &self.keymap }
FILE: yazi-config/src/layout.rs
type Layout (line 4) | pub struct Layout {
method default (line 11) | pub const fn default() -> Self {
method folder_limit (line 15) | pub const fn folder_limit(self) -> usize { self.current.height as _ }
FILE: yazi-config/src/lib.rs
function init (line 15) | pub fn init() -> anyhow::Result<()> {
function try_init (line 23) | fn try_init(merge: bool) -> anyhow::Result<()> {
function init_flavor (line 37) | pub fn init_flavor(light: bool) -> anyhow::Result<()> {
function try_init_flavor (line 45) | fn try_init_flavor(light: bool, merge: bool) -> anyhow::Result<()> {
function wait_for_key (line 62) | fn wait_for_key(e: anyhow::Error) -> anyhow::Result<()> {
function error_with_input (line 84) | pub(crate) fn error_with_input<T>(
FILE: yazi-config/src/mgr/mgr.rs
type Mgr (line 10) | pub struct Mgr {
method reshape (line 30) | pub(crate) fn reshape(self) -> Result<Self> {
FILE: yazi-config/src/mgr/mouse.rs
method draggable (line 19) | pub const fn draggable(self) -> bool { self.contains(Self::DRAG) }
type Error (line 23) | type Error = anyhow::Error;
method try_from (line 25) | fn try_from(value: Vec<String>) -> Result<Self, Self::Error> {
function from (line 40) | fn from(value: MouseEvents) -> Self {
method from (line 53) | fn from(value: crossterm::event::MouseEventKind) -> Self {
FILE: yazi-config/src/mgr/ratio.rs
type MgrRatio (line 6) | pub struct MgrRatio {
type Error (line 14) | type Error = anyhow::Error;
method try_from (line 16) | fn try_from(ratio: [u16; 3]) -> Result<Self, Self::Error> {
FILE: yazi-config/src/open/open.rs
type Open (line 12) | pub struct Open {
method all (line 27) | pub fn all<'a, 'b, U, M>(&'a self, url: U, mime: M) -> impl Iterator<I...
method common (line 46) | pub fn common<'a, 'b, U, M>(&'a self, targets: &'b [(U, M)]) -> IndexS...
method reshape (line 64) | pub(crate) fn reshape(self) -> Result<Self> {
type Target (line 21) | type Target = Vec<OpenRule>;
method deref (line 23) | fn deref(&self) -> &Self::Target { &self.rules }
FILE: yazi-config/src/open/rule.rs
type OpenRule (line 8) | pub struct OpenRule {
method any_file (line 17) | pub fn any_file(&self) -> bool { self.url.as_ref().is_some_and(|p| p.a...
method any_dir (line 20) | pub fn any_dir(&self) -> bool { self.url.as_ref().is_some_and(|p| p.an...
method deserialize (line 24) | fn deserialize<'de, D>(deserializer: D) -> Result<Vec<String>, D::Error>
FILE: yazi-config/src/opener/opener.rs
type Opener (line 14) | pub struct Opener(HashMap<String, Vec<OpenerRule>>);
method all (line 23) | pub fn all<'a, I>(&self, uses: I) -> impl Iterator<Item = &OpenerRule>
method first (line 30) | pub fn first<'a, I>(&self, uses: I) -> Option<&OpenerRule>
method block (line 37) | pub fn block<'a, I>(&self, uses: I) -> Option<&OpenerRule>
method reshape (line 46) | pub(crate) fn reshape(mut self) -> Result<Self> {
method deserialize_over_with (line 61) | pub(crate) fn deserialize_over_with<'de>(
type Target (line 17) | type Target = HashMap<String, Vec<OpenerRule>>;
method deref (line 19) | fn deref(&self) -> &Self::Target { &self.0 }
FILE: yazi-config/src/opener/rule.rs
type OpenerRule (line 6) | pub struct OpenerRule {
method desc (line 20) | pub fn desc(&self) -> String {
method reshape (line 32) | pub(super) fn reshape(mut self) -> Result<Self> {
FILE: yazi-config/src/pattern.rs
type Pattern (line 10) | pub struct Pattern {
method match_url (line 31) | pub fn match_url(&self, url: impl AsUrl, is_dir: bool) -> bool {
method match_mime (line 58) | pub fn match_mime(&self, mime: impl AsRef<str>) -> bool {
method any_file (line 63) | pub fn any_file(&self) -> bool { self.is_star && !self.is_dir }
method any_dir (line 66) | pub fn any_dir(&self) -> bool { self.is_star && self.is_dir }
type Error (line 106) | type Error = anyhow::Error;
method try_from (line 108) | fn try_from(s: String) -> Result<Self, Self::Error> { Self::from_str(s...
method fmt (line 20) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type Err (line 70) | type Err = anyhow::Error;
method from_str (line 72) | fn from_str(s: &str) -> Result<Self, Self::Err> {
type PatternScheme (line 113) | enum PatternScheme {
method parse (line 126) | fn parse(s: &str) -> Result<(Self, usize)> {
method matches (line 150) | fn matches(self, kind: SchemeKind) -> bool {
function matches (line 176) | fn matches(glob: &str, url: &str) -> bool {
function test_unix (line 182) | fn test_unix() {
function test_windows (line 216) | fn test_windows() {
FILE: yazi-config/src/platform.rs
function check_for (line 2) | pub(crate) fn check_for(r#for: Option<&str>) -> bool {
FILE: yazi-config/src/plugin/fetcher.rs
type Fetcher (line 8) | pub struct Fetcher {
method matches (line 22) | pub fn matches(&self, file: &File, mime: &str) -> bool {
FILE: yazi-config/src/plugin/mod.rs
constant MAX_FETCHERS (line 3) | pub const MAX_FETCHERS: u8 = 16;
constant MAX_PRELOADERS (line 4) | pub const MAX_PRELOADERS: u8 = 16;
FILE: yazi-config/src/plugin/plugin.rs
type Plugin (line 12) | pub struct Plugin {
method fetchers (line 39) | pub fn fetchers<'a, 'b: 'a>(
method mime_fetchers (line 54) | pub fn mime_fetchers(&self, files: Vec<File>) -> impl Iterator<Item = ...
method spotter (line 70) | pub fn spotter(&self, file: &File, mime: &str) -> Option<&Spotter> {
method preloaders (line 74) | pub fn preloaders<'a, 'b: 'a>(
method previewer (line 89) | pub fn previewer(&self, file: &File, mime: &str) -> Option<&Previewer> {
method reshape (line 96) | pub(crate) fn reshape(mut self) -> Result<Self> {
FILE: yazi-config/src/plugin/preloader.rs
type Preloader (line 8) | pub struct Preloader {
method matches (line 23) | pub fn matches(&self, file: &File, mime: &str) -> bool {
FILE: yazi-config/src/plugin/previewer.rs
type Previewer (line 8) | pub struct Previewer {
method matches (line 16) | pub fn matches(&self, file: &File, mime: &str) -> bool {
method any_file (line 22) | pub fn any_file(&self) -> bool { self.url.as_ref().is_some_and(|p| p.a...
method any_dir (line 25) | pub fn any_dir(&self) -> bool { self.url.as_ref().is_some_and(|p| p.an...
FILE: yazi-config/src/plugin/spotter.rs
type Spotter (line 8) | pub struct Spotter {
method matches (line 16) | pub fn matches(&self, file: &File, mime: &str) -> bool {
method any_file (line 22) | pub fn any_file(&self) -> bool { self.url.as_ref().is_some_and(|p| p.a...
method any_dir (line 25) | pub fn any_dir(&self) -> bool { self.url.as_ref().is_some_and(|p| p.an...
FILE: yazi-config/src/popup/confirm.rs
type Confirm (line 8) | pub struct Confirm {
method border (line 33) | pub const fn border(&self) -> u16 { 2 }
method trash_position (line 35) | pub const fn trash_position(&self) -> Position {
method delete_position (line 39) | pub const fn delete_position(&self) -> Position {
method overwrite_position (line 43) | pub const fn overwrite_position(&self) -> Position {
method quit_position (line 47) | pub const fn quit_position(&self) -> Position {
FILE: yazi-config/src/popup/input.rs
type Input (line 7) | pub struct Input {
method border (line 47) | pub const fn border(&self) -> u16 { 2 }
FILE: yazi-config/src/popup/offset.rs
type Offset (line 6) | pub struct Offset {
type Error (line 14) | type Error = anyhow::Error;
method try_from (line 16) | fn try_from(values: [i16; 4]) -> Result<Self, Self::Error> {
method line (line 38) | pub fn line() -> Self { Self { x: 0, y: 0, width: u16::MAX, height: 1 } }
FILE: yazi-config/src/popup/options.rs
type InputCfg (line 8) | pub struct InputCfg {
method cd (line 34) | pub fn cd(cwd: Url) -> Self {
method create (line 44) | pub fn create(dir: bool) -> Self {
method rename (line 52) | pub fn rename() -> Self {
method filter (line 60) | pub fn filter() -> Self {
method find (line 69) | pub fn find(prev: bool) -> Self {
method search (line 78) | pub fn search(name: &str) -> Self {
method shell (line 86) | pub fn shell(block: bool) -> Self {
method tab_rename (line 94) | pub fn tab_rename() -> Self {
method with_value (line 108) | pub fn with_value(mut self, value: impl Into<String>) -> Self {
method with_cursor (line 114) | pub fn with_cursor(mut self, cursor: Option<usize>) -> Self {
type PickCfg (line 19) | pub struct PickCfg {
method max_height (line 193) | fn max_height(len: usize) -> u16 {
method open (line 197) | pub fn open(items: Vec<String>) -> Self {
type ConfirmCfg (line 26) | pub struct ConfirmCfg {
method new (line 121) | fn new(
method trash (line 135) | pub fn trash(urls: &[yazi_shared::url::UrlBuf]) -> Self {
method delete (line 144) | pub fn delete(urls: &[yazi_shared::url::UrlBuf]) -> Self {
method overwrite (line 153) | pub fn overwrite(url: &UrlBuf) -> Self {
method quit (line 162) | pub fn quit(len: usize, names: Vec<String>) -> Self {
method replace_number (line 171) | fn replace_number(tpl: &str, n: usize) -> String {
method truncate_list (line 175) | fn truncate_list<I>(it: I, len: usize, max: usize) -> Option<Text<'sta...
FILE: yazi-config/src/popup/origin.rs
type Origin (line 7) | pub enum Origin {
method fmt (line 22) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type Err (line 39) | type Err = serde::de::value::Error;
method from_str (line 41) | fn from_str(s: &str) -> Result<Self, Self::Err> {
FILE: yazi-config/src/popup/pick.rs
type Pick (line 7) | pub struct Pick {
method border (line 15) | pub const fn border(&self) -> u16 { 2 }
FILE: yazi-config/src/popup/position.rs
type Position (line 7) | pub struct Position {
method new (line 13) | pub const fn new(origin: Origin, offset: Offset) -> Self { Self { orig...
method rect (line 15) | pub fn rect(&self, WindowSize { columns, rows, .. }: WindowSize) -> Re...
method sticky (line 45) | pub fn sticky(WindowSize { columns, rows, .. }: WindowSize, base: Rect...
FILE: yazi-config/src/preset.rs
type Preset (line 3) | pub(crate) struct Preset;
method yazi (line 6) | pub(super) fn yazi() -> Result<Yazi, toml::de::Error> {
method keymap (line 10) | pub(super) fn keymap() -> Result<Keymap, toml::de::Error> {
method theme (line 14) | pub(super) fn theme(light: bool) -> Result<Theme, toml::de::Error> {
method vfs (line 22) | pub(super) fn vfs() -> Result<Vfs, toml::de::Error> {
method mix (line 27) | pub(crate) fn mix<E, A, B, C>(a: A, b: B, c: C) -> impl Iterator<Item ...
FILE: yazi-config/src/preview/preview.rs
type Preview (line 13) | pub struct Preview {
method tmpfile (line 30) | pub fn tmpfile(&self, prefix: &str) -> PathBuf {
method indent (line 34) | pub fn indent(&self) -> SStr {
method reshape (line 47) | pub(crate) fn reshape(mut self) -> Result<Self> {
FILE: yazi-config/src/preview/wrap.rs
type PreviewWrap (line 5) | pub enum PreviewWrap {
function from (line 11) | fn from(wrap: PreviewWrap) -> Self {
FILE: yazi-config/src/priority.rs
type Priority (line 5) | pub enum Priority {
FILE: yazi-config/src/style.rs
type Style (line 5) | pub struct Style {
method from (line 21) | fn from(value: ratatui::style::Style) -> Self {
method derive (line 88) | pub fn derive(self, other: ratatui::style::Style) -> ratatui::style::S...
function from (line 45) | fn from(value: Style) -> Self {
FILE: yazi-config/src/tasks/tasks.rs
type Tasks (line 6) | pub struct Tasks {
method reshape (line 22) | pub(crate) fn reshape(self) -> Result<Self> {
FILE: yazi-config/src/theme/filetype.rs
type Filetype (line 11) | pub struct Filetype {
type Target (line 16) | type Target = Vec<FiletypeRule>;
method deref (line 18) | fn deref(&self) -> &Self::Target { &self.rules }
type FiletypeRule (line 22) | pub struct FiletypeRule {
method matches (line 32) | pub fn matches(&self, file: &File, mime: &str) -> bool {
FILE: yazi-config/src/theme/flavor.rs
type Flavor (line 12) | pub struct Flavor {
method from_theme (line 20) | pub(crate) fn from_theme(theme: &Spanned<DeTable>, input: &str) -> Res...
method read (line 28) | pub(crate) fn read(&self, light: bool) -> Result<String> {
method syntect_path (line 38) | pub(crate) fn syntect_path(&self, light: bool) -> Option<PathBuf> {
FILE: yazi-config/src/theme/icon.rs
type Icon (line 14) | pub struct Icon {
method matches (line 47) | pub fn matches(&self, file: &File, hovered: bool) -> Option<&I> {
method match_by_glob (line 74) | fn match_by_glob(&self, file: &File) -> Option<&I> {
method match_by_name (line 78) | fn match_by_name(&self, file: &File) -> Option<&I> {
method match_by_ext (line 91) | fn match_by_ext(&self, file: &File) -> Option<&I> {
method reshape (line 98) | pub(crate) fn reshape(self) -> Result<Self> {
type PatIcons (line 121) | pub struct PatIcons(Vec<(Pattern, I)>);
method deserialize (line 130) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
type Target (line 124) | type Target = Vec<(Pattern, I)>;
method deref (line 126) | fn deref(&self) -> &Self::Target { &self.0 }
type StrIcons (line 151) | pub struct StrIcons(HashMap<String, I>);
method deserialize (line 160) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
type Target (line 154) | type Target = HashMap<String, I>;
method deref (line 156) | fn deref(&self) -> &Self::Target { &self.0 }
type CondIcons (line 181) | pub struct CondIcons(Vec<(Condition, I)>);
method deserialize (line 190) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
type Target (line 184) | type Target = Vec<(Condition, I)>;
method deref (line 186) | fn deref(&self) -> &Self::Target { &self.0 }
FILE: yazi-config/src/theme/is.rs
type Is (line 6) | pub enum Is {
method check (line 22) | pub fn check(&self, cha: &Cha) -> bool {
FILE: yazi-config/src/theme/theme.rs
type Theme (line 12) | pub struct Theme {
method read (line 227) | pub(crate) fn read() -> Result<String> {
method reshape (line 233) | pub(crate) fn reshape(mut self, light: bool) -> Result<Self> {
type App (line 38) | pub struct App {
method bg_color (line 251) | pub fn bg_color(&self) -> String { self.overall.bg.map(|c| c.to_string...
type Mgr (line 43) | pub struct Mgr {
type Tabs (line 74) | pub struct Tabs {
type TabsSep (line 83) | pub struct TabsSep {
type Mode (line 89) | pub struct Mode {
type Indicator (line 101) | pub struct Indicator {
type IndicatorPadding (line 109) | pub struct IndicatorPadding {
type Status (line 115) | pub struct Status {
type StatusSep (line 134) | pub struct StatusSep {
type Which (line 140) | pub struct Which {
type Confirm (line 152) | pub struct Confirm {
type Spot (line 164) | pub struct Spot {
type Notify (line 173) | pub struct Notify {
type Pick (line 184) | pub struct Pick {
type Input (line 191) | pub struct Input {
type Cmp (line 199) | pub struct Cmp {
type Tasks (line 210) | pub struct Tasks {
type Help (line 217) | pub struct Help {
FILE: yazi-config/src/utils.rs
function normalize_path (line 6) | pub(crate) fn normalize_path(path: PathBuf) -> Option<PathBuf> {
FILE: yazi-config/src/vfs/service.rs
type Service (line 9) | pub enum Service {
method reshape (line 24) | pub(super) fn reshape(&mut self) -> io::Result<()> {
type Error (line 14) | type Error = &'static str;
function try_from (line 16) | fn try_from(value: &'static Service) -> Result<Self, Self::Error> {
type ServiceSftp (line 33) | pub struct ServiceSftp {
method reshape (line 50) | fn reshape(&mut self) -> io::Result<()> {
FILE: yazi-config/src/vfs/services.rs
type Services (line 12) | pub struct Services(HashMap<String, Service>);
method reshape (line 21) | pub(super) fn reshape(mut self) -> Result<Self> {
method deserialize_over_with (line 35) | pub(super) fn deserialize_over_with<'de>(
type Target (line 15) | type Target = HashMap<String, Service>;
method deref (line 17) | fn deref(&self) -> &Self::Target { &self.0 }
FILE: yazi-config/src/vfs/vfs.rs
type Vfs (line 13) | pub struct Vfs {
method load (line 18) | pub async fn load() -> io::Result<&'static Self> {
method service (line 30) | pub async fn service<'a, P>(name: &str) -> io::Result<(&'a str, P)>
method read (line 43) | fn read() -> Result<String> {
method reshape (line 49) | fn reshape(self) -> Result<Self> { Ok(Self { services: self.services.r...
FILE: yazi-config/src/which/sorting.rs
type SortBy (line 5) | pub enum SortBy {
FILE: yazi-config/src/which/which.rs
type Which (line 7) | pub struct Which {
FILE: yazi-config/src/yazi.rs
type Yazi (line 9) | pub struct Yazi {
method read (line 23) | pub(super) fn read() -> Result<String> {
method reshape (line 29) | pub(super) fn reshape(self) -> Result<Self> {
FILE: yazi-core/src/cmp/cmp.rs
type Cmp (line 10) | pub struct Cmp {
method window (line 23) | pub fn window(&self) -> &[CmpItem] {
method selected (line 28) | pub fn selected(&self) -> Option<&CmpItem> { self.matches.get(self.cur...
method rel_cursor (line 31) | pub fn rel_cursor(&self) -> usize { self.cursor - self.offset }
method total (line 35) | fn total(&self) -> usize { self.matches.len() }
method limit (line 37) | fn limit(&self) -> usize { self.matches.len().min(10) }
method cursor_mut (line 39) | fn cursor_mut(&mut self) -> &mut usize { &mut self.cursor }
method offset_mut (line 41) | fn offset_mut(&mut self) -> &mut usize { &mut self.offset }
FILE: yazi-core/src/confirm/confirm.rs
type Confirm (line 6) | pub struct Confirm {
FILE: yazi-core/src/core.rs
type Core (line 7) | pub struct Core {
method make (line 20) | pub fn make() -> Self {
method cursor (line 34) | pub fn cursor(&self) -> Option<(Position, SetCursorStyle)> {
method layer (line 48) | pub fn layer(&self) -> Layer {
method active (line 73) | pub fn active(&self) -> &Tab { self.mgr.active() }
method active_mut (line 76) | pub fn active_mut(&mut self) -> &mut Tab { self.mgr.active_mut() }
method current_mut (line 79) | pub fn current_mut(&mut self) -> &mut Folder { self.mgr.current_mut() }
method parent_mut (line 82) | pub fn parent_mut(&mut self) -> Option<&mut Folder> { self.mgr.parent_...
FILE: yazi-core/src/help/help.rs
type Help (line 13) | pub struct Help {
method r#type (line 27) | pub fn r#type(&mut self, key: &Key) -> Result<bool> {
method filter_apply (line 50) | pub fn filter_apply(&mut self) {
method keyword (line 67) | pub fn keyword(&self) -> Option<String> {
method window (line 77) | pub fn window(&self) -> &[&Chord] {
method cursor (line 83) | pub fn cursor(&self) -> Option<(u16, u16)> {
method rel_cursor (line 93) | pub fn rel_cursor(&self) -> usize { self.cursor - self.offset }
method cursor_shape (line 95) | pub fn cursor_shape(&self) -> SetCursorStyle {
method total (line 105) | fn total(&self) -> usize { self.bindings.len() }
method limit (line 107) | fn limit(&self) -> usize { Dimension::available().rows.saturating_sub(HE...
method cursor_mut (line 109) | fn cursor_mut(&mut self) -> &mut usize { &mut self.cursor }
method offset_mut (line 111) | fn offset_mut(&mut self) -> &mut usize { &mut self.offset }
FILE: yazi-core/src/help/mod.rs
constant HELP_MARGIN (line 3) | const HELP_MARGIN: u16 = 1;
FILE: yazi-core/src/input/input.rs
type Input (line 6) | pub struct Input {
type Target (line 15) | type Target = yazi_widgets::input::Input;
method deref (line 17) | fn deref(&self) -> &Self::Target { &self.inner }
method deref_mut (line 21) | fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner }
FILE: yazi-core/src/mgr/mgr.rs
type Mgr (line 13) | pub struct Mgr {
method make (line 22) | pub fn make() -> Self {
method area (line 32) | pub fn area(&self, pos: Position) -> Rect {
method shutdown (line 40) | pub fn shutdown(&mut self) { self.tabs.iter_mut().for_each(|t| t.shutd...
method cwd (line 45) | pub fn cwd(&self) -> &UrlBuf { self.active().cwd() }
method active (line 48) | pub fn active(&self) -> &Tab { self.tabs.active() }
method active_mut (line 51) | pub fn active_mut(&mut self) -> &mut Tab { self.tabs.active_mut() }
method current_mut (line 54) | pub fn current_mut(&mut self) -> &mut Folder { &mut self.active_mut()....
method parent_mut (line 57) | pub fn parent_mut(&mut self) -> Option<&mut Folder> { self.active_mut(...
method tab (line 61) | fn tab(&self) -> usize { self.tabs.cursor }
method selected (line 63) | fn selected(&self, tab: usize, mut idx: Option<usize>) -> impl Iterator<...
method hovered (line 75) | fn hovered(&self, tab: usize) -> Option<Url<'_>> {
method yanked (line 83) | fn yanked(&self) -> impl Iterator<Item = Url<'_>> { self.yanked.iter().m...
FILE: yazi-core/src/mgr/mimetype.rs
type Mimetype (line 5) | pub struct Mimetype(HashMap<UrlBufCov, Symbol<str>>);
method get (line 8) | pub fn get<'a, 'b>(&'a self, url: impl Into<Url<'b>>) -> Option<&'a st...
method owned (line 12) | pub fn owned<'a>(&self, url: impl Into<Url<'a>>) -> Option<Symbol<str>> {
method contains (line 16) | pub fn contains<'a>(&self, url: impl Into<Url<'a>>) -> bool {
method extend (line 20) | pub fn extend(&mut self, iter: impl IntoIterator<Item = (UrlBufCov, Sy...
FILE: yazi-core/src/mgr/tabs.rs
type Tabs (line 9) | pub struct Tabs {
method set_idx (line 19) | pub fn set_idx(&mut self, idx: usize) {
method active (line 32) | pub fn active(&self) -> &Tab { &self[self.cursor] }
method active_mut (line 35) | pub(super) fn active_mut(&mut self) -> &mut Tab { &mut self.items[self...
method parent (line 38) | pub fn parent(&self) -> Option<&Folder> { self.active().parent.as_ref() }
method current (line 41) | pub fn current(&self) -> &Folder { &self.active().current }
method hovered (line 44) | pub fn hovered(&self) -> Option<&File> { self.current().hovered() }
method default (line 15) | fn default() -> Self { Self { cursor: 0, items: vec![Default::default()]...
type Target (line 48) | type Target = Vec<Tab>;
method deref (line 50) | fn deref(&self) -> &Self::Target { &self.items }
method deref_mut (line 54) | fn deref_mut(&mut self) -> &mut Self::Target { &mut self.items }
FILE: yazi-core/src/mgr/yanked.rs
type Yanked (line 10) | pub struct Yanked {
method new (line 25) | pub fn new(cut: bool, urls: HashSet<UrlBufCov>) -> Self {
method remove (line 29) | pub fn remove<'a>(&mut self, url: impl Into<Url<'a>>) {
method clear (line 35) | pub fn clear(&mut self) {
method contains (line 44) | pub fn contains<'a>(&self, url: impl Into<Url<'a>>) -> bool {
method contains_in (line 48) | pub fn contains_in(&self, dir: &UrlBuf) -> bool {
method apply_op (line 57) | pub fn apply_op(&mut self, op: &FilesOp) {
method catchup_revision (line 72) | pub fn catchup_revision(&mut self, force: bool) -> bool {
type Target (line 19) | type Target = HashSet<UrlBufCov>;
method deref (line 21) | fn deref(&self) -> &Self::Target { &self.urls }
FILE: yazi-core/src/notify/message.rs
type Message (line 8) | pub struct Message {
method from (line 20) | fn from(opt: PushOpt) -> Self {
method height (line 40) | pub fn height(&self, width: u16) -> usize {
method eq (line 50) | fn eq(&self, other: &Self) -> bool {
FILE: yazi-core/src/notify/mod.rs
constant NOTIFY_BORDER (line 3) | pub const NOTIFY_BORDER: u16 = 2;
constant NOTIFY_SPACING (line 4) | pub const NOTIFY_SPACING: u16 = 1;
FILE: yazi-core/src/notify/notify.rs
type Notify (line 9) | pub struct Notify {
method available (line 15) | pub fn available(area: Rect) -> Rect {
method limit (line 21) | pub fn limit(&self, area: Rect) -> usize {
FILE: yazi-core/src/pick/pick.rs
type Pick (line 6) | pub struct Pick {
method title (line 19) | pub fn title(&self) -> &str { &self.title }
method window (line 21) | pub fn window(&self) -> impl Iterator<Item = (usize, &str)> {
method total (line 27) | fn total(&self) -> usize { self.items.len() }
method limit (line 29) | fn limit(&self) -> usize {
method cursor_mut (line 33) | fn cursor_mut(&mut self) -> &mut usize { &mut self.cursor }
method offset_mut (line 35) | fn offset_mut(&mut self) -> &mut usize { &mut self.offset }
FILE: yazi-core/src/spot/spot.rs
type Spot (line 10) | pub struct Spot {
method go (line 18) | pub fn go(&mut self, file: File, mime: Symbol<str>) {
method visible (line 33) | pub fn visible(&self) -> bool { self.lock.is_some() }
method abort (line 35) | pub fn abort(&mut self) { self.ct.take().map(|ct| ct.cancel()); }
method reset (line 37) | pub fn reset(&mut self) {
method same_url (line 42) | pub fn same_url(&self, url: &UrlBuf) -> bool { self.lock.as_ref().is_s...
method same_file (line 44) | pub fn same_file(&self, file: &File, mime: &str) -> bool {
method same_lock (line 49) | pub fn same_lock(&self, file: &File, mime: &str) -> bool {
FILE: yazi-core/src/tab/backstack.rs
type Backstack (line 4) | pub struct Backstack {
method push (line 10) | pub fn push(&mut self, url: Url) {
method current (line 36) | pub fn current(&self) -> Option<&UrlBuf> { self.stack.get(self.cursor) }
method shift_backward (line 38) | pub fn shift_backward(&mut self) -> Option<&UrlBuf> {
method shift_forward (line 47) | pub fn shift_forward(&mut self) -> Option<&UrlBuf> {
function test_backstack (line 62) | fn test_backstack() {
FILE: yazi-core/src/tab/finder.rs
type Finder (line 8) | pub struct Finder {
method new (line 21) | pub fn new(s: &str, case: FilterCase) -> Result<Self> {
method prev (line 29) | pub fn prev(&self, files: &Files, cursor: usize, include: bool) -> Opt...
method next (line 41) | pub fn next(&self, files: &Files, cursor: usize, include: bool) -> Opt...
method catchup (line 53) | pub fn catchup(&mut self, folder: &Folder) -> bool {
method matched_idx (line 79) | pub fn matched_idx<T>(&self, folder: &Folder, urn: T) -> Option<u8>
type FinderLock (line 15) | struct FinderLock {
method from (line 89) | fn from(value: &Folder) -> Self {
method eq (line 95) | fn eq(&self, other: &Folder) -> bool {
FILE: yazi-core/src/tab/folder.rs
type Folder (line 11) | pub struct Folder {
method from (line 40) | fn from(value: T) -> Self { Self { url: value.into(), ..Default::defau...
method update (line 44) | pub fn update(&mut self, op: FilesOp) -> bool {
method update_pub (line 88) | pub fn update_pub(&mut self, tab: Id, op: FilesOp) -> bool {
method arrow (line 96) | pub fn arrow(&mut self, step: impl Into<Step>) -> bool {
method hover (line 110) | pub fn hover(&mut self, urn: PathDyn) -> bool {
method repos (line 119) | pub fn repos(&mut self, urn: Option<PathDyn>) -> bool {
method sync_page (line 129) | pub fn sync_page(&mut self, force: bool) {
method squeeze_offset (line 141) | fn squeeze_offset(&mut self) -> bool {
method hovered (line 160) | pub fn hovered(&self) -> Option<&File> { self.files.get(self.cursor) }
method hovered_mut (line 163) | pub fn hovered_mut(&mut self) -> Option<&mut File> { self.files.get_mu...
method paginate (line 165) | pub fn paginate(&self, page: usize) -> &[File] {
method default (line 25) | fn default() -> Self {
method total (line 176) | fn total(&self) -> usize { self.files.len() }
method limit (line 178) | fn limit(&self) -> usize { LAYOUT.get().folder_limit() }
method scrolloff (line 180) | fn scrolloff(&self) -> usize { (self.limit() / 2).min(YAZI.mgr.scrolloff...
method cursor_mut (line 182) | fn cursor_mut(&mut self) -> &mut usize { &mut self.cursor }
method offset_mut (line 184) | fn offset_mut(&mut self) -> &mut usize { &mut self.offset }
FILE: yazi-core/src/tab/history.rs
type History (line 9) | pub struct History(HashMap<UrlBuf, Folder>);
method remove_or (line 22) | pub fn remove_or(&mut self, url: impl AsUrl) -> Folder {
type Target (line 12) | type Target = HashMap<UrlBuf, Folder>;
method deref (line 14) | fn deref(&self) -> &Self::Target { &self.0 }
method deref_mut (line 18) | fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 }
FILE: yazi-core/src/tab/mode.rs
type Mode (line 4) | pub enum Mode {
method visual_mut (line 12) | pub fn visual_mut(&mut self) -> Option<(usize, &mut BTreeSet<usize>)> {
method take_visual (line 20) | pub fn take_visual(&mut self) -> Option<(usize, BTreeSet<usize>)> {
method is_select (line 30) | pub fn is_select(&self) -> bool { matches!(self, Self::Select(..)) }
method is_unset (line 32) | pub fn is_unset(&self) -> bool { matches!(self, Self::Unset(..)) }
method is_visual (line 34) | pub fn is_visual(&self) -> bool { matches!(self, Self::Select(..) | Se...
method fmt (line 38) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
FILE: yazi-core/src/tab/preference.rs
type Preference (line 5) | pub struct Preference {
method default (line 21) | fn default() -> Self {
method from (line 40) | fn from(value: &Preference) -> Self {
FILE: yazi-core/src/tab/preview.rs
type Preview (line 16) | pub struct Preview {
method go (line 26) | pub fn go(&mut self, file: File, mime: Symbol<str>, force: bool) {
method go_folder (line 41) | pub fn go_folder(&mut self, file: File, dir: Option<Cha>, mime: Symbol...
method abort (line 73) | pub fn abort(&mut self) {
method reset (line 78) | pub fn reset(&mut self) {
method reset_image (line 84) | pub fn reset_image(&mut self) {
method same_url (line 89) | pub fn same_url(&self, url: &UrlBuf) -> bool { matches!(&self.lock, So...
method same_file (line 91) | pub fn same_file(&self, file: &File, mime: &str) -> bool {
method same_lock (line 96) | pub fn same_lock(&self, file: &File, mime: &str) -> bool {
method same_folder (line 100) | pub fn same_folder(&self, url: &UrlBuf) -> bool { self.folder_lock.as_...
FILE: yazi-core/src/tab/selected.rs
type Selected (line 9) | pub struct Selected {
method len (line 15) | pub fn len(&self) -> usize { self.inner.len() }
method is_empty (line 17) | pub fn is_empty(&self) -> bool { self.inner.is_empty() }
method values (line 19) | pub fn values(&self) -> impl Iterator<Item = &UrlBuf> { self.inner.key...
method contains (line 21) | pub fn contains<'a>(&self, url: impl Into<Url<'a>>) -> bool {
method add (line 25) | pub fn add<'a>(&mut self, url: impl Into<Url<'a>>) -> bool { self.add_...
method add_many (line 27) | pub fn add_many<'a, I, T>(&mut self, urls: I) -> usize
method add_same (line 41) | fn add_same<'a, I, T>(&mut self, urls: I) -> usize
method remove (line 74) | pub fn remove<'a>(&mut self, url: impl Into<Url<'a>> + Clone) -> bool {
method remove_many (line 78) | pub fn remove_many<'a, I, T>(&mut self, urls: I) -> usize
method remove_same (line 98) | fn remove_same<'a, I, T>(&mut self, urls: I) -> usize
method clear (line 126) | pub fn clear(&mut self) {
method apply_op (line 131) | pub fn apply_op(&mut self, op: &FilesOp) {
function test_insert_non_conflicting (line 149) | fn test_insert_non_conflicting() {
function test_insert_conflicting_parent (line 158) | fn test_insert_conflicting_parent() {
function test_insert_conflicting_child (line 166) | fn test_insert_conflicting_child() {
function test_remove (line 175) | fn test_remove() {
function insert_many_success (line 187) | fn insert_many_success() {
function insert_many_with_existing_parent_fails (line 201) | fn insert_many_with_existing_parent_fails() {
function insert_many_with_existing_child_fails (line 209) | fn insert_many_with_existing_child_fails() {
function insert_many_empty_urls_list (line 217) | fn insert_many_empty_urls_list() {
function insert_many_with_parent_as_child_of_another_url (line 224) | fn insert_many_with_parent_as_child_of_another_url() {
function insert_many_with_direct_parent_fails (line 234) | fn insert_many_with_direct_parent_fails() {
function insert_many_with_nested_child_fails (line 242) | fn insert_many_with_nested_child_fails() {
function insert_many_sibling_directories_success (line 251) | fn insert_many_sibling_directories_success() {
function insert_many_with_grandchild_fails (line 258) | fn insert_many_with_grandchild_fails() {
function test_insert_many_with_remove (line 266) | fn test_insert_many_with_remove() {
FILE: yazi-core/src/tab/tab.rs
type Tab (line 14) | pub struct Tab {
method shutdown (line 55) | pub fn shutdown(&mut self) {
method cwd (line 64) | pub fn cwd(&self) -> &UrlBuf { &self.current.url }
method name (line 66) | pub fn name(&self) -> Cow<'_, str> {
method hovered (line 78) | pub fn hovered(&self) -> Option<&File> { self.current.hovered() }
method hovered_mut (line 81) | pub fn hovered_mut(&mut self) -> Option<&mut File> { self.current.hove...
method hovered_rect (line 83) | pub fn hovered_rect(&self) -> Option<Rect> {
method hovered_rect_based (line 92) | pub fn hovered_rect_based(&self, pos: Position) -> Rect {
method selected_or_hovered (line 101) | pub fn selected_or_hovered(&self) -> Box<dyn Iterator<Item = &UrlBuf> ...
method hovered_and_selected (line 109) | pub fn hovered_and_selected(&self) -> Box<dyn Iterator<Item = &UrlBuf>...
method hovered_folder (line 122) | pub fn hovered_folder(&self) -> Option<&Folder> {
method hovered_folder_mut (line 127) | pub fn hovered_folder_mut(&mut self) -> Option<&mut Folder> {
method default (line 32) | fn default() -> Self {
FILE: yazi-core/src/tasks/file.rs
method file_cut (line 9) | pub fn file_cut(&self, src: &Yanked, dest: &UrlBuf, force: bool) {
method file_copy (line 23) | pub fn file_copy(&self, src: &Yanked, dest: &UrlBuf, force: bool, follow...
method file_link (line 37) | pub fn file_link(&self, src: &HashSet<UrlBufCov>, dest: &UrlBuf, relativ...
method file_hardlink (line 51) | pub fn file_hardlink(&self, src: &HashSet<UrlBufCov>, dest: &UrlBuf, for...
method file_remove (line 65) | pub fn file_remove(&self, targets: Vec<UrlBuf>, permanently: bool) {
FILE: yazi-core/src/tasks/mod.rs
constant TASKS_BORDER (line 3) | pub const TASKS_BORDER: u16 = 2;
constant TASKS_PADDING (line 4) | pub const TASKS_PADDING: u16 = 2;
constant TASKS_PERCENT (line 5) | pub const TASKS_PERCENT: u16 = 80;
FILE: yazi-core/src/tasks/prework.rs
method fetch_paged (line 8) | pub fn fetch_paged(&self, paged: &[File], mimetype: &Mimetype) {
method preload_paged (line 31) | pub fn preload_paged(&self, paged: &[File], mimetype: &Mimetype) {
method prework_sorted (line 46) | pub fn prework_sorted(&self, targets: &Files) {
FILE: yazi-core/src/tasks/process.rs
method open_shell_compat (line 10) | pub fn open_shell_compat(&self, mut opt: ProcessOpenOpt) {
FILE: yazi-core/src/tasks/tasks.rs
type Tasks (line 12) | pub struct Tasks {
method serve (line 23) | pub fn serve() -> Self {
method shutdown (line 51) | pub fn shutdown(&self) {
method limit (line 56) | pub fn limit() -> usize {
method paginate (line 62) | pub fn paginate(&self) -> Vec<TaskSnap> {
method ongoing (line 66) | pub fn ongoing(&self) -> &Arc<Mutex<Ongoing>> { &self.scheduler.ongoing }
FILE: yazi-core/src/which/sorter.rs
type WhichSorter (line 7) | pub struct WhichSorter {
method sort (line 26) | pub fn sort(&self, items: &mut Vec<ChordCow>) {
method default (line 15) | fn default() -> Self {
FILE: yazi-core/src/which/which.rs
type Which (line 6) | pub struct Which {
method r#type (line 17) | pub fn r#type(&mut self, key: Key) -> bool {
method dismiss (line 34) | pub fn dismiss(&mut self, chord: Option<ChordCow>) {
FILE: yazi-dds/build.rs
function main (line 5) | fn main() -> Result<(), Box<dyn Error>> {
FILE: yazi-dds/src/client.rs
type Client (line 21) | pub struct Client {
method serve (line 34) | pub(super) fn serve() {
method push (line 80) | pub(super) fn push<'a>(payload: impl Into<Payload<'a>>) -> Result<()> {
method able (line 84) | pub(super) fn able(&self, ability: &str) -> bool { self.abilities.cont...
method connect (line 86) | async fn connect(server: &mut Option<JoinHandle<()>>) -> (ClientReader...
method reconnect (line 114) | async fn reconnect(server: &mut Option<JoinHandle<()>>) -> (ClientRead...
method handle_hey (line 121) | fn handle_hey(body: &EmberHey) {
type Peer (line 28) | pub struct Peer {
method new (line 132) | pub(super) fn new(abilities: &HashSet<String>) -> Self { Self { abilit...
method able (line 134) | pub fn able(&self, ability: &str) -> bool { self.abilities.contains(ab...
FILE: yazi-dds/src/ember/bulk.rs
type EmberBulk (line 9) | pub struct EmberBulk<'a> {
function borrowed (line 14) | pub fn borrowed<I>(changes: I) -> Ember<'a>
function owned (line 23) | pub fn owned<'a, I>(changes: I) -> Ember<'static>
function from (line 35) | fn from(value: EmberBulk<'a>) -> Self { Self::Bulk(value) }
method into_lua (line 39) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
FILE: yazi-dds/src/ember/bye.rs
type EmberBye (line 7) | pub struct EmberBye;
method borrowed (line 10) | pub fn borrowed() -> Ember<'static> { Self.into() }
function from (line 14) | fn from(value: EmberBye) -> Self { Self::Bye(value) }
method into_lua (line 18) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> { lua.create_table()...
FILE: yazi-dds/src/ember/cd.rs
type EmberCd (line 10) | pub struct EmberCd<'a> {
function borrowed (line 18) | pub fn borrowed(tab: Id, url: &'a UrlBuf) -> Ember<'a> {
function owned (line 24) | pub fn owned(tab: Id, _: &UrlBuf) -> Ember<'static> {
function from (line 30) | fn from(value: EmberCd<'a>) -> Self { Self::Cd(value) }
method into_lua (line 34) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
FILE: yazi-dds/src/ember/custom.rs
type EmberCustom (line 9) | pub struct EmberCustom {
method from_str (line 15) | pub fn from_str(kind: &str, data: &str) -> anyhow::Result<Ember<'stati...
method from_lua (line 19) | pub fn from_lua(lua: &Lua, kind: &str, data: Value) -> mlua::Result<Em...
function from (line 25) | fn from(value: EmberCustom) -> Self { Self::Custom(value) }
method into_lua (line 29) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> { Sendable::data_to_...
method serialize (line 33) | fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok...
FILE: yazi-dds/src/ember/delete.rs
type EmberDelete (line 10) | pub struct EmberDelete<'a> {
function borrowed (line 15) | pub fn borrowed(urls: &'a Vec<UrlBuf>) -> Ember<'a> { Self { urls: Cow::...
function owned (line 19) | pub fn owned(urls: Vec<UrlBuf>) -> Ember<'static> { Self { urls: Cow::Ow...
function from (line 23) | fn from(value: EmberDelete<'a>) -> Self { Self::Delete(value) }
method into_lua (line 27) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
FILE: yazi-dds/src/ember/download.rs
type EmberDownload (line 10) | pub struct EmberDownload<'a> {
function borrowed (line 15) | pub fn borrowed(urls: &'a Vec<UrlBuf>) -> Ember<'a> { Self { urls: Cow::...
function owned (line 19) | pub fn owned(urls: Vec<UrlBuf>) -> Ember<'static> { Self { urls: Cow::Ow...
function from (line 23) | fn from(value: EmberDownload<'a>) -> Self { Self::Download(value) }
method into_lua (line 27) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
FILE: yazi-dds/src/ember/duplicate.rs
type EmberDuplicate (line 10) | pub struct EmberDuplicate<'a> {
function borrowed (line 15) | pub fn borrowed(items: &'a Vec<EmberDuplicateItem>) -> Ember<'a> {
function owned (line 21) | pub fn owned(items: Vec<EmberDuplicateItem>) -> Ember<'static> {
function from (line 27) | fn from(value: EmberDuplicate<'a>) -> Self { Self::Duplicate(value) }
method into_lua (line 31) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
type EmberDuplicateItem (line 38) | pub struct EmberDuplicateItem {
method into_lua (line 44) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
FILE: yazi-dds/src/ember/ember.rs
type Ember (line 9) | pub enum Ember<'a> {
function from_str (line 30) | pub fn from_str(kind: &str, body: &str) -> Result<Self> {
function from_lua (line 52) | pub fn from_lua(lua: &Lua, kind: &str, value: Value) -> mlua::Result<Sel...
function validate (line 57) | pub fn validate(kind: &str) -> Result<()> {
function kind (line 97) | pub fn kind(&self) -> &str {
function with_receiver (line 119) | pub fn with_receiver(self, receiver: Id) -> Payload<'a> {
method into_lua (line 125) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
FILE: yazi-dds/src/ember/hey.rs
type EmberHey (line 11) | pub struct EmberHey {
method owned (line 17) | pub fn owned(peers: HashMap<Id, Peer>) -> Ember<'static> {
function from (line 23) | fn from(value: EmberHey) -> Self { Self::Hey(value) }
method into_lua (line 27) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> { lua.create_table()...
FILE: yazi-dds/src/ember/hi.rs
type EmberHi (line 12) | pub struct EmberHi<'a> {
function borrowed (line 19) | pub fn borrowed<I>(abilities: I) -> Ember<'a>
function version (line 30) | pub fn version() -> &'static str {
function from (line 36) | fn from(value: EmberHi<'a>) -> Self { Self::Hi(value) }
method into_lua (line 40) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> { lua.create_table()...
FILE: yazi-dds/src/ember/hover.rs
type EmberHover (line 10) | pub struct EmberHover<'a> {
function borrowed (line 16) | pub fn borrowed(tab: Id, url: Option<&'a UrlBuf>) -> Ember<'a> {
function owned (line 22) | pub fn owned(tab: Id, _: Option<&UrlBuf>) -> Ember<'static> { Self { tab...
function from (line 26) | fn from(value: EmberHover<'a>) -> Self { Self::Hover(value) }
method into_lua (line 30) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
FILE: yazi-dds/src/ember/load.rs
type EmberLoad (line 11) | pub struct EmberLoad<'a> {
function borrowed (line 18) | pub fn borrowed(tab: Id, url: &'a UrlBuf, stage: &'a FolderStage) -> Emb...
function owned (line 24) | pub fn owned(tab: Id, url: &UrlBuf, stage: &FolderStage) -> Ember<'stati...
function from (line 30) | fn from(value: EmberLoad<'a>) -> Self { Self::Load(value) }
method into_lua (line 34) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
FILE: yazi-dds/src/ember/mount.rs
type EmberMount (line 7) | pub struct EmberMount;
method borrowed (line 10) | pub fn borrowed() -> Ember<'static> { Self.into() }
method owned (line 12) | pub fn owned() -> Ember<'static> { Self::borrowed() }
function from (line 16) | fn from(value: EmberMount) -> Self { Self::Mount(value) }
method into_lua (line 20) | fn into_lua(self, _: &Lua) -> mlua::Result<Value> { Ok(Value::Nil) }
FILE: yazi-dds/src/ember/move.rs
type EmberMove (line 10) | pub struct EmberMove<'a> {
function borrowed (line 15) | pub fn borrowed(items: &'a Vec<EmberMoveItem>) -> Ember<'a> {
function owned (line 21) | pub fn owned(items: Vec<EmberMoveItem>) -> Ember<'static> {
function from (line 27) | fn from(value: EmberMove<'a>) -> Self { Self::Move(value) }
method into_lua (line 31) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
type EmberMoveItem (line 38) | pub struct EmberMoveItem {
method into_lua (line 44) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
FILE: yazi-dds/src/ember/rename.rs
type EmberRename (line 10) | pub struct EmberRename<'a> {
function borrowed (line 17) | pub fn borrowed(tab: Id, from: &'a UrlBuf, to: &'a UrlBuf) -> Ember<'a> {
function owned (line 23) | pub fn owned(tab: Id, from: &UrlBuf, to: &UrlBuf) -> Ember<'static> {
function from (line 29) | fn from(value: EmberRename<'a>) -> Self { Self::Rename(value) }
method into_lua (line 33) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
FILE: yazi-dds/src/ember/tab.rs
type EmberTab (line 8) | pub struct EmberTab {
method borrowed (line 13) | pub fn borrowed(id: Id) -> Ember<'static> { Self { id }.into() }
method owned (line 15) | pub fn owned(id: Id) -> Ember<'static> { Self::borrowed(id) }
function from (line 19) | fn from(value: EmberTab) -> Self { Self::Tab(value) }
method into_lua (line 23) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
FILE: yazi-dds/src/ember/trash.rs
type EmberTrash (line 10) | pub struct EmberTrash<'a> {
function borrowed (line 15) | pub fn borrowed(urls: &'a Vec<UrlBuf>) -> Ember<'a> { Self { urls: Cow::...
function owned (line 19) | pub fn owned(urls: Vec<UrlBuf>) -> Ember<'static> { Self { urls: Cow::Ow...
function from (line 23) | fn from(value: EmberTrash<'a>) -> Self { Self::Trash(value) }
method into_lua (line 27) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
FILE: yazi-dds/src/ember/yank.rs
type EmberYank (line 12) | pub struct EmberYank<'a>(UpdateYankedOpt<'a>);
function borrowed (line 15) | pub fn borrowed(cut: bool, urls: &'a HashSet<UrlBufCov>) -> Ember<'a> {
function owned (line 21) | pub fn owned(cut: bool, _: &HashSet<UrlBufCov>) -> Ember<'static> {
function from (line 27) | fn from(value: EmberYank<'a>) -> Self { Self::Yank(value) }
method into_lua (line 31) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> { self.0.into_lua(lu...
FILE: yazi-dds/src/lib.rs
function init (line 7) | pub fn init() {
function serve (line 37) | pub fn serve() {
function shutdown (line 42) | pub async fn shutdown() { Pump::shutdown().await; }
FILE: yazi-dds/src/payload.rs
type Payload (line 12) | pub struct Payload<'a> {
function new (line 19) | pub fn new(body: Ember<'a>) -> Self { Self { receiver: Id(0), sender: *I...
function flush (line 21) | pub(super) fn flush(&self) -> Result<()> {
function try_flush (line 26) | pub(super) fn try_flush(&self) -> Result<()> {
function with_receiver (line 37) | pub(super) fn with_receiver(mut self, receiver: Id) -> Self {
function with_sender (line 42) | pub(super) fn with_sender(mut self, sender: Id) -> Self {
function emit (line 49) | pub(super) fn emit(self) {
type Err (line 55) | type Err = anyhow::Error;
method from_str (line 57) | fn from_str(s: &str) -> Result<Self, Self::Err> {
function from (line 75) | fn from(value: Ember<'a>) -> Self { Self::new(value) }
type Error (line 79) | type Error = ();
function try_from (line 81) | fn try_from(value: Spark<'a>) -> Result<Self, Self::Error> {
type Error (line 90) | type Error = anyhow::Error;
function try_from (line 92) | fn try_from(mut a: ActionCow) -> Result<Self, Self::Error> {
method fmt (line 98) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method into_lua (line 128) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
FILE: yazi-dds/src/pubsub.rs
type Pubsub (line 84) | pub struct Pubsub;
method sub (line 87) | pub fn sub(plugin: &str, kind: &str, f: Function) -> bool { sub!(LOCAL...
method sub_remote (line 89) | pub fn sub_remote(plugin: &str, kind: &str, f: Function) -> bool {
method unsub (line 93) | pub fn unsub(plugin: &str, kind: &str) -> bool { unsub!(LOCAL)(plugin,...
method unsub_remote (line 95) | pub fn unsub_remote(plugin: &str, kind: &str) -> bool {
method r#pub (line 99) | pub fn r#pub(body: Ember<'static>) -> Result<()> {
method pub_to (line 106) | pub fn pub_to(receiver: Id, body: Ember<'static>) -> Result<()> {
method pub_inner_hi (line 120) | pub fn pub_inner_hi() -> bool {
method pub_after_bulk (line 129) | pub fn pub_after_bulk<'a, I>(changes: I) -> Result<()>
method any_remote_own (line 145) | fn any_remote_own(kind: &str) -> bool {
FILE: yazi-dds/src/pump.rs
type Pump (line 17) | pub struct Pump;
method push_duplicate (line 20) | pub fn push_duplicate<U>(from: U, to: U)
method push_move (line 27) | pub fn push_move<U>(from: U, to: U)
method push_trash (line 34) | pub fn push_trash<U>(target: U)
method push_delete (line 41) | pub fn push_delete<U>(target: U)
method push_download (line 48) | pub fn push_download<U>(target: U)
method serve (line 55) | pub(super) fn serve() {
method shutdown (line 104) | pub(super) async fn shutdown() {
FILE: yazi-dds/src/sendable.rs
type Sendable (line 8) | pub struct Sendable;
method value_to_data (line 11) | pub fn value_to_data(lua: &Lua, value: Value) -> mlua::Result<Data> {
method data_to_value (line 71) | pub fn data_to_value(lua: &Lua, data: Data) -> mlua::Result<Value> {
method data_to_value_ref (line 113) | pub fn data_to_value_ref(lua: &Lua, data: &Data) -> mlua::Result<Value> {
method table_to_args (line 156) | pub fn table_to_args(lua: &Lua, t: Table) -> mlua::Result<HashMap<Data...
method args_to_table (line 176) | pub fn args_to_table(lua: &Lua, args: HashMap<DataKey, Data>) -> mlua:...
method args_to_table_ref (line 189) | pub fn args_to_table_ref(lua: &Lua, args: &HashMap<DataKey, Data>) -> ...
method list_to_values (line 204) | pub fn list_to_values(lua: &Lua, data: Vec<Data>) -> mlua::Result<Mult...
method values_to_list (line 208) | pub fn values_to_list(lua: &Lua, values: MultiValue) -> mlua::Result<V...
method value_to_key (line 214) | fn value_to_key(value: Value) -> mlua::Result<DataKey> {
method key_to_value (line 248) | fn key_to_value(lua: &Lua, key: DataKey) -> mlua::Result<Value> {
method key_to_value_ref (line 258) | fn key_to_value_ref(lua: &Lua, key: &DataKey) -> mlua::Result<Value> {
FILE: yazi-dds/src/server.rs
type Server (line 14) | pub(super) struct Server;
method make (line 17) | pub(super) async fn make() -> Result<JoinHandle<()>> {
method handle_hi (line 92) | fn handle_hi(s: String, id: &mut Option<Id>, tx: mpsc::UnboundedSender...
method handle_hey (line 112) | fn handle_hey(clients: &HashMap<Id, Client>) {
method handle_bye (line 121) | async fn handle_bye(id: Id, mut rx: UnboundedReceiver<String>, mut wri...
FILE: yazi-dds/src/spark/kind.rs
type SparkKind (line 4) | pub enum SparkKind {
method as_ref (line 28) | fn as_ref(&self) -> &str {
method fmt (line 55) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.w...
FILE: yazi-dds/src/spark/spark.rs
type Spark (line 6) | pub enum Spark<'a> {
function from_lua (line 157) | pub fn from_lua(lua: &Lua, kind: SparkKind, value: Value) -> mlua::Resul...
method into_lua (line 186) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
FILE: yazi-dds/src/state.rs
type State (line 16) | pub struct State {
method set (line 28) | pub fn set(&self, kind: &str, sender: u64, body: &str) -> bool {
method load_or_create (line 48) | pub async fn load_or_create(&self) {
method drain (line 55) | pub async fn drain(&self) -> Result<()> {
method load (line 81) | async fn load(&self) -> Result<()> {
method skip (line 105) | async fn skip(&self) -> Result<bool> {
type Target (line 22) | type Target = RwLock<Option<HashMap<String, String>>>;
method deref (line 24) | fn deref(&self) -> &Self::Target { &self.inner }
FILE: yazi-dds/src/stream.rs
type Stream (line 3) | pub struct Stream;
method connect (line 24) | pub async fn connect() -> std::io::Result<(ClientReader, ClientWriter)> {
method connect (line 31) | pub async fn connect() -> std::io::Result<(ClientReader, ClientWriter)> {
method bind (line 38) | pub(super) async fn bind() -> std::io::Result<ServerListener> {
method bind (line 48) | pub(super) async fn bind() -> std::io::Result<ServerListener> {
method socket_file (line 53) | fn socket_file() -> std::path::PathBuf {
type ClientReader (line 8) | pub type ClientReader = Lines<BufReader<ReadHalf<tokio::net::UnixStream>>>;
type ClientReader (line 10) | pub type ClientReader = Lines<BufReader<ReadHalf<tokio::net::TcpStream>>>;
type ClientWriter (line 13) | pub(super) type ClientWriter = WriteHalf<tokio::net::UnixStream>;
type ClientWriter (line 15) | pub(super) type ClientWriter = WriteHalf<tokio::net::TcpStream>;
type ServerListener (line 18) | pub(super) type ServerListener = tokio::net::UnixListener;
type ServerListener (line 20) | pub(super) type ServerListener = tokio::net::TcpListener;
FILE: yazi-emulator/src/brand.rs
type Brand (line 7) | pub enum Brand {
method from_csi (line 30) | pub(super) fn from_csi(resp: &str) -> Option<Self> {
method from_env (line 46) | pub fn from_env() -> Option<Self> {
method env (line 91) | fn env() -> (String, String) {
FILE: yazi-emulator/src/dimension.rs
type Dimension (line 8) | pub struct Dimension {
method from (line 16) | fn from(s: WindowSize) -> Self {
method available (line 28) | pub fn available() -> Self {
method ratio (line 44) | pub fn ratio(self) -> Option<(f64, f64)> {
method cell_size (line 52) | pub fn cell_size() -> Option<(f64, f64)> {
method from (line 22) | fn from(d: Dimension) -> Self {
FILE: yazi-emulator/src/emulator.rs
type Emulator (line 17) | pub struct Emulator {
method detect (line 38) | pub fn detect() -> Result<Self> {
method move_lock (line 82) | pub fn move_lock<F, T>((x, y): (u16, u16), cb: F) -> Result<T>
method read_until_da1 (line 114) | pub fn read_until_da1() -> String {
method read_until_dsr (line 135) | pub fn read_until_dsr() -> String {
method error_to_user (line 150) | async fn error_to_user() {
method csi_16t (line 169) | fn csi_16t(resp: &str) -> Option<(u16, u16)> {
method csi_gt_q (line 182) | fn csi_gt_q(resp: &str) -> Option<String> {
method light_bg (line 187) | fn light_bg(resp: &str) -> Result<bool> {
method force_16t (line 204) | fn force_16t((w, h): (u16, u16)) -> bool {
method default (line 26) | fn default() -> Self {
FILE: yazi-emulator/src/mux.rs
type Mux (line 16) | pub struct Mux;
method csi (line 19) | pub fn csi(s: &str) -> Cow<'_, str> {
method tmux_passthrough (line 30) | pub fn tmux_passthrough() {
method tmux_drain (line 57) | pub fn tmux_drain() -> Result<()> {
method tmux_sixel_flag (line 65) | pub fn tmux_sixel_flag() -> &'static str {
method term_program (line 80) | pub(super) fn term_program() -> (Option<String>, Option<String>) {
FILE: yazi-emulator/src/unknown.rs
type Unknown (line 2) | pub struct Unknown {
FILE: yazi-ffi/src/cf_dict.rs
type CFDict (line 9) | pub struct CFDict(CFDictionaryRef);
method take (line 12) | pub fn take(dict: CFDictionaryRef) -> Result<Self> {
method value (line 19) | pub fn value(&self, key: &str) -> Result<*const c_void> {
method bool (line 30) | pub fn bool(&self, key: &str) -> Result<bool> {
method integer (line 36) | pub fn integer(&self, key: &str) -> Result<i64> {
method os_string (line 42) | pub fn os_string(&self, key: &str) -> Result<OsString> {
method path_buf (line 46) | pub fn path_buf(&self, key: &str) -> Result<PathBuf> {
method drop (line 58) | fn drop(&mut self) { unsafe { CFRelease(self.0 as _) } }
FILE: yazi-ffi/src/cf_string.rs
type CFString (line 7) | pub struct CFString(pub(super) CFStringRef);
method new (line 10) | pub fn new(s: &str) -> Result<Self> {
method len (line 27) | pub fn len(&self) -> usize { unsafe { CFStringGetLength(self.0) as _ } }
method is_empty (line 29) | pub fn is_empty(&self) -> bool { self.len() == 0 }
method os_string (line 31) | pub fn os_string(&self) -> Result<OsString> {
type Target (line 51) | type Target = CFStringRef;
method deref (line 53) | fn deref(&self) -> &Self::Target { &self.0 }
method drop (line 57) | fn drop(&mut self) { unsafe { CFRelease(self.0 as _) }; }
FILE: yazi-ffi/src/disk_arbitration.rs
function DASessionCreate (line 7) | pub fn DASessionCreate(allocator: CFAllocatorRef) -> *const c_void;
function DADiskCreateFromBSDName (line 9) | pub fn DADiskCreateFromBSDName(
function DADiskCopyDescription (line 15) | pub fn DADiskCopyDescription(disk: *const c_void) -> CFDictionaryRef;
function DARegisterDiskAppearedCallback (line 17) | pub fn DARegisterDiskAppearedCallback(
function DARegisterDiskDescriptionChangedCallback (line 24) | pub fn DARegisterDiskDescriptionChangedCallback(
function DARegisterDiskDisappearedCallback (line 32) | pub fn DARegisterDiskDisappearedCallback(
function DASessionScheduleWithRunLoop (line 39) | pub fn DASessionScheduleWithRunLoop(
FILE: yazi-ffi/src/io_kit.rs
function IOServiceGetMatchingServices (line 8) | pub fn IOServiceGetMatchingServices(
function IOServiceMatching (line 14) | pub fn IOServiceMatching(a: *const c_char) -> CFMutableDictionaryRef;
function IOIteratorNext (line 16) | pub fn IOIteratorNext(iterator: mach_port_t) -> mach_port_t;
function IORegistryEntryCreateCFProperty (line 18) | pub fn IORegistryEntryCreateCFProperty(
function IOObjectRelease (line 25) | pub fn IOObjectRelease(obj: mach_port_t) -> kern_return_t;
FILE: yazi-fm/build.rs
function main (line 3) | fn main() -> Result<(), Box<dyn Error>> {
FILE: yazi-fm/src/app/app.rs
type App (line 13) | pub(crate) struct App {
method serve (line 20) | pub(crate) async fn serve() -> Result<()> {
method bootstrap (line 69) | fn bootstrap(&mut self) -> anyhow::Result<Data> {
FILE: yazi-fm/src/app/render.rs
method render (line 18) | pub(crate) fn render(&mut self, partial: bool) -> Result<Data> {
method render_partially (line 53) | pub(crate) fn render_partially(&mut self) -> Result<Data> {
method patch (line 79) | fn patch(frame: CompletedFrame) {
method routine (line 95) | fn routine(push: bool, cursor: Option<(Position, SetCursorStyle)>) {
FILE: yazi-fm/src/cmp/cmp.rs
type Cmp (line 9) | pub(crate) struct Cmp<'a> {
function new (line 14) | pub(crate) fn new(core: &'a Core) -> Self { Self { core } }
method render (line 18) | fn render(self, rect: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/confirm/body.rs
type Body (line 5) | pub(crate) struct Body<'a> {
function new (line 11) | pub(crate) fn new(core: &'a Core, border: bool) -> Self { Self { core, b...
method render (line 15) | fn render(self, area: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/confirm/buttons.rs
type Buttons (line 4) | pub(crate) struct Buttons;
method render (line 7) | fn render(self, area: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/confirm/confirm.rs
type Confirm (line 5) | pub(crate) struct Confirm<'a> {
function new (line 10) | pub(crate) fn new(core: &'a Core) -> Self { Self { core } }
method render (line 14) | fn render(self, _: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/confirm/list.rs
type List (line 5) | pub(crate) struct List<'a> {
function new (line 10) | pub(crate) fn new(core: &'a Core) -> Self { Self { core } }
method render (line 14) | fn render(self, mut area: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/dispatcher.rs
type Dispatcher (line 15) | pub(super) struct Dispatcher<'a> {
function new (line 21) | pub(super) fn new(app: &'a mut App) -> Self { Self { app } }
function dispatch (line 24) | pub(super) fn dispatch(&mut self, event: Event) {
function dispatch_call (line 41) | fn dispatch_call(&mut self, action: ActionCow) -> Result<()> {
function dispatch_seq (line 55) | fn dispatch_seq(&mut self, mut actions: Vec<ActionCow>) -> Result<()> {
function dispatch_render (line 66) | fn dispatch_render(&mut self, partial: bool) -> Result<()> {
function dispatch_key (line 76) | fn dispatch_key(&mut self, key: KeyEvent) -> Result<()> {
function dispatch_mouse (line 82) | fn dispatch_mouse(&mut self, mouse: MouseEvent) -> Result<()> {
function dispatch_resize (line 88) | fn dispatch_resize(&mut self) -> Result<()> {
function dispatch_focus (line 94) | fn dispatch_focus(&mut self) -> Result<()> {
function dispatch_paste (line 100) | fn dispatch_paste(&mut self, str: String) -> Result<()> {
FILE: yazi-fm/src/executor.rs
type Executor (line 9) | pub(super) struct Executor<'a> {
function new (line 15) | pub(super) fn new(app: &'a mut App) -> Self { Self { app } }
function execute (line 17) | pub(super) fn execute(&mut self, action: ActionCow) -> Result<Data> {
function app (line 33) | fn app(&mut self, mut action: ActionCow) -> Result<Data> {
function mgr (line 66) | fn mgr(&mut self, action: ActionCow) -> Result<Data> {
function tasks (line 162) | fn tasks(&mut self, action: ActionCow) -> Result<Data> {
function spot (line 192) | fn spot(&mut self, action: ActionCow) -> Result<Data> {
function pick (line 217) | fn pick(&mut self, action: ActionCow) -> Result<Data> {
function input (line 241) | fn input(&mut self, action: ActionCow) -> Result<Data> {
function confirm (line 276) | fn confirm(&mut self, action: ActionCow) -> Result<Data> {
function help (line 294) | fn help(&mut self, action: ActionCow) -> Result<Data> {
function cmp (line 318) | fn cmp(&mut self, action: ActionCow) -> Result<Data> {
function which (line 343) | fn which(&mut self, action: ActionCow) -> Result<Data> {
function notify (line 360) | fn notify(&mut self, action: ActionCow) -> Result<Data> {
FILE: yazi-fm/src/help/bindings.rs
type Bindings (line 5) | pub(super) struct Bindings<'a> {
function new (line 10) | pub(super) fn new(core: &'a Core) -> Self { Self { core } }
method render (line 14) | fn render(self, area: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/help/help.rs
type Help (line 7) | pub(crate) struct Help<'a> {
function new (line 12) | pub fn new(core: &'a Core) -> Self { Self { core } }
function tips (line 14) | fn tips() -> String {
method render (line 23) | fn render(self, area: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/input/input.rs
type Input (line 5) | pub(crate) struct Input<'a> {
function new (line 10) | pub(crate) fn new(core: &'a Core) -> Self { Self { core } }
method render (line 14) | fn render(self, _: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/logs.rs
type Logs (line 12) | pub(super) struct Logs;
method start (line 15) | pub(super) fn start() -> anyhow::Result<()> {
FILE: yazi-fm/src/main.rs
function main (line 10) | async fn main() -> anyhow::Result<()> {
FILE: yazi-fm/src/mgr/modal.rs
type Modal (line 8) | pub(crate) struct Modal<'a> {
function new (line 14) | pub(crate) fn new(core: &'a Core) -> Self { Self { core } }
method render (line 18) | fn render(self, area: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/mgr/preview.rs
type Preview (line 5) | pub(crate) struct Preview<'a> {
function new (line 11) | pub(crate) fn new(core: &'a Core) -> Self { Self { core } }
method render (line 15) | fn render(self, win: ratatui::layout::Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/notify/notify.rs
type Notify (line 4) | pub(crate) struct Notify<'a> {
function new (line 9) | pub(crate) fn new(core: &'a Core) -> Self { Self { core } }
function tiles (line 11) | fn tiles<'m>(area: Rect, messages: impl Iterator<Item = &'m Message> + C...
method render (line 34) | fn render(self, area: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/panic.rs
type Panic (line 3) | pub(super) struct Panic;
method install (line 6) | pub(super) fn install() {
FILE: yazi-fm/src/pick/list.rs
type List (line 6) | pub(crate) struct List<'a> {
function new (line 11) | pub(crate) fn new(core: &'a Core) -> Self { Self { core } }
method render (line 15) | fn render(self, area: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/pick/pick.rs
type Pick (line 7) | pub(crate) struct Pick<'a> {
function new (line 12) | pub(crate) fn new(core: &'a Core) -> Self { Self { core } }
method render (line 16) | fn render(self, _: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/root.rs
type Root (line 10) | pub(super) struct Root<'a> {
function new (line 15) | pub(super) fn new(core: &'a Core) -> Self { Self { core } }
function reflow (line 17) | pub(super) fn reflow(area: Rect) -> mlua::Result<Table> {
method render (line 25) | fn render(self, area: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/router.rs
type Router (line 9) | pub(super) struct Router<'a> {
function new (line 14) | pub(super) fn new(app: &'a mut App) -> Self { Self { app } }
function route (line 16) | pub(super) fn route(&mut self, key: Key) -> Result<bool> {
function matches (line 38) | fn matches(&mut self, layer: Layer, key: Key) -> bool {
FILE: yazi-fm/src/signals.rs
type Signals (line 8) | pub(super) struct Signals {
method start (line 13) | pub(super) fn start() -> Result<Self> {
method handle_sys (line 21) | fn handle_sys(n: libc::c_int) -> bool {
method handle_sys (line 50) | fn handle_sys(_: ()) -> bool { unreachable!() }
method handle_term (line 52) | fn handle_term(event: CrosstermEvent) {
method spawn (line 67) | fn spawn(mut rx: mpsc::UnboundedReceiver<(bool, CompletionToken)>) -> ...
FILE: yazi-fm/src/spot/spot.rs
type Spot (line 4) | pub(crate) struct Spot<'a> {
function new (line 9) | pub(crate) fn new(core: &'a Core) -> Self { Self { core } }
method render (line 13) | fn render(self, win: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/tasks/list.rs
type List (line 8) | pub(crate) struct List<'a> {
function new (line 14) | pub(crate) fn new(core: &'a Core) -> Self { Self { core } }
method render (line 18) | fn render(self, area: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/tasks/progress.rs
type Progress (line 9) | pub(crate) struct Progress<'a> {
function new (line 14) | pub(crate) fn new(core: &'a Core) -> Self { Self { core } }
method render (line 18) | fn render(self, _: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/tasks/tasks.rs
type Tasks (line 7) | pub(crate) struct Tasks<'a> {
function new (line 12) | pub(crate) fn new(core: &'a Core) -> Self { Self { core } }
function area (line 14) | pub(super) fn area(area: Rect) -> Rect {
method render (line 32) | fn render(self, area: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/which/cand.rs
type Cand (line 4) | pub(super) struct Cand<'a> {
function new (line 10) | pub(super) fn new(cand: &'a Chord, times: usize) -> Self { Self { times,...
function keys (line 12) | fn keys(&self) -> Vec<String> {
method render (line 18) | fn render(self, area: Rect, buf: &mut Buffer) {
FILE: yazi-fm/src/which/which.rs
constant PADDING_X (line 7) | const PADDING_X: u16 = 1;
constant PADDING_Y (line 8) | const PADDING_Y: u16 = 1;
type Which (line 10) | pub(crate) struct Which<'a> {
function new (line 15) | pub(crate) fn new(core: &'a Core) -> Self { Self { core } }
method render (line 19) | fn render(self, area: Rect, buf: &mut Buffer) {
FILE: yazi-fs/src/cha/cha.rs
type Cha (line 11) | pub struct Cha {
method new (line 51) | pub fn new<T>(name: T, meta: Metadata) -> Self
method from_dummy (line 58) | pub fn from_dummy<U>(_url: U, r#type: Option<ChaType>) -> Self
method from_bare (line 73) | fn from_bare(m: &Metadata) -> Self {
method hits (line 115) | pub fn hits(self, c: Self) -> bool {
method attach (line 125) | pub fn attach(mut self, kind: ChaKind) -> Self {
method is_link (line 133) | pub fn is_link(self) -> bool {
method is_orphan (line 138) | pub fn is_orphan(self) -> bool {
method is_hidden (line 143) | pub const fn is_hidden(self) -> bool {
method is_dummy (line 151) | pub const fn is_dummy(self) -> bool { self.kind.contains(ChaKind::DUMM...
method atime_dur (line 153) | pub fn atime_dur(self) -> anyhow::Result<Duration> {
method btime_dur (line 161) | pub fn btime_dur(self) -> anyhow::Result<Duration> {
method ctime_dur (line 169) | pub fn ctime_dur(self) -> anyhow::Result<Duration> {
method mtime_dur (line 177) | pub fn mtime_dur(self) -> anyhow::Result<Duration> {
type Target (line 26) | type Target = ChaMode;
method deref (line 28) | fn deref(&self) -> &Self::Target { &self.mode }
method default (line 32) | fn default() -> Self {
FILE: yazi-fs/src/cha/kind.rs
method hidden (line 18) | pub(super) fn hidden<T>(_name: T, _meta: &Metadata) -> Self
FILE: yazi-fs/src/cha/mode.rs
type Target (line 43) | type Target = ChaType;
method deref (line 46) | fn deref(&self) -> &Self::Target {
type Error (line 61) | type Error = anyhow::Error;
method try_from (line 63) | fn try_from(value: u16) -> Result<Self, Self::Error> {
function from (line 80) | fn from(value: ChaMode) -> Self {
method permissions (line 91) | pub fn permissions(self, dummy: bool) -> [u8; 10] {
method from_bare (line 138) | pub(super) fn from_bare(r#type: ChaType) -> Self {
method is_exec (line 155) | pub const fn is_exec(self) -> bool { self.contains(Self::U_EXEC) }
method is_sticky (line 158) | pub const fn is_sticky(self) -> bool { self.contains(Self::S_STICKY) }
FILE: yazi-fs/src/cha/type.rs
type ChaType (line 6) | pub enum ChaType {
method from (line 18) | fn from(value: ChaMode) -> Self { *value }
method from (line 22) | fn from(value: FileType) -> Self {
method is_file (line 61) | pub fn is_file(self) -> bool { self == Self::File }
method is_dir (line 64) | pub fn is_dir(self) -> bool { self == Self::Dir }
method is_block (line 67) | pub fn is_block(self) -> bool { self == Self::Block }
method is_char (line 70) | pub fn is_char(self) -> bool { self == Self::Char }
method is_sock (line 73) | pub fn is_sock(self) -> bool { self == Self::Sock }
method is_fifo (line 76) | pub fn is_fifo(self) -> bool { self == Self::FIFO }
FILE: yazi-fs/src/cwd.rs
type Cwd (line 10) | pub struct Cwd(ArcSwap<UrlBuf>);
method path (line 31) | pub fn path(&self) -> PathBuf { self.0.load().as_url().unified_path()....
method set (line 33) | pub fn set(&self, url: &UrlBuf, callback: fn()) -> bool {
method ensure (line 46) | pub fn ensure(url: Url) -> Cow<Path> {
method sync_cwd (line 88) | fn sync_cwd(callback: fn()) {
type Target (line 13) | type Target = ArcSwap<UrlBuf>;
method deref (line 15) | fn deref(&self) -> &Self::Target { &self.0 }
method default (line 19) | fn default() -> Self {
FILE: yazi-fs/src/error/error.rs
type Error (line 8) | pub enum Error {
method from (line 15) | fn from(err: io::Error) -> Self {
method from (line 31) | fn from(kind: io::ErrorKind) -> Self { Self::Kind(kind) }
method fmt (line 35) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method custom (line 45) | pub fn custom(kind: &str, code: Option<i32>, message: &str) -> Result<...
method kind (line 49) | pub fn kind(&self) -> io::ErrorKind {
method kind_str (line 57) | pub fn kind_str(&self) -> &'static str { kind_to_str(self.kind()) }
method raw_os_error (line 59) | pub fn raw_os_error(&self) -> Option<i32> {
FILE: yazi-fs/src/error/serde.rs
function kind_to_str (line 8) | pub(super) fn kind_to_str(kind: io::ErrorKind) -> &'static str {
function kind_from_str (line 56) | pub(super) fn kind_from_str(s: &str) -> Result<io::ErrorKind> {
method serialize (line 105) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
method deserialize (line 128) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
FILE: yazi-fs/src/file.rs
type File (line 8) | pub struct File {
method from (line 21) | fn from(value: &Self) -> Self { value.clone() }
method from_dummy (line 26) | pub fn from_dummy(url: impl Into<UrlBuf>, r#type: Option<ChaType>) -> ...
method chdir (line 33) | pub fn chdir(&self, wd: &Path) -> Self {
method url_owned (line 41) | pub fn url_owned(&self) -> UrlBuf { self.url.clone() }
method uri (line 44) | pub fn uri(&self) -> PathDyn<'_> { self.url.uri() }
method urn (line 47) | pub fn urn(&self) -> PathDyn<'_> { self.url.urn() }
method name (line 50) | pub fn name(&self) -> Option<Strand<'_>> { self.url.name() }
method stem (line 53) | pub fn stem(&self) -> Option<Strand<'_>> { self.url.stem() }
type Target (line 15) | type Target = Cha;
method deref (line 17) | fn deref(&self) -> &Self::Target { &self.cha }
method hash (line 57) | fn hash<H: Hasher>(&self, state: &mut H) {
FILE: yazi-fs/src/files.rs
type Files (line 10) | pub struct Files {
method new (line 35) | pub fn new(show_hidden: bool) -> Self { Self { show_hidden, ..Default:...
method update_full (line 37) | pub fn update_full(&mut self, files: Vec<File>) {
method update_part (line 48) | pub fn update_part(&mut self, files: Vec<File>, ticket: Id) {
method update_size (line 72) | pub fn update_size(&mut self, mut sizes: HashMap<PathBufDyn, u64>) {
method update_ioerr (line 87) | pub fn update_ioerr(&mut self) {
method update_creating (line 93) | pub fn update_creating(&mut self, files: Vec<File>) {
method update_deleting (line 123) | pub fn update_deleting(&mut self, urns: HashSet<PathBufDyn>) -> Vec<us...
method update_deleting (line 158) | pub fn update_deleting(&mut self, mut urns: HashSet<PathBufDyn>) -> Ve...
method update_updating (line 179) | pub fn update_updating(
method update_upserting (line 224) | pub fn update_upserting(&mut self, files: HashMap<PathBufDyn, File>) {
method catchup_revision (line 247) | pub fn catchup_revision(&mut self) -> bool {
method split_files (line 257) | fn split_files(&self, files: impl IntoIterator<Item = File>) -> (Vec<F...
method position (line 273) | pub fn position(&self, urn: PathDyn) -> Option<usize> { self.iter().po...
method ticket (line 277) | pub fn ticket(&self) -> Id { self.ticket }
method sorter (line 281) | pub fn sorter(&self) -> &FilesSorter { &self.sorter }
method set_sorter (line 283) | pub fn set_sorter(&mut self, sorter: FilesSorter) {
method filter (line 292) | pub fn filter(&self) -> Option<&Filter> { self.filter.as_ref() }
method set_filter (line 294) | pub fn set_filter(&mut self, filter: Option<Filter>) -> bool {
method set_show_hidden (line 319) | pub fn set_show_hidden(&mut self, state: bool) {
type Target (line 25) | type Target = Vec<File>;
method deref (line 27) | fn deref(&self) -> &Self::Target { &self.items }
method deref_mut (line 31) | fn deref_mut(&mut self) -> &mut Self::Target { &mut self.items }
FILE: yazi-fs/src/filter.rs
type Filter (line 7) | pub struct Filter {
method new (line 13) | pub fn new(s: &str, case: FilterCase) -> Result<Self> {
method matches (line 27) | pub fn matches<T>(&self, name: T) -> bool
method highlighted (line 35) | pub fn highlighted(&self, name: impl AsStrand) -> Option<Vec<Range<usi...
method eq (line 41) | fn eq(&self, other: &Self) -> bool { self.raw == other.raw }
method fmt (line 45) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.w...
type FilterCase (line 49) | pub enum FilterCase {
method from (line 57) | fn from(a: &Action) -> Self {
FILE: yazi-fs/src/fns.rs
function ok_or_not_found (line 5) | pub fn ok_or_not_found<T: Default>(result: io::Result<T>) -> io::Result<...
function max_common_root (line 16) | pub fn max_common_root(urls: &[UrlBuf]) -> usize {
function test_max_common_root (line 54) | fn test_max_common_root() {
FILE: yazi-fs/src/hash.rs
type FsHash64 (line 8) | pub trait FsHash64 {
method hash_u64 (line 9) | fn hash_u64(&self) -> u64;
method hash_u64 (line 13) | fn hash_u64(&self) -> u64 { foldhash::fast::FixedState::default().hash...
method hash_u64 (line 17) | fn hash_u64(&self) -> u64 { foldhash::fast::FixedState::default().hash...
type FsHash128 (line 21) | pub trait FsHash128 {
method hash_u128 (line 22) | fn hash_u128(&self) -> u128;
method hash_u128 (line 26) | fn hash_u128(&self) -> u128 {
method hash_u128 (line 38) | fn hash_u128(&self) -> u128 {
FILE: yazi-fs/src/lib.rs
function init (line 5) | pub fn init() {
FILE: yazi-fs/src/mounts/linux.rs
method monitor (line 12) | pub fn monitor<F>(me: &'static Locked, cb: F)
method partitions (line 62) | fn partitions() -> Result<HashSet<String>> {
method update (line 77) | async fn update(me: &'static Locked) {
method all (line 88) | fn all(&self) -> Result<Vec<Partition>> {
method mounts (line 126) | fn mounts() -> Result<Vec<Partition>> {
method labels (line 144) | fn labels() -> HashMap<(u64, u64), OsString> {
method unmangle_octal (line 167) | fn unmangle_octal(s: &str) -> Cow<'_, str> {
FILE: yazi-fs/src/mounts/macos.rs
method monitor (line 15) | pub fn monitor<F>(me: &'static Locked, cb: F)
method update (line 74) | fn update<F>(me: &'static Locked, cb: F, rt: &tokio::runtime::Handle)
method all_partitions (line 95) | fn all_partitions(names: Vec<CString>) -> Result<Vec<Partition>> {
method all_names (line 131) | fn all_names() -> Result<Vec<CString>> {
method bsd_name (line 159) | fn bsd_name(service: mach_port_t) -> Result<CString> {
FILE: yazi-fs/src/mounts/mod.rs
function init (line 9) | pub(super) fn init() { PARTITIONS.init(<_>::default()); }
FILE: yazi-fs/src/mounts/partition.rs
type Partition (line 4) | pub struct Partition {
method timeless (line 19) | pub fn timeless(&self) -> bool {
method soundless (line 26) | pub fn soundless(&self) -> bool {
method systemic (line 32) | pub fn systemic(&self) -> bool {
method new (line 51) | pub(super) fn new(name: &std::ffi::OsStr) -> Self {
method dev_name (line 56) | pub(super) fn dev_name(&self, full: bool) -> Option<&std::ffi::OsStr> {
FILE: yazi-fs/src/mounts/partitions.rs
type Locked (line 9) | pub(super) type Locked = RwLock<Partitions>;
type Partitions (line 14) | pub struct Partitions {
method by_dev (line 30) | pub fn by_dev(&self, dev: u64) -> Option<&Partition> {
method timeless (line 34) | pub fn timeless(&self, _cha: Cha) -> bool {
method soundless (line 46) | pub fn soundless(&self, _cha: Cha) -> bool {
type Target (line 23) | type Target = Vec<Partition>;
method deref (line 25) | fn deref(&self) -> &Self::Target { &self.inner }
FILE: yazi-fs/src/op.rs
type FilesOp (line 13) | pub enum FilesOp {
method cwd (line 28) | pub fn cwd(&self) -> &UrlBuf {
method emit (line 44) | pub fn emit(self) {
method prepare (line 48) | pub fn prepare(cwd: &UrlBuf) -> Id {
method rename (line 54) | pub fn rename(map: HashMap<UrlBuf, File>) {
method mutate (line 79) | pub fn mutate(ops: Vec<Self>) {
method chdir (line 101) | pub fn chdir(&self, wd: &Path) -> Self {
method diff_recoverable (line 124) | pub fn diff_recoverable(&self, contains: impl Fn(&UrlBuf) -> bool) -> ...
FILE: yazi-fs/src/path/clean.rs
function clean_url (line 3) | pub fn clean_url<'a>(url: impl Into<UrlCow<'a>>) -> UrlBuf {
function clean_path_impl (line 15) | fn clean_path_impl(path: PathDyn, base: usize, trail: usize) -> (PathBuf...
function test_clean_url (line 75) | fn test_clean_url() -> anyhow::Result<()> {
FILE: yazi-fs/src/path/expand.rs
function expand_url (line 6) | pub fn expand_url<'a>(url: impl Into<UrlCow<'a>>) -> UrlCow<'a> { expand...
function expand_url_impl (line 8) | fn expand_url_impl(url: UrlCow) -> UrlCow {
function expand_variables (line 50) | fn expand_variables(p: PathCow) -> PathCow {
function test_expand_url (line 85) | fn test_expand_url() -> Result<()> {
FILE: yazi-fs/src/path/path.rs
function skip_url (line 3) | pub fn skip_url(url: &UrlBuf, n: usize) -> StrandCow<'_> {
FILE: yazi-fs/src/path/percent.rs
constant SET (line 7) | const SET: &AsciiSet =
type PercentEncoding (line 10) | pub trait PercentEncoding<'a> {
method percent_encode (line 11) | fn percent_encode(self) -> Cow<'a, Path>;
method percent_decode (line 13) | fn percent_decode<K>(self, kind: K) -> Result<PathCow<'a>>
function percent_encode (line 19) | fn percent_encode(self) -> Cow<'a, Path> {
function percent_decode (line 26) | fn percent_decode<K>(self, kind: K) -> Result<PathCow<'a>>
FILE: yazi-fs/src/path/relative.rs
function path_relative_to (line 4) | pub fn path_relative_to<'a, 'b, P, Q>(from: P, to: Q) -> Result<PathCow<...
function path_relative_to_impl (line 12) | fn path_relative_to_impl<'a>(from: PathCow<'_>, to: PathCow<'a>) -> Resu...
function test_path_relative_to (line 55) | fn test_path_relative_to() {
FILE: yazi-fs/src/provider/attrs.rs
type Attrs (line 6) | pub struct Attrs {
method from (line 14) | fn from(value: Cha) -> Self {
method has_times (line 66) | pub fn has_times(self) -> bool {
method atime_dur (line 70) | pub fn atime_dur(self) -> Option<Duration> { self.atime?.duration_sinc...
method btime_dur (line 72) | pub fn btime_dur(self) -> Option<Duration> { self.btime?.duration_sinc...
method mtime_dur (line 74) | pub fn mtime_dur(self) -> Option<Duration> { self.mtime?.duration_sinc...
type Error (line 20) | type Error = ();
function try_from (line 22) | fn try_from(value: Attrs) -> Result<Self, Self::Error> {
type Error (line 53) | type Error = ();
function try_from (line 55) | fn try_from(value: Attrs) -> Result<Self, Self::Error> {
FILE: yazi-fs/src/provider/capabilities.rs
type Capabilities (line 2) | pub struct Capabilities {
FILE: yazi-fs/src/provider/local/absolute.rs
function try_absolute (line 7) | pub fn try_absolute<'a, U>(url: U) -> Option<UrlCow<'a>>
function try_absolute_impl (line 14) | fn try_absolute_impl<'a>(url: UrlCow<'a>) -> Option<UrlCow<'a>> {
FILE: yazi-fs/src/provider/local/calculator.rs
type Task (line 8) | type Task = Either<PathBuf, std::fs::ReadDir>;
type SizeCalculator (line 10) | pub enum SizeCalculator {
method new (line 16) | pub async fn new(path: &Path) -> io::Result<Self> {
method cha (line 31) | pub fn cha(&self) -> Cha {
method total (line 37) | pub async fn total(path: &Path) -> io::Result<u64> {
method next (line 46) | pub async fn next(&mut self) -> io::Result<Option<u64>> {
method next_chunk (line 75) | fn next_chunk(buf: &mut VecDeque<Either<PathBuf, std::fs::ReadDir>>) -...
FILE: yazi-fs/src/provider/local/casefold.rs
function match_name_case (line 3) | pub async fn match_name_case(path: impl AsRef<Path>) -> bool {
function casefold (line 8) | pub(super) async fn casefold(path: impl AsRef<Path>) -> io::Result<PathB...
function casefold_impl (line 14) | fn casefold_impl(path: PathBuf) -> io::Result<PathBuf> {
function casefold_impl (line 44) | fn casefold_impl(path: PathBuf) -> io::Result<PathBuf> {
function casefold_impl (line 105) | fn casefold_impl(path: PathBuf) -> io::Result<PathBuf> {
function final_path (line 161) | fn final_path(path: &Path) -> io::Result<PathBuf> {
function final_path (line 182) | fn final_path(path: &Path) -> io::Result<PathBuf> {
function try_from_fd (line 248) | fn try_from_fd(fd: std::os::fd::RawFd, needle: &Path) -> Option<PathBuf> {
FILE: yazi-fs/src/provider/local/copier.rs
function copy_impl (line 7) | pub(super) async fn copy_impl(from: PathBuf, to: PathBuf, attrs: Attrs) ...
function copy_with_progress_impl (line 51) | pub(super) fn copy_with_progress_impl(
FILE: yazi-fs/src/provider/local/dir_entry.rs
type DirEntry (line 7) | pub enum DirEntry {
method file_type (line 13) | async fn file_type(&self) -> io::Result<ChaType> {
method metadata (line 19) | async fn metadata(&self) -> io::Result<Cha> {
method name (line 27) | fn name(&self) -> StrandCow<'_> {
method path (line 33) | fn path(&self) -> PathBufDyn {
method url (line 39) | fn url(&self) -> UrlBuf {
FILE: yazi-fs/src/provider/local/gate.rs
type Gate (line 8) | pub struct Gate(tokio::fs::OpenOptions);
type File (line 11) | type File = tokio::fs::File;
method append (line 13) | fn append(&mut self, append: bool) -> &mut Self {
method attrs (line 18) | fn attrs(&mut self, _attrs: Attrs) -> &mut Self {
method create (line 26) | fn create(&mut self, create: bool) -> &mut Self {
method create_new (line 31) | fn create_new(&mut self, create_new: bool) -> &mut Self {
method open (line 36) | async fn open<U>(&self, url: U) -> io::Result<Self::File>
method read (line 48) | fn read(&mut self, read: bool) -> &mut Self {
method truncate (line 53) | fn truncate(&mut self, truncate: bool) -> &mut Self {
method write (line 58) | fn write(&mut self, write: bool) -> &mut Self {
FILE: yazi-fs/src/provider/local/identical.rs
function identical (line 4) | pub async fn identical<P, Q>(a: P, b: Q) -> io::Result<bool>
function identical_impl (line 14) | fn identical_impl(a: PathBuf, b: PathBuf) -> io::Result<bool> {
function identical_impl (line 26) | fn identical_impl(a: PathBuf, b: PathBuf) -> io::Result<bool> {
FILE: yazi-fs/src/provider/local/local.rs
type Local (line 9) | pub struct Local<'a> {
type File (line 15) | type File = tokio::fs::File;
type Gate (line 16) | type Gate = super::Gate;
type Me (line 17) | type Me<'b> = Local<'b>;
type ReadDir (line 18) | type ReadDir = super::ReadDir;
type UrlCow (line 19) | type UrlCow = UrlCow<'a>;
method absolute (line 21) | async fn absolute(&self) -> io::Result<Self::UrlCow> {
method canonicalize (line 27) | async fn canonicalize(&self) -> io::Result<UrlBuf> {
method capabilities (line 32) | fn capabilities(&self) -> Capabilities { Capabilities { symlink: true } }
method casefold (line 34) | async fn casefold(&self) -> io::Result<UrlBuf> {
method copy (line 39) | async fn copy<P>(&self, to: P, attrs: Attrs) -> io::Result<u64>
method copy_with_progress (line 48) | fn copy_with_progress<P, A>(&self, to: P, attrs: A) -> io::Result<mpsc::...
method create_dir (line 59) | async fn create_dir(&self) -> io::Result<()> { tokio::fs::create_dir(sel...
method create_dir_all (line 62) | async fn create_dir_all(&self) -> io::Result<()> { tokio::fs::create_dir...
method hard_link (line 65) | async fn hard_link<P>(&self, to: P) -> io::Result<()>
method metadata (line 75) | async fn metadata(&self) -> io::Result<Cha> {
method new (line 80) | async fn new<'b>(url: Url<'b>) -> io::Result<Self::Me<'b>> {
method read_dir (line 90) | async fn read_dir(self) -> io::Result<Self::ReadDir> {
method read_link (line 105) | async fn read_link(&self) -> io::Result<PathBufDyn> {
method remove_dir (line 110) | async fn remove_dir(&self) -> io::Result<()> { tokio::fs::remove_dir(sel...
method remove_dir_all (line 113) | async fn remove_dir_all(&self) -> io::Result<()> { tokio::fs::remove_dir...
method remove_file (line 116) | async fn remove_file(&self) -> io::Result<()> { tokio::fs::remove_file(s...
method rename (line 119) | async fn rename<P>(&self, to: P) -> io::Result<()>
method symlink (line 129) | async fn symlink<S, F>(&self, original: S, _is_dir: F) -> io::Result<()>
method symlink_dir (line 148) | async fn symlink_dir<S>(&self, original: S) -> io::Result<()>
method symlink_file (line 165) | async fn symlink_file<S>(&self, original: S) -> io::Result<()>
method symlink_metadata (line 182) | async fn symlink_metadata(&self) -> io::Result<Cha> {
method trash (line 189) | async fn trash(&self) -> io::Result<()> {
method url (line 212) | fn url(&self) -> Url<'_> { self.url }
method write (line 215) | async fn write<C>(&self, contents: C) -> io::Result<()>
function read (line 225) | pub async fn read(&self) -> io::Result<Vec<u8>> { tokio::fs::read(self.p...
function read_to_string (line 228) | pub async fn read_to_string(&self) -> io::Result<String> {
function regular (line 233) | pub fn regular<P>(path: &'a P) -> Self
FILE: yazi-fs/src/provider/local/read_dir.rs
type ReadDir (line 7) | pub enum ReadDir {
type Entry (line 13) | type Entry = super::DirEntry;
method next (line 15) | async fn next(&mut self) -> io::Result<Option<Self::Entry>> {
FILE: yazi-fs/src/provider/traits.rs
type Provider (line 9) | pub trait Provider: Sized {
method absolute (line 16) | fn absolute(&self) -> impl Future<Output = io::Result<Self::UrlCow>>;
method canonicalize (line 18) | fn canonicalize(&self) -> impl Future<Output = io::Result<UrlBuf>>;
method capabilities (line 20) | fn capabilities(&self) -> Capabilities;
method casefold (line 22) | fn casefold(&self) -> impl Future<Output = io::Result<UrlBuf>>;
method copy (line 24) | fn copy<P>(&self, to: P, attrs: Attrs) -> impl Future<Output = io::Res...
method copy_with_progress (line 28) | fn copy_with_progress<P, A>(
method create (line 37) | fn create(&self) -> impl Future<Output = io::Result<Self::File>> {
method create_dir (line 41) | fn create_dir(&self) -> impl Future<Output = io::Result<()>>;
method create_dir_all (line 43) | fn create_dir_all(&self) -> impl Future<Output = io::Result<()>> {
method create_new (line 79) | fn create_new(&self) -> impl Future<Output = io::Result<Self::File>> {
method gate (line 83) | fn gate(&self) -> Self::Gate { Self::Gate::default() }
method hard_link (line 85) | fn hard_link<P>(&self, to: P) -> impl Future<Output = io::Result<()>>
method metadata (line 89) | fn metadata(&self) -> impl Future<Output = io::Result<Cha>>;
method new (line 91) | fn new<'a>(url: Url<'a>) -> impl Future<Output = io::Result<Self::Me<'...
method open (line 93) | fn open(&self) -> impl Future<Output = io::Result<Self::File>> {
method read_dir (line 97) | fn read_dir(self) -> impl Future<Output = io::Result<Self::ReadDir>>;
method read_link (line 99) | fn read_link(&self) -> impl Future<Output = io::Result<PathBufDyn>>;
method remove_dir (line 101) | fn remove_dir(&self) -> impl Future<Output = io::Result<()>>;
method remove_dir_all (line 103) | fn remove_dir_all(&self) -> impl Future<Output = io::Result<()>> {
method remove_dir_clean (line 133) | fn remove_dir_clean(&self) -> impl Future<Output = io::Result<()>> {
method remove_file (line 160) | fn remove_file(&self) -> impl Future<Output = io::Result<()>>;
method rename (line 162) | fn rename<P>(&self, to: P) -> impl Future<Output = io::Result<()>>
method symlink (line 166) | fn symlink<S, F>(&self, original: S, _is_dir: F) -> impl Future<Output...
method symlink_dir (line 171) | fn symlink_dir<S>(&self, original: S) -> impl Future<Output = io::Resu...
method symlink_file (line 178) | fn symlink_file<S>(&self, original: S) -> impl Future<Output = io::Res...
method symlink_metadata (line 185) | fn symlink_metadata(&self) -> impl Future<Output = io::Result<Cha>>;
method trash (line 187) | fn trash(&self) -> impl Future<Output = io::Result<()>>;
method url (line 189) | fn url(&self) -> Url<'_>;
method write (line 191) | fn write<C>(&self, contents: C) -> impl Future<Output = io::Result<()>>
type DirReader (line 200) | pub trait DirReader {
method next (line 204) | fn next(&mut self) -> impl Future<Output = io::Result<Option<Self::Ent...
type FileHolder (line 208) | pub trait FileHolder {
method file_type (line 210) | fn file_type(&self) -> impl Future<Output = io::Result<ChaType>>;
method metadata (line 213) | fn metadata(&self) -> impl Future<Output = io::Result<Cha>>;
method name (line 216) | fn name(&self) -> StrandCow<'_>;
method path (line 219) | fn path(&self) -> PathBufDyn;
method url (line 222) | fn url(&self) -> UrlBuf;
type FileBuilder (line 226) | pub trait FileBuilder: Sized + Default {
method append (line 229) | fn append(&mut self, append: bool) -> &mut Self;
method attrs (line 231) | fn attrs(&mut self, attrs: Attrs) -> &mut Self;
method create (line 233) | fn create(&mut self, create: bool) -> &mut Self;
method create_new (line 235) | fn create_new(&mut self, create_new: bool) -> &mut Self;
method open (line 237) | fn open<U>(&self, url: U) -> impl Future<Output = io::Result<Self::File>>
method read (line 241) | fn read(&mut self, read: bool) -> &mut Self;
method truncate (line 243) | fn truncate(&mut self, truncate: bool) -> &mut Self;
method write (line 245) | fn write(&mut self, write: bool) -> &mut Self;
FILE: yazi-fs/src/scheme.rs
type FsScheme (line 7) | pub trait FsScheme {
method cache (line 8) | fn cache(&self) -> Option<PathBuf>;
method cache (line 12) | fn cache(&self) -> Option<PathBuf> {
method cache (line 26) | fn cache(&self) -> Option<PathBuf> { self.as_scheme().cache() }
FILE: yazi-fs/src/sorter.rs
type FilesSorter (line 10) | pub struct FilesSorter {
method sort (line 20) | pub(super) fn sort(&self, items: &mut [File], sizes: &HashMap<PathBufD...
method sort_alphabetically (line 85) | fn sort_alphabetically(&self, a: &File, b: &File) -> Ordering {
method sort_naturally (line 94) | fn sort_naturally(&self, a: &File, b: &File) -> Ordering {
method fallback (line 109) | fn fallback(&self, a: &File, b: &File, ord: Ordering) -> Ordering {
method cmp (line 124) | fn cmp<T: Ord>(&self, a: T, b: T) -> Ordering { if self.reverse { b.cm...
method cmp_insensitive (line 127) | fn cmp_insensitive(&self, a: &[u8], b: &[u8]) -> Ordering {
FILE: yazi-fs/src/sorting.rs
type SortBy (line 8) | pub enum SortBy {
type Err (line 21) | type Err = serde::de::value::Error;
method from_str (line 23) | fn from_str(s: &str) -> Result<Self, Self::Err> {
method fmt (line 29) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type SortFallback (line 46) | pub enum SortFallback {
type Err (line 53) | type Err = serde::de::value::Error;
method from_str (line 55) | fn from_str(s: &str) -> Result<Self, Self::Err> {
method fmt (line 61) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
FILE: yazi-fs/src/splatter.rs
type Iter (line 12) | type Iter<'a> = Peekable<std::iter::Copied<std::slice::Iter<'a, u8>>>;
type Iter (line 14) | type Iter<'a> = Peekable<std::os::windows::ffi::EncodeWide<'a>>;
type Buf (line 17) | type Buf = Vec<u8>;
type Buf (line 19) | type Buf = Vec<u16>;
type Splatter (line 22) | pub struct Splatter<T> {
type Splatable (line 27) | pub trait Splatable {
method tab (line 28) | fn tab(&self) -> usize;
method selected (line 30) | fn selected(&self, tab: usize, idx: Option<usize>) -> impl Iterator<It...
method hovered (line 32) | fn hovered(&self, tab: usize) -> Option<Url<'_>>;
method yanked (line 34) | fn yanked(&self) -> impl Iterator<Item = Url<'_>>;
method tab (line 252) | fn tab(&self) -> usize { 0 }
method selected (line 254) | fn selected(&self, tab: usize, idx: Option<usize>) -> impl Iterator<It...
method hovered (line 264) | fn hovered(&self, tab: usize) -> Option<Url<'_>> {
method yanked (line 268) | fn yanked(&self) -> impl Iterator<Item = Url<'_>> { iter::empty() }
method tab (line 278) | fn tab(&self) -> usize { self.0 }
method selected (line 280) | fn selected(&self, tab: usize, mut idx: Option<usize>) -> impl Iterato...
method hovered (line 293) | fn hovered(&self, tab: usize) -> Option<Url<'_>> {
method yanked (line 303) | fn yanked(&self) -> impl Iterator<Item = Url<'_>> {
function b2c (line 38) | fn b2c(b: u8) -> Option<char> { Some(b as char) }
function b2c (line 40) | fn b2c(b: u16) -> Option<char> { char::from_u32(b as u32) }
function cue (line 42) | fn cue(buf: &mut Buf, s: impl AsRef<OsStr>) {
function new (line 53) | pub fn new(src: T) -> Self { Self { tab: src.tab() + 1, src } }
function splat (line 55) | pub fn splat(mut self, cmd: impl AsRef<OsStr>) -> OsString {
function visit (line 76) | fn visit(&mut self, it: &mut Iter, buf: &mut Buf) {
function visit_selected (line 91) | fn visit_selected(&mut self, it: &mut Iter, buf: &mut Buf) {
function visit_hovered (line 112) | fn visit_hovered(&mut self, it: &mut Iter, buf: &mut Buf) {
function visit_dirname (line 124) | fn visit_dirname(&mut self, it: &mut Iter, buf: &mut Buf) {
function visit_tab (line 145) | fn visit_tab(&mut self, it: &mut Iter, buf: &mut Buf) {
function visit_digit (line 157) | fn visit_digit(&mut self, it: &mut Iter, buf: &mut Buf) {
function visit_yanked (line 178) | fn visit_yanked(&mut self, it: &mut Iter, buf: &mut Buf) {
function visit_escape (line 195) | fn visit_escape(&mut self, it: &mut Iter, buf: &mut Buf) { buf.push(it.n...
function visit_unknown (line 197) | fn visit_unknown(&mut self, it: &mut Iter, buf: &mut Buf) {
function consume_digit (line 204) | fn consume_digit(&mut self, it: &mut Iter) -> Option<usize> {
function spread (line 220) | pub fn spread(cmd: impl AsRef<OsStr>) -> bool {
type Source (line 275) | struct Source(usize);
function test_unix (line 310) | fn test_unix() {
FILE: yazi-fs/src/stage.rs
type FolderStage (line 6) | pub enum FolderStage {
method is_loading (line 14) | pub fn is_loading(&self) -> bool { *self == Self::Loading }
FILE: yazi-fs/src/url.rs
type FsUrl (line 7) | pub trait FsUrl<'a> {
method cache (line 8) | fn cache(&self) -> Option<PathBuf>;
method cache_lock (line 10) | fn cache_lock(&self) -> Option<PathBuf>;
method unified_path (line 12) | fn unified_path(self) -> Cow<'a, Path>;
method unified_path_str (line 14) | fn unified_path_str(self) -> Cow<'a, OsStr>
function cache (line 26) | fn cache(&self) -> Option<PathBuf> {
function cache_lock (line 41) | fn cache_lock(&self) -> Option<PathBuf> {
function unified_path (line 49) | fn unified_path(self) -> Cow<'a, Path> {
method cache (line 60) | fn cache(&self) -> Option<PathBuf> { self.as_url().cache() }
method cache_lock (line 62) | fn cache_lock(&self) -> Option<PathBuf> { self.as_url().cache_lock() }
method unified_path (line 64) | fn unified_path(self) -> Cow<'static, Path> {
function cache (line 75) | fn cache(&self) -> Option<PathBuf> { self.as_url().cache() }
function cache_lock (line 77) | fn cache_lock(&self) -> Option<PathBuf> { self.as_url().cache_lock() }
function unified_path (line 79) | fn unified_path(self) -> Cow<'a, Path> {
FILE: yazi-fs/src/xdg.rs
type Xdg (line 3) | pub struct Xdg;
method config_dir (line 6) | pub fn config_dir() -> PathBuf {
method state_dir (line 30) | pub fn state_dir() -> PathBuf {
method cache_dir (line 46) | pub fn cache_dir() -> &'static PathBuf {
FILE: yazi-parser/src/app/deprecate.rs
type DeprecateOpt (line 6) | pub struct DeprecateOpt {
type Error (line 11) | type Error = anyhow::Error;
method try_from (line 13) | fn try_from(mut a: ActionCow) -> Result<Self, Self::Error> {
method from_lua (line 23) | fn from_lua(_: Value, _: &Lua) -> mlua::Result<Self> { Err("unsupported"...
method into_lua (line 27) | fn into_lua(self, _: &Lua) -> mlua::Result<Value> { Err("unsupported".in...
FILE: yazi-parser/src/app/mouse.rs
type MouseOpt (line 5) | pub struct MouseOpt {
method from (line 10) | fn from(event: MouseEvent) -> Self { Self { event } }
method from_lua (line 14) | fn from_lua(_: Value, _: &Lua) -> mlua::Result<Self> { Err("unsupported"...
method into_lua (line 18) | fn into_lua(self, _: &Lua) -> mlua::Result<Value> { Err("unsupported".in...
FILE: yazi-parser/src/app/plugin.rs
type PluginOpt (line 11) | pub struct PluginOpt {
type Error (line 19) | type Error = anyhow::Error;
method try_from (line 21) | fn try_from(mut a: ActionCow) -> Result<Self, Self::Error> {
method new_callback (line 51) | pub fn new_callback(id: impl Into<SStr>, f: impl PluginCallback) -> Se...
method normalize_id (line 60) | fn normalize_id(s: SStr) -> SStr {
method from_lua (line 43) | fn from_lua(_: Value, _: &Lua) -> mlua::Result<Self> { Err("unsupported"...
method into_lua (line 47) | fn into_lua(self, _: &Lua) -> mlua::Result<Value> { Err("unsupported".in...
type PluginMode (line 74) | pub enum PluginMode {
method auto_then (line 90) | pub fn auto_then(self, sync: bool) -> Self {
type Err (line 82) | type Err = serde::de::value::Error;
method from_str (line 84) | fn from_str(s: &str) -> Result<Self, Self::Err> {
type PluginCallback (line 99) | pub trait PluginCallback:
method clone (line 110) | fn clone(&self) -> Self { dyn_clone::clone_box(&**self) }
function fmt (line 114) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
FILE: yazi-parser/src/app/quit.rs
type QuitOpt (line 7) | pub struct QuitOpt {
type Error (line 15) | type Error = anyhow::Error;
method try_from (line 17) | fn try_from(mut a: ActionCow) -> Result<Self, Self::Error> {
method from_lua (line 31) | fn from_lua(value: Value, lua: &Lua) -> mlua::Result<Self> { lua.from_va...
method into_lua (line 35) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> { lua.to_value_with(...
FILE: yazi-parser/src/app/reflow.rs
type ReflowOpt (line 5) | pub struct ReflowOpt {
method from (line 10) | fn from(f: fn(Rect) -> mlua::Result<Table>) -> Self { Self { reflow: f...
method from_lua (line 14) | fn from_lua(_: Value, _: &Lua) -> mlua::Result<Self> { Err("unsupported"...
method into_lua (line 18) | fn into_lua(self, _: &Lua) -> mlua::Result<Value> { Err("unsupported".in...
FILE: yazi-parser/src/app/resume.rs
type ResumeOpt (line 7) | pub struct ResumeOpt {
method from_lua (line 14) | fn from_lua(_: Value, _: &Lua) -> mlua::Result<Self> { Err("unsupported"...
method into_lua (line 18) | fn into_lua(self, _: &Lua) -> mlua::Result<Value> { Err("unsupported".in...
FILE: yazi-parser/src/app/stop.rs
type StopOpt (line 6) | pub struct StopOpt {
method from_lua (line 12) | fn from_lua(_: Value, _: &Lua) -> mlua::Result<Self> { Err("unsupported"...
method into_lua (line 16) | fn into_lua(self, _: &Lua) -> mlua::Result<Value> { Err("unsupported".in...
FILE: yazi-parser/src/app/title.rs
type TitleOpt (line 7) | pub struct TitleOpt {
method from_lua (line 12) | fn from_lua(value: Value, lua: &Lua) -> mlua::Result<Self> { lua.from_va...
method into_lua (line 16) | fn into_lua(self, lua: &Lua) -> mlua::Result<Value> { lua.to_value_with(...
FILE: yazi-parser/src/app/update_progress.rs
type UpdateProgressOpt (line 8) | pub struct UpdateProgressOpt {
type Error (line 13) | type Error = anyhow::Error;
method try_from (line 15) | fn try_from(mut a: ActionCow) -> Result<Self, Self::Error> {
method from_lua (line 25) | fn from_lua(_: Value, _: &Lua) -> mlua::Result<Self> { Err("unsupported"...
method into_lua (line 29) | fn into_lua(self, _: &Lua) -> mlua::Result<Value> { Err("unsupported".in...
type TaskSummary (line 34) | pub struct TaskSummary {
FILE: yazi-parser/src/arrow.rs
type ArrowOpt (line 7) | pub struct ArrowOpt {
type Error (line 12) | type Error = anyhow::Error;
method try_from (line 14) | fn try_from(a: ActionCow) -> Result<Self, Self::Error> {
method from (line 24) | fn from(n: isize) -> Self { Self { step: n.into() } }
method into_lua (line 28) | fn into_lua(self, _: &Lua) -> mlua::Result<Value> { Err("unsupported".in...
FILE: yazi-parser/src/cmp/close.rs
type CloseOpt (line 5) | pub struct CloseOpt {
method from (line 10) | fn from(a: ActionCow) -> Self { Self { submit: a.bool("submit") } }
method from (line 14) | fn from(submit: bool) -> Self { Self { submit } }
method from_lua (line 18) | fn from_lua(_: Value, _: &Lua) -> mlua::Result<Self> { Err("unsupported"...
method into_lua (line 22) | fn into_lua(self, _: &Lua) -> mlua::Result<Value> { Err("unsupported".in...
FILE: yazi-parser/src/cmp/show.rs
type ShowOpt (line 6) | pub struct ShowOpt {
type Error (line 14) | type Error = anyhow::Error;
method try_from (line 16) | fn try_from(mut a: ActionCow) -> Result<Self, Self::Error> {
method from_lua (line 26) | fn from_lua(_: Value, _: &Lua) -> mlua::Result<Self> { Err("unsupported"...
method into_lua (line 30) | fn into_lua(self, _: &Lua) -> mlua::Result<Value> { Err("unsupported".in...
type CmpItem (line 35) | pub struct CmpItem {
FILE: yazi-parser/src/cmp/trigger.rs
type TriggerOpt (line 5) | pub struct TriggerOpt {
method from (line 11) | fn from(mut a: ActionCow) -> Self {
method from_lua (line 17) | fn from_lua(_: Value, _: &Lua) -> mlua::Result<Self> { Err("unsupported"...
method into_lua (line 21) | fn into_lua(self, _: &Lua) -> mlua::Result<Value> { Err("unsupported".in...
FILE: yazi-parser/src/confirm/close.rs
type CloseOpt (line 5) | pub struct CloseOpt {
method from (line 10) | fn from(a: ActionCow) -> Self { Self { submit: a.bool("submit") } }
method from (line 14) | fn from(submit: bool) -> Self { Self { submit } }
method from_lua (line 18) | fn from_lua(_: Value, _: &Lua) -> mlua::Result<Self> { Err("unsupported"...
method into_lua (line 22) | fn into_lua(self, _: &Lua) -> mlua::Result<Value> { Err("unsupported".in...
FILE: yazi-parser/src/confirm/show.rs
type ShowOpt (line 7) | pub struct ShowOpt {
type Error (line 13) | type Error = anyhow::Error;
method try_from (line 15) | fn try_from(mut a: ActionCow) -> Result<Self, Self::Error> {
method from (line 29) | fn from(value: Box<Self>) -> Self { *value }
method from_lua (line 33) | fn from_lua(_: Value, _: &Lua) -> mlua::Result<Self> { Err("unsupported"...
method into_lua (line 37) | fn into_lua(self, _: &Lua) -> mlua::Result<Value> { Err("unsupported".in...
FILE: yazi-parser/src/help/toggle.rs
type ToggleOpt (line 5) | pub struct ToggleOpt {
type Error (line 10) | type Error = anyhow::Error;
method try_from (line 12) | fn try_from(a: ActionCow) -> Result<Self, Self::Error> { Ok(Self { lay...
method from (line 16) | fn from(layer: Layer) -> Self { Self { layer } }
method from_lua (line 20) | fn from_lua(_: Value, _: &Lua) -> mlua::Result<Self> { Err("unsupported"...
method into_lua (line 24) | fn into_lua(self, _: &Lua) -> mlua::Result<Value> { Err("unsupported".in...
FILE: yazi-parser/src/input/close.rs
type CloseOpt (line 5) | pub struct CloseOpt {
method from (line 10) | fn from(a: ActionCow) -> Self { Self { submit: a.bool("submit") } }
method from (line 14) | fn from(submit: bool) -> Self { Self { submit } }
method from_lua (line 18) | fn from_lua(_: Value, _: &Lua) -> mlua::Result<Self> { Err("unsupported"...
method into_lua (line 22) | fn into_lua(self, _: &Lua) -> mlua::Result<Value> { Err("unsupported".in...
FILE: yazi-parser/src/mgr/cd.rs
type CdOpt (line 8) | pub struct CdOpt {
method from (line 15) | fn from(mut a: ActionCow) -> Self {
method from (line 37) | fn from((target, source): (UrlBuf, CdSo
Condensed preview — 1064 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,081K chars).
[
{
"path": ".cargo/config.toml",
"chars": 580,
"preview": "[env]\nMACOSX_DEPLOYMENT_TARGET = \"10.12\"\nJEMALLOC_SYS_WITH_LG_PAGE = \"16\"\n\n# environment variable for tikv-jemalloc-sys"
},
{
"path": ".envrc",
"chars": 9,
"preview": "use flake"
},
{
"path": ".github/DISCUSSION_TEMPLATE/1-q-a.yml",
"chars": 1588,
"preview": "body:\n - type: dropdown\n id: os\n attributes:\n label: What system are you running Yazi on?\n options:\n "
},
{
"path": ".github/ISSUE_TEMPLATE/bug.yml",
"chars": 2349,
"preview": "name: 🐞 Bug Report\ndescription: Create a report to help us improve\nlabels: [bug]\nassignees: []\nbody:\n - type: dropdown\n"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 710,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: 🚧 Build Issues\n url: https://github.com/sxyazi/yazi/discussions/"
},
{
"path": ".github/ISSUE_TEMPLATE/feature.yml",
"chars": 1706,
"preview": "name: 💡 Feature Request\ndescription: Suggest an idea for this project\nlabels: [feature]\nassignees: []\nbody:\n - type: te"
},
{
"path": ".github/dependabot.yml",
"chars": 305,
"preview": "version: 2\nupdates:\n - package-ecosystem: \"github-actions\"\n directory: \"/\"\n schedule:\n interval: \"weekly\"\n "
},
{
"path": ".github/pull_request_template.md",
"chars": 663,
"preview": "## Which issue does this PR resolve?\n\n<!--\nFor any fixes and enhancements, we usually require an associated issue to be "
},
{
"path": ".github/workflows/cachix.yml",
"chars": 559,
"preview": "name: Cachix\n\non:\n push:\n branches: [main]\n\npermissions:\n contents: read\n\njobs:\n publish:\n name: Publish Flake\n"
},
{
"path": ".github/workflows/check.yml",
"chars": 1227,
"preview": "name: Check\n\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\n\nenv:\n SCCACHE_GHA_ENABLED: true\n R"
},
{
"path": ".github/workflows/draft.yml",
"chars": 7665,
"preview": "name: Draft\n\non:\n push:\n branches: [main]\n tags: [\"v[0-9]+.[0-9]+.[0-9]+\"]\n workflow_dispatch:\n\nenv:\n SCCACHE_G"
},
{
"path": ".github/workflows/lock.yml",
"chars": 867,
"preview": "name: Lock Threads\n\non:\n schedule:\n - cron: \"5 3 * * *\"\n workflow_dispatch:\n\nconcurrency:\n group: lock\n\njobs:\n lo"
},
{
"path": ".github/workflows/no-response.yml",
"chars": 363,
"preview": "name: No Response\n\non:\n issue_comment:\n types: [created]\n schedule:\n - cron: \"10 * * * *\"\n\njobs:\n no-response:\n"
},
{
"path": ".github/workflows/publish.yml",
"chars": 898,
"preview": "name: Publish\n\non:\n release:\n types: [published]\n\npermissions:\n contents: read\n\njobs:\n winget:\n runs-on: ubuntu"
},
{
"path": ".github/workflows/test.yml",
"chars": 677,
"preview": "name: Test\n\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\n\nenv:\n SCCACHE_GHA_ENABLED: true\n RU"
},
{
"path": ".github/workflows/validate-form.yml",
"chars": 729,
"preview": "name: Validate Form\n\non:\n issues:\n types: [opened, edited]\n schedule:\n - cron: \"20 * * * *\"\n\njobs:\n check-versi"
},
{
"path": ".gitignore",
"chars": 102,
"preview": "target/\nyazi-*/completions\nnode_modules/\n\n.DS_Store\n\nresult\nresult-*\n.direnv\n\n.idea/\n.vscode/\n\n*.snap\n"
},
{
"path": ".luarc.json",
"chars": 278,
"preview": "{\n\t\"$schema\": \"https://raw.githubusercontent.com/LuaLS/vscode-lua/master/setting/schema.json\",\n\t\"runtime.version\": \"Lua "
},
{
"path": "CHANGELOG.md",
"chars": 80694,
"preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Change"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 3389,
"preview": "# Code of Conduct\n\n## Goal\n\nOur goal is to create a welcoming and safe space where anyone can contribute and seek help f"
},
{
"path": "CONTRIBUTING.md",
"chars": 5331,
"preview": "# Contributing to Yazi\n\nThank you for your interest in contributing to Yazi! We welcome contributions in the form of bug"
},
{
"path": "Cargo.toml",
"chars": 3345,
"preview": "[workspace]\nresolver = \"3\"\nmembers = [ \"yazi-*\" ]\ndefault-members = [ \"yazi-fm\", \"yazi-cli\" ]\n\n[workspace"
},
{
"path": "LICENSE",
"chars": 1065,
"preview": "MIT License\n\nCopyright (c) 2023 - sxyazi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\no"
},
{
"path": "LICENSE-ICONS",
"chars": 1066,
"preview": "MIT License\n\nCopyright (c) 2023 nvim-tree\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\n"
},
{
"path": "README.md",
"chars": 7164,
"preview": "<div align=\"center\">\n\t<sup>Special thanks to:</sup><br>\n\n|<a href=\"https://go.warp.dev/yazi\" target=\"_blank\"><img alt=\"W"
},
{
"path": "assets/yazi.desktop",
"chars": 310,
"preview": "[Desktop Entry]\nName=Yazi File Manager\nIcon=yazi\nComment=Blazing fast terminal file manager written in Rust, based on as"
},
{
"path": "cspell.json",
"chars": 2222,
"preview": "{\"version\":\"0.2\",\"flagWords\":[],\"words\":[\"Punct\",\"KEYMAP\",\"splitn\",\"crossterm\",\"YAZI\",\"peekable\",\"ratatui\",\"syntect\",\"pb"
},
{
"path": "flake.nix",
"chars": 1889,
"preview": "{\n inputs = {\n nixpkgs.url = \"github:NixOS/nixpkgs/nixpkgs-unstable\";\n flake-utils.url = \"github:numtide/flake-ut"
},
{
"path": "nix/shell.nix",
"chars": 364,
"preview": "{\n mkShell,\n yazi,\n toolchain,\n nodePackages,\n yazi-unwrapped,\n}:\n\nmkShell {\n packages = yazi.passthru.runtimePath"
},
{
"path": "nix/yazi-unwrapped.nix",
"chars": 2079,
"preview": "{\n rustPlatform,\n version ? \"git\",\n rev ? \"unknown\",\n date ? \"19700101\",\n lib,\n\n installShellFiles,\n fetchFromGit"
},
{
"path": "nix/yazi.nix",
"chars": 2207,
"preview": "{\n lib,\n formats,\n runCommand,\n makeWrapper,\n\n runtimeDeps ? (ps: ps),\n\n # deps\n file,\n yazi-unwrapped,\n\n # def"
},
{
"path": "rustfmt.toml",
"chars": 1156,
"preview": "color = \"Never\"\ncondense_wildcard_suffixes = true\nedition = \"2024\"\nenum_di"
},
{
"path": "scripts/build.sh",
"chars": 1065,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nexport ARTIFACT_NAME=\"yazi-$1\"\nexport YAZI_GEN_COMPLETIONS=1\n\n# Build the target\n"
},
{
"path": "scripts/bump.sh",
"chars": 860,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\ncd \"$SCRIPT_DIR/..\"\n\ne"
},
{
"path": "scripts/icons/generate.lua",
"chars": 1699,
"preview": "local dark = {\n\ticons_by_filename = require(\"default.icons_by_filename\"),\n\ticons_by_file_extension = require(\"default.ic"
},
{
"path": "scripts/validate-form/main.js",
"chars": 7730,
"preview": "const LABEL_NAME = \"needs info\"\nconst RE_VERSION = /Yazi\\s+Version\\s*:\\s\\d+\\.\\d+\\.\\d+\\s\\(/gm\nconst RE_DEPENDENCIES = /De"
},
{
"path": "scripts/validate-form/package.json",
"chars": 224,
"preview": "{\n\t\"name\": \"validate-form\",\n\t\"version\": \"1.0.0\",\n\t\"scripts\": {\n\t\t\"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n\t"
},
{
"path": "snap/snapcraft.yaml",
"chars": 6426,
"preview": "name: yazi\nbase: core24\nadopt-info: yazi\nsummary: Blazing fast terminal file manager written in Rust, based on async I/O"
},
{
"path": "stylua.toml",
"chars": 185,
"preview": "syntax = \"Lua54\"\nindent_width = 2\ncall_parentheses = \"NoSingleTable\"\ncollapse_s"
},
{
"path": "yazi-actor/Cargo.toml",
"chars": 2223,
"preview": "[package]\nname = \"yazi-actor\"\ndescription = \"Yazi actor model\"\nversion.workspace = tru"
},
{
"path": "yazi-actor/README.md",
"chars": 196,
"preview": "# yazi-actor\n\nThis crate is part of [Yazi][source], and it is not supposed to be used outside, as there are no guarantee"
},
{
"path": "yazi-actor/src/actor.rs",
"chars": 287,
"preview": "use anyhow::Result;\nuse yazi_dds::spark::SparkKind;\nuse yazi_shared::data::Data;\n\nuse crate::Ctx;\n\npub trait Actor {\n\tty"
},
{
"path": "yazi-actor/src/app/accept_payload.rs",
"chars": 1050,
"preview": "use anyhow::Result;\nuse mlua::IntoLua;\nuse tracing::error;\nuse yazi_actor::lives::Lives;\nuse yazi_binding::runtime_scope"
},
{
"path": "yazi-actor/src/app/bootstrap.rs",
"chars": 737,
"preview": "use anyhow::Result;\nuse yazi_actor::Ctx;\nuse yazi_boot::BOOT;\nuse yazi_macro::{act, succ};\nuse yazi_parser::{VoidOpt, mg"
},
{
"path": "yazi-actor/src/app/deprecate.rs",
"chars": 540,
"preview": "use anyhow::Result;\nuse yazi_macro::act;\nuse yazi_parser::{app::DeprecateOpt, notify::{PushLevel, PushOpt}};\nuse yazi_sh"
},
{
"path": "yazi-actor/src/app/focus.rs",
"chars": 319,
"preview": "use anyhow::Result;\nuse yazi_actor::Ctx;\nuse yazi_macro::act;\nuse yazi_parser::VoidOpt;\nuse yazi_shared::data::Data;\n\nus"
},
{
"path": "yazi-actor/src/app/mod.rs",
"chars": 157,
"preview": "yazi_macro::mod_flat!(\n\taccept_payload\n\tbootstrap\n\tdeprecate\n\tfocus\n\tmouse\n\tplugin\n\tplugin_do\n\tquit\n\treflow\n\tresize\n\tres"
},
{
"path": "yazi-actor/src/app/mouse.rs",
"chars": 1702,
"preview": "use anyhow::Result;\nuse crossterm::event::MouseEventKind;\nuse mlua::{ObjectLike, Table};\nuse tracing::error;\nuse yazi_ac"
},
{
"path": "yazi-actor/src/app/plugin.rs",
"chars": 936,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, succ};\nuse yazi_parser::app::{PluginMode, PluginOpt};\nuse yazi_plugin::loader:"
},
{
"path": "yazi-actor/src/app/plugin_do.rs",
"chars": 1556,
"preview": "use anyhow::Result;\nuse mlua::ObjectLike;\nuse scopeguard::defer;\nuse tracing::{error, warn};\nuse yazi_binding::runtime_m"
},
{
"path": "yazi-actor/src/app/quit.rs",
"chars": 1108,
"preview": "use anyhow::Result;\nuse yazi_boot::ARGS;\nuse yazi_fs::provider::{Provider, local::Local};\nuse yazi_parser::app::QuitOpt;"
},
{
"path": "yazi-actor/src/app/reflow.rs",
"chars": 1384,
"preview": "use anyhow::Result;\nuse mlua::Value;\nuse ratatui::layout::Position;\nuse tracing::error;\nuse yazi_actor::lives::Lives;\nus"
},
{
"path": "yazi-actor/src/app/resize.rs",
"chars": 469,
"preview": "use anyhow::Result;\nuse yazi_actor::Ctx;\nuse yazi_macro::act;\nuse yazi_parser::app::ReflowOpt;\nuse yazi_shared::data::Da"
},
{
"path": "yazi-actor/src/app/resume.rs",
"chars": 685,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::app::ResumeOpt;\nuse yazi_shared::data::Data;\nu"
},
{
"path": "yazi-actor/src/app/stop.rs",
"chars": 577,
"preview": "use anyhow::Result;\nuse yazi_macro::succ;\nuse yazi_parser::app::StopOpt;\nuse yazi_shared::data::Data;\n\nuse crate::{Actor"
},
{
"path": "yazi-actor/src/app/title.rs",
"chars": 819,
"preview": "use anyhow::Result;\nuse crossterm::{execute, terminal::SetTitle};\nuse yazi_actor::Ctx;\nuse yazi_dds::spark::SparkKind;\nu"
},
{
"path": "yazi-actor/src/app/update_progress.rs",
"chars": 902,
"preview": "use anyhow::Result;\nuse yazi_actor::Ctx;\nuse yazi_macro::{act, render, render_partial, succ};\nuse yazi_parser::app::Upda"
},
{
"path": "yazi-actor/src/cmp/arrow.rs",
"chars": 372,
"preview": "use anyhow::Result;\nuse yazi_macro::{render, succ};\nuse yazi_parser::ArrowOpt;\nuse yazi_shared::data::Data;\nuse yazi_wid"
},
{
"path": "yazi-actor/src/cmp/close.rs",
"chars": 735,
"preview": "use std::mem;\n\nuse anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::cmp::CloseOpt;\nuse yazi_shared:"
},
{
"path": "yazi-actor/src/cmp/mod.rs",
"chars": 49,
"preview": "yazi_macro::mod_flat!(arrow close show trigger);\n"
},
{
"path": "yazi-actor/src/cmp/show.rs",
"chars": 1862,
"preview": "use std::{mem, ops::ControlFlow};\n\nuse anyhow::Result;\nuse yazi_macro::{render, succ};\nuse yazi_parser::cmp::{CmpItem, S"
},
{
"path": "yazi-actor/src/cmp/trigger.rs",
"chars": 4495,
"preview": "use std::{io, mem};\n\nuse anyhow::Result;\nuse yazi_fs::{path::clean_url, provider::{DirReader, FileHolder}};\nuse yazi_mac"
},
{
"path": "yazi-actor/src/confirm/arrow.rs",
"chars": 579,
"preview": "use anyhow::Result;\nuse yazi_macro::{render, succ};\nuse yazi_parser::ArrowOpt;\nuse yazi_shared::data::Data;\n\nuse crate::"
},
{
"path": "yazi-actor/src/confirm/close.rs",
"chars": 399,
"preview": "use anyhow::Result;\nuse yazi_macro::{render, succ};\nuse yazi_parser::confirm::CloseOpt;\nuse yazi_shared::data::Data;\n\nus"
},
{
"path": "yazi-actor/src/confirm/mod.rs",
"chars": 41,
"preview": "yazi_macro::mod_flat!(arrow close show);\n"
},
{
"path": "yazi-actor/src/confirm/show.rs",
"chars": 604,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::confirm::ShowOpt;\nuse yazi_shared::data::Data;"
},
{
"path": "yazi-actor/src/context.rs",
"chars": 2799,
"preview": "use std::ops::{Deref, DerefMut};\n\nuse anyhow::{Result, anyhow};\nuse yazi_core::{Core, mgr::Tabs, tab::{Folder, Tab}, tas"
},
{
"path": "yazi-actor/src/core/mod.rs",
"chars": 34,
"preview": "yazi_macro::mod_flat!(preflight);\n"
},
{
"path": "yazi-actor/src/core/preflight.rs",
"chars": 1071,
"preview": "use anyhow::Result;\nuse mlua::{ErrorContext, ExternalError, IntoLua, Value};\nuse yazi_binding::runtime_scope;\nuse yazi_d"
},
{
"path": "yazi-actor/src/help/arrow.rs",
"chars": 373,
"preview": "use anyhow::Result;\nuse yazi_macro::{render, succ};\nuse yazi_parser::ArrowOpt;\nuse yazi_shared::data::Data;\nuse yazi_wid"
},
{
"path": "yazi-actor/src/help/escape.rs",
"chars": 519,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::VoidOpt;\nuse yazi_shared::data::Data;\n\nuse cra"
},
{
"path": "yazi-actor/src/help/filter.rs",
"chars": 414,
"preview": "use anyhow::Result;\nuse yazi_macro::{render, succ};\nuse yazi_parser::VoidOpt;\nuse yazi_shared::data::Data;\n\nuse crate::{"
},
{
"path": "yazi-actor/src/help/mod.rs",
"chars": 51,
"preview": "yazi_macro::mod_flat!(arrow escape filter toggle);\n"
},
{
"path": "yazi-actor/src/help/toggle.rs",
"chars": 536,
"preview": "use anyhow::Result;\nuse yazi_macro::{render, succ};\nuse yazi_parser::help::ToggleOpt;\nuse yazi_shared::data::Data;\n\nuse "
},
{
"path": "yazi-actor/src/input/close.rs",
"chars": 652,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::input::CloseOpt;\nuse yazi_shared::data::Data;\n"
},
{
"path": "yazi-actor/src/input/complete.rs",
"chars": 464,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, succ};\nuse yazi_shared::data::Data;\nuse yazi_widgets::input::parser::CompleteO"
},
{
"path": "yazi-actor/src/input/escape.rs",
"chars": 671,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::VoidOpt;\nuse yazi_shared::data::Data;\nuse yazi"
},
{
"path": "yazi-actor/src/input/mod.rs",
"chars": 51,
"preview": "yazi_macro::mod_flat!(close complete escape show);\n"
},
{
"path": "yazi-actor/src/input/show.rs",
"chars": 573,
"preview": "use std::ops::DerefMut;\n\nuse anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_shared::data::Data;\nuse yazi_"
},
{
"path": "yazi-actor/src/lib.rs",
"chars": 167,
"preview": "extern crate self as yazi_actor;\n\nyazi_macro::mod_pub!(app cmp confirm core help input lives mgr notify pick spot tasks "
},
{
"path": "yazi-actor/src/lives/core.rs",
"chars": 1667,
"preview": "use std::ops::Deref;\n\nuse mlua::{AnyUserData, IntoLua, MetaMethod, UserData, Value};\nuse paste::paste;\n\nuse super::{Live"
},
{
"path": "yazi-actor/src/lives/file.rs",
"chars": 4930,
"preview": "use std::{ops::Deref, ptr};\n\nuse mlua::{AnyUserData, IntoLua, UserData, UserDataFields, UserDataMethods, Value};\nuse yaz"
},
{
"path": "yazi-actor/src/lives/files.rs",
"chars": 1299,
"preview": "use std::ops::{Deref, Range};\n\nuse mlua::{AnyUserData, MetaMethod, UserData, UserDataFields, UserDataMethods, Value};\nus"
},
{
"path": "yazi-actor/src/lives/filter.rs",
"chars": 616,
"preview": "use std::ops::Deref;\n\nuse mlua::{AnyUserData, MetaMethod, UserData, UserDataMethods};\n\nuse super::{Lives, PtrCell};\n\npub"
},
{
"path": "yazi-actor/src/lives/finder.rs",
"chars": 644,
"preview": "use std::ops::Deref;\n\nuse mlua::{AnyUserData, MetaMethod, UserData, UserDataMethods};\n\nuse super::{Lives, PtrCell};\n\npub"
},
{
"path": "yazi-actor/src/lives/folder.rs",
"chars": 1790,
"preview": "use std::ops::{Deref, Range};\n\nuse mlua::{AnyUserData, UserData, UserDataFields, Value};\nuse yazi_binding::{FolderStage,"
},
{
"path": "yazi-actor/src/lives/lives.rs",
"chars": 1238,
"preview": "use std::cell::RefCell;\n\nuse hashbrown::HashMap;\nuse mlua::{AnyUserData, UserData};\nuse scopeguard::defer;\nuse tracing::"
},
{
"path": "yazi-actor/src/lives/mod.rs",
"chars": 137,
"preview": "yazi_macro::mod_flat!(core file files filter finder folder lives mode preference preview ptr selected tab tabs task task"
},
{
"path": "yazi-actor/src/lives/mode.rs",
"chars": 915,
"preview": "use std::ops::Deref;\n\nuse mlua::{AnyUserData, MetaMethod, UserData, UserDataFields, UserDataMethods};\n\nuse super::{Lives"
},
{
"path": "yazi-actor/src/lives/preference.rs",
"chars": 1485,
"preview": "use std::ops::Deref;\n\nuse mlua::{AnyUserData, UserData, UserDataFields, Value};\nuse yazi_binding::cached_field;\n\nuse sup"
},
{
"path": "yazi-actor/src/lives/preview.rs",
"chars": 967,
"preview": "use std::ops::Deref;\n\nuse mlua::{AnyUserData, UserData, UserDataFields, Value};\nuse yazi_binding::cached_field;\nuse yazi"
},
{
"path": "yazi-actor/src/lives/ptr.rs",
"chars": 748,
"preview": "use std::{hash::{Hash, Hasher}, ops::Deref};\n\npub(super) struct PtrCell<T>(pub(super) *const T);\n\nimpl<T> Deref for PtrC"
},
{
"path": "yazi-actor/src/lives/selected.rs",
"chars": 401,
"preview": "use mlua::AnyUserData;\n\nuse super::Lives;\nuse crate::lives::PtrCell;\n\n#[derive(Clone, Copy)]\npub(super) struct Selected;"
},
{
"path": "yazi-actor/src/lives/tab.rs",
"chars": 2046,
"preview": "use std::{borrow::Cow, ops::Deref};\n\nuse mlua::{AnyUserData, UserData, UserDataFields, UserDataMethods, Value};\nuse yazi"
},
{
"path": "yazi-actor/src/lives/tabs.rs",
"chars": 931,
"preview": "use std::ops::Deref;\n\nuse mlua::{AnyUserData, MetaMethod, UserData, UserDataFields, UserDataMethods};\n\nuse super::{Lives"
},
{
"path": "yazi-actor/src/lives/task.rs",
"chars": 1205,
"preview": "use std::ops::Deref;\n\nuse mlua::{AnyUserData, LuaSerdeExt, UserData, UserDataFields, Value};\nuse yazi_binding::{SER_OPT,"
},
{
"path": "yazi-actor/src/lives/tasks.rs",
"chars": 1082,
"preview": "use std::ops::Deref;\n\nuse mlua::{AnyUserData, LuaSerdeExt, UserData, UserDataFields, Value};\nuse yazi_binding::{SER_OPT,"
},
{
"path": "yazi-actor/src/lives/which.rs",
"chars": 1093,
"preview": "use std::ops::Deref;\n\nuse mlua::{AnyUserData, UserData, UserDataFields, Value};\nuse yazi_binding::cached_field;\n\nuse sup"
},
{
"path": "yazi-actor/src/lives/yanked.rs",
"chars": 1189,
"preview": "use std::ops::Deref;\n\nuse mlua::{AnyUserData, MetaMethod, MultiValue, ObjectLike, UserData, UserDataFields, UserDataMeth"
},
{
"path": "yazi-actor/src/mgr/arrow.rs",
"chars": 648,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::ArrowOpt;\nuse yazi_shared::data::Data;\n\nuse cr"
},
{
"path": "yazi-actor/src/mgr/back.rs",
"chars": 434,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, succ};\nuse yazi_parser::{VoidOpt, mgr::CdSource};\nuse yazi_shared::data::Data;"
},
{
"path": "yazi-actor/src/mgr/bulk_rename.rs",
"chars": 8137,
"preview": "use std::{hash::Hash, io::{Read, Write}, ops::Deref, path::Path};\n\nuse anyhow::{Result, anyhow};\nuse crossterm::{execute"
},
{
"path": "yazi-actor/src/mgr/cd.rs",
"chars": 2475,
"preview": "use std::{mem, time::Duration};\n\nuse anyhow::Result;\nuse tokio::pin;\nuse tokio_stream::{StreamExt, wrappers::UnboundedRe"
},
{
"path": "yazi-actor/src/mgr/close.rs",
"chars": 409,
"preview": "use anyhow::Result;\nuse yazi_macro::act;\nuse yazi_parser::mgr::CloseOpt;\nuse yazi_shared::data::Data;\n\nuse crate::{Actor"
},
{
"path": "yazi-actor/src/mgr/copy.rs",
"chars": 1495,
"preview": "use anyhow::{Result, bail};\nuse yazi_macro::{act, succ};\nuse yazi_parser::mgr::CopyOpt;\nuse yazi_shared::{data::Data, st"
},
{
"path": "yazi-actor/src/mgr/create.rs",
"chars": 2074,
"preview": "use anyhow::{Result, bail};\nuse yazi_config::popup::{ConfirmCfg, InputCfg};\nuse yazi_fs::{File, FilesOp};\nuse yazi_macro"
},
{
"path": "yazi-actor/src/mgr/displace.rs",
"chars": 662,
"preview": "use anyhow::Result;\nuse yazi_macro::succ;\nuse yazi_parser::{VoidOpt, mgr::DisplaceDoOpt};\nuse yazi_proxy::MgrProxy;\nuse "
},
{
"path": "yazi-actor/src/mgr/displace_do.rs",
"chars": 831,
"preview": "use anyhow::{Result, bail};\nuse yazi_fs::FilesOp;\nuse yazi_macro::{act, succ};\nuse yazi_parser::mgr::{CdSource, Displace"
},
{
"path": "yazi-actor/src/mgr/download.rs",
"chars": 2047,
"preview": "use std::{mem, time::{Duration, Instant}};\n\nuse anyhow::Result;\nuse futures::{StreamExt, stream::FuturesUnordered};\nuse "
},
{
"path": "yazi-actor/src/mgr/enter.rs",
"chars": 521,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, succ};\nuse yazi_parser::{VoidOpt, mgr::CdSource};\nuse yazi_shared::{data::Data"
},
{
"path": "yazi-actor/src/mgr/escape.rs",
"chars": 3100,
"preview": "use anyhow::{Result, bail};\nuse yazi_macro::{act, render, render_and, succ};\nuse yazi_parser::{VoidOpt, mgr::EscapeOpt};"
},
{
"path": "yazi-actor/src/mgr/filter.rs",
"chars": 976,
"preview": "use std::time::Duration;\n\nuse anyhow::Result;\nuse tokio::pin;\nuse tokio_stream::{StreamExt, wrappers::UnboundedReceiverS"
},
{
"path": "yazi-actor/src/mgr/filter_do.rs",
"chars": 776,
"preview": "use anyhow::Result;\nuse yazi_fs::Filter;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::mgr::FilterOpt;\nuse yazi_"
},
{
"path": "yazi-actor/src/mgr/find.rs",
"chars": 915,
"preview": "use std::time::Duration;\n\nuse anyhow::Result;\nuse tokio::pin;\nuse tokio_stream::{StreamExt, wrappers::UnboundedReceiverS"
},
{
"path": "yazi-actor/src/mgr/find_arrow.rs",
"chars": 704,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::mgr::FindArrowOpt;\nuse yazi_shared::data::Data"
},
{
"path": "yazi-actor/src/mgr/find_do.rs",
"chars": 846,
"preview": "use anyhow::Result;\nuse yazi_core::tab::Finder;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::mgr::FindDoOpt;\nus"
},
{
"path": "yazi-actor/src/mgr/follow.rs",
"chars": 643,
"preview": "use anyhow::Result;\nuse yazi_fs::path::clean_url;\nuse yazi_macro::{act, succ};\nuse yazi_parser::{VoidOpt, mgr::CdSource}"
},
{
"path": "yazi-actor/src/mgr/forward.rs",
"chars": 444,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, succ};\nuse yazi_parser::{VoidOpt, mgr::CdSource};\nuse yazi_shared::data::Data;"
},
{
"path": "yazi-actor/src/mgr/hardlink.rs",
"chars": 489,
"preview": "use anyhow::Result;\nuse yazi_macro::succ;\nuse yazi_parser::mgr::HardlinkOpt;\nuse yazi_shared::data::Data;\n\nuse crate::{A"
},
{
"path": "yazi-actor/src/mgr/hidden.rs",
"chars": 1449,
"preview": "use anyhow::Result;\nuse yazi_core::tab::Folder;\nuse yazi_dds::spark::SparkKind;\nuse yazi_fs::FolderStage;\nuse yazi_macro"
},
{
"path": "yazi-actor/src/mgr/hover.rs",
"chars": 1010,
"preview": "use anyhow::Result;\nuse yazi_dds::Pubsub;\nuse yazi_macro::{err, render, succ, tab};\nuse yazi_parser::mgr::HoverOpt;\nuse "
},
{
"path": "yazi-actor/src/mgr/leave.rs",
"chars": 596,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, succ};\nuse yazi_parser::{VoidOpt, mgr::CdSource};\nuse yazi_shared::{data::Data"
},
{
"path": "yazi-actor/src/mgr/linemode.rs",
"chars": 457,
"preview": "use anyhow::Result;\nuse yazi_macro::{render, succ};\nuse yazi_parser::mgr::LinemodeOpt;\nuse yazi_shared::data::Data;\n\nuse"
},
{
"path": "yazi-actor/src/mgr/link.rs",
"chars": 467,
"preview": "use anyhow::Result;\nuse yazi_macro::succ;\nuse yazi_parser::mgr::LinkOpt;\nuse yazi_shared::data::Data;\n\nuse crate::{Actor"
},
{
"path": "yazi-actor/src/mgr/mod.rs",
"chars": 559,
"preview": "yazi_macro::mod_flat!(\n\tarrow\n\tback\n\tbulk_rename\n\tcd\n\tclose\n\tcopy\n\tcreate\n\tdisplace\n\tdisplace_do\n\tdownload\n\tenter\n\tescap"
},
{
"path": "yazi-actor/src/mgr/open.rs",
"chars": 1786,
"preview": "use anyhow::Result;\nuse yazi_boot::ARGS;\nuse yazi_fs::File;\nuse yazi_macro::{act, succ};\nuse yazi_parser::mgr::{OpenDoOp"
},
{
"path": "yazi-actor/src/mgr/open_do.rs",
"chars": 2080,
"preview": "use anyhow::Result;\nuse hashbrown::HashMap;\nuse yazi_config::{YAZI, popup::PickCfg};\nuse yazi_macro::succ;\nuse yazi_pars"
},
{
"path": "yazi-actor/src/mgr/paste.rs",
"chars": 667,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, succ};\nuse yazi_parser::mgr::PasteOpt;\nuse yazi_shared::data::Data;\n\nuse crate"
},
{
"path": "yazi-actor/src/mgr/peek.rs",
"chars": 1373,
"preview": "use anyhow::Result;\nuse yazi_macro::succ;\nuse yazi_parser::mgr::PeekOpt;\nuse yazi_shared::data::Data;\n\nuse crate::{Actor"
},
{
"path": "yazi-actor/src/mgr/quit.rs",
"chars": 1698,
"preview": "use std::time::Duration;\n\nuse anyhow::Result;\nuse tokio::{select, time};\nuse yazi_config::popup::ConfirmCfg;\nuse yazi_dd"
},
{
"path": "yazi-actor/src/mgr/refresh.rs",
"chars": 1465,
"preview": "use anyhow::Result;\nuse yazi_core::tab::Folder;\nuse yazi_fs::{CWD, Files, FilesOp, cha::Cha};\nuse yazi_macro::{act, succ"
},
{
"path": "yazi-actor/src/mgr/remove.rs",
"chars": 1419,
"preview": "use anyhow::Result;\nuse yazi_config::popup::ConfirmCfg;\nuse yazi_macro::{act, succ};\nuse yazi_parser::mgr::RemoveOpt;\nus"
},
{
"path": "yazi-actor/src/mgr/rename.rs",
"chars": 3306,
"preview": "use anyhow::Result;\nuse yazi_config::popup::{ConfirmCfg, InputCfg};\nuse yazi_dds::Pubsub;\nuse yazi_fs::{File, FilesOp};\n"
},
{
"path": "yazi-actor/src/mgr/reveal.rs",
"chars": 1047,
"preview": "use anyhow::Result;\nuse yazi_fs::{File, FilesOp};\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::mgr::RevealOpt;\n"
},
{
"path": "yazi-actor/src/mgr/search.rs",
"chars": 3035,
"preview": "use std::{borrow::Cow, time::Duration};\n\nuse anyhow::Result;\nuse tokio::pin;\nuse tokio_stream::{StreamExt, wrappers::Unb"
},
{
"path": "yazi-actor/src/mgr/seek.rs",
"chars": 723,
"preview": "use anyhow::Result;\nuse yazi_config::YAZI;\nuse yazi_macro::succ;\nuse yazi_parser::mgr::SeekOpt;\nuse yazi_plugin::isolate"
},
{
"path": "yazi-actor/src/mgr/shell.rs",
"chars": 1270,
"preview": "use std::borrow::Cow;\n\nuse anyhow::Result;\nuse yazi_config::popup::InputCfg;\nuse yazi_macro::{act, succ};\nuse yazi_parse"
},
{
"path": "yazi-actor/src/mgr/sort.rs",
"chars": 1879,
"preview": "use anyhow::Result;\nuse yazi_core::tab::Folder;\nuse yazi_dds::spark::SparkKind;\nuse yazi_fs::{FilesSorter, FolderStage};"
},
{
"path": "yazi-actor/src/mgr/spot.rs",
"chars": 868,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, succ};\nuse yazi_parser::mgr::SpotOpt;\nuse yazi_shared::{data::Data, pool::Inte"
},
{
"path": "yazi-actor/src/mgr/stash.rs",
"chars": 689,
"preview": "use anyhow::Result;\nuse yazi_dds::spark::SparkKind;\nuse yazi_macro::succ;\nuse yazi_parser::mgr::StashOpt;\nuse yazi_share"
},
{
"path": "yazi-actor/src/mgr/suspend.rs",
"chars": 407,
"preview": "use anyhow::Result;\nuse yazi_macro::succ;\nuse yazi_parser::VoidOpt;\nuse yazi_shared::data::Data;\n\nuse crate::{Actor, Ctx"
},
{
"path": "yazi-actor/src/mgr/tab_close.rs",
"chars": 741,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::mgr::TabCloseOpt;\nuse yazi_shared::data::Data;"
},
{
"path": "yazi-actor/src/mgr/tab_create.rs",
"chars": 1467,
"preview": "use anyhow::Result;\nuse yazi_core::tab::Tab;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::mgr::{CdSource, TabCr"
},
{
"path": "yazi-actor/src/mgr/tab_rename.rs",
"chars": 941,
"preview": "use std::borrow::Cow;\n\nuse anyhow::Result;\nuse yazi_config::popup::InputCfg;\nuse yazi_macro::{act, render, succ};\nuse ya"
},
{
"path": "yazi-actor/src/mgr/tab_swap.rs",
"chars": 585,
"preview": "use anyhow::Result;\nuse yazi_dds::Pubsub;\nuse yazi_macro::{err, render, succ};\nuse yazi_parser::ArrowOpt;\nuse yazi_share"
},
{
"path": "yazi-actor/src/mgr/tab_switch.rs",
"chars": 729,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::mgr::TabSwitchOpt;\nuse yazi_shared::data::Data"
},
{
"path": "yazi-actor/src/mgr/toggle.rs",
"chars": 859,
"preview": "use anyhow::Result;\nuse yazi_macro::{render_and, succ};\nuse yazi_parser::mgr::ToggleOpt;\nuse yazi_proxy::NotifyProxy;\nus"
},
{
"path": "yazi-actor/src/mgr/toggle_all.rs",
"chars": 1394,
"preview": "use anyhow::Result;\nuse yazi_macro::{render, succ};\nuse yazi_parser::mgr::ToggleAllOpt;\nuse yazi_proxy::NotifyProxy;\nuse"
},
{
"path": "yazi-actor/src/mgr/unyank.rs",
"chars": 533,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::VoidOpt;\nuse yazi_shared::data::Data;\n\nuse cra"
},
{
"path": "yazi-actor/src/mgr/update_files.rs",
"chars": 2851,
"preview": "use anyhow::Result;\nuse yazi_core::tab::Folder;\nuse yazi_fs::FilesOp;\nuse yazi_macro::{act, render, succ};\nuse yazi_pars"
},
{
"path": "yazi-actor/src/mgr/update_mimes.rs",
"chars": 1367,
"preview": "use anyhow::Result;\nuse hashbrown::HashMap;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::mgr::UpdateMimesOpt;\nu"
},
{
"path": "yazi-actor/src/mgr/update_paged.rs",
"chars": 623,
"preview": "use anyhow::Result;\nuse yazi_macro::succ;\nuse yazi_parser::mgr::UpdatePagedOpt;\nuse yazi_shared::data::Data;\n\nuse crate:"
},
{
"path": "yazi-actor/src/mgr/update_peeked.rs",
"chars": 553,
"preview": "use anyhow::Result;\nuse yazi_macro::{render, succ};\nuse yazi_parser::mgr::UpdatePeekedOpt;\nuse yazi_shared::data::Data;\n"
},
{
"path": "yazi-actor/src/mgr/update_spotted.rs",
"chars": 824,
"preview": "use anyhow::Result;\nuse yazi_macro::{render, succ};\nuse yazi_parser::mgr::UpdateSpottedOpt;\nuse yazi_shared::data::Data;"
},
{
"path": "yazi-actor/src/mgr/update_yanked.rs",
"chars": 532,
"preview": "use anyhow::Result;\nuse yazi_core::mgr::Yanked;\nuse yazi_macro::{render, succ};\nuse yazi_parser::mgr::UpdateYankedOpt;\nu"
},
{
"path": "yazi-actor/src/mgr/upload.rs",
"chars": 391,
"preview": "use anyhow::Result;\nuse yazi_macro::succ;\nuse yazi_parser::mgr::UploadOpt;\nuse yazi_shared::data::Data;\n\nuse crate::{Act"
},
{
"path": "yazi-actor/src/mgr/visual_mode.rs",
"chars": 613,
"preview": "use std::collections::BTreeSet;\n\nuse anyhow::Result;\nuse yazi_core::tab::Mode;\nuse yazi_macro::{render, succ};\nuse yazi_"
},
{
"path": "yazi-actor/src/mgr/watch.rs",
"chars": 532,
"preview": "use std::iter;\n\nuse anyhow::Result;\nuse yazi_macro::succ;\nuse yazi_parser::VoidOpt;\nuse yazi_shared::data::Data;\n\nuse cr"
},
{
"path": "yazi-actor/src/mgr/yank.rs",
"chars": 566,
"preview": "use anyhow::Result;\nuse yazi_core::mgr::Yanked;\nuse yazi_macro::{act, render};\nuse yazi_parser::mgr::YankOpt;\nuse yazi_s"
},
{
"path": "yazi-actor/src/notify/mod.rs",
"chars": 34,
"preview": "yazi_macro::mod_flat!(push tick);\n"
},
{
"path": "yazi-actor/src/notify/push.rs",
"chars": 840,
"preview": "use std::time::Instant;\n\nuse anyhow::Result;\nuse yazi_core::notify::Message;\nuse yazi_dds::spark::SparkKind;\nuse yazi_ma"
},
{
"path": "yazi-actor/src/notify/tick.rs",
"chars": 1589,
"preview": "use std::time::Duration;\n\nuse anyhow::Result;\nuse ratatui::layout::Rect;\nuse yazi_core::notify::Notify;\nuse yazi_emulato"
},
{
"path": "yazi-actor/src/pick/arrow.rs",
"chars": 373,
"preview": "use anyhow::Result;\nuse yazi_macro::{render, succ};\nuse yazi_parser::ArrowOpt;\nuse yazi_shared::data::Data;\nuse yazi_wid"
},
{
"path": "yazi-actor/src/pick/close.rs",
"chars": 529,
"preview": "use anyhow::Result;\nuse yazi_macro::{render, succ};\nuse yazi_parser::pick::CloseOpt;\nuse yazi_shared::data::Data;\n\nuse c"
},
{
"path": "yazi-actor/src/pick/mod.rs",
"chars": 41,
"preview": "yazi_macro::mod_flat!(arrow close show);\n"
},
{
"path": "yazi-actor/src/pick/show.rs",
"chars": 530,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::pick::ShowOpt;\nuse yazi_shared::data::Data;\n\nu"
},
{
"path": "yazi-actor/src/spot/arrow.rs",
"chars": 667,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::ArrowOpt;\nuse yazi_shared::data::Data;\n\nuse cr"
},
{
"path": "yazi-actor/src/spot/close.rs",
"chars": 321,
"preview": "use anyhow::Result;\nuse yazi_macro::succ;\nuse yazi_parser::VoidOpt;\nuse yazi_shared::data::Data;\n\nuse crate::{Actor, Ctx"
},
{
"path": "yazi-actor/src/spot/copy.rs",
"chars": 722,
"preview": "use anyhow::Result;\nuse yazi_macro::succ;\nuse yazi_parser::spot::CopyOpt;\nuse yazi_shared::data::Data;\nuse yazi_widgets:"
},
{
"path": "yazi-actor/src/spot/mod.rs",
"chars": 47,
"preview": "yazi_macro::mod_flat!(arrow close copy swipe);\n"
},
{
"path": "yazi-actor/src/spot/swipe.rs",
"chars": 338,
"preview": "use anyhow::Result;\nuse yazi_macro::act;\nuse yazi_parser::ArrowOpt;\nuse yazi_shared::data::Data;\n\nuse crate::{Actor, Ctx"
},
{
"path": "yazi-actor/src/tasks/arrow.rs",
"chars": 504,
"preview": "use anyhow::Result;\nuse yazi_core::tasks::Tasks;\nuse yazi_macro::{render, succ};\nuse yazi_parser::ArrowOpt;\nuse yazi_sha"
},
{
"path": "yazi-actor/src/tasks/cancel.rs",
"chars": 547,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::VoidOpt;\nuse yazi_shared::data::Data;\n\nuse cra"
},
{
"path": "yazi-actor/src/tasks/close.rs",
"chars": 468,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::VoidOpt;\nuse yazi_shared::data::Data;\n\nuse cra"
},
{
"path": "yazi-actor/src/tasks/inspect.rs",
"chars": 2068,
"preview": "use std::io::Write;\n\nuse anyhow::Result;\nuse crossterm::{execute, terminal::{disable_raw_mode, enable_raw_mode}};\nuse sc"
},
{
"path": "yazi-actor/src/tasks/mod.rs",
"chars": 102,
"preview": "yazi_macro::mod_flat!(arrow cancel close open_shell_compat inspect process_open show update_succeed);\n"
},
{
"path": "yazi-actor/src/tasks/open_shell_compat.rs",
"chars": 398,
"preview": "use anyhow::Result;\nuse yazi_macro::succ;\nuse yazi_parser::tasks::ProcessOpenOpt;\nuse yazi_shared::data::Data;\n\nuse crat"
},
{
"path": "yazi-actor/src/tasks/process_open.rs",
"chars": 374,
"preview": "use anyhow::Result;\nuse yazi_macro::succ;\nuse yazi_parser::tasks::ProcessOpenOpt;\nuse yazi_shared::data::Data;\n\nuse crat"
},
{
"path": "yazi-actor/src/tasks/show.rs",
"chars": 469,
"preview": "use anyhow::Result;\nuse yazi_macro::{act, render, succ};\nuse yazi_parser::VoidOpt;\nuse yazi_shared::data::Data;\n\nuse cra"
},
{
"path": "yazi-actor/src/tasks/update_succeed.rs",
"chars": 383,
"preview": "use anyhow::Result;\nuse yazi_macro::succ;\nuse yazi_parser::tasks::UpdateSucceedOpt;\nuse yazi_shared::data::Data;\n\nuse cr"
},
{
"path": "yazi-actor/src/which/activate.rs",
"chars": 885,
"preview": "use anyhow::Result;\nuse yazi_core::which::WhichSorter;\nuse yazi_dds::spark::SparkKind;\nuse yazi_macro::{render, succ};\nu"
},
{
"path": "yazi-actor/src/which/dismiss.rs",
"chars": 324,
"preview": "use anyhow::Result;\nuse yazi_macro::succ;\nuse yazi_parser::VoidOpt;\nuse yazi_shared::data::Data;\n\nuse crate::{Actor, Ctx"
},
{
"path": "yazi-actor/src/which/mod.rs",
"chars": 41,
"preview": "yazi_macro::mod_flat!(activate dismiss);\n"
},
{
"path": "yazi-adapter/Cargo.toml",
"chars": 1450,
"preview": "[package]\nname = \"yazi-adapter\"\ndescription = \"Yazi image adapter\"\nversion.workspace ="
},
{
"path": "yazi-adapter/README.md",
"chars": 198,
"preview": "# yazi-adapter\n\nThis crate is part of [Yazi][source], and it is not supposed to be used outside, as there are no guarant"
},
{
"path": "yazi-adapter/src/adapter.rs",
"chars": 3253,
"preview": "use std::{env, fmt::Display, path::PathBuf};\n\nuse anyhow::Result;\nuse ratatui::layout::Rect;\nuse tracing::warn;\nuse yazi"
},
{
"path": "yazi-adapter/src/adapters.rs",
"chars": 1566,
"preview": "use std::ops::{Deref, DerefMut};\n\nuse crate::Adapter;\n\npub(super) struct Adapters(Vec<Adapter>);\n\nimpl Deref for Adapter"
},
{
"path": "yazi-adapter/src/drivers/chafa.rs",
"chars": 1910,
"preview": "use std::{io::Write, path::PathBuf, process::Stdio};\n\nuse ansi_to_tui::IntoText;\nuse anyhow::{Result, anyhow, bail};\nuse"
},
{
"path": "yazi-adapter/src/drivers/iip.rs",
"chars": 1873,
"preview": "use std::{fmt::Write, io::Write as ioWrite, path::PathBuf};\n\nuse anyhow::Result;\nuse base64::{Engine, engine::{Config, g"
},
{
"path": "yazi-adapter/src/drivers/kgp.rs",
"chars": 6970,
"preview": "use core::str;\nuse std::{io::Write, path::PathBuf};\n\nuse anyhow::Result;\nuse base64::{Engine, engine::general_purpose};\n"
},
{
"path": "yazi-adapter/src/drivers/kgp_old.rs",
"chars": 1945,
"preview": "use core::str;\nuse std::{io::Write, path::PathBuf};\n\nuse anyhow::Result;\nuse base64::{Engine, engine::general_purpose};\n"
},
{
"path": "yazi-adapter/src/drivers/mod.rs",
"chars": 61,
"preview": "yazi_macro::mod_flat!(chafa iip kgp kgp_old sixel ueberzug);\n"
},
{
"path": "yazi-adapter/src/drivers/sixel.rs",
"chars": 3218,
"preview": "use std::{io::Write, path::PathBuf};\n\nuse anyhow::{Result, bail};\nuse crossterm::{cursor::MoveTo, queue};\nuse image::{Dy"
},
{
"path": "yazi-adapter/src/drivers/ueberzug.rs",
"chars": 3946,
"preview": "use std::{path::PathBuf, process::Stdio};\n\nuse anyhow::{Result, bail};\nuse image::ImageReader;\nuse ratatui::layout::Rect"
},
{
"path": "yazi-adapter/src/icc.rs",
"chars": 2462,
"preview": "use anyhow::Context;\nuse image::{ColorType, DynamicImage, GrayAlphaImage, GrayImage, ImageDecoder, RgbImage, RgbaImage, "
},
{
"path": "yazi-adapter/src/image.rs",
"chars": 3903,
"preview": "use std::path::{Path, PathBuf};\n\nuse anyhow::Result;\nuse image::{DynamicImage, ImageDecoder, ImageError, ImageReader, Li"
},
{
"path": "yazi-adapter/src/info.rs",
"chars": 1074,
"preview": "use std::path::PathBuf;\n\nuse image::{ImageDecoder, ImageError};\n\npub type ImageFormat = image::ImageFormat;\npub type Ima"
},
{
"path": "yazi-adapter/src/lib.rs",
"chars": 1007,
"preview": "yazi_macro::mod_pub!(drivers);\n\nyazi_macro::mod_flat!(adapter adapters icc image info);\n\nuse yazi_emulator::{Brand, CLOS"
},
{
"path": "yazi-binding/Cargo.toml",
"chars": 1554,
"preview": "[package]\nname = \"yazi-binding\"\ndescription = \"Yazi Lua bindings\"\nversion.workspace = "
},
{
"path": "yazi-binding/README.md",
"chars": 198,
"preview": "# yazi-binding\n\nThis crate is part of [Yazi][source], and it is not supposed to be used outside, as there are no guarant"
}
]
// ... and 864 more files (download for full content)
About this extraction
This page contains the full source code of the sxyazi/yazi GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1064 files (1.8 MB), approximately 611.4k tokens, and a symbol index with 5242 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.