@@ -4643,16 +4643,29 @@ enum {
46434643 * Parse text from 'di' and return the quickfix list items
46444644 */
46454645 static int
4646- qf_get_list_from_lines (dictitem_T * di , dict_T * retdict )
4646+ qf_get_list_from_lines (dict_T * what , dictitem_T * di , dict_T * retdict )
46474647{
46484648 int status = FAIL ;
46494649 qf_info_T * qi ;
4650+ char_u * errorformat = p_efm ;
4651+ dictitem_T * efm_di ;
4652+ list_T * l ;
46504653
46514654 /* Only a List value is supported */
46524655 if (di -> di_tv .v_type == VAR_LIST && di -> di_tv .vval .v_list != NULL )
46534656 {
4654- list_T * l = list_alloc ();
4657+ /* If errorformat is supplied then use it, otherwise use the 'efm'
4658+ * option setting
4659+ */
4660+ if ((efm_di = dict_find (what , (char_u * )"efm" , -1 )) != NULL )
4661+ {
4662+ if (efm_di -> di_tv .v_type != VAR_STRING ||
4663+ efm_di -> di_tv .vval .v_string == NULL )
4664+ return FAIL ;
4665+ errorformat = efm_di -> di_tv .vval .v_string ;
4666+ }
46554667
4668+ l = list_alloc ();
46564669 if (l == NULL )
46574670 return FAIL ;
46584671
@@ -4662,7 +4675,7 @@ qf_get_list_from_lines(dictitem_T *di, dict_T *retdict)
46624675 vim_memset (qi , 0 , (size_t )(sizeof (qf_info_T )));
46634676 qi -> qf_refcount ++ ;
46644677
4665- if (qf_init_ext (qi , 0 , NULL , NULL , & di -> di_tv , p_efm ,
4678+ if (qf_init_ext (qi , 0 , NULL , NULL , & di -> di_tv , errorformat ,
46664679 TRUE, (linenr_T )0 , (linenr_T )0 , NULL , NULL ) > 0 )
46674680 {
46684681 (void )get_errorlist (qi , NULL , 0 , l );
@@ -4692,7 +4705,7 @@ get_errorlist_properties(win_T *wp, dict_T *what, dict_T *retdict)
46924705 int flags = QF_GETLIST_NONE ;
46934706
46944707 if ((di = dict_find (what , (char_u * )"lines" , -1 )) != NULL )
4695- return qf_get_list_from_lines (di , retdict );
4708+ return qf_get_list_from_lines (what , di , retdict );
46964709
46974710 if (wp != NULL )
46984711 qi = GET_LOC_LIST (wp );
@@ -4962,6 +4975,7 @@ qf_set_properties(qf_info_T *qi, dict_T *what, int action, char_u *title)
49624975 int retval = FAIL ;
49634976 int qf_idx ;
49644977 int newlist = FALSE;
4978+ char_u * errorformat = p_efm ;
49654979
49664980 if (action == ' ' || qi -> qf_curlist == qi -> qf_listcount )
49674981 newlist = TRUE;
@@ -5039,6 +5053,7 @@ qf_set_properties(qf_info_T *qi, dict_T *what, int action, char_u *title)
50395053 retval = OK ;
50405054 }
50415055 }
5056+
50425057 if ((di = dict_find (what , (char_u * )"items" , -1 )) != NULL )
50435058 {
50445059 if (di -> di_tv .v_type == VAR_LIST )
@@ -5051,14 +5066,21 @@ qf_set_properties(qf_info_T *qi, dict_T *what, int action, char_u *title)
50515066 }
50525067 }
50535068
5069+ if ((di = dict_find (what , (char_u * )"efm" , -1 )) != NULL )
5070+ {
5071+ if (di -> di_tv .v_type != VAR_STRING || di -> di_tv .vval .v_string == NULL )
5072+ return FAIL ;
5073+ errorformat = di -> di_tv .vval .v_string ;
5074+ }
5075+
50545076 if ((di = dict_find (what , (char_u * )"lines" , -1 )) != NULL )
50555077 {
50565078 /* Only a List value is supported */
50575079 if (di -> di_tv .v_type == VAR_LIST && di -> di_tv .vval .v_list != NULL )
50585080 {
50595081 if (action == 'r' )
50605082 qf_free_items (qi , qf_idx );
5061- if (qf_init_ext (qi , qf_idx , NULL , NULL , & di -> di_tv , p_efm ,
5083+ if (qf_init_ext (qi , qf_idx , NULL , NULL , & di -> di_tv , errorformat ,
50625084 FALSE, (linenr_T )0 , (linenr_T )0 , NULL , NULL ) > 0 )
50635085 retval = OK ;
50645086 }
0 commit comments