Problem: `curl_ftp_url` emitted `ftps://` (implicit TLS) for `oil-ftps://` URLs, causing listing to fail against STARTTLS servers while Python mutations worked — the two paths spoke different TLS modes. curl's `-s` flag silenced all error output, producing "Unknown error" on any curl failure. File creation used `/dev/null` (breaks on Windows, diverges from S3). The Python TLS context didn't honour `--insecure`/`-k` from `extra_curl_args`. Deleting non-empty dirs on servers without MLSD gave a cryptic `500 Unknown command`. Solution: Always emit `ftp://` in `curl_ftp_url`; TLS is enforced solely via `--ssl-reqd`, making STARTTLS consistent between curl and Python. Add `-S` to expose curl errors. Replace `/dev/null` with `curl -T -` + `stdin='null'` (matches `s3fs` pattern). Mirror `--insecure`/`-k` into the Python SSL context. Wrap `mlsd()` in try/except with a clear actionable message. Add `spec/ftp_spec.lua` with 28 unit tests covering URL parsing, list parsing, and curl URL building. Update `doc/oil.txt` to document STARTTLS and MLSD. |
||
|---|---|---|
| .github | ||
| doc | ||
| lua | ||
| perf | ||
| plugin | ||
| scripts | ||
| spec | ||
| syntax | ||
| .busted | ||
| .editorconfig | ||
| .gitignore | ||
| .luarc.json | ||
| .pre-commit-config.yaml | ||
| .prettierrc | ||
| .stylua.toml | ||
| .styluaignore | ||
| canola.nvim-scm-1.rockspec | ||
| flake.lock | ||
| flake.nix | ||
| LICENSE | ||
| README.md | ||
| selene.toml | ||
| vim.yaml | ||
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
- Neovim 0.10+
- (Optionally) any of the following icon providers:
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?
Simply change the plugin source from stevearc/oil.nvim to
barretruth/oil.nvim.
Before (stevearc/oil.nvim):
{
'stevearc/oil.nvim',
opts = { ... },
config = function(_, opts)
require('oil').setup(opts)
end,
}
After (barrettruth/oil.nvim):
{
'barrettruth/oil.nvim',
opts = { ... },
config = function(_, opts)
require('oil').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?
- stevearc/oil.nvim: the original
- mini.files: cross-directory filesystem-as-buffer with a column view
- vim-vinegar: the granddaddy of single-directory file browsing
- dirbuf.nvim: filesystem as buffer without cross-directory edits
- lir.nvim: vim-vinegar style with Neovim integration
- vim-dirvish: stable, simple directory browser