我正在寻找一种方法来设置回车的位置,返回或等效的方式。
例如我有这样的一行:
^
表示光标位置
myshell>cat file.txt
^
回车后,它应该是这样的。
myshell>cat file.txt
^
答案 0 :(得分:0)
您可能在共同称为ANSI转义序列之后。如果你真的不知道你追求的是什么,很难找到。
这个小例保存/恢复光标位置:
#include <stdio.h>
int main(int argc, char**argv)
{
char cmd_buf[100];
cmd_buf[0]=0;
while(strncmp(cmd_buf, "quit", 4))
{
printf("mypromt>\033[s <-Cursor should go there\033[u");
fflush(stdout);
fgets(cmd_buf, sizeof(cmd_buf), stdin);
printf("\nYou entered: %s\n", cmd_buf);
}
}
请注意,在Ubuntu的terminator
,gnome-terminal
和xterm
中,这个&#34;神奇地&#34;按原样支持CTRL+U
,但不支持CTRL+A
或CTRL+E
。
有许多可用的序列。 wikipedia page可能是让您入门的最简单的参考。
更新:此外,除非您将此作为学习练习(我得到Benjamin 的印象),否则要构建交互式shell,应该使用两个完善的库中的一个用于shell样式的行编辑,即:
它们是提供我们都知道并喜爱的bash
,python
,lua
,{的emacs风格(典型默认)和vi风格的键绑定和历史记录功能的库{1}},perl
等等。
答案 1 :(得分:0)
对于在屏幕上的定位,termios的用途有限(ioctl处理屏幕尺寸不在POSIX中),除非你想对终端特性有很多假设,控制字符和转义序列都有它们的限制。
您可以使用filter
函数执行curses中的问题,告诉库您只想使用显示的当前行。如上所述,问题令人费解,因为它没有提到除当前行之外的任何输出。但是例如(这正是被问到的):
#include <curses.h>
int
main(void)
{
int ch, y, x;
filter();
initscr();
cbreak();
addstr("myshell>");
getyx(stdscr, y, x);
while ((ch = getch()) != ERR) {
if (ch == '\n')
move(y, x);
}
endwin();
return 0;
}
然而,一个可用的程序会做更多的事情。 filter()
中有ncurses-examples函数的示例,您可能会发现它对阅读很有用。截图: