diff --git a/src/utils/vvim.cpp b/src/utils/vvim.cpp index 940b08a8..befb19c2 100644 --- a/src/utils/vvim.cpp +++ b/src/utils/vvim.cpp @@ -18,6 +18,7 @@ extern VConfigManager *g_config; const QChar VVim::c_unnamedRegister = QChar('"'); const QChar VVim::c_blackHoleRegister = QChar('_'); const QChar VVim::c_selectionRegister = QChar('+'); +QMap VVim::s_registers; const int VVim::SearchHistory::c_capacity = 50; @@ -556,7 +557,7 @@ bool VVim::handleKeyPressEvent(int key, int modifiers, int *p_autoIndentPos) QChar reg = keyToRegisterName(keyInfo); if (!reg.isNull()) { // Insert register content. - m_editor->insertPlainText(m_registers[reg].read()); + m_editor->insertPlainText(getRegister(reg).read()); } goto clear_accept; @@ -602,11 +603,12 @@ bool VVim::handleKeyPressEvent(int key, int modifiers, int *p_autoIndentPos) QChar reg = keyToRegisterName(keyInfo); if (!reg.isNull()) { m_keys.clear(); - setRegister(reg); - if (m_registers[reg].isNamedRegister()) { - m_registers[reg].m_append = (modifiers == Qt::ShiftModifier); + setCurrentRegisterName(reg); + Register &r = getRegister(reg); + if (r.isNamedRegister()) { + r.m_append = (modifiers == Qt::ShiftModifier); } else { - Q_ASSERT(!m_registers[reg].m_append); + Q_ASSERT(!r.m_append); } goto accept; @@ -2223,7 +2225,7 @@ void VVim::resetState() m_keys.clear(); m_tokens.clear(); m_pendingKeys.clear(); - setRegister(c_unnamedRegister); + setCurrentRegisterName(c_unnamedRegister); m_resetPositionInBlock = true; m_registerPending = false; } @@ -3881,7 +3883,7 @@ void VVim::processPasteAction(QList &p_tokens, bool p_pasteBefore) repeat = to.m_repeat; } - Register ® = m_registers[m_regName]; + Register ® = getRegister(m_regName); QString value = reg.read(); bool isBlock = reg.isBlock(); if (value.isEmpty()) { @@ -4855,14 +4857,17 @@ void VVim::expandSelectionToWholeLines(QTextCursor &p_cursor) void VVim::initRegisters() { - m_registers.clear(); - for (char ch = 'a'; ch <= 'z'; ++ch) { - m_registers[QChar(ch)] = Register(QChar(ch)); + if (!s_registers.isEmpty()) { + return; } - m_registers[c_unnamedRegister] = Register(c_unnamedRegister); - m_registers[c_blackHoleRegister] = Register(c_blackHoleRegister); - m_registers[c_selectionRegister] = Register(c_selectionRegister); + for (char ch = 'a'; ch <= 'z'; ++ch) { + s_registers[QChar(ch)] = Register(QChar(ch)); + } + + s_registers[c_unnamedRegister] = Register(c_unnamedRegister); + s_registers[c_blackHoleRegister] = Register(c_blackHoleRegister); + s_registers[c_selectionRegister] = Register(c_selectionRegister); } bool VVim::expectingRegisterName() const @@ -5145,12 +5150,12 @@ void VVim::saveToRegister(const QString &p_text) qDebug() << QString("save text(%1) to register(%2)").arg(text).arg(m_regName); - Register ® = m_registers[m_regName]; + Register ® = getRegister(m_regName); reg.update(text); if (!reg.isBlackHoleRegister() && !reg.isUnnamedRegister()) { // Save it to unnamed register. - m_registers[c_unnamedRegister].update(reg.m_value); + setRegister(c_unnamedRegister, reg.m_value); } } @@ -5257,7 +5262,7 @@ void VVim::message(const QString &p_msg) const QMap &VVim::getRegisters() const { - return m_registers; + return s_registers; } const VVim::Marks &VVim::getMarks() const @@ -5280,7 +5285,7 @@ QString VVim::getPendingKeys() const return str; } -void VVim::setRegister(QChar p_reg) +void VVim::setCurrentRegisterName(QChar p_reg) { m_regName = p_reg; } @@ -5793,7 +5798,7 @@ QString VVim::readRegister(int p_key, int p_modifiers) Key keyInfo(p_key, p_modifiers); QChar reg = keyToRegisterName(keyInfo); if (!reg.isNull()) { - return m_registers[reg].read(); + return getRegister(reg).read(); } return ""; diff --git a/src/utils/vvim.h b/src/utils/vvim.h index 69973e8f..7101d7c0 100644 --- a/src/utils/vvim.h +++ b/src/utils/vvim.h @@ -166,7 +166,7 @@ public: void setMode(VimMode p_mode, bool p_clearSelection = true); // Set current register. - void setRegister(QChar p_reg); + void setCurrentRegisterName(QChar p_reg); // Get m_registers. const QMap &getRegisters() const; @@ -797,6 +797,10 @@ private: // Clear search highlight. void clearSearchHighlight(); + // Function utils for register. + Register &getRegister(QChar p_regName) const; + void setRegister(QChar p_regName, const QString &p_val); + VEdit *m_editor; const VEditConfig *m_editConfig; VimMode m_mode; @@ -814,8 +818,6 @@ private: // Whether reset the position in block when moving cursor. bool m_resetPositionInBlock; - QMap m_registers; - // Currently used register. QChar m_regName; @@ -843,6 +845,18 @@ private: static const QChar c_unnamedRegister; static const QChar c_blackHoleRegister; static const QChar c_selectionRegister; + + static QMap s_registers; }; +inline VVim::Register &VVim::getRegister(QChar p_regName) const +{ + return s_registers[p_regName]; +} + +inline void VVim::setRegister(QChar p_regName, const QString &p_val) +{ + s_registers[p_regName].update(p_val); +} + #endif // VVIM_H