From c44928e1d87706afc47f8ce0189219a205bfa9c4 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Mon, 26 Dec 2016 23:06:24 +0800 Subject: [PATCH] remove Ctrl+Alt Vim mode 1. Remove Ctrl+ALT Vim mode. Now Ctrl+D will enter the Vim mode tempararily and only expires after NOT hitting commands for a while; 2. Add d and dd to delete text. 'd2j' is not supported; 3. x will cut the selected text. Signed-off-by: Le Tan --- src/hgmarkdownhighlighter.cpp | 2 +- src/vedittab.cpp | 2 +- src/veditwindow.cpp | 2 +- src/vmdeditoperations.cpp | 164 +++++++++++++--------------------- 4 files changed, 67 insertions(+), 103 deletions(-) diff --git a/src/hgmarkdownhighlighter.cpp b/src/hgmarkdownhighlighter.cpp index 5c72cd2a..06dfcc49 100644 --- a/src/hgmarkdownhighlighter.cpp +++ b/src/hgmarkdownhighlighter.cpp @@ -248,7 +248,7 @@ void HGMarkdownHighlighter::parseInternal() pmh_markdown_to_elements(content, pmh_EXT_NONE, &result); } -void HGMarkdownHighlighter::handleContentChange(int position, int charsRemoved, int charsAdded) +void HGMarkdownHighlighter::handleContentChange(int /* position */, int charsRemoved, int charsAdded) { if (charsRemoved == 0 && charsAdded == 0) { return; diff --git a/src/vedittab.cpp b/src/vedittab.cpp index 79f80f43..eaae2321 100644 --- a/src/vedittab.cpp +++ b/src/vedittab.cpp @@ -278,7 +278,7 @@ void VEditTab::focusTab() currentWidget()->setFocus(); } -void VEditTab::handleFocusChanged(QWidget *old, QWidget *now) +void VEditTab::handleFocusChanged(QWidget * /* old */, QWidget *now) { if (isChild(now)) { emit getFocused(); diff --git a/src/veditwindow.cpp b/src/veditwindow.cpp index b5993849..a43ec819 100644 --- a/src/veditwindow.cpp +++ b/src/veditwindow.cpp @@ -367,7 +367,7 @@ void VEditWindow::focusWindow() getTab(idx)->focusTab(); } -void VEditWindow::handleTabbarClicked(int index) +void VEditWindow::handleTabbarClicked(int /* index */) { // The child will emit getFocused here focusWindow(); diff --git a/src/vmdeditoperations.cpp b/src/vmdeditoperations.cpp index 55bc8475..6c110fe7 100644 --- a/src/vmdeditoperations.cpp +++ b/src/vmdeditoperations.cpp @@ -182,56 +182,6 @@ bool VMdEditOperations::shouldTriggerVimMode(QKeyEvent *p_event) return false; } else if (m_keyState == KeyState::Vim || m_keyState == KeyState::VimVisual) { return true; - } else { - if (modifiers == (Qt::ControlModifier | Qt::AltModifier)) { - switch (key) { - // Should add one item for each supported Ctrl+ALT+ Vim binding. - case Qt::Key_H: - case Qt::Key_J: - case Qt::Key_K: - case Qt::Key_L: - case Qt::Key_0: - case Qt::Key_1: - case Qt::Key_2: - case Qt::Key_3: - case Qt::Key_4: - case Qt::Key_5: - case Qt::Key_6: - case Qt::Key_7: - case Qt::Key_8: - case Qt::Key_9: - case Qt::Key_X: - case Qt::Key_W: - case Qt::Key_E: - case Qt::Key_B: - case Qt::Key_G: - case Qt::Key_V: - case Qt::Key_Y: - case Qt::Key_Dollar: - case Qt::Key_AsciiCircum: - { - return true; - } - default: - m_pendingKey.clear(); - break; - } - } else if (modifiers == - (Qt::ControlModifier | Qt::ShiftModifier | Qt::AltModifier)) { - switch (key) { - case Qt::Key_G: - case Qt::Key_Dollar: - case Qt::Key_AsciiCircum: - { - return true; - } - - default: - // Should not clear the m_pendingKey. - // Consider Ctrl+Shift+Alt+G. - break; - } - } } return false; } @@ -586,8 +536,6 @@ bool VMdEditOperations::handleKeyEsc(QKeyEvent *p_event) bool VMdEditOperations::handleKeyPressVim(QKeyEvent *p_event) { int modifiers = p_event->modifiers(); - bool ctrlAlt = modifiers == (Qt::ControlModifier | Qt::AltModifier); - bool ctrlShiftAlt = modifiers == (Qt::ControlModifier | Qt::ShiftModifier | Qt::AltModifier); bool visualMode = m_keyState == KeyState::VimVisual; QTextCursor::MoveMode mode = visualMode ? QTextCursor::KeepAnchor : QTextCursor::MoveAnchor; @@ -607,7 +555,7 @@ bool VMdEditOperations::handleKeyPressVim(QKeyEvent *p_event) case Qt::Key_K: case Qt::Key_L: { - if (modifiers == Qt::NoModifier || ctrlAlt) { + if (modifiers == Qt::NoModifier) { QTextCursor::MoveOperation op; switch (p_event->key()) { case Qt::Key_H: @@ -624,12 +572,11 @@ bool VMdEditOperations::handleKeyPressVim(QKeyEvent *p_event) } // Move cursor characters left/Down/Up/Right. int repeat = keySeqToNumber(m_pendingKey); + m_pendingKey.clear(); QTextCursor cursor = m_editor->textCursor(); cursor.movePosition(op, mode, repeat == 0 ? 1 : repeat); m_editor->setTextCursor(cursor); - if (visualMode) { - goto pending; - } + goto pending; } break; } @@ -644,7 +591,7 @@ bool VMdEditOperations::handleKeyPressVim(QKeyEvent *p_event) case Qt::Key_8: case Qt::Key_9: { - if (modifiers == Qt::NoModifier || ctrlAlt) { + if (modifiers == Qt::NoModifier) { if (!suffixNumAllowed(m_pendingKey)) { break; } @@ -658,47 +605,55 @@ bool VMdEditOperations::handleKeyPressVim(QKeyEvent *p_event) case Qt::Key_X: { // Delete characters. - if (modifiers == Qt::NoModifier || ctrlAlt) { + if (modifiers == Qt::NoModifier) { int repeat = keySeqToNumber(m_pendingKey); + m_pendingKey.clear(); QTextCursor cursor = m_editor->textCursor(); if (repeat == 0) { repeat = 1; } cursor.beginEditBlock(); - for (int i = 0; i < repeat; ++i) { - cursor.deleteChar(); + if (cursor.hasSelection()) { + QClipboard *clipboard = QApplication::clipboard(); + clipboard->setText(cursor.selectedText()); + cursor.removeSelectedText(); + } else { + for (int i = 0; i < repeat; ++i) { + cursor.deleteChar(); + } } cursor.endEditBlock(); m_editor->setTextCursor(cursor); + goto pending; } break; } case Qt::Key_W: { - if (modifiers == Qt::NoModifier || ctrlAlt) { + if (modifiers == Qt::NoModifier) { // Move to the start of the next word. // Slightly different from the Vim behavior. int repeat = keySeqToNumber(m_pendingKey); + m_pendingKey.clear(); QTextCursor cursor = m_editor->textCursor(); if (repeat == 0) { repeat = 1; } cursor.movePosition(QTextCursor::NextWord, mode, repeat); m_editor->setTextCursor(cursor); - if (visualMode) { - goto pending; - } + goto pending; } break; } case Qt::Key_E: { - if (modifiers == Qt::NoModifier || ctrlAlt) { + if (modifiers == Qt::NoModifier) { // Move to the end of the next word. // Slightly different from the Vim behavior. int repeat = keySeqToNumber(m_pendingKey); + m_pendingKey.clear(); QTextCursor cursor = m_editor->textCursor(); if (repeat == 0) { repeat = 1; @@ -717,19 +672,18 @@ bool VMdEditOperations::handleKeyPressVim(QKeyEvent *p_event) } cursor.endEditBlock(); m_editor->setTextCursor(cursor); - if (visualMode) { - goto pending; - } + goto pending; } break; } case Qt::Key_B: { - if (modifiers == Qt::NoModifier || ctrlAlt) { + if (modifiers == Qt::NoModifier) { // Move to the start of the previous word. // Slightly different from the Vim behavior. int repeat = keySeqToNumber(m_pendingKey); + m_pendingKey.clear(); QTextCursor cursor = m_editor->textCursor(); if (repeat == 0) { repeat = 1; @@ -747,42 +701,35 @@ bool VMdEditOperations::handleKeyPressVim(QKeyEvent *p_event) } cursor.endEditBlock(); m_editor->setTextCursor(cursor); - if (visualMode) { - goto pending; - } + goto pending; } break; } case Qt::Key_0: { - if (modifiers == Qt::NoModifier || ctrlAlt) { + if (modifiers == Qt::NoModifier) { if (keySeqToNumber(m_pendingKey) == 0) { QTextCursor cursor = m_editor->textCursor(); cursor.movePosition(QTextCursor::StartOfLine, mode); m_editor->setTextCursor(cursor); - if (visualMode) { - goto pending; - } } else { m_pendingKey.append("0"); - goto pending; } + goto pending; } break; } case Qt::Key_Dollar: { - if (modifiers == Qt::ShiftModifier || ctrlShiftAlt) { + if (modifiers == Qt::ShiftModifier) { if (m_pendingKey.isEmpty()) { // Go to end of line. QTextCursor cursor = m_editor->textCursor(); cursor.movePosition(QTextCursor::EndOfLine, mode); m_editor->setTextCursor(cursor); - if (visualMode) { - goto pending; - } + goto pending; } } break; @@ -790,7 +737,7 @@ bool VMdEditOperations::handleKeyPressVim(QKeyEvent *p_event) case Qt::Key_AsciiCircum: { - if (modifiers == Qt::ShiftModifier || ctrlShiftAlt) { + if (modifiers == Qt::ShiftModifier) { if (m_pendingKey.isEmpty()) { // Go to first non-space character of current line. QTextCursor cursor = m_editor->textCursor(); @@ -809,9 +756,7 @@ bool VMdEditOperations::handleKeyPressVim(QKeyEvent *p_event) } cursor.endEditBlock(); m_editor->setTextCursor(cursor); - if (visualMode) { - goto pending; - } + goto pending; } } break; @@ -819,7 +764,7 @@ bool VMdEditOperations::handleKeyPressVim(QKeyEvent *p_event) case Qt::Key_G: { - if (modifiers == Qt::NoModifier || ctrlAlt) { + if (modifiers == Qt::NoModifier) { // g, pending or go to first line. if (m_pendingKey.isEmpty()) { m_pendingKey.append("g"); @@ -829,13 +774,12 @@ bool VMdEditOperations::handleKeyPressVim(QKeyEvent *p_event) QTextCursor cursor = m_editor->textCursor(); cursor.movePosition(QTextCursor::Start, mode); m_editor->setTextCursor(cursor); - if (visualMode) { - goto pending; - } + goto pending; } - } else if (modifiers == Qt::ShiftModifier || ctrlShiftAlt) { + } else if (modifiers == Qt::ShiftModifier) { // G, go to a certain line or the end of document. int lineNum = keySeqToNumber(m_pendingKey); + m_pendingKey.clear(); QTextCursor cursor = m_editor->textCursor(); if (lineNum == 0) { cursor.movePosition(QTextCursor::End, mode); @@ -850,16 +794,14 @@ bool VMdEditOperations::handleKeyPressVim(QKeyEvent *p_event) } } m_editor->setTextCursor(cursor); - if (visualMode) { - goto pending; - } + goto pending; } break; } case Qt::Key_V: { - if (modifiers == Qt::NoModifier || ctrlAlt) { + if (modifiers == Qt::NoModifier) { // V to enter visual mode. if (m_pendingKey.isEmpty() && m_keyState != KeyState::VimVisual) { m_keyState = KeyState::VimVisual; @@ -871,8 +813,7 @@ bool VMdEditOperations::handleKeyPressVim(QKeyEvent *p_event) case Qt::Key_Y: { - // TODO: support y2j. - if (modifiers == Qt::NoModifier || ctrlAlt) { + if (modifiers == Qt::NoModifier) { if (m_pendingKey.isEmpty()) { QTextCursor cursor = m_editor->textCursor(); if (cursor.hasSelection()) { @@ -880,6 +821,31 @@ bool VMdEditOperations::handleKeyPressVim(QKeyEvent *p_event) QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(text); } + goto pending; + } + } + break; + } + + case Qt::Key_D: + { + if (modifiers == Qt::NoModifier) { + // d, pending or delete current line. + QTextCursor cursor = m_editor->textCursor(); + if (m_pendingKey.isEmpty()) { + if (cursor.hasSelection()) { + cursor.deleteChar(); + m_editor->setTextCursor(cursor); + } else { + m_pendingKey.append("d"); + } + goto pending; + } else if (m_pendingKey.size() == 1 && m_pendingKey.at(0) == "d") { + m_pendingKey.clear(); + cursor.select(QTextCursor::BlockUnderCursor); + cursor.removeSelectedText(); + m_editor->setTextCursor(cursor); + goto pending; } } break; @@ -904,7 +870,7 @@ bool VMdEditOperations::handleKeyPressVim(QKeyEvent *p_event) pending: // When pending in Ctrl+Alt, we just want to clear m_pendingKey. - if (m_pendingTimer->isActive() || ctrlAlt) { + if (m_pendingTimer->isActive()) { m_pendingTimer->stop(); m_pendingTimer->start(); } @@ -930,9 +896,7 @@ int VMdEditOperations::keySeqToNumber(const QList &p_seq) void VMdEditOperations::pendingTimerTimeout() { qDebug() << "key pending timer timeout"; - int modifiers = QGuiApplication::keyboardModifiers(); - if (modifiers == (Qt::ControlModifier | Qt::AltModifier) - || m_keyState == KeyState::VimVisual) { + if (m_keyState == KeyState::VimVisual) { m_pendingTimer->start(); return; }