Drawer Explorer

approved

by Dylan Zhang

A pop-up drawer file tree with modal vim-style navigation: hjkl to move, a/r/d file ops, i to filter, Esc back to normal mode. - This plugin has not been manually reviewed by Obsidian staff.

2 stars73 downloadsUpdated 18d agoMIT

Drawer Explorer

A pop-up file and tag explorer for Obsidian with modal, vim-style navigation and a live preview pane — inspired by the snacks.nvim / neo-tree explorer experience. Focus defaults to the tree, not a search bar.

  • Modal navigation: hjkl through the tree, a/r/d file operations, x/y/p move & copy, Space to mark files for bulk operations — no mouse required.
  • Filter like a picker: i focuses the fuzzy filter. In Files, Esc keeps the results for j/k navigation; in Tags, it returns to the hierarchy.
  • Tags as a lens: press t to browse nested tags, focus one as a virtual collection, then progressively refine it with co-occurring tags.
  • Preview pane: rendered markdown, images, .canvas minimaps, .base summaries — and a small provider API so plugins can add more types.
  • Theme-aware, keyboard-first, works alongside vim plugins such as Vim Motions.

Status: young but daily-driven. Expect sharp edges; issues and PRs welcome.

Showcase

File lens

Browse the physical folder tree with modal navigation, file operations, fuzzy filtering, and rich previews for Markdown, images, Canvas, Bases, and text.

Drawer Explorer file lens with an expanded vault tree and rendered Markdown preview

Tag lens

Focus a hierarchical tag, combine co-occurring refinements with AND, navigate the deduplicated notes, and inspect rendered previews without leaving the drawer.

Drawer Explorer tag lens with hierarchical refinements, matching notes, and a rendered Mermaid preview

Installation

Install Drawer Explorer from the Obsidian Community Plugin directory, or open Settings → Community plugins → Browse and search for Drawer Explorer.

Other installation options:

  • BRAT for pre-release builds: add Fjx-dylanZ/obsidian-drawer-explorer as a beta plugin.
  • Manual: grab manifest.json, main.js, and styles.css from the latest release into <vault>/.obsidian/plugins/drawer-explorer/, then enable it in Settings → Community plugins.
  • From source: npm install && npm run build, then copy the same three files (or use OBSIDIAN_PLUGIN_DIR=... npm run install:vault).

Open it with the Drawer Explorer: Open drawer command. Use Drawer Explorer: Open tag lens when you want a dedicated hotkey that opens directly into tags.

Keys

Normal mode (default)

KeyAction
j / kMove selection down / up
hCollapse folder, or jump to parent
l / EnterToggle folder / open file in the active tab (replacing its current file)
oOpen file in a new tab in the current pane
tSwitch to the tag lens
gg / GFirst / last row
SpaceMark/unmark item (bulk select; Ctrl/Cmd-click too)
aNew file (name), folder (name/), or nested path (a/b/c.md)
rRename (link-aware, updates wikilinks)
dDelete (confirm with y)
x / yCut / copy
X / YRemove item from the cut / copy clipboard
pPaste into selected folder
i / /Focus the filter bar
PToggle the preview pane
Ctrl+d / Ctrl+uScroll the preview half a page
RRefresh
Esc / qClear marks → clear filter → close

Tag lens

Press t in normal mode (or click Tags) to switch from physical folders to a metadata-backed tag tree. Parent tags include notes from nested descendants, matching Obsidian's own tag-search semantics. A note matching several active tags appears only once in the Notes results.

KeyAction
j / kMove selection down / up
h / lCollapse/parent or expand/first child (l opens a selected note)
EnterFollow a tag into its notes, commit a refinement, or open a note in the active tab
SpaceEstablish a scope or toggle an AND refinement without opening a note
oOpen a selected note in a new tab
i / /Fuzzy-filter visible tags and matching note paths
tReturn to the file lens
EscClear query → remove newest refinement → leave tag scope → close from the root
qIn normal mode, close immediately while preserving the current tag browsing context

Focused tags are shown as chips above the filter. Counts update against the current result set, and tag edits made elsewhere in Obsidian refresh the lens from the metadata cache. Files whose metadata is still indexing are not incorrectly shown as untagged.

Tag navigation is resumable for the current Obsidian session. Reopening the drawer restores its scope, refinements, and expansion state. When the active note is visible in that scope, the cursor follows it; otherwise the previous logical row is restored. Text entered in the fuzzy filter is transient and is cleared on close.

Within the Tags section, Enter establishes a scope and follows its first note, while Space establishes the scope without opening one and keeps the cursor among refinements when any are available. Within Refine, Enter adds the highlighted constraint and follows the resulting notes; Space toggles it and stays. l only moves deeper—it expands a collapsed branch or moves to its first child—while h owns collapse and parent navigation.

The first tag-lens version is intentionally read-only: file creation, rename/delete, and cut/copy/paste remain in the file lens. Tag mutation needs a separate workflow because renaming or merging a tag can rewrite many notes.

Bulk actions

Mark items with Space (highlighted rows), then d/x/y act on all marked items instead of the cursor row (p pastes the whole set). Marks survive filtering, so you can i-filter, mark a few results, filter again, and mark more — then cut and paste them into one folder. Esc clears the marks.

Clipped items show a dot on the right edge — accent for copy, red (plus strikethrough) for cut — until pasted. X/Y takes items back out of the cut/copy clipboard.

Filter mode

Type to fuzzy-match file paths, or tag and note paths in the tag lens. Ctrl+j/Ctrl+k or arrows move the selection and Enter activates it. In the file lens, Esc pops back to normal mode keeping the filtered results so you can navigate them with j/k; in the tag lens it clears the transient search and returns to the restored hierarchy.

Previews

The right pane previews the selected item. Built-in providers:

ProviderHandlesRenders
markdown.mdRendered markdown (theme-styled, frontmatter stripped)
imagepng/jpg/svg/webp/…Inline image
canvas.canvasSVG minimap of nodes/edges with colors and labels
base.baseViews, filters, formulas, and properties summary
textjson/yaml/ts/lua/…Raw text (capped)
fallbackeverything elseType + size placeholder

Adding a preview provider (for plugin devs)

Providers are resolved first-match-wins. From another plugin:

const drawerExplorer = this.app.plugins.plugins["drawer-explorer"];
drawerExplorer?.registerPreviewProvider(
	{
		id: "csv-table",
		canPreview: (file) => file.extension === "csv",
		render: async ({ app, el, file, component }) => {
			const raw = await app.vault.cachedRead(file);
			// render into `el`; use `component` for MarkdownRenderer lifecycles
		},
	},
	{ before: "text" }, // outrank the generic text provider
);

See CONTRIBUTING.md for the code map and provider guide.

Vim Motions integration

vim.keymap.set("n", "<leader>e", function()
	vim.cmd("obcommand drawer-explorer:open")
end, { desc = "Explorer drawer" })

-- global (works when focus is outside the editor):
vim.obsidian.keymap.set("<leader>e", ":obcommand drawer-explorer:open", { desc = "Explorer drawer" })

License

MIT

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.