aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFelipe Morales <hel.sheep@gmail.com>2015-01-15 17:48:14 -0300
committerFelipe Morales <hel.sheep@gmail.com>2015-04-28 23:08:31 -0300
commitf6c55022ff9c5bc1c1be882498b1d4c44b032acb (patch)
tree6e2e1136f6ea3043aec89c9885408da75a52344e /src
parent86330fdd3f39a8975b25b7050a3d02b77a442057 (diff)
downloadrneovim-f6c55022ff9c5bc1c1be882498b1d4c44b032acb.tar.gz
rneovim-f6c55022ff9c5bc1c1be882498b1d4c44b032acb.tar.bz2
rneovim-f6c55022ff9c5bc1c1be882498b1d4c44b032acb.zip
vim-patch:7.4.535
Patch 7.4.535 (after 7.4.530) Problem: Can't build with tiny features. Solution: Add #ifdefs and skip a test. https://code.google.com/p/vim/source/detail?name=v7-4-535 This is also a refactor of some code in 7.4.530.
Diffstat (limited to 'src')
-rw-r--r--src/nvim/ex_docmd.c117
1 files changed, 51 insertions, 66 deletions
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index a1760f653c..7f42fb5665 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -1092,6 +1092,35 @@ static int compute_buffer_local_count(int addr_type, int lnum, int offset)
return buf->b_fnum;
}
+static int current_win_nr(win_T *win)
+{
+ int nr = 0;
+
+ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
+ ++nr;
+ if (wp == win)
+ break;
+ }
+ return nr;
+}
+
+static int current_tab_nr(tabpage_T *tab)
+{
+ int nr = 0;
+
+ FOR_ALL_TABS(tp) {
+ ++nr;
+ if (tp == tab)
+ break;
+ }
+ return nr;
+}
+
+#define CURRENT_WIN_NR current_win_nr(curwin)
+#define LAST_WIN_NR current_win_nr(NULL)
+#define CURRENT_TAB_NR current_tab_nr(curtab)
+#define LAST_TAB_NR current_tab_nr(NULL)
+
/*
* Execute one Ex command.
*
@@ -1128,8 +1157,6 @@ static char_u * do_one_cmd(char_u **cmdlinep,
int did_sandbox = FALSE;
cmdmod_T save_cmdmod;
int ni; /* set when Not Implemented */
- win_T *wp;
- tabpage_T *tp;
char_u *cmd;
memset(&ea, 0, sizeof(ea));
@@ -1393,12 +1420,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
ea.line2 = curwin->w_cursor.lnum;
break;
case ADDR_WINDOWS:
- lnum = 0;
- for (wp = firstwin; wp != NULL; wp = wp->w_next) {
- lnum++;
- if (wp == curwin)
- break;
- }
+ lnum = CURRENT_WIN_NR;
ea.line2 = lnum;
break;
case ADDR_ARGUMENTS:
@@ -1409,12 +1431,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
ea.line2 = curbuf->b_fnum;
break;
case ADDR_TABS:
- lnum = 0;
- for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) {
- lnum++;
- if (tp == curtab)
- break;
- }
+ lnum = CURRENT_TAB_NR;
ea.line2 = lnum;
break;
}
@@ -3206,8 +3223,6 @@ static linenr_T get_address(char_u **ptr,
pos_T pos;
pos_T *fp;
linenr_T lnum;
- win_T *wp;
- tabpage_T *tp;
buf_T *buf;
cmd = skipwhite(*ptr);
@@ -3221,12 +3236,7 @@ static linenr_T get_address(char_u **ptr,
lnum = curwin->w_cursor.lnum;
break;
case ADDR_WINDOWS:
- lnum = 0;
- for (wp = firstwin; wp != NULL; wp = wp->w_next) {
- lnum++;
- if (wp == curwin)
- break;
- }
+ lnum = CURRENT_WIN_NR;
break;
case ADDR_ARGUMENTS:
lnum = curwin->w_arg_idx + 1;
@@ -3234,11 +3244,9 @@ static linenr_T get_address(char_u **ptr,
case ADDR_LOADED_BUFFERS:
case ADDR_UNLOADED_BUFFERS:
lnum = curbuf->b_fnum;
- for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) {
- lnum++;
- if (tp == curtab)
- break;
- }
+ break;
+ case ADDR_TABS:
+ lnum = CURRENT_TAB_NR;
break;
}
break;
@@ -3250,10 +3258,7 @@ static linenr_T get_address(char_u **ptr,
lnum = curbuf->b_ml.ml_line_count;
break;
case ADDR_WINDOWS:
- lnum = 0;
- for (wp = firstwin; wp != NULL; wp = wp->w_next) {
- lnum++;
- }
+ lnum = LAST_WIN_NR;
break;
case ADDR_ARGUMENTS:
lnum = ARGCOUNT;
@@ -3272,10 +3277,7 @@ static linenr_T get_address(char_u **ptr,
lnum = lastbuf->b_fnum;
break;
case ADDR_TABS:
- lnum = 0;
- for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) {
- lnum++;
- }
+ lnum = LAST_TAB_NR;
break;
}
break;
@@ -3404,12 +3406,7 @@ static linenr_T get_address(char_u **ptr,
lnum = curwin->w_cursor.lnum; /* "+1" is same as ".+1" */
break;
case ADDR_WINDOWS:
- lnum = 0;
- for (wp = firstwin; wp != NULL; wp = wp->w_next) {
- lnum++;
- if (wp == curwin)
- break;
- }
+ lnum = CURRENT_WIN_NR;
break;
case ADDR_ARGUMENTS:
lnum = curwin->w_arg_idx + 1;
@@ -3419,12 +3416,7 @@ static linenr_T get_address(char_u **ptr,
lnum = curbuf->b_fnum;
break;
case ADDR_TABS:
- lnum = 0;
- for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) {
- lnum++;
- if (tp == curtab)
- break;
- }
+ lnum = CURRENT_TAB_NR;
break;
}
}
@@ -3459,9 +3451,7 @@ static linenr_T get_address(char_u **ptr,
lnum = 0;
break;
}
- c = 0;
- for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
- c++;
+ c = LAST_TAB_NR;
if (lnum >= c)
lnum = c;
break;
@@ -3470,9 +3460,7 @@ static linenr_T get_address(char_u **ptr,
lnum = 0;
break;
}
- c = 0;
- for (wp = firstwin; wp != NULL; wp = wp->w_next)
- c++;
+ c = LAST_WIN_NR;
if (lnum > c)
lnum = c;
break;
@@ -5328,7 +5316,7 @@ void not_exiting(void)
}
/*
- * ":quit": quit current window, quit Vim if closed the last window.
+ * ":quit": quit current window, quit Vim if the last window is closed.
*/
static void ex_quit(exarg_T *eap)
{
@@ -5343,27 +5331,23 @@ static void ex_quit(exarg_T *eap)
}
win_T *wp;
- buf_T *buf;
- int wnr;
if (eap->addr_count > 0) {
- wnr = eap->line2;
- for (wp = firstwin; --wnr > 0;) {
- if (wp->w_next == NULL)
+ int wnr = eap->line2;
+
+ for (wp = firstwin; wp->w_next != NULL; wp = wp->w_next) {
+ if (--wnr <= 0)
break;
- else
- wp = wp->w_next;
}
- buf = wp->w_buffer;
} else {
wp = curwin;
- buf = curbuf;
}
apply_autocmds(EVENT_QUITPRE, NULL, NULL, FALSE, curbuf);
/* Refuse to quit when locked or when the buffer in the last window is
* being closed (can only happen in autocommands). */
- if (curbuf_locked() || (buf->b_nwindows == 1 && curbuf->b_closing))
+ if (curbuf_locked() ||
+ (wp->w_buffer->b_nwindows == 1 && wp->w_buffer->b_closing))
return;
@@ -5641,8 +5625,6 @@ void ex_all(exarg_T *eap)
static void ex_hide(exarg_T *eap)
{
- win_T *win;
- int winnr = 0;
if (*eap->arg != NUL && check_nextcmd(eap->arg) == NULL)
eap->errmsg = e_invarg;
else {
@@ -5652,6 +5634,9 @@ static void ex_hide(exarg_T *eap)
if (eap->addr_count == 0)
win_close(curwin, FALSE); /* don't free buffer */
else {
+ int winnr = 0;
+ win_T *win;
+
for (win = firstwin; win != NULL; win = win->w_next) {
winnr++;
if (winnr == eap->line2)