我编写了一个打印字符串的程序,该字符串包含ANSI转义序列以使文本着色.但它在默认的Windows 10控制台中无法正常工作,如屏幕截图所示.
程序输出显示为转义序列作为打印字符.如果我通过变量或管道将该字符串提供给PowerShell,则输出将按预期显示(红色文本).
如何才能实现程序打印彩色文本而无需任何解决方法?
这是我的程序源(Haskell) - 但语言不相关,只是这样你就可以看到如何编写转义序列.
main = do
let red = "\ESC[31m"
let reset = "\ESC[39m"
putStrLn $ red ++ "RED" ++ reset
Run Code Online (Sandbox Code Playgroud) 有没有人知道模拟vt100终端的库或类(如果图形与否则无关紧要).我想要的基本上是一个实现vt100终端逻辑的类(比如当接收"删除"代码将调用删除函数,或者如果基于GUI将删除一个char).
我正在浏览器中建立一个终端窗口(就像ajaxterm一样)并且不知道要发送到ssh隧道的哪个转义序列(打开通过paramiko.SSHClient().invoke_shell(term='linux')
).
我找到了一个关键记录器并在$ TERM =='linux'的终端中尝试了它,但它返回了相同的序列ctrl+left
和left
(27,91,68).
如果我在另一个终端尝试键盘记录器(使用$ TERM =='xterm'),我会得到代码(27,91,49,59,53,68).但是这些代码不会移动从SSH通道生成预期的输出(这将在正常的Linux shell上移动光标一个字).即使我用term ='xterm'开始paramiko也是如此.
知道我应该使用什么序列?或者为什么上面的序列不起作用?
更新:我很乐意使用另一种终端类型(不是"linux"),但遗憾的是pyte仅适用于VTxxx终端(我相信"linux"是类似vt220的终端 - 无论如何,它都有效),所以xterm不起作用正常.
是否有可能通过VT100/xterm终端(Mac OS X终端)将密钥"C-("发送到Emacs?是否有可以发送的转义序列以实现等效?
我怀疑基本问题是控制与字符"("(以及使用shift生成的其他此类字符)组合的概念不存在.
注意:使用Cocoa Emacs不是一种选择.需要"C-("的原因是paredit.el在其他键组合中使用它,并且最好不重新映射它(因为将它放在"C-(")上是有意义的.
我正在编写一个记录终端交互的Python程序(类似于脚本程序),我想在写入磁盘之前过滤掉VT100转义序列.我想使用这样的函数:
def strip_escapes(buf):
escape_regex = re.compile(???) # <--- this is what I'm looking for
return escape_regex.sub('', buf)
Run Code Online (Sandbox Code Playgroud)
应该escape_regex
怎么做?
我打算编写网关Web应用程序,它需要具有VT100/ANSI转义码支持的"终端窗口".是否有基于AJAX的替代方案来执行此类任务?
我在想这样的事情:http://tryruby.hobix.com/
我首选的系统后端是Python/Twisted/Pylons,但由于我只是计划,我将探索每个选项.
在Perl中有一个非常方便的模块,Term :: VT102,它允许您在内存中创建一个屏幕.这对于抓取目的非常方便,因为您可以跟踪屏幕各部分的所有更改,然后将屏幕导出为纯文本进行处理.Python中是否有等效的模块?
后续问题:像Pexpect这样的模块可以让你屏幕刮掉VT100屏幕,但是VT100与VT102的不同之处是什么?
我正在考虑创建一个像终端窗口一样的WPF或Silverlight应用程序.除了,因为它在WPF/Silverlight中,它将能够通过效果,图像等"增强"终端体验.
我正试图找出模拟终端的最佳方法.我知道如何处理VT100仿真,就解析等而言.但是如何显示呢?我考虑过使用RichTextBox并将VT100转义代码转换为RTF.
我看到的问题是性能.终端可能一次只能获得几个字符,并且为了能够将它们加载到文本框中,我将不断创建TextRanges并使用Load()来加载RTF.此外,为了完成每个加载"会话",它必须完全描述RTF.例如,如果当前颜色为红色,则每个加载到TextBox中都需要RTF代码才能使文本变为红色,或者我认为RTB不会将其加载为红色.
这似乎非常多余 - 由仿真构建的RTF文档将非常混乱.此外,插入符号的移动似乎不是理想情况下RTB处理的.我需要一些自定义的东西,但是这让我很害怕!
希望听到明亮的想法或指向现有解决方案.也许有一种方法可以在其上嵌入一个实际的终端和覆盖物.我发现的唯一的东西是旧的WinForms控件.
更新:在下面的答案中查看由于perf的建议解决方案是如何失败的.:(
Windows WPF或Silverlight中的VT100终端仿真
我尝试在控制台中移动光标。
我发现 vt100 代码可以做到这一点。
#include<stdio.h>
int main()
{
printf("123456789\n");
printf("\033A");
printf("abcdefghi\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它的输出与计划不同。这是上面的代码在控制台中打印的内容。
第二行“A”前面有个小箭头,不能放到网上
123456789
Aabcdefghi
Run Code Online (Sandbox Code Playgroud)
在 Windows 的 Visual Studio 中编程时如何使用 vt100 代码?
这将是一个很长的,所以提前道歉..
我正在使用shellinabox为我的团队编写基于Web的会话管理器.目前我按照我想要的方式工作,每个新连接都在另一个端口上启动一个新的shellinaboxd实例(如果需要).但PuTTY连接管理器(我们目前使用的)我无法工作的一件事是自动登录命令.建立连接后,我们会自动传递我们的凭据,然后是我们可能使用的任何其他登录后命令(cd/tmp等).
有了提琴手,我可以看到我制作的每一个按键发送根目录的帖子.例:
http://localhost:1234/?width=190&height=52&session=J793zjWa6gtKXEeV%2FeyY7g&keys=0D
Run Code Online (Sandbox Code Playgroud)
所以我认为,如果我捕获了那个会话令牌,我可以用wget或curl测试,以便将帖子数据发送到该会话.不起作用......
我的问题是,任何人都可以给我任何关于下一步尝试的指示吗?最后,对于我的POC,我想在页面上有一个按钮(我将链接嵌入到另一个页面中),这将允许我按下,并发送按键以获取字符串(我可以将字符串处理为十六进制)转换)直接到控制台视图.我显然不在这个方面,因为我不知道下一步该尝试什么.我知道shellinabox使用vt100作为它的控制台.我查看了它的JS,但找不到js中发送键击的位置.此外,一旦我打开嵌入了shellinabox的页面,我该如何拉出它正在使用的当前"会话"令牌?
任何帮助/指针将不胜感激.