diff --git a/lua/oil/adapters/files.lua b/lua/oil/adapters/files.lua index 1b307c9..5f0c24c 100644 --- a/lua/oil/adapters/files.lua +++ b/lua/oil/adapters/files.lua @@ -180,7 +180,17 @@ M.normalize_url = function(url, callback) vim.loop.fs_stat( realpath, vim.schedule_wrap(function(stat_err, stat) - if not stat or stat.type == "directory" then + local is_directory + if stat then + is_directory = stat.type == "directory" + elseif vim.endswith(realpath, "/") then + is_directory = true + else + local filetype = vim.filetype.match({ filename = vim.fs.basename(realpath) }) + is_directory = filetype == nil + end + + if is_directory then local norm_path = util.addslash(fs.os_to_posix_path(realpath)) callback(scheme .. norm_path) else diff --git a/lua/oil/init.lua b/lua/oil/init.lua index 4a08652..50cc52d 100644 --- a/lua/oil/init.lua +++ b/lua/oil/init.lua @@ -614,6 +614,17 @@ local function load_oil_buffer(bufnr) -- have BufReadCmd called for it return end + + -- If the renamed buffer doesn't have a scheme anymore, this is a normal file. + -- Finish setting it up as a normal buffer. + local new_scheme = util.parse_url(new_url) + if not new_scheme then + loading.set_loading(bufnr, false) + vim.cmd.doautocmd({ args = { "BufReadPre", new_url }, mods = { emsg_silent = true } }) + vim.cmd.doautocmd({ args = { "BufReadPost", new_url }, mods = { emsg_silent = true } }) + return + end + bufname = new_url end if vim.endswith(bufname, "/") then diff --git a/tests/files_spec.lua b/tests/files_spec.lua index e254608..6e15bea 100644 --- a/tests/files_spec.lua +++ b/tests/files_spec.lua @@ -2,6 +2,7 @@ require("plenary.async").tests.add_to_env() local fs = require("oil.fs") local files = require("oil.adapters.files") local cache = require("oil.cache") +local test_util = require("tests.test_util") local function throwiferr(err, ...) if err then @@ -308,4 +309,27 @@ a.describe("files adapter", function() ["a/"] = true, }) end) + + a.it("Editing a new oil://path/ creates an oil buffer", function() + local tmpdir_url = "oil://" .. vim.fn.fnamemodify(tmpdir.path, ":p") .. "/" + vim.cmd.edit({ args = { tmpdir_url } }) + test_util.wait_for_autocmd("BufReadPost") + local new_url = "oil://" .. vim.fn.fnamemodify(tmpdir.path, ":p") .. "newdir" + vim.cmd.edit({ args = { new_url } }) + test_util.wait_for_autocmd("BufReadPost") + assert.equals("oil", vim.bo.filetype) + -- The normalization will add a '/' + assert.equals(new_url .. "/", vim.api.nvim_buf_get_name(0)) + end) + + a.it("Editing a new oil://file.rb creates a normal buffer", function() + local tmpdir_url = "oil://" .. vim.fn.fnamemodify(tmpdir.path, ":p") .. "/" + vim.cmd.edit({ args = { tmpdir_url } }) + test_util.wait_for_autocmd("BufReadPost") + local new_url = "oil://" .. vim.fn.fnamemodify(tmpdir.path, ":p") .. "file.rb" + vim.cmd.edit({ args = { new_url } }) + test_util.wait_for_autocmd("BufReadPost") + assert.equals("ruby", vim.bo.filetype) + assert.equals(vim.fn.fnamemodify(tmpdir.path, ":p") .. "file.rb", vim.api.nvim_buf_get_name(0)) + end) end)