A vim-vinegar like file explorer that lets you edit your filesystem like a normal Neovim buffer.
https://user-images.githubusercontent.com/506791/209727111-6b4a11f4-634a-4efa-9461-80e9717cea94.mp4
oil.nvim supports all the usual plugin managers
require('packer').startup(function()
use {
'stevearc/oil.nvim',
config = function() require('oil').setup() end
}
end)
require "paq" {
{'stevearc/oil.nvim'};
}
Plug 'stevearc/oil.nvim'
call dein#add('stevearc/oil.nvim')
git clone --depth=1 https://github.com/stevearc/oil.nvim.git ~/.vim/bundle/
git clone --depth=1 https://github.com/stevearc/oil.nvim.git \
"${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/pack/oil/start/oil.nvim
Add the following to your init.lua
require("oil").setup()
Then open a directory with nvim .
. Use <CR>
to open a file/directory, and -
to go up a directory. Otherwise, just treat it like a normal buffer and make changes as you like. Remember to :w
when you're done to actually perform the actions.
If you want to mimic the vim-vinegar
method of navigating to the parent directory of a file, add this keymap:
vim.keymap.set("n", "-", require("oil").open, { desc = "Open parent directory" })
You can open a directory with :edit <path>
or :Oil <path>
. To open oil in a floating window, do :Oil --float <path>
.
require("oil").setup({
-- Id is automatically added at the beginning, and name at the end
-- See :help oil-columns
columns = {
"icon",
-- "permissions",
-- "size",
-- "mtime",
},
-- Buffer-local options to use for oil buffers
buf_options = {
buflisted = false,
},
-- Window-local options to use for oil buffers
win_options = {
wrap = false,
signcolumn = "no",
cursorcolumn = false,
foldcolumn = "0",
spell = false,
list = false,
conceallevel = 3,
concealcursor = "n",
},
-- Restore window options to previous values when leaving an oil buffer
restore_win_options = true,
-- Skip the confirmation popup for simple operations
skip_confirm_for_simple_edits = false,
-- Keymaps in oil buffer. Can be any value that `vim.keymap.set` accepts OR a table of keymap
-- options with a `callback` (e.g. { callback = function() ... end, desc = "", nowait = true })
-- Additionally, if it is a string that matches "actions.<name>",
-- it will use the mapping at require("oil.actions").<name>
-- Set to `false` to remove a keymap
-- See :help oil-actions for a list of all available actions
keymaps = {
["g?"] = "actions.show_help",
["<CR>"] = "actions.select",
["<C-s>"] = "actions.select_vsplit",
["<C-h>"] = "actions.select_split",
["<C-t>"] = "actions.select_tab",
["<C-p>"] = "actions.preview",
["<C-c>"] = "actions.close",
["<C-l>"] = "actions.refresh",
["-"] = "actions.parent",
["_"] = "actions.open_cwd",
["`"] = "actions.cd",
["~"] = "actions.tcd",
["g."] = "actions.toggle_hidden",
},
-- Set to false to disable all of the above keymaps
use_default_keymaps = true,
view_options = {
-- Show files and directories that start with "."
show_hidden = false,
},
-- Configuration for the floating window in oil.open_float
float = {
-- Padding around the floating window
padding = 2,
max_width = 0,
max_height = 0,
border = "rounded",
win_options = {
winblend = 10,
},
},
})
Oil does all of its filesystem interaction through an adapter abstraction. In practice, this means that oil can be used to view and modify files in more places than just the local filesystem, so long as the destination has an adapter implementation.
Note that file operations work across adapters. This means that you can use oil to copy files to/from a remote server using the ssh adapter just as easily as you can copy files from one directory to another on your local machine.
This adapter allows you to browse files over ssh, much like netrw. To use it, simply open a buffer using the following name template:
nvim oil-ssh://[username@]hostname[:port]/[path]
This may look familiar. In fact, this is the same url format that netrw uses.
Note that at the moment the ssh adapter does not support Windows machines, and it requires the server to have a /bin/bash
binary as well as standard unix commands (rm
, mv
, mkdir
, chmod
, cp
, touch
, ln
, echo
).
get_entry_on_line(bufnr, lnum): nil|oil.Entry
Get the entry on a specific line (1-indexed)
Param | Type | Desc |
---|---|---|
bufnr | integer |
|
lnum | integer |
get_cursor_entry(): nil|oil.Entry
Get the entry currently under the cursor
discard_all_changes()
Discard all changes made to oil buffers
set_columns(cols)
Change the display columns for oil
Param | Type | Desc |
---|---|---|
cols | oil.ColumnSpec[] |
get_current_dir(): nil|string
Get the current directory
open_float(dir)
Open oil browser in a floating window
Param | Type | Desc |
---|---|---|
dir | nil|string |
When nil, open the parent of the current buffer, or the cwd if current buffer is not a file |
open(dir)
Open oil browser for a directory
Param | Type | Desc |
---|---|---|
dir | nil|string |
When nil, open the parent of the current buffer, or the cwd if current buffer is not a file |
close()
Restore the buffer that was present when oil was opened
select(opts)
Select the entry under the cursor
Param | Type | Desc | |
---|---|---|---|
opts | table |
||
vertical | boolean |
Open the buffer in a vertical split | |
horizontal | boolean |
Open the buffer in a horizontal split | |
split | "aboveleft"|"belowright"|"topleft"|"botright" |
Split modifier | |
preview | boolean |
Open the buffer in a preview window | |
tab | boolean |
Open the buffer in a new tab |
save(opts)
Save all changes
Param | Type | Desc | |
---|---|---|---|
opts | nil|table |
||
confirm | nil|boolean |
Show confirmation when true, never when false, respect skip_confirm_for_simple_edits if nil |
setup(opts)
Initialize oil
Param | Type | Desc |
---|---|---|
opts | nil|table |
Q: Why "oil"?
A: From the vim-vinegar README, a quote by Drew Neil:
Split windows and the project drawer go together like oil and vinegar
Vinegar was taken. Let's be oil. Plus, I think it's pretty slick ;)
Q: Why would I want to use oil vs any other plugin?
A:
If you don't need those features specifically, check out the alternatives listed below
Q: Why write another plugin yourself instead of adding functionality to one that already exists?
A: Because I am a maniac control freak.
Q: What are some alternatives?
A:
There's also file trees like neo-tree and nvim-tree, but they're really a different category entirely.
Q: I don't need netrw anymore. How can I disable it?
A: Oil can fully replace netrw for local and ssh file browsing/editing, but keep in mind that netrw also supports rsync, http, ftp, and dav. If you don't need these other features, you can disable netrw with the following:
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1