如何在终端内编辑字符串“inline”而不使用任何编辑器?

时间:2018-04-23 16:03:43

标签: c linux shell unix terminal

我正在编写一个执行基本Linux shell功能的程序。我正在添加upkey的功能,我们都知道使用te​​rmios.h库在终端上打印以前命令的历史记录。这会打印最近的命令,但我无法编辑它。我能够为此添加字符但是在按退格键时它不会编辑字符串。那么我该如何添加这个功能呢。

此功能的代码段。

struct termios T,O;
    tcgetattr(0,&T);
    char x;
    char y[80]={'\0'};
    char h[80]={'\0'};
    O=T;
    T.c_lflag=T.c_lflag&(~(ICANON));
    T.c_lflag=T.c_lflag&(~(ECHO));
    tcsetattr(1,TCSANOW,&T);
    int i=0,j=0,k=0,t_loop_var,loop_var=0,fd=-2;
    while((x=getchar())!='\n'){
        if(x=='\033'){
            if(getchar()=='['){
                if(getchar()=='A'){
                    if(fd==-2){
                    fd=open("history.txt",O_CREAT|O_RDWR,0777);
                    }
                for(j=0;j<80;j++){
                    printf("%s","\b \b");
                }
                char K[1];
                while(read(fd,K,1)==1){
                    if(K[0]=='\n'){
                        break;
                    }
                    h[k]=K[0];
                    k++;
                }
                h[k]='\0';
                k=0;
                printf("%s",h);
                for(loop_var=0;h[loop_var]!='\0';loop_var++){
                    y[loop_var]=h[loop_var];
                }
                t_loop_var=loop_var;
                loop_var=0;
                //h will be the command to execute
                }
            }
        }
        else{
            tcsetattr(1,TCSANOW,&O);
            y[i+t_loop_var]=x;
            i++;
            printf("%c",x);
            tcsetattr(1,TCSANOW,&T);
        }
    }
    tcsetattr(1,TCSANOW,&O);
    //y[i]='\0';
    printf("\n%s\n",y);

更新:我在评论中得到一个建议,可能的解决方案是使用readline库。我从搜索中得到的是这个函数int rl_bind_key (int key, Function *function)。这个键绑定在当前活动的键映射中起作用。现在我应该如何使用此功能删除角色?

退格键是8(退格的ascii代码)。现在该功能应该是什么?

0 个答案:

没有答案