Сделать с gap-буфером можно, информацию о позиции курсора храните отдельно при изменении позиции курсора меняете позицию gap, в общем-то оно на это и рассчитано.
Я не знаю, как принято реализовывать в реальных текстовых редакторах, я бы сделал структуру похожую на btree без ключа
https://ru.wikipedia.org/wiki/B-%D0%B4%D0%B5%D1%80...
в каждом узле хранить либо указатель на фрагмент текста + его длину либо признак конца абзаца/спецсимвола либо ссылку на другой узел. Каждый фрагмент и строку хранить отдельным узлом.
Фактически это возможность иметь неограниченное количество гапов в произвольных местах без необходимости их двигать. Как бонус, такая структура легко позволяет делать навигацию, undo/redo, т.к. каждая запись хранится отдельным узлом copy, paste и все остальное что обычно требуется. Поддержать форматированный текст так же очень легко, достаточно добавить признаки форматирования как еще один тип узла.