fakevim: implement 'y' for copying

This commit is contained in:
Martin Aumueller
2008-12-23 21:34:21 +01:00
committed by hjk
parent 0977776f3c
commit 0d5ea46579

View File

@@ -97,6 +97,7 @@ enum SubMode
ChangeSubMode, ChangeSubMode,
DeleteSubMode, DeleteSubMode,
FilterSubMode, FilterSubMode,
YankSubMode,
ZSubMode, ZSubMode,
}; };
@@ -263,6 +264,9 @@ public:
// vi style configuration // vi style configuration
QHash<QString, QString> m_config; QHash<QString, QString> m_config;
// for restoring cursor position
int m_savedPosition;
}; };
FakeVimHandler::Private::Private(FakeVimHandler *parent) FakeVimHandler::Private::Private(FakeVimHandler *parent)
@@ -332,6 +336,7 @@ 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;
m_savedPosition = m_tc.position();
if (m_mode == InsertMode) if (m_mode == InsertMode)
return handleInsertMode(key, text); return handleInsertMode(key, text);
if (m_mode == CommandMode) if (m_mode == CommandMode)
@@ -372,6 +377,10 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
m_submode = NoSubMode; m_submode = NoSubMode;
if (atEol()) if (atEol())
m_tc.movePosition(Left, MoveAnchor, 1); m_tc.movePosition(Left, MoveAnchor, 1);
} else if (m_submode == YankSubMode) {
m_registers[m_register] = m_tc.selectedText();
m_tc.setPosition(m_savedPosition);
m_submode = NoSubMode;
} }
m_mvcount.clear(); m_mvcount.clear();
m_opcount.clear(); m_opcount.clear();
@@ -517,6 +526,11 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
m_tc.movePosition(Down, KeepAnchor, count()); m_tc.movePosition(Down, KeepAnchor, count());
m_registers[m_register] = m_tc.selectedText(); m_registers[m_register] = m_tc.selectedText();
finishMovement("d"); finishMovement("d");
} else if (m_submode == YankSubMode && key == 'y') {
m_tc.movePosition(StartOfLine, MoveAnchor);
m_tc.movePosition(Down, KeepAnchor, count());
m_registers[m_register] = m_tc.selectedText();
finishMovement();
} else if (m_submode == ZSubMode) { } else if (m_submode == ZSubMode) {
if (key == Key_Return) { if (key == Key_Return) {
// cursor line to top of window, cursor on first non-blank // cursor line to top of window, cursor on first non-blank
@@ -779,6 +793,10 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
m_tc.deleteChar(); m_tc.deleteChar();
} }
finishMovement(); finishMovement();
} else if (key == 'y') {
if (atEol())
m_tc.movePosition(Left, MoveAnchor, 1);
m_submode = YankSubMode;
} else if (key == 'z') { } else if (key == 'z') {
m_submode = ZSubMode; m_submode = ZSubMode;
} else if (key == '~' && !atEol()) { } else if (key == '~' && !atEol()) {
@@ -945,7 +963,7 @@ int FakeVimHandler::Private::readLineCode(QString &cmd)
if (c == '\'' && !cmd.isEmpty()) { if (c == '\'' && !cmd.isEmpty()) {
int mark = m_marks.value(cmd.at(0).unicode()); int mark = m_marks.value(cmd.at(0).unicode());
if (!mark) { if (!mark) {
showMessage(tr("E20: Mark '%1' not set").arg(cmd.at(0))); showRedMessage(tr("E20: Mark '%1' not set").arg(cmd.at(0)));
return -1; return -1;
} }
cmd = cmd.mid(1); cmd = cmd.mid(1);