diff --git a/.gitignore b/.gitignore index 98c2775..21ea7e4 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ flavors +plugins diff --git a/flavors/onedark.yazi b/flavors/onedark.yazi deleted file mode 160000 index fa1da70..0000000 --- a/flavors/onedark.yazi +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fa1da70556a5654f5d40d063a95e55ecc63b3ef7 diff --git a/package.toml b/package.toml index 10f7ca1..7890e63 100644 --- a/package.toml +++ b/package.toml @@ -1,8 +1,10 @@ [plugin] deps = [ - { use = "yazi-rs/plugins:full-border", rev = "dc11879" }, - { use = "yazi-rs/plugins:git", rev = "4fcd737" }, + { use = "yazi-rs/plugins:full-border" }, + { use = "yazi-rs/plugins:git" }, ] [flavor] -deps = [] +deps = [ + { use = "BennyOe/onedark" }, +] diff --git a/plugins/full-border.yazi/DO_NOT_MODIFY_ANYTHING_IN_THIS_DIRECTORY b/plugins/full-border.yazi/DO_NOT_MODIFY_ANYTHING_IN_THIS_DIRECTORY deleted file mode 100644 index e69de29..0000000 diff --git a/plugins/full-border.yazi/LICENSE b/plugins/full-border.yazi/LICENSE deleted file mode 100644 index fb5b1d6..0000000 --- a/plugins/full-border.yazi/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 yazi-rs - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/plugins/full-border.yazi/README.md b/plugins/full-border.yazi/README.md deleted file mode 100644 index 6e78bd4..0000000 --- a/plugins/full-border.yazi/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# full-border.yazi - -Add a full border to Yazi to make it look fancier. - -![full-border](https://github.com/yazi-rs/plugins/assets/17523360/ef81b560-2465-4d36-abf2-5d21dcb7b987) - -## Installation - -```sh -ya pack -a yazi-rs/plugins:full-border -``` - -## Usage - -Add this to your `init.lua` to enable the plugin: - -```lua -require("full-border"):setup() -``` - -Or you can customize the border type: - -```lua -require("full-border"):setup { - -- Available values: ui.Border.PLAIN, ui.Border.ROUNDED - type = ui.Border.ROUNDED, -} -``` - -## License - -This plugin is MIT-licensed. For more information check the [LICENSE](LICENSE) file. diff --git a/plugins/full-border.yazi/init.lua b/plugins/full-border.yazi/init.lua deleted file mode 100644 index 958ae67..0000000 --- a/plugins/full-border.yazi/init.lua +++ /dev/null @@ -1,50 +0,0 @@ --- TODO: remove this once v0.4 is released -local v4 = function(typ, area, ...) - if typ == "bar" then - return ui.Table and ui.Bar(...):area(area) or ui.Bar(area, ...) - else - return ui.Table and ui.Border(...):area(area) or ui.Border(area, ...) - end -end - -local function setup(_, opts) - local type = opts and opts.type or ui.Border.ROUNDED - local old_build = Tab.build - - Tab.build = function(self, ...) - local bar = function(c, x, y) - if x <= 0 or x == self._area.w - 1 then - return v4("bar", ui.Rect.default, ui.Bar.TOP) - end - - return v4( - "bar", - ui.Rect { x = x, y = math.max(0, y), w = ya.clamp(0, self._area.w - x, 1), h = math.min(1, self._area.h) }, - ui.Bar.TOP - ):symbol(c) - end - - local c = self._chunks - self._chunks = { - c[1]:padding(ui.Padding.y(1)), - c[2]:padding(ui.Padding(c[1].w > 0 and 0 or 1, c[3].w > 0 and 0 or 1, 1, 1)), - c[3]:padding(ui.Padding.y(1)), - } - - local style = THEME.manager.border_style - self._base = ya.list_merge(self._base or {}, { - v4("border", self._area, ui.Border.ALL):type(type):style(style), - v4("bar", self._chunks[1], ui.Bar.RIGHT):style(style), - v4("bar", self._chunks[3], ui.Bar.LEFT):style(style), - - bar("┬", c[1].right - 1, c[1].y), - bar("┴", c[1].right - 1, c[1].bottom - 1), - bar("┬", c[2].right, c[2].y), - bar("┴", c[2].right, c[2].bottom - 1), - }) - - old_build(self, ...) - end -end - -return { setup = setup } diff --git a/plugins/git.yazi/DO_NOT_MODIFY_ANYTHING_IN_THIS_DIRECTORY b/plugins/git.yazi/DO_NOT_MODIFY_ANYTHING_IN_THIS_DIRECTORY deleted file mode 100644 index e69de29..0000000 diff --git a/plugins/git.yazi/LICENSE b/plugins/git.yazi/LICENSE deleted file mode 100644 index fb5b1d6..0000000 --- a/plugins/git.yazi/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 yazi-rs - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/plugins/git.yazi/README.md b/plugins/git.yazi/README.md deleted file mode 100644 index fad9ce4..0000000 --- a/plugins/git.yazi/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# git.yazi - -> [!NOTE] -> Yazi v0.3.3 or later is required for this plugin to work. - -Show the status of Git file changes as linemode in the file list. - -https://github.com/user-attachments/assets/34976be9-a871-4ffe-9d5a-c4cdd0bf4576 - -## Installation - -```sh -ya pack -a yazi-rs/plugins:git -``` - -## Setup - -Add the following to your `~/.config/yazi/init.lua`: - -```lua -require("git"):setup() -``` - -And register it as fetchers in your `~/.config/yazi/yazi.toml`: - -```toml -[[plugin.prepend_fetchers]] -id = "git" -name = "*" -run = "git" - -[[plugin.prepend_fetchers]] -id = "git" -name = "*/" -run = "git" -``` - -## Advanced - -> [!NOTE] -> This section currently requires Yazi nightly that includes https://github.com/sxyazi/yazi/pull/1637 - -You can customize the [Style](https://yazi-rs.github.io/docs/plugins/layout#style) of the status sign with: - -- `THEME.git.modified` -- `THEME.git.added` -- `THEME.git.untracked` -- `THEME.git.ignored` -- `THEME.git.deleted` -- `THEME.git.updated` - -For example: - -```lua --- ~/.config/yazi/init.lua -THEME.git = THEME.git or {} -THEME.git.modified = ui.Style():fg("blue") -THEME.git.deleted = ui.Style():fg("red"):bold() -``` - -You can also customize the text of the status sign with: - -- `THEME.git.modified_sign` -- `THEME.git.added_sign` -- `THEME.git.untracked_sign` -- `THEME.git.ignored_sign` -- `THEME.git.deleted_sign` -- `THEME.git.updated_sign` - -For example: - -```lua --- ~/.config/yazi/init.lua -THEME.git = THEME.git or {} -THEME.git.modified_sign = "M" -THEME.git.deleted_sign = "D" -``` - -## License - -This plugin is MIT-licensed. For more information check the [LICENSE](LICENSE) file. diff --git a/plugins/git.yazi/init.lua b/plugins/git.yazi/init.lua deleted file mode 100644 index 3cf79a8..0000000 --- a/plugins/git.yazi/init.lua +++ /dev/null @@ -1,208 +0,0 @@ -local WIN = ya.target_family() == "windows" -local PATS = { - { "[MT]", 6 }, -- Modified - { "[AC]", 5 }, -- Added - { "?$", 4 }, -- Untracked - { "!$", 3 }, -- Ignored - { "D", 2 }, -- Deleted - { "U", 1 }, -- Updated - { "[AD][AD]", 1 }, -- Updated -} - -local function match(line) - local signs = line:sub(1, 2) - for _, p in ipairs(PATS) do - local path - if signs:find(p[1]) then - path = line:sub(4, 4) == '"' and line:sub(5, -2) or line:sub(4) - path = WIN and path:gsub("/", "\\") or path - end - if not path then - elseif path:find("[/\\]$") then - return p[2] == 3 and 30 or p[2], path:sub(1, -2) - else - return p[2], path - end - end -end - -local function root(cwd) - local is_worktree = function(url) - local file, head = io.open(tostring(url)), nil - if file then - head = file:read(8) - file:close() - end - return head == "gitdir: " - end - - repeat - local next = cwd:join(".git") - local cha = fs.cha(next) - if cha and (cha.is_dir or is_worktree(next)) then - return tostring(cwd) - end - cwd = cwd:parent() - until not cwd -end - -local function bubble_up(changed) - local new, empty = {}, Url("") - for k, v in pairs(changed) do - if v ~= 3 and v ~= 30 then - local url = Url(k):parent() - while url and url ~= empty do - local s = tostring(url) - new[s] = (new[s] or 0) > v and new[s] or v - url = url:parent() - end - end - end - return new -end - -local function propagate_down(ignored, cwd, repo) - local new, rel = {}, cwd:strip_prefix(repo) - for k, v in pairs(ignored) do - if v == 30 then - if rel:starts_with(k) then - new[tostring(repo:join(rel))] = 30 - elseif cwd == repo:join(k):parent() then - new[k] = 3 - end - end - end - return new -end - -local add = ya.sync(function(st, cwd, repo, changed) - st.dirs[cwd] = repo - st.repos[repo] = st.repos[repo] or {} - for k, v in pairs(changed) do - if v == 0 then - st.repos[repo][k] = nil - elseif v == 30 then - st.dirs[k] = "" - else - st.repos[repo][k] = v - end - end - ya.render() -end) - -local remove = ya.sync(function(st, cwd) - local dir = st.dirs[cwd] - if not dir then - return - end - - ya.render() - st.dirs[cwd] = nil - if not st.repos[dir] then - return - end - - for _, r in pairs(st.dirs) do - if r == dir then - return - end - end - st.repos[dir] = nil -end) - -local function setup(st, opts) - st.dirs = {} - st.repos = {} - - opts = opts or {} - opts.order = opts.order or 1500 - - -- Chosen by ChatGPT fairly, PRs are welcome to adjust them - local t = THEME.git or {} - local styles = { - [6] = t.modified and ui.Style(t.modified) or ui.Style():fg("#ffa500"), - [5] = t.added and ui.Style(t.added) or ui.Style():fg("#32cd32"), - [4] = t.untracked and ui.Style(t.untracked) or ui.Style():fg("#a9a9a9"), - [3] = t.ignored and ui.Style(t.ignored) or ui.Style():fg("#696969"), - [2] = t.deleted and ui.Style(t.deleted) or ui.Style():fg("#ff4500"), - [1] = t.updated and ui.Style(t.updated) or ui.Style():fg("#1e90ff"), - } - local signs = { - [6] = t.modified_sign and t.modified_sign or "", - [5] = t.added_sign and t.added_sign or "", - [4] = t.untracked_sign and t.untracked_sign or "", - [3] = t.ignored_sign and t.ignored_sign or "", - [2] = t.deleted_sign and t.deleted_sign or "", - [1] = t.updated_sign and t.updated_sign or "U", - } - - Linemode:children_add(function(self) - local url = self._file.url - local dir = st.dirs[tostring(url:parent())] - local change - if dir then - change = dir == "" and 3 or st.repos[dir][tostring(url):sub(#dir + 2)] - end - - if not change or signs[change] == "" then - return ui.Line("") - elseif self._file:is_hovered() then - return ui.Line { ui.Span(" "), ui.Span(signs[change]) } - else - return ui.Line { ui.Span(" "), ui.Span(signs[change]):style(styles[change]) } - end - end, opts.order) -end - -local function fetch(self) - local cwd = self.files[1].url:parent() - local repo = root(cwd) - if not repo then - remove(tostring(cwd)) - return 1 - end - - local paths = {} - for _, f in ipairs(self.files) do - paths[#paths + 1] = tostring(f.url) - end - - -- stylua: ignore - local output, err = Command("git") - :cwd(tostring(cwd)) - :args({ "--no-optional-locks", "-c", "core.quotePath=", "status", "--porcelain", "-unormal", "--no-renames", "--ignored=matching" }) - :args(paths) - :stdout(Command.PIPED) - :output() - if not output then - ya.err("Cannot spawn git command, error code " .. tostring(err)) - return 0 - end - - local changed, ignored = {}, {} - for line in output.stdout:gmatch("[^\r\n]+") do - local sign, path = match(line) - if sign == 30 then - ignored[path] = sign - else - changed[path] = sign - end - end - - if self.files[1].cha.is_dir then - ya.dict_merge(changed, bubble_up(changed)) - ya.dict_merge(changed, propagate_down(ignored, cwd, Url(repo))) - else - ya.dict_merge(changed, propagate_down(ignored, cwd, Url(repo))) - end - - for _, p in ipairs(paths) do - local s = p:sub(#repo + 2) - changed[s] = changed[s] or 0 - end - add(tostring(cwd), repo, changed) - - return 3 -end - -return { setup = setup, fetch = fetch }