代码之家  ›  专栏  ›  技术社区  ›  anthony sottile

在诅咒中区分^J和<Enter>

  •  0
  • anthony sottile  · 技术社区  · 5 年前

    vim )治疗 ^J <Enter> 同一个按键

    nano 它使用 ^日本

    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())
    

    两者皆适用 ^日本 (control+J)和 <enter>

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

    我如何区分这两个?

    1 回复  |  直到 5 年前
        1
  •  1
  •   anthony sottile    5 年前

    设置 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 然后 <输入> :

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