107 lines
2.9 KiB
Lua
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,
|
|
}
|