diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 51aa06888..5fa650f03 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -12478,6 +12478,19 @@ ex_folddo(exarg_T *eap)
 }
 #endif
 
+#ifdef FEAT_QUICKFIX
+/*
+ * Returns TRUE if the supplied Ex cmdidx is for a location list command.
+ */
+    int
+is_loclist_cmd(int cmdidx)
+{
+    if (cmdidx < 0 || cmdidx > CMD_SIZE)
+	return FALSE;
+    return cmdnames[(int)cmdidx].cmd_name[0] == 'l';
+}
+#endif
+
 # if defined(FEAT_TIMERS) || defined(PROTO)
     int
 get_pressedreturn(void)
diff --git a/src/proto/ex_docmd.pro b/src/proto/ex_docmd.pro
index 00800e1ef..50235a637 100644
--- a/src/proto/ex_docmd.pro
+++ b/src/proto/ex_docmd.pro
@@ -69,6 +69,7 @@ char_u *get_behave_arg(expand_T *xp, int idx);
 char_u *get_messages_arg(expand_T *xp, int idx);
 char_u *get_mapclear_arg(expand_T *xp, int idx);
 void set_no_hlsearch(int flag);
+int is_loclist_cmd(int cmdidx);
 int get_pressedreturn(void);
 void set_pressedreturn(int val);
 /* vim: set ft=c : */
diff --git a/src/quickfix.c b/src/quickfix.c
index ac40b24dd..d462b4dac 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -159,6 +159,11 @@ static qf_info_T *ll_get_or_alloc_list(win_T *);
 #define IS_QF_WINDOW(wp) (bt_quickfix(wp->w_buffer) && wp->w_llist_ref == NULL)
 /* Location list window check helper macro */
 #define IS_LL_WINDOW(wp) (bt_quickfix(wp->w_buffer) && wp->w_llist_ref != NULL)
+
+// Quickfix and location list stack check helper macros
+#define IS_QF_STACK(qi)		(qi == &ql_info)
+#define IS_LL_STACK(qi)		(qi != &ql_info)
+
 /*
  * Return location list for window 'wp'
  * For location list window, return the referenced location list
@@ -1940,7 +1945,7 @@ qf_add_entry(
 	qfp->qf_fnum = bufnum;
 	if (buf != NULL)
 	    buf->b_has_qf_entry |=
-		(qi == &ql_info) ? BUF_HAS_QF_ENTRY : BUF_HAS_LL_ENTRY;
+		IS_QF_STACK(qi) ? BUF_HAS_QF_ENTRY : BUF_HAS_LL_ENTRY;
     }
     else
 	qfp->qf_fnum = qf_get_fnum(qi, qf_idx, dir, fname);
@@ -2224,7 +2229,7 @@ qf_get_fnum(qf_info_T *qi, int qf_idx, char_u *directory, char_u *fname)
 	return 0;
 
     buf->b_has_qf_entry =
-			(qi == &ql_info) ? BUF_HAS_QF_ENTRY : BUF_HAS_LL_ENTRY;
+			IS_QF_STACK(qi) ? BUF_HAS_QF_ENTRY : BUF_HAS_LL_ENTRY;
     return buf->b_fnum;
 }
 
@@ -2631,7 +2636,7 @@ jump_to_help_window(qf_info_T *qi, int *opened_window)
 	if (cmdmod.split == 0 && curwin->w_width != Columns
 		&& curwin->w_width < 80)
 	    flags |= WSP_TOP;
-	if (qi != &ql_info)
+	if (IS_LL_STACK(qi))
 	    flags |= WSP_NEWLOC;  /* don't copy the location list */
 
 	if (win_split(0, flags) == FAIL)
@@ -2642,7 +2647,7 @@ jump_to_help_window(qf_info_T *qi, int *opened_window)
 	if (curwin->w_height < p_hh)
 	    win_setheight((int)p_hh);
 
