При прослушивании событий нажатия клавиш пропускается любое редактирование текста, которое пользователь делает с помощью мыши (вырезать / копировать / вставить).
Я думаю, что лучшим подходом было бы прослушивать событие «изменение» в элементе управления (которое запускается всякий раз, когда содержимое изменяется при вводе пользователем), и просто выдвигать полное содержимое элемента управления (его «текст» или «htmlText») атрибут) с каждым событием изменения в буфер отмены (массив строк). Я предполагаю, что использование памяти не является проблемой (вероятно, нет, в зависимости от ожидаемого размера содержимого элементов управления и количества уровней отмены).
Таким образом, вы реализуете отмену / повтор, просто копируя соответствующее состояние элемента управления (в основном перемещаясь вверх и вниз по массиву) в буфере отмены обратно в элемент управления.
«Правильный» подход заключается в отслеживании фактических правок и будет значительно более сложным.