fakevim: improve selection interaction with main text editor

This commit is contained in:
hjk
2010-08-11 13:41:54 +02:00
parent 16b5f78ced
commit 495c3f52fa
5 changed files with 67 additions and 7 deletions

View File

@@ -733,6 +733,7 @@ public:
void selectQuotedStringTextObject(bool inner, int type);
Q_SLOT void importSelection();
void exportSelection();
void insertInInsertMode(const QString &text);
public:
@@ -1050,20 +1051,20 @@ EventResult FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
// key = shift(key);
//}
QTC_ASSERT(m_mode == InsertMode || m_mode == ReplaceMode
|| !m_tc.atBlockEnd() || m_tc.block().length() <= 1,
qDebug() << "Cursor at EOL before key handler");
//QTC_ASSERT(m_mode == InsertMode || m_mode == ReplaceMode
// || !m_tc.atBlockEnd() || m_tc.block().length() <= 1,
// qDebug() << "Cursor at EOL before key handler");
EventResult result = handleKey(Input(key, mods, ev->text()));
// the command might have destroyed the editor
// The command might have destroyed the editor.
if (m_textedit || m_plaintextedit) {
// We fake vi-style end-of-line behaviour
m_fakeEnd = atEndOfLine() && m_mode == CommandMode && !isVisualBlockMode();
QTC_ASSERT(m_mode == InsertMode || m_mode == ReplaceMode
|| !m_tc.atBlockEnd() || m_tc.block().length() <= 1,
qDebug() << "Cursor at EOL after key handler");
//QTC_ASSERT(m_mode == InsertMode || m_mode == ReplaceMode
// || !m_tc.atBlockEnd() || m_tc.block().length() <= 1,
// qDebug() << "Cursor at EOL after key handler");
if (m_fakeEnd)
moveLeft();
@@ -1075,6 +1076,8 @@ EventResult FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
if (hasConfig(ConfigShowMarks))
updateSelection();
exportSelection();
return result;
}
@@ -1100,6 +1103,41 @@ void FakeVimHandler::Private::setupWidget()
updateCursor();
}
void FakeVimHandler::Private::exportSelection()
{
if (!hasConfig(ConfigExportSelection))
return;
// FIXME: That's hacky and does not work for block selections
// and the clipboard is not filled if the selections are updated
// using the keyboard.
QTextCursor tc = EDITOR(textCursor());
int pos = position();
int anc = anchor();
if (m_visualMode == VisualBlockMode) {
//tc.setPosition(anc, MoveAnchor);
//tc.setPosition(pos, KeepAnchor);
//EDITOR(setTextCursor(tc));
} else if (m_visualMode == VisualLineMode) {
int posLine = lineForPosition(pos);
int ancLine = lineForPosition(anc);
if (anc < pos) {
pos = lastPositionInLine(posLine);
anc = firstPositionInLine(ancLine);
} else {
pos = firstPositionInLine(posLine);
anc = lastPositionInLine(ancLine);
}
tc.setPosition(anc, MoveAnchor);
tc.setPosition(pos, KeepAnchor);
EDITOR(setTextCursor(tc));
} else if (m_visualMode == VisualCharMode) {
tc.setPosition(anc, MoveAnchor);
tc.setPosition(pos, KeepAnchor);
EDITOR(setTextCursor(tc));
}
}
void FakeVimHandler::Private::importSelection()
{
QTextCursor tc = EDITOR(textCursor());
@@ -1130,6 +1168,7 @@ void FakeVimHandler::Private::importSelection()
tc.clearSelection();
EDITOR(setTextCursor(tc));
updateSelection();
exportSelection();
}
void FakeVimHandler::Private::updateEditor()