用python实现一个命令行文本编辑器

  “这看起来至关愚蠢”——题记python

  不过我整我的都很荒诞,何妨呢?贴一张目前的效果图git

用python实现一个命令行文本编辑器

  看起来很舒服,不是么?即便一切都是个幌子:光标只能在最后,按一下上下左右就会退出,一行超出75个字符就会连带行号消失,打完36行程序就会奔溃——并且不能保存,仿佛一台玩具打字机。但这又怎么样?我喜欢!我想把它放到github上去——可是恐怕随时得回滚,因此算了吧。github

  我历来不在意开发,我在意的是哲学,一切空谈在我眼里都是有价值的。因此,我刚开始写的时候,我在想什么?小程序

  ——我在想,我要写个命令行编辑器——那是什么东西?——就是一个命令行界面,每敲一个键就变化一点——而且按传说中MVC的作法,要有个模型,在这里惟一的参数就是包含整个文本的字符串——因此主循环就是显示字符串→接收输入→更新字符串。每一步均可谓开销巨大(以致于给人以罪恶感),但如今不是优化的时候——如今能够写个大体了。给出目前为止的代码:(某版本真实代码)数组

screen = ""

while True: 
    show_screen()
    ch = getch()
    update(ch)

  不能运行,并不重要。事实上咱们发现这是一个状态机(字面义)——而这里的状态仅仅是screen字符串的状态。简单的结构是使人欣慰的。(我看了一眼代码,以为应该在 show_screen() 和update(ch)的括号里都添上screen)编辑器

  (半天过去了)ide

  单行长文本bug解决了。(虽然说我就从没写过超过一行的代码)函数

  (又过去了一天)优化

  重写了逻辑,依然混乱。因此先发表吧。命令行

(2018-1-1 于地球,未完)

  问题通常化:【怎样写出一个命令行程序?】

  既然是一个状态机,咱们固然能够列出一个状态表,屏幕每次由状态刷新(#),动做将改变状态。对于命令行,仅有的动做就是击键,并且是有限个。动做响应也是离散的,一次击键只须要变更一次屏幕(#)。我先不谈文本编辑器,此前的一个小程序很好地符合了这些思想——一个九宫格走迷宫的程序(虽然当时我尚未模型意识)。9个房间,左转右转或前进。状态是有限的,只有有限个位置能够站。因此咱们能够列出一张表:

动做1 动做2 动做3 ……
状态1 操做11 操做12 操做13 ……
状态2 操做21 操做22 操做23 ……
状态3 操做31 操做32 操做33 ……
…… …… …… …… ……

  而显示与状态是惟一对应的。因此理论上填完这张表,问题就解决了。但这是不现实的,连那个走迷宫程序这张表都不适用,由于状态的“组合爆炸”。在走迷宫程序中,状态是由“所在房间”和“正对方向”2个参数组合而成的,而且一切都是临时组合,也所以有些组合不可到达。而在编辑器的例子中,组合甚至是无穷的!在我如今处理的版本中,虽然只有字符串一个参数,但足以形成无限的状态。因此……

  应当看作同一个状态。

  我想到了“化归”,更确切一点是“等价划分”。将若干个甚至无穷多状态看做同一状态。在编辑器中,全部的编辑都是同一个状态。当加入光标左右移动,光标在中间的时候是等价的,只有在两端才可能出现特殊状况,因此能够划分为3个等价状态……可是开发是一个过程,咱们一开始固然想不到这么多,怎么处理呢?——渐进或许是个好办法。在初始版本(单行打字机)中,逻辑是这样的:

26字母(分大小写)和空格
编辑状态 将接收到字符添加到字符串尾部

  少量改进后是这样的:

26字母(分大小写)和空格 退格
编辑状态 将接收到字符添加到字符串尾部 删除字符串最后一个字符

  这种表没法表示实际显示,但实际显示既然是状态的惟一函数,也不用担忧逻辑问题……虽然说简直没有实用价值,但这么分析至少带给人好处。

  (又过去一天,我要重写代码……)

(2018-1-9 于地球,未完)
相关文章
相关标签/搜索