From d15fb5a75c830089dc0173a9ec0a160be3a2aaf5 Mon Sep 17 00:00:00 2001 From: hluk Date: Tue, 6 Aug 2013 17:13:53 +0200 Subject: [PATCH] FakeVim: Emulate search more precisely Submitting search highlights (if 'hlsearch' enabled) in visible editors. Update highlights after 'nohlsearch' command, 'set hlsearch' and changing document. Change-Id: I66ed8c6e9c6e99f3c64f91cdec5ac5feb636d2cb Reviewed-by: hjk --- src/plugins/fakevim/fakevimhandler.cpp | 43 ++++++++++++++++++-------- src/plugins/fakevim/fakevimplugin.cpp | 11 ++++--- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index af1aeb73e2e..8e573997366 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -1901,6 +1901,7 @@ public: QTextCursor m_searchCursor; int m_searchStartPosition; int m_searchFromScreenLine; + QString m_highlighted; // currently highlighted text bool handleExCommandHelper(ExCommand &cmd); // Returns success. bool handleExPluginCommand(const ExCommand &cmd); // Handled by plugin? @@ -1954,6 +1955,7 @@ public: , mapDepth(0) , currentMessageLevel(MessageInfo) , lastSearchForward(false) + , highlightsCleared(false) , findPending(false) , returnToMode(CommandMode) , currentRegister(0) @@ -2001,7 +2003,6 @@ public: // Command line buffers. CommandBuffer commandBuffer; CommandBuffer searchBuffer; - QString oldNeedle; // Current mini buffer message. QString currentMessage; @@ -2009,9 +2010,11 @@ public: QString currentCommand; // Search state. - QString lastSearch; - bool lastSearchForward; - bool findPending; + QString lastSearch; // last search expression as entered by user + QString lastNeedle; // last search expression translated with vimPatternToQtPattern() + bool lastSearchForward; // last search command was '/' or '*' + bool highlightsCleared; // ':nohlsearch' command is active until next search + bool findPending; // currently searching using external tool (until editor is focused again) // Last substitution command. QString lastSubstituteFlags; @@ -2087,6 +2090,7 @@ void FakeVimHandler::Private::focus() updateCursorShape(); if (!g.inFakeVim || g.mode != CommandMode) updateMiniBuffer(); + updateHighlights(); } void FakeVimHandler::Private::enterFakeVim() @@ -3177,8 +3181,17 @@ void FakeVimHandler::Private::updateSelection() void FakeVimHandler::Private::updateHighlights() { - if (!hasConfig(ConfigUseCoreSearch)) - emit q->highlightMatches(g.oldNeedle); + if (hasConfig(ConfigUseCoreSearch) || !hasConfig(ConfigHlSearch) || g.highlightsCleared) { + if (m_highlighted.isEmpty()) + return; + m_highlighted.clear(); + } else if (m_highlighted != g.lastNeedle) { + m_highlighted = g.lastNeedle; + } else { + return; + } + + emit q->highlightMatches(m_highlighted); } void FakeVimHandler::Private::updateMiniBuffer() @@ -5319,6 +5332,8 @@ bool FakeVimHandler::Private::handleExSetCommand(const ExCommand &cmd) act->setValue(true); else if (oldValue == true) {} // nothing to do + if (g.highlightsCleared && (cmd.args == _("hls") || cmd.args == _("hlsearch"))) + highlightMatches(g.lastNeedle); } else if (act) { // Non-boolean to show. showMessage(MessageInfo, cmd.args + QLatin1Char('=') + act->value().toString()); @@ -5654,11 +5669,12 @@ bool FakeVimHandler::Private::handleExShiftCommand(const ExCommand &cmd) bool FakeVimHandler::Private::handleExNohlsearchCommand(const ExCommand &cmd) { - // :nohlsearch - if (!cmd.cmd.startsWith(_("noh"))) + // :noh, :nohl, ..., :nohlsearch + if (cmd.cmd.size() < 3 || !QString(_("nohlsearch")).startsWith(cmd.cmd)) return false; - highlightMatches(QString()); + g.highlightsCleared = true; + updateHighlights(); return true; } @@ -5955,10 +5971,8 @@ void FakeVimHandler::Private::searchNext(bool forward) void FakeVimHandler::Private::highlightMatches(const QString &needle) { - if (!hasConfig(ConfigHlSearch) || needle == g.oldNeedle) - return; - g.oldNeedle = needle; - + g.lastNeedle = needle; + g.highlightsCleared = false; updateHighlights(); } @@ -7230,6 +7244,9 @@ void FakeVimHandler::Private::onContentsChanged(int position, int charsRemoved, m_oldPosition); } } + + if (!m_highlighted.isEmpty()) + emit q->highlightMatches(m_highlighted); } void FakeVimHandler::Private::onUndoCommandAdded() diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index 6598b1b575d..5c71396a066 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -1987,11 +1987,12 @@ void FakeVimPluginPrivate::changeSelection(const QListwidget(); - Find::IFindSupport *find = Aggregation::query(w); - if (find != 0) - find->highlightAll(needle, Find::FindRegularExpression | Find::FindCaseSensitively); + foreach (IEditor *editor, EditorManager::instance()->visibleEditors()) { + QWidget *w = editor->widget(); + Find::IFindSupport *find = Aggregation::query(w); + if (find != 0) + find->highlightAll(needle, Find::FindRegularExpression | Find::FindCaseSensitively); + } } int FakeVimPluginPrivate::currentFile() const