undo undoes next group of items on the undo stack
()
| 1091 | |
| 1092 | // undo undoes next group of items on the undo stack |
| 1093 | func (ls *Lines) undo() []*Edit { |
| 1094 | tbe := ls.Undos.UndoPop() |
| 1095 | if tbe == nil { |
| 1096 | // note: could clear the changed flag on tbe == nil in parent |
| 1097 | return nil |
| 1098 | } |
| 1099 | stgp := tbe.Group |
| 1100 | var eds []*Edit |
| 1101 | for { |
| 1102 | if tbe.Rect { |
| 1103 | if tbe.Delete { |
| 1104 | utbe := ls.insertTextRectImpl(tbe) |
| 1105 | utbe.Group = stgp + tbe.Group |
| 1106 | if ls.Options.EmacsUndo { |
| 1107 | ls.Undos.SaveUndo(utbe) |
| 1108 | } |
| 1109 | eds = append(eds, utbe) |
| 1110 | } else { |
| 1111 | utbe := ls.deleteTextRectImpl(tbe.Reg.Start, tbe.Reg.End) |
| 1112 | utbe.Group = stgp + tbe.Group |
| 1113 | if ls.Options.EmacsUndo { |
| 1114 | ls.Undos.SaveUndo(utbe) |
| 1115 | } |
| 1116 | eds = append(eds, utbe) |
| 1117 | } |
| 1118 | } else { |
| 1119 | if tbe.Delete { |
| 1120 | utbe := ls.insertTextImpl(tbe.Reg.Start, tbe.ToBytes()) |
| 1121 | utbe.Group = stgp + tbe.Group |
| 1122 | if ls.Options.EmacsUndo { |
| 1123 | ls.Undos.SaveUndo(utbe) |
| 1124 | } |
| 1125 | eds = append(eds, utbe) |
| 1126 | } else { |
| 1127 | utbe := ls.deleteTextImpl(tbe.Reg.Start, tbe.Reg.End) |
| 1128 | utbe.Group = stgp + tbe.Group |
| 1129 | if ls.Options.EmacsUndo { |
| 1130 | ls.Undos.SaveUndo(utbe) |
| 1131 | } |
| 1132 | eds = append(eds, utbe) |
| 1133 | } |
| 1134 | } |
| 1135 | tbe = ls.Undos.UndoPopIfGroup(stgp) |
| 1136 | if tbe == nil { |
| 1137 | break |
| 1138 | } |
| 1139 | } |
| 1140 | return eds |
| 1141 | } |
| 1142 | |
| 1143 | // EmacsUndoSave is called by View at end of latest set of undo commands. |
| 1144 | // If EmacsUndo mode is active, saves the current UndoStack to the regular Undo stack |
no test coverage detected