aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorLukas Holecek <hluk@email.cz>2014-11-17 15:32:33 +0100
committerhjk <hjk121@nokiamail.com>2014-11-18 10:03:41 +0100
commit0e83172b0b0d7890c02765653e3dbe4616c48c62 (patch)
tree3bedb3a0d04e2cbafd91cb53b3d92ea56d9a0dd3 /src/plugins
parent5881f6cb7908c72065f86c579573ff046e1bb826 (diff)
FakeVim: Indent block correctly
In situation: void f() { // Cursor is HERE. } the code after ">i{" command is indented as (with shiftwidth=4): void f() { // Cursor is HERE. } Change-Id: I48283c91c32fc407bbdb24349f2491461e401ee9 Reviewed-by: hjk <hjk121@nokiamail.com>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/fakevim/fakevim_test.cpp53
-rw-r--r--src/plugins/fakevim/fakevimhandler.cpp29
2 files changed, 75 insertions, 7 deletions
diff --git a/src/plugins/fakevim/fakevim_test.cpp b/src/plugins/fakevim/fakevim_test.cpp
index 9dd0bd82c8..adee06f428 100644
--- a/src/plugins/fakevim/fakevim_test.cpp
+++ b/src/plugins/fakevim/fakevim_test.cpp
@@ -1829,6 +1829,59 @@ void FakeVimPlugin::test_vim_indent()
data.setText("abc");
KEYS(">>", "\t\t abc");
INTEGRITY(false);
+
+ // indent inner block
+ data.doCommand("set expandtab");
+ data.doCommand("set shiftwidth=2");
+ data.setText("int main()" N
+ "{" N
+ "int i = 0;" N
+ X "return i;" N
+ "}" N
+ "");
+ KEYS(">i{",
+ "int main()" N
+ "{" N
+ " " X "int i = 0;" N
+ " return i;" N
+ "}" N
+ "");
+ KEYS(">i}",
+ "int main()" N
+ "{" N
+ " " X "int i = 0;" N
+ " return i;" N
+ "}" N
+ "");
+ KEYS("<i}",
+ "int main()" N
+ "{" N
+ " " X "int i = 0;" N
+ " return i;" N
+ "}" N
+ "");
+
+ data.doCommand("set expandtab");
+ data.doCommand("set shiftwidth=2");
+ data.setText("int main() {" N
+ "return i;" N
+ X "}" N
+ "");
+ KEYS("l>i{",
+ "int main() {" N
+ " " X "return i;" N
+ "}" N
+ "");
+ KEYS("l>i}",
+ "int main() {" N
+ " " X "return i;" N
+ "}" N
+ "");
+ KEYS("l<i}",
+ "int main() {" N
+ " " X "return i;" N
+ "}" N
+ "");
}
void FakeVimPlugin::test_vim_marks()
diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index 7250b0e1a9..68cc18342a 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -3377,12 +3377,17 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommandMovement)
|| g.submode == YankSubMode
|| g.submode == InvertCaseSubMode
|| g.submode == DownCaseSubMode
- || g.submode == UpCaseSubMode) {
+ || g.submode == UpCaseSubMode
+ || g.submode == IndentSubMode
+ || g.submode == ShiftLeftSubMode
+ || g.submode == ShiftRightSubMode)
+ {
fixSelection();
- if (g.submode != InvertCaseSubMode
- && g.submode != DownCaseSubMode
- && g.submode != UpCaseSubMode) {
+ if (g.submode == ChangeSubMode
+ || g.submode == DeleteSubMode
+ || g.submode == YankSubMode)
+ {
yankText(currentRange(), m_register);
}
}
@@ -8133,16 +8138,26 @@ bool FakeVimHandler::Private::selectBlockTextObject(bool inner,
if (p2 == -1)
return false;
- if (inner)
+ g.movetype = MoveExclusive;
+
+ if (inner) {
p1 += sleft.size();
- else
+ bool moveStart = characterAt(p1) == ParagraphSeparator;
+ bool moveEnd = isFirstNonBlankOnLine(p2);
+ if (moveStart)
+ ++p1;
+ if (moveEnd)
+ p2 = blockAt(p2).position() - 1;
+ if (moveStart && moveEnd)
+ g.movetype = MoveLineWise;
+ } else {
p2 -= sright.size() - 2;
+ }
if (isVisualMode())
--p2;
setAnchorAndPosition(p1, p2);
- g.movetype = MoveExclusive;
return true;
}