Warning, file /frameworks/ktexteditor/src/vimode/registers.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 SPDX-FileCopyrightText: KDE Developers 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "registers.h" 0008 #include "katepartdebug.h" 0009 0010 #include <KConfigGroup> 0011 0012 #include <QApplication> 0013 #include <QClipboard> 0014 0015 using namespace KateVi; 0016 0017 void Registers::readConfig(const KConfigGroup &config) 0018 { 0019 const QStringList names = config.readEntry("ViRegisterNames", QStringList()); 0020 const QStringList contents = config.readEntry("ViRegisterContents", QStringList()); 0021 const QList<int> flags = config.readEntry("ViRegisterFlags", QList<int>()); 0022 0023 if (names.size() != contents.size() || contents.size() != flags.size()) { 0024 return; 0025 } 0026 0027 for (int i = 0; i < names.size(); i++) { 0028 if (!names.at(i).isEmpty()) { 0029 set(names.at(i).at(0), contents.at(i), (OperationMode)(flags.at(i))); 0030 } 0031 } 0032 } 0033 0034 void Registers::writeConfig(KConfigGroup &config) const 0035 { 0036 if (m_registers.isEmpty()) { 0037 return; 0038 } 0039 0040 QStringList names; 0041 QStringList contents; 0042 QList<int> flags; 0043 QMap<QChar, Register>::const_iterator i; 0044 for (i = m_registers.constBegin(); i != m_registers.constEnd(); ++i) { 0045 if (i.value().first.length() <= 1000) { 0046 names << i.key(); 0047 contents << i.value().first; 0048 flags << int(i.value().second); 0049 } else { 0050 qCDebug(LOG_KTE) << "Did not save contents of register " << i.key() << ": contents too long (" << i.value().first.length() << " characters)"; 0051 } 0052 } 0053 0054 config.writeEntry("ViRegisterNames", names); 0055 config.writeEntry("ViRegisterContents", contents); 0056 config.writeEntry("ViRegisterFlags", flags); 0057 } 0058 0059 void Registers::setInsertStopped(const QString &text) 0060 { 0061 set(InsertStoppedRegister, text); 0062 } 0063 0064 void Registers::set(const QChar ®, const QString &text, OperationMode flag) 0065 { 0066 if (reg == BlackHoleRegister) { 0067 return; 0068 } 0069 0070 if (reg == PrependNumberedRegister || (reg >= FirstNumberedRegister && reg <= LastNumberedRegister)) { // "kill ring" registers 0071 setNumberedRegister(reg, text, flag); 0072 } else if (reg == SystemClipboardRegister) { 0073 QApplication::clipboard()->setText(text, QClipboard::Clipboard); 0074 } else if (reg == SystemSelectionRegister) { 0075 QApplication::clipboard()->setText(text, QClipboard::Selection); 0076 } else { 0077 const QChar lowercase_reg = reg.toLower(); 0078 if (reg != lowercase_reg) { 0079 m_registers[lowercase_reg].first.append(text); 0080 } else { 0081 m_registers.insert(lowercase_reg, Register(text, flag)); 0082 } 0083 } 0084 0085 if (reg == ZeroRegister || reg == PrependNumberedRegister || reg == SmallDeleteRegister) { 0086 m_default = reg; 0087 } 0088 } 0089 0090 QString Registers::getContent(const QChar ®) const 0091 { 0092 return getRegister(reg).first; 0093 } 0094 0095 OperationMode Registers::getFlag(const QChar ®) const 0096 { 0097 return getRegister(reg).second; 0098 } 0099 0100 Registers::Register Registers::getRegister(const QChar ®) const 0101 { 0102 Register regPair; 0103 QChar _reg = (reg != UnnamedRegister ? reg : m_default); 0104 0105 if (_reg >= FirstNumberedRegister && _reg <= LastNumberedRegister) { 0106 int index = _reg.digitValue() - 1; 0107 if (m_numbered.size() > index) { 0108 regPair = m_numbered.at(index); 0109 } 0110 } else if (_reg == PrependNumberedRegister) { 0111 if (!m_numbered.isEmpty()) { 0112 regPair = m_numbered.front(); 0113 } 0114 } else if (_reg == SystemClipboardRegister) { 0115 QString regContent = QApplication::clipboard()->text(QClipboard::Clipboard); 0116 regPair = Register(regContent, CharWise); 0117 } else if (_reg == SystemSelectionRegister) { 0118 QString regContent = QApplication::clipboard()->text(QClipboard::Selection); 0119 regPair = Register(regContent, CharWise); 0120 } else { 0121 const QChar lowercase_reg = _reg.toLower(); 0122 if (m_registers.contains(lowercase_reg)) { 0123 regPair = m_registers.value(lowercase_reg); 0124 } 0125 } 0126 0127 return regPair; 0128 } 0129 0130 void Registers::setNumberedRegister(const QChar ®, const QString &text, OperationMode flag) 0131 { 0132 int index = reg.digitValue() - 1; 0133 if (reg == PrependNumberedRegister || index > m_numbered.size()) { 0134 if (m_numbered.size() == 9) { 0135 m_numbered.removeLast(); 0136 } 0137 0138 // register 0 is used for the last yank command, so insert at position 1 0139 m_numbered.prepend(Register(text, flag)); 0140 } else { 0141 m_numbered[index].first = text; 0142 m_numbered[index].second = flag; 0143 } 0144 }