docs: def grep_projects(tofind_list, user_profile=None, verbose=True, new=False,
                    **kwargs):
      r"""
      Greps the projects defined in the current UserProfile
  
      Args:
          tofind_list (list):
          user_profile (None): (default = None)
  
      Kwargs:
          user_profile
  
      CommandLine:
          python -m utool --tf grep_projects grep_projects
  
      Example:
          >>> # DISABLE_DOCTEST
          >>> from utool.util_project import *  # NOQA
          >>> import utool as ut
          >>> import sys
          >>> tofind_list = ut.get_argval('--find', type_=list,
          >>>                             default=[sys.argv[-1]])
          >>> grep_projects(tofind_list)
      """
      import utool as ut
      user_profile = ensure_user_profile(user_profile)
      print('user_profile = {!r}'.format(user_profile))
  
      kwargs = kwargs.copy()
      colored = kwargs.pop('colored', True)
  
      grepkw = {}
      grepkw['greater_exclude_dirs'] = user_profile.project_exclude_dirs
      grepkw['exclude_dirs'] = user_profile.project_exclude_dirs
      grepkw['dpath_list'] = user_profile.project_dpaths
      grepkw['include_patterns'] = user_profile.project_include_patterns
      grepkw['exclude_patterns'] = user_profile.project_exclude_patterns
      grepkw.update(kwargs)
  
      msg_list1 = []
      msg_list2 = []
  
      print_ = msg_list1.append
      print_('Greping Projects')
      print_('tofind_list = %s' % (ut.repr4(tofind_list, nl=True),))
      #print_('grepkw = %s' % ut.repr4(grepkw, nl=True))
      if verbose:
          print('\n'.join(msg_list1))
      #with ut.Timer('greping', verbose=True):
      grep_result = ut.grep(tofind_list, **grepkw)
      found_fpath_list, found_lines_list, found_lxs_list = grep_result
  
      # HACK, duplicate behavior. TODO: write grep print result function
      reflags = grepkw.get('reflags', 0)
      _exprs_flags = [ut.extend_regex2(expr, reflags)
                      for expr in tofind_list]
      extended_regex_list = ut.take_column(_exprs_flags, 0)
      reflags_list = ut.take_column(_exprs_flags, 1)
      # HACK
      # pat = ut.util_regex.regex_or(extended_regex_list)
      reflags = reflags_list[0]
  
      # from utool import util_regex
      resultstr = ut.make_grep_resultstr(grep_result, extended_regex_list,
                                         reflags, colored=colored)
      msg_list2.append(resultstr)
      print_ = msg_list2.append
      #for fpath, lines, lxs in zip(found_fpath_list, found_lines_list,
      #                             found_lxs_list):
      #    print_('----------------------')
      #    print_('found %d line(s) in %r: ' % (len(lines), fpath))
      #    name = split(fpath)[1]
      #    max_line = len(lines)
      #    ndigits = str(len(str(max_line)))
      #    for (lx, line) in zip(lxs, lines):
      #        line = line.replace('\n', '')
      #        print_(('%s : %' + ndigits + 'd |%s') % (name, lx, line))
      # iter_ = zip(found_fpath_list, found_lines_list, found_lxs_list)
      # for fpath, lines, lxs in iter_:
      #     print_('----------------------')
      #     print_('found %d line(s) in %r: ' % (len(lines), fpath))
      #     name = split(fpath)[1]
      #     max_line = len(lines)
      #     ndigits = str(len(str(max_line)))
      #     for (lx, line) in zip(lxs, lines):
      #         line = line.replace('\n', '')
      #         colored_line = ut.highlight_regex(
      #             line.rstrip('\n'), pat, reflags=reflags)
      #         print_(('%s : %' + ndigits + 'd |%s') % (name, lx, colored_line))
  
      print_('====================')
      print_('found_fpath_list = ' + ut.repr4(found_fpath_list))
      print_('')
      #print_('gvim -o ' + ' '.join(found_fpath_list))
      if verbose:
          print('\n'.join(msg_list2))
      msg_list = msg_list1 + msg_list2
  
      if new:
          return GrepResult(found_fpath_list, found_lines_list, found_lxs_list,
                            extended_regex_list, reflags)
      else:
          return msg_list