rl_dispatch()
rl_insert()
rl_insert_text()
rl_display()
update_line()
KEYMAP_ENTRY_ARRAY emacs_standard_keymap = {
...
{ ISFUNC, rl_insert }, /* a */
...
};
下面是rl_insert_text()函数之前的rl_point和rl_end的值和rl_insert_text()函数之后rl_point和rl_end的值,
还有之后the_line[]数组的变化。
下面update_line()处下断点的情形,0x17:0x6340c是参数old,0x17:0x59c0c是参数new。
static
update_line (old, new, current_line)
register char *old, *new;
int current_line;
{
实际上是visible_line的地址和invisible_line的地址。
rl_redisplay ()
{
...
for (linenum = 0; linenum <= inv_botlin; linenum++)
update_line (linenum > vis_botlin ? ""
: &visible_line[linenum * screenwidth],
&invisible_line[linenum * screenwidth],
linenum);
...
}
rl_redisplay ()
{
strncpy (line + out, prompt_this_line, strlen (prompt_this_line));
...
rl_redisplay ()
{
...
for (in = 0; in < rl_end; in++)
{
}
...
这里的for循环是把the_line[]数组的内容拷贝到line[]数组中,既invisible_line[]数组中。
the_line[]数组的内容就是提示符之后的内容。
invisible_line[]数组是当前的内容,既提示符的内容和the_line[]数组的内容之和。
visible_line[]数组是上次的invisible_line[]数组,因为redisplay()函数最后会交换invisible_line和visible_line的值。
第一块是[/root]# abc 按下d键时,update_line()处下断点时的情形
第一块是[/root]# abcd 按下e键时,update_line()处下断点时的情形
visible_line[]数组:屏幕上看到的东西对应的内容
invisible_line[]数组:改变之后的内容,比如按下字符键。