diff options
author | Felipe Morales <hel.sheep@gmail.com> | 2015-01-15 17:48:14 -0300 |
---|---|---|
committer | Felipe Morales <hel.sheep@gmail.com> | 2015-04-28 23:08:31 -0300 |
commit | f6c55022ff9c5bc1c1be882498b1d4c44b032acb (patch) | |
tree | 6e2e1136f6ea3043aec89c9885408da75a52344e /src | |
parent | 86330fdd3f39a8975b25b7050a3d02b77a442057 (diff) | |
download | rneovim-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.c | 117 |
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) |