diff options
author | TJ DeVries <devries.timothyj@gmail.com> | 2020-10-09 15:39:59 -0400 |
---|---|---|
committer | TJ DeVries <devries.timothyj@gmail.com> | 2020-10-22 16:08:32 -0400 |
commit | 78556aba7d0934ba92de376c267e3e82f4f77f1d (patch) | |
tree | a381a5c8280951afa71cdba4a6322ff3f383dd93 | |
parent | df726408d7043c618877118909f53a78b85eb2fd (diff) | |
download | rneovim-78556aba7d0934ba92de376c267e3e82f4f77f1d.tar.gz rneovim-78556aba7d0934ba92de376c267e3e82f4f77f1d.tar.bz2 rneovim-78556aba7d0934ba92de376c267e3e82f4f77f1d.zip |
api: nvim_buf_delete
-rw-r--r-- | runtime/doc/api.txt | 11 | ||||
-rw-r--r-- | src/nvim/api/buffer.c | 55 | ||||
-rw-r--r-- | test/functional/api/buffer_spec.lua | 20 |
3 files changed, 86 insertions, 0 deletions
diff --git a/runtime/doc/api.txt b/runtime/doc/api.txt index 083128ab80..0c726ddd86 100644 --- a/runtime/doc/api.txt +++ b/runtime/doc/api.txt @@ -1783,6 +1783,17 @@ nvim_buf_del_var({buffer}, {name}) *nvim_buf_del_var()* {buffer} Buffer handle, or 0 for current buffer {name} Variable name +nvim_buf_delete({buffer}, {opts}) *nvim_buf_delete()* + Deletes the buffer. See |:bwipeout| + + Parameters: ~ + {buffer} Buffer handle, or 0 for current buffer + {opts} Optional parameters. Keys: + • force: Force deletion and ignore unsaved + changes. + • unload: Unloaded only, do not delete. See + |:bunload| + nvim_buf_detach({buffer}) *nvim_buf_detach()* Deactivates buffer-update events on the channel. diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c index c8dd85b39d..ac23c6df92 100644 --- a/src/nvim/api/buffer.c +++ b/src/nvim/api/buffer.c @@ -953,6 +953,61 @@ Boolean nvim_buf_is_loaded(Buffer buffer) return buf && buf->b_ml.ml_mfp != NULL; } +#define UNPACK_BOOL_RV(result, v, message, rv) \ + if (v->type == kObjectTypeBoolean) { \ + result = v->data.boolean; \ + } else if (v->type == kObjectTypeInteger) { \ + result = v->data.integer; \ + } else { \ + api_set_error(err, kErrorTypeValidation, message); \ + return rv; \ + } + +#define UNPACK_BOOL(result, v, message) UNPACK_BOOL_RV(result, v, message, ) + +/// Deletes the buffer. See |:bwipeout| +/// +/// @param buffer Buffer handle, or 0 for current buffer +/// @param opts Optional parameters. Keys: +/// - force: Force deletion and ignore unsaved changes. +/// - unload: Unloaded only, do not delete. See |:bunload| +void nvim_buf_delete(Buffer buffer, Dictionary opts, Error *err) + FUNC_API_SINCE(7) +{ + buf_T *buf = find_buffer_by_handle(buffer, err); + + if (ERROR_SET(err)) { + return; + } + + bool force = false; + bool unload = false; + for (size_t i = 0; i < opts.size; i++) { + String k = opts.items[i].key; + Object *v = &opts.items[i].value; + if (strequal("force", k.data)) { + UNPACK_BOOL(force, v, "force must be a boolean") + } else if (strequal("unload", k.data)) { + UNPACK_BOOL(unload, v, "unload must be a boolean") + } else { + api_set_error(err, kErrorTypeValidation, "unexpected key: %s", k.data); + return; + } + } + + int result = do_buffer( + unload ? DOBUF_UNLOAD : DOBUF_WIPE, + DOBUF_FIRST, + FORWARD, + buf->handle, + force); + + if (result == FAIL) { + api_set_error(err, kErrorTypeException, "Failed to unload buffer."); + return; + } +} + /// Checks if a buffer is valid. /// /// @note Even if a buffer is valid it may have been unloaded. See |api-buffer| diff --git a/test/functional/api/buffer_spec.lua b/test/functional/api/buffer_spec.lua index da7515f012..8ed642b43e 100644 --- a/test/functional/api/buffer_spec.lua +++ b/test/functional/api/buffer_spec.lua @@ -534,6 +534,26 @@ describe('api/buf', function() end) end) + describe('nvim_buf_delete', function() + it('allows for just deleting', function() + nvim('command', 'new') + local b = nvim('get_current_buf') + ok(buffer('is_valid', b)) + nvim('buf_delete', b, {}) + ok(not buffer('is_loaded', b)) + ok(not buffer('is_valid', b)) + end) + + it('allows for just unloading', function() + nvim('command', 'new') + local b = nvim('get_current_buf') + ok(buffer('is_valid', b)) + nvim('buf_delete', b, { unload = true }) + ok(not buffer('is_loaded', b)) + ok(buffer('is_valid', b)) + end) + end) + describe('nvim_buf_get_mark', function() it('works', function() curbuf('set_lines', -1, -1, true, {'a', 'bit of', 'text'}) |