diff options
author | Tom Praschan <tom@praschan.de> | 2021-02-06 20:09:23 +0100 |
---|---|---|
committer | Tom Praschan <tom@praschan.de> | 2021-02-09 08:56:47 +0000 |
commit | 509d5895f854f53c7fee1b4be1cbc10839399063 (patch) | |
tree | d727799ff5fe55e1be1cffc28919693292698ce9 | |
parent | b6f26ed67a1db02898b7d9fd871022038c64fa17 (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.qdoc | 2 | ||||
-rw-r--r-- | src/plugins/fakevim/fakevim_test.cpp | 11 | ||||
-rw-r--r-- | src/plugins/fakevim/fakevimactions.cpp | 1 | ||||
-rw-r--r-- | src/plugins/fakevim/fakevimactions.h | 1 | ||||
-rw-r--r-- | src/plugins/fakevim/fakevimhandler.cpp | 19 |
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(' ')); } } |