From 0c11bfbf8071f619e21c9a8d3a3be99fc33874d0 Mon Sep 17 00:00:00 2001 From: Uyanide Date: Sun, 23 Nov 2025 21:23:58 +0100 Subject: [PATCH] yazi: update & niri: minor adjustments --- config/niri/.config/niri/config.kdl | 4 +- config/shell/.config/fish/post.d/.gitignore | 1 - config/yazi/.config/yazi/package.toml | 10 +- .../.config/yazi/plugins/git.yazi/main.lua | 4 +- .../yazi/plugins/yaziline.yazi/README.md | 125 +++---- .../yazi/plugins/yaziline.yazi/main.lua | 336 +++++++++--------- 6 files changed, 225 insertions(+), 255 deletions(-) diff --git a/config/niri/.config/niri/config.kdl b/config/niri/.config/niri/config.kdl index e0a3fb2..bd975f7 100644 --- a/config/niri/.config/niri/config.kdl +++ b/config/niri/.config/niri/config.kdl @@ -335,7 +335,7 @@ binds { // Actions Mod+V { spawn-sh "pkill -x rofi || rofi-cliphist"; } - Mod+Period { spawn "pkill -x rofi || rofi-emoji"; } + Mod+Period { spawn-sh "pkill -x rofi || rofi-emoji"; } Ctrl+Alt+Delete { spawn "pkill -x wlogout || wlogout -p layer-shell"; } Print { spawn "screenshot-script" "full"; } Mod+Shift+S { spawn "screenshot-script" "area"; } @@ -451,8 +451,6 @@ binds { Mod+Alt+Space { toggle-window-floating; } Alt+Tab { switch-focus-between-floating-and-tiling; } - Mod+Ctrl+W { toggle-column-tabbed-display; } - Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } Mod+M allow-inhibiting=false { quit; } diff --git a/config/shell/.config/fish/post.d/.gitignore b/config/shell/.config/fish/post.d/.gitignore index d18a737..97b693e 100644 --- a/config/shell/.config/fish/post.d/.gitignore +++ b/config/shell/.config/fish/post.d/.gitignore @@ -1,6 +1,5 @@ * !.gitignore !fetch.fish -!fetch.fish.template !sshs.fish !alias.fish \ No newline at end of file diff --git a/config/yazi/.config/yazi/package.toml b/config/yazi/.config/yazi/package.toml index 7be5ddb..d0a90a3 100644 --- a/config/yazi/.config/yazi/package.toml +++ b/config/yazi/.config/yazi/package.toml @@ -1,11 +1,11 @@ [[plugin.deps]] use = "yazi-rs/plugins:git" -rev = "d1c8baa" -hash = "63b6c222bf2103b3023389dde5e2ecfe" +rev = "2301ff8" +hash = "27ca02f49fd236b5cc7bf03c243859fe" [[plugin.deps]] use = "yazi-rs/plugins:smart-enter" -rev = "d1c8baa" +rev = "2301ff8" hash = "56fdabc96fc1f4d53c96eb884b02a5be" [[plugin.deps]] @@ -20,8 +20,8 @@ hash = "e17c11b605d989568a1d1741ca17c584" [[plugin.deps]] use = "llanosrocas/yaziline" -rev = "e79b067" -hash = "f590c5b7d0730e8d6023b1b34ddf7ead" +rev = "e7042a8" +hash = "9c2ab18ff5368056904e4ebb61b17571" [flavor] deps = [] diff --git a/config/yazi/.config/yazi/plugins/git.yazi/main.lua b/config/yazi/.config/yazi/plugins/git.yazi/main.lua index e6b3a36..66ef3bb 100644 --- a/config/yazi/.config/yazi/plugins/git.yazi/main.lua +++ b/config/yazi/.config/yazi/plugins/git.yazi/main.lua @@ -190,7 +190,7 @@ local function setup(st, opts) Linemode:children_add(function(self) local url = self._file.url - local repo = st.dirs[tostring(url.base)] + local repo = st.dirs[tostring(url.base or url.parent)] local code if repo then code = repo == CODES.excluded and CODES.ignored or st.repos[repo][tostring(url):sub(#repo + 2)] @@ -208,7 +208,7 @@ end ---@type UnstableFetcher local function fetch(_, job) - local cwd = job.files[1].url.base + local cwd = job.files[1].url.base or job.files[1].url.parent local repo = root(cwd) if not repo then remove(tostring(cwd)) diff --git a/config/yazi/.config/yazi/plugins/yaziline.yazi/README.md b/config/yazi/.config/yazi/plugins/yaziline.yazi/README.md index eeb8d12..9cf6426 100644 --- a/config/yazi/.config/yazi/plugins/yaziline.yazi/README.md +++ b/config/yazi/.config/yazi/plugins/yaziline.yazi/README.md @@ -2,37 +2,59 @@ Simple lualine-like status line for yazi. -Read more about features and configuration [here](#features). +![angly](https://github.com/llanosrocas/yaziline.yazi/blob/main/.github/images/angly.png) +![preview-fullscreen](https://github.com/llanosrocas/yaziline.yazi/blob/main/.github/images/preview-fullscreen.png) -![preview](https://github.com/llanosrocas/yaziline.yazi/blob/master/.github/images/preview.png) +All supported features are listed [here](#features). More presets are available [here](#presets). ## Requirements -- yazi version >= [25.5.28](https://github.com/sxyazi/yazi/releases/tag/v25.5.28) +- yazi version >= [917e1f5](https://github.com/sxyazi/yazi/commit/917e1f54a10445f2e25147c4b81a3c77d8233632) - Font with symbol support. For example [Nerd Fonts](https://www.nerdfonts.com/). +## Compatibility + +To keep the plugin up to date, there are two branches: `main` and `nightly`. +The `main` branch follows major yazi releases, while `nightly` is linked to specific yazi commits or changes. + +This setup allows shipping stable versions on time, while giving early access to "cutting-edge" changes. See matrix below. + +
+Compatibility matrix + +| yaziline | yazi | +| :------------------------------------------------------------------------: | ----------------------------------------------------------------------------------------- | +| [v2.5.2](https://github.com/llanosrocas/yaziline.yazi/releases/tag/v2.5.2) | [917e1f5](https://github.com/sxyazi/yazi/commit/917e1f54a10445f2e25147c4b81a3c77d8233632) | +| [v2.5.1](https://github.com/llanosrocas/yaziline.yazi/releases/tag/v2.5.1) | [917e1f5](https://github.com/sxyazi/yazi/commit/917e1f54a10445f2e25147c4b81a3c77d8233632) | +| [v2.5.0](https://github.com/llanosrocas/yaziline.yazi/releases/tag/v2.5.0) | [v25.5.28](https://github.com/sxyazi/yazi/releases/tag/v25.5.28) | +| [v2.4.0](https://github.com/llanosrocas/yaziline.yazi/releases/tag/v2.4.0) | [v25.4.8](https://github.com/sxyazi/yazi/releases/tag/v25.4.8) | + +
+ ## Installation +1. Using yazi package manager + ```sh ya pkg add llanosrocas/yaziline ``` -Or manually copy `main.lua` to the `~/.config/yazi/plugins/yaziline.yazi/main.lua` +_Or manually copy `main.lua` to the `~/.config/yazi/plugins/yaziline.yazi/main.lua`_ -## Usage - -Add this to your `~/.config/yazi/init.lua`: +2. Add this line to your `~/.config/yazi/init.lua`: ```lua require("yaziline"):setup() ``` -Optionally, configure line: +## Configuration + +This is default config, if you want to see presets go to [this section](#presets). ```lua require("yaziline"):setup({ - color = "#98c379", -- main theme color - secondary_color = "#5A6078", -- secondary color + color = "#98c379", + secondary_color = "#5A6078", default_files_color = "darkgray", -- color of the file counter when it's inactive selected_files_color = "white", yanked_files_color = "green", @@ -51,10 +73,18 @@ require("yaziline"):setup({ filename_max_length = 24, -- truncate when filename > 24 filename_truncate_length = 6, -- leave 6 chars on both sides - filename_truncate_separator = "..." -- the separator of the truncated filename + filename_truncate_separator = "..." }) ``` +By default yaziline uses color values from your `theme.toml`: + +- mode and position font color: th.which.mask.bg +- default_files_color: which.separator_style.fg +- selected_files_color: mgr.count_selected.bg +- yanked_files_color: mgr.count_copied.bg +- cut_files_color: mgr.count_cut.bg + ```  MODE  size  long_file...name.md  S 0 Y 0 | | | | | | | | | @@ -71,73 +101,16 @@ require("yaziline"):setup({ ## Features -### Preconfigured separators - -Choose your style: +### Presets - `angly` - ![angly](https://github.com/llanosrocas/yaziline.yazi/blob/master/.github/images/angly.png) + ![angly](https://github.com/llanosrocas/yaziline.yazi/blob/main/.github/images/angly.png) - `curvy` - ![curvy](https://github.com/llanosrocas/yaziline.yazi/blob/master/.github/images/curvy.png) + ![curvy](https://github.com/llanosrocas/yaziline.yazi/blob/main/.github/images/curvy.png) - `liney` - ![liney](https://github.com/llanosrocas/yaziline.yazi/blob/master/.github/images/liney.png) + ![liney](https://github.com/llanosrocas/yaziline.yazi/blob/main/.github/images/liney.png) - `empty` - ![empty](https://github.com/llanosrocas/yaziline.yazi/blob/master/.github/images/empty.png) - -### Separator customization - -You can provide your own symbols for separators combined with preconfigured separators. For example: - -```lua -require("yaziline"):setup({ - -- Optinal config - separator_style = "angly", -- preconfigured style - separator_open = "", -- instead of  - separator_close = "", -- instead of  - separator_open_thin = "", -- change to anything - separator_close_thin = "", -- change to anything - separator_head = "", -- to match the style - separator_tail = "" -- to match the style -}) -``` - -![empty](https://github.com/llanosrocas/yaziline.yazi/blob/master/.github/images/separator-combination.png) - -_You can find more symbols [here](https://www.nerdfonts.com/cheat-sheet)_ - -### File actions icons - -You can provide your own symbols for `select` and `yank`. For example: - -```lua -require("yaziline"):setup({ - -- Optinal config - select_symbol = "", -- "S" by default - yank_symbol = "󰆐" -- "Y" by default -}) -``` - -![empty](https://github.com/llanosrocas/yaziline.yazi/blob/master/.github/images/file-actions.png) - -_You can find more symbols [here](https://www.nerdfonts.com/cheat-sheet)_ - -### Colors and font weight - -By default yaziline uses color values from your `theme.toml` (or flavor) but you can set custom colors in the `init.lua`: - -```lua -require("yaziline"):setup({ - color = "#98c379", - default_files_color = "darkgray", - selected_files_color = "white", - yanked_files_color = "green", - cut_files_color = "red", -}) -``` - -For example, here is how my line looks like: - -![preview-2](https://github.com/llanosrocas/yaziline.yazi/blob/master/.github/images/preview-2.png) + ![empty](https://github.com/llanosrocas/yaziline.yazi/blob/main/.github/images/empty.png) ### Selected and Yanked Counter @@ -149,9 +122,9 @@ Displays the truncated filename on the left, which is useful for smaller windows ```lua require("yaziline"):setup({ - filename_max_length = 24, -- truncate when filename > 24 - filename_truncate_length = 6, -- leave 6 chars on both sides - filename_truncate_separator = "..." -- the separator of the truncated filename + filename_max_length = 24, + filename_truncate_length = 6, + filename_truncate_separator = "..." }) ``` diff --git a/config/yazi/.config/yazi/plugins/yaziline.yazi/main.lua b/config/yazi/.config/yazi/plugins/yaziline.yazi/main.lua index 3906079..2bbbd16 100644 --- a/config/yazi/.config/yazi/plugins/yaziline.yazi/main.lua +++ b/config/yazi/.config/yazi/plugins/yaziline.yazi/main.lua @@ -1,212 +1,212 @@ ---@diagnostic disable: undefined-global local function setup(_, options) - options = options or {} + options = options or {} - local default_separators = { - angly = { "", "", "", "" }, - curvy = { "", "", "", "" }, - liney = { "", "", "|", "|" }, - empty = { "", "", "", "" }, - } - local separators = default_separators[options.separator_style or "angly"] + local default_separators = { + angly = { "", "", "", "" }, + curvy = { "", "", "", "" }, + liney = { "", "", "|", "|" }, + empty = { "", "", "", "" }, + } + local separators = default_separators[options.separator_style or "angly"] - local config = { - separator_styles = { - separator_open = options.separator_open or separators[1], - separator_close = options.separator_close or separators[2], - separator_open_thin = options.separator_open_thin or separators[3], - separator_close_thin = options.separator_close_thin or separators[4], - separator_head = options.separator_head or "", - separator_tail = options.separator_tail or "", - }, - select_symbol = options.select_symbol or "S", - yank_symbol = options.yank_symbol or "Y", + local config = { + separator_styles = { + separator_open = options.separator_open or separators[1], + separator_close = options.separator_close or separators[2], + separator_open_thin = options.separator_open_thin or separators[3], + separator_close_thin = options.separator_close_thin or separators[4], + separator_head = options.separator_head or "", + separator_tail = options.separator_tail or "", + }, + select_symbol = options.select_symbol or "S", + yank_symbol = options.yank_symbol or "Y", - filename_max_length = options.filename_max_length or 24, - filename_truncate_length = options.filename_truncate_length or 6, - filename_truncate_separator = options.filename_truncate_separator or "...", + filename_max_length = options.filename_max_length or 24, + filename_truncate_length = options.filename_truncate_length or 6, + filename_truncate_separator = options.filename_truncate_separator or "...", - color = options.color or nil, + color = options.color or nil, secondary_color = options.secondary_color or nil, default_files_color = options.default_files_color - or th.which.separator_style.fg - or "darkgray", + or th.which.separator_style:fg() + or "darkgray", selected_files_color = options.selected_files_color - or th.mgr.count_selected.bg - or "white", + or th.mgr.count_selected:bg() + or "white", yanked_files_color = options.selected_files_color - or th.mgr.count_copied.bg - or "green", + or th.mgr.count_copied:bg() + or "green", cut_files_color = options.cut_files_color - or th.mgr.count_cut.bg - or "red", - } + or th.mgr.count_cut:bg() + or "red", + } - local current_separator_style = config.separator_styles + local current_separator_style = config.separator_styles - function Header:count() - return ui.Line({}) - end + function Header:count() + return ui.Line({}) + end - function Status:mode() - local mode = tostring(self._tab.mode):upper() + function Status:mode() + local mode = tostring(self._tab.mode):upper() - local style = self:style() - return ui.Line({ - ui.Span(current_separator_style.separator_head) - :fg(config.color or style.main.bg), - ui.Span(" " .. mode .. " ") - :fg(th.which.mask.bg) - :bg(config.color or style.main.bg), - }) - end + local style = self:style() + return ui.Line({ + ui.Span(current_separator_style.separator_head) + :fg(config.color or style.main:bg()), + ui.Span(" " .. mode .. " ") + :fg(th.which.mask:bg()) + :bg(config.color or style.main:bg()), + }) + end - function Status:size() - local h = self._current.hovered - local size = h and (h:size() or h.cha.len) or 0 + function Status:size() + local h = self._current.hovered + local size = h and (h:size() or h.cha.len) or 0 - local style = self:style() - return ui.Span(current_separator_style.separator_close .. " " .. ya.readable_size(size) .. " ") - :fg(config.color or style.main.bg) - :bg(config.secondary_color or th.which.separator_style.fg) - end + local style = self:style() + return ui.Span(current_separator_style.separator_close .. " " .. ya.readable_size(size) .. " ") + :fg(config.color or style.main:bg()) + :bg(config.secondary_color or th.which.separator_style:fg()) + end - function Status:utf8_sub(str, start_char, end_char) - local start_byte = utf8.offset(str, start_char) - local end_byte = end_char and (utf8.offset(str, end_char + 1) - 1) or #str + function Status:utf8_sub(str, start_char, end_char) + local start_byte = utf8.offset(str, start_char) + local end_byte = end_char and (utf8.offset(str, end_char + 1) - 1) or #str - if not start_byte or not end_byte then - return "" - end + if not start_byte or not end_byte then + return "" + end - return string.sub(str, start_byte, end_byte) - end + return string.sub(str, start_byte, end_byte) + end - function Status:truncate_name(filename, max_length) - local base_name, extension = filename:match("^(.+)(%.[^%.]+)$") - base_name = base_name or filename - extension = extension or "" + function Status:truncate_name(filename, max_length) + local base_name, extension = filename:match("^(.+)(%.[^%.]+)$") + base_name = base_name or filename + extension = extension or "" - if utf8.len(base_name) > max_length then - base_name = self:utf8_sub(base_name, 1, config.filename_truncate_length) - .. config.filename_truncate_separator - .. self:utf8_sub(base_name, -config.filename_truncate_length) - end + if utf8.len(base_name) > max_length then + base_name = self:utf8_sub(base_name, 1, config.filename_truncate_length) + .. config.filename_truncate_separator + .. self:utf8_sub(base_name, -config.filename_truncate_length) + end - return base_name .. extension - end + return base_name .. extension + end - function Status:name() - local h = self._current.hovered - if not h then - return ui.Line({ - ui.Span(current_separator_style.separator_close .. " ") - :fg(config.secondary_color or th.which.separator_style.fg), - ui.Span("Empty dir") - :fg(config.color or style.main.bg), - }) - end + function Status:name() + local h = self._current.hovered + local style = self:style() + if not h then + return ui.Line({ + ui.Span(current_separator_style.separator_close .. " ") + :fg(config.secondary_color or th.which.separator_style:fg()), + ui.Span("Empty dir") + :fg(config.color or style.main:bg()), + }) + end - local truncated_name = self:truncate_name(h.name, config.filename_max_length) + local truncated_name = self:truncate_name(h.name, config.filename_max_length) - local style = self:style() - return ui.Line({ - ui.Span(current_separator_style.separator_close .. " ") - :fg(config.secondary_color or th.which.separator_style.fg), - ui.Span(truncated_name) - :fg(config.color or style.main.bg), - }) - end + return ui.Line({ + ui.Span(current_separator_style.separator_close .. " ") + :fg(config.secondary_color or th.which.separator_style:fg()), + ui.Span(truncated_name) + :fg(config.color or style.main:bg()), + }) + end - function Status:files() - local files_yanked = #cx.yanked - local files_selected = #cx.active.selected - local files_cut = cx.yanked.is_cut + function Status:files() + local files_yanked = #cx.yanked + local files_selected = #cx.active.selected + local files_cut = cx.yanked.is_cut - local selected_fg = files_selected > 0 - and config.selected_files_color - or config.default_files_color - local yanked_fg = files_yanked > 0 - and - (files_cut - and config.cut_files_color - or config.yanked_files_color - ) - or config.default_files_color + local selected_fg = files_selected > 0 + and config.selected_files_color + or config.default_files_color + local yanked_fg = files_yanked > 0 + and + (files_cut + and config.cut_files_color + or config.yanked_files_color + ) + or config.default_files_color - local yanked_text = files_yanked > 0 - and config.yank_symbol .. " " .. files_yanked - or config.yank_symbol .. " 0" + local yanked_text = files_yanked > 0 + and config.yank_symbol .. " " .. files_yanked + or config.yank_symbol .. " 0" - return ui.Line({ - ui.Span(" " .. current_separator_style.separator_close_thin .. " ") - :fg(th.which.separator_style.fg), - ui.Span(config.select_symbol .. " " .. files_selected .. " ") - :fg(selected_fg), - ui.Span(yanked_text .. " ") - :fg(yanked_fg), - }) - end + return ui.Line({ + ui.Span(" " .. current_separator_style.separator_close_thin .. " ") + :fg(th.which.separator_style:fg()), + ui.Span(config.select_symbol .. " " .. files_selected .. " ") + :fg(selected_fg), + ui.Span(yanked_text .. " ") + :fg(yanked_fg), + }) + end - function Status:modified() - local hovered = cx.active.current.hovered + function Status:modified() + local hovered = cx.active.current.hovered - if not hovered then - return "" - end + if not hovered then + return "" + end - local cha = hovered.cha - local time = (cha.mtime or 0) // 1 + local cha = hovered.cha + local time = (cha.mtime or 0) // 1 - return ui.Span(os.date("%Y-%m-%d %H:%M", time) .. " " .. current_separator_style.separator_open_thin .. " ") - :fg(th.which.separator_style.fg) - end + return ui.Span(os.date("%Y-%m-%d %H:%M", time) .. " " .. current_separator_style.separator_open_thin .. " ") + :fg(th.which.separator_style:fg()) + end - function Status:percent() - local percent = 0 - local cursor = self._tab.current.cursor - local length = #self._tab.current.files - if cursor ~= 0 and length ~= 0 then - percent = math.floor((cursor + 1) * 100 / length) - end + function Status:percent() + local percent = 0 + local cursor = self._tab.current.cursor + local length = #self._tab.current.files + if cursor ~= 0 and length ~= 0 then + percent = math.floor((cursor + 1) * 100 / length) + end - if percent == 0 then - percent = " Top " - elseif percent == 100 then - percent = " Bot " - else - percent = string.format(" %2d%% ", percent) - end + if percent == 0 then + percent = " Top " + elseif percent == 100 then + percent = " Bot " + else + percent = string.format(" %2d%% ", percent) + end - local style = self:style() - return ui.Line({ + local style = self:style() + return ui.Line({ ui.Span(" " .. current_separator_style.separator_open) - :fg(config.secondary_color or th.which.separator_style.fg), - ui.Span(percent) - :fg(config.color or style.main.bg) - :bg(config.secondary_color or th.which.separator_style.fg), - ui.Span(current_separator_style.separator_open) - :fg(config.color or style.main.bg) - :bg(config.secondary_color or th.which.separator_style.fg), - }) - end + :fg(config.secondary_color or th.which.separator_style:fg()), + ui.Span(percent) + :fg(config.color or style.main:bg()) + :bg(config.secondary_color or th.which.separator_style:fg()), + ui.Span(current_separator_style.separator_open) + :fg(config.color or style.main:bg()) + :bg(config.secondary_color or th.which.separator_style:fg()), + }) + end - function Status:position() - local cursor = self._tab.current.cursor - local length = #self._tab.current.files + function Status:position() + local cursor = self._tab.current.cursor + local length = #self._tab.current.files - local style = self:style() - return ui.Line({ - ui.Span(string.format(" %2d/%-2d ", math.min(cursor + 1, length), length)) - :fg(th.which.mask.bg) - :bg(config.color or style.main.bg), - ui.Span(current_separator_style.separator_tail):fg(config.color or style.main.bg), - }) - end + local style = self:style() + return ui.Line({ + ui.Span(string.format(" %2d/%-2d ", math.min(cursor + 1, length), length)) + :fg(th.which.mask:bg()) + :bg(config.color or style.main:bg()), + ui.Span(current_separator_style.separator_tail):fg(config.color or style.main:bg()), + }) + end - Status:children_add(Status.files, 4000, Status.LEFT) - Status:children_add(Status.modified, 0, Status.RIGHT) + Status:children_add(Status.files, 4000, Status.LEFT) + Status:children_add(Status.modified, 0, Status.RIGHT) end -return { setup = setup } \ No newline at end of file +return { setup = setup }