diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/buffer.c | 40 | ||||
| -rw-r--r-- | src/nvim/testdir/test_functions.vim | 7 | 
2 files changed, 33 insertions, 14 deletions
| diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 3211b83dc7..514be4c56b 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -227,7 +227,7 @@ int open_buffer(int read_stdin, exarg_T *eap, int flags_arg)    // A buffer without an actual file should not use the buffer name to read a    // file. -  if (bt_quickfix(curbuf) || bt_nofilename(curbuf)) { +  if (bt_nofileread(curbuf)) {      flags |= READ_NOFILE;    } @@ -812,6 +812,18 @@ static void free_buffer(buf_T *buf)    }  } +/// Free the b_wininfo list for buffer "buf". +static void clear_wininfo(buf_T *buf) +{ +  wininfo_T *wip; + +  while (buf->b_wininfo != NULL) { +    wip = buf->b_wininfo; +    buf->b_wininfo = wip->wi_next; +    free_wininfo(wip, buf); +  } +} +  /// Free stuff in the buffer for ":bdel" and when wiping out the buffer.  ///  /// @param buf  Buffer pointer @@ -846,18 +858,6 @@ static void free_buffer_stuff(buf_T *buf, int free_flags)    buf_updates_unload(buf, false);  } -/// Free the b_wininfo list for buffer "buf". -static void clear_wininfo(buf_T *buf) -{ -  wininfo_T *wip; - -  while (buf->b_wininfo != NULL) { -    wip = buf->b_wininfo; -    buf->b_wininfo = wip->wi_next; -    free_wininfo(wip, buf); -  } -} -  /// Go to another buffer.  Handles the result of the ATTENTION dialog.  void goto_buffer(exarg_T *eap, int start, int dir, int count)  { @@ -3834,7 +3834,8 @@ bool bt_terminal(const buf_T *const buf)  }  /// @return  true if "buf" is a "nofile", "acwrite", "terminal" or "prompt" -///          buffer.  This means the buffer name is not a file name. +///          buffer.  This means the buffer name may not be a file name, +///          at least not for writing the buffer.  bool bt_nofilename(const buf_T *const buf)    FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT  { @@ -3844,6 +3845,17 @@ bool bt_nofilename(const buf_T *const buf)                           || buf->b_p_bt[0] == 'p');  } +/// @return  true if "buf" is a "nofile", "quickfix", "terminal" or "prompt" +///          buffer.  This means the buffer is not to be read from a file. +static bool bt_nofileread(const buf_T *const buf) +  FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT +{ +  return buf != NULL && ((buf->b_p_bt[0] == 'n' && buf->b_p_bt[2] == 'f') +                         || buf->b_p_bt[0] == 't' +                         || buf->b_p_bt[0] == 'q' +                         || buf->b_p_bt[0] == 'p'); +} +  /// @return  true if "buf" has 'buftype' set to "nofile".  bool bt_nofile(const buf_T *const buf)    FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT diff --git a/src/nvim/testdir/test_functions.vim b/src/nvim/testdir/test_functions.vim index b1f617ceda..555c4f58b7 100644 --- a/src/nvim/testdir/test_functions.vim +++ b/src/nvim/testdir/test_functions.vim @@ -1887,6 +1887,13 @@ func Test_bufadd_bufload()    call bufload(buf)    call assert_equal([''], getbufline(buf, 1, '$')) +  " when 'buftype' is "acwrite" then bufload() DOES read the file +  bwipe! XotherName +  let buf = bufadd('XotherName') +  call setbufvar(buf, '&bt', 'acwrite') +  call bufload(buf) +  call assert_equal(['some', 'text'], getbufline(buf, 1, '$')) +    bwipe someName    bwipe XotherName    call assert_equal(0, bufexists('someName')) | 
