Commit 3fe66ea6 authored by hjk's avatar hjk
Browse files

fakevim: make Alt-V Alt-V a global toggle

parent 285fa4a5
......@@ -114,13 +114,15 @@ FakeVimSettings *theFakeVimSettings()
SavedAction *item = 0;
item = new SavedAction(instance);
item->setText(QObject::tr("Use vim-style editing"));
item->setText(QObject::tr("Toggle vim-style editing"));
item->setSettingsKey("FakeVim", "UseFakeVim");
item->setCheckable(true);
instance->insertItem(ConfigUseFakeVim, item);
item = new SavedAction(instance);
item->setDefaultValue(false);
item->setSettingsKey("FakeVim", "StartOfLine");
item->setCheckable(true);
instance->insertItem(ConfigStartOfLine, item, "startofline", "sol");
item = new SavedAction(instance);
......@@ -136,6 +138,7 @@ FakeVimSettings *theFakeVimSettings()
item = new SavedAction(instance);
item->setDefaultValue(true);
item->setSettingsKey("FakeVim", "HlSearch");
item->setCheckable(true);
instance->insertItem(ConfigHlSearch, item, "hlsearch", "hls");
item = new SavedAction(instance);
......@@ -146,11 +149,13 @@ FakeVimSettings *theFakeVimSettings()
item = new SavedAction(instance);
item->setDefaultValue(false);
item->setSettingsKey("FakeVim", "ExpandTab");
item->setCheckable(true);
instance->insertItem(ConfigExpandTab, item, "expandtab", "et");
item = new SavedAction(instance);
item->setDefaultValue(false);
item->setSettingsKey("FakeVim", "AutoIndent");
item->setCheckable(true);
instance->insertItem(ConfigAutoIndent, item, "autoindent", "ai");
item = new SavedAction(instance);
......
......@@ -211,6 +211,7 @@ public:
bool wantsOverride(QKeyEvent *ev);
void handleExCommand(const QString &cmd);
void installEventFilter();
void setupWidget();
void restoreWidget();
......@@ -393,7 +394,6 @@ public:
int m_savedYankPosition;
int m_desiredColumn;
QPointer<QObject> m_extraData;
int m_cursorWidth;
void recordJump();
......@@ -521,10 +521,14 @@ EventResult FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
return result;
}
void FakeVimHandler::Private::installEventFilter()
{
EDITOR(installEventFilter(q));
}
void FakeVimHandler::Private::setupWidget()
{
enterCommandMode();
EDITOR(installEventFilter(q));
//EDITOR(setCursorWidth(QFontMetrics(ed->font()).width(QChar('x')));
if (m_textedit) {
m_textedit->setLineWrapMode(QTextEdit::NoWrap);
......@@ -548,7 +552,7 @@ void FakeVimHandler::Private::setupWidget()
updateSelection();
}
showBlackMessage("vi emulation mode. Type :q to leave. Use , Ctrl-R to trigger run.");
//showBlackMessage("vi emulation mode. Type :q to leave. Use , Ctrl-R to trigger run.");
updateMiniBuffer();
}
......@@ -556,8 +560,10 @@ void FakeVimHandler::Private::restoreWidget()
{
//showBlackMessage(QString());
//updateMiniBuffer();
EDITOR(removeEventFilter(q));
//EDITOR(removeEventFilter(q));
EDITOR(setReadOnly(m_wasReadOnly));
EDITOR(setCursorWidth(m_cursorWidth));
EDITOR(setOverwriteMode(false));
if (m_visualMode == VisualLineMode) {
m_tc = EDITOR(textCursor());
......@@ -2453,7 +2459,6 @@ void FakeVimHandler::Private::quit()
q->quitRequested();
}
void FakeVimHandler::Private::recordJump()
{
m_jumpListUndo.append(position());
......@@ -2461,6 +2466,7 @@ void FakeVimHandler::Private::recordJump()
UNDO_DEBUG("jumps: " << m_jumpListUndo);
}
///////////////////////////////////////////////////////////////////////
//
// FakeVimHandler
......@@ -2478,7 +2484,9 @@ FakeVimHandler::~FakeVimHandler()
bool FakeVimHandler::eventFilter(QObject *ob, QEvent *ev)
{
if (ev->type() == QEvent::KeyPress && ob == d->editor()) {
bool active = theFakeVimSetting(ConfigUseFakeVim)->value().toBool();
if (active && ev->type() == QEvent::KeyPress && ob == d->editor()) {
QKeyEvent *kev = static_cast<QKeyEvent *>(ev);
KEY_DEBUG("KEYPRESS" << kev->key());
EventResult res = d->handleEvent(kev);
......@@ -2489,7 +2497,7 @@ bool FakeVimHandler::eventFilter(QObject *ob, QEvent *ev)
return res == EventHandled;
}
if (ev->type() == QEvent::ShortcutOverride && ob == d->editor()) {
if (active && ev->type() == QEvent::ShortcutOverride && ob == d->editor()) {
QKeyEvent *kev = static_cast<QKeyEvent *>(ev);
if (d->wantsOverride(kev)) {
KEY_DEBUG("OVERRIDING SHORTCUT" << kev->key());
......@@ -2503,6 +2511,11 @@ bool FakeVimHandler::eventFilter(QObject *ob, QEvent *ev)
return QObject::eventFilter(ob, ev);
}
void FakeVimHandler::installEventFilter()
{
d->installEventFilter();
}
void FakeVimHandler::setupWidget()
{
d->setupWidget();
......@@ -2518,11 +2531,6 @@ void FakeVimHandler::handleCommand(const QString &cmd)
d->handleExCommand(cmd);
}
void FakeVimHandler::setConfigValue(int code, const QVariant &value)
{
theFakeVimSetting(code)->setValue(value);
}
void FakeVimHandler::quit()
{
d->quit();
......@@ -2538,15 +2546,5 @@ QWidget *FakeVimHandler::widget()
return d->editor();
}
void FakeVimHandler::setExtraData(QObject *data)
{
d->m_extraData = data;
}
QObject *FakeVimHandler::extraData() const
{
return d->m_extraData;
}
} // namespace Internal
} // namespace FakeVim
......@@ -48,18 +48,16 @@ public:
QWidget *widget();
void setExtraData(QObject *data);
QObject *extraData() const;
public slots:
void setCurrentFileName(const QString &fileName);
// This executes an "ex" style command taking context
// information from widget;
void handleCommand(const QString &cmd);
void setConfigValue(int code, const QVariant &value);
void quit();
void installEventFilter();
// Convenience
void setupWidget();
void restoreWidget();
......
......@@ -52,7 +52,6 @@
#include <texteditor/completionsupport.h>
#include <texteditor/itexteditor.h>
#include <texteditor/texteditorconstants.h>
#include <texteditor/interactionsettings.h>
#include <texteditor/tabsettings.h>
#include <texteditor/texteditorsettings.h>
#include <texteditor/textblockiterator.h>
......@@ -229,9 +228,8 @@ private slots:
void editorOpened(Core::IEditor *);
void editorAboutToClose(Core::IEditor *);
void installHandlerOnCurrentEditor();
void installHandler(Core::IEditor *editor);
void removeHandler();
void setUseFakeVim(const QVariant &value);
void quit();
void triggerCompletions();
void showSettingsDialog();
......@@ -244,8 +242,8 @@ private slots:
private:
FakeVimPlugin *q;
QAction *m_installHandlerAction;
FakeVimOptionPage *m_fakeVimOptionsPage;
QHash<Core::IEditor *, FakeVimHandler *> m_editorToHandler;
};
} // namespace Internal
......@@ -254,7 +252,6 @@ private:
FakeVimPluginPrivate::FakeVimPluginPrivate(FakeVimPlugin *plugin)
{
q = plugin;
m_installHandlerAction = 0;
m_fakeVimOptionsPage = 0;
}
......@@ -278,15 +275,12 @@ bool FakeVimPluginPrivate::initialize()
QList<int> globalcontext;
globalcontext << Core::Constants::C_GLOBAL_ID;
m_installHandlerAction = new QAction(this);
m_installHandlerAction->setText(tr("Set vi-Style Keyboard Action Handler"));
m_fakeVimOptionsPage = new FakeVimOptionPage;
q->addObject(m_fakeVimOptionsPage);
theFakeVimSettings()->readSettings(Core::ICore::instance()->settings());
Core::Command *cmd = 0;
cmd = actionManager->registerAction(m_installHandlerAction,
cmd = actionManager->registerAction(theFakeVimSetting(ConfigUseFakeVim),
Constants::INSTALL_HANDLER, globalcontext);
cmd->setDefaultKeySequence(QKeySequence(Constants::INSTALL_KEY));
......@@ -294,9 +288,6 @@ bool FakeVimPluginPrivate::initialize()
actionManager->actionContainer(Core::Constants::M_EDIT_ADVANCED);
advancedMenu->addAction(cmd, Core::Constants::G_EDIT_EDITOR);
connect(m_installHandlerAction, SIGNAL(triggered()),
this, SLOT(installHandlerOnCurrentEditor()));
// EditorManager
QObject *editorManager = Core::ICore::instance()->editorManager();
connect(editorManager, SIGNAL(editorAboutToClose(Core::IEditor*)),
......@@ -306,6 +297,8 @@ bool FakeVimPluginPrivate::initialize()
connect(theFakeVimSetting(SettingsDialog), SIGNAL(triggered()),
this, SLOT(showSettingsDialog()));
connect(theFakeVimSetting(ConfigUseFakeVim), SIGNAL(valueChanged(QVariant)),
this, SLOT(setUseFakeVim(QVariant)));
return true;
}
......@@ -315,7 +308,7 @@ void FakeVimPluginPrivate::showSettingsDialog()
Core::ICore::instance()->showOptionsDialog("FakeVim", "General");
}
void FakeVimPluginPrivate::installHandler(Core::IEditor *editor)
void FakeVimPluginPrivate::editorOpened(Core::IEditor *editor)
{
if (!editor)
return;
......@@ -328,14 +321,18 @@ void FakeVimPluginPrivate::installHandler(Core::IEditor *editor)
if (!qobject_cast<QTextEdit *>(widget) && !qobject_cast<QPlainTextEdit *>(widget))
return;
//qDebug() << "OPENING: " << editor << editor->widget()
// << "MODE: " << theFakeVimSetting(ConfigUseFakeVim)->value();
FakeVimHandler *handler = new FakeVimHandler(widget, widget);
m_editorToHandler[editor] = handler;
connect(handler, SIGNAL(extraInformationChanged(QString)),
this, SLOT(showExtraInformation(QString)));
connect(handler, SIGNAL(commandBufferChanged(QString)),
this, SLOT(showCommandBuffer(QString)));
connect(handler, SIGNAL(quitRequested()),
this, SLOT(removeHandler()), Qt::QueuedConnection);
this, SLOT(quit()), Qt::QueuedConnection);
connect(handler, SIGNAL(writeFileRequested(bool*,QString,QString)),
this, SLOT(writeFile(bool*,QString,QString)));
connect(handler, SIGNAL(selectionChanged(QList<QTextEdit::ExtraSelection>)),
......@@ -347,14 +344,34 @@ void FakeVimPluginPrivate::installHandler(Core::IEditor *editor)
connect(handler, SIGNAL(completionRequested()),
this, SLOT(triggerCompletions()));
handler->setupWidget();
handler->setExtraData(editor);
handler->setCurrentFileName(editor->file()->fileName());
handler->installEventFilter();
}
void FakeVimPluginPrivate::installHandlerOnCurrentEditor()
void FakeVimPluginPrivate::editorAboutToClose(Core::IEditor *editor)
{
installHandler(EditorManager::instance()->currentEditor());
//qDebug() << "CLOSING: " << editor << editor->widget();
m_editorToHandler.remove(editor);
}
void FakeVimPluginPrivate::setUseFakeVim(const QVariant &value)
{
bool on = value.toBool();
if (on) {
Core::EditorManager::instance()->showEditorStatusBar(
QLatin1String(Constants::MINI_BUFFER),
"vi emulation mode. Type :q to leave. Use , Ctrl-R to trigger run.",
tr("Quit FakeVim"), this, SLOT(quit()));
foreach (Core::IEditor *editor, m_editorToHandler.keys())
m_editorToHandler[editor]->setupWidget();
//qDebug() << "SETTING" << m_editorToHandler.keys();
} else {
Core::EditorManager::instance()->hideEditorStatusBar(
QLatin1String(Constants::MINI_BUFFER));
foreach (Core::IEditor *editor, m_editorToHandler.keys())
m_editorToHandler[editor]->restoreWidget();
//qDebug() << "REMOVING" << m_editorToHandler.keys();
}
}
void FakeVimPluginPrivate::triggerCompletions()
......@@ -377,7 +394,7 @@ void FakeVimPluginPrivate::writeFile(bool *handled,
if (!handler)
return;
Core::IEditor *editor = qobject_cast<Core::IEditor *>(handler->extraData());
Core::IEditor *editor = m_editorToHandler.key(handler);
if (editor && editor->file()->fileName() == fileName) {
// Handle that as a special case for nicer interaction with core
Core::IFile *file = editor->file();
......@@ -467,42 +484,21 @@ void FakeVimPluginPrivate::indentRegion(int *amount, int beginLine, int endLine,
} while (cur != end);
}
void FakeVimPluginPrivate::removeHandler()
{
if (FakeVimHandler *handler = qobject_cast<FakeVimHandler *>(sender())) {
handler->restoreWidget();
handler->deleteLater();
}
Core::EditorManager::instance()->hideEditorStatusBar(
QLatin1String(Constants::MINI_BUFFER));
}
void FakeVimPluginPrivate::editorOpened(Core::IEditor *editor)
void FakeVimPluginPrivate::quit()
{
//qDebug() << "OPENING: " << editor << editor->widget();
QSettings *s = ICore::instance()->settings();
bool automatic = s->value("textInteractionSettings/UseVim").toBool();
if (automatic)
installHandler(editor);
}
void FakeVimPluginPrivate::editorAboutToClose(Core::IEditor *editor)
{
//qDebug() << "CLOSING: " << editor << editor->widget();
Q_UNUSED(editor);
//if (FakeVimHandler *handler = qobject_cast<FakeVimHandler *>(sender())) {
// handler->restoreWidget();
// handler->deleteLater();
//}
setUseFakeVim(false);
}
void FakeVimPluginPrivate::showCommandBuffer(const QString &contents)
{
FakeVimHandler *handler = qobject_cast<FakeVimHandler *>(sender());
if (handler) {
//qDebug() << "SHOW COMMAND BUFFER" << contents;
Core::EditorManager::instance()->showEditorStatusBar(
QLatin1String(Constants::MINI_BUFFER), contents,
tr("Quit FakeVim"), handler, SLOT(quit()));
} else {
qDebug() << "\nNO HANDLER\n";
}
//qDebug() << "SHOW COMMAND BUFFER" << contents;
Core::EditorManager::instance()->showEditorStatusBar(
QLatin1String(Constants::MINI_BUFFER), contents,
tr("Quit FakeVim"), this, SLOT(quit()));
}
void FakeVimPluginPrivate::showExtraInformation(const QString &text)
......
......@@ -8,4 +8,4 @@ DESTDIR = ..
SOURCES += ../app.cpp
QT += network
message("this says <foo & bar>")
mesage("this says <foo & bar>")
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment