JFA*_*JFA 6 python text-editor
这可能是一个xy问题,但我正在尝试构建一个基于内核的文本编辑器,类似于vim
或者nano
,我知道如何使用转义字符清除屏幕,然后重新打印,我可以让它接受字符,但是我不知道如何让它接受箭头输入导航.我认为它们有ASCII值,但显然不是.有没有办法使用箭头,还是我必须进行导航模式和插入模式vim
?
我也曾经简单地玩过curses
,但这是令人望而却步的,因为据我所知,必须为它打开一个全新的窗口,这与我所拥有的单个终端窗口的视觉不兼容.
编辑:curses
也是禁止,因为它清除了窗口,我不想要.
curses
是正是你想要的.事实上,我相信vim实现了与curses的接口.
尝试将以下代码放入名为的文件中test_curses.py
:
import curses
screen = curses.initscr()
screen.addstr("Hello World!!!")
screen.refresh()
screen.getch()
curses.endwin()
Run Code Online (Sandbox Code Playgroud)
现在打开一个终端(不是IDLE!一个真正的终端!)并通过以下方式运行它:
python test_curses.py
Run Code Online (Sandbox Code Playgroud)
您应该看到终端被清除并且Hello World!!!
出现了一个写作.按任意键,程序将停止,恢复旧的终端内容.
请注意,curses
库并不像您习惯的那样简单且"用户友好".我建议阅读教程(不幸的是C语言,但python接口大致相同)
我最终使用了这个问题中的代码,并修改了__init__
语句,以便它在列表中最多接受 3 个字符。
import sys
class _Getch:
"""Gets a single character from standard input. Does not echo to the
screen."""
def __init__(self):
self.impl = _GetchUnix()
def __call__(self):# return self.impl()
charlist = []
counter = 0
for i in range(3):
try:charlist.append(self.impl())
except:pass
if charlist[i] not in [chr(27),chr(91)]:#TODO sort out escape vs arrow duh use len()
break
if len(charlist) > 1:
if charlist == [chr(27),chr(27)]:
break
if len(charlist) == 3:
if charlist[2] == 'a'
return 'u-arr'
if charlist[2] == 'b'
return 'd-arr'
if charlist[2] == 'c'
return 'r-arr'
if charlist[2] == 'd'
return 'l-arr'
if len(charlist == 2):
if charlist == [chr(27),chr(27)]
return chr(27)
if len(charlist == 1)
return charlist[0]
return ''
class _GetchUnix:
def __init__(self):
import tty, sys
def __call__(self):
import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
Run Code Online (Sandbox Code Playgroud)
这使我能够从键盘上为编辑器获取箭头键以及所有其他字符和转义序列。它使“Getch”类不再是严格的get char
克隆,因为它返回一个字符串,但它最终变得更加有用。
归档时间: |
|
查看次数: |
14026 次 |
最近记录: |