Hey everyone!
For the last few month’s, I’ve been using NerdTree as the file browser in my VEX setup. It got the job done, but something always felt a bit... heavy. So recently, I updated VEX and decided to strip it out, going back to Vim’s built-in Netrw for a while. It was fine—familiar, minimal—but after a while, it started to feel a bit too barebones. I missed having a clear, structured tree, and more importantly, I really, really missed seeing my Git status at a glance.
A few nights ago, I found myself down a rabbit hole, reading through the source code of various file explorers: NERDTree, fern.vim, ranger.vim. The source for ranger.vim caught my eye. It was strikingly simple—a clean, single-file impl…
Hey everyone!
For the last few month’s, I’ve been using NerdTree as the file browser in my VEX setup. It got the job done, but something always felt a bit... heavy. So recently, I updated VEX and decided to strip it out, going back to Vim’s built-in Netrw for a while. It was fine—familiar, minimal—but after a while, it started to feel a bit too barebones. I missed having a clear, structured tree, and more importantly, I really, really missed seeing my Git status at a glance.
A few nights ago, I found myself down a rabbit hole, reading through the source code of various file explorers: NERDTree, fern.vim, ranger.vim. The source for ranger.vim caught my eye. It was strikingly simple—a clean, single-file implementation. You can see it here: https://github.com/francoiscabrol/ranger.vim/blob/master/plugin/ranger.vim
That was the spark. I thought, "I could build my own. Something tailored exactly to my workflow." I chatted with GPT to bounce around ideas and figure out a sensible architecture. The decision was made: I was going to build it.
Why Build Another File Explorer?
Netrw had become a bit too boring for my needs. My workflow is deeply intertwined with Git. I need to know, at a glance, what’s changed, what’s staged, and what state my branch is in—even outside of a Git command. I’m pretty particular about this; even my Bash prompt is heavily configured to show Git info (you can see that setup here: https://github.com/m-mdy-m/dotfiles/blob/main/bash/modules/prompt.sh).
I needed that same level of awareness inside my Vim file tree. No more switching to a terminal to run git status. I wanted the story of my repository told right there in the directory listing.
So, I built FTX - File Tree eXplorer.
What is FTX?
FTX is a fast, asynchronous file browser for Vim with first-class Git integration. It’s not trying to be a monolithic project manager. It’s a focused tool: a clean tree view that shows you your files and exactly what Git thinks about them.
The core philosophy is speed and clarity. Like fern.vim, it’s designed from the ground up with async operations, so nothing blocks your editor. It’s lightweight, has zero dependencies besides Vim 8.0+ (with +job and +timers), and aims to feel like a natural, unobtrusive part of the environment.
FTX supports:
- Async file tree rendering (non-blocking I/O)
- Auto-sync when switching buffers
- Expand/Collapse all directories
- Show/hide hidden files
- Fully customizable icons
- Mouse support
- Multi-file marking for batch operations
- Git status indicators and branch info
- Terminal integration
- Lazy-loading for performance
The project is fully open-source: https://github.com/m-mdy-m/ftx.vim
What Makes It Different?
It’s All About Git This is the heart of FTX. Every file can show a Git status symbol right before its name:
+ staged.js- Staged for commit* modified.js- Modified, not staged? untracked.js- Not tracked by git- deleted.js- Deleted! conflict.js- Merge conflict
The status line shows your branch and repository status: [main] ↑2 ↓1 $ tells you you’re on main, 2 commits ahead, 1 behind, and have a stash. It’s the context I always wanted.
Async By Design File operations and Git status parsing happen asynchronously. Opening a deep directory or refreshing status won’t freeze Vim. It just works in the background.
Minimal & Understandable Inspired by the simplicity of ranger.vim’s code, FTX is built to be lean and maintainable. No complex plugin frameworks, no mysterious abstractions. It’s a Vim plugin that does one thing well. You can see the entire philosophy in the key mappings—familiar and intuitive:
| Key | Action |
|---|---|
o, Enter | Open file / Toggle directory |
t | Open in new tab |
s / v | Open in split |
r / R | Refresh tree / Git status |
I | Toggle hidden files |
- / ~ | Go up / Go home |
q | Close |
Installation
vim-plug
Plug 'm-mdy-m/ftx.vim'
:PlugInstall
Vim 8 packages
git clone https://github.com/m-mdy-m/ftx.vim ~/.vim/pack/ftx/start/ftx
Manual
git clone https://github.com/m-mdy-m/ftx.vim
cd ftx.vim
make install
Usage:
:FTX " Open tree in current directory
:FTXToggle " Toggle tree visibility
F2 " Quick toggle key
F3 " Refresh tree
? " Show help inside FTX
Open with Directory:
vim .
vim ~/projects
FTX opens automatically with the directory.
Built for a Specific Need, Shared for Everyone
FTX was born from my personal itch: the need for a fast, Git-integrated file tree that stays out of the way. It’s opinionated in its focus. It won’t preview images, manage remote files, or replace a full project drawer. It will show you your files and their Git state, quickly and reliably.
It stands on the shoulders of great explorers that came before—netrw, NERDTree, fern.vim, ranger.vim—and tries to carve out its own simple niche.
Let’s Talk About It!
This is just the beginning. FTX works great for my daily use, but I’m sure there are edges to smooth and ideas I haven’t considered.
Like with VEX, I don’t want this to evolve in a vacuum. Tools are best shaped by the people who use them.
If a fast, git-aware, no-nonsense file tree sounds useful to you, I’d love for you to check it out, break it, and tell me about it.
- Star the repo: https://github.com/m-mdy-m/ftx.vim
- Read the docs: They’re short, I promise.
- Open an issue or PR: Found a bug? Have a neat idea? Let me know.
What’s your take on file explorers in Vim?