diff --git a/lua/plugins/user.lua b/lua/plugins/user.lua index 239cb9d..fce41a9 100644 --- a/lua/plugins/user.lua +++ b/lua/plugins/user.lua @@ -49,7 +49,7 @@ return { { "akinsho/toggleterm.nvim", enabled = false }, -- pulled in by astrocommunity.pack.typescript; only ever loaded by - -- neo-tree/nvim-tree (both removed) and yazi.nvim handles LSP renames + -- neo-tree/nvim-tree (both removed; yazi runs as a plain snacks terminal) { "antosha417/nvim-lsp-file-operations", enabled = false }, { diff --git a/lua/plugins/yazi.lua b/lua/plugins/yazi.lua index 28e154c..749a18f 100644 --- a/lua/plugins/yazi.lua +++ b/lua/plugins/yazi.lua @@ -1,91 +1,86 @@ ---- Yazi as the default file manager (full neo-tree replacement) +--- Yazi as the default file manager (persistent session, full neo-tree +--- replacement). yazi.nvim was removed: it spawns a NEW yazi process on +--- every toggle (only the last-hovered path survives), so tab arrangements +--- were lost and each "created a new tab for the workspace". Instead, +--- lua/config/yazi_session.lua keeps ONE yazi process alive in a snacks +--- terminal and just hides/shows it — same session, same tabs. +--- File opens come back via ~/.local/bin/yazi-nvim-open -> _G.EditFromYazi +--- (edit / vsplit / split, bound yazi-side in keymap.toml). ---@type LazySpec return { { - "mikavilpas/yazi.nvim", - version = "*", -- latest stable release - event = "VeryLazy", - dependencies = { - { "nvim-lua/plenary.nvim", lazy = true }, - }, - keys = { - { - "-", - mode = { "n", "v" }, - "Yazi", - desc = "Open yazi at the current file", - }, - { - "cw", - "Yazi cwd", - desc = "Open yazi in nvim's working directory", - }, - { - -- replaces AstroNvim's o "Toggle Explorer Focus" (neo-tree) - "o", - "Yazi", - desc = "Open Explorer (yazi at current file)", - }, - { - "", - mode = { "n", "v", "t" }, - function() - -- true toggle: if a yazi window is already open, quit it instead - -- of nesting a second instance (yazi.nvim's toggle() always spawns) - for _, win in ipairs(vim.api.nvim_list_wins()) do - local buf = vim.api.nvim_win_get_buf(win) - if vim.bo[buf].filetype == "yazi" then - -- send `q` to the yazi process so it exits gracefully and - -- saves its state for the next resume - vim.api.nvim_chan_send(vim.bo[buf].channel, "q") - return - end - end - vim.cmd "Yazi toggle" - end, - desc = "Toggle yazi (resume last session)", - }, - }, - ---@type YaziConfig | {} + "folke/snacks.nvim", opts = { - -- yazi replaces netrw/neo-tree when opening directories (nvim .) - open_for_directories = true, - -- keep a single yazi tab: `true` would pass every visible split as an - -- extra path arg, and each one becomes a yazi tab that then persists - -- across toggles (resume), piling up tabs over time - open_multiple_tabs = false, - -- occupy the whole screen instead of a floating popup - floating_window_scaling_factor = 1, - yazi_floating_window_border = "none", - keymaps = { - show_help = "", - -- Open the hovered/selected file(s) as nvim splits. These are - -- buffer-local terminal-mode keymaps on the yazi buffer, so nvim - -- intercepts the chord before the yazi process ever sees it -- - -- nothing is needed in ~/.config/yazi/keymap.toml. Chords match - -- the telescope/snacks picker convention (//). - open_file_in_vertical_split = "", - open_file_in_horizontal_split = "", - -- NOTE: the default (open in tab) shadows the yazi-side - -- "plugin tv" bind from keymap.toml while inside nvim; - -- set open_file_in_tab = false to let reach yazi/tv instead - open_file_in_tab = "", - -- ~/.config/yazi/keymap.toml binds to quit inside yazi; - -- don't hijack it for the quickfix list (multi-select still goes - -- to the quickfix list via the default yazi_opened_multiple_files) - send_to_quickfix_list = false, - }, - integrations = { - -- copy-relative-path action inside snacks pickers too - picker_add_copy_relative_path_action = "snacks.picker", + styles = { + -- fullscreen borderless float for the yazi session terminal + yazi = { + position = "float", + width = 0, + height = 0, + border = "none", + backdrop = false, + }, }, }, - init = function() - -- netrw is fully replaced by yazi (open_for_directories) - vim.g.loaded_netrwPlugin = 1 - end, }, - -- neo-tree is fully replaced by yazi.nvim + { + "AstroNvim/astrocore", + opts = { + mappings = { + n = { + [""] = { + function() require("config.yazi_session").toggle() end, + desc = "Toggle yazi (persistent session)", + }, + ["-"] = { + function() require("config.yazi_session").open_current() end, + desc = "Open yazi at the current file", + }, + ["o"] = { + function() require("config.yazi_session").open_current() end, + desc = "Open Explorer (yazi at current file)", + }, + ["cw"] = { + function() require("config.yazi_session").open(vim.uv.cwd()) end, + desc = "Open yazi in nvim's working directory", + }, + }, + v = { + [""] = { + function() require("config.yazi_session").toggle() end, + desc = "Toggle yazi (persistent session)", + }, + }, + t = { + [""] = { + function() require("config.yazi_session").toggle() end, + desc = "Toggle yazi (persistent session)", + }, + }, + }, + autocmds = { + -- netrw is disabled in lazy_setup.lua (performance.rtp.disabled_plugins); + -- directory buffers (nvim . / :e dir) open in the yazi session instead + yazi_dir_hijack = { + { + event = "BufEnter", + desc = "Open directory buffers in the yazi session", + callback = function(args) + local path = vim.api.nvim_buf_get_name(args.buf) + if path == "" or vim.fn.isdirectory(path) == 0 then return end + vim.bo[args.buf].bufhidden = "wipe" + vim.schedule(function() + if vim.api.nvim_get_current_buf() == args.buf then vim.cmd.enew() end + require("config.yazi_session").open(path) + end) + end, + }, + }, + }, + }, + }, + + -- neo-tree is fully replaced by the yazi session { "nvim-neo-tree/neo-tree.nvim", enabled = false }, }