No description
Find a file
Barrett Ruth 7234be3f5c
docs(upstream): mark #570 not actionable (#128)
* docs(upstream): mark #617 fixed via cherry-picked #618

Problem: Issue #617 (filetype-based icon detection) was still listed as
`open` in the upstream tracker despite being addressed by PR #618.

Solution: Update status to `fixed — cherry-picked (#618)`. Verified
with manual testing that `use_slow_filetype_detection` correctly detects
shebangs in extensionless files.

* docs(upstream): mark #675 as duplicate of #117

Problem: Issue #675 (move file into folder by renaming) was listed as
`open` despite being a duplicate of #117, the primary tracking issue
for move-by-rename (46 upvotes). Upstream already closed #675 as such.

Solution: Update status to `duplicate of #117`.

* docs(upstream): mark #707 as duplicate of #117

Problem: Issue #707 (move file/dir into new dir by renaming) was listed
as `open` despite being identical to #117. The associated draft PR #708
is already tracked separately in the PRs table.

Solution: Update status to `duplicate of #117`.

* docs(upstream): consolidate owner/group issues into #126

Problem: Three upstream issues (#436, #599, #684) all request the same
feature — owner/group columns in the directory listing.

Solution: Create canonical tracking issue barrettruth/canola.nvim#126
and mark all three as `consolidated into #126`.

* docs(upstream): mark #570 not actionable

Problem: Issue #570 (`c0`/`d0` deletes concealed entry ID prefix,
causing rename to be parsed as delete+create) was listed as `open`.

Solution: Mark as `not actionable — blocked on Neovim extmark API`.
Neovim provides no mechanism to protect concealed extmark text from
operator-pending motions. The intended rename workflow uses `cw`/`ciw`
within the constrained cursor region.
2026-03-15 12:46:57 -04:00
.github refactor: revert canola namespace to oil and remove vim.g config (#120) 2026-03-10 22:49:56 -04:00
doc docs(upstream): mark #570 not actionable (#128) 2026-03-15 12:46:57 -04:00
lua refactor: revert canola namespace to oil and remove vim.g config (#120) 2026-03-10 22:49:56 -04:00
perf refactor: revert canola namespace to oil and remove vim.g config (#120) 2026-03-10 22:49:56 -04:00
plugin refactor: revert canola namespace to oil and remove vim.g config (#120) 2026-03-10 22:49:56 -04:00
scripts Ci/digest final (#69) 2026-03-04 14:10:07 -05:00
spec refactor: revert canola namespace to oil and remove vim.g config (#120) 2026-03-10 22:49:56 -04:00
syntax refactor: revert canola namespace to oil and remove vim.g config (#120) 2026-03-10 22:49:56 -04:00
.busted build: migrate test framework from plenary to busted 2026-02-22 00:26:54 -05:00
.editorconfig build: modernize repository (#27) 2026-02-22 16:06:31 -05:00
.gitignore refactor: drop nvim 0.8/0.9 compat shims from init.lua (#79) 2026-03-06 16:36:37 -05:00
.luarc.json ci: scripts and format (#68) 2026-03-04 13:49:06 -05:00
.pre-commit-config.yaml build: replace luacheck with selene, add nix devshell and pre-commit (#20) 2026-02-21 23:52:27 -05:00
.prettierrc build: modernize repository (#27) 2026-02-22 16:06:31 -05:00
.stylua.toml build: replace luacheck with selene, add nix devshell and pre-commit (#20) 2026-02-21 23:52:27 -05:00
.styluaignore ci: scripts and format (#68) 2026-03-04 13:49:06 -05:00
canola.nvim-scm-1.rockspec docs: rename repository from oil.nvim to canola.nvim 2026-02-22 22:01:34 -05:00
flake.lock build: replace luacheck with selene, add nix devshell and pre-commit (#20) 2026-02-21 23:52:27 -05:00
flake.nix refactor: rename oil to canola across entire codebase (#70) 2026-03-05 14:50:10 -05:00
LICENSE build: modernize repository (#27) 2026-02-22 16:06:31 -05:00
README.md Fix require statement for oil.nvim setup 2026-03-07 21:12:45 -05:00
selene.toml ci: migrate to nix 2026-02-23 18:13:51 -05:00
vim.yaml ci: add bit luajit global 2026-02-23 18:18:35 -05:00

canola.nvim

A refined oil.nvim — edit your filesystem like a buffer, with bug fixes and community PRs that haven't landed upstream.

Upstream tracker — full PR and issue triage against oil.nvim

https://user-images.githubusercontent.com/506791/209727111-6b4a11f4-634a-4efa-9461-80e9717cea94.mp4

Features

  • Edit directory listings as normal buffers — mutations are derived by diffing
  • Cross-directory move, copy, and rename across any adapter
  • Adapters for local filesystem, SSH, S3, and OS trash
  • File preview in split or floating window
  • Configurable columns (icon, size, permissions, timestamps)
  • Executable file highlighting and filetype-aware icons
  • Floating window and split layouts

Requirements

Installation

Install with your package manager of choice or via luarocks:

luarocks install canola.nvim

Documentation

:help canola.nvim

FAQ

Q: How do I migrate from stevearc/oil.nvim?

Change the plugin source and replace setup() with vim.g.canola in init. The configuration table is identical — only the entry point changes. For example, with lazy.nvim:

Before (stevearc/oil.nvim):

{
  'stevearc/oil.nvim',
  opts = { ... },
  config = function(_, opts)
    require('oil').setup(opts)
  end,
}

After (barrettruth/canola.nvim):

{
  'barrettruth/canola.nvim',
  opts = { ... },
  config = function(_, opts)
    require('canola').setup(opts)
  end,
}

init runs before the plugin loads; config runs after. oil.nvim reads vim.g.canola at load time, so init is the correct hook. Do not use config, opts, or lazy — oil.nvim loads itself when you open a directory.

Q: Why "canola"?

Canola oil! But...

Q: Why "oil"?

From the vim-vinegar README, a quote by Drew Neil:

Split windows and the project drawer go together like oil and vinegar

Q: What are some alternatives?

Acknowledgements