Yes, you need to replace $chr(32) (spaces) with another character that you're not planning on using... usually you'd pick a character like Þ -- $chr(222) -- as you're unlikely to ever use that in your commands. You can use _ or . if you like, but it could be an issue if you want to use those in your keywords.
It may seem like replacing isn't ideal, but it's really easy and works without a problem and the user doesn't need to do anything special if you automatically use $replace rather than make them do it when using the command.
One thing to keep in mind however you do it... if you want to use more than one word, then you really need to have some kind of character that designates what is the keyword and what isn't when using the commands...
!learn this is the keyword this is the description
That won't work because there isn't any way to know what is the keyword and what is the description.
!learn this is the keyword = this is the description
That would work because you have something to denote what the keyword is. But you have to use a character that will never be in the keyword, so again, it's good to choose something like Þ to prevent that problem.
What would you like to include besides what I've already done? Do you want multiple words? You can do them already by using _'s or something else instead of spaces, or I can add it so you can do it with spaces. Just remember that you need a character in your commands between the keyword and the description (see above).
Do you want to list the keywords? Do you want the !set command? Is there anything else?
The nice thing with hash tables, besides speed, is that they are very easy to modify how they work.