cleaned the repo
This commit is contained in:
parent
5286b73bf9
commit
c3ce9f1847
11 changed files with 6 additions and 417 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1 +1,2 @@
|
||||||
flavors
|
flavors
|
||||||
|
plugins
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit fa1da70556a5654f5d40d063a95e55ecc63b3ef7
|
|
|
@ -1,8 +1,10 @@
|
||||||
[plugin]
|
[plugin]
|
||||||
deps = [
|
deps = [
|
||||||
{ use = "yazi-rs/plugins:full-border", rev = "dc11879" },
|
{ use = "yazi-rs/plugins:full-border" },
|
||||||
{ use = "yazi-rs/plugins:git", rev = "4fcd737" },
|
{ use = "yazi-rs/plugins:git" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[flavor]
|
[flavor]
|
||||||
deps = []
|
deps = [
|
||||||
|
{ use = "BennyOe/onedark" },
|
||||||
|
]
|
||||||
|
|
|
@ -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.
|
|
|
@ -1,32 +0,0 @@
|
||||||
# full-border.yazi
|
|
||||||
|
|
||||||
Add a full border to Yazi to make it look fancier.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 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.
|
|
|
@ -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 }
|
|
|
@ -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.
|
|
|
@ -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.
|
|
|
@ -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 }
|
|
Loading…
Add table
Add a link
Reference in a new issue