aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-11-29 18:20:11 +0800
committerzeertzjq <zeertzjq@outlook.com>2022-11-29 20:36:31 +0800
commit3173d07564e7cdf0834099a379f0faf480c76224 (patch)
tree2ced5358c126a6015f0b66a1e015542f039ac29f /src/nvim/eval
parent273358651af6b6d172944cd1b1b41a9869d53b10 (diff)
downloadrneovim-3173d07564e7cdf0834099a379f0faf480c76224.tar.gz
rneovim-3173d07564e7cdf0834099a379f0faf480c76224.tar.bz2
rneovim-3173d07564e7cdf0834099a379f0faf480c76224.zip
vim-patch:9.0.0965: using one window for executing autocommands is insufficient
Problem: Using one window for executing autocommands is insufficient. Solution: Use up to five windows for executing autocommands. https://github.com/vim/vim/commit/e76062c078debed0df818f70e4db14ad7a7cb53a N/A patches for version.c: vim-patch:9.0.0966: some compilers don't allow a declaration after a label Problem: Some compilers don't allow a declaration after a label. Solution: Move the declaration to the start of the block. (John Marriott) https://github.com/vim/vim/commit/f86490ed4fdab213a28f667abd055c023a73d645 Co-authored-by: Bram Moolenaar <Bram@vim.org>
Diffstat (limited to 'src/nvim/eval')
-rw-r--r--src/nvim/eval/buffer.c6
-rw-r--r--src/nvim/eval/vars.c12
-rw-r--r--src/nvim/eval/window.c4
3 files changed, 14 insertions, 8 deletions
diff --git a/src/nvim/eval/buffer.c b/src/nvim/eval/buffer.c
index 72eb0f8d67..6ebf54ef0f 100644
--- a/src/nvim/eval/buffer.c
+++ b/src/nvim/eval/buffer.c
@@ -86,6 +86,8 @@ static void find_win_for_curbuf(void)
///
/// Information is saved in "cob" and MUST be restored by calling
/// change_other_buffer_restore().
+///
+/// If this fails then "curbuf" will not be equal to "buf".
static void change_other_buffer_prepare(cob_T *cob, buf_T *buf)
{
CLEAR_POINTER(cob);
@@ -103,7 +105,9 @@ static void change_other_buffer_prepare(cob_T *cob, buf_T *buf)
// curwin->w_buffer differ from "curbuf", use the autocmd window.
curbuf = curwin->w_buffer;
aucmd_prepbuf(&cob->cob_aco, buf);
- cob->cob_using_aco = true;
+ if (curbuf == buf) {
+ cob->cob_using_aco = true;
+ }
}
}
diff --git a/src/nvim/eval/vars.c b/src/nvim/eval/vars.c
index 5459eac5bf..f002071ad2 100644
--- a/src/nvim/eval/vars.c
+++ b/src/nvim/eval/vars.c
@@ -1800,13 +1800,15 @@ void f_setbufvar(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
if (*varname == '&') {
aco_save_T aco;
- // set curbuf to be our buf, temporarily
+ // Set curbuf to be our buf, temporarily.
aucmd_prepbuf(&aco, buf);
+ if (curbuf == buf) {
+ // Only when it worked to set "curbuf".
+ set_option_from_tv(varname + 1, varp);
- set_option_from_tv(varname + 1, varp);
-
- // reset notion of buffer
- aucmd_restbuf(&aco);
+ // reset notion of buffer
+ aucmd_restbuf(&aco);
+ }
} else {
const size_t varname_len = strlen(varname);
char *const bufvarname = xmalloc(varname_len + 3);
diff --git a/src/nvim/eval/window.c b/src/nvim/eval/window.c
index d6c761bc66..7cb346216d 100644
--- a/src/nvim/eval/window.c
+++ b/src/nvim/eval/window.c
@@ -590,7 +590,7 @@ static void win_move_into_split(win_T *wp, win_T *targetwin, int size, int flags
int height = wp->w_height;
win_T *oldwin = curwin;
- if (wp == targetwin || wp == aucmd_win) {
+ if (wp == targetwin || is_aucmd_win(wp)) {
return;
}
@@ -674,7 +674,7 @@ void f_win_gettype(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
return;
}
}
- if (wp == aucmd_win) {
+ if (is_aucmd_win(wp)) {
rettv->vval.v_string = xstrdup("autocmd");
} else if (wp->w_p_pvw) {
rettv->vval.v_string = xstrdup("preview");