aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/windows.txt16
-rw-r--r--src/nvim/ex_docmd.c50
-rw-r--r--src/nvim/version.c2
3 files changed, 49 insertions, 19 deletions
diff --git a/runtime/doc/windows.txt b/runtime/doc/windows.txt
index 4c1ec0c0fd..0a1e114664 100644
--- a/runtime/doc/windows.txt
+++ b/runtime/doc/windows.txt
@@ -283,7 +283,7 @@ CTRL-W CTRL-Q *CTRL-W_CTRL-Q*
:1quit " quit the first window
:$quit " quit the last window
:9quit " quit the last window
- " if there are less than windows opened
+ " if there are less than 9 windows opened
:-quit " quit the previous window
:+quit " quit the next window
:+2quit " will also work as expected
@@ -1027,8 +1027,11 @@ list of buffers. |unlisted-buffer|
Actually, the buffer isn't completely deleted, it is removed
from the buffer list |unlisted-buffer| and option values,
variables and mappings/abbreviations for the buffer are
- cleared.
-
+ cleared. Examples: >
+ :.,$-bdelete "delete buffers from the current one to
+ " last but one
+ :%bdelete " delete all buffers
+<
:bdelete[!] {bufname} *E93* *E94*
Like ":bdelete[!] [N]", but buffer given by name. Note that a
buffer whose name is a number cannot be referenced by that
@@ -1051,8 +1054,11 @@ list of buffers. |unlisted-buffer|
Like |:bdelete|, but really delete the buffer. Everything
related to the buffer is lost. All marks in this buffer
become invalid, option settings are lost, etc. Don't use this
- unless you know what you are doing.
-
+ unless you know what you are doing. Examples: >
+ :.+,$bwipeout " wipe out all buffers after the current
+ " one
+ :%bwipeout " wipe out all buffers
+<
:[N]bun[load][!] *:bun* *:bunload* *E515*
:bun[load][!] [N]
Unload buffer [N] (default: current buffer). The memory
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index 7f42fb5665..521aa99b58 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -1073,6 +1073,7 @@ void * getline_cookie(LineGetter fgetline,
static int compute_buffer_local_count(int addr_type, int lnum, int offset)
{
buf_T *buf;
+ buf_T *nextbuf;
int count = offset;
buf = firstbuf;
@@ -1080,15 +1081,29 @@ static int compute_buffer_local_count(int addr_type, int lnum, int offset)
buf = buf->b_next;
while (count != 0) {
count += (count < 0) ? 1 : -1;
- if (buf->b_prev == NULL)
+ nextbuf = (offset < 0) ? buf->b_prev : buf->b_next;
+ if (nextbuf == NULL)
break;
- buf = (count < 0) ? buf->b_prev : buf->b_next;
+ buf = nextbuf;
if (addr_type == ADDR_LOADED_BUFFERS)
/* skip over unloaded buffers */
- while (buf->b_prev != NULL && buf->b_ml.ml_mfp == NULL) {
- buf = (count < 0) ? buf->b_prev : buf->b_next;
+ while (buf->b_ml.ml_mfp == NULL) {
+ nextbuf = (offset < 0) ? buf->b_prev : buf->b_next;
+ if (nextbuf == NULL) {
+ break;
+ }
+ buf = nextbuf;
}
}
+ // we might have gone too far, last buffer is not loaded
+ if (addr_type == ADDR_LOADED_BUFFERS) {
+ while (buf->b_ml.ml_mfp == NULL) {
+ nextbuf = (offset >= 0) ? buf->b_prev : buf->b_next;
+ if (nextbuf == NULL)
+ break;
+ buf = nextbuf;
+ }
+ }
return buf->b_fnum;
}
@@ -1404,7 +1419,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
* is equal to the lower.
*/
- if (ea.cmdidx != CMD_SIZE) {
+ if (ea.cmdidx != CMD_USER && ea.cmdidx != CMD_SIZE) {
ea.addr_type = cmdnames[(int)ea.cmdidx].cmd_addr_type;
} else {
ea.addr_type = ADDR_LINES;
@@ -1441,15 +1456,25 @@ static char_u * do_one_cmd(char_u **cmdlinep,
goto doend;
if (lnum == MAXLNUM) {
if (*ea.cmd == '%') { /* '%' - all lines */
+ buf_T *buf;
++ea.cmd;
switch (ea.addr_type) {
case ADDR_LINES:
ea.line1 = 1;
ea.line2 = curbuf->b_ml.ml_line_count;
break;
- case ADDR_WINDOWS:
case ADDR_LOADED_BUFFERS:
+ buf = firstbuf;
+ while (buf->b_next != NULL && buf->b_ml.ml_mfp == NULL) {
+ buf = buf->b_prev;
+ }
+ ea.line2 = buf->b_fnum;
+ break;
case ADDR_UNLOADED_BUFFERS:
+ ea.line1 = firstbuf->b_fnum;
+ ea.line2 = lastbuf->b_fnum;
+ break;
+ case ADDR_WINDOWS:
case ADDR_TABS:
errormsg = (char_u *)_(e_invrange);
goto doend;
@@ -3431,7 +3456,8 @@ static linenr_T get_address(char_u **ptr,
n = getdigits(&cmd);
if (addr_type == ADDR_LOADED_BUFFERS ||
addr_type == ADDR_UNLOADED_BUFFERS)
- lnum = compute_buffer_local_count(addr_type, lnum, n);
+ lnum = compute_buffer_local_count(addr_type, lnum,
+ (i == '-') ? -1 * n : n);
else if (i == '-')
lnum -= n;
else
@@ -3451,18 +3477,16 @@ static linenr_T get_address(char_u **ptr,
lnum = 0;
break;
}
- c = LAST_TAB_NR;
- if (lnum >= c)
- lnum = c;
+ if (lnum >= LAST_TAB_NR)
+ lnum = LAST_TAB_NR;
break;
case ADDR_WINDOWS:
if (lnum < 0) {
lnum = 0;
break;
}
- c = LAST_WIN_NR;
- if (lnum > c)
- lnum = c;
+ if (lnum > LAST_WIN_NR)
+ lnum = LAST_WIN_NR;
break;
case ADDR_LOADED_BUFFERS:
case ADDR_UNLOADED_BUFFERS:
diff --git a/src/nvim/version.c b/src/nvim/version.c
index 8622f9fe8a..505894feb2 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -240,7 +240,7 @@ static int included_patches[] = {
//542,
541,
//540 NA
- //539,
+ 539,
538,
537,
536,