fix: quit after mutations when :wq or similar (#221)
This commit is contained in:
parent
3727410e48
commit
af13ce333f
6 changed files with 65 additions and 18 deletions
|
|
@ -297,7 +297,7 @@ Note that at the moment the ssh adapter does not support Windows machines, and i
|
||||||
- [open(dir)](doc/api.md#opendir)
|
- [open(dir)](doc/api.md#opendir)
|
||||||
- [close()](doc/api.md#close)
|
- [close()](doc/api.md#close)
|
||||||
- [select(opts, callback)](doc/api.md#selectopts-callback)
|
- [select(opts, callback)](doc/api.md#selectopts-callback)
|
||||||
- [save(opts)](doc/api.md#saveopts)
|
- [save(opts, cb)](doc/api.md#saveopts-cb)
|
||||||
- [setup(opts)](doc/api.md#setupopts)
|
- [setup(opts)](doc/api.md#setupopts)
|
||||||
|
|
||||||
<!-- /API -->
|
<!-- /API -->
|
||||||
|
|
|
||||||
20
doc/api.md
20
doc/api.md
|
|
@ -15,7 +15,7 @@
|
||||||
- [open(dir)](#opendir)
|
- [open(dir)](#opendir)
|
||||||
- [close()](#close)
|
- [close()](#close)
|
||||||
- [select(opts, callback)](#selectopts-callback)
|
- [select(opts, callback)](#selectopts-callback)
|
||||||
- [save(opts)](#saveopts)
|
- [save(opts, cb)](#saveopts-cb)
|
||||||
- [setup(opts)](#setupopts)
|
- [setup(opts)](#setupopts)
|
||||||
|
|
||||||
<!-- /TOC -->
|
<!-- /TOC -->
|
||||||
|
|
@ -132,15 +132,21 @@ Select the entry under the cursor
|
||||||
| | close | `boolean` | Close the original oil buffer once selection is made |
|
| | close | `boolean` | Close the original oil buffer once selection is made |
|
||||||
| callback | `nil\|fun(err: nil\|string)` | Called once all entries have been opened | |
|
| callback | `nil\|fun(err: nil\|string)` | Called once all entries have been opened | |
|
||||||
|
|
||||||
## save(opts)
|
## save(opts, cb)
|
||||||
|
|
||||||
`save(opts)` \
|
`save(opts, cb)` \
|
||||||
Save all changes
|
Save all changes
|
||||||
|
|
||||||
| Param | Type | Desc | |
|
| Param | Type | Desc | |
|
||||||
| ----- | ------------ | -------------- | ------------------------------------------------------------------------------------------- |
|
| ----- | ---------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------- |
|
||||||
| opts | `nil\|table` | | |
|
| opts | `nil\|table` | | |
|
||||||
| | confirm | `nil\|boolean` | Show confirmation when true, never when false, respect skip_confirm_for_simple_edits if nil |
|
| | confirm | `nil\|boolean` | Show confirmation when true, never when false, respect skip_confirm_for_simple_edits if nil |
|
||||||
|
| cb | `nil\|fun(err: nil\|string)` | Called when mutations complete. | |
|
||||||
|
|
||||||
|
**Note:**
|
||||||
|
<pre>
|
||||||
|
If you provide your own callback function, there will be no notification for errors.
|
||||||
|
</pre>
|
||||||
|
|
||||||
## setup(opts)
|
## setup(opts)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -238,13 +238,17 @@ select({opts}, {callback}) *oil.selec
|
||||||
{callback} `nil|fun(err: nil|string)` Called once all entries have been
|
{callback} `nil|fun(err: nil|string)` Called once all entries have been
|
||||||
opened
|
opened
|
||||||
|
|
||||||
save({opts}) *oil.save*
|
save({opts}, {cb}) *oil.save*
|
||||||
Save all changes
|
Save all changes
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
{opts} `nil|table`
|
{opts} `nil|table`
|
||||||
{confirm} `nil|boolean` Show confirmation when true, never when false,
|
{confirm} `nil|boolean` Show confirmation when true, never when false,
|
||||||
respect skip_confirm_for_simple_edits if nil
|
respect skip_confirm_for_simple_edits if nil
|
||||||
|
{cb} `nil|fun(err: nil|string)` Called when mutations complete.
|
||||||
|
|
||||||
|
Note:
|
||||||
|
If you provide your own callback function, there will be no notification for errors.
|
||||||
|
|
||||||
setup({opts}) *oil.setup*
|
setup({opts}) *oil.setup*
|
||||||
Initialize oil
|
Initialize oil
|
||||||
|
|
|
||||||
|
|
@ -749,10 +749,20 @@ end
|
||||||
---Save all changes
|
---Save all changes
|
||||||
---@param opts nil|table
|
---@param opts nil|table
|
||||||
--- confirm nil|boolean Show confirmation when true, never when false, respect skip_confirm_for_simple_edits if nil
|
--- confirm nil|boolean Show confirmation when true, never when false, respect skip_confirm_for_simple_edits if nil
|
||||||
M.save = function(opts)
|
---@param cb? fun(err: nil|string) Called when mutations complete.
|
||||||
|
---@note
|
||||||
|
--- If you provide your own callback function, there will be no notification for errors.
|
||||||
|
M.save = function(opts, cb)
|
||||||
opts = opts or {}
|
opts = opts or {}
|
||||||
|
if not cb then
|
||||||
|
cb = function(err)
|
||||||
|
if err and err ~= "Canceled" then
|
||||||
|
vim.notify(err, vim.log.levels.ERROR)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
local mutator = require("oil.mutator")
|
local mutator = require("oil.mutator")
|
||||||
mutator.try_write_changes(opts.confirm)
|
mutator.try_write_changes(opts.confirm, cb)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function restore_alt_buf()
|
local function restore_alt_buf()
|
||||||
|
|
@ -944,10 +954,28 @@ M.setup = function(opts)
|
||||||
pattern = scheme_pattern,
|
pattern = scheme_pattern,
|
||||||
nested = true,
|
nested = true,
|
||||||
callback = function(params)
|
callback = function(params)
|
||||||
|
local winid = vim.api.nvim_get_current_win()
|
||||||
|
local last_cmd = vim.fn.histget("cmd", -1)
|
||||||
|
local last_expr = vim.fn.histget("expr", -1)
|
||||||
|
-- If the user issued a :wq or similar, we should quit after saving
|
||||||
|
local quit_after_save = last_cmd == "wq" or last_cmd == "x" or last_expr == "ZZ"
|
||||||
|
local quit_all = last_cmd:match("^wqal*$")
|
||||||
local bufname = vim.api.nvim_buf_get_name(params.buf)
|
local bufname = vim.api.nvim_buf_get_name(params.buf)
|
||||||
if vim.endswith(bufname, "/") then
|
if vim.endswith(bufname, "/") then
|
||||||
vim.cmd.doautocmd({ args = { "BufWritePre", params.file }, mods = { silent = true } })
|
vim.cmd.doautocmd({ args = { "BufWritePre", params.file }, mods = { silent = true } })
|
||||||
M.save()
|
M.save(nil, function(err)
|
||||||
|
if err then
|
||||||
|
if err ~= "Canceled" then
|
||||||
|
vim.notify(err, vim.log.levels.ERROR)
|
||||||
|
end
|
||||||
|
elseif winid == vim.api.nvim_get_current_win() then
|
||||||
|
if quit_after_save then
|
||||||
|
vim.cmd.quit()
|
||||||
|
elseif quit_all then
|
||||||
|
vim.cmd.quitall()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
vim.cmd.doautocmd({ args = { "BufWritePost", params.file }, mods = { silent = true } })
|
vim.cmd.doautocmd({ args = { "BufWritePost", params.file }, mods = { silent = true } })
|
||||||
else
|
else
|
||||||
local adapter = config.get_adapter_by_scheme(bufname)
|
local adapter = config.get_adapter_by_scheme(bufname)
|
||||||
|
|
|
||||||
|
|
@ -456,9 +456,13 @@ end
|
||||||
local mutation_in_progress = false
|
local mutation_in_progress = false
|
||||||
|
|
||||||
---@param confirm nil|boolean
|
---@param confirm nil|boolean
|
||||||
M.try_write_changes = function(confirm)
|
---@param cb? fun(err: nil|string)
|
||||||
|
M.try_write_changes = function(confirm, cb)
|
||||||
|
if not cb then
|
||||||
|
cb = function(_err) end
|
||||||
|
end
|
||||||
if mutation_in_progress then
|
if mutation_in_progress then
|
||||||
error("Cannot perform mutation when already in progress")
|
cb("Cannot perform mutation when already in progress")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
local current_buf = vim.api.nvim_get_current_buf()
|
local current_buf = vim.api.nvim_get_current_buf()
|
||||||
|
|
@ -495,7 +499,6 @@ M.try_write_changes = function(confirm)
|
||||||
local ns = vim.api.nvim_create_namespace("Oil")
|
local ns = vim.api.nvim_create_namespace("Oil")
|
||||||
vim.diagnostic.reset(ns)
|
vim.diagnostic.reset(ns)
|
||||||
if not vim.tbl_isempty(all_errors) then
|
if not vim.tbl_isempty(all_errors) then
|
||||||
vim.notify("Error parsing oil buffers", vim.log.levels.ERROR)
|
|
||||||
for bufnr, errors in pairs(all_errors) do
|
for bufnr, errors in pairs(all_errors) do
|
||||||
vim.diagnostic.set(ns, bufnr, errors)
|
vim.diagnostic.set(ns, bufnr, errors)
|
||||||
end
|
end
|
||||||
|
|
@ -514,13 +517,17 @@ M.try_write_changes = function(confirm)
|
||||||
vim.api.nvim_win_set_buf(0, bufnr)
|
vim.api.nvim_win_set_buf(0, bufnr)
|
||||||
pcall(vim.api.nvim_win_set_cursor, 0, { errs[1].lnum + 1, errs[1].col })
|
pcall(vim.api.nvim_win_set_cursor, 0, { errs[1].lnum + 1, errs[1].col })
|
||||||
end
|
end
|
||||||
return unlock()
|
unlock()
|
||||||
|
cb("Error parsing oil buffers")
|
||||||
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local actions = M.create_actions_from_diffs(all_diffs)
|
local actions = M.create_actions_from_diffs(all_diffs)
|
||||||
preview.show(actions, confirm, function(proceed)
|
preview.show(actions, confirm, function(proceed)
|
||||||
if not proceed then
|
if not proceed then
|
||||||
return unlock()
|
unlock()
|
||||||
|
cb("Canceled")
|
||||||
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
M.process_actions(
|
M.process_actions(
|
||||||
|
|
@ -528,7 +535,7 @@ M.try_write_changes = function(confirm)
|
||||||
vim.schedule_wrap(function(err)
|
vim.schedule_wrap(function(err)
|
||||||
view.unlock_buffers()
|
view.unlock_buffers()
|
||||||
if err then
|
if err then
|
||||||
vim.notify(string.format("[oil] Error applying actions: %s", err), vim.log.levels.ERROR)
|
err = string.format("[oil] Error applying actions: %s", err)
|
||||||
view.rerender_all_oil_buffers()
|
view.rerender_all_oil_buffers()
|
||||||
else
|
else
|
||||||
local current_entry = oil.get_cursor_entry()
|
local current_entry = oil.get_cursor_entry()
|
||||||
|
|
@ -543,6 +550,7 @@ M.try_write_changes = function(confirm)
|
||||||
vim.api.nvim_exec_autocmds("User", { pattern = "OilMutationComplete", modeline = false })
|
vim.api.nvim_exec_autocmds("User", { pattern = "OilMutationComplete", modeline = false })
|
||||||
end
|
end
|
||||||
mutation_in_progress = false
|
mutation_in_progress = false
|
||||||
|
cb(err)
|
||||||
end)
|
end)
|
||||||
)
|
)
|
||||||
end)
|
end)
|
||||||
|
|
|
||||||
|
|
@ -684,6 +684,7 @@ M.render_buffer_async = function(bufnr, opts, callback)
|
||||||
local seek_after_render_found = false
|
local seek_after_render_found = false
|
||||||
local first = true
|
local first = true
|
||||||
vim.bo[bufnr].modifiable = false
|
vim.bo[bufnr].modifiable = false
|
||||||
|
vim.bo[bufnr].modified = false
|
||||||
loading.set_loading(bufnr, true)
|
loading.set_loading(bufnr, true)
|
||||||
|
|
||||||
local finish = vim.schedule_wrap(function()
|
local finish = vim.schedule_wrap(function()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue