Skip to content

Commit fd009a9

Browse files
committed
add flipping undo, or pure vi compatible undo (#113)
1 parent d83d584 commit fd009a9

File tree

1 file changed

+61
-16
lines changed

1 file changed

+61
-16
lines changed

src/chrome/frontend/wasavi.js

+61-16
Original file line numberDiff line numberDiff line change
@@ -1334,7 +1334,8 @@ function install (x, req) {
13341334
prefixInput = new Wasavi.PrefixInput;
13351335
idealWidthPixels = idealDenotativeWidthPixels = -1;
13361336
isEditCompleted = isVerticalMotion = isReadonlyWarned =
1337-
isSmoothScrollRequested = isJumpBaseUpdateRequested = false;
1337+
isSmoothScrollRequested = isJumpBaseUpdateRequested =
1338+
isUndoFlipped = false;
13381339
recordedStrokes = new Wasavi.StrokeRecorder;
13391340
lastSimpleCommand = '';
13401341
lastHorzFindCommand = {direction:0, letter:'', stopBefore:false};
@@ -4700,6 +4701,52 @@ function reportSave (f) {
47004701
config.setData('report', report);
47014702
}
47024703
}
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+
}
47034750

47044751
/*
47054752
* event handlers <<<1
@@ -5222,7 +5269,7 @@ var config = new Wasavi.Configurator(appProxy,
52225269
['smartcase', 'b', true],
52235270
['undolevels', 'i', 20, function (v) {
52245271
if (editLogger) {
5225-
editLogger.logMax = v;
5272+
editLogger.logMax = v || 1;
52265273
}
52275274
return v;
52285275
}],
@@ -5377,6 +5424,7 @@ var isInteractive;
53775424
var isSmoothScrollRequested;
53785425
var isJumpBaseUpdateRequested;
53795426
var isCompleteResetCanceled;
5427+
var isUndoFlipped;
53805428

53815429
var lastSimpleCommand;
53825430
var lastHorzFindCommand;
@@ -7013,31 +7061,28 @@ var commandMap = {
70137061
return /^g/.test(prefixInput.operation) ?
70147062
true : inputEscape(o.e.key);
70157063
}
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;
70197068
}
70207069
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);
70257071
}
7072+
return result;
70267073
},
70277074
'\u0012'/*^R*/:function (c, o) {
70287075
if (!prefixInput.isEmptyOperation) {
70297076
return inputEscape(o.e.key);
70307077
}
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)();
70347081
}
70357082
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);
70407084
}
7085+
return result;
70417086
},
70427087
U:function (c, o) {
70437088
if (!prefixInput.isEmptyOperation) {

0 commit comments

Comments
 (0)