mirror of
https://github.com/neovim/neovim.git
synced 2025-10-04 00:46:30 +00:00
vim-patch:7.4.709
Problem: ":tabmove" does not work as documented.
Solution: Make it work consistently. Update documentation and add tests.
(Hirohito Higashi)
40ce3a4e1f
This commit is contained in:
@@ -6345,7 +6345,7 @@ static void ex_tabnext(exarg_T *eap)
|
||||
*/
|
||||
static void ex_tabmove(exarg_T *eap)
|
||||
{
|
||||
int tab_number = 9999;
|
||||
int tab_number;
|
||||
|
||||
if (eap->arg && *eap->arg != NUL) {
|
||||
char_u *p = eap->arg;
|
||||
@@ -6361,17 +6361,35 @@ static void ex_tabmove(exarg_T *eap)
|
||||
} else
|
||||
p = eap->arg;
|
||||
|
||||
if (p == skipdigits(p)) {
|
||||
/* No numbers as argument. */
|
||||
eap->errmsg = e_invarg;
|
||||
return;
|
||||
if (relative == 0) {
|
||||
if (STRCMP(p, "$") == 0) {
|
||||
tab_number = LAST_TAB_NR;
|
||||
} else if (p == skipdigits(p)) {
|
||||
// No numbers as argument.
|
||||
eap->errmsg = e_invarg;
|
||||
return;
|
||||
} else {
|
||||
tab_number = getdigits(&p);
|
||||
}
|
||||
} else {
|
||||
if (*p != NUL) {
|
||||
tab_number = getdigits(&p);
|
||||
} else {
|
||||
tab_number = 1;
|
||||
}
|
||||
tab_number = tab_number * relative + tabpage_index(curtab);
|
||||
if (relative == -1) {
|
||||
--tab_number;
|
||||
}
|
||||
}
|
||||
|
||||
tab_number = getdigits_int(&p);
|
||||
if (relative != 0)
|
||||
tab_number = tab_number * relative + tabpage_index(curtab) - 1; ;
|
||||
} else if (eap->addr_count != 0)
|
||||
} else if (eap->addr_count != 0) {
|
||||
tab_number = eap->line2;
|
||||
if (**eap->cmdlinep == '-') {
|
||||
--tab_number;
|
||||
}
|
||||
} else {
|
||||
tab_number = LAST_TAB_NR;
|
||||
}
|
||||
|
||||
tabpage_move(tab_number);
|
||||
}
|
||||
|
@@ -415,7 +415,7 @@ static int included_patches[] = {
|
||||
712,
|
||||
711,
|
||||
710,
|
||||
// 709,
|
||||
709,
|
||||
// 708,
|
||||
707,
|
||||
706,
|
||||
|
@@ -3274,17 +3274,27 @@ void goto_tabpage_win(tabpage_T *tp, win_T *wp)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Move the current tab page to before tab page "nr".
|
||||
*/
|
||||
// Move the current tab page to after tab page "nr".
|
||||
void tabpage_move(int nr)
|
||||
{
|
||||
int n = nr;
|
||||
tabpage_T *tp;
|
||||
int n = 1;
|
||||
tabpage_T *tp;
|
||||
tabpage_T *tp_dst;
|
||||
|
||||
if (first_tabpage->tp_next == NULL)
|
||||
return;
|
||||
|
||||
for (tp = first_tabpage; tp->tp_next != NULL && n < nr; tp = tp->tp_next) {
|
||||
++n;
|
||||
}
|
||||
|
||||
if (tp == curtab || (nr > 0 && tp->tp_next != NULL
|
||||
&& tp->tp_next == curtab)) {
|
||||
return;
|
||||
}
|
||||
|
||||
tp_dst = tp;
|
||||
|
||||
/* Remove the current tab page from the list of tab pages. */
|
||||
if (curtab == first_tabpage)
|
||||
first_tabpage = curtab->tp_next;
|
||||
@@ -3297,15 +3307,13 @@ void tabpage_move(int nr)
|
||||
tp->tp_next = curtab->tp_next;
|
||||
}
|
||||
|
||||
/* Re-insert it at the specified position. */
|
||||
if (n <= 0) {
|
||||
// Re-insert it at the specified position.
|
||||
if (nr <= 0) {
|
||||
curtab->tp_next = first_tabpage;
|
||||
first_tabpage = curtab;
|
||||
} else {
|
||||
for (tp = first_tabpage; tp->tp_next != NULL && n > 1; tp = tp->tp_next)
|
||||
--n;
|
||||
curtab->tp_next = tp->tp_next;
|
||||
tp->tp_next = curtab;
|
||||
curtab->tp_next = tp_dst->tp_next;
|
||||
tp_dst->tp_next = curtab;
|
||||
}
|
||||
|
||||
/* Need to redraw the tabline. Tab page contents doesn't change. */
|
||||
|
Reference in New Issue
Block a user