{"id":49028927,"url":"https://github.com/wadackel/eda.nvim","last_synced_at":"2026-05-17T09:03:16.581Z","repository":{"id":350870498,"uuid":"1208589907","full_name":"wadackel/eda.nvim","owner":"wadackel","description":"🌿 Explore as a tree, edit as a buffer — a file explorer for Neovim that combines hierarchical navigation with buffer-native file operations.","archived":false,"fork":false,"pushed_at":"2026-04-19T07:14:41.000Z","size":2996,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-19T09:03:19.359Z","etag":null,"topics":["file-explorer","filer","lua","neovim","neovim-plugin"],"latest_commit_sha":null,"homepage":"","language":"Lua","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wadackel.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"wadackel"}},"created_at":"2026-04-12T13:47:27.000Z","updated_at":"2026-04-19T07:15:15.000Z","dependencies_parsed_at":null,"dependency_job_id":"7ff7e6cb-7b3e-4ca6-8fed-d9ffe047f820","html_url":"https://github.com/wadackel/eda.nvim","commit_stats":null,"previous_names":["wadackel/eda.nvim"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/wadackel/eda.nvim","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wadackel%2Feda.nvim","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wadackel%2Feda.nvim/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wadackel%2Feda.nvim/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wadackel%2Feda.nvim/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wadackel","download_url":"https://codeload.github.com/wadackel/eda.nvim/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wadackel%2Feda.nvim/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32248862,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T03:17:44.950Z","status":"ssl_error","status_checked_at":"2026-04-25T03:16:45.208Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["file-explorer","filer","lua","neovim","neovim-plugin"],"created_at":"2026-04-19T09:00:38.369Z","updated_at":"2026-05-17T09:03:16.574Z","avatar_url":"https://github.com/wadackel.png","language":"Lua","funding_links":["https://github.com/sponsors/wadackel"],"categories":[],"sub_categories":[],"readme":"# 🌿 eda.nvim\n\nExplore as a tree, edit as a buffer — a file explorer for Neovim that combines hierarchical navigation with buffer-native file operations.\n\n[![CI](https://github.com/wadackel/eda.nvim/actions/workflows/ci.yaml/badge.svg)](https://github.com/wadackel/eda.nvim/actions/workflows/ci.yaml)\n![Neovim](https://img.shields.io/badge/Neovim-%3E%3D0.11-green?logo=neovim\u0026logoColor=white)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\n## Demo\n\n### Tree View\n\n![Tree View](./docs/assets/tree-basic.png)\n\n### Buffer Editing\n\n![Buffer Editing](./docs/assets/buffer-edit.gif)\n\n### Split Operation\n\n![Split Operation](./docs/assets/split-operation.gif)\n\n### Preview\n\n| File Preview | Directory Preview |\n|--------------|-------------------|\n| ![File Preview](./docs/assets/preview-file.png) | ![Directory Preview](./docs/assets/preview-directory.png) |\n\n### Filter \u0026 Inspect\n\n| Git Changes Filter | Inspect Float |\n|--------------------|---------------|\n| ![Git Changes Filter](./docs/assets/git-filter.png) | ![Inspect Float](./docs/assets/inspect-float.png) |\n\n### Layouts\n\n| Split | Replace |\n|-------|---------|\n| ![Split](./docs/assets/layout-split.png) | ![Replace](./docs/assets/layout-replace.png) |\n\n## Why eda.nvim?\n\n- ✏️ **Buffer-native editing meets tree view** — Edit the buffer to rename, delete, create, and move files, then `:w` to apply. Combines oil.nvim's buffer-editing paradigm with a full collapsible tree view\n- ⚡ **Progressive async rendering** — The target file's ancestor chain is scanned first, so the cursor lands instantly even in large repositories. Remaining directories load in the background\n- 🧩 **Extensible action system** — Every operation lives in a named registry. Custom actions receive the same `ActionContext` as built-in ones, making them first-class citizens\n- 🎨 **Rich customization** — 60+ highlight groups across 6 categories, function-based config options (`header.format`, `ignore_patterns`, `preview.max_file_size`), and event hooks for plugin integration\n\n\u003e For architecture and design decisions, see [ARCHITECTURE.md](docs/ARCHITECTURE.md).\n\n## Features\n\n- **Buffer-native editing** — Rename, delete, and create files by editing the buffer, then `:w` to apply\n- **Tree view with hierarchy** — Collapsible directory tree, not flat per-directory listing\n- **Progressive async rendering** — Ancestor chain scanned first for instant cursor placement\n- **Git integration** — Async status detection with visual indicators\n- **Multiple layouts** — `float`, `split_left`, `split_right`, `replace`\n- **Extensible action system** — Named registry with custom actions as first-class citizens\n- **netrw replacement** — `hijack_netrw` option for seamless default browsing\n- **60+ highlight groups** — Full appearance customization across 6 categories\n- **Event hooks** — `EdaTreeOpen`, `EdaTreeClose`, `EdaMutationPre`, `EdaMutationPost`, `EdaRootChanged` for plugin integration. See [`doc/eda.nvim.txt`](doc/eda.nvim.txt) for event payload details.\n\n## Requirements\n\n- Neovim \u003e= 0.11\n- [git](https://git-scm.com/) (optional, for git status integration)\n- [mini.icons](https://github.com/echasnovski/mini.icons) or [nvim-web-devicons](https://github.com/nvim-tree/nvim-web-devicons) (optional, for file icons)\n\n## Installation\n\n\u003cdetails\u003e\n\u003csummary\u003elazy.nvim\u003c/summary\u003e\n\n```lua\n{\n  \"wadackel/eda.nvim\",\n  opts = {},\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003emini.deps\u003c/summary\u003e\n\n```lua\nlocal add = MiniDeps.add\nadd(\"wadackel/eda.nvim\")\nrequire(\"eda\").setup()\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003epacker.nvim\u003c/summary\u003e\n\n```lua\nuse({\n  \"wadackel/eda.nvim\",\n  config = function()\n    require(\"eda\").setup()\n  end,\n})\n```\n\n\u003c/details\u003e\n\n## Quick Start\n\n```lua\nrequire(\"eda\").setup()\n```\n\nOpen the explorer with the `:Eda` command:\n\n```vim\n:Eda                    \" Open in current directory (float)\n:Eda kind=split_left    \" Open as left sidebar\n:Eda ~/projects         \" Open specific directory\n```\n\n\u003e [!TIP]\n\u003e Set `hijack_netrw = true` to use eda as the default directory browser. See the [Replace netrw](#recipes) recipe for details.\n\nSee [Configuration](#configuration) below for all options, or `:help eda.nvim` for the full reference.\n\n## Configuration\n\nBelow are all available options with their default values. You only need to specify the options you want to change — everything is deep-merged with the defaults.\n\n```lua\nrequire(\"eda\").setup({\n  -- Markers used to detect the project root\n  root_markers = { \".git\", \".hg\" },\n  -- Show hidden/dotfiles by default\n  show_hidden = true,\n  -- Show git-ignored files by default\n  show_gitignored = true,\n  -- Show only files with git changes (toggle via `gs`, default off)\n  show_only_git_changes = false,\n  -- Lua patterns matched against file/directory name (not glob)\n  -- Accepts a function: fun(root_path): string[]\n  ignore_patterns = {},\n\n  window = {\n    -- Layout: \"float\", \"split_left\", \"split_right\", \"replace\"\n    kind = \"float\",\n    -- Border style (see :help nvim_open_win)\n    border = \"rounded\",\n    -- Per-kind window dimensions (string percentage or number or function)\n    kinds = {\n      float = { width = \"94%\", height = \"80%\" },\n      replace = {},\n      split_left = { width = \"30%\" },\n      split_right = { width = \"30%\" },\n    },\n    -- Buffer-local options applied to the eda buffer\n    buf_opts = {\n      filetype = \"eda\",\n      buftype = \"acwrite\",\n    },\n    -- Window-local options applied to the eda window\n    win_opts = {\n      number = false,\n      relativenumber = false,\n      wrap = false,\n      signcolumn = \"no\",\n      cursorline = true,\n      foldcolumn = \"0\",\n    },\n  },\n\n  -- Use eda as the default directory browser (replaces netrw)\n  hijack_netrw = false,\n  -- Close explorer window after selecting a file\n  close_on_select = false,\n\n  -- Confirmation dialogs (boolean or table; true = all defaults below)\n  confirm = {\n    -- Confirm before deleting files\n    delete = true,\n    -- Confirm moves: true, false, or \"overwrite_only\"\n    move = \"overwrite_only\",\n    -- Confirm creation: true, false, or integer (threshold count)\n    create = false,\n    -- Path display in confirm dialogs: \"full\", \"short\", \"minimal\", or fun(path, root_path): string\n    path_format = \"short\",\n    -- Signs shown in confirm dialogs\n    signs = {\n      create = \"\", -- nf-oct-plus\n      delete = \"\", -- nf-oct-circle_slash\n      move = \"\",   -- nf-oct-arrow_right\n    },\n  },\n\n  -- Use trash instead of permanent delete\n  delete_to_trash = true,\n  -- Follow symbolic links when scanning\n  follow_symlinks = true,\n  -- Directories with more entries than this skip sorting for performance\n  large_dir_threshold = 5000,\n  -- Maximum depth for initial directory expansion\n  expand_depth = 5,\n\n  -- Automatically reveal the focused file in the tree\n  update_focused_file = {\n    -- Enable auto-reveal\n    enable = false,\n    -- Also change the tree root to the file's project root\n    update_root = false,\n  },\n\n  icon = {\n    -- Separator between icon and file name\n    separator = \" \",\n    -- Icon provider: \"mini_icons\", \"nvim_web_devicons\", or \"none\"\n    provider = \"mini_icons\",\n    -- Directory glyphs keyed by open/empty state\n    directory = {\n      collapsed = \"󰉋\",\n      expanded = \"󰝰\",\n      empty = \"󰉖\",\n      empty_open = \"󰷏\",\n    },\n    -- Optional hook to override icons per node. Returning nil falls through\n    -- to the built-in directory glyphs and the provider lookup.\n    -- See `doc/eda.md` for full reference.\n    --\n    -- custom = function(name, node)\n    --   if name == \"justfile\" then return \"󱃔\", \"EdaFileIcon\" end\n    --   return nil\n    -- end,\n    custom = nil,\n  },\n\n  git = {\n    -- Enable git status integration\n    enabled = true,\n    -- Git status icons\n    icons = {\n      untracked = \"\", -- nf-oct-question\n      added = \"\",     -- nf-oct-plus\n      modified = \"\",  -- nf-oct-diff\n      deleted = \"\",   -- nf-oct-circle_slash\n      renamed = \"\",   -- nf-oct-arrow_right\n      staged = \"\",    -- nf-oct-check\n      conflict = \"\",  -- nf-oct-alert\n      ignored = \"◌\",\n    },\n  },\n\n  indent = {\n    -- Indentation width per nesting level\n    width = 2,\n  },\n\n  preview = {\n    -- Enable file preview panel\n    enabled = false,\n    -- Debounce delay in milliseconds before showing preview\n    debounce = 100,\n    -- Maximum file size in bytes to preview (also accepts fun(path): integer)\n    max_file_size = 102400,\n  },\n\n  -- Show full filename in a floating window when truncated in narrow windows\n  full_name = {\n    -- Enable floating window for truncated filenames\n    enabled = true,\n  },\n\n  -- Marker icon displayed before the file/folder icon on marked nodes\n  -- Use `m` (default `mark_toggle`) to mark/unmark nodes. Marked nodes are\n  -- highlighted via EdaMarked / EdaMarkedIcon / EdaMarkedName and become the\n  -- default target for mark-aware actions (delete, cut, copy, duplicate, paste)\n  -- when no Visual selection is active.\n  mark = {\n    -- Set to \"\" to disable the prefix icon (name highlight still applies)\n    icon = \"󰄲\", -- nf-md-checkbox_marked (U+F0132)\n  },\n\n  -- Header displayed above the tree (set to false to disable entirely)\n  header = {\n    -- Format: \"short\", or fun(root_path): string|false\n    format = \"short\",\n    -- Position: \"left\", \"center\", \"right\"\n    position = \"left\",\n    -- Show a divider line below the header\n    divider = false,\n  },\n\n  -- Set default_mappings = false to clear all defaults before applying yours\n  -- Key mappings: string = built-in action, function = custom, false = disable\n  mappings = {\n    [\"\u003cCR\u003e\"] = \"select\",              -- Open file or toggle directory\n    [\"\u003c2-LeftMouse\u003e\"] = \"select\",     -- Open file or toggle directory\n    [\"\u003cC-t\u003e\"] = \"select_tab\",        -- Open file in new tab\n    [\"|\"] = \"select_vsplit\",          -- Open file in vertical split\n    [\"-\"] = \"select_split\",           -- Open file in horizontal split\n    [\"q\"] = \"close\",                  -- Close explorer\n    [\"^\"] = \"parent\",                 -- Navigate to parent directory\n    [\"~\"] = \"cwd\",                    -- Change root to cwd\n    [\"gC\"] = \"cd\",                    -- Change root to directory\n    [\"W\"] = \"collapse_recursive\",     -- Collapse directory recursively\n    [\"E\"] = \"expand_recursive\",       -- Expand directory recursively\n    [\"gW\"] = \"collapse_all\",          -- Collapse all directories\n    [\"gE\"] = \"expand_all\",            -- Expand all directories\n    [\"yp\"] = \"yank_path\",            -- Yank relative path\n    [\"yP\"] = \"yank_path_absolute\",   -- Yank absolute path\n    [\"yn\"] = \"yank_name\",            -- Yank file name\n    [\"\u003cC-l\u003e\"] = \"refresh\",           -- Refresh file tree\n    [\"\u003cC-h\u003e\"] = \"collapse_node\",     -- Collapse node or go to parent\n    [\"g.\"] = \"toggle_hidden\",         -- Toggle hidden files\n    [\"gi\"] = \"toggle_gitignored\",    -- Toggle gitignored files\n    [\"gs\"] = \"toggle_git_changes\",   -- Toggle git-changes filter\n    [\"[c\"] = \"prev_git_change\",      -- Jump to previous git change\n    [\"]c\"] = \"next_git_change\",      -- Jump to next git change\n    [\"m\"] = \"mark_toggle\",           -- Mark/unmark node (Visual selection or cursor)\n    [\"M\"] = \"mark_clear_all\",        -- Clear all marks\n    [\"D\"] = \"delete\",                -- Delete target nodes (Visual \u003e marks \u003e cursor)\n    [\"go\"] = \"system_open\",          -- Open with system application\n    [\"K\"] = \"debug\",                 -- Print node data for debugging\n    [\"\u003cleader\u003ei\"] = \"inspect\",       -- Show node stat in a floating window\n    [\"gd\"] = \"duplicate\",            -- Duplicate target nodes (Visual \u003e marks \u003e cursor)\n    [\"gx\"] = \"cut\",                  -- Cut target nodes (Visual \u003e marks \u003e cursor)\n    [\"gy\"] = \"copy\",                 -- Copy target nodes (Visual \u003e marks \u003e cursor)\n    [\"gp\"] = \"paste\",                -- Paste from register\n    [\"g?\"] = \"help\",                 -- Show keymap help\n    [\"ga\"] = \"actions\",              -- Open action picker\n    [\"!\"] = \"open_replace\",          -- Reopen float explorer in replace mode\n    [\"\u003cC-f\u003e\"] = \"preview_scroll_down\", -- Scroll preview down (half page)\n    [\"\u003cC-b\u003e\"] = \"preview_scroll_up\",   -- Scroll preview up (half page)\n    [\"\u003cC-w\u003ev\"] = \"split\",            -- Open split pane\n    [\"\u003cC-w\u003es\"] = \"vsplit\",           -- Open horizontal split pane\n  },\n\n  -- Callback to customize highlight groups: fun(groups: table)\n  on_highlight = nil,\n  -- Window picker function for file selection: fun(): integer?\n  select_window = nil,\n})\n```\n\n\u003e [!TIP]\n\u003e See `:help eda.nvim` for detailed descriptions of each option, available actions, events, and highlight groups.\n\n## Actions\n\nAll operations in eda.nvim are registered as named actions in an action registry. Built-ins and user-defined actions share the same namespace — anything registered can be bound to a key via `mappings`, dispatched programmatically, or discovered at runtime through the `actions` picker (`ga` by default).\n\n### Built-in Actions\n\nThe table below groups built-ins by role. See [`:help eda-actions`](doc/eda.nvim.txt) for per-action parameters, edge cases, and target-resolution rules.\n\n#### Navigation\n\n| Action | Description |\n| --- | --- |\n| `select` | Open file in the target window or toggle directory open/closed |\n| `select_split` | Open file in a horizontal split |\n| `select_vsplit` | Open file in a vertical split |\n| `select_tab` | Open file in a new tab |\n| `parent` | Navigate to the parent directory (changes root when invoked on root) |\n| `cwd` | Change root to the current working directory |\n| `cd` | Change root to the directory under the cursor |\n\n#### Tree Manipulation\n\n| Action | Description |\n| --- | --- |\n| `collapse_all` | Collapse all directories except root |\n| `collapse_node` | Collapse current directory, or move cursor to parent if already collapsed |\n| `collapse_recursive` | Recursively collapse a directory and all its children |\n| `expand_all` | Expand every directory up to `expand_depth` |\n| `expand_recursive` | Recursively expand the directory under the cursor up to `expand_depth` |\n\n#### Yank\n\n| Action | Description |\n| --- | --- |\n| `yank_path` | Yank the relative path to the system clipboard |\n| `yank_path_absolute` | Yank the absolute path to the system clipboard |\n| `yank_name` | Yank the filename to the system clipboard |\n\n#### File Operations\n\nTarget resolution is unified across `delete` / `cut` / `copy` / `duplicate`: **Visual selection \u003e marked nodes \u003e cursor node**. The root node is always excluded.\n\n| Action | Description |\n| --- | --- |\n| `mark_toggle` | Mark/unmark target node(s). Normal mode toggles the cursor node and advances; Visual mode toggles each selected node |\n| `mark_clear_all` | Clear all marks across the tree |\n| `delete` | Delete target nodes (routes through `confirm.delete` dialog) |\n| `cut` | Move target paths into the register; `paste` later moves them |\n| `copy` | Copy target paths into the register; `paste` later duplicates them |\n| `paste` | Paste from the register into the directory under the cursor |\n| `duplicate` | Duplicate target nodes in place, appending `_copy` on name collision |\n\n#### Display\n\n| Action | Description |\n| --- | --- |\n| `toggle_hidden` | Toggle visibility of hidden files (dotfiles) |\n| `toggle_gitignored` | Toggle visibility of git-ignored files |\n| `toggle_git_changes` | Toggle filter showing only files with git changes |\n| `next_git_change` | Jump to the next git-changed file (wraps at end) |\n| `prev_git_change` | Jump to the previous git-changed file |\n| `toggle_preview` | Toggle the file preview pane |\n| `preview_scroll_down` | Scroll the preview down by half a page |\n| `preview_scroll_up` | Scroll the preview up by half a page |\n| `preview_scroll_page_down` | Scroll the preview down by a full page |\n| `preview_scroll_page_up` | Scroll the preview up by a full page |\n\n#### Misc\n\n| Action | Description |\n| --- | --- |\n| `refresh` | Rescan the filesystem and re-render the tree |\n| `close` | Close the explorer window |\n| `system_open` | Open the file with the system default application |\n| `debug` | Print node data to the console (developer API) |\n| `inspect` | Show node stat (size, permissions, timestamps, etc.) in a floating window |\n| `help` | Show keybinding help in a floating window |\n| `split` | Open the explorer in a new vertical split with the same root |\n| `vsplit` | Open the explorer in a new horizontal split with the same root |\n| `open_replace` | Reopen a float explorer in the previous window using replace layout |\n| `actions` | Open an action picker listing every registered action |\n\n### Defining Custom Actions\n\nRegister a function under a name, then map it like any built-in. Custom actions also appear in the `actions` picker, so they remain discoverable without a dedicated keymap.\n\n```lua\nlocal action = require(\"eda.action\")\n\naction.register(\"my_action\", function(ctx)\n  local node = ctx.buffer:get_cursor_node(ctx.window.winid)\n  if node then\n    vim.notify(\"Selected: \" .. node.path)\n  end\nend, { desc = \"Show selected file path\" })\n\nrequire(\"eda\").setup({\n  mappings = {\n    [\"\u003cC-x\u003e\"] = \"my_action\",\n  },\n})\n```\n\n#### `action.register(name, fn, opts?)`\n\n- `name` `string` — Action identifier used by `mappings` and dispatched calls.\n- `fn` `fun(ctx: eda.ActionContext)` — Action body. Receives the context described below.\n- `opts.desc` `string?` — Human-readable description shown in the `actions` picker.\n\n#### `ActionContext`\n\nEvery action receives a context table with handles to the running explorer state:\n\n| Field | Type | Purpose |\n| --- | --- | --- |\n| `ctx.store` | `eda.Store` | Tree node store (lookup, mutations) |\n| `ctx.buffer` | `eda.Buffer` | Explorer buffer API (cursor node, line helpers) |\n| `ctx.window` | `eda.Window` | Explorer window (`winid`, focus helpers) |\n| `ctx.scanner` | `eda.Scanner` | Filesystem scanner |\n| `ctx.config` | `eda.Config` | Resolved configuration |\n| `ctx.explorer` | `eda.Explorer` | Current explorer instance (`root_path`, `instance_id`) |\n\nSee [`:help eda-api`](doc/eda.nvim.txt) for the full public API, including the `action.dispatch` / `action.list` / `action.get_entry` helpers.\n\n#### Example: open a terminal in the directory under the cursor\n\n```lua\naction.register(\"open_terminal\", function(ctx)\n  local node = ctx.buffer:get_cursor_node(ctx.window.winid)\n  local dir = node and node.is_dir and node.path\n    or node and vim.fn.fnamemodify(node.path, \":h\")\n    or ctx.explorer.root_path\n  vim.cmd(\"split | terminal\")\n  vim.fn.chansend(vim.b.terminal_job_id, \"cd \" .. vim.fn.shellescape(dir) .. \"\\n\")\nend, { desc = \"Open terminal in directory\" })\n\nrequire(\"eda\").setup({\n  mappings = {\n    [\"\u003cC-\\\\\u003e\"] = \"open_terminal\",\n  },\n})\n```\n\n## Recipes\n\nCommon customization patterns. See `:help eda.nvim` for the full configuration reference.\n\n\u003cdetails\u003e\n\u003csummary\u003eReplace netrw\u003c/summary\u003e\n\nUse eda.nvim as the default directory browser. `:edit \u003cdirectory\u003e`, `:Explore`, and other netrw entry points will open eda instead.\n\n```lua\nrequire(\"eda\").setup({\n  hijack_netrw = true,\n})\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eLSP file operations\u003c/summary\u003e\n\nNotify language servers when files are renamed or moved via the `EdaMutationPost` event. Works with [nvim-lsp-file-operations](https://github.com/antosha417/nvim-lsp-file-operations) or a manual handler.\n\n```lua\nvim.api.nvim_create_autocmd(\"User\", {\n  pattern = \"EdaMutationPost\",\n  callback = function(ev)\n    -- ev.data.operations contains { type, src, dst } entries\n    -- ev.data.results contains the operation outcomes\n    local ok, lsp_ops = pcall(require, \"lsp-file-operations\")\n    if ok then\n      lsp_ops.did_rename(ev.data.operations)\n    end\n  end,\n})\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eWindow picker integration\u003c/summary\u003e\n\nUse [nvim-window-picker](https://github.com/s1n7ax/nvim-window-picker) (or any picker that returns a window ID) to choose where files open.\n\n```lua\nrequire(\"eda\").setup({\n  select_window = function()\n    return require(\"window-picker\").pick_window()\n  end,\n})\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eCustom header with git branch\u003c/summary\u003e\n\nShow the current git branch in the header instead of the directory path.\n\n```lua\nrequire(\"eda\").setup({\n  header = {\n    format = function(root_path)\n      local result = vim.system(\n        { \"git\", \"-C\", root_path, \"branch\", \"--show-current\" },\n        { text = true }\n      ):wait()\n      if result.code == 0 and result.stdout ~= \"\" then\n        return result.stdout:gsub(\"\\n\", \"\")\n      end\n      return vim.fn.fnamemodify(root_path, \":~\")\n    end,\n    position = \"left\",\n  },\n})\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eProject-aware ignore patterns\u003c/summary\u003e\n\nDynamically filter files based on project type. Patterns use **Lua pattern syntax** (not glob).\n\n```lua\nrequire(\"eda\").setup({\n  ignore_patterns = function(root_path)\n    local patterns = { \"%.DS_Store$\" }\n    if vim.uv.fs_stat(root_path .. \"/package.json\") then\n      table.insert(patterns, \"^node_modules$\")\n    end\n    if vim.uv.fs_stat(root_path .. \"/Cargo.toml\") then\n      table.insert(patterns, \"^target$\")\n    end\n    return patterns\n  end,\n})\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eCustomize highlights\u003c/summary\u003e\n\nOverride highlight groups to match your colorscheme. The `on_highlight` callback receives the groups table before it is applied — modify entries in-place.\n\n```lua\nrequire(\"eda\").setup({\n  on_highlight = function(groups)\n    groups.EdaDirectoryName = { fg = \"#89b4fa\", bold = true }\n    groups.EdaDirectoryIcon = { fg = \"#89b4fa\" }\n    -- Apply git status colors to file names (transparent by default)\n    groups.EdaGitModifiedName = { link = \"EdaGitModified\" }\n    groups.EdaGitAddedName = { link = \"EdaGitAdded\" }\n  end,\n})\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eCustomize icons\u003c/summary\u003e\n\nCombine `icon.provider`, `icon.directory`, and the `icon.custom` hook to fully control every icon. This example builds a minimal UI with plain Unicode characters — no Nerd Font required.\n\n```lua\nrequire(\"eda\").setup({\n  icon = {\n    provider = \"none\",\n    directory = {\n      collapsed = \"▸\",\n      expanded = \"▾\",\n      empty = \"▸\",\n      empty_open = \"▾\",\n    },\n    custom = function(name, node)\n      if node.type == \"directory\" then\n        return nil\n      end\n      return \"·\", \"EdaFileIcon\"\n    end,\n  },\n})\n```\n\n\u003c/details\u003e\n\n## Documentation\n\n- `:help eda.nvim` — Full reference (configuration, actions, API, events, highlights)\n- [CHANGELOG.md](CHANGELOG.md) — Release history\n- [ARCHITECTURE.md](docs/ARCHITECTURE.md) — Architecture, design philosophy, and trade-offs\n- [CONTRIBUTING.md](CONTRIBUTING.md) — Development setup and guidelines\n\n## Contributing\n\nContributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.\n\n## License\n\n[MIT © wadackel](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwadackel%2Feda.nvim","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwadackel%2Feda.nvim","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwadackel%2Feda.nvim/lists"}