diff --git a/src/plugins/fakevim/fakevimactions.cpp b/src/plugins/fakevim/fakevimactions.cpp index a1fd1e0ea7d..f62d0d3c4e2 100644 --- a/src/plugins/fakevim/fakevimactions.cpp +++ b/src/plugins/fakevim/fakevimactions.cpp @@ -236,6 +236,13 @@ FakeVimSettings *theFakeVimSettings() item->setCheckable(true); 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; } diff --git a/src/plugins/fakevim/fakevimactions.h b/src/plugins/fakevim/fakevimactions.h index e4750fab462..5eb622da6b2 100644 --- a/src/plugins/fakevim/fakevimactions.h +++ b/src/plugins/fakevim/fakevimactions.h @@ -67,7 +67,8 @@ enum FakeVimSettingsCode // other actions ConfigShowMarks, - ConfigPassControlKey + ConfigPassControlKey, + ConfigClipboard }; class FakeVimSettings : public QObject diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index 67669701a1e..d169e9e1c24 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -74,6 +74,7 @@ #include #include +#include #include #include #include @@ -5267,11 +5268,41 @@ RangeMode FakeVimHandler::Private::registerRangeMode(int reg) const void FakeVimHandler::Private::setRegisterContents(int reg, const QString &contents) { - g.registers[reg].contents = 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; + } } 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; }