fakevim: Implement special clipboard buffers

Introduces Vim's special registers "+ and "* and partial support for
"clipboard" option - only values "unnamed" and "unnamedplus" and the
behaviour is only similar.

Task-number: QTCREATORBUG-6342
Change-Id: I1fa95b681edadacfe9690a2fd6eb2e98e7cc5dca
Reviewed-by: hjk <qthjk@ovi.com>
This commit is contained in:
Lukas Holecek
2012-07-26 21:46:38 +02:00
committed by hjk
parent 9b3f183568
commit d0dcd40635
3 changed files with 41 additions and 2 deletions

View File

@@ -236,6 +236,13 @@ FakeVimSettings *theFakeVimSettings()
item->setCheckable(true); item->setCheckable(true);
instance->insertItem(ConfigPassControlKey, item, _("passcontrolkey"), _("pck")); instance->insertItem(ConfigPassControlKey, item, _("passcontrolkey"), _("pck"));
item = new SavedAction(instance);
item->setDefaultValue(QString());
item->setValue(QString());
item->setSettingsKey(group, _("Clipboard"));
item->setCheckable(true);
instance->insertItem(ConfigClipboard, item, _("clipboard"), _("cb"));
return instance; return instance;
} }

View File

@@ -67,7 +67,8 @@ enum FakeVimSettingsCode
// other actions // other actions
ConfigShowMarks, ConfigShowMarks,
ConfigPassControlKey ConfigPassControlKey,
ConfigClipboard
}; };
class FakeVimSettings : public QObject class FakeVimSettings : public QObject

View File

@@ -74,6 +74,7 @@
#include <QStack> #include <QStack>
#include <QApplication> #include <QApplication>
#include <QClipboard>
#include <QInputMethodEvent> #include <QInputMethodEvent>
#include <QKeyEvent> #include <QKeyEvent>
#include <QLineEdit> #include <QLineEdit>
@@ -5267,11 +5268,41 @@ RangeMode FakeVimHandler::Private::registerRangeMode(int reg) const
void FakeVimHandler::Private::setRegisterContents(int reg, const QString &contents) void FakeVimHandler::Private::setRegisterContents(int reg, const QString &contents)
{ {
bool copyToClipboard = false;
bool copyToSelection = false;
if (reg == '"') {
QStringList list = config(ConfigClipboard).toStringList();
copyToClipboard = list.contains(QString("unnamedplus"));
copyToSelection = list.contains(QString("unnamed"));
} else if (reg == '+') {
copyToClipboard = true;
} else if (reg == '*') {
copyToSelection = true;
}
if (copyToClipboard || copyToSelection) {
QClipboard *clipboard = QApplication::clipboard();
bool hasSelection = clipboard->supportsSelection();
if (copyToClipboard || (copyToSelection && !hasSelection))
clipboard->setText(contents, QClipboard::Clipboard);
if (copyToSelection && hasSelection)
clipboard->setText(contents, QClipboard::Selection);
} else {
g.registers[reg].contents = contents; g.registers[reg].contents = contents;
} }
}
QString FakeVimHandler::Private::registerContents(int reg) const QString FakeVimHandler::Private::registerContents(int reg) const
{ {
if (reg == '+')
return QApplication::clipboard()->text(QClipboard::Clipboard);
if (reg == '*') {
QClipboard *clipboard = QApplication::clipboard();
return clipboard->text(clipboard->supportsSelection() ?
QClipboard::Selection : QClipboard::Clipboard);
}
return g.registers[reg].contents; return g.registers[reg].contents;
} }