Files
godotdev.nvim/doc/hide-files-in-file-explorers.md
2025-10-02 15:23:28 +02:00

3.2 KiB

File Explorers: hide Godot files

Oil.nvim

return {
  "stevearc/oil.nvim",
  opts = {
    default_file_explorer = true,
    view_options = {
      show_hidden = false, -- dotfiles off by default
      is_hidden_file = function(name, _)
        local godot_patterns = {
          '%.uid[/]?$',   -- .uid files
          '%.import[/]?$', -- .import files
          '^%.godot[/]?$', -- .godot directory
          '^%.mono[/]?$',  -- .mono directory
          'godot.*%.tmp$', -- godot temp files
        }
        for _, pat in ipairs(godot_patterns) do
          if name:match(pat) then
            return true
          end
        end
        return false
      end,
    },
  },
  dependencies = { "nvim-tree/nvim-web-devicons" },
  keys = {
    { "-", "<CMD>Oil<CR>", desc = "Open parent directory" },
  },
}

mini.files

The filtering option doesn't work as expected in mini.files. Somehow the filtering system is broken.

This monkey patch approach is working because it intercepts the buffer content at the right moment - after mini.files has processed it but before it's displayed, so the plugin doesn't detect any "user modifications" that would trigger the synchronization warning.

mini.files

return {
  'echasnovski/mini.files',
  keys = {
    {
      '-',
      function()
        require('mini.files').open()
      end,
      desc = 'Open MiniFiles',
    },
  },
  config = function()
    local original_set_lines = vim.api.nvim_buf_set_lines

    local filter_godot_files = function(lines)
      local filtered = {}
      local godot_patterns = {
        '%.uid[/]?$', -- .uid files
        '%.import[/]?$', -- .import files
        '^%.godot[/]?$', -- .godot directory
        '^%.mono[/]?$', -- .mono directory
        'godot.*%.tmp$', -- godot temp files
      }

      for _, line in ipairs(lines) do
        local should_include = true
        for _, pattern in ipairs(godot_patterns) do
          if line:match(pattern) then
            should_include = false
            break
          end
        end
        if should_include then
          table.insert(filtered, line)
        end
      end
      return filtered
    end

    require('mini.files').setup {
      content = {
        filter = function(fs_entry)
          return true
        end, -- Use our custom filtering instead
      },
      mappings = {
        close = 'q',
        go_in = 'l',
        go_in_plus = 'L',
        go_out = 'h',
        go_out_plus = 'H',
        reset = '<BS>',
        reveal_cwd = '@',
        show_help = 'g?',
        synchronize = '=',
        trim_left = '<',
        trim_right = '>',
      },
      options = {
        permanent_delete = true,
        use_as_default_explorer = true,
      },
      windows = {
        max_number = math.huge,
        preview = false,
        width_focus = 50,
        width_nofocus = 15,
        width_preview = 25,
      },
    }

    vim.api.nvim_buf_set_lines = function(buf_id, start, end_idx, strict_indexing, lines)
      local bufname = vim.api.nvim_buf_get_name(buf_id)
      if bufname:match 'minifiles://' and type(lines) == 'table' then
        lines = filter_godot_files(lines)
      end
      return original_set_lines(buf_id, start, end_idx, strict_indexing, lines)
    end
  end,
}