Another DiRectory EXplorer for Neovim
For showcase GIFs see here
DREX requires Neovim version ≥ 0.5
Install DREX with your favorite plugin manager
use {
'theblob42/drex.nvim',
requires = 'kyazdani42/nvim-web-devicons', -- optional
}
Plug 'theblob42/drex.nvim'
Plug 'kyazdani42/nvim-web-devicons' " optional
You only need to install nvim-web-devicons if you like to have nice file type icons. The plugin works fine without it.
Open a DREX buffer in the current working directory
:Drex
You can also provide a target path
:Drex ~/projects
To open the parent directory of the current file
:Drex %:h
Check the manual for
cmdline-special
andfilename-modifiers
DREX also comes with a simple project drawer functionality
:DrexDrawerOpen
See
:help drex-commands
for more available commands
To see the definition of all default keybindings see the configuration section
j
and k
like in any other VIM buffer to navigate up and downv
is mapped to V
because there is no need for charwise selectionBasic navigation
l
expands the current element
<Right>
and<2-LeftMouse>
are alternative keybindings
h
collapses the current directories subtree
<Left>
and<RightMouse>
are alternative keybindings
<C-v>
opens a file in a vertical split<C-x>
opens a file in a horizontal split<C-t>
opens a file in a new tab<F5>
reloads the current directory (dependent on the cursor position)<C-h>
opens a new DREX buffer in the parent directory of the current root<C-l>
opens the directory under the cursor in a new DREX bufferJumping
gj
jumps to the next siblinggk
jumps to the previous siblinggh
jumps to the parent directory of the current elementClipboard
m
marks or unmarks the current element (add or remove it from the clipboard)M
marks the current element (add it to the clipboard)u
unmarks the current element (remove it from the clipboard)cc
clears the clipboard contentcs
to show and edit the content of the clipboard in a floating windowActions
s
shows the stats for the current elementa
creates a new file or directory/
(\
on Windows)foo/bar/file
will create foo
and bar
if they don't exist yet)d
deletes the element under the cursor (or the visual selection)D
deletes all elements currently contained in the clipboardp
copies all elements from the clipboard to the path under the cursorP
moves all elements from the clipboard to the path under the cursorr
renames the element under the cursor (or the visual selection)foo/bar/file
will create foo
and bar
if they don't exist yet)R
to multi rename all elements from the clipboardCopy strings
y
copies the name of the element under the cursorY
copies the relative path of the element under the cursor<C-Y>
copies the absolute path of the element under the cursorIn visual mode these copy all selected elements (separated by "\n")
There is no initial setup needed to use DREX.
However you may configure certain settings to your liking.
Check out the default configuration:
require('drex.config').configure {
icons = {
file_default = "",
dir_open = "",
dir_closed = "",
link = "",
others = "",
},
colored_icons = true,
hide_cursor = true,
hijack_netrw = false,
sorting = function(a, b)
local aname, atype = a[1], a[2]
local bname, btype = b[1], b[2]
local aisdir = atype == 'directory'
local bisdir = btype == 'directory'
if aisdir ~= bisdir then
return aisdir
end
return aname < bname
end,
drawer = {
default_width = 30,
window_picker = {
enabled = true,
labels = 'abcdefghijklmnopqrstuvwxyz',
},
},
disable_default_keybindings = false,
keybindings = {
['n'] = {
['v'] = 'V',
['l'] = '<cmd>lua require("drex").expand_element()<CR>',
['h'] = '<cmd>lua require("drex").collapse_directory()<CR>',
['<right>'] = '<cmd>lua require("drex").expand_element()<CR>',
['<left>'] = '<cmd>lua require("drex").collapse_directory()<CR>',
['<2-LeftMouse>'] = '<LeftMouse><cmd>lua require("drex").expand_element()<CR>',
['<RightMouse>'] = '<LeftMouse><cmd>lua require("drex").collapse_directory()<CR>',
['<C-v>'] = '<cmd>lua require("drex").open_file("vs")<CR>',
['<C-x>'] = '<cmd>lua require("drex").open_file("sp")<CR>',
['<C-t>'] = '<cmd>lua require("drex").open_file("tabnew")<CR>',
['<C-l>'] = '<cmd>lua require("drex").open_directory()<CR>',
['<C-h>'] = '<cmd>lua require("drex").open_parent_directory()<CR>',
['<F5>'] = '<cmd>lua require("drex").reload_directory()<CR>',
['gj'] = '<cmd>lua require("drex.jump").jump_to_next_sibling()<CR>',
['gk'] = '<cmd>lua require("drex.jump").jump_to_prev_sibling()<CR>',
['gh'] = '<cmd>lua require("drex.jump").jump_to_parent()<CR>',
['s'] = '<cmd>lua require("drex.actions").stats()<CR>',
['a'] = '<cmd>lua require("drex.actions").create()<CR>',
['d'] = '<cmd>lua require("drex.actions").delete("line")<CR>',
['D'] = '<cmd>lua require("drex.actions").delete("clipboard")<CR>',
['p'] = '<cmd>lua require("drex.actions").copy_and_paste()<CR>',
['P'] = '<cmd>lua require("drex.actions").cut_and_move()<CR>',
['r'] = '<cmd>lua require("drex.actions").rename()<CR>',
['R'] = '<cmd>lua require("drex.actions").multi_rename("clipboard")<CR>',
['M'] = '<cmd>DrexMark<CR>',
['u'] = '<cmd>DrexUnmark<CR>',
['m'] = '<cmd>DrexToggle<CR>',
['cc'] = '<cmd>lua require("drex.actions").clear_clipboard()<CR>',
['cs'] = '<cmd>lua require("drex.actions").open_clipboard_window()<CR>',
['y'] = '<cmd>lua require("drex.actions").copy_element_name()<CR>',
['Y'] = '<cmd>lua require("drex.actions").copy_element_relative_path()<CR>',
['<C-y>'] = '<cmd>lua require("drex.actions").copy_element_absolute_path()<CR>',
},
['v'] = {
['d'] = ':lua require("drex.actions").delete("visual")<CR>',
['r'] = ':lua require("drex.actions").multi_rename("visual")<CR>',
['M'] = ':DrexMark<CR>',
['u'] = ':DrexUnmark<CR>',
['m'] = ':DrexToggle<CR>',
['y'] = ':lua require("drex.actions").copy_element_name(true)<CR>',
['Y'] = ':lua require("drex.actions").copy_element_relative_path(true)<CR>',
['<C-y>'] = ':lua require("drex.actions").copy_element_absolute_path(true)<CR>',
}
},
on_enter = nil,
on_leave = nil,
}
Check out :help drex-configuration
for more details about the individual options
See also the wiki pages about configuration and custom actions for more information
Like vim-dirvish every line is just a file path hidden via conceal
(plus indentation and an icon). For file system scanning, file interactions (add, delete, rename, etc.) and monitoring DREX uses libuv which is exposed via vim.loop
See also :help drex-customization
and the Wiki for more information and examples