V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LonnyWong
V2EX  ›  程序员

求助:有人有空用 go 实现这段 c 代码吗?

  •  
  •   LonnyWong · 318 天前 · 3337 次点击
    这是一个创建于 318 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://github.com/PowerShell/openssh-portable/blob/latestw_all/contrib/win32/win32compat/tncon.c

    不知道有没有人有空将这个 c 代码用 go 重写出来,可以变成一个 go package ,最好不用 cgo (除非能让用户方便地编译安装)。

    最好 queue_terminal_window_change_event() 能变成一个 go 回调。

    在用 go 重写时,可以参考这个代码: https://github.com/chzyer/readline/blob/master/rawreader_windows.go

    或许 ChatGPT 可以帮忙减轻一部分工作。

    关联 issue: https://github.com/trzsz/trzsz-ssh/issues/5#issuecomment-1579581438

    34 条回复    2023-06-07 14:57:08 +08:00
    bigtang
        1
    bigtang  
       318 天前
    用 chatgpt 一段一段转不行吗?
    LonnyWong
        2
    LonnyWong  
    OP
       318 天前 via iPhone
    @bigtang 应该是可以的,我只是没空搞。看有没有人有兴趣参与。
    deorth
        3
    deorth  
       318 天前 via Android
    没有,得加钱
    LonnyWong
        4
    LonnyWong  
    OP
       318 天前 via iPhone   ❤️ 1
    @deorth 哈,说的好,我也想有钱收。开源搞了这么久,只有一个哥们赞赏了,见 https://github.com/trzsz/trzsz-go 最下面的感谢。
    token10086
        5
    token10086  
       317 天前
    本来想上来骂两句,结果一看是做开源,我闭嘴了。你们到底谁有空帮作者转转,我点星星关注了
    xdeng
        6
    xdeng  
       317 天前
    跟系统 API 打交道就不可能不用 cgo
    proxytoworld
        7
    proxytoworld  
       317 天前
    只需要这一个 c 文件?
    whoami9894
        8
    whoami9894  
       317 天前
    @xdeng 谁告诉你的?
    IanHo
        9
    IanHo  
       317 天前
    chatgpt 真的好使,建议试试
    Nazz
        10
    Nazz  
       317 天前
    @xdeng 系统调用不需要 CGO
    LonnyWong
        11
    LonnyWong  
    OP
       317 天前
    @proxytoworld 对,就一个文件。然后我在网上找到了 https://github.com/moby/term/blob/9c3c875fad924eb6c9dd32a361b5fc0a49a4feb9/windows/ansi_reader.go#L34

    我不知道这个 NewAnsiReader 和 ReadConsoleForTermEmul 会有什么区别。Ctrl + Space 以及 窗口变更大小时的事件,估计是还不支持的。给作者提了个 issue: https://github.com/moby/term/issues/44 ,不知作者会怎么看。
    ysc3839
        12
    ysc3839  
       317 天前 via Android   ❤️ 1
    怀疑是 X-Y Problem ,建议说原始需求
    ysc3839
        13
    ysc3839  
       317 天前 via Android
    如果是为了兼容 Win7 等老系统,建议放弃,让用户去用 winpty 等方案
    LonnyWong
        14
    LonnyWong  
    OP
       317 天前
    @ysc3839 我感觉也是。ReadConsoleForTermEmul 这个是专门为 ssh 开发的,感觉兼容性应该会做的很不错。NewAnsiReader 我看他首页的目标也是 term helper functions 。主要是键盘能按出的组合键太多了,我不清楚他们之间会有什么样的差异,或者作者自己会很清楚。
    LonnyWong
        15
    LonnyWong  
    OP
       317 天前
    @ysc3839 Win11 也不支持 Ctrl + Space ,从 os.Stdin 读不到任何数据,从 ReadConsoleInputW 是可以读到的。但不能与 os.Stdin 同时用,用 ReadConsoleInputW 就得确保所有的键都转换正确,要不然就可能引入其他的问题。
    ysc3839
        16
    ysc3839  
       317 天前 via Android
    @LonnyWong 所以你是没用 ConPTY ?
    ysc3839
        17
    ysc3839  
       317 天前 via Android
    @LonnyWong 是我搞烦了,获取输入的话要开启 ENABLE_VIRTUAL_TERMINAL_INPUT
    https://learn.microsoft.com/en-us/windows/console/setconsolemode
    老系统就让用户去用 MSYS2 吧,没有折腾的必要
    LonnyWong
        18
    LonnyWong  
    OP
       317 天前
    @ysc3839 https://github.com/trzsz/trzsz-go 这个就是用 ConPTY 的,超级慢。

    然后 https://github.com/trzsz/trzsz-ssh 是直接连远程服务器的,没用 ConPTY ,如果远程服务器不是 Windows ,就很快。
    ysc3839
        19
    ysc3839  
       317 天前 via Android
    @LonnyWong 嫌慢的话可以尝试换成 winpty 。你看看网上一堆 Windows 终端都是用 ConPTY 的,也不见他们嫌慢。
    LonnyWong
        20
    LonnyWong  
    OP
       317 天前
    @ysc3839 我说的慢是指 Windows 的 stream IO 特别慢。从 trzsz 进程,将数据通过 stdin 传给 ConTPY 时,这个过程超级慢。
    whitehack
        21
    whitehack  
       317 天前
    给了个 star.实用工具
    Masoud2023
        22
    Masoud2023  
       317 天前
    看到那行`#include <windows.h>`我觉得你不用 cgo 基本就等于做梦了
    xdeng
        23
    xdeng  
       317 天前
    @Nazz 说错了
    cppc
        24
    cppc  
       317 天前
    那个代码里面调用了 win32 函数,纯 GO 怕是不得行
    LonnyWong
        25
    LonnyWong  
    OP
       317 天前
    @Masoud2023
    @cppc

    不是纯 Go ,只是最好不用 CGO ,可以调用 win32 的 dll ,参考 https://github.com/chzyer/readline/blob/master/rawreader_windows.go 这个来实现。
    timonwong
        26
    timonwong  
       317 天前
    不见得要 cgo ,不过要 syscall
    ysc3839
        27
    ysc3839  
       317 天前 via Android
    所以说了这么多楼主有去试一下 ENABLE_VIRTUAL_TERMINAL_INPUT 吗?
    现成的包都有 https://pkg.go.dev/cdr.dev/coder-cli/internal/x/xterminal
    ysc3839
        29
    ysc3839  
       317 天前 via Android
    @LonnyWong 所以原始问题是什么?
    LonnyWong
        30
    LonnyWong  
    OP
       317 天前 via iPhone
    @ysc3839 关联 issue 里说的问题 https://github.com/trzsz/trzsz-ssh/issues/5#issuecomment-1579581438
    Ctrl + Space 键的问题。

    另外,我发现 https://github.com/PowerShell/openssh-portable/blob/latestw_all/contrib/win32/win32compat/tncon.c 这里面订阅窗口大小变更事件的做法挺好的,比我每秒检测一下窗口大小有没有变化好多了。
    ysc3839
        31
    ysc3839  
       317 天前 via Android
    @LonnyWong 这个问题确实是只能自己解析了。

    不过我自己的态度是,这种问题还是不要在自己程序里解决,尤其是移植起来很麻烦的情况。
    不知道改用 mintty 是否能解决,不行的话还可以试试 MSYS2 兼容层。
    LonnyWong
        32
    LonnyWong  
    OP
       317 天前 via iPhone
    @ysc3839 我感觉 https://github.com/moby/term/blob/9c3c875fad924eb6c9dd32a361b5fc0a49a4feb9/windows/ansi_reader.go#L34 这个稍微改一下,或许也是可以的,看作者会不会支持了。
    lysS
        33
    lysS  
       317 天前
    这可不是一个 c 文件的事,通常 h 引 h, h 又引 h
    LonnyWong
        34
    LonnyWong  
    OP
       317 天前 via iPhone
    @lysS 这个真的就这个文件,外加一个 .h
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2355 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:01 · PVG 09:01 · LAX 18:01 · JFK 21:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.