forked from qt-creator/qt-creator
use ',' as "Escape to Application" schortcut
This commit is contained in:
@@ -84,6 +84,7 @@ enum Mode
|
|||||||
ExMode,
|
ExMode,
|
||||||
SearchForwardMode,
|
SearchForwardMode,
|
||||||
SearchBackwardMode,
|
SearchBackwardMode,
|
||||||
|
PassingMode, // lets keyevents to be passed to the main application
|
||||||
};
|
};
|
||||||
|
|
||||||
enum SubMode
|
enum SubMode
|
||||||
@@ -200,6 +201,7 @@ public:
|
|||||||
public:
|
public:
|
||||||
QTextEdit *m_textedit;
|
QTextEdit *m_textedit;
|
||||||
QPlainTextEdit *m_plaintextedit;
|
QPlainTextEdit *m_plaintextedit;
|
||||||
|
bool m_wasReadOnly; // saves read-only state of document
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FakeVimHandler *q;
|
FakeVimHandler *q;
|
||||||
@@ -284,8 +286,13 @@ FakeVimHandler::Private::Private(FakeVimHandler *parent)
|
|||||||
|
|
||||||
bool FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
|
bool FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
|
||||||
{
|
{
|
||||||
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(ev);
|
int key = ev->key();
|
||||||
int key = keyEvent->key();
|
|
||||||
|
if (m_mode == PassingMode && key != Qt::Key_Control && key != Qt::Key_Shift) {
|
||||||
|
enterCommandMode();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (key == Key_Shift || key == Key_Alt || key == Key_Control
|
if (key == Key_Shift || key == Key_Alt || key == Key_Control
|
||||||
|| key == Key_Alt || key == Key_AltGr || key == Key_Meta)
|
|| key == Key_Alt || key == Key_AltGr || key == Key_Meta)
|
||||||
return false;
|
return false;
|
||||||
@@ -297,11 +304,11 @@ bool FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
|
|||||||
m_tc.movePosition(Right, MoveAnchor, 1);
|
m_tc.movePosition(Right, MoveAnchor, 1);
|
||||||
|
|
||||||
if (key >= Key_A && key <= Key_Z
|
if (key >= Key_A && key <= Key_Z
|
||||||
&& (keyEvent->modifiers() & Qt::ShiftModifier) == 0)
|
&& (ev->modifiers() & Qt::ShiftModifier) == 0)
|
||||||
key += 32;
|
key += 32;
|
||||||
if ((keyEvent->modifiers() & Qt::ControlModifier) != 0)
|
if ((ev->modifiers() & Qt::ControlModifier) != 0)
|
||||||
key += 256;
|
key += 256;
|
||||||
bool handled = handleKey(key, keyEvent->text());
|
bool handled = handleKey(key, ev->text());
|
||||||
|
|
||||||
// We fake vi-style end-of-line behaviour
|
// We fake vi-style end-of-line behaviour
|
||||||
m_fakeEnd = (atEol() && m_mode == CommandMode);
|
m_fakeEnd = (atEol() && m_mode == CommandMode);
|
||||||
@@ -316,8 +323,8 @@ bool FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
|
|||||||
|
|
||||||
bool FakeVimHandler::Private::handleKey(int key, const QString &text)
|
bool FakeVimHandler::Private::handleKey(int key, const QString &text)
|
||||||
{
|
{
|
||||||
qDebug() << "KEY: " << key << text << "POS: " << m_tc.position();
|
//qDebug() << "KEY: " << key << text << "POS: " << m_tc.position();
|
||||||
qDebug() << "\nUNDO: " << m_undoStack << "\nREDO: " << m_redoStack;
|
//qDebug() << "\nUNDO: " << m_undoStack << "\nREDO: " << m_redoStack;
|
||||||
if (m_mode == InsertMode)
|
if (m_mode == InsertMode)
|
||||||
return handleInsertMode(key, text);
|
return handleInsertMode(key, text);
|
||||||
if (m_mode == CommandMode)
|
if (m_mode == CommandMode)
|
||||||
@@ -422,7 +429,9 @@ void FakeVimHandler::Private::updateSelection()
|
|||||||
void FakeVimHandler::Private::updateMiniBuffer()
|
void FakeVimHandler::Private::updateMiniBuffer()
|
||||||
{
|
{
|
||||||
QString msg;
|
QString msg;
|
||||||
if (!m_currentMessage.isEmpty()) {
|
if (m_mode == PassingMode) {
|
||||||
|
msg = "-- PASSING --";
|
||||||
|
} else if (!m_currentMessage.isEmpty()) {
|
||||||
msg = m_currentMessage;
|
msg = m_currentMessage;
|
||||||
m_currentMessage.clear();
|
m_currentMessage.clear();
|
||||||
} else if (m_mode == CommandMode && m_visualMode != NoVisualMode) {
|
} else if (m_mode == CommandMode && m_visualMode != NoVisualMode) {
|
||||||
@@ -580,6 +589,10 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
|
|||||||
} else if (key == '$' || key == Key_End) {
|
} else if (key == '$' || key == Key_End) {
|
||||||
m_tc.movePosition(EndOfLine, KeepAnchor);
|
m_tc.movePosition(EndOfLine, KeepAnchor);
|
||||||
finishMovement();
|
finishMovement();
|
||||||
|
} else if (key == ',') {
|
||||||
|
// FIXME: use some other mechanism
|
||||||
|
m_mode = PassingMode;
|
||||||
|
updateMiniBuffer();
|
||||||
} else if (key == '.') {
|
} else if (key == '.') {
|
||||||
qDebug() << "REPEATING" << m_dotCommand;
|
qDebug() << "REPEATING" << m_dotCommand;
|
||||||
for (int i = count(); --i >= 0; )
|
for (int i = count(); --i >= 0; )
|
||||||
@@ -1482,13 +1495,12 @@ bool FakeVimHandler::eventFilter(QObject *ob, QEvent *ev)
|
|||||||
|
|
||||||
if (ev->type() == QEvent::ShortcutOverride && ob == d->editor()) {
|
if (ev->type() == QEvent::ShortcutOverride && ob == d->editor()) {
|
||||||
QKeyEvent *kev = static_cast<QKeyEvent *>(ev);
|
QKeyEvent *kev = static_cast<QKeyEvent *>(ev);
|
||||||
bool handleIt = kev->key() == Qt::Key_Escape
|
int key = kev->key();
|
||||||
|| (kev->key() == Key_B && kev->modifiers() == Qt::ControlModifier)
|
int mods = kev->modifiers();
|
||||||
|| (kev->key() == Key_F && kev->modifiers() == Qt::ControlModifier)
|
bool handleIt = (key == Qt::Key_Escape)
|
||||||
|| (kev->key() == Key_R && kev->modifiers() == Qt::ControlModifier)
|
|| (key >= Key_A && key <= Key_Z && mods == Qt::ControlModifier);
|
||||||
|| (kev->key() == Key_V && kev->modifiers() == Qt::ControlModifier);
|
if (handleIt && d->handleEvent(kev)) {
|
||||||
if (handleIt) {
|
d->enterCommandMode();
|
||||||
d->handleEvent(kev);
|
|
||||||
ev->accept();
|
ev->accept();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1505,20 +1517,27 @@ void FakeVimHandler::addWidget(QWidget *widget)
|
|||||||
if (QTextEdit *ed = qobject_cast<QTextEdit *>(widget)) {
|
if (QTextEdit *ed = qobject_cast<QTextEdit *>(widget)) {
|
||||||
//ed->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x')));
|
//ed->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x')));
|
||||||
ed->setLineWrapMode(QTextEdit::NoWrap);
|
ed->setLineWrapMode(QTextEdit::NoWrap);
|
||||||
|
d->m_wasReadOnly = ed->isReadOnly();
|
||||||
} else if (QPlainTextEdit *ed = qobject_cast<QPlainTextEdit *>(widget)) {
|
} else if (QPlainTextEdit *ed = qobject_cast<QPlainTextEdit *>(widget)) {
|
||||||
//ed->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x')));
|
//ed->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x')));
|
||||||
ed->setLineWrapMode(QPlainTextEdit::NoWrap);
|
ed->setLineWrapMode(QPlainTextEdit::NoWrap);
|
||||||
|
d->m_wasReadOnly = ed->isReadOnly();
|
||||||
}
|
}
|
||||||
//d->showBlackMessage("vi emulation mode. Hit <Shift+Esc>:q<Return> to quit");
|
|
||||||
d->showBlackMessage("vi emulation mode.");
|
d->showBlackMessage("vi emulation mode.");
|
||||||
d->updateMiniBuffer();
|
d->updateMiniBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FakeVimHandler::removeWidget(QWidget *widget)
|
void FakeVimHandler::removeWidget(QWidget *widget)
|
||||||
{
|
{
|
||||||
|
d->setWidget(widget);
|
||||||
d->showBlackMessage(QString());
|
d->showBlackMessage(QString());
|
||||||
d->updateMiniBuffer();
|
d->updateMiniBuffer();
|
||||||
widget->removeEventFilter(this);
|
widget->removeEventFilter(this);
|
||||||
|
if (QTextEdit *ed = qobject_cast<QTextEdit *>(widget)) {
|
||||||
|
ed->setReadOnly(d->m_wasReadOnly);
|
||||||
|
} else if (QPlainTextEdit *ed = qobject_cast<QPlainTextEdit *>(widget)) {
|
||||||
|
ed->setReadOnly(d->m_wasReadOnly);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FakeVimHandler::handleCommand(QWidget *widget, const QString &cmd)
|
void FakeVimHandler::handleCommand(QWidget *widget, const QString &cmd)
|
||||||
|
|||||||
Reference in New Issue
Block a user