Я начал пробовать свой вариант, вот.
Взял один из своих парсеров и попытался сделать правильную расстановку пробелов вокруг операторов. Пока что эксперимент. Как обычно у меня уже есть определение строка, комментарии, апострофы, асм-код, все что не из перечисленных является ключевые слов и операторы. Добавил флаг, если начало строки то эти пробелы не трогаем, как только что-то пошло, что не пробел, то переключаем на проверку двойных и более пробелов. Как только лишний пробел вместо него пишу "1", только не число а код управляющих символов, их обычно нет в коде явно, они могут быть записаны как Chr(1), но не как буква, так как у них нет видимого отображения, хотя Scintilla поддерживает их отображение. В итоге я потом заменяю Chr(1) на ничего избавляясь от лишних пробелов. Но в идеале я бы хотел сделать следующее: если второй пробел, то запомнил позицию пробела и иду дальше до первого непробела, и когда найден переписываю строку в запомненную позицию, то есть сдвигаю влево на число пробелов. Замена действует также, но менее оптимизировано. Ещё была мысль делить когда второй пробел то запоминаем левую часть в NewList, а правую продолжаем парсить, а потом соединить куски. В принципе создание NewList потребует копирование строк, поэтому опять возвращаюсь к варианту сдвига строки. И ещё вариант запоминание указателей, а в повтор пробелов пишем 00, когда строка кончилась читаем куски с указателей и собираем строку. Но если надо добавить пробел, то сдвиг вправо пока не получается. Возможно надо выделить память чтобы в ней производить манипуляции, допускающие сдвиг данных в любую сторону.