草庐IT

linux - 反终端 : unexpected behavior on Windows

coder 2024-06-19 原文

我正在试验 ansi-terminal在 Haskell 中,与 Linux 相比,Windows 上的行为似乎有问题。在 Linux 上,我得到一个蓝色的“@”,我可以用 wasd 键移动它(如预期的那样),并且可以通过按任何其他键退出。在 Windows 上,我只是得到一个不动的白色“@”,根本无法移动角色。

如何在 Windows 中复制 Linux 行为?

一些注意事项:

  • 在 Windows 下,我的意思是我在 wine 下编译和运行
  • cabal 1.18.0.3
  • ghc 7.6.3
  • 通过“wine cabal install”安装了 ansi-terminal
  • 如果可能,我宁愿不必使用 ncurses (hscurses)

更新:最小的失败代码是:

import System.Console.ANSI

main :: IO ()
main = do
    clearScreen
    setCursorPosition 0 0
    setSGR [SetColor Foreground Vivid Blue]
    putStrLn "@"
    setSGR [Reset] 

在 Linux 上,这样做是“正确”的,因为打印了一个蓝色的“@”。在 wine 下,我看不到任何变化。我希望这只是 wine 而不是 Windows 的特性,因为我无法访问 Windows 框来试用它。

我试过的(原始)代码:

module Main where

import Data.Monoid 
import Control.Monad (unless)
import System.Console.ANSI
import System.IO

-- | thin wrapper around ansi-terminal's API ------------------------------
reset :: IO ()
reset = hSetSGR stdout [Reset]

bold :: [SGR]
bold = [SetConsoleIntensity BoldIntensity]

normal :: [SGR]
normal = [SetConsoleIntensity NormalIntensity]

background :: ColorIntensity -> Color -> [SGR]
background i c = [SetColor Background i c]

foreground :: ColorIntensity -> Color -> [SGR]
foreground i c = [SetColor Foreground i c]

swap :: [SGR]
swap = [SetSwapForegroundBackground True]

underline :: [SGR]
underline = [SetUnderlining SingleUnderline]

noUnderline :: [SGR]
noUnderline = [SetUnderlining NoUnderline]


-- Main -------------------------------------------------------------------
initTerminal :: IO ()
initTerminal = do
    hSetEcho stdin False
    mapM_ (`hSetBuffering` NoBuffering) [stdin, stdout]
    hideCursor
    hSetTitle stdout "Functional Wizardry: The Roguelike"

run :: Int -> Int -> IO ()
run x y = do
    hClearScreen stdout
    hSetCursorPosition stdout x y
    setSGR $ bold <> foreground Vivid Blue
    putStr "@"
    (x', y') <- getInput

    unless ((x', y') == (-1, -1)) $ run (x + x') (y + y')


getInput :: IO (Int, Int)
getInput = do
    char <- getChar
    case char of
        'a' -> return (0, -1)
        'd' -> return (0, 1)
        'w' -> return (1, 0)
        's' -> return (-1, 0)
        _ -> do
            hClearScreen stdout
            hSetCursorPosition stdout 0 0
            return (-1, -1)


main :: IO ()
main = do
    initTerminal
    run 0 0
    reset

最佳答案

您的 Windows 控制台是否支持 ANSI? ANSI 终端中的字符颜色和光标定位是通过流式传输特定的 ESC 序列(及时回溯到 VT-100 DEC 终端,有些可能更早)来完成的。这需要将控制台作为流媒体设备公开。上次我尝试使用 xterm 支持的 ANSI 代码时,它在 Windows 上不起作用,我不得不编写一个 native 库来公开对 Windows 控制台 API 的访问。这是因为我能找到的 API 将 Windows 控制台暴露为不透明的 API,没有流式传输行为。

警告:我在 Java 中尝试过,但除非 Haskell ansi-terminal 库执行一些特定于平台的魔法而不是普通的 ANSI ESC 序列,否则它会以同样的方式失败。

尝试从一开始就运行 20 20 - 您是在 20,20 处得到 @,还是仍然是 0,0?如果它仍然是 0,0,那肯定是 Windows 控制台支持 ANSI 的问题。我不知道是否可以将其配置为支持 ANSI。

关于linux - 反终端 : unexpected behavior on Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22797392/

