Skip to content

Commit

Permalink
patch 8.1.0213: CTRL-W CR does not work properly in a quickfix window
Browse files Browse the repository at this point in the history
Problem:    CTRL-W CR does not work properly in a quickfix window.
Solution:   Split the window if needed. (Jason Franklin)
  • Loading branch information
brammool committed Jul 25, 2018
1 parent 5390144 commit 0a08c63
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 23 deletions.
14 changes: 4 additions & 10 deletions src/normal.c
Expand Up @@ -6202,18 +6202,12 @@ nv_down(cmdarg_T *cap)
cap->arg = FORWARD;
nv_page(cap);
}
else
#if defined(FEAT_QUICKFIX)
/* In a quickfix window a <CR> jumps to the error under the cursor. */
if (bt_quickfix(curbuf) && cap->cmdchar == CAR)
{
if (curwin->w_llist_ref == NULL)
do_cmdline_cmd((char_u *)".cc"); /* quickfix window */
else
do_cmdline_cmd((char_u *)".ll"); /* location list window */
}
else
/* Quickfix window only: view the result under the cursor. */
else if (bt_quickfix(curbuf) && cap->cmdchar == CAR)
qf_view_result(FALSE);
#endif
else
{
#ifdef FEAT_CMDWIN
/* In the cmdline window a <CR> executes the command. */
Expand Down
1 change: 1 addition & 0 deletions src/proto/quickfix.pro
Expand Up @@ -7,6 +7,7 @@ void qf_list(exarg_T *eap);
void qf_age(exarg_T *eap);
void qf_history(exarg_T *eap);
void qf_mark_adjust(win_T *wp, linenr_T line1, linenr_T line2, long amount, long amount_after);
void qf_view_result(int split);
void ex_cwindow(exarg_T *eap);
void ex_cclose(exarg_T *eap);
void ex_copen(exarg_T *eap);
Expand Down
36 changes: 36 additions & 0 deletions src/quickfix.c
Expand Up @@ -3489,6 +3489,42 @@ qf_types(int c, int nr)
return buf;
}

/*
* When "split" is FALSE: Open the entry/result under the cursor.
* When "split" is TRUE: Open the entry/result under the cursor in a new window.
*/
void
qf_view_result(int split)
{
qf_info_T *qi = &ql_info;

if (!bt_quickfix(curbuf))
return;

if (IS_LL_WINDOW(curwin))
qi = GET_LOC_LIST(curwin);

if (qi == NULL || qi->qf_lists[qi->qf_curlist].qf_count == 0)
{
EMSG(_(e_quickfix));
return;
}

if (split)
{
char_u cmd[32];

vim_snprintf((char *)cmd, sizeof(cmd), "split +%ld%s",
(long)curwin->w_cursor.lnum,
IS_LL_WINDOW(curwin) ? "ll" : "cc");
if (do_cmdline_cmd(cmd) == OK)
do_cmdline_cmd((char_u *) "clearjumps");
return;
}

do_cmdline_cmd((char_u *)(IS_LL_WINDOW(curwin) ? ".ll" : ".cc"));
}

/*
* ":cwindow": open the quickfix window if we have errors to display,
* close it if not.
Expand Down
18 changes: 18 additions & 0 deletions src/testdir/test_quickfix.vim
Expand Up @@ -3504,3 +3504,21 @@ func Test_filter_clist()
call assert_equal([' 1 abc:pat1: '],
\ split(execute('filter /pat1/ clist'), "\n"))
endfunc

" Tests for the "CTRL-W <CR>" command.
func Xview_result_split_tests(cchar)
call s:setup_commands(a:cchar)

" Test that "CTRL-W <CR>" in a qf/ll window fails with empty list.
call g:Xsetlist([])
Xopen
let l:win_count = winnr('$')
call assert_fails('execute "normal! \<C-W>\<CR>"', 'E42')
call assert_equal(l:win_count, winnr('$'))
Xclose
endfunc

func Test_view_result_split()
call Xview_result_split_tests('c')
call Xview_result_split_tests('l')
endfunc
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -793,6 +793,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
213,
/**/
212,
/**/
Expand Down
17 changes: 4 additions & 13 deletions src/window.c
Expand Up @@ -520,23 +520,14 @@ do_window(
break;
#endif

/* Quickfix window only: view the result under the cursor in a new split. */
#if defined(FEAT_QUICKFIX)
case K_KENTER:
case CAR:
#if defined(FEAT_QUICKFIX)
/*
* In a quickfix window a <CR> jumps to the error under the
* cursor in a new window.
*/
if (bt_quickfix(curbuf))
{
sprintf((char *)cbuf, "split +%ld%s",
(long)curwin->w_cursor.lnum,
(curwin->w_llist_ref == NULL) ? "cc" : "ll");
do_cmdline_cmd(cbuf);
}
#endif
qf_view_result(TRUE);
break;

#endif

/* CTRL-W g extended commands */
case 'g':
Expand Down

0 comments on commit 0a08c63

Please sign in to comment.