利用文件操作实现补全功能(二)

在上篇文章里面,我们实现了命令和文件的补全,而且与无缓冲输入结合了起来,可以说是很好玩了,但是还是和真正的终端差的不是一星半点,上网查了一下才发现,原来是有现成的库,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的输入功能的雏形就完美了

猜你喜欢

转载自blog.csdn.net/wobushimotou/article/details/81366069