From d0dcd4063576a55960ad8251ad2da4a45b60c96e Mon Sep 17 00:00:00 2001 From: Lukas Holecek Date: Thu, 26 Jul 2012 21:46:38 +0200 Subject: [PATCH] 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 --- src/plugins/fakevim/fakevimactions.cpp | 7 ++++++ src/plugins/fakevim/fakevimactions.h | 3 ++- src/plugins/fakevim/fakevimhandler.cpp | 33 +++++++++++++++++++++++++- 3 files changed, 41 insertions(+), 2 deletions(-) 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; }