commit 7f90e3b7d2375e424ea7d3cb29bad4018cc60bee
Author: Juergen Spitzmueller <[email protected]>
Date:   Fri Feb 12 14:30:50 2021 +0100

    Introduce search-string-set (#8055)
    
    This stores its argument, the currently selected text or the word under
    cursor in the search cache that is used by word-find[-backward|-forward]
    if no argument is given to those.
    
    Prerequisite for a feature apparently expected on the Mac.
---
 lib/RELEASE-NOTES  |    4 ++++
 src/BufferView.cpp |   41 +++++++++++++++++++++++++++++------------
 src/FuncCode.h     |    1 +
 src/LyXAction.cpp  |   11 +++++++++++
 4 files changed, 45 insertions(+), 12 deletions(-)

diff --git a/lib/RELEASE-NOTES b/lib/RELEASE-NOTES
index 1f8069b..4e92ccf 100644
--- a/lib/RELEASE-NOTES
+++ b/lib/RELEASE-NOTES
@@ -97,6 +97,10 @@
 * paragraph-select is a new convenience function to select the paragraph
   surrounding the actual cursor position.
 
+* search-string-set [arg] stores the <arg>, the currently selected text or the 
word under
+  cursor in the search cache that is used by word-find[-backward|-forward] if 
no argument
+  is given to those. 
+
 * inset-split is a new convenience function that splits an inset into two at 
the given
   cursor position. This is only implemented for text insets currently.
 
diff --git a/src/BufferView.cpp b/src/BufferView.cpp
index 88400d7..3764253 100644
--- a/src/BufferView.cpp
+++ b/src/BufferView.cpp
@@ -275,7 +275,7 @@ struct BufferView::Private
        frontend::GuiBufferViewDelegate * gui_;
 
        /// Cache for Find Next
-       FuncRequest search_request_cache_;
+       docstring search_request_cache_;
 
        ///
        map<string, Inset *> edited_insets_;
@@ -1155,6 +1155,7 @@ bool BufferView::getStatus(FuncRequest const & cmd, 
FuncStatus & flag)
        case LFUN_MARK_OFF:
        case LFUN_MARK_ON:
        case LFUN_MARK_TOGGLE:
+       case LFUN_SEARCH_STRING_SET:
        case LFUN_SCREEN_RECENTER:
        case LFUN_SCREEN_SHOW_CURSOR:
        case LFUN_BIBTEX_DATABASE_ADD:
@@ -1609,16 +1610,13 @@ void BufferView::dispatch(FuncRequest const & cmd, 
DispatchResult & dr)
 
        case LFUN_WORD_FIND_FORWARD:
        case LFUN_WORD_FIND_BACKWARD: {
-               // FIXME THREAD
-               // Would it maybe be better if this variable were view specific 
anyway?
-               static docstring last_search;
                docstring searched_string;
 
                if (!cmd.argument().empty()) {
-                       last_search = cmd.argument();
+                       d->search_request_cache_ = cmd.argument();
                        searched_string = cmd.argument();
                } else {
-                       searched_string = last_search;
+                       searched_string = d->search_request_cache_;
                }
 
                if (searched_string.empty())
@@ -1636,19 +1634,38 @@ void BufferView::dispatch(FuncRequest const & cmd, 
DispatchResult & dr)
        }
 
        case LFUN_WORD_FIND: {
-               FuncRequest req = cmd;
-               if (cmd.argument().empty() && 
!d->search_request_cache_.argument().empty())
-                       req = d->search_request_cache_;
-               if (req.argument().empty()) {
+               docstring arg = cmd.argument();
+               if (arg.empty() && !d->search_request_cache_.empty())
+                       arg = d->search_request_cache_;
+               if (arg.empty()) {
                        lyx::dispatch(FuncRequest(LFUN_DIALOG_SHOW, 
"findreplace"));
                        break;
                }
-               if (lyxfind(this, req))
+               if (lyxfind(this, FuncRequest(act, arg)))
                        dr.screenUpdate(Update::Force | Update::FitCursor);
                else
                        dr.setMessage(_("Search string not found!"));
 
-               d->search_request_cache_ = req;
+               d->search_request_cache_ = arg;
+               break;
+       }
+
+       case LFUN_SEARCH_STRING_SET: {
+               docstring pattern = cmd.argument();
+               if (!pattern.empty()) {
+                       d->search_request_cache_ = pattern;
+                       break;
+               }
+               if (cur.selection())
+                       pattern = cur.selectionAsString(false);
+               else {
+                       pos_type spos = cur.pos();
+                       cur.innerText()->selectWord(cur, WHOLE_WORD);
+                       pattern = cur.selectionAsString(false);
+                       cur.selection(false);
+                       cur.pos() = spos;
+               }
+               d->search_request_cache_ = pattern;
                break;
        }
 
diff --git a/src/FuncCode.h b/src/FuncCode.h
index a720c64..f473cda 100644
--- a/src/FuncCode.h
+++ b/src/FuncCode.h
@@ -495,6 +495,7 @@ enum FuncCode
        // 385
        LFUN_INSET_SPLIT,               // jspitzm 20201222
        LFUN_LYXFILES_OPEN,             // jspitzm 20210210
+       LFUN_SEARCH_STRING_SET,         // stwitt/jspitzm 20210212
        LFUN_LASTACTION                 // end of the table
 };
 
diff --git a/src/LyXAction.cpp b/src/LyXAction.cpp
index 38fa2c3..0d43ea5 100644
--- a/src/LyXAction.cpp
+++ b/src/LyXAction.cpp
@@ -4346,6 +4346,17 @@ void LyXAction::init()
  */
                { LFUN_WORD_FIND, "word-find", ReadOnly, Edit },
 
+/*! 
+ * \var lyx::FuncCode lyx::LFUN_SEARCH_STRING_SET
+ * \li Action: Set search string buffer.
+ * \li Syntax: search-string-set [<DATA>] 
+ * \li Params: <DATA>: string to search for. If no parameter is given,
+ *                     use (word under) selection.
+ * \li Origin: stwitt, spitz, Feb 12 2021 
+ * \endvar 
+ */ 
+               { LFUN_SEARCH_STRING_SET, "search-string-set", ReadOnly, Edit 
}, 
+
 /*!
  * \var lyx::FuncCode lyx::LFUN_WORD_FINDADV
  * \li Action: Search for next occurrence of a pattern.
-- 
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to