Commit graph

46 commits

Author SHA1 Message Date
Barrett Ruth
e2cd1e66cf
refactor: revert canola namespace to oil and remove vim.g config (#120)
Some checks are pending
quality / changes (push) Waiting to run
quality / Lua Format Check (push) Blocked by required conditions
quality / Lua Lint Check (push) Blocked by required conditions
quality / Lua Type Check (push) Blocked by required conditions
quality / Markdown Format Check (push) Blocked by required conditions
test / Test (Neovim nightly) (push) Waiting to run
test / Test (Neovim stable) (push) Waiting to run
* refactor: revert module namespace from canola back to oil

Problem: the canola rename creates unnecessary friction for users
migrating from stevearc/oil.nvim — every `require('oil')` call and
config reference must change.

Solution: revert all module paths, URL schemes, autocmd groups,
highlight groups, and filetype names back to `oil`. The repo stays
`canola.nvim` for identity; the code is a drop-in replacement.

* refactor: remove `vim.g.oil` declarative config

Problem: the `vim.g.oil` configuration path was added prematurely.
It adds a second config entrypoint before the plugin has stabilized
enough to justify it.

Solution: remove `vim.g.oil` support from `plugin/oil.lua`,
`config.setup()`, docs, and tests. Users configure via
`require("oil").setup({})`.
2026-03-10 22:49:56 -04:00
Barrett Ruth
9298b48c5d
feat(api): add get_current_url() for adapter-agnostic URL access (#119)
Problem: `get_current_dir()` returns nil for non-local adapters (SSH,
S3, trash), leaving users with no public API to get the current
buffer's location.

Solution: add `get_current_url()` which returns the full canola URL
for any adapter, or nil if not in a canola buffer.

Based on: stevearc/oil.nvim#646
2026-03-10 22:21:52 -04:00
Barrett Ruth
9d29243faf
docs(upstream): mark #382 not actionable (#118)
docs(upstream): mark #382 not actionable (#482)

Problem: upstream issue #382 requests relative paths in the window
title, but this is already solved by the `get_win_title` callback
added in stevearc/oil.nvim#482.

Solution: mark the issue as not actionable in the tracker.
2026-03-10 22:21:42 -04:00
Barrett Ruth
c6d41c6d75
docs(upstream): mark #431 as duplicate of #525 (#117)
Problem: upstream issue #431 (SSH adapter documentation) is a
duplicate of #525 which covers the same request with more detail.

Solution: mark as duplicate of #525.
2026-03-09 19:25:31 -04:00
Barrett Ruth
a36c4f7fd2
docs(upstream): mark #332 not actionable (#116)
Problem: upstream issue #332 (buffer not fixed to floating window via
ctrl-o jumplist) is unresolved in our tracker.

Solution: mark as not actionable. Cannot reproduce — ctrl-o in the
float navigates back through oil directories, does not escape to file
buffers. Reported on nvim 0.10.0-dev (2023).
2026-03-09 19:20:12 -04:00
Barrett Ruth
b349d69c6d
docs(upstream): mark #435 fixed (#115)
Problem: upstream issue #435 (LSP semantic token errors on preview)
is unresolved in our tracker.

Solution: mark as fixed. Upstream PR #467 (scratch buffer previews)
was merged Nov 2024 and is already in our codebase.
2026-03-09 19:08:39 -04:00
Barrett Ruth
343f86d761
docs(upstream): revert #623 to open (#114)
Problem: #623 was marked not actionable as a cross-plugin issue, but
oil's nonstandard buffer opening (`bufadd` + manual `buflisted` +
`vim.cmd.buffer()`) may be the root cause.

Solution: revert status to open for further investigation.
2026-03-09 19:05:18 -04:00
Barrett Ruth
1d45ae35be
docs(upstream): mark #200 not actionable (#113)
Problem: upstream issue #200 (highlights not working when opening a
file) is unresolved in our tracker.

Solution: mark as not actionable. Reported on nvim 0.9.4, no recent
reports, cannot reproduce on current versions.
2026-03-09 18:59:39 -04:00
Barrett Ruth
5a8cbf10ff
docs(upstream): mark #637 not actionable (#111)
Problem: upstream issue #637 (inconsistent symlink resolution) is
unresolved in our tracker.

Solution: mark as not actionable. Reporter confirmed the issue does
not reproduce on stable neovim (v0.11.2), only on nightly.
2026-03-09 18:45:22 -04:00
Barrett Ruth
68c4a1b0c7
docs(upstream): mark #636 not actionable (#110)
Problem: upstream issue #636 (Telescope picker opens file in wrong
split) is unresolved in our tracker.

