patch 9.1.0810: cannot easily adjust the |:find| command

Problem:  cannot easily adjust the |:find| command
Solution: Add support for the 'findexpr' option (Yegappan Lakshmanan)

closes: #15901
closes: #15905

Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/option.c b/src/option.c
index 84c469e..e82a79b 100644
--- a/src/option.c
+++ b/src/option.c
@@ -6313,6 +6313,11 @@
 	case PV_FP:
 	    clear_string_option(&buf->b_p_fp);
 	    break;
+# ifdef FEAT_EVAL
+	case PV_FEXPR:
+	    clear_string_option(&buf->b_p_fexpr);
+	    break;
+# endif
 # ifdef FEAT_QUICKFIX
 	case PV_EFM:
 	    clear_string_option(&buf->b_p_efm);
@@ -6391,6 +6396,9 @@
 	switch ((int)p->indir)
 	{
 	    case PV_FP:   return (char_u *)&(curbuf->b_p_fp);
+#ifdef FEAT_EVAL
+	    case PV_FEXPR:   return (char_u *)&(curbuf->b_p_fexpr);
+#endif
 #ifdef FEAT_QUICKFIX
 	    case PV_EFM:  return (char_u *)&(curbuf->b_p_efm);
 	    case PV_GP:   return (char_u *)&(curbuf->b_p_gp);
@@ -6501,6 +6509,10 @@
 #endif
 	case PV_FP:	return *curbuf->b_p_fp != NUL
 				    ? (char_u *)&(curbuf->b_p_fp) : p->var;
+#ifdef FEAT_EVAL
+	case PV_FEXPR:	return *curbuf->b_p_fexpr != NUL
+				    ? (char_u *)&curbuf->b_p_fexpr : p->var;
+#endif
 #ifdef FEAT_QUICKFIX
 	case PV_EFM:	return *curbuf->b_p_efm != NUL
 				    ? (char_u *)&(curbuf->b_p_efm) : p->var;
@@ -6748,6 +6760,21 @@
 }
 
 /*
+ * Get the value of 'findexpr', either the buffer-local one or the global one.
+ */
+    char_u *
+get_findexpr(void)
+{
+#ifdef FEAT_EVAL
+    if (*curbuf->b_p_fexpr == NUL)
+	return p_fexpr;
+    return curbuf->b_p_fexpr;
+#else
+    return (char_u *)"";
+#endif
+}
+
+/*
  * Copy options from one window to another.
  * Used when splitting a window.
  */
@@ -7275,6 +7302,10 @@
 	    buf->b_p_efm = empty_option;
 #endif
 	    buf->b_p_ep = empty_option;
+#if defined(FEAT_EVAL)
+	    buf->b_p_fexpr = vim_strsave(p_fexpr);
+	    COPY_OPT_SCTX(buf, BV_FEXPR);
+#endif
 	    buf->b_p_kp = empty_option;
 	    buf->b_p_path = empty_option;
 	    buf->b_p_tags = empty_option;