mirror of
https://github.com/neovim/neovim.git
synced 2025-09-23 11:38:31 +00:00
Merge branch 'master' into luaviml'/lua
This commit is contained in:
@@ -296,7 +296,7 @@ void nvim_buf_set_lines(uint64_t channel_id,
|
||||
tabpage_T *save_curtab = NULL;
|
||||
size_t new_len = replacement.size;
|
||||
size_t old_len = (size_t)(end - start);
|
||||
ssize_t extra = 0; // lines added to text, can be negative
|
||||
ptrdiff_t extra = 0; // lines added to text, can be negative
|
||||
char **lines = (new_len != 0) ? xcalloc(new_len, sizeof(char *)) : NULL;
|
||||
|
||||
for (size_t i = 0; i < new_len; i++) {
|
||||
@@ -342,8 +342,8 @@ void nvim_buf_set_lines(uint64_t channel_id,
|
||||
}
|
||||
}
|
||||
|
||||
if ((ssize_t)to_delete > 0) {
|
||||
extra -= (ssize_t)to_delete;
|
||||
if (to_delete > 0) {
|
||||
extra -= (ptrdiff_t)to_delete;
|
||||
}
|
||||
|
||||
// For as long as possible, replace the existing old_len with the
|
||||
@@ -395,10 +395,10 @@ void nvim_buf_set_lines(uint64_t channel_id,
|
||||
mark_adjust((linenr_T)start, (linenr_T)(end - 1), MAXLNUM, extra);
|
||||
}
|
||||
|
||||
changed_lines((linenr_T)start, 0, (linenr_T)end, extra);
|
||||
changed_lines((linenr_T)start, 0, (linenr_T)end, (long)extra);
|
||||
|
||||
if (save_curbuf.br_buf == NULL) {
|
||||
fix_cursor((linenr_T)start, (linenr_T)end, extra);
|
||||
fix_cursor((linenr_T)start, (linenr_T)end, (linenr_T)extra);
|
||||
}
|
||||
|
||||
end:
|
||||
|
@@ -14,6 +14,7 @@
|
||||
#include "nvim/window.h"
|
||||
#include "nvim/memory.h"
|
||||
#include "nvim/eval.h"
|
||||
#include "nvim/eval/typval.h"
|
||||
#include "nvim/map_defs.h"
|
||||
#include "nvim/map.h"
|
||||
#include "nvim/option.h"
|
||||
@@ -87,14 +88,13 @@ bool try_end(Error *err)
|
||||
/// @param[out] err Details of an error that may have occurred
|
||||
Object dict_get_value(dict_T *dict, String key, Error *err)
|
||||
{
|
||||
hashitem_T *hi = hash_find(&dict->dv_hashtab, (uint8_t *) key.data);
|
||||
dictitem_T *const di = tv_dict_find(dict, key.data, (ptrdiff_t)key.size);
|
||||
|
||||
if (HASHITEM_EMPTY(hi)) {
|
||||
if (di == NULL) {
|
||||
api_set_error(err, Validation, _("Key not found"));
|
||||
return (Object) OBJECT_INIT;
|
||||
}
|
||||
|
||||
dictitem_T *di = dict_lookup(hi);
|
||||
return vim_to_object(&di->di_tv);
|
||||
}
|
||||
|
||||
@@ -129,7 +129,7 @@ Object dict_set_var(dict_T *dict, String key, Object value, bool del,
|
||||
return rv;
|
||||
}
|
||||
|
||||
dictitem_T *di = dict_find(dict, (char_u *)key.data, (int)key.size);
|
||||
dictitem_T *di = tv_dict_find(dict, key.data, (ptrdiff_t)key.size);
|
||||
|
||||
if (di != NULL) {
|
||||
if (di->di_flags & DI_FLAGS_RO) {
|
||||
@@ -155,9 +155,7 @@ Object dict_set_var(dict_T *dict, String key, Object value, bool del,
|
||||
rv = vim_to_object(&di->di_tv);
|
||||
}
|
||||
// Delete the entry
|
||||
hashitem_T *hi = hash_find(&dict->dv_hashtab, di->di_key);
|
||||
hash_remove(&dict->dv_hashtab, hi);
|
||||
dictitem_free(di);
|
||||
tv_dict_item_remove(dict, di);
|
||||
}
|
||||
} else {
|
||||
// Update the key
|
||||
@@ -170,20 +168,20 @@ Object dict_set_var(dict_T *dict, String key, Object value, bool del,
|
||||
|
||||
if (di == NULL) {
|
||||
// Need to create an entry
|
||||
di = dictitem_alloc((uint8_t *) key.data);
|
||||
dict_add(dict, di);
|
||||
di = tv_dict_item_alloc_len(key.data, key.size);
|
||||
tv_dict_add(dict, di);
|
||||
} else {
|
||||
// Return the old value
|
||||
if (retval) {
|
||||
rv = vim_to_object(&di->di_tv);
|
||||
}
|
||||
clear_tv(&di->di_tv);
|
||||
tv_clear(&di->di_tv);
|
||||
}
|
||||
|
||||
// Update the value
|
||||
copy_tv(&tv, &di->di_tv);
|
||||
tv_copy(&tv, &di->di_tv);
|
||||
// Clear the temporary variable
|
||||
clear_tv(&tv);
|
||||
tv_clear(&tv);
|
||||
}
|
||||
|
||||
return rv;
|
||||
@@ -291,7 +289,7 @@ void set_option_to(void *to, int type, String name, Object value, Error *err)
|
||||
}
|
||||
}
|
||||
|
||||
int opt_flags = (type ? OPT_LOCAL : OPT_GLOBAL);
|
||||
int opt_flags = (type == SREQ_GLOBAL) ? OPT_GLOBAL : OPT_LOCAL;
|
||||
|
||||
if (flags & SOPT_BOOL) {
|
||||
if (value.type != kObjectTypeBoolean) {
|
||||
@@ -627,7 +625,7 @@ String cstr_as_string(char *str) FUNC_ATTR_PURE
|
||||
if (str == NULL) {
|
||||
return (String) STRING_INIT;
|
||||
}
|
||||
return (String) {.data = str, .size = strlen(str)};
|
||||
return (String) { .data = str, .size = strlen(str) };
|
||||
}
|
||||
|
||||
/// Converts from type Object to a VimL value.
|
||||
@@ -682,20 +680,20 @@ bool object_to_vim(Object obj, typval_T *tv, Error *err)
|
||||
break;
|
||||
|
||||
case kObjectTypeArray: {
|
||||
list_T *list = list_alloc();
|
||||
list_T *const list = tv_list_alloc();
|
||||
|
||||
for (uint32_t i = 0; i < obj.data.array.size; i++) {
|
||||
Object item = obj.data.array.items[i];
|
||||
listitem_T *li = listitem_alloc();
|
||||
listitem_T *li = tv_list_item_alloc();
|
||||
|
||||
if (!object_to_vim(item, &li->li_tv, err)) {
|
||||
// cleanup
|
||||
listitem_free(li);
|
||||
list_free(list);
|
||||
tv_list_item_free(li);
|
||||
tv_list_free(list);
|
||||
return false;
|
||||
}
|
||||
|
||||
list_append(list, li);
|
||||
tv_list_append(list, li);
|
||||
}
|
||||
list->lv_refcount++;
|
||||
|
||||
@@ -705,7 +703,7 @@ bool object_to_vim(Object obj, typval_T *tv, Error *err)
|
||||
}
|
||||
|
||||
case kObjectTypeDictionary: {
|
||||
dict_T *dict = dict_alloc();
|
||||
dict_T *const dict = tv_dict_alloc();
|
||||
|
||||
for (uint32_t i = 0; i < obj.data.dictionary.size; i++) {
|
||||
KeyValuePair item = obj.data.dictionary.items[i];
|
||||
@@ -715,20 +713,20 @@ bool object_to_vim(Object obj, typval_T *tv, Error *err)
|
||||
api_set_error(err, Validation,
|
||||
_("Empty dictionary keys aren't allowed"));
|
||||
// cleanup
|
||||
dict_free(dict);
|
||||
tv_dict_free(dict);
|
||||
return false;
|
||||
}
|
||||
|
||||
dictitem_T *di = dictitem_alloc((uint8_t *)key.data);
|
||||
dictitem_T *const di = tv_dict_item_alloc(key.data);
|
||||
|
||||
if (!object_to_vim(item.value, &di->di_tv, err)) {
|
||||
// cleanup
|
||||
dictitem_free(di);
|
||||
dict_free(dict);
|
||||
tv_dict_item_free(di);
|
||||
tv_dict_free(dict);
|
||||
return false;
|
||||
}
|
||||
|
||||
dict_add(dict, di);
|
||||
tv_dict_add(dict, di);
|
||||
}
|
||||
dict->dv_refcount++;
|
||||
|
||||
@@ -962,11 +960,7 @@ static void set_option_value_err(char *key,
|
||||
{
|
||||
char *errmsg;
|
||||
|
||||
if ((errmsg = (char *)set_option_value((uint8_t *)key,
|
||||
numval,
|
||||
(uint8_t *)stringval,
|
||||
opt_flags)))
|
||||
{
|
||||
if ((errmsg = set_option_value(key, numval, stringval, opt_flags))) {
|
||||
if (try_end(err)) {
|
||||
return;
|
||||
}
|
||||
|
@@ -12,6 +12,7 @@
|
||||
#include "nvim/api/private/defs.h"
|
||||
#include "nvim/api/private/helpers.h"
|
||||
#include "nvim/popupmnu.h"
|
||||
#include "nvim/cursor_shape.h"
|
||||
|
||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||
# include "api/ui.c.generated.h"
|
||||
@@ -69,6 +70,7 @@ void nvim_ui_attach(uint64_t channel_id, Integer width, Integer height,
|
||||
ui->clear = remote_ui_clear;
|
||||
ui->eol_clear = remote_ui_eol_clear;
|
||||
ui->cursor_goto = remote_ui_cursor_goto;
|
||||
ui->cursor_style_set = remote_ui_cursor_style_set;
|
||||
ui->update_menu = remote_ui_update_menu;
|
||||
ui->busy_start = remote_ui_busy_start;
|
||||
ui->busy_stop = remote_ui_busy_stop;
|
||||
@@ -298,6 +300,14 @@ static void remote_ui_scroll(UI *ui, int count)
|
||||
push_call(ui, "scroll", args);
|
||||
}
|
||||
|
||||
static void remote_ui_cursor_style_set(UI *ui, bool enabled, Dictionary data)
|
||||
{
|
||||
Array args = ARRAY_DICT_INIT;
|
||||
ADD(args, BOOLEAN_OBJ(enabled));
|
||||
ADD(args, copy_object(DICTIONARY_OBJ(data)));
|
||||
push_call(ui, "cursor_style_set", args);
|
||||
}
|
||||
|
||||
static void remote_ui_highlight_set(UI *ui, HlAttrs attrs)
|
||||
{
|
||||
Array args = ARRAY_DICT_INIT;
|
||||
|
@@ -22,6 +22,7 @@
|
||||
#include "nvim/memory.h"
|
||||
#include "nvim/message.h"
|
||||
#include "nvim/eval.h"
|
||||
#include "nvim/eval/typval.h"
|
||||
#include "nvim/option.h"
|
||||
#include "nvim/syntax.h"
|
||||
#include "nvim/getchar.h"
|
||||
@@ -181,19 +182,20 @@ Object nvim_eval(String expr, Error *err)
|
||||
Object rv = OBJECT_INIT;
|
||||
// Evaluate the expression
|
||||
try_start();
|
||||
typval_T *expr_result = eval_expr((char_u *)expr.data, NULL);
|
||||
|
||||
if (!expr_result) {
|
||||
api_set_error(err, Exception, _("Failed to evaluate expression"));
|
||||
typval_T rettv;
|
||||
if (eval0((char_u *)expr.data, &rettv, NULL, true) == FAIL) {
|
||||
api_set_error(err, Exception, "Failed to evaluate expression");
|
||||
}
|
||||
|
||||
if (!try_end(err)) {
|
||||
// No errors, convert the result
|
||||
rv = vim_to_object(expr_result);
|
||||
rv = vim_to_object(&rettv);
|
||||
}
|
||||
|
||||
// Free the vim object
|
||||
free_tv(expr_result);
|
||||
// Free the Vim object
|
||||
tv_clear(&rettv);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -238,11 +240,11 @@ Object nvim_call_function(String fname, Array args, Error *err)
|
||||
if (!try_end(err)) {
|
||||
rv = vim_to_object(&rettv);
|
||||
}
|
||||
clear_tv(&rettv);
|
||||
tv_clear(&rettv);
|
||||
|
||||
free_vim_args:
|
||||
while (i > 0) {
|
||||
clear_tv(&vim_args[--i]);
|
||||
tv_clear(&vim_args[--i]);
|
||||
}
|
||||
|
||||
return rv;
|
||||
@@ -439,7 +441,7 @@ Object nvim_get_vvar(String name, Error *err)
|
||||
///
|
||||
/// @param name Option name
|
||||
/// @param[out] err Error details, if any
|
||||
/// @return Option value
|
||||
/// @return Option value (global)
|
||||
Object nvim_get_option(String name, Error *err)
|
||||
FUNC_API_SINCE(1)
|
||||
{
|
||||
|
Reference in New Issue
Block a user