@@ -1334,7 +1334,8 @@ function install (x, req) {
1334
1334
prefixInput = new Wasavi . PrefixInput ;
1335
1335
idealWidthPixels = idealDenotativeWidthPixels = - 1 ;
1336
1336
isEditCompleted = isVerticalMotion = isReadonlyWarned =
1337
- isSmoothScrollRequested = isJumpBaseUpdateRequested = false ;
1337
+ isSmoothScrollRequested = isJumpBaseUpdateRequested =
1338
+ isUndoFlipped = false ;
1338
1339
recordedStrokes = new Wasavi . StrokeRecorder ;
1339
1340
lastSimpleCommand = '' ;
1340
1341
lastHorzFindCommand = { direction :0 , letter :'' , stopBefore :false } ;
@@ -4700,6 +4701,52 @@ function reportSave (f) {
4700
4701
config . setData ( 'report' , report ) ;
4701
4702
}
4702
4703
}
4704
+ function undo ( count ) {
4705
+ var revertedCount = 0 ;
4706
+ count || ( count = 1 ) ;
4707
+
4708
+ while ( count -- > 0 ) {
4709
+ var result = editLogger . undo ( ) ;
4710
+ if ( result === false ) {
4711
+ break ;
4712
+ }
4713
+
4714
+ revertedCount += result ;
4715
+ }
4716
+
4717
+ if ( revertedCount == 0 ) {
4718
+ requestShowMessage ( _ ( 'No undo item.' ) , true ) ;
4719
+ return ;
4720
+ }
4721
+
4722
+ requestShowMessage ( _ ( '{0} {operation:0} have reverted.' , revertedCount ) ) ;
4723
+ invalidateIdealWidthPixels ( ) ;
4724
+ config . setData ( editLogger . isClean ? 'nomodified' : 'modified' ) ;
4725
+ return true ;
4726
+ }
4727
+ function redo ( count ) {
4728
+ var redidCount = 0 ;
4729
+ count || ( count = 1 ) ;
4730
+
4731
+ while ( count -- > 0 ) {
4732
+ var result = editLogger . redo ( ) ;
4733
+ if ( result === false ) {
4734
+ break ;
4735
+ }
4736
+
4737
+ redidCount += result ;
4738
+ }
4739
+
4740
+ if ( redidCount == 0 ) {
4741
+ requestShowMessage ( _ ( 'No redo item.' ) , true ) ;
4742
+ return ;
4743
+ }
4744
+
4745
+ requestShowMessage ( _ ( '{0} {operation:0} have executed again.' , redidCount ) ) ;
4746
+ invalidateIdealWidthPixels ( ) ;
4747
+ config . setData ( editLogger . isClean ? 'nomodified' : 'modified' ) ;
4748
+ return true ;
4749
+ }
4703
4750
4704
4751
/*
4705
4752
* event handlers <<<1
@@ -5222,7 +5269,7 @@ var config = new Wasavi.Configurator(appProxy,
5222
5269
[ 'smartcase' , 'b' , true ] ,
5223
5270
[ 'undolevels' , 'i' , 20 , function ( v ) {
5224
5271
if ( editLogger ) {
5225
- editLogger . logMax = v ;
5272
+ editLogger . logMax = v || 1 ;
5226
5273
}
5227
5274
return v ;
5228
5275
} ] ,
@@ -5377,6 +5424,7 @@ var isInteractive;
5377
5424
var isSmoothScrollRequested ;
5378
5425
var isJumpBaseUpdateRequested ;
5379
5426
var isCompleteResetCanceled ;
5427
+ var isUndoFlipped ;
5380
5428
5381
5429
var lastSimpleCommand ;
5382
5430
var lastHorzFindCommand ;
@@ -7013,31 +7061,28 @@ var commandMap = {
7013
7061
return / ^ g / . test ( prefixInput . operation ) ?
7014
7062
true : inputEscape ( o . e . key ) ;
7015
7063
}
7016
- var result = editLogger . undo ( ) ;
7017
- if ( result === false ) {
7018
- requestShowMessage ( _ ( 'No undo item.' ) , true ) ;
7064
+ var result ;
7065
+ if ( config . vars . undolevels == 0 ) {
7066
+ result = ( isUndoFlipped ? redo : undo ) ( ) ;
7067
+ isUndoFlipped = ! isUndoFlipped ;
7019
7068
}
7020
7069
else {
7021
- requestShowMessage ( _ ( '{0} {operation:0} have reverted.' , result ) ) ;
7022
- invalidateIdealWidthPixels ( ) ;
7023
- config . setData ( editLogger . isClean ? 'nomodified' : 'modified' ) ;
7024
- return true ;
7070
+ result = undo ( prefixInput . count ) ;
7025
7071
}
7072
+ return result ;
7026
7073
} ,
7027
7074
'\u0012' /*^R*/ :function ( c , o ) {
7028
7075
if ( ! prefixInput . isEmptyOperation ) {
7029
7076
return inputEscape ( o . e . key ) ;
7030
7077
}
7031
- var result = editLogger . redo ( ) ;
7032
- if ( result === false ) {
7033
- requestShowMessage ( _ ( 'No redo item.' ) , true ) ;
7078
+ var result ;
7079
+ if ( config . vars . undolevels == 0 ) {
7080
+ result = ( isUndoFlipped ? undo : redo ) ( ) ;
7034
7081
}
7035
7082
else {
7036
- requestShowMessage ( _ ( '{0} {operation:0} have executed again.' , result ) ) ;
7037
- invalidateIdealWidthPixels ( ) ;
7038
- config . setData ( editLogger . isClean ? 'nomodified' : 'modified' ) ;
7039
- return true ;
7083
+ result = redo ( prefixInput . count ) ;
7040
7084
}
7085
+ return result ;
7041
7086
} ,
7042
7087
U :function ( c , o ) {
7043
7088
if ( ! prefixInput . isEmptyOperation ) {
0 commit comments