From 3b1ddcd836be1a4a6b7553f0659ad54653ffeafc Mon Sep 17 00:00:00 2001 From: Jason May Date: Sun, 8 May 2016 14:36:41 -0700 Subject: [PATCH 1/3] Prevent "too many nested groupings" xcode crash on undo --- XVim/XVimReplaceEvaluator.m | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/XVim/XVimReplaceEvaluator.m b/XVim/XVimReplaceEvaluator.m index a5564a12..3697d90d 100644 --- a/XVim/XVimReplaceEvaluator.m +++ b/XVim/XVimReplaceEvaluator.m @@ -59,17 +59,21 @@ - (void)repeatBlockText{ - (void)didEndHandler { [super didEndHandler]; - NSUndoManager *undoManager = [[self sourceView] undoManager]; - [undoManager endUndoGrouping]; - [undoManager setGroupsByEvent:YES]; + if (!_oneCharMode) { + NSUndoManager *undoManager = [[self sourceView] undoManager]; + [undoManager endUndoGrouping]; + [undoManager setGroupsByEvent:YES]; + } } - (void)becameHandler { [super becameHandler]; - NSUndoManager *undoManager = [[self sourceView] undoManager]; - [undoManager setGroupsByEvent:NO]; - [undoManager beginUndoGrouping]; + if (!_oneCharMode) { + NSUndoManager *undoManager = [[self sourceView] undoManager]; + [undoManager setGroupsByEvent:NO]; + [undoManager beginUndoGrouping]; + } } - (XVimEvaluator*)eval:(XVimKeyStroke*)keyStroke{ From d000689ecd864ff2d40c6d661136658c8a677484 Mon Sep 17 00:00:00 2001 From: Jason May Date: Wed, 11 May 2016 22:18:15 -0700 Subject: [PATCH 2/3] Fix the deeper cause (state corruption) Turns out if it's not a printable key, it doesn't trigger the handler for grouping. --- XVim/Test/XVimTester+Issues.m | 4 +++- XVim/XVimReplaceEvaluator.m | 18 +++++++----------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/XVim/Test/XVimTester+Issues.m b/XVim/Test/XVimTester+Issues.m index ccc1b260..564ad480 100644 --- a/XVim/Test/XVimTester+Issues.m +++ b/XVim/Test/XVimTester+Issues.m @@ -61,7 +61,8 @@ - (NSArray*)issues_testcases{ static NSString* issue_865 = @"\n" // 0 @"\n" // 1 @"ccc\n";// 2 - + static NSString* issue_951 = @"aaaa\n"; + return [NSArray arrayWithObjects: XVimMakeTestCase(text0, 0, 0, @"qadwpq", @"baaa bb ccc\n", 4, 0), // Issue #396 XVimMakeTestCase(text1, 24, 0, @":inoremap C-e> C-o>$i", text1 , 10, 0), // Issue #416 @@ -89,6 +90,7 @@ - (NSArray*)issues_testcases{ XVimMakeTestCase(issue_865 , 2, 0, @"2gg", issue_865, 1, 0), // Issue #865 XVimMakeTestCase(issue_865 , 2, 0, @"2G", issue_865, 1, 0), // Issue #865 XVimMakeTestCase(issue_865 , 2, 0, @"G", issue_865, 6, 0), // Issue #865 + XVimMakeTestCase(issue_951 , 0, 0, @"ru", issue_951, 0, 0), // Issue #951 XVimMakeTestCase(text0, 0, 0, @":nmap backspace> l", text0, 2, 0), // Issue #844 mapping nil]; diff --git a/XVim/XVimReplaceEvaluator.m b/XVim/XVimReplaceEvaluator.m index 3697d90d..6a93d922 100644 --- a/XVim/XVimReplaceEvaluator.m +++ b/XVim/XVimReplaceEvaluator.m @@ -59,21 +59,17 @@ - (void)repeatBlockText{ - (void)didEndHandler { [super didEndHandler]; - if (!_oneCharMode) { - NSUndoManager *undoManager = [[self sourceView] undoManager]; - [undoManager endUndoGrouping]; - [undoManager setGroupsByEvent:YES]; - } + NSUndoManager *undoManager = [[self sourceView] undoManager]; + [undoManager endUndoGrouping]; + [undoManager setGroupsByEvent:YES]; } - (void)becameHandler { [super becameHandler]; - if (!_oneCharMode) { - NSUndoManager *undoManager = [[self sourceView] undoManager]; - [undoManager setGroupsByEvent:NO]; - [undoManager beginUndoGrouping]; - } + NSUndoManager *undoManager = [[self sourceView] undoManager]; + [undoManager setGroupsByEvent:NO]; + [undoManager beginUndoGrouping]; } - (XVimEvaluator*)eval:(XVimKeyStroke*)keyStroke{ @@ -95,7 +91,7 @@ - (XVimEvaluator*)eval:(XVimKeyStroke*)keyStroke{ // The input coming to this method is already handled by "Input Method" // and the input maight be non ascii like 'あ' if (self.oneCharMode || keyStroke.isPrintable) { - if (!keyStroke.isPrintable) { + if (!keyStroke.isPrintable && keyStroke.character != '\r') { nextEvaluator = [XVimEvaluator invalidEvaluator]; } else if (![self.sourceView xvim_replaceCharacters:keyStroke.character count:1]) { nextEvaluator = [XVimEvaluator invalidEvaluator]; From 6505576034aad9d3d828552feacb51d1a5cebe94 Mon Sep 17 00:00:00 2001 From: Jason May Date: Wed, 11 May 2016 22:21:30 -0700 Subject: [PATCH 3/3] Whitespace --- XVim/Test/XVimTester+Issues.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XVim/Test/XVimTester+Issues.m b/XVim/Test/XVimTester+Issues.m index 564ad480..de76fdae 100644 --- a/XVim/Test/XVimTester+Issues.m +++ b/XVim/Test/XVimTester+Issues.m @@ -62,7 +62,7 @@ - (NSArray*)issues_testcases{ @"\n" // 1 @"ccc\n";// 2 static NSString* issue_951 = @"aaaa\n"; - + return [NSArray arrayWithObjects: XVimMakeTestCase(text0, 0, 0, @"qadwpq", @"baaa bb ccc\n", 4, 0), // Issue #396 XVimMakeTestCase(text1, 24, 0, @":inoremap C-e> C-o>$i", text1 , 10, 0), // Issue #416