区分 curses 中的 ^J 和 <Enter>

Differentiate between ^J and <Enter> in curses

我注意到一些 curses 应用程序(例如 vim)将 ^J<Enter> 视为相同的按键

我还注意到其他人将它们视为单独的键(例如 nano^J 用于 "Justify")

在我的特殊情况下,我使用的是 curses 到 python,但是这两种印刷机似乎给出相同的值

这是一个小型演示应用程序:

import curses


def c_main(stdscr):
    wch = ''
    while wch != 'q':
        stdscr.addstr(0, 0, 'Press a key, q to quit: ')
        wch = stdscr.get_wch()
        key = wch if isinstance(wch, int) else ord(wch)
        keyname = curses.keyname(key)
        stdscr.insstr(1, 0, f'> got {wch!r} {key!r} {keyname!r}{" " * 80}')


def main():
    curses.wrapper(c_main)


if __name__ == '__main__':
    exit(main())

对于 ^J (control + J) 和 <enter> (enter key) 我得到以下信息:

Press a key, q to quit: 
> got '\n' 10 b'^J'

如何区分这两者?

设置 curses.nonl() 禁止将 <enter> 键转换为 '\n'

例如:

import curses


def c_main(stdscr):
    curses.nonl()
    wch = ''
    i = 1
    while wch != 'q':
        stdscr.addstr(0, 0, 'Press a key, q to quit: ')
        stdscr.keypad(False)
        wch = stdscr.get_wch()
        key = wch if isinstance(wch, int) else ord(wch)
        keyname = curses.keyname(key)
        stdscr.insstr(i, 0, f'> got {wch!r} {key!r} {keyname!r}{" " * 80}')
        i += 1


def main():
    curses.wrapper(c_main)

然后发出 ^J 然后发出 <enter>:

Press a key, q to quit: 
> got '\n' 10 b'^J'
> got '\r' 13 b'^M'