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.
This commit is contained in:
Juergen Spitzmueller 2021-02-12 14:30:50 +01:00
parent fbef5e687a
commit 7f90e3b7d2
4 changed files with 45 additions and 12 deletions

View File

@ -97,6 +97,10 @@
* paragraph-select is a new convenience function to select the paragraph * paragraph-select is a new convenience function to select the paragraph
surrounding the actual cursor position. 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 * 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. cursor position. This is only implemented for text insets currently.

View File

@ -275,7 +275,7 @@ struct BufferView::Private
frontend::GuiBufferViewDelegate * gui_; frontend::GuiBufferViewDelegate * gui_;
/// Cache for Find Next /// Cache for Find Next
FuncRequest search_request_cache_; docstring search_request_cache_;
/// ///
map<string, Inset *> edited_insets_; map<string, Inset *> edited_insets_;
@ -1155,6 +1155,7 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
case LFUN_MARK_OFF: case LFUN_MARK_OFF:
case LFUN_MARK_ON: case LFUN_MARK_ON:
case LFUN_MARK_TOGGLE: case LFUN_MARK_TOGGLE:
case LFUN_SEARCH_STRING_SET:
case LFUN_SCREEN_RECENTER: case LFUN_SCREEN_RECENTER:
case LFUN_SCREEN_SHOW_CURSOR: case LFUN_SCREEN_SHOW_CURSOR:
case LFUN_BIBTEX_DATABASE_ADD: 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_FORWARD:
case LFUN_WORD_FIND_BACKWARD: { 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; docstring searched_string;
if (!cmd.argument().empty()) { if (!cmd.argument().empty()) {
last_search = cmd.argument(); d->search_request_cache_ = cmd.argument();
searched_string = cmd.argument(); searched_string = cmd.argument();
} else { } else {
searched_string = last_search; searched_string = d->search_request_cache_;
} }
if (searched_string.empty()) if (searched_string.empty())
@ -1636,19 +1634,38 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
} }
case LFUN_WORD_FIND: { case LFUN_WORD_FIND: {
FuncRequest req = cmd; docstring arg = cmd.argument();
if (cmd.argument().empty() && !d->search_request_cache_.argument().empty()) if (arg.empty() && !d->search_request_cache_.empty())
req = d->search_request_cache_; arg = d->search_request_cache_;
if (req.argument().empty()) { if (arg.empty()) {
lyx::dispatch(FuncRequest(LFUN_DIALOG_SHOW, "findreplace")); lyx::dispatch(FuncRequest(LFUN_DIALOG_SHOW, "findreplace"));
break; break;
} }
if (lyxfind(this, req)) if (lyxfind(this, FuncRequest(act, arg)))
dr.screenUpdate(Update::Force | Update::FitCursor); dr.screenUpdate(Update::Force | Update::FitCursor);
else else
dr.setMessage(_("Search string not found!")); 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; break;
} }

View File

@ -495,6 +495,7 @@ enum FuncCode
// 385 // 385
LFUN_INSET_SPLIT, // jspitzm 20201222 LFUN_INSET_SPLIT, // jspitzm 20201222
LFUN_LYXFILES_OPEN, // jspitzm 20210210 LFUN_LYXFILES_OPEN, // jspitzm 20210210
LFUN_SEARCH_STRING_SET, // stwitt/jspitzm 20210212
LFUN_LASTACTION // end of the table LFUN_LASTACTION // end of the table
}; };

View File

@ -4346,6 +4346,17 @@ void LyXAction::init()
*/ */
{ LFUN_WORD_FIND, "word-find", ReadOnly, Edit }, { 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 * \var lyx::FuncCode lyx::LFUN_WORD_FINDADV
* \li Action: Search for next occurrence of a pattern. * \li Action: Search for next occurrence of a pattern.