Refactor-Vim-into-a-library
Here's an idea of how Vim reads input and transitions between modes. The actual code is much more complex but follows this basic flow:
while (1) {
normal_mode_process_byte(getc());
}
void normal_mode_process_byte(char c) {
if (c == 'i') // enter insert mode
while (1) {
insert_mode_process_byte(getc());
}
}
What needs to be done is remove all those read loops and replace by a function (e.g., process_byte(char c)
) that will buffer input, delegate to mode-specific input-handling functions or transition editor state when necessary. Something like this:
void process_byte(char c) {
if (mode == NORMAL)
normal_mode_process_byte(c);
else if (mode == INSERT)
insert_mode_process_byte(c);
...
}
void normal_mode_process_byte(char c) {
if (c == 'i') {
mode = INSERT;
return;
}
...
}
Think of the editor as a state machine: when input is read and fed into the machine, it may change the active buffer, transition mode, etc. The point is: the machine shouldn't call IO functions directly