diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-07-07 04:47:18 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-07 04:47:18 +0800 |
commit | 664efa497e4e3d79d2e4ab486acbf1471b2389b0 (patch) | |
tree | 389a04a3846cf3d5df7464b03294be48302ee09e /src/nvim/eval/funcs.c | |
parent | 1e03255646be3a31d44db4118ee2194d45f6bf1c (diff) | |
download | rneovim-664efa497e4e3d79d2e4ab486acbf1471b2389b0.tar.gz rneovim-664efa497e4e3d79d2e4ab486acbf1471b2389b0.tar.bz2 rneovim-664efa497e4e3d79d2e4ab486acbf1471b2389b0.zip |
vim-patch:8.2.0614: get ml_get error when deleting a line in 'completefunc' (#19244)
Problem: Get ml_get error when deleting a line in 'completefunc'. (Yegappan
Lakshmanan)
Solution: Lock the text while evaluating 'completefunc'.
https://github.com/vim/vim/commit/ff06f283e3e4b3ec43012dd3b83f8454c98f6639
Fix a mistake in the porting of patch 8.1.0098.
Cherry-pick Test_run_excmd_with_text_locked() from patch 8.2.0270.
Cherry-pick test_gf.vim changes from patch 8.2.0369.
Cherry-pick message change from later patches.
Diffstat (limited to 'src/nvim/eval/funcs.c')
-rw-r--r-- | src/nvim/eval/funcs.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index 8d267f6a9e..2775fd4778 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -1062,6 +1062,11 @@ static void f_complete(typval_T *argvars, typval_T *rettv, FunPtr fptr) return; } + const int save_textlock = textlock; + // "textlock" is set when evaluating 'completefunc' but we can change text + // here. + textlock = 0; + // Check for undo allowed here, because if something was already inserted // the line was already saved for undo and this check isn't done. if (!undo_allowed(curbuf)) { @@ -1070,15 +1075,13 @@ static void f_complete(typval_T *argvars, typval_T *rettv, FunPtr fptr) if (argvars[1].v_type != VAR_LIST) { emsg(_(e_invarg)); - return; - } - - const colnr_T startcol = tv_get_number_chk(&argvars[0], NULL); - if (startcol <= 0) { - return; + } else { + const colnr_T startcol = tv_get_number_chk(&argvars[0], NULL); + if (startcol > 0) { + set_completion(startcol - 1, argvars[1].vval.v_list); + } } - - set_completion(startcol - 1, argvars[1].vval.v_list); + textlock = save_textlock; } /// "complete_add()" function |