Solution: mark as not actionable. Cannot reproduce with default
Telescope configuration — file correctly opens in the active canola
split. Likely user-specific Telescope config or window picker plugin.
2026-03-09 18:12:30 -04:00
Barrett Ruth
c7b905137c
fix: make parent action a no-op at filesystem root (#109)
Problem: at the filesystem root (`/`), `actions.parent` triggers a
full `vim.cmd.edit()` and async re-render cycle even though the parent
of `/` is `/`.

Solution: in `canola.open()`, return early when `parent_url` equals
the current buffer name.

Closes #108.
2026-03-09 18:05:04 -04:00
Barrett Ruth
39374ee99b
fix(select): redraw screen after buffer switch (#106)
* fix(select): redraw screen after buffer switch

Problem: `select` opens files inside a `vim.schedule_wrap` callback
from `normalize_url`. Scheduled `FileType` autocmds (e.g. treesitter
parsing) queue onto the same batch, blocking the screen update. The
oil buffer stays visible until the heavy work finishes.

Solution: call `vim.cmd.redraw()` after the buffer switch to flush
the screen before any queued scheduled callbacks run. Matches the
behavior of plain `:e`.

* docs(upstream): mark #699 fixed (#106)
2026-03-09 17:40:19 -04:00
Barrett Ruth
03c2ac4bd5
docs(upstream): mark #609 not actionable (#105)
docs(upstream): mark #609 not actionable (#105)

Problem: upstream issue #609 (cursor not placed on file when jumped
via Snacks.nvim picker) is confirmed Windows-only by multiple
reporters. stevearc cannot reproduce on Linux.

Solution: mark as not actionable in the upstream tracker.
2026-03-09 17:17:40 -04:00
Barrett Ruth
c42c087ffb
docs(upstream): revert #736 to open (#104) 2026-03-08 19:12:32 -04:00
Barrett Ruth
7b140a7f40
docs(upstream): mark #736 not actionable (#103) 2026-03-08 19:08:31 -04:00
Barrett Ruth
21d9ef0c1d
docs(upstream): mark #685 not actionable (#102) 2026-03-08 19:08:17 -04:00
Barrett Ruth
f7970e1c1c
docs(upstream): mark #671 not actionable (#101) 2026-03-08 19:08:03 -04:00
Barrett Ruth
514d12a437
docs(upstream): mark #668 not actionable (#100) 2026-03-08 19:07:51 -04:00
Barrett Ruth
379c72a2bc
docs(upstream): mark #665 not actionable (#99) 2026-03-08 19:06:14 -04:00
Barrett Ruth
725dec0185
docs(upstream): mark #294 not actionable (#98) 2026-03-08 19:05:58 -04:00
Barrett Ruth
70364d1667
docs(upstream): mark #276 not actionable (#97) 2026-03-08 19:05:37 -04:00
Barrett Ruth
01a7b891ad
docs(upstream): mark #226 not actionable (#96) 2026-03-08 19:05:21 -04:00
Barrett Ruth
3249bbfaa7
docs(upstream): mark #207 fixed (#94) 2026-03-08 16:03:05 -04:00
Barrett Ruth
425a53d2fa
fix(view): constrain cursor in insert mode (#93)
Problem: `constrain_cursor` only fired on `CursorMoved` and
`ModeChanged`, so arrow key navigation in insert mode could move
the cursor into the concealed ID prefix area.

Solution: add `CursorMovedI` to the autocmd event list. The
`constrain_cursor()` function is already mode-agnostic.
2026-03-08 16:02:09 -04:00
Barrett Ruth
c972bbe9c4
docs(upstream): mark #359 not actionable (#92) 2026-03-08 16:00:31 -04:00
Barrett Ruth
ac48ce20f5
docs(upstream): collapse issue sections into single table (#91)
Problem: issues were split across four separate sections by status,
requiring moves between sections on every status change.

Solution: merge all issues into one `## Issues` table sorted by number
with an inline status column. Update digest script heading and row
format to match.
2026-03-08 15:52:25 -04:00
Barrett Ruth
76e1aacde0
docs(upstream): reorganize tracker into grouped tables (#89)
Problem: the upstream tracker had duplicate entries across tables,
fragile commit hash references, a 108-row flat table mixing all
statuses, and inconsistent formatting.

Solution: merge PR tables into one, split issues by status (fixed,
resolved, open, not actionable), drop all commit hashes in favor of
stable PR numbers, and eliminate duplication so each entry appears
exactly once.
2026-03-08 15:41:37 -04:00
Barrett Ruth
94db584f81
feat: add toggle() API for regular windows (#88)
* feat: add `toggle()` API for regular windows

Problem: `toggle_float()` and `toggle_split()` exist but there is no
`toggle()` for regular windows, forcing users to write their own
filetype-checking wrapper.

Solution: add `M.toggle()` that delegates to `close()` or `open()`
based on whether the current buffer is a canola buffer. Includes
vimdoc entry.

* docs(upstream): mark #621 fixed
2026-03-08 15:33:45 -04:00
Barrett Ruth
fc43684bbd
fix(columns): hide misleading directory sizes (#87)
* fix(columns): hide misleading directory sizes in size column

Problem: the size column shows the filesystem inode size (typically
4096 = 4.1k) for directories, which is misleading — users expect no
size for directories.

Solution: add an early return for directory entries in the size render
function of the files, SSH, and S3 adapters.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs(upstream): mark #486 fixed

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:31:43 -04:00
Barrett Ruth
91562016c8
docs(upstream): mark #380 not actionable (#86) 2026-03-07 17:05:46 -05:00
Barrett Ruth
4a8d57a269
feat: add max_file_size preview limit and show_hidden_when_empty (#85)
* feat(preview): add `max_file_size` config to skip large file previews

Problem: previewing large files (e.g. 500 MB logs, binaries) loads them
into a buffer and can freeze or OOM Neovim. `disable_preview` only
receives the filename, so users cannot gate on file size.

Solution: add `preview_win.max_file_size` (number, MB, default 10). In
`open_preview`, check `entry.meta.stat.size` and fall back to
`vim.uv.fs_stat` when the cached stat is absent. If the file exceeds
the limit and a preview window is already open, render "File too large
to preview" in it; if not, emit a WARN notify and return early. The
cursor-moved auto-update path only fires when a window already exists,
so no flag threading is needed to distinguish explicit from implicit.

Based on: stevearc/oil.nvim#213

* feat(view): add `show_hidden_when_empty` for hidden-only directories

Problem: with `show_hidden = false`, a directory containing only
dotfiles renders as just `..`, giving no indication that entries exist.

Solution: add `view_options.show_hidden_when_empty` (boolean, default
false). After the main filter loop in `render_buffer`, if the option is
set and `#line_table <= 1`, iterate `entry_list` again and render any
entry not matched by `is_always_hidden`, using `is_hidden = true` so
they render with the dimmed hidden style.

Based on: stevearc/oil.nvim#473

* docs(upstream): fix formatting

* docs(upstream): update #213 and #473 with PR and commit links
2026-03-07 16:52:57 -05:00
Barrett Ruth
a9a06b8f3b
feat: add auto_save_on_select_new_entry config option (#84)
Problem: users who want hands-off behaviour had no way to skip the
`prompt_save_on_select_new_entry` confirmation dialog — enabling the
prompt meant always being asked, with no silent auto-save path.

Solution: add `auto_save_on_select_new_entry` (default `false`) which,
when true, calls `M.save()` and proceeds immediately instead of showing
the confirm dialog. Includes type annotations, vimdoc, and upstream
tracker update for stevearc/oil.nvim#393.
2026-03-07 16:08:34 -05:00
Barrett Ruth
082573d779
feat: add open_split/toggle_split API and upstream triage batch (#83)
* docs(upstream): triage batch — #739 cherry-pick, 10 issue updates

* feat: add `open_split` and `toggle_split` API

Problem: canola had no way to open a browser in a normal split window;
only floating windows were supported via `open_float`/`toggle_float`.
`M.close` also crashed with E444 when called from the last window.

Solution: port stevearc/oil.nvim#728 — add `open_split(dir, opts, cb)`
and `toggle_split(dir, opts, cb)` mirroring the float API. Use
`is_canola_win`/`canola_original_win` window vars (not the upstream
`is_oil_win` names). Wrap `nvim_win_close` in `pcall` with `enew()`
fallback to handle the last-window E444 case.

Based on: stevearc/oil.nvim#728

* docs: add vimdoc for `open_split`/`toggle_split` and macOS trash recipe

Cherry-picked from: stevearc/oil.nvim#739

* docs(upstream): fix prettier formatting
2026-03-07 15:45:23 -05:00
Barrett Ruth
5b74210894
docs(upstream): mark #615 fixed, #650 and #682 resolved (#80) 2026-03-06 16:43:55 -05:00
Barrett Ruth
0f386bb69c
fix: show float title when border is nil (#78)
* fix: show float title when border is nil

Problem: the float title was only shown via the native `nvim_win_set_config`
path, which requires a border to render. The guard `config.float.border ~=
'none'` did not account for `nil`, which is the default — so users with no
explicit `border` config never saw the path title in the floating window.

Solution: require both `~= nil` and `~= 'none'` before using the native
title. In all other cases (border nil, 'none', or nvim < 0.9), fall back to
`util.add_title_to_win`, which renders a child floating window for the title.

Based on: stevearc/oil.nvim#683

* refactor: drop nvim-0.9 version checks in float title logic
2026-03-06 16:29:47 -05:00
Barrett Ruth
ba49f76e91
feat: add skip_confirm_for_delete option (#77)
feat: add \`skip_confirm_for_delete\` option

Problem: there was no way to suppress the confirmation popup when the
only pending operations are deletes. \`skip_confirm_for_simple_edits\`
explicitly excludes deletes, so users who delete frequently had no opt-out.

Solution: add \`skip_confirm_for_delete = false\` config option. When true,
\`confirmation.show()\` skips the popup if every pending action is a delete.

Based on: stevearc/oil.nvim#392
2026-03-06 16:29:12 -05:00
Barrett Ruth
7a46246062
fix: escape on save prompt cancels select (#76)
Problem: when `prompt_save_on_select_new_entry` is enabled and the user
presses Escape on the "Save changes?" confirm dialog, `vim.fn.confirm`
returns 0, but the select continued as if the user had chosen "No".

Solution: add an explicit `choice == 0` branch that returns immediately,
aborting the select without saving or opening any files.
2026-03-06 16:28:57 -05:00
Barrett Ruth
a74747e1f5
feat: emit CanolaFileCreated autocmd on file creation (#75)
* feat: emit \`CanolaFileCreated\` autocmd on file creation

Problem: no way to hook into individual file creation to populate
initial contents, without a plugin-specific config callback.

Solution: fire \`User CanolaFileCreated\` with \`data.path\` after each
successful \`fs.touch\` in the files adapter. Users listen with
\`nvim_create_autocmd\` and write to the path however they like.

* build: gitignore `doc/upstream.html`

* docs(upstream): mark #721 fixed, triage #735

* docs(upstream): simplify #735 note
2026-03-06 15:54:01 -05:00
Barrett Ruth
c7a55fd787
docs(upstream): triage PRs #721 and #735 (#74)
* docs(upstream): triage PRs #721 and #735

* docs(upstream): fix #721 status to deferred

* docs(upstream): remove status key legend

* docs(upstream): s/addressing/fixing in #721 note
2026-03-06 15:48:07 -05:00
Barrett Ruth
1ee6c6b259
feat: add cleanup_buffers_on_delete option (#73)
Problem: When files are deleted via canola, any open Neovim buffers
for those files remain alive, polluting the jumplist with stale
entries.

Solution: Add an opt-in `cleanup_buffers_on_delete` config option
(default `false`). When enabled, `finish()` in `mutator/init.lua`
iterates completed delete actions and wipes matching buffers via
`nvim_buf_delete` before `CanolaActionsPost` fires. Only local
filesystem deletes are handled (guarded by the `files` adapter
check).
2026-03-06 15:19:32 -05:00
Barrett Ruth
41f375ee9e
fix: restore buflisted on jumplist buffer re-entry (#71)
* fix: restore `buflisted` on jumplist buffer re-entry

Problem: Neovim's jumplist machinery re-enters canola buffers via an
internal `:edit`-equivalent path, which unconditionally sets
`buflisted = true`. The existing workaround in `open()` and
`open_float()` only covers canola-initiated navigation, leaving
`<C-o>` and `<C-i>` unhandled.

Solution: Apply the same `buf_options.buflisted` guard in the
`BufEnter` autocmd, directly after `set_win_options()`. This fires
on every buffer entry — including all jumplist paths — and mirrors
the pattern already used at the two `:edit` callsites.

* docs: mark upstream #302 as fixed in tracker
2026-03-06 11:55:37 -05:00
github-actions[bot]
9b656387fb
docs(upstream): upstream digest (#67)
docs(upstream): upstream digest 2026-03-03

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-03-03 21:08:58 +00:00
5025803324
docs(upstream): remove #735 and #736 for digest re-test 2026-03-03 15:19:25 -05:00
github-actions[bot]
09acf0c3fe
docs(upstream): upstream digest (#45)
docs(upstream): upstream digest 2026-03-03

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-03-03 15:08:41 -05:00
c51e3168de
fix(dic): format 2026-02-22 22:09:02 -05:00
33889b2171
docs: add upstream tracker
Problem: the full upstream PR and issue triage was removed from the
README during the repository modernization, leaving no user-facing
record of what the fork addresses.

Solution: restore the triage tables in a dedicated doc/upstream.md and
link to it from the top of the README. Keeps the README clean while
giving the full picture a permanent home.
2026-02-22 22:04:57 -05:00