Mercurial > vim
view src/proto/buffer.pro @ 34194:a522c6c0127b v9.1.0047
patch 9.1.0047: issues with temp curwin/buf while cmdwin is open
Commit: https://github.com/vim/vim/commit/988f74311c26ea9917e84fbae608de226dba7e5f
Author: Sean Dewar <seandewar@users.noreply.github.com>
Date: Wed Aug 16 14:17:36 2023 +0100
patch 9.1.0047: issues with temp curwin/buf while cmdwin is open
Problem: Things that temporarily change/restore curwin/buf (e.g:
win_execute, some autocmds) may break assumptions that
curwin/buf is the cmdwin when "cmdwin_type != 0", causing
issues.
Solution: Expose the cmdwin's real win/buf and check that instead. Also
try to ensure these variables are NULL if "cmdwin_type == 0",
allowing them to be used directly in most cases without
checking cmdwin_type. (Sean Dewar)
Alternatively, we could ban win_execute in the cmdwin and audit all places that
temporarily change/restore curwin/buf, but I didn't notice any problems arising
from allowing this (standard cmdwin restrictions still apply, so things that may
actually break the cmdwin are still forbidden).
closes: #12819
Signed-off-by: Sean Dewar <seandewar@users.noreply.github.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 23 Jan 2024 23:00:04 +0100 |
parents | 9716c7d24c12 |
children |
line wrap: on
line source
/* buffer.c */ int get_highest_fnum(void); void buffer_ensure_loaded(buf_T *buf); int open_buffer(int read_stdin, exarg_T *eap, int flags_arg); void set_bufref(bufref_T *bufref, buf_T *buf); int bufref_valid(bufref_T *bufref); int buf_valid(buf_T *buf); int close_buffer(win_T *win, buf_T *buf, int action, int abort_if_last, int ignore_abort); void buf_clear_file(buf_T *buf); void buf_freeall(buf_T *buf, int flags); void free_wininfo(wininfo_T *wip); void goto_buffer(exarg_T *eap, int start, int dir, int count); void handle_swap_exists(bufref_T *old_curbuf); int do_buffer(int action, int start, int dir, int count, int forceit); char *do_bufdel(int command, char_u *arg, int addr_count, int start_bnr, int end_bnr, int forceit); void set_curbuf(buf_T *buf, int action); void do_autochdir(void); void no_write_message(void); void no_write_message_nobang(buf_T *buf); int curbuf_reusable(void); buf_T *buflist_new(char_u *ffname_arg, char_u *sfname_arg, linenr_T lnum, int flags); void free_buf_options(buf_T *buf, int free_p_ff); int buflist_getfile(int n, linenr_T lnum, int options, int forceit); buf_T *buflist_findname_exp(char_u *fname); buf_T *buflist_findname(char_u *ffname); int buflist_findpat(char_u *pattern, char_u *pattern_end, int unlisted, int diffmode, int curtab_only); int ExpandBufnames(char_u *pat, int *num_file, char_u ***file, int options); buf_T *buflist_findnr(int nr); char_u *buflist_nr2name(int n, int fullname, int helptail); void buflist_setfpos(buf_T *buf, win_T *win, linenr_T lnum, colnr_T col, int copy_options); void get_winopts(buf_T *buf); pos_T *buflist_findfpos(buf_T *buf); linenr_T buflist_findlnum(buf_T *buf); void buflist_list(exarg_T *eap); int buflist_name_nr(int fnum, char_u **fname, linenr_T *lnum); int setfname(buf_T *buf, char_u *ffname_arg, char_u *sfname_arg, int message); void buf_set_name(int fnum, char_u *name); void buf_name_changed(buf_T *buf); buf_T *setaltfname(char_u *ffname, char_u *sfname, linenr_T lnum); char_u *getaltfname(int errmsg); int buflist_add(char_u *fname, int flags); void buflist_slash_adjust(void); void buflist_altfpos(win_T *win); int otherfile(char_u *ffname); void buf_setino(buf_T *buf); void fileinfo(int fullname, int shorthelp, int dont_truncate); void col_print(char_u *buf, size_t buflen, int col, int vcol); void maketitle(void); void resettitle(void); void free_titles(void); int build_stl_str_hl(win_T *wp, char_u *out, size_t outlen, char_u *fmt, char_u *opt_name, int opt_scope, int fillchar, int maxwidth, stl_hlrec_T **hltab, stl_hlrec_T **tabtab); void get_rel_pos(win_T *wp, char_u *buf, int buflen); char_u *fix_fname(char_u *fname); void fname_expand(buf_T *buf, char_u **ffname, char_u **sfname); void ex_buffer_all(exarg_T *eap); void do_modelines(int flags); int bt_normal(buf_T *buf); int bt_quickfix(buf_T *buf); int bt_terminal(buf_T *buf); int bt_help(buf_T *buf); int bt_prompt(buf_T *buf); int bt_popup(buf_T *buf); int bt_nofilename(buf_T *buf); int bt_nofile(buf_T *buf); int bt_dontwrite(buf_T *buf); int bt_dontwrite_msg(buf_T *buf); int buf_hide(buf_T *buf); char_u *buf_spname(buf_T *buf); char_u *buf_get_fname(buf_T *buf); void set_buflisted(int on); int buf_contents_changed(buf_T *buf); void wipe_buffer(buf_T *buf, int aucmd); /* vim: set ft=c : */