2451 lines
92 KiB
Lua
2451 lines
92 KiB
Lua
|
|
-- luacheck: globals Command Url cx fs ps rt th ui ya
|
|
|
|
---@alias Color string
|
|
---@alias Position integer
|
|
---@alias Stdio integer
|
|
|
|
---@alias Sendable nil|boolean|number|string|Url|{ [Sendable]: Sendable }
|
|
---@alias Renderable ui.Bar|ui.Border|ui.Clear|ui.Gauge|ui.Line|ui.List|ui.Text
|
|
|
|
---@class (exact) Pos
|
|
---@field [1] "top-left"|"top-center"|"top-right"|"bottom-left"|"bottom-center"|"bottom-right"|"center"|"hovered"
|
|
---@field x integer
|
|
---@field y integer
|
|
---@field w integer
|
|
---@field h integer
|
|
---@overload fun(value: {
|
|
--- [1]: "top-left"|"top-center"|"top-right"|"bottom-left"|"bottom-center"|"bottom-right"|"center"|"hovered",
|
|
--- x: integer?, y: integer?, w: integer?, h: integer?,
|
|
---}): self
|
|
|
|
---@class (exact) Recv
|
|
---@field recv fun(self: self): string
|
|
|
|
---@type Command
|
|
Command = Command
|
|
---@type Url
|
|
Url = Url
|
|
---@type cx
|
|
cx = cx
|
|
---@type fs
|
|
fs = fs
|
|
---@type ps
|
|
ps = ps
|
|
---@type rt
|
|
rt = rt
|
|
---@type th
|
|
th = th
|
|
---@type ui
|
|
ui = ui
|
|
---@type ya
|
|
ya = ya
|
|
|
|
-- Create a Url:
|
|
-- ```lua
|
|
-- -- regular file
|
|
-- local url = Url("/root/Downloads/logo.png")
|
|
-- -- `bgm.mp3` from the archive `ost.zip`
|
|
-- local url = Url("archive:///root/ost.zip#bgm.mp3")
|
|
-- ```
|
|
---@class (exact) Url
|
|
-- Filename of the url.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `string?` |
|
|
---@field name string?
|
|
-- Filename without the extension.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `string?` |
|
|
---@field stem string?
|
|
-- Url fragment.
|
|
-- Let's say the url `archive:///root/my-archive.zip#1.jpg`, the fragment `1.jpg`.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `string?` |
|
|
---@field frag string?
|
|
-- Parent directory.
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `Self?` |
|
|
---@field parent self?
|
|
-- Whether the file represented by the url is a regular file.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_regular boolean
|
|
-- Whether the file represented by the url is from an archive.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_archive boolean
|
|
-- Whether the path represented by the url has a root.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field has_root boolean
|
|
-- Join with `another` to create a new url.
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------------------ |
|
|
-- | `self` | `Self` |
|
|
-- | `another` | `Self` \| `string` |
|
|
-- | Return | `Self` |
|
|
---@field join fun(self: self, another: self|string): self
|
|
-- Whether the url starts with `another`.
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------------------ |
|
|
-- | `self` | `Self` |
|
|
-- | `another` | `Self` \| `string` |
|
|
-- | Return | `boolean` |
|
|
---@field starts_with fun(self: self, another: self|string): boolean
|
|
-- Whether the url ends with `another`.
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------------------ |
|
|
-- | `self` | `Self` |
|
|
-- | `another` | `Self` \| `string` |
|
|
-- | Return | `boolean` |
|
|
---@field ends_with fun(self: self, another: self|string): boolean
|
|
-- Strips the prefix of `another`.
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------------------ |
|
|
-- | `self` | `Self` |
|
|
-- | `another` | `Self` \| `string` |
|
|
-- | Return | `Self` |
|
|
---@field strip_prefix fun(self: self, another: self|string): self
|
|
-- Whether the url is equal to `another`.
|
|
-- | In/Out | Type |
|
|
-- | --------- | --------- |
|
|
-- | `self` | `Self` |
|
|
-- | `another` | `Self` |
|
|
-- | Return | `boolean` |
|
|
---@field __eq fun(self: self, another: self): boolean
|
|
-- Convert the url to string.
|
|
-- | In/Out | Type |
|
|
-- | ------ | -------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `string` |
|
|
---@field __tostring fun(self: self): string
|
|
-- Concatenate the url with `another`.
|
|
-- | In/Out | Type |
|
|
-- | --------- | -------- |
|
|
-- | `self` | `Self` |
|
|
-- | `another` | `string` |
|
|
-- | Return | `Self` |
|
|
---@field __concat fun(self: self, another: string): self
|
|
---@overload fun(value: string|self): Url
|
|
|
|
-- Cha means one file's characteristics.
|
|
---@class (exact) Cha
|
|
-- Whether the file is a directory.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_dir boolean
|
|
-- Whether the file is hidden.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_hidden boolean
|
|
-- Whether the file is a symlink.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_link boolean
|
|
-- Whether the file is a bad symlink, which points to a non-existent file.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_orphan boolean
|
|
-- Whether the file is dummy, which fails to load complete metadata, possibly the filesystem doesn't support it, such as FUSE.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_dummy boolean
|
|
-- Whether the file is a block device.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_block boolean
|
|
-- Whether the file is a character device.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_char boolean
|
|
-- Whether the file is a FIFO.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_fifo boolean
|
|
-- Whether the file is a socket.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_sock boolean
|
|
-- Whether the file is executable.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_exec boolean
|
|
-- Whether the file has the sticky bit set.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_sticky boolean
|
|
-- Length of the file in bytes.
|
|
-- If you want to get the size of a directory, use [`size()`](/docs/plugins/context#fs-file.size) instead.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field len integer
|
|
-- Accessed time of the file in Unix timestamp.
|
|
-- | | |
|
|
-- | ---- | ---------- |
|
|
-- | Type | `integer?` |
|
|
---@field atime integer?
|
|
-- Birth time of the file in Unix timestamp.
|
|
-- | | |
|
|
-- | ---- | ---------- |
|
|
-- | Type | `integer?` |
|
|
---@field btime integer?
|
|
-- Modified time of the file in Unix timestamp.
|
|
-- | | |
|
|
-- | ---- | ---------- |
|
|
-- | Type | `integer?` |
|
|
---@field mtime integer?
|
|
-- User id of the file.
|
|
-- | | |
|
|
-- | --------- | ---------------------- |
|
|
-- | Type | `integer?` |
|
|
-- | Available | Unix-like systems only |
|
|
---@field uid integer?
|
|
-- Group id of the file.
|
|
-- | | |
|
|
-- | --------- | ---------------------- |
|
|
-- | Type | `integer?` |
|
|
-- | Available | Unix-like systems only |
|
|
---@field gid integer?
|
|
-- Number of hard links to the file.
|
|
-- | | |
|
|
-- | --------- | ---------------------- |
|
|
-- | Type | `integer?` |
|
|
-- | Available | Unix-like systems only |
|
|
---@field nlink integer?
|
|
-- Unix permission representation, such as `drwxr-xr-x`.
|
|
-- | | |
|
|
-- | --------- | ---------------------- |
|
|
-- | Type | `string?` |
|
|
-- | Available | Unix-like systems only |
|
|
---@field perm string?
|
|
|
|
--
|
|
---@class (exact) File
|
|
-- Url of the file.
|
|
-- | | |
|
|
-- | ---- | ----- |
|
|
-- | Type | `Url` |
|
|
---@field url Url
|
|
-- Cha of the file.
|
|
-- | | |
|
|
-- | ---- | ----- |
|
|
-- | Type | `Cha` |
|
|
---@field cha Cha
|
|
-- Url of the file points to, if it's a symlink.
|
|
-- | | |
|
|
-- | ---- | ------ |
|
|
-- | Type | `Url?` |
|
|
---@field link_to Url?
|
|
-- Name of the file.
|
|
-- | | |
|
|
-- | ---- | -------- |
|
|
-- | Type | `string` |
|
|
---@field name string
|
|
|
|
--
|
|
---@class (exact) Icon
|
|
-- Text of the icon.
|
|
-- | | |
|
|
-- | ---- | -------- |
|
|
-- | Type | `string` |
|
|
---@field text string
|
|
-- [Style](/docs/plugins/layout#style) of the icon.
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `Style` |
|
|
---@field style ui.Style
|
|
|
|
--
|
|
---@class (exact) Error
|
|
-- Raw error code.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field code integer
|
|
-- Convert the error to string.
|
|
-- | In/Out | Type |
|
|
-- | ------ | -------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `string` |
|
|
---@field __tostring fun(self: self): string
|
|
-- Concatenate the error with `another`.
|
|
-- | In/Out | Type |
|
|
-- | --------- | -------- |
|
|
-- | `self` | `Self` |
|
|
-- | `another` | `string` |
|
|
-- | Return | `Error` |
|
|
---@field __concat fun(self: self, another: string): Error
|
|
|
|
--
|
|
---@class (exact) Window
|
|
-- Number of rows.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field rows integer
|
|
-- Number of columns.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field cols integer
|
|
-- Width in pixels.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field width integer
|
|
-- Height in pixels.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field height integer
|
|
|
|
|
|
-- A Rect is represented an area within the terminal by four attributes:
|
|
-- ```lua
|
|
-- ui.Rect {
|
|
-- x = 10, -- x position
|
|
-- y = 10, -- y position
|
|
-- w = 20, -- width
|
|
-- h = 30, -- height
|
|
-- }
|
|
-- ui.Rect.default -- Equal to `ui.Rect { x = 0, y = 0, w = 0, h = 0 }`
|
|
-- ```
|
|
-- You can get a pre-computed `Rect` through [`ui.Layout()`](#layout).
|
|
-- Note that if you intend to create a `Rect` yourself, ensure these values are calculated accurately; otherwise, it may cause Yazi to crash!
|
|
---@class (exact) ui.Rect
|
|
-- X position of the rect.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field x integer
|
|
-- Y position of the rect.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field y integer
|
|
-- Width of the rect.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field w integer
|
|
-- Height of the rect.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field h integer
|
|
-- Left position of the rect.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field left integer
|
|
-- Right position of the rect.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field right integer
|
|
-- Top position of the rect.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field top integer
|
|
-- Bottom position of the rect.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field bottom integer
|
|
-- Apply a `padding` to the rect.
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `padding` | [`Pad`](#pad) |
|
|
-- | Return | `self` |
|
|
---@field pad fun(self: self, padding: ui.Pad): self
|
|
---@overload fun(value: { x: integer?, y: integer?, w: integer?, h: integer? }): ui.Rect
|
|
|
|
-- `Pad` represents a padding, and all of its parameters are integers:
|
|
-- ```lua
|
|
-- ui.Pad(top, right, bottom, left)
|
|
-- ```
|
|
---@class (exact) ui.Pad
|
|
-- Top padding.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field top integer
|
|
-- Right padding.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field right integer
|
|
-- Bottom padding.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field bottom integer
|
|
-- Left padding.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field left integer
|
|
-- Create a padding with only top value, which is equal to `ui.Pad(top, 0, 0, 0)`.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `top` | `integer` |
|
|
-- | Return | `Self` |
|
|
---@field top fun(top: integer): self
|
|
-- Create a padding with only right value, which is equal to `ui.Pad(0, right, 0, 0)`.
|
|
-- | In/Out | Type |
|
|
-- | ------- | --------- |
|
|
-- | `right` | `integer` |
|
|
-- | Return | `Self` |
|
|
---@field right fun(right: integer): self
|
|
-- Create a padding with only bottom value, which is equal to `ui.Pad(0, 0, bottom, 0)`.
|
|
-- | In/Out | Type |
|
|
-- | -------- | --------- |
|
|
-- | `bottom` | `integer` |
|
|
-- | Return | `Self` |
|
|
---@field bottom fun(bottom: integer): self
|
|
-- Create a padding with only left value, which is equal to `ui.Pad(0, 0, 0, left)`.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `left` | `integer` |
|
|
-- | Return | `Self` |
|
|
---@field left fun(left: integer): self
|
|
-- Create a padding on both x-axis, which is equal to `ui.Pad(0, x, 0, x)`.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `x` | `integer` |
|
|
-- | Return | `Self` |
|
|
---@field x fun(x: integer): self
|
|
-- Create a padding on both y-axis, which is equal to `ui.Pad(y, 0, y, 0)`.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `y` | `integer` |
|
|
-- | Return | `Self` |
|
|
---@field y fun(y: integer): self
|
|
-- Create a padding on both x and y-axis, which is equal to `ui.Pad(y, x, y, x)`.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `x` | `integer` |
|
|
-- | `y` | `integer` |
|
|
-- | Return | `Self` |
|
|
---@field xy fun(x: integer, y: integer): self
|
|
---@overload fun(top: integer, right: integer, bottom: integer, left: integer): ui.Pad
|
|
|
|
-- Create a style:
|
|
-- ```lua
|
|
-- ui.Style()
|
|
-- ```
|
|
---@class (exact) ui.Style
|
|
-- Apply a foreground color.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ------------------------------------------------ |
|
|
-- | `self` | `Self` |
|
|
-- | `color` | [`Color`](/docs/configuration/theme#types.color) |
|
|
-- | Return | `self` |
|
|
---@field fg fun(self: self, color: Color): self
|
|
-- Apply a background color.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ------------------------------------------------ |
|
|
-- | `self` | `Self` |
|
|
-- | `color` | [`Color`](/docs/configuration/theme#types.color) |
|
|
-- | Return | `self` |
|
|
---@field bg fun(self: self, color: Color): self
|
|
-- Apply a bold style.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------ |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `self` |
|
|
---@field bold fun(self: self): self
|
|
-- Apply a dim style.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------ |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `self` |
|
|
---@field dim fun(self: self): self
|
|
-- Apply an italic style.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------ |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `self` |
|
|
---@field italic fun(self: self): self
|
|
-- Apply an underline style.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------ |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `self` |
|
|
---@field underline fun(self: self): self
|
|
-- Apply a blink style.
|
|
-- Note that this style may not be supported by all terminals.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------ |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `self` |
|
|
---@field blink fun(self: self): self
|
|
-- Apply a rapid blink style.
|
|
-- Note that this style may not be supported by all terminals.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------ |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `self` |
|
|
---@field blink_rapid fun(self: self): self
|
|
-- Apply a reverse style.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------ |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `self` |
|
|
---@field reverse fun(self: self): self
|
|
-- Apply a hidden style.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------ |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `self` |
|
|
---@field hidden fun(self: self): self
|
|
-- Apply a crossed style.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------ |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `self` |
|
|
---@field crossed fun(self: self): self
|
|
-- Apply a reset style.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------ |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `self` |
|
|
---@field reset fun(self: self): self
|
|
-- Patch the style with `another`.
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------ |
|
|
-- | `self` | `Self` |
|
|
-- | `another` | `Self` |
|
|
-- | Return | `self` |
|
|
---@field patch fun(self: self, another: self): self
|
|
---@overload fun(): ui.Style
|
|
|
|
-- `ui.Span` is the smallest unit of text, yet a component of `ui.Line`. Create a span:
|
|
-- ```lua
|
|
-- ui.Span("foo")
|
|
-- ```
|
|
-- For convenience, `ui.Span` can also accept itself as a argument:
|
|
-- ```lua
|
|
-- ui.Span(ui.Span("bar"))
|
|
-- ```
|
|
---@class (exact) ui.Span
|
|
-- Whether the span is visible, i.e. includes any printable characters.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `boolean` |
|
|
---@field visible fun(self: self): boolean
|
|
-- Set the style of the span.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `style` | [`Style`](#style) |
|
|
-- | Return | `self` |
|
|
-- Besides applying the whole `Style`, you can also call those methods of `Style` directly on it, which means:
|
|
-- ```lua
|
|
-- local style = ui.Style():fg("white"):bg("black"):bold()
|
|
-- ui.Span("Hello world"):style(style)
|
|
-- ```
|
|
-- can be also written as:
|
|
-- ```lua
|
|
-- ui.Span("Hello world"):fg("white"):bg("black"):bold()
|
|
-- ```
|
|
---@field style fun(self: self, style: ui.Style): self
|
|
---@overload fun(value: string|self): ui.Span
|
|
|
|
-- `ui.Line` represents a line, consisting of multiple `ui.Span`s, and it accepts a table of them:
|
|
-- ```lua
|
|
-- ui.Line { ui.Span("foo"), ui.Span("bar") }
|
|
-- ```
|
|
-- For convenience, the following types are also supported:
|
|
-- ```lua
|
|
-- -- string
|
|
-- ui.Line("foo")
|
|
-- -- ui.Span
|
|
-- ui.Line(ui.Span("bar"))
|
|
-- -- ui.Line itself
|
|
-- ui.Line(ui.Line("baz"))
|
|
-- -- Mixed table of string, ui.Span, ui.Line
|
|
-- ui.Line { "foo", ui.Span("bar"), ui.Line("baz") }
|
|
-- ```
|
|
---@class (exact) ui.Line
|
|
-- Set the area of the line.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------------------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `rect` | [`Rect?`](#rect) |
|
|
-- | Return | `self` \| [`Rect`](#rect) |
|
|
-- If `rect` is not specified, it returns the current area.
|
|
---@field area fun(self: self, rect: ui.Rect?): self|ui.Rect
|
|
-- Calculate the width of the line.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `integer` |
|
|
---@field width fun(self: self): integer
|
|
-- Set the alignment of the line.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `align` | [`Align`](#align) |
|
|
-- | Return | `self` |
|
|
---@field align fun(self: self, align: ui.Align): self
|
|
-- Whether the line is visible, i.e. includes any printable characters.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `boolean` |
|
|
---@field visible fun(self: self): boolean
|
|
-- Set the style of the line.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `style` | [`Style`](#style) |
|
|
-- | Return | `self` |
|
|
-- Like with [`Span`](#span), you can also call the [`Style`](#style) methods on it directly:
|
|
-- ```lua
|
|
-- ui.Line("Hello world"):fg("white"):bg("black"):bold()
|
|
-- ```
|
|
---@field style fun(self: self, style: ui.Style): self
|
|
---@overload fun(value: string|ui.Span|self|(string|ui.Span|self)[]): ui.Line
|
|
|
|
-- `ui.Text` is used to represent multi-line text, it takes a table of `ui.Line`:
|
|
-- ```lua
|
|
-- ui.Text { ui.Line("foo"), ui.Line("bar") }
|
|
-- ```
|
|
-- For convenience, the following types are also supported:
|
|
-- ```lua
|
|
-- -- string
|
|
-- ui.Text("foo\nbar")
|
|
-- -- ui.Line
|
|
-- ui.Text(ui.Line("foo"))
|
|
-- -- ui.Span
|
|
-- ui.Text(ui.Span("bar"))
|
|
-- -- Mixed table of string, ui.Line, ui.Span
|
|
-- ui.Text { "foo", ui.Line("bar"), ui.Span("baz") }
|
|
-- ```
|
|
-- You can also use `ui.Text.parse(code)` to parse an [ANSI escape sequence](https://en.wikipedia.org/wiki/ANSI_escape_code) string into a text.
|
|
---@class (exact) ui.Text
|
|
-- Set the area of the text.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------------------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `rect` | [`Rect?`](#rect) |
|
|
-- | Return | `self` \| [`Rect`](#rect) |
|
|
-- If `rect` is not specified, it returns the current area.
|
|
---@field area fun(self: self, rect: ui.Rect?): self|ui.Rect
|
|
-- Set the alignment of the text.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `align` | [`Align`](#align) |
|
|
-- | Return | `self` |
|
|
---@field align fun(self: self, align: ui.Align): self
|
|
-- Set the wrap of the text.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `wrap` | [`Wrap`](#wrap) |
|
|
-- | Return | `self` |
|
|
---@field wrap fun(self: self, wrap: ui.Wrap): self
|
|
-- Calculate the maximum width of the text across all lines.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `integer` |
|
|
---@field max_width fun(self: self): integer
|
|
-- Set the style of the text.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `style` | [`Style`](#style) |
|
|
-- | Return | `self` |
|
|
-- Like with [`Span`](#span), you can also call the [`Style`](#style) methods on it directly:
|
|
-- ```lua
|
|
-- ui.Text("Hello world"):fg("white"):bg("black"):bold()
|
|
-- ```
|
|
---@field style fun(self: self, style: ui.Style): self
|
|
---@overload fun(value: string|ui.Span|ui.Line|(string|ui.Span|ui.Line)[]): ui.Text
|
|
|
|
-- Create a layout:
|
|
-- ```lua
|
|
-- local areas = ui.Layout()
|
|
-- :direction(ui.Layout.HORIZONTAL)
|
|
-- :constraints({ ui.Constraint.Percentage(50), ui.Constraint.Percentage(50) })
|
|
-- :split(area)
|
|
-- local left = areas[1] -- The first rect
|
|
-- local right = areas[2] -- The second rect
|
|
-- ```
|
|
---@class (exact) ui.Layout
|
|
-- Set the direction of the layout.
|
|
-- | In/Out | Type |
|
|
-- | ----------- | ----------- |
|
|
-- | `self` | `Self` |
|
|
-- | `direction` | `Direction` |
|
|
-- | Return | `self` |
|
|
-- The `direction` accepts the following constants:
|
|
-- - `ui.Layout.HORIZONTAL`
|
|
-- - `ui.Layout.VERTICAL`
|
|
---@field direction fun(self: self, direction: Direction): self
|
|
-- Set the margin of the layout.
|
|
-- | In/Out | Type | Note |
|
|
-- | -------- | --------- | ---------------- |
|
|
-- | `self` | `Self` | - |
|
|
-- | `margin` | `integer` | Positive integer |
|
|
-- | Return | `self` | - |
|
|
---@field margin fun(self: self, margin: integer): self
|
|
-- Set the horizontal margin of the layout.
|
|
-- | In/Out | Type | Note |
|
|
-- | -------- | --------- | ---------------- |
|
|
-- | `self` | `Self` | - |
|
|
-- | `margin` | `integer` | Positive integer |
|
|
-- | Return | `self` | - |
|
|
---@field margin_h fun(self: self, margin: integer): self
|
|
-- Set the vertical margin of the layout.
|
|
-- | In/Out | Type | Note |
|
|
-- | -------- | --------- | ---------------- |
|
|
-- | `self` | `Self` | - |
|
|
-- | `margin` | `integer` | Positive integer |
|
|
-- | Return | `self` | - |
|
|
---@field margin_v fun(self: self, margin: integer): self
|
|
-- Set the constraints of the layout.
|
|
-- | In/Out | Type |
|
|
-- | ------------- | ----------------------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `constraints` | [`Constraint[]`](#constraint) |
|
|
-- | Return | `self` |
|
|
---@field constraints fun(self: self, constraints: ui.Constraint[]): self
|
|
-- Split the layout into multiple [Rect](#rect)s according to the constraints.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `rect` | [`Rect`](#rect) |
|
|
-- | Return | [`Rect[]`](#rect) |
|
|
---@field split fun(self: self, rect: ui.Rect): ui.Rect[]
|
|
---@overload fun(): ui.Layout
|
|
|
|
-- A constraint that defines the size of a layout element.
|
|
-- Constraints can be used to specify a fixed size, a percentage of the available space, a ratio of
|
|
-- the available space, a minimum or maximum size or a fill proportional value for a layout
|
|
-- element.
|
|
-- Relative constraints (percentage, ratio) are calculated relative to the entire space being
|
|
-- divided, rather than the space available after applying more fixed constraints (min, max,
|
|
-- length).
|
|
-- Constraints are prioritized in the following order:
|
|
-- 1. `ui.Constraint.Min(min)`
|
|
-- 2. `ui.Constraint.Max(max)`
|
|
-- 3. `ui.Constraint.Length(len)`
|
|
-- 4. `ui.Constraint.Percentage(p)`
|
|
-- 5. `ui.Constraint.Ratio(num, den)`
|
|
-- 6. `ui.Constraint.Fill(scale)`
|
|
---@class (exact) ui.Constraint
|
|
-- Applies a minimum size constraint to the element.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `min` | `integer` |
|
|
-- | Return | `Self` |
|
|
-- The element size is set to at least the specified amount.
|
|
-- ```lua
|
|
-- -- { Percentage(100), Min(20) }
|
|
-- -- ┌────────────────────────────┐┌──────────────────┐
|
|
-- -- │ 30 px ││ 20 px │
|
|
-- -- └────────────────────────────┘└──────────────────┘
|
|
-- -- { Percentage(100), Min(10) }
|
|
-- -- ┌──────────────────────────────────────┐┌────────┐
|
|
-- -- │ 40 px ││ 10 px │
|
|
-- -- └──────────────────────────────────────┘└────────┘
|
|
-- ```
|
|
---@field Min fun(min: integer): self
|
|
-- Applies a maximum size constraint to the element.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `max` | `integer` |
|
|
-- | Return | `Self` |
|
|
-- The element size is set to at most the specified amount.
|
|
-- ```lua
|
|
-- -- { Percentage(0), Max(20) }
|
|
-- -- ┌────────────────────────────┐┌──────────────────┐
|
|
-- -- │ 30 px ││ 20 px │
|
|
-- -- └────────────────────────────┘└──────────────────┘
|
|
-- -- { Percentage(0), Max(10) }
|
|
-- -- ┌──────────────────────────────────────┐┌────────┐
|
|
-- -- │ 40 px ││ 10 px │
|
|
-- -- └──────────────────────────────────────┘└────────┘
|
|
-- ```
|
|
---@field Max fun(max: integer): self
|
|
-- Applies a length constraint to the element.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `len` | `integer` |
|
|
-- | Return | `Self` |
|
|
-- The element size is set to the specified amount:
|
|
-- ```lua
|
|
-- -- { Length(20), Length(20) }
|
|
-- -- ┌──────────────────┐┌──────────────────┐
|
|
-- -- │ 20 px ││ 20 px │
|
|
-- -- └──────────────────┘└──────────────────┘
|
|
-- -- { Length(20), Length(30) }
|
|
-- -- ┌──────────────────┐┌────────────────────────────┐
|
|
-- -- │ 20 px ││ 30 px │
|
|
-- -- └──────────────────┘└────────────────────────────┘
|
|
-- ```
|
|
---@field Length fun(len: integer): self
|
|
-- Applies a percentage of the available space to the element.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `p` | `integer` |
|
|
-- | Return | `Self` |
|
|
-- Converts the given percentage to a floating-point value and multiplies that with area.
|
|
-- This value is rounded back to an integer as part of the layout split calculation.
|
|
-- ```lua
|
|
-- -- { Percentage(75), Fill(1) }
|
|
-- -- ┌────────────────────────────────────┐┌──────────┐
|
|
-- -- │ 38 px ││ 12 px │
|
|
-- -- └────────────────────────────────────┘└──────────┘
|
|
-- -- { Percentage(50), Fill(1) }
|
|
-- -- ┌───────────────────────┐┌───────────────────────┐
|
|
-- -- │ 25 px ││ 25 px │
|
|
-- -- └───────────────────────┘└───────────────────────┘
|
|
-- ```
|
|
---@field Percentage fun(p: integer): self
|
|
-- Applies a ratio of the available space to the element.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `num` | `integer` |
|
|
-- | `den` | `integer` |
|
|
-- | Return | `Self` |
|
|
-- Converts the given ratio to a floating-point value and multiplies that with area.
|
|
-- This value is rounded back to an integer as part of the layout split calculation.
|
|
-- ```lua
|
|
-- -- { Ratio(1, 2), Ratio(1, 2) }
|
|
-- -- ┌───────────────────────┐┌───────────────────────┐
|
|
-- -- │ 25 px ││ 25 px │
|
|
-- -- └───────────────────────┘└───────────────────────┘
|
|
-- -- { Ratio(1, 4), Ratio(1, 4), Ratio(1, 4), Ratio(1, 4) }
|
|
-- -- ┌───────────┐┌──────────┐┌───────────┐┌──────────┐
|
|
-- -- │ 13 px ││ 12 px ││ 13 px ││ 12 px │
|
|
-- -- └───────────┘└──────────┘└───────────┘└──────────┘
|
|
-- ```
|
|
---@field Ratio fun(num: integer, den: integer): self
|
|
-- Applies the scaling factor proportional to all other `Fill` elements
|
|
-- to fill excess space.
|
|
-- | In/Out | Type |
|
|
-- | ------- | --------- |
|
|
-- | `scale` | `integer` |
|
|
-- | Return | `Self` |
|
|
-- The element will only expand or fill into excess available space, proportionally matching
|
|
-- other `Fill` elements while satisfying all other constraints.
|
|
-- ```lua
|
|
-- -- { Fill(1), Fill(2), Fill(3) }
|
|
-- -- ┌──────┐┌───────────────┐┌───────────────────────┐
|
|
-- -- │ 8 px ││ 17 px ││ 25 px │
|
|
-- -- └──────┘└───────────────┘└───────────────────────┘
|
|
-- -- { Fill(1), Percentage(50), Fill(1) }
|
|
-- -- ┌───────────┐┌───────────────────────┐┌──────────┐
|
|
-- -- │ 13 px ││ 25 px ││ 12 px │
|
|
-- -- └───────────┘└───────────────────────┘└──────────┘
|
|
-- ```
|
|
-- See https://docs.rs/ratatui/latest/ratatui/layout/enum.Constraint.html for more information.
|
|
---@field Fill fun(scale: integer): self
|
|
|
|
-- Create a `List` that takes a table of `ui.Text`:
|
|
-- ```lua
|
|
-- ui.List { ui.Text("foo"), ui.Text("bar") }
|
|
-- ```
|
|
-- For convenience, the following types are also supported:
|
|
-- ```lua
|
|
-- -- Table of string
|
|
-- ui.List { "foo", "bar" }
|
|
-- -- Table of ui.Line
|
|
-- ui.List { ui.Line("foo"), ui.Line("bar") }
|
|
-- -- Table of ui.Span
|
|
-- ui.List { ui.Span("foo"), ui.Span("bar") }
|
|
-- -- Mixed table of string, ui.Line, ui.Span
|
|
-- ui.List { "foo", ui.Line("bar"), ui.Span("baz") }
|
|
-- ```
|
|
---@class (exact) ui.List
|
|
-- Set the area of the list.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------------------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `rect` | [`Rect?`](#rect) |
|
|
-- | Return | `self` \| [`Rect`](#rect) |
|
|
-- If `rect` is not specified, it returns the current area.
|
|
---@field area fun(self: self, rect: ui.Rect?): self|ui.Rect
|
|
-- Set the style of the list.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `style` | [`Style`](#style) |
|
|
-- | Return | `self` |
|
|
---@field style fun(self: self, style: ui.Style): self
|
|
---@overload fun(value: string|ui.Span|ui.Line|ui.Text|(string|ui.Span|ui.Line|ui.Text)[]): ui.List
|
|
|
|
-- Create a bar:
|
|
-- ```lua
|
|
-- ui.Bar(edge)
|
|
-- ```
|
|
-- The first attribute denotes the direction of the bar and accepts an [`Edge`](#edge) constant.
|
|
---@class (exact) ui.Bar
|
|
-- Set the area of the bar.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------------------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `rect` | [`Rect?`](#rect) |
|
|
-- | Return | `self` \| [`Rect`](#rect) |
|
|
-- If `rect` is not specified, it returns the current area.
|
|
---@field area fun(self: self, rect: ui.Rect?): self|ui.Rect
|
|
-- Set the symbol of the bar.
|
|
-- | In/Out | Type |
|
|
-- | -------- | -------- |
|
|
-- | `self` | `Self` |
|
|
-- | `symbol` | `string` |
|
|
-- | Return | `self` |
|
|
---@field symbol fun(self: self, symbol: string): self
|
|
-- Set the style of the bar.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `style` | [`Style`](#style) |
|
|
-- | Return | `self` |
|
|
---@field style fun(self: self, style: ui.Style): self
|
|
---@overload fun(edge: ui.Edge): ui.Bar
|
|
|
|
-- Create a border:
|
|
-- ```lua
|
|
-- ui.Border(edge)
|
|
-- ```
|
|
-- The first attribute denotes the edge of the border and accepts an [`Edge`](#edge) constant.
|
|
---@class (exact) ui.Border
|
|
-- Set the area of the border.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------------------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `rect` | [`Rect?`](#rect) |
|
|
-- | Return | `self` \| [`Rect`](#rect) |
|
|
-- If `rect` is not specified, it returns the current area.
|
|
---@field area fun(self: self, rect: ui.Rect?): self|ui.Rect
|
|
-- Set the type of the border.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `self` | `Self` |
|
|
-- | `type` | `integer` |
|
|
-- | Return | `self` |
|
|
-- The `type` accepts the following constants:
|
|
-- - `ui.Border.PLAIN`
|
|
-- - `ui.Border.ROUNDED`
|
|
-- - `ui.Border.DOUBLE`
|
|
-- - `ui.Border.THICK`
|
|
-- - `ui.Border.QUADRANT_INSIDE`
|
|
-- - `ui.Border.QUADRANT_OUTSIDE`
|
|
---@field type fun(self: self, type: integer): self
|
|
-- Set the style of the border.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `style` | [`Style`](#style) |
|
|
-- | Return | `self` |
|
|
---@field style fun(self: self, style: ui.Style): self
|
|
---@overload fun(edge: ui.Edge): ui.Border
|
|
|
|
-- Create a gauge:
|
|
-- ```lua
|
|
-- ui.Gauge()
|
|
-- ```
|
|
---@class (exact) ui.Gauge
|
|
-- Set the area of the gauge.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------------------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `rect` | [`Rect?`](#rect) |
|
|
-- | Return | `self` \| [`Rect`](#rect) |
|
|
-- If `rect` is not specified, it returns the current area.
|
|
---@field area fun(self: self, rect: ui.Rect?): self|ui.Rect
|
|
-- Set the percentage of the gauge.
|
|
-- | In/Out | Type |
|
|
-- | --------- | --------- |
|
|
-- | `self` | `Self` |
|
|
-- | `percent` | `integer` |
|
|
-- | Return | `self` |
|
|
---@field percent fun(self: self, percent: integer): self
|
|
-- Set the ratio of the gauge.
|
|
-- | In/Out | Type | Note |
|
|
-- | ------- | -------- | --------------- |
|
|
-- | `self` | `Self` | - |
|
|
-- | `ratio` | `number` | Between 0 and 1 |
|
|
-- | Return | `self` | - |
|
|
---@field ratio fun(self: self, ratio: number): self
|
|
-- Set the label of the gauge.
|
|
-- | In/Out | Type |
|
|
-- | ------- | -------- |
|
|
-- | `self` | `Self` |
|
|
-- | `label` | `string` |
|
|
-- | Return | `self` |
|
|
---@field label fun(self: self, label: string): self
|
|
-- Set the style of everything except the gauge itself.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `style` | [`Style`](#style) |
|
|
-- | Return | `self` |
|
|
---@field style fun(self: self, style: ui.Style): self
|
|
-- Set the style of the gauge itself.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `style` | [`Style`](#style) |
|
|
-- | Return | `self` |
|
|
---@field gauge_style fun(self: self, style: ui.Style): self
|
|
---@overload fun(): ui.Gauge
|
|
|
|
-- Clear the content of a specific area, which is a [Rect](#rect). Place it followed by the component that you want to clear:
|
|
-- ```lua
|
|
-- local components = {
|
|
-- ui.Text("..."):area(rect),
|
|
-- -- ...
|
|
-- ui.Clear(rect),
|
|
-- }
|
|
-- ```
|
|
---@class (exact) ui.Clear
|
|
-- Set the area of the clear.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------------------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `rect` | [`Rect?`](#rect) |
|
|
-- | Return | `self` \| [`Rect`](#rect) |
|
|
-- If `rect` is not specified, it returns the current area.
|
|
---@field area fun(self: self, rect: ui.Rect?): self|ui.Rect
|
|
---@overload fun(rect: ui.Rect): ui.Clear
|
|
|
|
-- Align is used to set the alignment of an element, such as a [Line](#line) or [Text](#text).
|
|
---@class (exact) ui.Align
|
|
-- Align to the left.
|
|
-- | | |
|
|
-- | ---- | ------ |
|
|
-- | Type | `Self` |
|
|
---@field LEFT self
|
|
-- Align to the center.
|
|
-- | | |
|
|
-- | ---- | ------ |
|
|
-- | Type | `Self` |
|
|
---@field CENTER self
|
|
-- Align to the right.
|
|
-- | | |
|
|
-- | ---- | ------ |
|
|
-- | Type | `Self` |
|
|
---@field RIGHT self
|
|
|
|
--
|
|
---@class (exact) ui.Wrap
|
|
-- Disables wrapping.
|
|
-- | | |
|
|
-- | ---- | ------ |
|
|
-- | Type | `Self` |
|
|
---@field NO self
|
|
-- Enables wrapping.
|
|
-- | | |
|
|
-- | ---- | ------ |
|
|
-- | Type | `Self` |
|
|
---@field YES self
|
|
-- Enables wrapping and trims the leading whitespace.
|
|
-- | | |
|
|
-- | ---- | ------ |
|
|
-- | Type | `Self` |
|
|
---@field TRIM self
|
|
|
|
--
|
|
---@class (exact) ui.Edge
|
|
-- No edge is applied.
|
|
-- | | |
|
|
-- | ---- | ------ |
|
|
-- | Type | `Self` |
|
|
---@field NONE self
|
|
-- Applies the top edge.
|
|
-- | | |
|
|
-- | ---- | ------ |
|
|
-- | Type | `Self` |
|
|
---@field TOP self
|
|
-- Applies the right edge.
|
|
-- | | |
|
|
-- | ---- | ------ |
|
|
-- | Type | `Self` |
|
|
---@field RIGHT self
|
|
-- Applies the bottom edge.
|
|
-- | | |
|
|
-- | ---- | ------ |
|
|
-- | Type | `Self` |
|
|
---@field BOTTOM self
|
|
-- Applies the left edge.
|
|
-- | | |
|
|
-- | ---- | ------ |
|
|
-- | Type | `Self` |
|
|
---@field LEFT self
|
|
-- Applies all edges.
|
|
-- | | |
|
|
-- | ---- | ------ |
|
|
-- | Type | `Self` |
|
|
---@field ALL self
|
|
|
|
|
|
-- You can access all states within [sync context](/docs/plugins/overview#sync-context) through `cx`.
|
|
---@class (exact) cx
|
|
-- The active tab.
|
|
-- | | |
|
|
-- | ---- | ---------------------- |
|
|
-- | Type | [`tab::Tab`](#tab-tab) |
|
|
---@field active tab__Tab
|
|
-- All of tabs.
|
|
-- | | |
|
|
-- | ---- | ------------------------ |
|
|
-- | Type | [`mgr::Tabs`](#mgr-tabs) |
|
|
---@field tabs mgr__Tabs
|
|
-- All of tasks.
|
|
-- | | |
|
|
-- | ---- | ------------------------------ |
|
|
-- | Type | [`tasks::Tasks`](#tasks-tasks) |
|
|
---@field tasks tasks__Tasks
|
|
-- The yanked files.
|
|
-- | | |
|
|
-- | ---- | ---------------------------- |
|
|
-- | Type | [`mgr::Yanked`](#mgr-yanked) |
|
|
---@field yanked mgr__Yanked
|
|
|
|
-- Visual mode status.
|
|
---@class (exact) tab__Mode
|
|
-- Whether in select mode.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_select boolean
|
|
-- Whether in unset mode.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_unset boolean
|
|
-- Whether in select mode, or unset mode.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_visual boolean
|
|
-- Converts the mode to string.
|
|
-- | In/Out | Type |
|
|
-- | ------ | -------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `string` |
|
|
---@field __tostring fun(self: self): string
|
|
|
|
-- Tab-specific user preferences.
|
|
---@class (exact) tab__Pref
|
|
-- File sorting method. See [`sort_by`](/docs/configuration/yazi#manager.sort_by) for details.
|
|
-- | | |
|
|
-- | ---- | ---------------------------------------------------------------------------------------------------------------- |
|
|
-- | Type | `"none"` \| `"mtime"` \| `"btime"` \| `"extension"` \| `"alphabetical"` \| `"natural"` \| `"size"` \| `"random"` |
|
|
---@field sort_by "none"|"mtime"|"btime"|"extension"|"alphabetical"|"natural"|"size"|"random"
|
|
-- Sort case-sensitively. See [`sort_sensitive`](/docs/configuration/yazi#manager.sort_sensitive) for details.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field sort_sensitive boolean
|
|
-- Display files in reverse order. See [`sort_reverse`](/docs/configuration/yazi#manager.sort_reverse) for details.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field sort_reverse boolean
|
|
-- Display directories first. See [`sort_dir_first`](/docs/configuration/yazi#manager.sort_dir_first) for details.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field sort_dir_first boolean
|
|
-- Transliterate filenames for sorting. See [`sort_translit`](/docs/configuration/yazi#manager.sort_translit) for details.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field sort_translit boolean
|
|
-- Line mode. See [`linemode`](/docs/configuration/yazi#manager.linemode) for details.
|
|
-- | | |
|
|
-- | ---- | ------------------------------------------------------------------------------------------ |
|
|
-- | Type | `string` \| `"none"` \| `"size"` \| `"btime"` \| `"mtime"` \| `"permissions"` \| `"owner"` |
|
|
---@field linemode string|"none"|"size"|"btime"|"mtime"|"permissions"|"owner"
|
|
-- Show hidden files. See [`show_hidden`](/docs/configuration/yazi#manager.show_hidden) for details.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field show_hidden boolean
|
|
|
|
--
|
|
---@class (exact) tab__Selected
|
|
-- Returns the number of selected [Url](#url)s.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `integer` |
|
|
---@field __len fun(self: self): integer
|
|
-- Iterate over the selected [Url](#url)s.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------------------------------------ |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `fun(t: self, k: any): integer, Url` |
|
|
---@field __pairs fun(self: self): fun(t: self, k: any): integer, Url
|
|
|
|
--
|
|
---@class (exact) tab__Preview
|
|
-- Number of units to skip. The units largely depend on your previewer, such as lines for code and percentages for videos.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field skip integer
|
|
-- The folder being previewed, or `nil` if this preview is not for a folder.
|
|
-- | | |
|
|
-- | ---- | ----------------------------- |
|
|
-- | Type | [`tab::Folder?`](#tab-folder) |
|
|
---@field folder tab__Folder?
|
|
|
|
--
|
|
---@class (exact) tab__Folder
|
|
-- Current working directory.
|
|
-- | | |
|
|
-- | ---- | ------------- |
|
|
-- | Type | [`Url`](#url) |
|
|
---@field cwd Url
|
|
-- Offset of the folder.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field offset integer
|
|
-- Cursor position.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field cursor integer
|
|
-- Files within the visible area.
|
|
-- | | |
|
|
-- | ---- | ------------------------ |
|
|
-- | Type | [`fs::Files`](#fs-files) |
|
|
---@field window fs__Files
|
|
-- All of the files in the folder.
|
|
-- | | |
|
|
-- | ---- | ------------------------ |
|
|
-- | Type | [`fs::Files`](#fs-files) |
|
|
---@field files fs__Files
|
|
-- Hovered file, or `nil` if no file is hovered.
|
|
-- | | |
|
|
-- | ---- | ----------------------- |
|
|
-- | Type | [`fs::File?`](#fs-file) |
|
|
---@field hovered fs__File?
|
|
|
|
--
|
|
---@class (exact) fs__Files
|
|
-- Returns the number of files in this folder.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `integer` |
|
|
---@field __len fun(self: self): integer
|
|
-- Access each file by index.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ----------------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `idx` | `integer` |
|
|
-- | Return | [`fs::File?`](#fs-file) |
|
|
---@field __index fun(self: self, idx: integer): fs__File?
|
|
|
|
--
|
|
---@class (exact) fs__File
|
|
-- Url of the file.
|
|
-- | | |
|
|
-- | ---- | ----- |
|
|
-- | Type | `Url` |
|
|
---@field url Url
|
|
-- Cha of the file.
|
|
-- | | |
|
|
-- | ---- | ----- |
|
|
-- | Type | `Cha` |
|
|
---@field cha Cha
|
|
-- Url of the file points to, if it's a symlink.
|
|
-- | | |
|
|
-- | ---- | ------ |
|
|
-- | Type | `Url?` |
|
|
---@field link_to Url?
|
|
-- Name of the file.
|
|
-- | | |
|
|
-- | ---- | -------- |
|
|
-- | Type | `string` |
|
|
---@field name string
|
|
-- Whether the file is hovered.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_hovered boolean
|
|
-- Size of the file in bytes, or `nil` if it's a directory yet not been evaluated.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ---------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `integer?` |
|
|
---@field size fun(self: self): integer?
|
|
-- Mimetype of the file, or `nil` if it's a directory or hasn't been lazily calculated.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `string?` |
|
|
---@field mime fun(self: self): string?
|
|
-- Prefix of the file relative to `CWD`, which used in the flat view during search.
|
|
-- For instance, if `CWD` is `/foo`, and the file is `/foo/bar/baz`, then the prefix is `bar/`.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `string?` |
|
|
---@field prefix fun(self: self): string?
|
|
-- Icon of the file, or `nil` if no [`[icon]`](/docs/configuration/theme#icon) rules match.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `Icon?` |
|
|
---@field icon fun(self: self): Icon?
|
|
-- Style of the file, or `nil` if no [`[filetype]`](/docs/configuration/theme#filetype) rules match.
|
|
-- | In/Out | Type |
|
|
-- | ------ | -------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `Style?` |
|
|
---@field style fun(self: self): ui.Style?
|
|
-- Whether the file is yanked.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `boolean` |
|
|
---@field is_yanked fun(self: self): boolean
|
|
-- Whether the file is selected.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `boolean` |
|
|
---@field is_selected fun(self: self): boolean
|
|
-- File find status:
|
|
-- - `nil` if if the user not in [`find`](/docs/configuration/keymap#manager.find) mode.
|
|
-- - `nil` if current file is not related to the keyword entered by the user.
|
|
-- - `integer, integer` if current file is one of the files found, where first is its index among the results and second is the total count of files found.
|
|
-- | In/Out | Type |
|
|
-- | ------ | -------------------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `integer?, integer?` |
|
|
---@field found fun(self: self): integer?, integer?
|
|
|
|
--
|
|
---@class (exact) mgr__Tabs
|
|
-- Index of the active tab.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `integer` |
|
|
---@field idx integer
|
|
-- Returns the number of tabs.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `integer` |
|
|
---@field __len fun(self: self): integer
|
|
-- Access each tab by index.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ----------------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `idx` | `integer` |
|
|
-- | Return | [`tab::Tab?`](#tab-tab) |
|
|
---@field __index fun(self: self, idx: integer): tab__Tab?
|
|
|
|
--
|
|
---@class (exact) tab__Tab
|
|
-- Name of the tab.
|
|
-- | | |
|
|
-- | ---- | -------- |
|
|
-- | Type | `string` |
|
|
---@field name string
|
|
-- Mode of the tab.
|
|
-- | | |
|
|
-- | ---- | ------------------------ |
|
|
-- | Type | [`tab::Mode`](#tab-mode) |
|
|
---@field mode tab__Mode
|
|
-- Preference of the tab.
|
|
-- | | |
|
|
-- | ---- | ------------------------ |
|
|
-- | Type | [`tab::Pref`](#tab-pref) |
|
|
---@field pref tab__Pref
|
|
-- Current working folder.
|
|
-- | | |
|
|
-- | ---- | ---------------------------- |
|
|
-- | Type | [`tab::Folder`](#tab-folder) |
|
|
---@field current tab__Folder
|
|
-- Parent folder of the `CWD`, or `nil` if no parent folder exists.
|
|
-- | | |
|
|
-- | ---- | ----------------------------- |
|
|
-- | Type | [`tab::Folder?`](#tab-folder) |
|
|
---@field parent tab__Folder?
|
|
-- Selected files within the tab.
|
|
-- | | |
|
|
-- | ---- | -------------------------------- |
|
|
-- | Type | [`tab::Selected`](#tab-selected) |
|
|
---@field selected tab__Selected
|
|
-- Preview of the tab.
|
|
-- | | |
|
|
-- | ---- | ------------------------------ |
|
|
-- | Type | [`tab::Preview`](#tab-preview) |
|
|
---@field preview tab__Preview
|
|
|
|
--
|
|
---@class (exact) tasks__Tasks
|
|
-- Progress of all tasks:
|
|
-- ```lua
|
|
-- {
|
|
-- -- Number of tasks
|
|
-- total = 0,
|
|
-- succ = 0,
|
|
-- fail = 0,
|
|
-- -- Workload of tasks
|
|
-- found = 0,
|
|
-- processed = 0,
|
|
-- }
|
|
-- ```
|
|
-- | | |
|
|
-- | ---- | -------------------------------------------------------------------------------------- |
|
|
-- | Type | `{ total: integer, succ: integer, fail: integer, found: integer, processed: integer }` |
|
|
---@field progress { total: integer, succ: integer, fail: integer, found: integer, processed: integer }
|
|
|
|
--
|
|
---@class (exact) mgr__Yanked
|
|
-- Whether in cut mode.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field is_cut boolean
|
|
-- Returns the number of yanked files.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `integer` |
|
|
---@field __len fun(self: self): integer
|
|
-- Iterate over the url of yanked files.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------------------------------------ |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `fun(t: self, k: any): integer, Url` |
|
|
---@field __pairs fun(self: self): fun(t: self, k: any): integer, Url
|
|
|
|
|
|
-- You can access Yazi's runtime through `rt` to obtain startup parameters, terminal properties, [user preferences](/docs/configuration/yazi), etc.
|
|
---@class (exact) rt
|
|
-- Command-line arguments passed by the user when launching Yazi.
|
|
-- | | |
|
|
-- | ---- | ---------------------- |
|
|
-- | Type | [`rt::Args`](#rt-args) |
|
|
---@field args rt__Args
|
|
-- User's terminal properties.
|
|
-- | | |
|
|
-- | ---- | ---------------------- |
|
|
-- | Type | [`rt::Term`](#rt-term) |
|
|
---@field term rt__Term
|
|
-- User preferences under [`[manager]`](/docs/configuration/yazi#manager).
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `table` |
|
|
---@field mgr table
|
|
-- User preferences under [`[plugin]`](/docs/configuration/yazi#plugin).
|
|
-- | | |
|
|
-- | ---- | -------------------------- |
|
|
-- | Type | [`rt::Plugin`](#rt-plugin) |
|
|
---@field plugin rt__Plugin
|
|
-- User preferences under [`[preview]`](/docs/configuration/yazi#preview).
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `table` |
|
|
---@field preview table
|
|
-- User preferences under [`[tasks]`](/docs/configuration/yazi#tasks).
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `table` |
|
|
---@field tasks table
|
|
|
|
-- You can access the user's theme and flavor configuration through `th`.
|
|
---@class (exact) th
|
|
-- See [`[manager]`](/docs/configuration/theme#manager).
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `table` |
|
|
---@field mgr table
|
|
-- See [`[tabs]`](/docs/configuration/theme#tabs).
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `table` |
|
|
---@field tabs table
|
|
-- See [`[mode]`](/docs/configuration/theme#mode).
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `table` |
|
|
---@field mode table
|
|
-- See [`[status]`](/docs/configuration/theme#status).
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `table` |
|
|
---@field status table
|
|
-- See [`[which]`](/docs/configuration/theme#which).
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `table` |
|
|
---@field which table
|
|
-- See [`[confirm]`](/docs/configuration/theme#confirm).
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `table` |
|
|
---@field confirm table
|
|
-- See [`[spot]`](/docs/configuration/theme#spot).
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `table` |
|
|
---@field spot table
|
|
-- See [`[notify]`](/docs/configuration/theme#notify).
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `table` |
|
|
---@field notify table
|
|
-- See [`[pick]`](/docs/configuration/theme#pick).
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `table` |
|
|
---@field pick table
|
|
-- See [`[input]`](/docs/configuration/theme#input).
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `table` |
|
|
---@field input table
|
|
-- See [`[cmp]`](/docs/configuration/theme#cmp).
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `table` |
|
|
---@field cmp table
|
|
-- See [`[tasks]`](/docs/configuration/theme#tasks).
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `table` |
|
|
---@field tasks table
|
|
-- See [`[help]`](/docs/configuration/theme#help).
|
|
-- | | |
|
|
-- | ---- | ------- |
|
|
-- | Type | `table` |
|
|
---@field help table
|
|
|
|
--
|
|
---@class (exact) rt__Args
|
|
|
|
--
|
|
---@class (exact) rt__Term
|
|
-- Whether the terminal is in light mode.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field light boolean
|
|
|
|
-- TODO
|
|
---@class (exact) rt__Plugin
|
|
|
|
|
|
--
|
|
---@class (exact) ya
|
|
-- Hide Yazi to the secondary screen by returning to the terminal, completely controlled by the requested plugin.
|
|
-- ```lua
|
|
-- local permit = ya.hide()
|
|
-- ```
|
|
-- This method returns a `permit` for this resource. When it's necessary to restore the TUI display, call its `drop()` method:
|
|
-- ```lua
|
|
-- permit:drop()
|
|
-- ```
|
|
-- Note that since there's always only one available terminal control resource, `ya.hide()` cannot be called again before the previous `permit` is dropped, otherwise an error will be thrown, effectively avoiding deadlocks.
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------------------ |
|
|
-- | Return | `Permit` |
|
|
-- | Available | Async context only |
|
|
---@field hide fun(): Permit
|
|
-- Calculate the cached [Url](/docs/plugins/types#url) corresponding to the given file.
|
|
-- ```lua
|
|
-- ya.file_cache {
|
|
-- -- File to be cached.
|
|
-- file = file,
|
|
-- -- Number of units to skip. It's units largely depend on your previewer,
|
|
-- -- such as lines for code, and percentages for videos.
|
|
-- skip = 1,
|
|
-- }
|
|
-- ```
|
|
-- If the file is not allowed to be cached, such as it's ignored in the user config, or the file itself is a cache, returns `nil`.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------------------------------- |
|
|
-- | `opts` | `{ file: File, skip: integer }` |
|
|
-- | Return | `Url?` |
|
|
---@field file_cache fun(opts: { file: File, skip: integer }): Url?
|
|
-- Re-render the UI:
|
|
-- ```lua
|
|
-- local update_state = ya.sync(function(self, new_state)
|
|
-- self.state = new_state
|
|
-- ya.render()
|
|
-- end)
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | --------- | ----------------- |
|
|
-- | Return | `unknown` |
|
|
-- | Available | Sync context only |
|
|
---@field render fun(): unknown
|
|
-- Send a command to the [`[manager]`](/docs/configuration/keymap#manager) without waiting for the executor to execute:
|
|
-- ```lua
|
|
-- ya.mgr_emit("my-cmd", { "hello", 123, foo = true, bar_baz = "world" })
|
|
-- -- Equivalent to:
|
|
-- -- my-cmd "hello" "123" --foo --bar-baz="world"
|
|
-- ```
|
|
-- | In/Out | Type | Note |
|
|
-- | ------ | --------------------------------- | --------------------------------------------------------------------------------------- |
|
|
-- | `cmd` | `string` | - |
|
|
-- | `args` | `{ [integer\|string]: Sendable }` | Table values are [Sendable][sendable] that follow [Ownership transfer rules][ownership] |
|
|
-- | Return | `unknown` | - |
|
|
---@field mgr_emit fun(cmd: string, args: { [integer|string]: Sendable }): unknown
|
|
-- Display the image of `url` within the `rect`, and the image will downscale to fit the area automatically:
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------------------ |
|
|
-- | `url` | `Url` |
|
|
-- | `rect` | `Rect` |
|
|
-- | Return | `unknown` |
|
|
-- | Available | Async context only |
|
|
---@field image_show fun(url: Url, rect: ui.Rect): unknown
|
|
-- Pre-cache the image of `src` as `dist` based on user-configured [`max_width` and `max_height`](/docs/configuration/yazi#preview).
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------------------ |
|
|
-- | `src` | `Url` |
|
|
-- | `dist` | `Url` |
|
|
-- | Return | `unknown` |
|
|
-- | Available | Async context only |
|
|
---@field image_precache fun(src: Url, dist: Url): unknown
|
|
-- Prompt users with a set of available keys:
|
|
-- ```lua
|
|
-- local cand = ya.which {
|
|
-- -- Key candidates, contains the following fields:
|
|
-- -- `on`: Key to be prompted, which is a string or a table of strings if multiple.
|
|
-- -- `desc`: Description of the key.
|
|
-- cands = {
|
|
-- { on = "a" },
|
|
-- { on = "b", desc = "optional description" },
|
|
-- { on = "<C-c>", desc = "key combination" },
|
|
-- { on = { "d", "e" }, desc = "multiple keys" },
|
|
-- },
|
|
-- -- Whether to show the UI of key indicator
|
|
-- silent = false,
|
|
-- }
|
|
-- ```
|
|
-- When the user clicks a valid candidate, `ya.which` returns the 1-based index of that `cand`;
|
|
-- otherwise, it returns `nil`, indicating that the user has canceled the key operation.
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------------------------------------------------------------------------ |
|
|
-- | `opts` | `{ cands: { on: string\|string[], desc: string? }[], silent: boolean? }` |
|
|
-- | Return | `number?` |
|
|
-- | Available | Async context only |
|
|
---@field which fun(opts: { cands: { on: string|string[], desc: string? }[], silent: boolean? }): number?
|
|
-- Request user input:
|
|
-- ```lua
|
|
-- local value, event = ya.input {
|
|
-- -- Title
|
|
-- title = "Archive name:",
|
|
-- -- Default value
|
|
-- value = "",
|
|
-- -- Position, which is a table:
|
|
-- -- `1`: Origin position, available values: "top-left", "top-center", "top-right",
|
|
-- -- "bottom-left", "bottom-center", "bottom-right", "center", and "hovered".
|
|
-- -- `x`: X offset from the origin position.
|
|
-- -- `y`: Y offset from the origin position.
|
|
-- -- `w`: Width of the input.
|
|
-- -- `h`: Height of the input.
|
|
-- position = { "top-center", y = 3, w = 40 },
|
|
-- -- Whether to report user input in real time.
|
|
-- realtime = false,
|
|
-- -- Number of seconds to wait for the user to stop typing, available if `realtime = true`.
|
|
-- debounce = 0.3,
|
|
-- }
|
|
-- ```
|
|
-- Returns `(value, event)`:
|
|
-- - `value`: The user input value carried by this event, which is a string if the `event` is non-zero; otherwise, `nil`.
|
|
-- - `event`: The event type, which is an integer:
|
|
-- - 0: Unknown error.
|
|
-- - 1: The user has confirmed the input.
|
|
-- - 2: The user has canceled the input.
|
|
-- - 3: The user has changed the input (only if `realtime` is true).
|
|
-- When `realtime = true` specified, `ya.input()` returns a receiver, which has a `recv()` method that can be called multiple times to receive events:
|
|
-- ```lua
|
|
-- local input = ya.input {
|
|
-- title = "Input in realtime:",
|
|
-- position = { "center", w = 50 },
|
|
-- realtime = true,
|
|
-- }
|
|
-- while true do
|
|
-- local value, event = input:recv()
|
|
-- if not value then
|
|
-- break
|
|
-- end
|
|
-- ya.dbg(value)
|
|
-- end
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | --------- | ----------------------------------------------------------------------------------------- |
|
|
-- | `opts` | `{ title: string, value: string?, position: Pos, realtime: boolean?, debounce: number? }` |
|
|
-- | Return | `(string?, integer)` \| `Recv` |
|
|
-- | Available | Async context only |
|
|
---@field input fun(opts: { title: string, value: string?, position: Pos, realtime: boolean?, debounce: number? }): (string?, integer)|Recv
|
|
-- Send a foreground notification to the user:
|
|
-- ```lua
|
|
-- ya.notify {
|
|
-- -- Title.
|
|
-- title = "Hello, World!",
|
|
-- -- Content.
|
|
-- content = "This is a notification from Lua!",
|
|
-- -- Timeout.
|
|
-- timeout = 6.5,
|
|
-- -- Level, available values: "info", "warn", and "error", default is "info".
|
|
-- level = "info",
|
|
-- }
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | ------ | ---------------------------------------------------------------------- |
|
|
-- | `opts` | `{ title: string, content: string, timeout: number?, level: string? }` |
|
|
-- | Return | `unknown` |
|
|
---@field notify fun(opts: { title: string, content: string, timeout: number?, level: string? }): unknown
|
|
-- Append messages to [the log file](/docs/plugins/overview#logging) at the debug level:
|
|
-- ```lua
|
|
-- ya.dbg("Hello", "World!") -- Multiple arguments are supported
|
|
-- ya.dbg({ foo = "bar", baz = 123, qux = true }) -- Any type of data is supported
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `msg` | `any` |
|
|
-- | `...` | `any` |
|
|
-- | Return | `unknown` |
|
|
---@field dbg fun(msg: any, ...: any): unknown
|
|
-- Append messages to [the log file](/docs/plugins/overview#logging) at the error level:
|
|
-- ```lua
|
|
-- ya.err("Hello", "World!") -- Multiple arguments are supported
|
|
-- ya.err({ foo = "bar", baz = 123, qux = true }) -- Any type of data is supported
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------- |
|
|
-- | `msg` | `any` |
|
|
-- | `...` | `any` |
|
|
-- | Return | `unknown` |
|
|
---@field err fun(msg: any, ...: any): unknown
|
|
-- Preview the file as code into the specified area:
|
|
-- ```lua
|
|
-- ya.preview_code {
|
|
-- -- Available preview area
|
|
-- area = area,
|
|
-- -- File to be previewed.
|
|
-- file = file,
|
|
-- -- Mimetype of the file.
|
|
-- mime = "text/plain",
|
|
-- -- Number of units to skip. The units depend on your previewer,
|
|
-- -- such as lines for code and percentages for videos.
|
|
-- skip = 1,
|
|
-- }
|
|
-- ```
|
|
-- Returns `(err, upper_bound)`:
|
|
-- - `err`: Error string if the preview fails; otherwise, `nil`.
|
|
-- - `upper_bound`: If the preview fails and it's because exceeds the maximum upper bound, return this bound; otherwise, `nil`.
|
|
-- | In/Out | Type |
|
|
-- | --------- | --------------------------------------------------------- |
|
|
-- | `opts` | `{ area: Rect, file: File, mime: string, skip: integer }` |
|
|
-- | Return | `Error?, integer?` |
|
|
-- | Available | Async context only |
|
|
---@field preview_code fun(opts: { area: ui.Rect, file: File, mime: string, skip: integer }): Error?, integer?
|
|
-- ```lua
|
|
-- ya.preview_widgets({
|
|
-- -- Available preview area.
|
|
-- area = area,
|
|
-- -- File to be previewed.
|
|
-- file = file,
|
|
-- -- Mimetype of the file.
|
|
-- mime = "text/plain",
|
|
-- -- Number of units to skip. The units depend on your previewer,
|
|
-- -- such as lines for code and percentages for videos.
|
|
-- skip = 1,
|
|
-- }, {
|
|
-- ui.Text("Hello, World!"):area(area),
|
|
-- })
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | --------- | --------------------------------------------------------- |
|
|
-- | `opts` | `{ area: Rect, file: File, mime: string, skip: integer }` |
|
|
-- | `widgets` | `Renderable[]` |
|
|
-- | Return | `unknown` |
|
|
-- | Available | Async context only |
|
|
---@field preview_widgets fun(opts: { area: ui.Rect, file: File, mime: string, skip: integer }, widgets: Renderable[]): unknown
|
|
-- See [Async context](/docs/plugins/overview#async-context).
|
|
-- | In/Out | Type |
|
|
-- | ------ | -------------------- |
|
|
-- | `fn` | `fun(...: any): any` |
|
|
-- | Return | `fun(...: any): any` |
|
|
---@field sync fun(fn: fun(...: any): any): fun(...: any): any
|
|
-- Returns a string describing the specific operating system in use.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
-- | Return | `string` \| `"linux"` \| `"macos"` \| `"ios"` \| `"freebsd"` \| `"dragonfly"` \| `"netbsd"` \| `"openbsd"` \| `"solaris"` \| `"android"` \| `"windows"` |
|
|
---@field target_os fun(): string|"linux"|"macos"|"ios"|"freebsd"|"dragonfly"|"netbsd"|"openbsd"|"solaris"|"android"|"windows"
|
|
-- Returns the family of the operating system.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ----------------------------------------------- |
|
|
-- | Return | `string` \| `"unix"` \| `"windows"` \| `"wasm"` |
|
|
---@field target_family fun(): string|"unix"|"windows"|"wasm"
|
|
-- Returns the hash of `str`:
|
|
-- ```lua
|
|
-- ya.hash("Hello, World!")
|
|
-- ```
|
|
-- It is designed to work with algorithm-independent tasks, such as generating file cache names.
|
|
-- The current implementation uses MD5, but it will be replaced with a faster hash algorithm, like [xxHash](https://github.com/Cyan4973/xxHash), in the future. So, don't rely on this implementation detail.
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------------------ |
|
|
-- | `str` | `string` |
|
|
-- | Return | `string` |
|
|
-- | Available | Async context only |
|
|
---@field hash fun(str: string): string
|
|
-- Quote characters in `str` that may have special meaning in a shell:
|
|
-- ```lua
|
|
-- local handle = io.popen("ls " .. ya.quote(filename))
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | ------ | -------- |
|
|
-- | `str` | `string` |
|
|
-- | Return | `string` |
|
|
---@field quote fun(str: string): string
|
|
-- Truncate the `text` to the specified width and return the truncated result:
|
|
-- ```lua
|
|
-- ya.truncate("Hello, World!", {
|
|
-- -- Maximum width of the text.
|
|
-- max = 5,
|
|
-- -- Whether to truncate the text from right-to-left.
|
|
-- rtl = false
|
|
-- })
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------------------------------- |
|
|
-- | `text` | `string` |
|
|
-- | `opts` | `{ max: integer, rtl: boolean? }` |
|
|
-- | Return | `string` |
|
|
---@field truncate fun(text: string, opts: { max: integer, rtl: boolean? }): string
|
|
-- Get or set the content of the system clipboard:
|
|
-- ```lua
|
|
-- -- Get contents from the clipboard if no argument is provided
|
|
-- local content = ya.clipboard()
|
|
-- -- Set contents to the clipboard
|
|
-- ya.clipboard("new content")
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------------------ |
|
|
-- | `text` | `string?` |
|
|
-- | Return | `string?` |
|
|
-- | Available | Async context only |
|
|
---@field clipboard fun(text: string?): string?
|
|
-- Returns the current timestamp, which is a float, the integer part represents the seconds, and the decimal part represents the milliseconds.
|
|
-- | In/Out | Type |
|
|
-- | ------ | -------- |
|
|
-- | Return | `number` |
|
|
---@field time fun(): number
|
|
-- Waits until `secs` has elapsed:
|
|
-- ```lua
|
|
-- ya.sleep(0.5) -- Sleep for 500 milliseconds
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------------------ |
|
|
-- | `secs` | `number` |
|
|
-- | Return | `unknown` |
|
|
-- | Available | Async context only |
|
|
---@field sleep fun(secs: number): unknown
|
|
-- Returns the id of the current user.
|
|
-- | In/Out | Type |
|
|
-- | --------- | ---------------------- |
|
|
-- | Return | `integer` |
|
|
-- | Available | Unix-like systems only |
|
|
---@field uid fun(): integer
|
|
-- Returns the group id of the current user.
|
|
-- | In/Out | Type |
|
|
-- | --------- | ---------------------- |
|
|
-- | Return | `integer` |
|
|
-- | Available | Unix-like systems only |
|
|
---@field gid fun(): integer
|
|
-- Get the username by `uid`:
|
|
-- ```lua
|
|
-- -- Get the current user's name if no argument is provided
|
|
-- ya.user_name()
|
|
-- -- Get the name of user with id 1000
|
|
-- ya.user_name(1000)
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | --------- | ---------------------- |
|
|
-- | `uid` | `integer?` |
|
|
-- | Return | `string?` |
|
|
-- | Available | Unix-like systems only |
|
|
---@field user_name fun(uid: integer?): string?
|
|
-- Get the group name by `gid`:
|
|
-- ```lua
|
|
-- -- Get the current user's group name if no argument is provided
|
|
-- ya.group_name()
|
|
-- -- Get the name of group with id 1000
|
|
-- ya.group_name(1000)
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | --------- | ---------------------- |
|
|
-- | `gid` | `integer?` |
|
|
-- | Return | `string?` |
|
|
-- | Available | Unix-like systems only |
|
|
---@field group_name fun(gid: integer?): string?
|
|
-- Returns the hostname of the current machine.
|
|
-- | In/Out | Type |
|
|
-- | --------- | ---------------------- |
|
|
-- | Return | `string?` |
|
|
-- | Available | Unix-like systems only |
|
|
---@field host_name fun(): string?
|
|
|
|
-- Yazi's DDS (Data Distribution Service) uses a Lua-based publish-subscribe model as its carrier. That is, you can achieve cross-instance communication and state persistence through the `ps` API. See [DDS](/docs/dds) for details.
|
|
-- The following functions can only be used within a sync context.
|
|
---@class (exact) ps
|
|
-- Publish a message to the current instance, and all plugins subscribed through `sub()` for this `kind` will receive it, achieving internal communication within the instance:
|
|
-- ```lua
|
|
-- ps.pub("greeting", "Hello, World!")
|
|
-- ```
|
|
-- Since the `kind` is used globally, to add the plugin name as the prefix is a best practice.
|
|
-- For example, the combination of the plugin `my-plugin` and the kind `event1` would be `my-plugin-event1`.
|
|
-- | In/Out | Type | Note |
|
|
-- | ------- | ---------- | ------------------------------------------------------------------------------- |
|
|
-- | `kind` | `string` | Alphanumeric with dashes, cannot be [built-in kinds](/docs/dds#kinds) |
|
|
-- | `value` | `Sendable` | A [Sendable value][sendable] that follows [Ownership transfer rules][ownership] |
|
|
-- | Return | `unknown` | - |
|
|
---@field pub fun(kind: string, value: Sendable): unknown
|
|
-- Publish a message to a specific instance with `receiver` as the ID:
|
|
-- ```lua
|
|
-- ps.pub_to(1711957283332834, "greeting", "Hello, World!")
|
|
-- ```
|
|
-- Where:
|
|
-- - Local - `receiver` is the current instance, and is subscribed to this `kind` via `sub()`, it will receive the message.
|
|
-- - Remote - `receiver` isn't the current instance, and is subscribed to this `kind` via `sub_remote()`, it will receive the message.
|
|
-- - Broadcast - `receiver` is `0`, all remote instances subscribed to this `kind` via `sub_remote()` will receive the message.
|
|
-- | In/Out | Type | Note |
|
|
-- | ---------- | ---------- | ------------------------------------------------------------------------------- |
|
|
-- | `receiver` | `integer` | - |
|
|
-- | `kind` | `string` | Alphanumeric with dashes, cannot be [built-in kinds](/docs/dds#kinds) |
|
|
-- | `value` | `Sendable` | A [Sendable value][sendable] that follows [Ownership transfer rules][ownership] |
|
|
-- | Return | `unknown` | - |
|
|
---@field pub_to fun(receiver: integer, kind: string, value: Sendable): unknown
|
|
-- Subscribe to local messages of `kind` and call the `callback` handler for it:
|
|
-- ```lua
|
|
-- -- The same `kind` from the same plugin can only be subscribed once,
|
|
-- -- re-subscribing (`sub()`) before unsubscribing (`unsub()`) will throw an error.
|
|
-- ps.sub("cd", function(body)
|
|
-- ya.dbg("New cwd", cx.active.current.cwd)
|
|
-- end)
|
|
-- ```
|
|
-- It runs in a sync context, so you can access all states via `cx` for the data of interest.
|
|
-- | In/Out | Type | Note |
|
|
-- | ---------- | --------------------- | --------------------------------------------------------------------- |
|
|
-- | `kind` | `string` | Alphanumeric with dashes, cannot be [built-in kinds](/docs/dds#kinds) |
|
|
-- | `callback` | `fun(body: Sendable)` | No time-consuming work should be done in the callback |
|
|
-- | Return | `unknown` | - |
|
|
---@field sub fun(kind: string, callback: fun(body: Sendable)): unknown
|
|
-- Same as `sub()`, except it subscribes to remote messages of this `kind` instead of local.
|
|
-- | In/Out | Type | Note |
|
|
-- | ---------- | --------------------- | --------------- |
|
|
-- | `kind` | `string` | Same as `sub()` |
|
|
-- | `callback` | `fun(body: Sendable)` | Same as `sub()` |
|
|
-- | Return | `unknown` | - |
|
|
---@field sub_remote fun(kind: string, callback: fun(body: Sendable)): unknown
|
|
-- Unsubscribe from local messages of this `kind`:
|
|
-- ```lua
|
|
-- ps.unsub("my-message")
|
|
-- ```
|
|
-- | In/Out | Type | Note |
|
|
-- | ------ | --------- | --------------------------------------------------------------------- |
|
|
-- | `kind` | `string` | Alphanumeric with dashes, cannot be [built-in kinds](/docs/dds#kinds) |
|
|
-- | Return | `unknown` | - |
|
|
---@field unsub fun(kind: string): unknown
|
|
-- Unsubscribe from remote messages of this `kind`:
|
|
-- ```lua
|
|
-- ps.unsub_remote("my-message")
|
|
-- ```
|
|
-- | In/Out | Type | Note |
|
|
-- | ------ | --------- | ----------------- |
|
|
-- | `kind` | `string` | Same as `unsub()` |
|
|
-- | Return | `unknown` | - |
|
|
---@field unsub_remote fun(kind: string): unknown
|
|
|
|
-- The following functions can only be used within an async context.
|
|
---@class (exact) fs
|
|
-- Get the current working directory (CWD) of the process.
|
|
-- This API was added to compensate for the lack of a [`getcwd`][getcwd] in Lua; it is used to retrieve the directory of the last [`chdir`][chdir] call:
|
|
-- ```lua
|
|
-- local url, err = fs.cwd()
|
|
-- ```
|
|
-- You probably will never need it, and more likely, you'll need [`cx.active.current.cwd`][folder-cwd], which is the current directory where the user is working.
|
|
-- Specifically, when the user changes the directory, `cx.active.current.cwd` gets updated immediately, while synchronizing this update with the filesystem via `chdir` involves I/O operations, such as checking if the directory is valid.
|
|
-- So, there may be some delay, which is particularly noticeable on slow devices. For example, when an HDD wakes up from sleep, it typically takes 3~4 seconds.
|
|
-- It is useful if you just need a valid directory as the CWD of a process to start some work that doesn't depend on the CWD.
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------------------ |
|
|
-- | Return | `Url?, Error?` |
|
|
-- | Available | Async context only |
|
|
-- [getcwd]: https://man7.org/linux/man-pages/man3/getcwd.3.html
|
|
-- [chdir]: https://man7.org/linux/man-pages/man2/chdir.2.html
|
|
-- [folder-cwd]: /docs/plugins/context#tab-folder.cwd
|
|
---@field cwd fun(): Url?, Error?
|
|
-- Get the [Cha](/docs/plugins/types#cha) of the specified `url`:
|
|
-- ```lua
|
|
-- -- Not following symbolic links
|
|
-- local cha, err = fs.cha(url)
|
|
-- -- Follow symbolic links
|
|
-- local cha, err = fs.cha(url, true)
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------------------ |
|
|
-- | `url` | `Url` |
|
|
-- | `follow` | `boolean?` |
|
|
-- | Return | `Cha?, Error?` |
|
|
-- | Available | Async context only |
|
|
---@field cha fun(url: Url, follow: boolean?): Cha?, Error?
|
|
-- Write `data` to the specified `url`:
|
|
-- ```lua
|
|
-- local ok, err = fs.write(url, "hello world")
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------------------ |
|
|
-- | `url` | `Url` |
|
|
-- | `data` | `string` |
|
|
-- | Return | `boolean, Error?` |
|
|
-- | Available | Async context only |
|
|
---@field write fun(url: Url, data: string): boolean, Error?
|
|
-- Create file(s) at the `url` of the file system:
|
|
-- ```lua
|
|
-- local ok, err = fs.create("dir_all", Url("/tmp/test/nest/nested"))
|
|
-- ```
|
|
-- Where `type` can be one of the following:
|
|
-- - `"dir"`: Creates a new, empty directory.
|
|
-- - `"dir_all"`: Recursively create a directory and all of its parents if they are missing.
|
|
-- | In/Out | Type |
|
|
-- | --------- | ---------------------------------- |
|
|
-- | `type` | `string` \| `"dir"` \| `"dir_all"` |
|
|
-- | `url` | `Url` |
|
|
-- | Return | `boolean, Error?` |
|
|
-- | Available | Async context only |
|
|
---@field create fun(type: string|"dir"|"dir_all", url: Url): boolean, Error?
|
|
-- Remove file(s) at the `url` of the file system:
|
|
-- ```lua
|
|
-- local ok, err = fs.remove("file", Url("/tmp/test.txt"))
|
|
-- ```
|
|
-- Where `type` can be one of the following:
|
|
-- - `"file"`: Removes a file from the filesystem.
|
|
-- - `"dir"`: Removes an existing, empty directory.
|
|
-- - `"dir_all"`: Removes a directory at this url, after removing all its contents. Use carefully!
|
|
-- - `"dir_clean"`: Remove all empty directories under it, and if the directory itself is empty afterward, remove it as well.
|
|
-- | In/Out | Type |
|
|
-- | --------- | --------------------------------------------------------------- |
|
|
-- | `type` | `string` \| `"file"` \| `"dir"` \| `"dir_all"` \| `"dir_clean"` |
|
|
-- | `url` | `Url` |
|
|
-- | Return | `boolean, Error?` |
|
|
-- | Available | Async context only |
|
|
---@field remove fun(type: string|"file"|"dir"|"dir_all"|"dir_clean", url: Url): boolean, Error?
|
|
-- Reads the directory contents of `url`:
|
|
-- ```lua
|
|
-- local files, err = fs.read_dir(url, {
|
|
-- -- Glob pattern to filter files out if provided.
|
|
-- glob = nil,
|
|
-- -- Maximum number of files to read, defaults to unlimited.
|
|
-- limit = 10,
|
|
-- -- Whether to resolve symbolic links, defaults to `false`.
|
|
-- resolve = false,
|
|
-- })
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | --------- | ------------------------------------------------------- |
|
|
-- | `url` | `Url` |
|
|
-- | `options` | `{ glob: string?, limit: integer?, resolve: boolean? }` |
|
|
-- | Return | `File[]?, Error?` |
|
|
-- | Available | Async context only |
|
|
---@field read_dir fun(url: Url, options: { glob: string?, limit: integer?, resolve: boolean? }): File[]?, Error?
|
|
|
|
-- You can invoke external programs through:
|
|
-- ```lua
|
|
-- local child, err = Command("ls")
|
|
-- :args({ "-a", "-l" })
|
|
-- :stdout(Command.PIPED)
|
|
-- :spawn()
|
|
-- ```
|
|
-- Compared to Lua's `os.execute`, it provides many comprehensive and convenient methods, and the entire process is async.
|
|
-- It takes better advantage of the benefits of concurrent scheduling. However, it can only be used in async contexts, such as preloaders, previewers, and async functional plugins.
|
|
---@class (exact) Command
|
|
-- Append an argument to the command:
|
|
-- ```lua
|
|
-- local cmd = Command("ls"):arg("-a"):arg("-l")
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | ------ | -------- |
|
|
-- | `self` | `Self` |
|
|
-- | `arg` | `string` |
|
|
-- | Return | `self` |
|
|
---@field arg fun(self: self, arg: string): self
|
|
-- Append multiple arguments to the command:
|
|
-- ```lua
|
|
-- local cmd = Command("ls"):args({ "-a", "-l" }):args({ "-h" })
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | ------ | ---------- |
|
|
-- | `self` | `Self` |
|
|
-- | `args` | `string[]` |
|
|
-- | Return | `self` |
|
|
---@field args fun(self: self, args: string[]): self
|
|
-- Set the current working directory of the command:
|
|
-- ```lua
|
|
-- local cmd = Command("ls"):cwd("/root")
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | ------ | -------- |
|
|
-- | `self` | `Self` |
|
|
-- | `dir` | `string` |
|
|
-- | Return | `self` |
|
|
---@field cwd fun(self: self, dir: string): self
|
|
-- Append an environment variable to the command:
|
|
-- ```lua
|
|
-- local cmd = Command("ls"):env("PATH", "/bin"):env("HOME", "/home")
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | ------- | -------- |
|
|
-- | `self` | `Self` |
|
|
-- | `key` | `string` |
|
|
-- | `value` | `string` |
|
|
-- | Return | `self` |
|
|
---@field env fun(self: self, key: string, value: string): self
|
|
-- Set the stdin of the command:
|
|
-- ```lua
|
|
-- local cmd = Command("ls"):stdin(Command.PIPED)
|
|
-- ```
|
|
-- Where `stdio` can be one of the following:
|
|
-- - `Command.PIPED`: Pipe the stdin.
|
|
-- - `Command.NULL`: Discard the stdin (default).
|
|
-- - `Command.INHERIT`: Inherit the stdin.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ------- |
|
|
-- | `self` | `Self` |
|
|
-- | `stdio` | `Stdio` |
|
|
-- | Return | `self` |
|
|
---@field stdin fun(self: self, stdio: Stdio): self
|
|
-- Set the stdout of the command:
|
|
-- ```lua
|
|
-- local cmd = Command("ls"):stdout(Command.PIPED)
|
|
-- ```
|
|
-- Where `stdio` can be one of the following:
|
|
-- - `Command.PIPED`: Pipe the stdout.
|
|
-- - `Command.NULL`: Discard the stdout (default).
|
|
-- - `Command.INHERIT`: Inherit the stdout.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ------- |
|
|
-- | `self` | `Self` |
|
|
-- | `stdio` | `Stdio` |
|
|
-- | Return | `self` |
|
|
---@field stdout fun(self: self, stdio: Stdio): self
|
|
-- Set the stderr of the command:
|
|
-- ```lua
|
|
-- local cmd = Command("ls"):stderr(Command.PIPED)
|
|
-- ```
|
|
-- Where `stdio` can be one of the following:
|
|
-- - `Command.PIPED`: Pipe the stderr.
|
|
-- - `Command.NULL`: Discard the stderr (default).
|
|
-- - `Command.INHERIT`: Inherit the stderr.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ------- |
|
|
-- | `self` | `Self` |
|
|
-- | `stdio` | `Stdio` |
|
|
-- | Return | `self` |
|
|
---@field stderr fun(self: self, stdio: Stdio): self
|
|
-- Spawn the command:
|
|
-- ```lua
|
|
-- local child, err = Command("ls"):spawn()
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | ------ | ---------------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `Child?, Error?` |
|
|
---@field spawn fun(self: self): Child?, Error?
|
|
-- Spawn the command and wait for it to finish:
|
|
-- ```lua
|
|
-- local output, err = Command("ls"):output()
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | ------ | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `Output?, Error?` |
|
|
---@field output fun(self: self): Output?, Error?
|
|
-- Executes the command as a child process, waiting for it to finish and collecting its exit status:
|
|
-- ```lua
|
|
-- local status, err = Command("ls"):status()
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | ------ | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `Status?, Error?` |
|
|
---@field status fun(self: self): Status?, Error?
|
|
---@overload fun(value: string): Command
|
|
|
|
-- This object is created by [`Command:spawn()`](#Command.spawn) and represents a running child process.
|
|
-- You can access the runtime data of this process through its proprietary methods.
|
|
---@class (exact) Child
|
|
-- Reads data from the available data source alternately:
|
|
-- ```lua
|
|
-- local data, event = child:read(1024)
|
|
-- ```
|
|
-- "available data source" refers to `stdout` or `stderr` that has `Command.PIPED` set, or them both, the `event` indicates where the data comes from:
|
|
-- - Data comes from stdout, if event is 0.
|
|
-- - Data comes from stderr, if event is 1.
|
|
-- - No data to read from both stdout and stderr, if event is 2.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `len` | `integer` |
|
|
-- | Return | `string, integer` |
|
|
---@field read fun(self: self, len: integer): string, integer
|
|
-- Same as [`read()`](#Child.read), except it reads data line by line:
|
|
-- ```lua
|
|
-- local line, event = child:read_line()
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | ------ | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `string, integer` |
|
|
---@field read_line fun(self: self): string, integer
|
|
-- Same as [`read_line()`](#Child.read_line), except it accepts a table of options:
|
|
-- ```lua
|
|
-- local line, event = child:read_line_with {
|
|
-- -- Timeout to read
|
|
-- timeout = 500,
|
|
-- }
|
|
-- ```
|
|
-- It has a extra event:
|
|
-- - Timeout, if event is 3.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ---------------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `opts` | `{ timeout: integer }` |
|
|
-- | Return | `string, integer` |
|
|
---@field read_line_with fun(self: self, opts: { timeout: integer }): string, integer
|
|
-- Writes all `src` to the stdin of the child process:
|
|
-- ```lua
|
|
-- local ok, err = child:write_all(src)
|
|
-- ```
|
|
-- Ensure that the child's stdin is available when calling this method, specifically:
|
|
-- 1. [`stdin(Command.PIPED)`](/docs/plugins/utils#Command.stdin) is set.
|
|
-- 2. [`take_stdin()`](/docs/plugins/utils#Child.take_stdin) has never been called.
|
|
-- Otherwise, an error will be thrown.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | `src` | `string` |
|
|
-- | Return | `boolean, Error?` |
|
|
---@field write_all fun(self: self, src: string): boolean, Error?
|
|
-- Wait for the child process to finish:
|
|
-- ```lua
|
|
-- local status, err = child:wait()
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | ------ | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `Status?, Error?` |
|
|
---@field wait fun(self: self): Status?, Error?
|
|
-- Wait for the child process to finish and get the output:
|
|
-- ```lua
|
|
-- local output, err = child:wait_with_output()
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | ------ | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `Output?, Error?` |
|
|
---@field wait_with_output fun(self: self): Output?, Error?
|
|
-- Send a SIGTERM signal to the child process:
|
|
-- ```lua
|
|
-- local ok, err = child:start_kill()
|
|
-- ```
|
|
-- | In/Out | Type |
|
|
-- | ------ | ----------------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `boolean, Error?` |
|
|
---@field start_kill fun(self: self): boolean, Error?
|
|
-- Take and return the stdin stream of the child process:
|
|
-- ```lua
|
|
-- local stdin = child:take_stdin()
|
|
-- ```
|
|
-- This method can only be called once and is only applicable to processes with [`stdin(Command.PIPED)`](/docs/plugins/utils#Command.stdin) set;
|
|
-- otherwise, it returns `nil`.
|
|
-- | In/Out | Type |
|
|
-- | ------ | -------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `Stdio?` |
|
|
---@field take_stdin fun(self: self): Stdio?
|
|
-- Take and return the stdout stream of the child process:
|
|
-- ```lua
|
|
-- local stderr = child:take_stdout()
|
|
-- ```
|
|
-- which is useful when redirecting stdout to another process's stdin:
|
|
-- ```lua
|
|
-- local echo = Command("echo"):arg("Hello"):stdout(Command.PIPED):spawn()
|
|
-- local rev = Command("rev"):stdin(echo:take_stdout()):stdout(Command.PIPED):output()
|
|
-- ya.dbg(rev.stdout) -- "olleH\n"
|
|
-- ```
|
|
-- This method can only be called once and is only applicable to processes with [`stdout(Command.PIPED)`](/docs/plugins/utils#Command.stdin) set;
|
|
-- otherwise, it returns `nil`.
|
|
-- | In/Out | Type |
|
|
-- | ------ | -------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `Stdio?` |
|
|
---@field take_stdout fun(self: self): Stdio?
|
|
-- Take and return the stderr stream of the child process:
|
|
-- ```lua
|
|
-- local stderr = child:take_stderr()
|
|
-- ```
|
|
-- See [`take_stdout()`](/docs/plugins/utils#Child.take_stdout) for an example.
|
|
-- This method can only be called once and is only applicable to processes with [`stderr(Command.PIPED)`](/docs/plugins/utils#Command.stdin) set;
|
|
-- otherwise, it returns `nil`.
|
|
-- | In/Out | Type |
|
|
-- | ------ | -------- |
|
|
-- | `self` | `Self` |
|
|
-- | Return | `Stdio?` |
|
|
---@field take_stderr fun(self: self): Stdio?
|
|
|
|
--
|
|
---@class (exact) Output
|
|
-- [Status](#status) of the child process.
|
|
-- | | |
|
|
-- | ---- | -------- |
|
|
-- | Type | `Status` |
|
|
---@field status Status
|
|
-- Stdout of the child process.
|
|
-- | | |
|
|
-- | ---- | -------- |
|
|
-- | Type | `string` |
|
|
---@field stdout string
|
|
-- Stderr of the child process.
|
|
-- | | |
|
|
-- | ---- | -------- |
|
|
-- | Type | `string` |
|
|
---@field stderr string
|
|
|
|
-- This object represents the exit status of a child process, and it is created by [`wait()`](#Child.wait), or [`output()`](#Command.output).
|
|
---@class (exact) Status
|
|
-- Whether the child process exited successfully.
|
|
-- | | |
|
|
-- | ---- | --------- |
|
|
-- | Type | `boolean` |
|
|
---@field success boolean
|
|
-- Exit code of the child process.
|
|
-- | | |
|
|
-- | ---- | ---------- |
|
|
-- | Type | `integer?` |
|
|
-- <!-- Links -->
|
|
-- [sendable]: /docs/plugins/overview#sendable
|
|
-- [ownership]: /docs/plugins/overview#ownership
|
|
---@field code integer?
|
|
|
|
|
|
--
|
|
---@class (exact) ui
|
|
--
|
|
---@field Constraint ui.Constraint
|
|
--
|
|
---@field Align ui.Align
|
|
--
|
|
---@field Wrap ui.Wrap
|
|
--
|
|
---@field Edge ui.Edge
|
|
-- Make a new rect.
|
|
-- | In/Out | Type |
|
|
-- | ------- | -------------------------------------------------------- |
|
|
-- | `value` | `{ x: integer?, y: integer?, w: integer?, h: integer? }` |
|
|
-- | Return | `Self` |
|
|
---@field Rect fun(value: { x: integer?, y: integer?, w: integer?, h: integer? }): ui.Rect
|
|
-- Make a new padding.
|
|
-- | In/Out | Type |
|
|
-- | -------- | --------- |
|
|
-- | `top` | `integer` |
|
|
-- | `right` | `integer` |
|
|
-- | `bottom` | `integer` |
|
|
-- | `left` | `integer` |
|
|
-- | Return | `Self` |
|
|
---@field Pad fun(top: integer, right: integer, bottom: integer, left: integer): ui.Pad
|
|
-- Make a new style.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------ |
|
|
-- | Return | `Self` |
|
|
---@field Style fun(): ui.Style
|
|
-- Make a new span.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ------------------ |
|
|
-- | `value` | `string` \| `Self` |
|
|
-- | Return | `Self` |
|
|
---@field Span fun(value: string|self): ui.Span
|
|
-- Make a new line.
|
|
-- | In/Out | Type |
|
|
-- | ------- | -------------------------------------------------------- |
|
|
-- | `value` | `string` \| `Span` \| `Self` \| `(string\|Span\|Self)[]` |
|
|
-- | Return | `Self` |
|
|
---@field Line fun(value: string|ui.Span|self|(string|ui.Span|self)[]): ui.Line
|
|
-- Make a new text.
|
|
-- | In/Out | Type |
|
|
-- | ------- | -------------------------------------------------------- |
|
|
-- | `value` | `string` \| `Span` \| `Line` \| `(string\|Span\|Line)[]` |
|
|
-- | Return | `Self` |
|
|
---@field Text fun(value: string|ui.Span|ui.Line|(string|ui.Span|ui.Line)[]): ui.Text
|
|
-- Make a new layout.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------ |
|
|
-- | Return | `Self` |
|
|
---@field Layout fun(): ui.Layout
|
|
-- Make a new list.
|
|
-- | In/Out | Type |
|
|
-- | ------- | ------------------------------------------------------------------------ |
|
|
-- | `value` | `string` \| `Span` \| `Line` \| `Text` \| `(string\|Span\|Line\|Text)[]` |
|
|
-- | Return | `Self` |
|
|
---@field List fun(value: string|ui.Span|ui.Line|ui.Text|(string|ui.Span|ui.Line|ui.Text)[]): ui.List
|
|
-- Make a new bar.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------------- |
|
|
-- | `edge` | [`Edge`](#edge) |
|
|
-- | Return | `Self` |
|
|
---@field Bar fun(edge: ui.Edge): ui.Bar
|
|
-- Make a new border.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------------- |
|
|
-- | `edge` | [`Edge`](#edge) |
|
|
-- | Return | `Self` |
|
|
---@field Border fun(edge: ui.Edge): ui.Border
|
|
-- Make a new gauge.
|
|
-- | In/Out | Type |
|
|
-- | ------ | ------ |
|
|
-- | Return | `Self` |
|
|
---@field Gauge fun(): ui.Gauge
|
|
-- Make a new clear.
|
|
-- | In/Out | Type |
|
|
-- | ------ | --------------- |
|
|
-- | `rect` | [`Rect`](#rect) |
|
|
-- | Return | `Self` |
|
|
---@field Clear fun(rect: ui.Rect): ui.Clear
|
|
|
|
|