使用libreadline开发Shell时,C-W删除命令提示符的解决方法
问题原因与解决方案
你当前的问题出在手动用printf输出提示符,而没有让readline来处理提示符。readline不知道你手动输出的ash$ 是提示符,会把整个终端行的内容都当成可编辑的输入区域。当你输入单词后按C-W(向后删除一个单词),readline会从光标位置一直删到行首,自然就把你手动输出的提示符也删掉了。
解决方法
直接把提示符字符串作为readline()的参数传入,让readline负责输出提示符。这样readline会自动记录提示符的长度,明确区分“不可编辑的提示符”和“用户输入内容”,删除操作只会作用于用户输入的部分,不会碰提示符。
修改后的代码
#include <stdio.h> #include <readline/readline.h> #include <readline/history.h> #include <stdlib.h> #include <string.h> int ash_loop(void) { char *line = 0; while(1) { // 让readline输出提示符,它会自动处理边界 line = readline("ash$ "); if(!line) goto err0; printf("line: %s\n", line); free(line); break; } return 0; err0: return 1; } int main(int argc, char *argv[]) { int rc; rc = ash_loop(); return rc; }
额外提示:带样式的提示符
如果需要给提示符加颜色或其他ANSI样式,要把转义序列用\001和\002包裹,这样readline会忽略这些非打印字符的长度计算,避免光标位置错乱。比如绿色提示符:
line = readline("\001\033[32m\002ash$\001\033[0m\002 ");
内容的提问来源于stack exchange,提问作者amdixon
相关产品推荐
相关产品推荐

