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

“这看起来相当愚蠢”——题记

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

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

  我从来不在乎开发,我在乎的是哲学,一切空谈在我眼里都是有价值的。所以,我刚开始写的时候,我在想什么?

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

screen = ""

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

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

  (半天过去了)

  单行长文本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 于地球,未完)

原文地址:http://blog.51cto.com/13535617/2059088

时间: 2024-08-01 20:34:52

用python实现一个命令行文本编辑器的相关文章

VI命令行文本编辑器

vi a.txt  这时候创建了一个a.txt.swp  这时候命令行中输入别的东西是输不上的  这时候应该输一个i,就可以输入内容了,这就是通过从命令模式进入编辑模式. 保存: 从编辑模式退出到命令模式,就是按ESC键:w就是保存. 如果想在哪两个字母之间插入内容,那就是光标移动到你想加内容的地方  i键就可以了 :w  保存 :wq  保存并退出 :q  退出 u    撤销最后一次的修改  必须是ESC后再u ctrl+r   回复上一步撤销操作 x   删除当前字符 dd   删除当前行

python:执行一个命令行N次

经常希望可以执行一个命令行N次...windows下没有现成的工具(有?推荐给我!) 用python写一个... #!/usr/bin/evn python #coding: utf-8 """ times.py run a command line for n times """ import os import sys import string if __name__ == "__main__": n = 1 cmd =

python语言学习4——使用文本编辑器

在Python的交互式命令行写程序,好处是一下就能得到结果,坏处是没法保存,下次还想运行的时候,还得再敲一遍. 所以,实际开发的时候,我们总是使用一个文本编辑器来写代码,写完了,保存为一个文件,这样,程序就可以反复运行了. 下载一个文本编辑器,不能使用windows自带的记事本和word能,那样保存的不是纯文本文件,会自己添加一些编码符什么的,会出错 下载地址:http://www.sublimetext.com/ 在sublime text文本编辑器中输入一个小程序 保存在一个目录下面(这里保

python执行shell命令

python执行shell命令 #!/usr/bin/python2.7 #coding=utf-8 import shlex import datetime import subprocess import time def execute_command(cmdstring, cwd=None, timeout=None, shell=False): # 执行一个SHELL命令 ## 封装了subprocess的Popen方法, 支持超时判断,支持读取stdout和stderr ## 参数:

Python调用7zip命令实现解压

Python调用7zip命令实现文件批量解压 1.输入压缩文件所在的路径 2.可以在代码中修改解压到的文件路径和所需要解压的类型,列入,解压文件夹下面所有的mp4格式的文件 3.cmd 指的就是Python调用dos命令 ,紧跟着的x -r这些全是参考7zip使用书册,及抽取文件夹下所有的以mp4结尾的文件,把文件放入e盘,测试解压文件夹下的new文件夹 # 调用7z命令批量解压文件 import os folder_name = input("请输入文件夹:") os.chdir(f

用 Python 写一个 NoSQL 数据库

本文译自 What is a NoSQL Database? Learn By Writing One In Python. 完整的示例代码已经放到了 GitHub 上, 请 点击这里, 这仅是一个极简的 demo, 旨在动手了解概念. 如果对译文有任何的意见或建议,欢迎 提 issue 讨论, 批评指正. 后续如有更新,可见 博客 . NoSQL 这个词在近些年正变得随处可见. 但是到底 "NoSQL" 指的是什么? 它是如何并且为什么这么有用? 在本文, 我们将会通过纯 Pytho

优秀的命令行文件传输程序(转)

虽然普通用户对图形用户界面情有独钟,但命令行界面仍然扮演着一个重要的角色.命令行界面提供了一种方式让用户以文本的形式向程序发出指令,用户能完全控制系统,不想要担心资源的有限,能更快的操作.但命令行也需要恰当的工具才会更强大. 这里介绍的是命令行文件传输程序,它们支持多种不同的协议,不仅仅限于 FTP,提供了类 shell 的命令语法,非常适合写脚本. 这些程序包括:LFTP.NcFTP.Yafc 和 cURL http://news.cnblogs.com/n/502558/

python执行mysqldump命令

本文简单讲述如何利用python执行一些sql语句,例如执行mysqldump命令,进行数据库备份,备份成sql文件 #!/usr/bin/python#导入os模块import os#导入时间模块import time#导入sys模块import sys#追加mysql的bin目录到环境变量sys.path.append('C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin')#如果不存在backup文件,新建一个if not os.path.e

用python执行Linux命令

例1:在python中包装ls命令 #!/usr/bin/env python#python wapper for the ls commandimport subprocesssubprocess.call(["ls","-l"]) 在Linux中执行该命令 [[email protected] python]# python ls.pytotal 8-rwxrwxrwx 1 root root 415 Mar 18 11:40 a.py-rw-r--r-- 1