【发布时间】:2023-03-07 22:37:01
【问题描述】:
我目前正在开发一个文本编辑器,这是我无法弄清楚的奇怪之处之一!
我将从一个减少问题的小演示脚本开始
import curses
def c_main(stdscr):
lines = (
'welcome to my simulation!',
'this line has trailing whitespace: ',
'q: quit',
'r: full redraw (removes trailing ws?)',
'',
)
x = y = 0
while True:
# RENDERING
for i, line in enumerate(lines):
stdscr.insstr(i, 0, lines[i].ljust(curses.COLS))
# END RENDERING
stdscr.move(y, x)
wch = stdscr.get_wch()
if wch == curses.KEY_RESIZE:
curses.update_lines_cols()
elif wch == curses.KEY_RIGHT:
x += 1
if x > len(lines[y]):
x = 0
y = min(y + 1, len(lines) - 1)
elif wch == curses.KEY_LEFT:
if x != 0 or y != 0:
x -= 1
if x < 0:
y = max(y - 1, 0)
x = len(lines[y])
elif wch == curses.KEY_DOWN:
y = min(y + 1, len(lines) - 1)
x = min(x, len(lines[y]))
elif wch == curses.KEY_UP:
y = max(y - 1, 0)
x = min(x, len(lines[y]))
elif wch == 'r':
stdscr.move(0, 0)
for i in range(len(lines)):
stdscr.insstr(i, 0, ' ' * curses.COLS)
stdscr.refresh()
elif wch == 'q':
return
if __name__ == '__main__':
exit(curses.wrapper(c_main))
那里的大部分代码只是为了让您可以左右箭头键来演示问题。实际的渲染代码标有# RENDERING 注释。
演示问题:
- 用
python3 demo.py启动脚本 - 用鼠标突出显示第二行 -- 注意尾随空格不可突出显示
- 将光标导航到第二行的末尾(最短的组合是downdownleft)
- 按left,然后按right(不知道为什么,这是制作可重复指令所必需的)
- 远离第二行的末尾(最短的组合是 down)
- 现在注意尾随空格是高亮的
- 按 r 触发完全重绘
- 再次注意尾随空格不可突出显示
所以问题是,我如何正确呈现尾随空格,以便从终端复制粘贴保留该内容(并且不需要用户在那里导航光标)
【问题讨论】:
-
诅咒 优化 写入屏幕的文本:您输入的内容仅 看起来 像您要显示的内容,但实际文本可以包括不会产生空白的清除操作,您可以选择(至少对于某些终端)。
-
@ThomasDickey 是的,我知道这一点,这不是我在这里问的——我问的关于其他诅咒实用程序(例如
nano
标签: python ncurses python-curses