recipes.md

Branches > main > a563137 > files / nvim / pack / plugins / opt / oil.nvim / doc / recipes.md

# RecipesHave a cool recipe to share? Open a pull request and add it to this doc!<!-- TOC -->- [Toggle file detail view](#toggle-file-detail-view)- [Show CWD in the winbar](#show-cwd-in-the-winbar)- [Hide gitignored files and show git tracked hidden files](#hide-gitignored-files-and-show-git-tracked-hidden-files)<!-- /TOC -->## Toggle file detail view```lualocal detail = falserequire("oil").setup({  keymaps = {    ["gd"] = {      desc = "Toggle file detail view",      callback = function()        detail = not detail        if detail then          require("oil").set_columns({ "icon", "permissions", "size", "mtime" })        else          require("oil").set_columns({ "icon" })        end      end,    },  },})```## Show CWD in the winbar```lua-- Declare a global function to retrieve the current directoryfunction _G.get_oil_winbar()  local bufnr = vim.api.nvim_win_get_buf(vim.g.statusline_winid)  local dir = require("oil").get_current_dir(bufnr)  if dir then    return vim.fn.fnamemodify(dir, ":~")  else    -- If there is no current directory (e.g. over ssh), just show the buffer name    return vim.api.nvim_buf_get_name(0)  endendrequire("oil").setup({  win_options = {    winbar = "%!v:lua.get_oil_winbar()",  },})```## Hide gitignored files and show git tracked hidden files```lua-- helper function to parse outputlocal function parse_output(proc)  local result = proc:wait()  local ret = {}  if result.code == 0 then    for line in vim.gsplit(result.stdout, "\n", { plain = true, trimempty = true }) do      -- Remove trailing slash      line = line:gsub("/$", "")      ret[line] = true    end  end  return retend-- build git status cachelocal function new_git_status()  return setmetatable({}, {    __index = function(self, key)      local ignore_proc = vim.system(        { "git", "ls-files", "--ignored", "--exclude-standard", "--others", "--directory" },        {          cwd = key,          text = true,        }      )      local tracked_proc = vim.system({ "git", "ls-tree", "HEAD", "--name-only" }, {        cwd = key,        text = true,      })      local ret = {        ignored = parse_output(ignore_proc),        tracked = parse_output(tracked_proc),      }      rawset(self, key, ret)      return ret    end,  })endlocal git_status = new_git_status()-- Clear git status cache on refreshlocal refresh = require("oil.actions").refreshlocal orig_refresh = refresh.callbackrefresh.callback = function(...)  git_status = new_git_status()  orig_refresh(...)endrequire("oil").setup({  view_options = {    is_hidden_file = function(name, bufnr)      local dir = require("oil").get_current_dir(bufnr)      local is_dotfile = vim.startswith(name, ".") and name ~= ".."      -- if no local directory (e.g. for ssh connections), just hide dotfiles      if not dir then        return is_dotfile      end      -- dotfiles are considered hidden unless tracked      if is_dotfile then        return not git_status[dir].tracked[name]      else        -- Check if file is gitignored        return git_status[dir].ignored[name]      end    end,  },})```