From 312509fcdbd20ada6de9ff4b1370c7d16f78a8f7 Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Tue, 6 Jul 2010 16:17:27 +0200 Subject: [PATCH] fakevim: fix backspace in the presence of physical tabs (cherry picked from commit 2b40e2906fc070c6253a84c0ca507ff0db912f73) --- src/plugins/fakevim/fakevimhandler.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index ce3bceb9a6..c8ba4f46f7 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -232,6 +232,11 @@ struct Column int logical; // Column on screen. }; +QDebug operator<<(QDebug ts, const Column &col) +{ + return ts << "(p: " << col.physical << ", l: " << col.logical << ")"; +} + struct CursorPosition { // for jump history @@ -2619,11 +2624,11 @@ EventResult FakeVimHandler::Private::handleInsertMode(const Input &input) if (col.logical <= ind.logical && col.logical && startsWithWhitespace(data, col.physical)) { const int ts = config(ConfigTabStop).toInt(); - const int newcol = col.logical - 1 - (col.logical - 1) % ts; - data.remove(0, col.physical); - setLineContents(line, tabExpand(newcol).append(data)); + const int newl = col.logical - 1 - (col.logical - 1) % ts; + const QString prefix = tabExpand(newl); + setLineContents(line, prefix + data.mid(col.physical)); moveToStartOfLine(); - moveRight(newcol); + moveRight(prefix.size()); m_lastInsertion.clear(); // FIXME } else { m_tc.deletePreviousChar(); @@ -4303,10 +4308,12 @@ void FakeVimHandler::Private::setLineContents(int line, const QString &contents) { QTextBlock block = m_tc.document()->findBlockByNumber(line - 1); QTextCursor tc = m_tc; - tc.setPosition(block.position()); - tc.setPosition(block.position() + block.length() - 1, KeepAnchor); + const int begin = block.position(); + const int len = block.length(); + tc.setPosition(begin); + tc.setPosition(begin + len - 1, KeepAnchor); tc.removeSelectedText(); - fixMarks(block.position(), block.length() - contents.size()); + fixMarks(begin, contents.size() + 1 - len); tc.insertText(contents); } -- GitLab