有关linux - 反终端 : unexpected behavior on Windows的更多相关文章

  1. 【Linux操作系统】——网络配置与SSH远程 - 2

    Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好

  2. Linux磁盘分区中物理卷(PV)、卷组(VG)、逻辑卷(LV)创建和(LVM)管理 - 2

    文章目录一基础定义二创建逻辑卷2-1准备物理设备2-2创建物理卷2-3创建卷组2-4创建逻辑卷2-5创建文件系统并挂载文件三扩展卷组和缩减卷组3-1准备物理设备3-2创建物理卷3-3扩展卷组3-4查看卷组的详细信息以验证3-5缩减卷组四扩展逻辑卷4-1检查卷组是否有可用的空间4-2扩展逻辑卷4-3扩展文件系统五删除逻辑卷5-1备份数据5-2卸载文件系统5-3删除逻辑卷5-4删除卷组5-5删除物理卷六LVM逻辑卷缩容6-1缩容注意事项6-2标准缩容步骤一基础定义LVM,LogicalVolumeManger,逻辑卷管理,Linux磁盘分区管理的一种机制,建立在硬盘和分区上的一个逻辑层,提高磁盘分

  3. ruby - 如何在 Ruby 中获取 linux 系统信息 - 2

    如何在Ruby中获取linux系统(这必须适用于Fedora、Ubuntu等)的软件/硬件信息? 最佳答案 Chef背后的优秀人才,拥有一颗名为Ohai的优秀gemhttps://github.com/opscode/ohai以散列形式返回系统信息,例如操作系统、内核、规范、fqdn、磁盘、空间、内存、用户、接口(interface)、sshkey等。它非常完整,非常好。它还会安装命令行二进制文件(也称为ohai)。 关于ruby-如何在Ruby中获取linux系统信息,我们在Stack

  4. ruby - rbenv:在 Linux Mint 上找不到 gem 命令 - 2

    我在LinuxMint17.2上。我最近使用apt-getpurgeruby​​删除了ruby​​。然后我安装了rbenv然后rbenvinstall2.3.0所以现在,~/.rbenv/versions/2.3.0/bin/ruby存在。但是现在,我无法执行geminstallrubocop。我明白了:$geminstallrubocoprbenv:gem:commandnotfoundThe`gem'commandexistsintheseRubyversions:2.3.0但是我可以~/.rbenv/versions/2.3.0/bin/geminstallrubocop。但是,

  5. ruby - 在 Linux 上编译 Ruby 1.9.2 所需的先决条件? - 2

    我是Ruby和RoR的新手。我有一个带有Ubuntu镜像的干净Linode实例,我想从源代码编译Ruby而不是使用apt-get。我已经在谷歌上搜索了执行此操作的说明,但经过一些尝试后,当我尝试运行一些教程示例时,我不断收到有关缺少zlib和其他一些包的错误。任何人都可以给我详细的说明(或链接),教我如何在从源代码编译Ruby之前安装必要的必备包吗?我的目的是编译Ruby的最新稳定版本,然后安装Rubygems和Rails。提前感谢您的帮助!!! 最佳答案 Thisblogpost涵盖从源代码编译ruby​​所需的包和安装过程;它引

  6. ruby-on-rails - 验证终端命令已在 Rails 中成功运行的最佳方法是什么? - 2

    我正在编写一个快速的Rails应用程序,并且想知道如何验证执行的命令是否成功。我正在运行的两个命令是SVN更新,以及从一个目录到另一个目录的cp。 最佳答案 如果您使用Kernel.system()方法,它将返回一个bool值,指示命令是否成功。result=system("cp-rdir1dir2")if(result)#dothenextthingelse#handletheerror不同的ruby系统命令有很好的比较here. 关于ruby-on-rails-验证终端命令已在Rai

  7. Linux网络编程必备的POSIX API的细节 - 2

    目录POSIXAPI大集合五元组三次握手的过程,内核协议栈分析listen函数DDOS攻击,洪水攻击DDOS攻击的应对措施数据发送 怎么保证顺序?如何保证包地顺序到达(序号+确认应答机制+重传)TCP断开连接的过程问题1.大量的CLOSE_WAIT+FIN_WAIT2是为啥?time_wait状态存在的原因?POSIXAPI大集合五元组(sip,sport,dip,dport,protocol)三次握手的过程,内核协议栈分析内核协议栈中是有内核数据结构的.  我们send/write数据,都是先发送到内核协议栈中,然后由内核协议栈封装发送到物理介质中传输到对端的对端的接收过程也是经有内核协议栈

  8. Linux export 命令及如何删除export设置的环境变量 - 2

    背景:Linuxexport命令用于设置或显示环境变量。在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅限于该次登陆操作。语法:export[-fnp][变量名称]=[变量设置值]参数说明:-f 代表[变量名称]中为函数名称。-n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。-p 列出所有的shell赋予程序的环境变量。实例:列出当前所有的环境变量#export-p//列出当前的环境变量值定义环境变量赋值#exportMYENV=7//定义环境变量并赋值添加环境变量:默认保存在

  9. Linux操作系统CentOS7安装Nginx[详细版] - 2

    Nginx安装1.官网下载Nginx2.使用XShell和Xftp将压缩包上传到Linux虚拟机中3.解压文件nginx-1.20.2.tar.gz4.配置nginx5.启动nginx6.拓展(修改端口和常用命令)(一)修改nginx端口(二)常用命令1.官网下载Nginxhttp://nginx.org/en/download.html这里我下载的是1.20.2版本,大家按需下载对应稳定版即可2.使用XShell和Xftp将压缩包上传到Linux虚拟机中没有XShell可以参考《Linux操作系统CentOS7连接XShell》3.解压文件nginx-1.20.2.tar.gz1)检查是否存

  10. 【Linux】初识Linux --指令Ⅰ - 2

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法,Linux…感兴趣就关注我吧!你定不会失望。目录1.ls显示当前目录下的文件内内容2.pwd-显示用户当前所在的目录3.cd-改变工作目录。将当前工作目录改变到指定的目录下1.cd-回到上一次待的工作空间2.cd..返回上一层目录1.相对路径:cd../aurora2.绝对路径:cd/home/aurora/lesson1/aurora3.cd~进入用户家目录4.cd/进入root目录4.mkdir-新建目录5.rmdir/rm-删除1.rmdir删除空文件夹2.rm删除1.rm-f2.rm-i3.rm-r1.ls显示当前目

随机推荐