Commit cb0e077
modules/dev/yazi/plugins/auto-layout.yazi/main.lua
@@ -1,181 +0,0 @@
--- Auto-Layout Yazi Plugin
--- From https://github.com/josephschmitt/auto-layout.yazi
--- Automatically adjusts the number of Yazi panes based on terminal width.
--- Attempts to use Yazi's configured ratios via `rt.mgr.ratio`.
--- Falls back to fixed internal ratios if `rt.mgr.ratio` is unavailable.
---
--- Usage in init.lua:
--- require("auto-layout").setup({
--- breakpoint_large = 110, -- Width threshold for 3 panes (default: 100)
--- breakpoint_medium = 60, -- Width threshold for 2 panes (default: 50)
--- })
--- If setup is not called, default breakpoints are used.
-
--- --- Debug Flag ---
--- Set to true to enable logging to the file specified below.
-local DEBUG_MODE = false
-
--- --- Logging Setup ---
-local log_file_path = "/tmp/yazi-autolayout-debug.log"
-local log_enabled = DEBUG_MODE
-local function write_log(level, message) if not log_enabled then return end local success, file_or_err = pcall(io.open, log_file_path, "a") if success and file_or_err then local file = file_or_err local timestamp = os.date("%Y-%m-%d %H:%M:%S") local write_success, write_err = pcall(function() file:write(string.format("[%s] [%s] %s\n", timestamp, level, message)) file:flush() file:close() end) if not write_success then io.stderr:write(string.format("[auto-layout] LOG WRITE ERROR: %s\n", tostring(write_err))) end else io.stderr:write(string.format("[auto-layout] LOG FILE ERROR: Could not open %s - %s\n", log_file_path, tostring(file_or_err))) end end
-local function log_info(message) write_log("INFO", message) end
-local function log_warn(message) write_log("WARN", message) end
-local function log_error(message) write_log("ERROR", message) end
-if DEBUG_MODE then local success, file_or_err = pcall(io.open, log_file_path, "w"); if success and file_or_err then file_or_err:close() end end
--- --- End Logging Setup ---
-
-
--- --- Configuration ---
-local plugin_config = {
- breakpoint_large = 100,
- breakpoint_medium = 50,
-}
--- Define fallback ratios in case Yazi's runtime ratios are unavailable.
-local fallback_ratios = { parent = 2, current = 3, preview = 4, all = 9 }
--- --- End Configuration ---
-
-
--- --- Plugin Module ---
-local M = {}
-
-local original_layout = nil
-local layout_overridden = false
-
--- Get layout ratios, trying the modern 'rt.mgr.ratio' first.
-local function get_layout_ratios()
- local using_fallback = true -- Assume fallback needed initially
- local ratios = fallback_ratios -- Default to fallback
-
- log_info("Attempting to get ratios from rt.mgr.ratio...")
- -- Check the modern Yazi runtime object path
- if rt and rt.mgr and rt.mgr.ratio and
- rt.mgr.ratio.parent and rt.mgr.ratio.current and
- rt.mgr.ratio.preview and rt.mgr.ratio.all then
- log_info(" -> Success: Found ratios in rt.mgr.ratio.")
- ratios = rt.mgr.ratio
- using_fallback = false
- else
- -- Log the specific reason for failure if possible
- if not rt then log_warn(" -> Failed: 'rt' object not available.")
- elseif not rt.mgr then log_warn(" -> Failed: 'rt.mgr' not available.")
- elseif not rt.mgr.ratio then log_warn(" -> Failed: 'rt.mgr.ratio' not available.")
- else log_warn(" -> Failed: One or more required ratios (parent, current, preview, all) missing in rt.mgr.ratio.") end
- log_warn(" -> Using fallback ratios.")
- end
- return ratios, using_fallback
-end
-
--- The layout override function
-local function auto_layout_override(self)
- log_info("--- Tab:layout Start ---")
-
- if not self._area or not self._area.w then
- log_error("ERROR - self._area or self._area.w is nil!")
- if original_layout then original_layout(self) end
- return
- end
- if not ui or not ui.Layout or not ui.Constraint then
- log_error("ERROR - 'ui' object or components not available!")
- if original_layout then original_layout(self) end
- return
- end
-
- local w = self._area.w
- -- Get ratios using the function that tries 'rt.mgr.ratio' first
- local ratios, using_fallback = get_layout_ratios()
-
- log_info(string.format("Width=%d, Ratios: p=%d, c=%d, pv=%d, all=%d%s",
- w, ratios.parent, ratios.current, ratios.preview, ratios.all,
- using_fallback and " (FALLBACK)" or " (FROM rt.mgr.ratio)"))
-
- local success, result = pcall(function()
- local constraints = nil
- local layout_type = ""
- if w > plugin_config.breakpoint_large then
- layout_type = "3-column"
- constraints = {
- ui.Constraint.Ratio(ratios.parent, ratios.all),
- ui.Constraint.Ratio(ratios.current, ratios.all),
- ui.Constraint.Ratio(ratios.preview, ratios.all),
- }
- elseif w > plugin_config.breakpoint_medium then
- layout_type = "2-column"
- constraints = {
- ui.Constraint.Ratio(0, ratios.all),
- ui.Constraint.Ratio(ratios.current + ratios.parent, ratios.all),
- ui.Constraint.Ratio(ratios.preview + ratios.parent, ratios.all),
- }
- else
- layout_type = "1-column"
- constraints = {
- ui.Constraint.Ratio(0, ratios.all),
- ui.Constraint.Ratio(ratios.all, ratios.all),
- ui.Constraint.Ratio(0, ratios.all),
- }
- end
-
- log_info(string.format("Applying %s layout.", layout_type))
- self._chunks = ui.Layout() :direction(ui.Layout.HORIZONTAL) :constraints(constraints) :split(self._area)
- if not self._chunks then error("Layout split returned nil chunks") end
- end)
-
- if not success or not self._chunks then
- log_error(string.format("ERROR - Layout failed (success=%s): %s. Falling back.", tostring(success), tostring(result or "chunks nil")))
- if original_layout then original_layout(self) end
- else
- log_info("Layout split successful.")
- end
- log_info("--- Tab:layout End ---")
-end
-
--- Setup function
-function M.setup(user_config)
- if DEBUG_MODE and not layout_overridden then
- print(string.format("[auto-layout] DEBUG MODE ENABLED. Logging to: %s", log_file_path))
- end
- log_info("--- Plugin Setup Start ---")
-
- if type(user_config) == "table" then
- log_info("Applying user config:")
- for k, v in pairs(user_config) do
- if plugin_config[k] ~= nil then
- log_info(string.format(" Setting plugin_config[%s] = %s", k, tostring(v)))
- plugin_config[k] = v
- else
- log_warn(string.format("WARN - Ignoring unknown config key: %s", k))
- end
- end
- else
- log_info("No user config provided or invalid type.")
- end
- log_info(string.format("Final plugin config - large: %d, medium: %d", plugin_config.breakpoint_large, plugin_config.breakpoint_medium))
-
- if layout_overridden then
- log_warn("WARN - Tab:layout already overridden. Skipping.")
- return
- end
-
- log_info("Attempting to override Tab:layout...")
- if not Tab then
- log_error("ERROR - Cannot override layout: Global 'Tab' is not available!")
- return
- end
-
- if not original_layout then
- log_info("Storing original Tab.layout function.")
- original_layout = Tab.layout
- if not original_layout then
- log_warn("WARN - Original Tab.layout is nil! Fallback may not work.")
- original_layout = function() log_error("ERROR - Executing dummy original_layout (original was nil).") end
- end
- end
-
- log_info("Assigning auto_layout_override to Tab.layout.")
- Tab.layout = auto_layout_override
- layout_overridden = true
- log_info("Tab:layout override complete.")
- log_info("--- Plugin Setup End ---")
-end
-
-return M
\ No newline at end of file
modules/dev/yazi/default.nix → modules/dev/yazi.nix
@@ -1,5 +1,21 @@
{
- flake.modules.homeManager.dev = {pkgs, ...}: {
+ flake.modules.homeManager.dev = {pkgs, ...}: let
+ yaziPlugins.auto-layout = pkgs.yaziPlugins.mkYaziPlugin {
+ pname = "auto-layout.yazi";
+ version = "unstable-25-07-30";
+ src = pkgs.fetchFromGitHub {
+ owner = "luccahuguet";
+ repo = "auto-layout.yazi";
+ rev = "e24bee9f6dd15ff80eae1b3dc1a6b06ee7e66121";
+ hash = "sha256-4vRIGU/ArXhW9ervhyNhpfDN7UF4pqVYnxi6FExlgGk=";
+ };
+ meta = {
+ description = "Automatically change the column layout in yazi based on available window width";
+ homepage = "https://github.com/luccahuguet/auto-layout.yazi";
+ license = pkgs.lib.licenses.mit;
+ };
+ };
+ in {
programs.yazi = {
enable = true;
enableBashIntegration = true;
@@ -9,7 +25,7 @@
git = pkgs.yaziPlugins.git;
# starship = pkgs.yaziPlugins.starship;
wl-clipboard = pkgs.yaziPlugins.wl-clipboard;
- auto-layout = ./plugins/auto-layout.yazi;
+ auto-layout = yaziPlugins.auto-layout;
};
initLua = ''
require("git"):setup()