summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/fakevim/handler.cpp30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/plugins/fakevim/handler.cpp b/src/plugins/fakevim/handler.cpp
index a50105fdf2..fd8734f211 100644
--- a/src/plugins/fakevim/handler.cpp
+++ b/src/plugins/fakevim/handler.cpp
@@ -93,7 +93,10 @@ enum SubMode
enum SubSubMode
{
NoSubSubMode,
- FtSubSubMode, // used for f, F, t, T
+ FtSubSubMode, // used for f, F, t, T
+ MarkSubSubMode, // used for m
+ BackTickSubSubMode, // used for `
+ TickSubSubMode // used for '
};
static const QString ConfigStartOfLine = "startofline";
@@ -187,6 +190,9 @@ public:
QStringList m_commandHistory;
int m_commandHistoryIndex;
+ // marks as lines
+ QHash<int, int> m_marks;
+
// vi style configuration
QHash<QString, QString> m_config;
};
@@ -348,6 +354,20 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
handleFfTt(key);
m_subsubmode = NoSubSubMode;
finishMovement();
+ } else if (m_subsubmode == MarkSubSubMode) {
+ m_marks[key] = m_tc.position();
+ m_subsubmode = NoSubSubMode;
+ } else if (m_subsubmode == BackTickSubSubMode
+ || m_subsubmode == TickSubSubMode) {
+ if (m_marks.contains(key)) {
+ m_tc.setPosition(m_marks[key]);
+ if (m_subsubmode == TickSubSubMode)
+ moveToFirstNonBlankOnLine();
+ finishMovement();
+ } else {
+ showMessage(tr("E20: Mark '%1' not set").arg(text));
+ }
+ m_subsubmode = NoSubSubMode;
} else if (key >= '0' && key <= '9') {
if (key == '0' && m_mvcount.isEmpty()) {
moveToFirstNonBlankOnLine();
@@ -366,6 +386,10 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
m_commandHistoryIndex = m_commandHistory.size() - 1;
}
updateMiniBuffer();
+ } else if (key == '`') {
+ m_subsubmode = BackTickSubSubMode;
+ } else if (key == '\'') {
+ m_subsubmode = TickSubSubMode;
} else if (key == '|') {
m_tc.movePosition(StartOfLine, KeepAnchor);
m_tc.movePosition(Right, KeepAnchor, qMin(count(), rightDist()) - 1);
@@ -484,6 +508,8 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
m_tc.movePosition(Up, KeepAnchor, qMax(count(), 1));
moveToFirstNonBlankOnLine();
finishMovement();
+ } else if (key == 'm') {
+ m_subsubmode = MarkSubSubMode;
} else if (key == 'M') {
m_tc = EDITOR(cursorForPosition(QPoint(0, EDITOR(height()) / 2)));
moveToFirstNonBlankOnLine();
@@ -657,6 +683,8 @@ void FakeVimHandler::Private::handleExMode(int key, const QString &text)
m_mode = CommandMode;
updateMiniBuffer();
} else if (key == Key_Up && isSearchCommand()) {
+ // FIXME: This and the three cases below are wrong as vim
+ // takes only matching entires in the history into account.
if (m_searchHistoryIndex > 0) {
--m_searchHistoryIndex;
m_commandBuffer = m_searchHistory.at(m_searchHistoryIndex);