TrueLie,
1) заменить событие "keydown" на событие "input", чтобы всякие там вставки из буфера работали, и вообще.
2) для работы с выделенным куском текста курить
https://learn.javascript.ru/selection-range или что-то вроде того
запоминать текущее выделение, потом возвращать, там несколько кейсов.
3) c +7 даже не знаю что сказать. Учитывая, что пп 1 и 2 предполагают рефакторинг с ног на голову, +7 пока вообще не на чем делать
----
в целом, лучше либо взять готовый компонент, либо посмотреть как там устроен обработчик "input"