-	if (qi != &ql_info)	    /* not a quickfix list */
+	if (IS_LL_STACK(qi))		// not a quickfix list
 	{
 	    /* The new window should use the supplied location list */
 	    curwin->w_llist = qi;
@@ -2918,7 +2923,7 @@ qf_jump_edit_buffer(
 	retval = buflist_getfile(qf_ptr->qf_fnum,
 		(linenr_T)1, GETF_SETMARK | GETF_SWITCH, forceit);
 
-	if (qi != &ql_info)
+	if (IS_LL_STACK(qi))
 	{
 	    /*
 	     * Location list. Check whether the associated window is still
@@ -2939,7 +2944,7 @@ qf_jump_edit_buffer(
 	else if (old_qf_curlist != qi->qf_curlist
 		|| !is_qf_entry_present(qi, qf_ptr))
 	{
-	    if (qi == &ql_info)
+	    if (IS_QF_STACK(qi))
 		EMSG(_("E925: Current quickfix was changed"));
 	    else
 		EMSG(_(e_loc_list_changed));
@@ -3330,7 +3335,7 @@ qf_list(exarg_T *eap)
 						   recognised errors */
     qf_info_T	*qi = &ql_info;
 
-    if (eap->cmdidx == CMD_llist)
+    if (is_loclist_cmd(eap->cmdidx))
     {
 	qi = GET_LOC_LIST(curwin);
 	if (qi == NULL)
@@ -3478,7 +3483,7 @@ qf_age(exarg_T *eap)
     qf_info_T	*qi = &ql_info;
     int		count;
 
-    if (eap->cmdidx == CMD_lolder || eap->cmdidx == CMD_lnewer)
+    if (is_loclist_cmd(eap->cmdidx))
     {
 	qi = GET_LOC_LIST(curwin);
 	if (qi == NULL)
@@ -3526,7 +3531,7 @@ qf_history(exarg_T *eap)
     qf_info_T	*qi = &ql_info;
     int		i;
 
-    if (eap->cmdidx == CMD_lhistory)
+    if (is_loclist_cmd(eap->cmdidx))
 	qi = GET_LOC_LIST(curwin);
     if (qi == NULL || (qi->qf_listcount == 0
 				&& qf_list_empty(qi, qi->qf_curlist)))
@@ -3745,7 +3750,7 @@ ex_cwindow(exarg_T *eap)
     qf_info_T	*qi = &ql_info;
     win_T	*win;
 
-    if (eap->cmdidx == CMD_lwindow)
+    if (is_loclist_cmd(eap->cmdidx))
     {
 	qi = GET_LOC_LIST(curwin);
 	if (qi == NULL)
@@ -3781,7 +3786,7 @@ ex_cclose(exarg_T *eap)
     win_T	*win = NULL;
     qf_info_T	*qi = &ql_info;
 
-    if (eap->cmdidx == CMD_lclose || eap->cmdidx == CMD_lwindow)
+    if (is_loclist_cmd(eap->cmdidx))
     {
 	qi = GET_LOC_LIST(curwin);
 	if (qi == NULL)
@@ -3808,7 +3813,7 @@ ex_copen(exarg_T *eap)
     buf_T	*qf_buf;
     win_T	*oldwin = curwin;
 
-    if (eap->cmdidx == CMD_lopen || eap->cmdidx == CMD_lwindow)
+    if (is_loclist_cmd(eap->cmdidx))
     {
 	qi = GET_LOC_LIST(curwin);
 	if (qi == NULL)
@@ -3953,12 +3958,12 @@ qf_win_goto(win_T *win, linenr_T lnum)
  * :cbottom/:lbottom commands.
  */
     void
-ex_cbottom(exarg_T *eap UNUSED)
+ex_cbottom(exarg_T *eap)
 {
     qf_info_T	*qi = &ql_info;
     win_T	*win;
 
-    if (eap->cmdidx == CMD_lbottom)
+    if (is_loclist_cmd(eap->cmdidx))
     {
 	qi = GET_LOC_LIST(curwin);
 	if (qi == NULL)
@@ -4039,8 +4044,8 @@ is_qf_win(win_T *win, qf_info_T *qi)
      * pointing to the location list.
      */
     if (bt_quickfix(win->w_buffer))
-	if ((qi == &ql_info && win->w_llist_ref == NULL)
-		|| (qi != &ql_info && win->w_llist_ref == qi))
+	if ((IS_QF_STACK(qi) && win->w_llist_ref == NULL)
+		|| (IS_LL_STACK(qi) && win->w_llist_ref == qi))
 	    return TRUE;
 
     return FALSE;
@@ -4430,8 +4435,7 @@ ex_make(exarg_T *eap)
     enc = (*curbuf->b_p_menc != NUL) ? curbuf->b_p_menc : p_menc;
 #endif
 
-    if (eap->cmdidx == CMD_lmake || eap->cmdidx == CMD_lgrep
-	|| eap->cmdidx == CMD_lgrepadd)
+    if (is_loclist_cmd(eap->cmdidx))
 	wp = curwin;
 
     autowrite_all();
@@ -4570,7 +4574,7 @@ qf_get_size(exarg_T *eap)
     int		i, sz = 0;
     int		prev_fnum = 0;
 
-    if (eap->cmdidx == CMD_ldo || eap->cmdidx == CMD_lfdo)
+    if (is_loclist_cmd(eap->cmdidx))
     {
 	/* Location list */
 	qi = GET_LOC_LIST(curwin);
@@ -4607,7 +4611,7 @@ qf_get_cur_idx(exarg_T *eap)
 {
     qf_info_T	*qi = &ql_info;
 
-    if (eap->cmdidx == CMD_ldo || eap->cmdidx == CMD_lfdo)
+    if (is_loclist_cmd(eap->cmdidx))
     {
 	/* Location list */
 	qi = GET_LOC_LIST(curwin);
@@ -4631,7 +4635,7 @@ qf_get_cur_valid_idx(exarg_T *eap)
     int		i, eidx = 0;
     int		prev_fnum = 0;
 
-    if (eap->cmdidx == CMD_ldo || eap->cmdidx == CMD_lfdo)
+    if (is_loclist_cmd(eap->cmdidx))
     {
 	/* Location list */
 	qi = GET_LOC_LIST(curwin);
@@ -4724,12 +4728,7 @@ ex_cc(exarg_T *eap)
     qf_info_T	*qi = &ql_info;
     int		errornr;
 
-    if (eap->cmdidx == CMD_ll
-	    || eap->cmdidx == CMD_lrewind
-	    || eap->cmdidx == CMD_lfirst
-	    || eap->cmdidx == CMD_llast
-	    || eap->cmdidx == CMD_ldo
-	    || eap->cmdidx == CMD_lfdo)
+    if (is_loclist_cmd(eap->cmdidx))
     {
 	qi = GET_LOC_LIST(curwin);
 	if (qi == NULL)
@@ -4743,13 +4742,18 @@ ex_cc(exarg_T *eap)
 	errornr = (int)eap->line2;
     else
     {
-	if (eap->cmdidx == CMD_cc || eap->cmdidx == CMD_ll)
-	    errornr = 0;
-	else if (eap->cmdidx == CMD_crewind || eap->cmdidx == CMD_lrewind
-		|| eap->cmdidx == CMD_cfirst || eap->cmdidx == CMD_lfirst)
-	    errornr = 1;
-	else
-	    errornr = 32767;
+	switch (eap->cmdidx)
+	{
+	    case CMD_cc: case CMD_ll:
+		errornr = 0;
+		break;
+	    case CMD_crewind: case CMD_lrewind: case CMD_cfirst:
+	    case CMD_lfirst:
+		errornr = 1;
+		break;
+	    default:
+		errornr = 32767;
+	}
     }
 
     /* For cdo and ldo commands, jump to the nth valid error.
@@ -4774,15 +4778,9 @@ ex_cnext(exarg_T *eap)
 {
     qf_info_T	*qi = &ql_info;
     int		errornr;
+    int		dir;
 
-    if (eap->cmdidx == CMD_lnext
-	    || eap->cmdidx == CMD_lNext
-	    || eap->cmdidx == CMD_lprevious
-	    || eap->cmdidx == CMD_lnfile
-	    || eap->cmdidx == CMD_lNfile
-	    || eap->cmdidx == CMD_lpfile
-	    || eap->cmdidx == CMD_ldo
-	    || eap->cmdidx == CMD_lfdo)
+    if (is_loclist_cmd(eap->cmdidx))
     {
 	qi = GET_LOC_LIST(curwin);
 	if (qi == NULL)
@@ -4799,17 +4797,28 @@ ex_cnext(exarg_T *eap)
     else
 	errornr = 1;
 
-    qf_jump(qi, (eap->cmdidx == CMD_cnext || eap->cmdidx == CMD_lnext
-		|| eap->cmdidx == CMD_cdo || eap->cmdidx == CMD_ldo)
-	    ? FORWARD
-	    : (eap->cmdidx == CMD_cnfile || eap->cmdidx == CMD_lnfile
-		|| eap->cmdidx == CMD_cfdo || eap->cmdidx == CMD_lfdo)
-		? FORWARD_FILE
-		: (eap->cmdidx == CMD_cpfile || eap->cmdidx == CMD_lpfile
-		   || eap->cmdidx == CMD_cNfile || eap->cmdidx == CMD_lNfile)
-		    ? BACKWARD_FILE
-		    : BACKWARD,
-	    errornr, eap->forceit);
+    // Depending on the command jump to either next or previous entry/file.
+    switch (eap->cmdidx)
+    {
+	case CMD_cnext: case CMD_lnext: case CMD_cdo: case CMD_ldo:
+	    dir = FORWARD;
+	    break;
+	case CMD_cprevious: case CMD_lprevious: case CMD_cNext:
+	case CMD_lNext:
+	    dir = BACKWARD;
+	    break;
+	case CMD_cnfile: case CMD_lnfile: case CMD_cfdo: case CMD_lfdo:
+	    dir = FORWARD_FILE;
+	    break;
+	case CMD_cpfile: case CMD_lpfile: case CMD_cNfile: case CMD_lNfile:
+	    dir = BACKWARD_FILE;
+	    break;
+	default:
+	    dir = FORWARD;
+	    break;
+    }
+
+    qf_jump(qi, dir, errornr, eap->forceit);
 }
 
 /*
@@ -4857,9 +4866,7 @@ ex_cfile(exarg_T *eap)
     if (*eap->arg != NUL)
 	set_string_option_direct((char_u *)"ef", -1, eap->arg, OPT_FREE, 0);
 
-    if (eap->cmdidx == CMD_lfile
-	    || eap->cmdidx == CMD_lgetfile
-	    || eap->cmdidx == CMD_laddfile)
+    if (is_loclist_cmd(eap->cmdidx))
 	wp = curwin;
 
     /*
@@ -5178,10 +5185,7 @@ ex_vimgrep(exarg_T *eap)
 #endif
     }
 
-    if (eap->cmdidx == CMD_lgrep
-	    || eap->cmdidx == CMD_lvimgrep
-	    || eap->cmdidx == CMD_lgrepadd
-	    || eap->cmdidx == CMD_lvimgrepadd)
+    if (is_loclist_cmd(eap->cmdidx))
     {
 	qi = ll_get_or_alloc_list(curwin);
 	if (qi == NULL)
@@ -6525,9 +6529,7 @@ ex_cbuffer(exarg_T *eap)
     }
 
     /* Must come after autocommands. */
-    if (eap->cmdidx == CMD_lbuffer
-	    || eap->cmdidx == CMD_lgetbuffer
-	    || eap->cmdidx == CMD_laddbuffer)
+    if (is_loclist_cmd(eap->cmdidx))
     {
 	qi = ll_get_or_alloc_list(curwin);
 	if (qi == NULL)
@@ -6631,9 +6633,7 @@ ex_cexpr(exarg_T *eap)
 #endif
     }
 
-    if (eap->cmdidx == CMD_lexpr
-	    || eap->cmdidx == CMD_lgetexpr
-	    || eap->cmdidx == CMD_laddexpr)
+    if (is_loclist_cmd(eap->cmdidx))
     {
 	qi = ll_get_or_alloc_list(curwin);
 	if (qi == NULL)
@@ -6922,7 +6922,7 @@ ex_helpgrep(exarg_T *eap)
     save_cpo = p_cpo;
     p_cpo = empty_option;
 
-    if (eap->cmdidx == CMD_lhelpgrep)
+    if (is_loclist_cmd(eap->cmdidx))
     {
 	qi = hgr_get_ll(&new_qi);
 	if (qi == NULL)
@@ -6959,7 +6959,7 @@ ex_helpgrep(exarg_T *eap)
     {
 	apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
 					       curbuf->b_fname, TRUE, curbuf);
-	if (!new_qi && qi != &ql_info && qf_find_buf(qi) == NULL)
+	if (!new_qi && IS_LL_STACK(qi) && qf_find_buf(qi) == NULL)
 	    /* autocommands made "qi" invalid */
 	    return;
     }
