forked from qt-creator/qt-creator
improve range parsing for ex commands
This commit is contained in:
@@ -134,7 +134,7 @@ public:
|
||||
int columnsOnScreen() const;
|
||||
int cursorLineInDocument() const;
|
||||
int cursorColumnInDocument() const;
|
||||
int linesInDocument() const { return m_tc.document()->blockCount(); }
|
||||
int linesInDocument() const;
|
||||
void scrollToLineInDocument(int line);
|
||||
|
||||
void moveToFirstNonBlankOnLine();
|
||||
@@ -143,6 +143,9 @@ public:
|
||||
void handleFfTt(int key);
|
||||
void handleCommand(const QString &cmd);
|
||||
|
||||
// helper function for handleCommand. return 1 based line index.
|
||||
int readLineCode(QString &cmd);
|
||||
|
||||
FakeVimHandler *q;
|
||||
Mode m_mode;
|
||||
SubMode m_submode;
|
||||
@@ -663,14 +666,70 @@ void FakeVimHandler::Private::handleExMode(int key, const QString &text)
|
||||
}
|
||||
}
|
||||
|
||||
void FakeVimHandler::Private::handleCommand(const QString &cmd)
|
||||
// 1 based.
|
||||
int FakeVimHandler::Private::readLineCode(QString &cmd)
|
||||
{
|
||||
static QRegExp reGoto("^(\\d+)$");
|
||||
//qDebug() << "CMD: " << cmd;
|
||||
if (cmd.isEmpty())
|
||||
return -1;
|
||||
QChar c = cmd.at(0);
|
||||
cmd = cmd.mid(1);
|
||||
if (c == '.')
|
||||
return cursorLineInDocument() + 1;
|
||||
if (c == '$')
|
||||
return linesInDocument();
|
||||
if (c == '-') {
|
||||
int n = readLineCode(cmd);
|
||||
return cursorLineInDocument() + 1 - (n == -1 ? 1 : n);
|
||||
}
|
||||
if (c == '+') {
|
||||
int n = readLineCode(cmd);
|
||||
return cursorLineInDocument() + 1 + (n == -1 ? 1 : n);
|
||||
}
|
||||
if (c.isDigit()) {
|
||||
int n = c.unicode() - '0';
|
||||
while (!cmd.isEmpty()) {
|
||||
c = cmd.at(0);
|
||||
if (!c.isDigit())
|
||||
break;
|
||||
cmd = cmd.mid(1);
|
||||
n = n * 10 + (c.unicode() - '0');
|
||||
}
|
||||
//qDebug() << "N: " << n;
|
||||
return n;
|
||||
}
|
||||
// not parsed
|
||||
cmd = c + cmd;
|
||||
return -1;
|
||||
}
|
||||
|
||||
void FakeVimHandler::Private::handleCommand(const QString &cmd0)
|
||||
{
|
||||
QString cmd = cmd0;
|
||||
if (cmd.startsWith("%"))
|
||||
cmd = "1,$" + cmd.mid(1);
|
||||
|
||||
int beginLine = 0;
|
||||
int endLine = linesInDocument();
|
||||
|
||||
int line = readLineCode(cmd);
|
||||
if (line != -1)
|
||||
beginLine = line;
|
||||
|
||||
if (cmd.startsWith(',')) {
|
||||
cmd = cmd.mid(1);
|
||||
line = readLineCode(cmd);
|
||||
if (line != -1)
|
||||
endLine = line;
|
||||
}
|
||||
|
||||
//qDebug() << "RANGE: " << beginLine << endLine << cmd << cmd0;
|
||||
|
||||
static QRegExp reWrite("^w!?( (.*))?$");
|
||||
if (reGoto.indexIn(cmd) != -1) {
|
||||
int n = reGoto.cap(1).toInt();
|
||||
|
||||
if (cmd.isEmpty()) {
|
||||
m_tc.setPosition(m_tc.block().document()
|
||||
->findBlockByNumber(n - 1).position());
|
||||
->findBlockByNumber(beginLine - 1).position());
|
||||
showMessage(QString());
|
||||
} else if (cmd == "q!" || cmd == "q") {
|
||||
if (m_textedit)
|
||||
@@ -705,6 +764,8 @@ void FakeVimHandler::Private::handleCommand(const QString &cmd)
|
||||
QTextStream ts(&file);
|
||||
EDITOR(setPlainText(ts.readAll()));
|
||||
showMessage(QString());
|
||||
} else {
|
||||
showMessage("E492: Not an editor command: " + cmd0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -878,6 +939,11 @@ int FakeVimHandler::Private::cursorColumnInDocument() const
|
||||
return m_tc.position() - m_tc.block().position();
|
||||
}
|
||||
|
||||
int FakeVimHandler::Private::linesInDocument() const
|
||||
{
|
||||
return m_tc.isNull() ? 0 : m_tc.document()->blockCount();
|
||||
}
|
||||
|
||||
void FakeVimHandler::Private::scrollToLineInDocument(int line)
|
||||
{
|
||||
// FIXME: works only for QPlainTextEdit
|
||||
|
||||
Reference in New Issue
Block a user