Yop.
Utilise la propriété CSS white-space avec comme valeur pre ou pre-wap de sorte à conserver les espaces (tabs compris), sauts de lignes, etc..
Si je devais faire un éditeur de code, pour répondre à ta derniere question, j'utiliserai une div contenteditable.
Pourquoi? C'est plus sympa pour l'utilisateur, qui tape son code, qui pourrait voir son code directement dans la div avec les bonnes mises en formes (gras/souligné/...) et couleurs. Tandis qu'un textarea, tu es limité, tu ne peux pas y mettre de mise en formes et couleurs à differents endroits, etc.... Et je pense que c'est ce que tous ont fait (ceux qui ont crée des éditeurs de code)