From 7f90e3b7d2375e424ea7d3cb29bad4018cc60bee Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Fri, 12 Feb 2021 14:30:50 +0100 Subject: [PATCH] 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 1f8069b772..4e92ccf83a 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 , 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 88400d784c..376425339c 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 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 a720c642bf..f473cdaa7a 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 38fa2c3cdb..0d43ea582a 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 [] + * \li Params: : 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.