Files
dotfiles_arch/yazi/.config/yazi/plugins/bypass.yazi/main.lua
2026-01-19 21:05:12 +01:00

107 lines
2.9 KiB
Lua

---@since 25.3.2
-- For development
--[[ local function notify(message) ]]
--[[ ya.notify({ title = "Bypass", content = message, timeout = 5 }) ]]
--[[ end ]]
-- `ya.emit` as of 25.5.28
local emit = ya.emit or ya.manager_emit
---Returns the loading state of the current directory
---@type fun(): boolean
local is_directory_loading = ya.sync(function(_)
-- Try to use the v25.4.8 interface
local ok, res = pcall(cx.active.current.stage)
if ok then
return not res
-- Fallback to the v25.3.2 interface
else
return cx.active.current.stage.is_loading
end
end)
---Enter hovered item if it is a directory
---@type fun(use_smart_enter: boolean): boolean
local initial = ya.sync(function(_, use_smart_enter)
local hovered = cx.active.current.hovered
if hovered == nil then
return false
end
if not hovered.cha.is_dir then
-- Open file if using "smart enter"
if use_smart_enter then
emit("escape", { visual = true, select = true })
emit("open", { hovered = true })
end
return false
end
emit("escape", { visual = true, select = true })
emit("enter", { hovered = true })
return true
end)
---Enter hovered item if it is a directory and is the only item in the parent
---@type fun(): boolean
local bypass = ya.sync(function(_)
local hovered = cx.active.current.hovered
if hovered == nil or not hovered.cha.is_dir or #cx.active.current.files > 1 then
return false
end
emit("enter", { hovered = true })
return true
end)
---Leave the CWD, if the CWD has a parent
---@type fun(): boolean
local initial_rev = ya.sync(function(_)
if cx.active.parent == nil then
return false
end
emit("escape", { visual = true, select = true })
emit("leave", {})
return true
end)
---Leave the CWD, if the CWD has a parent and contains only one item
---@type fun(): boolean
local bypass_rev = ya.sync(function(_)
if cx.active.parent == nil or #cx.active.current.files > 1 then
return false
end
emit("leave", {})
return true
end)
return {
entry = function(_, job)
-- old version of Yazi will pass args directly, new version passes job. Below code ensures we derive args in both 0.3 and 0.4 Yazi API versions.
local args = job.args or job
local use_smart_enter = args and args[1] == "smart-enter"
local is_reverse = args and args[1] == "reverse"
-- Initial run, should behave like a regular enter/smart-enter/leave
local run = is_reverse and initial_rev() or initial(use_smart_enter)
while run do
-- Wait for directory to have loaded
while is_directory_loading() do
ya.sleep(0.002)
end
-- Conditional enter/smart-enter/leave
run = is_reverse and bypass_rev() or bypass()
end
end,
}