在上篇文章里面,我们实现了命令和文件的补全,而且与无缓冲输入结合了起来,可以说是很好玩了,但是还是和真正的终端差的不是一星半点,上网查了一下才发现,原来是有现成的库,readline,而且应用起来非常简单,至少比我们上一篇文章简单多了,
还可以有历史命令之类的功能,比我们的不知道强到哪里去了
不过,虽然话是这么说,但是还是要把功能做完才安心,接下来,我们将要实现的就是myshell
虽然跳跃幅度有点大,不过在有补全和无缓冲输入的基础下,就只是往上面添加东西就可以了
上次的补全其实还没完整,没有智能判断,不知道补全的是文件还是命令,这次我们加上这个好了
其实也没加什么多的东西,就只是加个判断,第一单词按table就是命令补全,第二个那理所当然就是文件补全了
而我们这些所有的功能,都是在输入上面做功夫的
//获取用户输入
void get_input(char *buf)
{
int num; //记录最后一个输入命令的长度
int fp;
int count = 0;
int len = 0;
char c;
char ch[50]; //存放输入的命令
int flag = 0; //判断是文件补全还是命令补全
for(int i = 0;i < 50;i++)
ch[i] = '\0';
while(c = getch()) {
switch(c) {
case ' ':
comple(ch,flag); //补全
print_prompt();
printf("%s",ch);
continue;
break;
case 127:
if(count > 0) {
putchar('\b'); //回删
ch[strlen(ch) - 1] = '\0';
count--;
}
continue;
break;
case '\r': //回车命令输入结束
strcpy(buf,ch);
close(fp);
return; //结束输入
}
if(c == ' ')
flag = 1; //此时标记为文件补全
ch[count++] = c;
}
}
其中补全函数就是我们上篇文章的内容,不过多加了回删的功能,但其实还是不能完全的跟真正的回删比较,毕竟只是输出退格符。
下次再加上历史命令的功能,我们的这个shell的输入功能的雏形就完美了