aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Praschan <tom@praschan.de>2021-02-06 20:09:23 +0100
committerTom Praschan <tom@praschan.de>2021-02-09 08:56:47 +0000
commit509d5895f854f53c7fee1b4be1cbc10839399063 (patch)
treed727799ff5fe55e1be1cffc28919693292698ce9
parentb6f26ed67a1db02898b7d9fd871022038c64fa17 (diff)
FakeVim: Merge comments when joining lines with 'J'
This is the default behavior in vim as well Change-Id: Ia4d56e3cfc7f91fc353078daefaabeada9a86bed Reviewed-by: hjk <hjk@qt.io>
-rw-r--r--doc/qtcreator/src/editors/creator-only/creator-fakevim.qdoc2
-rw-r--r--src/plugins/fakevim/fakevim_test.cpp11
-rw-r--r--src/plugins/fakevim/fakevimactions.cpp1
-rw-r--r--src/plugins/fakevim/fakevimactions.h1
-rw-r--r--src/plugins/fakevim/fakevimhandler.cpp19
5 files changed, 34 insertions, 0 deletions
diff --git a/doc/qtcreator/src/editors/creator-only/creator-fakevim.qdoc b/doc/qtcreator/src/editors/creator-only/creator-fakevim.qdoc
index 7222d9235e..7ac4bea02d 100644
--- a/doc/qtcreator/src/editors/creator-only/creator-fakevim.qdoc
+++ b/doc/qtcreator/src/editors/creator-only/creator-fakevim.qdoc
@@ -108,6 +108,8 @@
\li \c :undo, \c :redo
\li \c :normal
\li \c :<, \c :>
+ \li \c{set formatoptions=}, see \c{:h fo-table} in the Vim documentation.
+ Currently supported letters: \c fo-j
\endlist
\section2 Plugin Emulation
diff --git a/src/plugins/fakevim/fakevim_test.cpp b/src/plugins/fakevim/fakevim_test.cpp
index b5fd9c4169..14f8d7dd31 100644
--- a/src/plugins/fakevim/fakevim_test.cpp
+++ b/src/plugins/fakevim/fakevim_test.cpp
@@ -4071,6 +4071,17 @@ void FakeVimPlugin::test_vim_command_J()
KEYS("3J", lmid(0, 5) + " " + lmid(5, 1) + " " + lmid(6, 1).mid(4) + "| " + lmid(7));
KEYS("uu", lmid(0, 4) + "\nint |main(int argc, char *argv[])\n" + lmid(5));
COMMAND("redo", lmid(0, 4) + "\nint |main(int argc, char *argv[]) " + lmid(5));
+
+ // Joining comments
+ data.doCommand("set formatoptions=f");
+ data.setText("// abc" N "// def");
+ KEYS("J", "// abc def");
+
+ data.setText("/*" N X "* abc" N "* def" N "*/");
+ KEYS("J", "/*" N "* abc def" N "*/");
+
+ data.setText("# abc" N "# def");
+ KEYS("J", "# abc def");
}
void FakeVimPlugin::test_vim_command_put_at_eol()
diff --git a/src/plugins/fakevim/fakevimactions.cpp b/src/plugins/fakevim/fakevimactions.cpp
index edd40a7bea..c32ca25a57 100644
--- a/src/plugins/fakevim/fakevimactions.cpp
+++ b/src/plugins/fakevim/fakevimactions.cpp
@@ -113,6 +113,7 @@ FakeVimSettings::FakeVimSettings()
createAction(ConfigBackspace, QString("indent,eol,start"), "ConfigBackspace", "bs");
createAction(ConfigIsKeyword, QString("@,48-57,_,192-255,a-z,A-Z"), "IsKeyword", "isk");
createAction(ConfigClipboard, QString(), "Clipboard", "cb");
+ createAction(ConfigFormatOptions, QString(), "formatoptions", "fo");
// Emulated plugins
createAction(ConfigEmulateVimCommentary, false, "commentary");
diff --git a/src/plugins/fakevim/fakevimactions.h b/src/plugins/fakevim/fakevimactions.h
index 95f1ff4dd2..828ad5204d 100644
--- a/src/plugins/fakevim/fakevimactions.h
+++ b/src/plugins/fakevim/fakevimactions.h
@@ -107,6 +107,7 @@ enum FakeVimSettingsCode
ConfigShowCmd,
ConfigScrollOff,
ConfigRelativeNumber,
+ ConfigFormatOptions,
// Plugin emulation
ConfigEmulateVimCommentary,
diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index a442b1b938..fe3f2262e5 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -7615,6 +7615,13 @@ void FakeVimHandler::Private::joinLines(int count, bool preserveSpace)
{
int pos = position();
const int blockNumber = m_cursor.blockNumber();
+
+ const QString currentLine = lineContents(blockNumber + 1);
+ const bool startingLineIsComment
+ = currentLine.contains(QRegularExpression("^\\s*\\/\\/")) // Cpp-style
+ || currentLine.contains(QRegularExpression("^\\s*\\/?\\*")) // C-style
+ || currentLine.contains(QRegularExpression("^\\s*#")); // Python/Shell-style
+
for (int i = qMax(count - 2, 0); i >= 0 && blockNumber < document()->blockCount(); --i) {
moveBehindEndOfLine();
pos = position();
@@ -7625,6 +7632,18 @@ void FakeVimHandler::Private::joinLines(int count, bool preserveSpace)
} else {
while (characterAtCursor() == ' ' || characterAtCursor() == '\t')
moveRight();
+
+ // If the line we started from is a comment, remove the comment string from the next line
+ if (startingLineIsComment && config(ConfigFormatOptions).toString().contains('f')) {
+ if (characterAtCursor() == '/' && characterAt(position() + 1) == '/')
+ moveRight(2);
+ else if (characterAtCursor() == '*' || characterAtCursor() == '#')
+ moveRight(1);
+
+ if (characterAtCursor() == ' ')
+ moveRight();
+ }
+
m_cursor.insertText(QString(' '));
}
}