问题标签 [vt100]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
98 浏览

c++ - 终端不断缓冲按下的键

我正在编写一个 VT100 终端引擎,但输入处理有点棘手。首先,我初始化我的 tty,没有回显。

接下来我初始化一个非阻塞键盘文件描述符。

到目前为止,一切都很好。主循环只是轮询事件,如果按 ESC 会中断。

所以我输入了一些字符。同时,我的终端正在缓冲我输入的所有字符。程序退出后,所有字符都会显示出来。

所以我的问题是:如何在程序运行时禁用终端输出流缓冲?

这是一个 GIF 来说明这个问题。

脚步:

  • 须藤 ./clac
  • 引擎正在运行但没有回声;输入一些字符
  • 按 ESC
  • 输入的字符得到显示;程序退出

在此处输入图像描述

0 投票
1 回答
266 浏览

c - C语言中同时独立执行两个函数

我想我可能在c中有线程问题,但我不确定。

我的目标是在 while(1) 循环中执行两个单独的函数:其中一个函数是 kbget() 以检索在非规范模式下在终端中按下的键。第二个是使用 ioctl(1, TIOCGWINSZ,...) 函数不断获取终端窗口大小。

它通常不起作用,因为在执行第二个函数以重新评估终端窗口大小之前,while(1) 循环停止以从用户那里获取按键。如果在按下键之前调整终端窗口的大小,则不会执行评估其大小的函数,除非再次按下随机键。

换句话说,调整终端窗口的大小不会更新下面的 Window 结构中的大小值,除非按下一个键。我希望程序在调整终端大小时更新 y_size 和 x_size 值“实时”。

这是没有 POSIX 线程的代码中的问题:执行:

(下面的 scr.h 有 kbget() 来改变终端模式):

主.c:

我曾尝试使用线程解决此问题,但到目前为止我没有成功。

我通过添加 2 个函数(get_window_size 和 get_key)修改了上面的 main.c 文件:(scr.h 在 get_key() 中有 kbget() 函数将终端更改为规范模式)

主.c:

scr.h 文件将终端模式更改为非规范(从这里调用上面的 kbget() 函数):我认为 scr.h 没有任何问题,因为它是从这里获取的(将光标移到C 程序)。

scr.h:

Invalid write of size 4在使用 valgrind 执行时,我在上面使用 pthread 的代码中也出现错误:

我知道 ncurses 和 pdcurses 的存在。我只是为自己做这个练习。

更新

我已将代码更改为以下内容,不幸的是该ret变量永远不会更改为-1:

0 投票
1 回答
218 浏览

c - 使用修饰符时的 VT100 数字小键盘转义码(ctrl/shift/alt)

我正在尝试恢复一个相当旧的 MUD 客户端以在 OS X Mojave 下运行(几乎是一个支持别名、键绑定和触发器的 telnet 客户端)。代码可以在这里找到https://github.com/olostan/mmc

我成功地运行它,但是它没有正确处理数字键盘键。我发现这是因为这些键没有在https://github.com/olostan/mmc/blob/master/src/output.c中定义, 一旦我将以下块添加到“键盘键”部分,它就开始了好好工作。

现在我想对具有不同修饰符(ctrl、alt、shift)的小键盘键执行相同的操作,例如 C-k1、M-k1、S-k1,但我找不到任何地方如何正确定义转义码序列。我从这个页面得到了上面的代码 - https://www.gnu.org/software/screen/manual/html_node/Input-Translation.html但不幸的是它没有描述任何与修饰符的组合。

