Реализуем два отображения.
Первое - стандартный якорь. Висит в тексте, сохраняется, загружается.
В нём будем слушать три сообщения, о которых я говорил ранее. Для начала будем реагировать на самое надёжное, TextModels.Pref.
Реагируя на него мы понимаем, что-то или кто-то меняет текст, в котором мы сейчас находимся.

Реализуем второе отображение.
Назовём его курсором. Напишем такой код в первом отображении, который будет размещать единственный курсор в видимой области текстового отображения, если его там нет, а так же код будет следить за тем, чтобы курсор был единственный в тексте. Вставка/удаление курсора никак не влияет на содержимое текста. Это даёт нам возможность манипулировать курсором постоянно. В то же время, курсор, находясь в видимой области, получает все возможные сообщения.

Остаётся пара шагов, сделать вставку курсора в текст отложенным действием (как выяснилась, если изменить модель сразу по получении TextModels.Pref то будет ошибка), и реализовать метод курсора ThisModel, для того чтобы курсор мог ловить модельные сообщения от текста.

Вуаля. Мы получили без всяких обёрток и прочей сложной фигни способ реагирования на изменения в тексте документа. Можете изучить документацию по TextModels.UpdateMsg это реально мощное сообщение, почти все операции будут подконтрольны нашему курсору.

Для проверки концепции реализуем вывод в лог символов, введённых в текст. Ровно таким же способом можно реализовать отслеживание позиции текстового курсора для мгновенных реакций, типа подстановки угаданного слова, или там, замены аттрибутов перед скобками.

Такие дела. Код в аттаче. Курсор красненький, якорь чёрненький.

На написание модуля потрачено 3 часа, всего было 6 тыс. нажатий клавиш. Такая вот статистика.