diff --git a/src/plugins/fakevim/fakevimconstants.h b/src/plugins/fakevim/fakevimconstants.h index 7c21750451df3158dc4efda3f1673d66d8521c02..c1b7ff1b157ff1989b36e67f3d80729dddcaa42c 100644 --- a/src/plugins/fakevim/fakevimconstants.h +++ b/src/plugins/fakevim/fakevimconstants.h @@ -44,6 +44,13 @@ const char * const ConfigSmartTab = "smarttab"; const char * const ConfigStartOfLine = "startofline"; const char * const ConfigTabStop = "tabstop"; +const char * const ConfigBackspace = "backspace"; +// indent allow backspacing over autoindent +// eol allow backspacing over line breaks (join lines) +// start allow backspacing over the start of insert; CTRL-W and CTRL-U +// stop once at the start of insert. + + } // namespace Constants } // namespace FakeVim diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index 62f56238f47f47e12ba285c6df80922611fd188d..d0bbd7d1c3b2432e8db57ccf851885980df0e74f 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -381,6 +381,10 @@ public: // vi style configuration QHash<QString, QString> m_config; + bool hasConfig(const char *name) const + { return m_config[name] == ConfigOn; } + bool hasConfig(const char *name, const char *value) const + { return m_config[name].contains(value); } // FIXME // for restoring cursor position int m_savedYankPosition; @@ -425,6 +429,7 @@ FakeVimHandler::Private::Private(FakeVimHandler *parent, QWidget *widget) m_config[ConfigShiftWidth] = "8"; m_config[ConfigExpandTab] = ConfigOff; m_config[ConfigAutoIndent] = ConfigOff; + m_config[ConfigBackspace] = "indent,eol,start"; } bool FakeVimHandler::Private::wantsOverride(QKeyEvent *ev) @@ -1104,7 +1109,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, if (m_gflag) { m_gflag = false; m_tc.setPosition(firstPositionInLine(1), KeepAnchor); - if (m_config[ConfigStartOfLine] == ConfigOn) + if (hasConfig(ConfigStartOfLine)) moveToFirstNonBlankOnLine(); finishMovement(); } else { @@ -1113,7 +1118,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, } else if (key == 'G') { int n = m_mvcount.isEmpty() ? linesInDocument() : count(); m_tc.setPosition(firstPositionInLine(n), KeepAnchor); - if (m_config[ConfigStartOfLine] == ConfigOn) + if (hasConfig(ConfigStartOfLine)) moveToFirstNonBlankOnLine(); finishMovement(); } else if (key == 'h' || key == Key_Left @@ -1229,7 +1234,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, moveToEndOfLine(); recordInsertText("\n"); moveToStartOfLine(); - if (0 && m_config[ConfigAutoIndent] == ConfigOn) + if (0 && hasConfig(ConfigAutoIndent)) recordInsertText(QString(indentDist(), ' ')); else recordInsertText(QString(numSpaces, ' ')); @@ -1447,11 +1452,13 @@ EventResult FakeVimHandler::Private::handleInsertMode(int key, int, m_submode = NoSubMode; m_tc.insertBlock(); m_lastInsertion += "\n"; - if (0 && m_config[ConfigAutoIndent] == ConfigOn) + if (0 && hasConfig(ConfigAutoIndent)) indentRegion('\n'); } else if (key == Key_Backspace || key == control('h')) { - m_tc.deletePreviousChar(); - m_lastInsertion = m_lastInsertion.left(m_lastInsertion.size() - 1); + if (!m_lastInsertion.isEmpty() || hasConfig(ConfigBackspace, "start")) { + m_tc.deletePreviousChar(); + m_lastInsertion = m_lastInsertion.left(m_lastInsertion.size() - 1); + } } else if (key == Key_Delete) { m_tc.deleteChar(); m_lastInsertion.clear(); @@ -1461,7 +1468,7 @@ EventResult FakeVimHandler::Private::handleInsertMode(int key, int, } else if (key == Key_PageUp || key == control('b')) { moveUp(count() * (linesOnScreen() - 2)); m_lastInsertion.clear(); - } else if (key == Key_Tab && m_config[ConfigExpandTab] == ConfigOn) { + } else if (key == Key_Tab && hasConfig(ConfigExpandTab)) { QString str = QString(m_config[ConfigTabStop].toInt(), ' '); m_lastInsertion.append(str); m_tc.insertText(str); @@ -1476,8 +1483,7 @@ EventResult FakeVimHandler::Private::handleInsertMode(int key, int, m_tc.deleteChar(); } m_tc.insertText(text); - if (0 && m_config[ConfigAutoIndent] == ConfigOn - && isElectricCharacter(text.at(0))) { + if (0 && hasConfig(ConfigAutoIndent) && isElectricCharacter(text.at(0))) { const QString leftText = m_tc.block().text() .left(m_tc.position() - 1 - m_tc.block().position()); if (leftText.simplified().isEmpty()) @@ -1500,10 +1506,11 @@ EventResult FakeVimHandler::Private::handleMiniBufferModes(int key, int unmodifi enterCommandMode(); updateMiniBuffer(); } else if (key == Key_Backspace) { - if (m_commandBuffer.isEmpty()) + if (m_commandBuffer.isEmpty()) { enterCommandMode(); - else + } else { m_commandBuffer.chop(1); + } updateMiniBuffer(); } else if (key == Key_Left) { // FIXME: