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
1
bigtang 2023-06-07 08:09:25 +08:00
用 chatgpt 一段一段转不行吗?
|
3
deorth 2023-06-07 08:22:33 +08:00 via Android
没有,得加钱
|
4
LonnyWong OP @deorth 哈,说的好,我也想有钱收。开源搞了这么久,只有一个哥们赞赏了,见 https://github.com/trzsz/trzsz-go 最下面的感谢。
|
5
token10086 2023-06-07 09:50:02 +08:00
本来想上来骂两句,结果一看是做开源,我闭嘴了。你们到底谁有空帮作者转转,我点星星关注了
|
6
xdeng 2023-06-07 10:03:12 +08:00
跟系统 API 打交道就不可能不用 cgo
|
7
proxytoworld 2023-06-07 10:05:32 +08:00
只需要这一个 c 文件?
|
8
whoami9894 2023-06-07 10:10:57 +08:00
@xdeng 谁告诉你的?
|
9
IanHo 2023-06-07 10:22:36 +08:00
chatgpt 真的好使,建议试试
|
11
LonnyWong OP @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 ,不知作者会怎么看。 |
12
ysc3839 2023-06-07 10:37:28 +08:00 via Android 1
怀疑是 X-Y Problem ,建议说原始需求
|
13
ysc3839 2023-06-07 10:39:24 +08:00 via Android
如果是为了兼容 Win7 等老系统,建议放弃,让用户去用 winpty 等方案
|
14
LonnyWong OP @ysc3839 我感觉也是。ReadConsoleForTermEmul 这个是专门为 ssh 开发的,感觉兼容性应该会做的很不错。NewAnsiReader 我看他首页的目标也是 term helper functions 。主要是键盘能按出的组合键太多了,我不清楚他们之间会有什么样的差异,或者作者自己会很清楚。
|
15
LonnyWong OP @ysc3839 Win11 也不支持 Ctrl + Space ,从 os.Stdin 读不到任何数据,从 ReadConsoleInputW 是可以读到的。但不能与 os.Stdin 同时用,用 ReadConsoleInputW 就得确保所有的键都转换正确,要不然就可能引入其他的问题。
|
17
ysc3839 2023-06-07 10:51:20 +08:00 via Android
@LonnyWong 是我搞烦了,获取输入的话要开启 ENABLE_VIRTUAL_TERMINAL_INPUT
https://learn.microsoft.com/en-us/windows/console/setconsolemode 老系统就让用户去用 MSYS2 吧,没有折腾的必要 |
18
LonnyWong OP @ysc3839 https://github.com/trzsz/trzsz-go 这个就是用 ConPTY 的,超级慢。
然后 https://github.com/trzsz/trzsz-ssh 是直接连远程服务器的,没用 ConPTY ,如果远程服务器不是 Windows ,就很快。 |
19
ysc3839 2023-06-07 10:55:08 +08:00 via Android
@LonnyWong 嫌慢的话可以尝试换成 winpty 。你看看网上一堆 Windows 终端都是用 ConPTY 的,也不见他们嫌慢。
|
20
LonnyWong OP @ysc3839 我说的慢是指 Windows 的 stream IO 特别慢。从 trzsz 进程,将数据通过 stdin 传给 ConTPY 时,这个过程超级慢。
|
21
whitehack 2023-06-07 11:11:06 +08:00
给了个 star.实用工具
|
22
Masoud2023 2023-06-07 11:21:02 +08:00
看到那行`#include <windows.h>`我觉得你不用 cgo 基本就等于做梦了
|
24
cppc 2023-06-07 11:34:32 +08:00
那个代码里面调用了 win32 函数,纯 GO 怕是不得行
|
25
LonnyWong OP @Masoud2023
@cppc 不是纯 Go ,只是最好不用 CGO ,可以调用 win32 的 dll ,参考 https://github.com/chzyer/readline/blob/master/rawreader_windows.go 这个来实现。 |
26
timonwong 2023-06-07 11:42:12 +08:00
不见得要 cgo ,不过要 syscall
|
27
ysc3839 2023-06-07 11:51:29 +08:00 via Android
所以说了这么多楼主有去试一下 ENABLE_VIRTUAL_TERMINAL_INPUT 吗?
现成的包都有 https://pkg.go.dev/cdr.dev/coder-cli/internal/x/xterminal |
28
LonnyWong OP |
30
LonnyWong OP @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 这里面订阅窗口大小变更事件的做法挺好的,比我每秒检测一下窗口大小有没有变化好多了。 |
31
ysc3839 2023-06-07 13:25:45 +08:00 via Android
@LonnyWong 这个问题确实是只能自己解析了。
不过我自己的态度是,这种问题还是不要在自己程序里解决,尤其是移植起来很麻烦的情况。 不知道改用 mintty 是否能解决,不行的话还可以试试 MSYS2 兼容层。 |
32
LonnyWong OP @ysc3839 我感觉 https://github.com/moby/term/blob/9c3c875fad924eb6c9dd32a361b5fc0a49a4feb9/windows/ansi_reader.go#L34 这个稍微改一下,或许也是可以的,看作者会不会支持了。
|
33
lysS 2023-06-07 14:20:11 +08:00
这可不是一个 c 文件的事,通常 h 引 h, h 又引 h
|