5

目前,如果我将 TERM 环境变量设置为“xterm-1003”,我可以获得鼠标移动事件,但我会得到糟糕的颜色和 curses.can_change_color() == False

os.environ['TERM'] = 'xterm-1003'
...
curses.mousemask(curses.ALL_MOUSE_EVENTS | curses.REPORT_MOUSE_POSITION)
...
while True:
    event = screen.getch()
    if event == curses.KEY_MOUSE:
        # I get nice events whenever I move the mouse (no click required)
        _, mx, my, _, _ = curses.getmouse()

如果我将 TERM env var 设置为“xterm-256color”,我会得到一个不错的调色板加上 curses.can_change_color() == True,但是除非我单击按钮,否则我不会收到鼠标事件!

>ls /usr/share/terminfo/x/ 

报告

xfce           xterm-256color  xterm-hp      xterm-r5     xterm-xf86-v32   xterm-xfree86
xterm          xterm-88color   xterm-new     xterm-r6     xterm-xf86-v33   xterm-xi
xterm-1002     xterm-8bit      xterm-nic     xterm-sco    xterm-xf86-v333  xterms
xterm-1003     xterm-basic     xterm-noapp   xterm-sun    xterm-xf86-v40
xterm-16color  xterm-bold      xterm-old     xterm-vt220  xterm-xf86-v43
xterm-24       xterm-color     xterm-pcolor  xterm-vt52   xterm-xf86-v44

我尝试过的似乎都不支持 curses.can_change_color() == True 和鼠标移动事件。有没有办法通过设置适当的 $TERM 值或其他方式来获得它们?

谢谢!

4

2 回答 2

9

您总是可以自己制作,使用infocmp(显示条目的内容)和tic(编译条目)。如果您没有权限写入系统区域,则转到 $HOME/.terminfo

首先比较xterm-1003xterm-256color

> infocmp -x xterm-1003 xterm-256color
comparing xterm-1003 to xterm-256color.
    comparing booleans.
        ccc: F:T.
    comparing numbers.
        colors: 8, 256.
        pairs: 64, 32767.
    comparing strings.
        initc: NULL, '\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\'.
        setab: '\E[4%p1%dm', '\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m'.
        setaf: '\E[3%p1%dm', '\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m'.
        setb: '\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m', NULL.
        setf: '\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m', NULL.
        XM: '\E[?1003%?%p1%{1}%=%th%el%;', NULL.

本质上,您感兴趣的只是将XM功能添加到xterm-256color.

所以...

  1. infocmp -x xterm-256color >foo
  2. 编辑foo,添加XM字符串
  3. tic -x foo

tic编译该功能需要“-x”选项XM,这是一个扩展的(用户定义的)功能,ncurses 碰巧可以识别,如终端数据库的注释中所述。

于 2015-03-13T01:29:51.373 回答
0

问题:即使没有按下鼠标按钮,也会报告鼠标位置。

此答案旨在扩展Thomas Dickey 在此处发布的其他答案。使用提供的链接和基本步骤,我设法找到了一个 XM 字符串,它给了我想要的鼠标行为。

我在另一个答案中遇到的 XM 字符串的问题是即使没有按住鼠标按钮,鼠标位置也会被报告。仅当按下鼠标按钮时,我才想要鼠标位置。换句话说,我想要“鼠标拖动”事件。持续报告可能有利于实现“鼠标悬停”功能,但我不需要这样做,所以所有额外的报告只会导致应用程序事件循环中的循环浪费。

我为找到正确的 XM 字符串所采取的步骤是:

  1. 如另一个答案中所述创建一个“foo”文件:infocmp -x xterm-256color > foo
  2. 终端数据库链接中获取文本并提取所有 XM 字符串(如下提供)。
  3. 将其中一个 XM 字符串添加到我的“foo”副本并发出tic -x foo(新配置立即生效)。
  4. 运行我的程序以查看鼠标位置是否符合要求。
  5. 如果行为不同,请返回步骤 3 并尝试下一个字符串。

从“终端数据库”链接中提取的(已注释掉的)XM 字符串:

#    XM=\E[?9%?%p1%{1}%=%th%el%;,
#    XM=\E[?9%?%p1%{1}%=%th%el%;,
#    xm=\E[M%p3%' '%+%c%p2%'!'%+%c%p1%'!'%+%c,
#    XM=\E[?1000%?%p1%{1}%=%th%el%;,
#    xm=\E[M%?%p4%t%p3%e%{3}%;%'\s'%+%c%p2%'!'%+%c%p1%'!'%+%c,
#    XM=\E[?1001%?%p1%{1}%=%th%el%;,
#    XM=\E[?1002%?%p1%{1}%=%th%el%;,
#    XM=\E[?1003%?%p1%{1}%=%th%el%;,
#    XM=\E[?1005;1000%?%p1%{1}%=%th%el%;,
#    xm=\E[M%?%p4%t3%e%p3%'\s'%+%c%;%p2%'!'%+%u%p1%'!'%+%u,
#    XM=\E[?1006;1000%?%p1%{1}%=%th%el%;,
#    xm=\E[<%i%p3%d;%p1%d;%p2%d;%?%p4%tM%em%;,

适用于我的 Ubuntu 20 系统的 bash 终端的字符串是:

    XM=\E[?1002%?%p1%{1}%=%th%el%;,

当我的应用程序几乎准备好分发时,我预计未来会有一些额外的工作在其他系统上启用此行为。

另一个潜在的问题是这种 hack 通常会影响 bash 行为——不仅仅是当我的应用程序在 bash 终端中运行时。也许更好的解决方案不是调整xterm-256color文件,而是创建一个不太可能与标准文件混淆的另一个名称的自定义文件。然后在我的应用程序中将TERM环境变量设置为它,然后再启动curses.

    os.environ['TERM'] = 'mouse-tweaked-xterm-256color'
    curses.wrapper(start_my_app)

更新: 生成的新xterm-256color文件tic位于我的系统上的${HOME}/.terminfo/x/. 我更改了它的名称并实现了上面的代码以TERM在应用程序中设置。

于 2022-01-16T23:54:54.450 回答