如何设置回车位置或同等地址?

时间:2016-03-15 16:27:59

标签: linux carriage-return

我正在寻找一种方法来设置回车的位置,返回或等效的方式。

例如我有这样的一行:

^表示光标位置

myshell>cat file.txt
                    ^

回车后,它应该是这样的。

myshell>cat file.txt
        ^

2 个答案:

答案 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的terminatorgnome-terminalxterm中,这个&#34;神奇地&#34;按原样支持CTRL+U,但不支持CTRL+ACTRL+E

有许多可用的序列。 wikipedia page可能是让您入门的最简单的参考。

更新:此外,除非您将此作为学习练习(我得到Benjamin 的印象),否则要构建交互式shell,应该使用两个完善的库中的一个用于shell样式的行编辑,即:

  • readline(GPLv3,但更受欢迎)
  • editline(BSD许可,最接近&#34;第二名&#34;)

它们是提供我们都知道并喜爱的bashpythonlua,{的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函数的示例,您可能会发现它对阅读很有用。截图:

enter image description here