在python curses中使用哪个$ TERM同时具有256色和鼠标移动事件?

Wul*_*ire 3 python curses ncurses xterm python-curses

当前,如果我将TERM环境变量设置为'xterm-1003',则可以获取鼠标移动事件,但是会得到cr脚的颜色和诅咒.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()
Run Code Online (Sandbox Code Playgroud)

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

>ls /usr/share/terminfo/x/ 
Run Code Online (Sandbox Code Playgroud)

报告

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
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Tho*_*key 6

您始终可以使用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.
Run Code Online (Sandbox Code Playgroud)

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

所以...

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

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