如何设置回车 return 位置或等效位置?

How to set carriage return location or equivalent?

我正在寻找一种方法来设置马车 return、return 的位置或等效方法。

例如我有这样一行:

^表示光标位置

myshell>cat file.txt
                    ^

回车后return应该是这样的。

myshell>cat file.txt
        ^

您可能正在寻找统称为 ANSI 转义序列的东西。如果你真的不知道你在寻找什么,那就很难搜索了。

这个小例子 saves/restores 光标位置:

#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>3[s <-Cursor should go there3[u");
    fflush(stdout);
    fgets(cmd_buf, sizeof(cmd_buf), stdin);
    printf("\nYou entered: %s\n", cmd_buf);
  }
}

请注意,在 Ubuntu 上的 terminatorgnome-terminalxterm 中,此 "magically" 按原样支持 CTRL+U,但不支持CTRL+ACTRL+E.

还有很多很多可用的序列。 wikipedia page 可能是最简单的入门参考。

更新:此外,除非您将此作为学习练习(我的印象是本杰明),否则构建交互式 shell,您可能应该使用两个完善的库之一进行 shell 样式的行编辑,即:

  • readline(GPLv3,但更受欢迎)
  • editline(BSD 许可,最接近 "second place")

它们是提供我们从 bashpythonlua 中熟知和喜爱的 emacs 风格(典型默认值)和 vi 风格的键绑定和历史功能的库, perl, node, 等等等等

对于在屏幕上的定位,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() function in ncurses-examples 的示例,您可能会发现它对阅读很有用。截图: