From 8c0821dbc38210ec5c2ea4a4b826c24a98f51b12 Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Thu, 18 Mar 2010 17:45:15 +0100 Subject: [PATCH] fakevim: provide some infrastructure to handle 'text object'. Implementations are mostly missing. --- src/plugins/fakevim/fakevimhandler.cpp | 99 +++++++++++++++++++++++--- 1 file changed, 90 insertions(+), 9 deletions(-) diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index ea97cdb5615..be76ee29411 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -160,14 +160,15 @@ enum SubSubMode // typically used for things that require one more data item // and are 'nested' behind a mode NoSubSubMode, - FtSubSubMode, // used for f, F, t, T - MarkSubSubMode, // used for m - BackTickSubSubMode, // used for ` - TickSubSubMode, // used for ' + FtSubSubMode, // used for f, F, t, T + MarkSubSubMode, // used for m + BackTickSubSubMode, // used for ` + TickSubSubMode, // used for ' InvertCaseSubSubMode, // used for ~ - DownCaseSubSubMode, // used for gu - UpCaseSubSubMode, // used for gU - ReplaceSubSubMode, // used for r after visual mode + DownCaseSubSubMode, // used for gu + UpCaseSubSubMode, // used for gU + ReplaceSubSubMode, // used for r after visual mode + TextObjectSubSubMode, // used for f, F, t, T }; enum VisualMode @@ -289,9 +290,11 @@ public: EventResult handleEvent(QKeyEvent *ev); bool wantsOverride(QKeyEvent *ev); - void handleCommand(const QString &cmd); // sets m_tc + handleExCommand + void handleCommand(const QString &cmd); // Sets m_tc + handleExCommand void handleExCommand(const QString &cmd); - void fixMarks(int positionAction, int positionChange); //Updates marks positions by the difference in positionChange + + // updates marks positions by the difference in positionChange + void fixMarks(int positionAction, int positionChange); void installEventFilter(); void passShortcuts(bool enable); @@ -417,6 +420,13 @@ public: bool isVisualBlockMode() const { return m_visualMode == VisualBlockMode; } void updateEditor(); + void selectWordTextObject(bool inner); + void selectWORDTextObject(bool inner); + void selectSentenceTextObject(bool inner); + void selectParagraphTextObject(bool inner); + void selectBlockTextObject(bool inner, char left, char right); + void selectQuotedStringTextObject(bool inner, int type); + public: QTextEdit *m_textedit; QPlainTextEdit *m_plaintextedit; @@ -1160,6 +1170,11 @@ void FakeVimHandler::Private::passShortcuts(bool enable) QCoreApplication::instance()->removeEventFilter(q); } +static bool subModeCanUseTextObjects(int submode) +{ + return submode == DeleteSubMode; +} + EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, const QString &text) { @@ -1189,6 +1204,25 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, .arg(QChar(m_semicolonType)) .arg(QChar(m_semicolonKey))); } + } else if (m_subsubmode == TextObjectSubSubMode) { + if (key == 'w') + selectWordTextObject(m_subsubdata == 'i'); + else if (key == 'W') + selectWORDTextObject(m_subsubdata == 'i'); + else if (key == 's') + selectSentenceTextObject(m_subsubdata == 'i'); + else if (key == 'p') + selectParagraphTextObject(m_subsubdata == 'i'); + else if (key == '[' || key == ']') + selectBlockTextObject(m_subsubdata == 'i', '[', ']'); + else if (key == '(' || key == ')' || key == 'b') + selectBlockTextObject(m_subsubdata == 'i', '(', ')'); + else if (key == '<' || key == '>') + selectBlockTextObject(m_subsubdata == 'i', '<', '>'); + else if (key == '"' || key == '\'' || key == '`') + selectQuotedStringTextObject(m_subsubdata == 'i', key); + m_subsubmode = NoSubSubMode; + finishMovement(); } else if (m_submode == TransformSubMode && m_subsubmode == ReplaceSubSubMode) { if (isVisualLineMode()) m_rangemode = RangeLineMode; @@ -1226,6 +1260,9 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, handleStartOfLine(); setTargetColumn(); finishMovement(); + } else if (subModeCanUseTextObjects(m_submode) && (key == 'a' || key == 'i')) { + m_subsubmode = TextObjectSubSubMode; + m_subsubdata = key; } else if (m_submode == ShiftLeftSubMode && key == '<') { setAnchor(); moveDown(count() - 1); @@ -3607,6 +3644,50 @@ void FakeVimHandler::Private::replay(const QString &command, int n) } +void FakeVimHandler::Private::selectWordTextObject(bool inner) +{ + Q_UNUSED(inner); // FIXME + m_movetype = MoveExclusive; + moveToWordBoundary(false, false); + enterVisualMode(VisualCharMode); + moveToWordBoundary(false, true); + leaveVisualMode(); +} + +void FakeVimHandler::Private::selectWORDTextObject(bool inner) +{ + Q_UNUSED(inner); // FIXME + m_movetype = MoveExclusive; + moveToWordBoundary(true, false); + enterVisualMode(VisualCharMode); + moveToWordBoundary(true, true); + leaveVisualMode(); +} + +void FakeVimHandler::Private::selectSentenceTextObject(bool inner) +{ + Q_UNUSED(inner); +} + +void FakeVimHandler::Private::selectParagraphTextObject(bool inner) +{ + Q_UNUSED(inner); +} + +void FakeVimHandler::Private::selectBlockTextObject(bool inner, char left, char right) +{ + Q_UNUSED(inner); + Q_UNUSED(left); + Q_UNUSED(right); +} + +void FakeVimHandler::Private::selectQuotedStringTextObject(bool inner, int type) +{ + Q_UNUSED(inner); + Q_UNUSED(type); +} + + /////////////////////////////////////////////////////////////////////// // // FakeVimHandler -- GitLab