我正在编写一个执行基本Linux shell功能的程序。我正在添加upkey的功能,我们都知道使用termios.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代码)。现在该功能应该是什么?