所以问题是 - 我如何为带有修饰键(shift、alt、ctrl)的键盘组合定义 VT100 格式的转义码?我尝试为 S-k4 组合键设置类似“\033[1;5Ot”的东西,但这些都不起作用。

0 投票
0 回答
172 浏览

php - 是否可以在 Windows 中启用 PHP 5 的 VT100/ANSI 转义码

我正在将旧的 PHP 5 应用程序升级到 PHP 7。我正在使用 Codeception 进行单元测试,因为它具有漂亮的颜色输出,可以轻松查看所有测试是否通过。

我尝试过的事情:

  • 升级到 PHP 7:应用程序崩溃
  • 在没有特殊标志的情况下运行 Codeception:ANSI 转义码被打印到屏幕上,使得输出难以阅读
  • 使用标志运行 Codeception --no-colors:输出是一种颜色,需要更长时间才能识别 100% 通过运行,或者哪些测试失败
  • 使用 ANSICON 而不是 Windows 命令提示符:PHP 5 运行速度非常慢,需要一个小时才能生成覆盖范围的报告,而在命令提示符下执行相同的运行只需要 2 分钟

我没有尝试过的事情:

  • 设置注册表值,以便 ANSI 转义码始终打开,除非正在运行的程序将其关闭:此解决方案不适用于其他开发人员

除了在 PHP 中,我想做与下面列出的源代码相同的操作。就像是:

我不知道是否可以从 PHP 中向命令提示 API 发出命令。

以下 C 代码来自PHP 7 源代码

有没有办法从 PHP 5 脚本中模拟此功能?

我发现了以下相关问题,但我还没有接近开始:

0 投票
1 回答
83 浏览

linux - 如何计算 xterm 控制序列的长度

我希望在将文本传递给 stdout/console 之前对其进行格式化。要正确执行此操作,我需要知道给定的文本部分在打印到控制台后有多长时间,这需要知道由于它们是转义序列而不会打印多少字符。

在网上我找到了这些序列命令的多个文档,但似乎没有快速简便的方法来找出给定转义序列命令的结束位置,除非我要解析它们。在不解析的情况下获取任何转义序列命令的长度是否有技巧/解决方案?

0 投票
1 回答
369 浏览

vim - ESC [?1c 转义序列在 Linux 控制台上的作用是什么?

在尝试vim在我的操作系统控制台上正常工作时,我注意到它stdout在滚动之前写入了以下转义序列:\x1b[?1c.

问题是我无法在任何地方找到该特定序列的含义。我检查过:

谁能帮我解开这个谜?

PS 如果一些额外的上下文可能会有所帮助,则在以下上下文中使用该序列:

\x1b[?25l\x1b[?1c\x1b[3;24r\x1b[3;1H\x1b[L

0 投票
1 回答
160 浏览

terminal - 在终端中使用转义序列

我正在与Minicom Terminal (VT102). 我有一个微控制器节点,它通过串行(UART)向 minicom 发送数据。我写了一些函数来使用终端。

我得到类似这样的输出 登录屏幕 Minicom 终端显示在第一行而不是在指定的行中。

0 投票
0 回答
53 浏览

c++ - 在 C++ 中自定义控制台输出的不同方法(更喜欢哪一种)

我想知道如何为控制台着色或自定义,然后我找到了这个标题: 在此标题中使用 C++ 为控制台中的文本着色,此代码建议:

这需要 <windows.h> 库。

然后,我学习了自定义控制台输出的新方法(我正在寻找清除特定行),在我的愿景中称为“VT100 Escape Code(ANSI)”,这更容易使用并且不需要额外的库。

这里的问题是:这两种方式有什么区别,在什么情况下应该首选哪一种,是否有性能差异?

0 投票
1 回答
3297 浏览

python - 如何在 Windows 10 中启用 VT100 终端仿真?

我想在 Python 程序执行期间(在 IDLE 或 CMD 或其他终端中)使用 ANSI 转义码打印彩色文本。请告诉我 Windows 命令提示符启用 VT100 终端仿真的确切命令,或逐步告诉我另一种方法。

我已经搜索并找到了一些方法,但我不明白如何实现它们。请以我可以遵循的简单分步格式回答。

0 投票
1 回答
45 浏览

python - 正则表达式用空格替换控制台代码

我正在为使用控制台代码的控制台应用程序编写一些 Python 测试,并且在优雅地处理ESC H序列时遇到了一些问题。

我有s = r'\x1b[12;5H\nSomething'输入字符串,我想用 Something. 我正在尝试使用以下正则表达式:

re.sub(r'\x1b\[([0-9,A-Z]{1,2};([0-9]{1,2})H)', r'\2', s)

这当然会创建5Something.

我想要的是某种效果

re.sub(r'\x1b\[([0-9,A-Z]{1,2};([0-9]{1,2})H)', ' '*(int(r'\2')-1), s)

也就是创建比第二个捕获组的空格数少一个。

如果有一种方法可以简单地将我使用时得到的内容呈现在字符串中,我也会非常高兴print(s)

我正在使用 Python 3。

非常感谢!!