local map = vim.keymap.set local last_file_buf local previous_file_buf local function is_real_file_buffer(buf) return vim.api.nvim_buf_is_valid(buf) and vim.bo[buf].buflisted and vim.bo[buf].buftype == '' and vim.bo[buf].filetype ~= 'netrw' and vim.api.nvim_buf_get_name(buf) ~= '' end local function is_netrw_buffer(buf) if not vim.api.nvim_buf_is_valid(buf) then return false end return vim.bo[buf].filetype == 'netrw' or vim.api.nvim_buf_get_name(buf):match('NetrwTreeListing$') ~= nil end local function switch_to_buffer(buf) vim.cmd('buffer ' .. buf) end local function switch_to_native_alternate() pcall(vim.cmd, 'buffer #') end local function jump_to_alternate_file() local alternate = vim.fn.bufnr('#') if is_real_file_buffer(alternate) then switch_to_buffer(alternate) return end if is_netrw_buffer(alternate) and is_real_file_buffer(previous_file_buf) then switch_to_buffer(previous_file_buf) return end switch_to_native_alternate() end -- Netrw configuration for file browsing -- Native Neovim file explorer (no plugins required) -- Hide the banner (that annoying help text at the top) vim.g.netrw_banner = 0 -- Tree view by default (3 = tree style) -- Options: 0=thin, 1=long, 2=wide, 3=tree vim.g.netrw_liststyle = 3 -- Preview in horizontal split (underneath) vim.g.netrw_preview = 0 -- Open preview splits below (1=below, 0=above) vim.g.netrw_alto = 0 -- Window size for preview splits (percentage for preview window) -- 50% split when pressing 'p' vim.g.netrw_winsize = 50 -- Keep working directory unchanged when browsing (1 = don't change directory) -- Setting to 1 prevents netrw from changing vim's working directory vim.g.netrw_keepdir = 1 -- Open files in the same window (replace netrw buffer) -- Options: 0=same window, 1=horizontal split, 2=vertical split, 3=new tab, 4=previous window -- Using 0 so Enter opens file in netrw window itself vim.g.netrw_browse_split = 0 -- Sort order: name (empty), time (t), size (s), exten (e) vim.g.netrw_sort_by = 'name' -- Hide dotfiles by default (toggle with 'gh' in netrw) vim.g.netrw_list_hide = [[^\.\.\=/\=$]] -- Use human-readable file sizes vim.g.netrw_sizestyle = 'H' -- Netrw file explorer keymaps -- Open netrw in new tab at current file's directory map('n', 'nt', function() local current_file_dir = vim.fn.expand('%:p:h') vim.cmd('tabnew') vim.cmd('Explore ' .. vim.fn.fnameescape(current_file_dir)) end, { desc = 'Netrw: Tab at current file dir', silent = true }) -- Open netrw in new tab at project root (stored at startup) map('n', 'nT', function() vim.cmd('tabnew') vim.cmd('Explore ' .. vim.fn.fnameescape(vim.g.project_root)) end, { desc = 'Netrw: Tab at project root', silent = true }) -- Open netrw in current window at project root (stored at startup) map('n', 'nr', function() vim.cmd('Explore ' .. vim.fn.fnameescape(vim.g.project_root)) end, { desc = 'Netrw: Open at project root', silent = true }) map('n', '', jump_to_alternate_file, { desc = 'Buffer: Alternate file skipping netrw', silent = true }) map('n', '', jump_to_alternate_file, { desc = 'Buffer: Alternate file skipping netrw', silent = true }) vim.api.nvim_create_autocmd('BufEnter', { desc = 'Track recent real file buffers for alternate-buffer jumps', callback = function(args) local buf = args.buf if is_real_file_buffer(buf) and buf ~= last_file_buf then previous_file_buf = last_file_buf last_file_buf = buf end end, }) -- Enable line numbers in netrw buffers vim.api.nvim_create_autocmd('FileType', { pattern = 'netrw', desc = 'Configure netrw buffer-local options', callback = function() vim.bo.buflisted = false vim.opt_local.number = true vim.opt_local.relativenumber = true end, })