如何设置回车 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 上的 terminator
、gnome-terminal
和 xterm
中,此 "magically" 按原样支持 CTRL+U
,但不支持CTRL+A
或 CTRL+E
.
还有很多很多可用的序列。 wikipedia page 可能是最简单的入门参考。
更新:此外,除非您将此作为学习练习(我的印象是本杰明是),否则构建交互式 shell,您可能应该使用两个完善的库之一进行 shell 样式的行编辑,即:
它们是提供我们从 bash
、python
、lua
中熟知和喜爱的 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 的示例,您可能会发现它对阅读很有用。截图:
我正在寻找一种方法来设置马车 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 上的 terminator
、gnome-terminal
和 xterm
中,此 "magically" 按原样支持 CTRL+U
,但不支持CTRL+A
或 CTRL+E
.
还有很多很多可用的序列。 wikipedia page 可能是最简单的入门参考。
更新:此外,除非您将此作为学习练习(我的印象是本杰明是),否则构建交互式 shell,您可能应该使用两个完善的库之一进行 shell 样式的行编辑,即:
它们是提供我们从 bash
、python
、lua
中熟知和喜爱的 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 的示例,您可能会发现它对阅读很有用。截图: