Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
lmpythw-zh
提交
ddfe7345
L
lmpythw-zh
项目概览
OpenDocCN
/
lmpythw-zh
9 个月 前同步成功
通知
0
Star
18
Fork
5
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
lmpythw-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
ddfe7345
编写于
8月 16, 2017
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ex50
上级
76f770b0
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
36 addition
and
0 deletion
+36
-0
ex50.md
ex50.md
+36
-0
未找到文件。
ex50.md
0 → 100644
浏览文件 @
ddfe7345
# 练习 50:`vi`
> 原文:[Exercise 50: vi](https://learncodethehardway.org/more-python-book/ex50.html)
> 译者:[飞龙](https://github.com/wizardforcel)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
你有一个模块,实现了
`ed`
和
`sed`
中使用的功能。显然,下一步是实现世界历史上最讨厌和实用的文本编辑器:
`vi`
。如果你知道 Lisp 可以实现 Emacs,但没有人有时间创建一个伪装成文本编辑器的全新操作系统。人生苦短,不能整天按住三个按键并敲击 TAB 键。
这个练习的目的不是做一个非常精确的
`vi`
的副本。这是一个非常大的项目,但如果你想尝试它,那么就去做吧。你这个项目中的目标是,再次复用你的
`ed`
模块,并玩转 Python 的
[
`curse`
](
https://docs.python.org/2/howto/curses.html
)
模块。
`curse`
模块让你处理旧式的文本终端窗口和图形操作。实际上“图形”应该加引号,因为
`curse`
中的实际图形很少。
你将使用
`curse`
来创建一个低级的
`vi`
实现,它可以打开文件,使用模块运行
`ed`
和
`sed`
命令,并使用
`curse`
将其显示到终端屏幕。你也会发现,尝试自动化测试它是非常困难的。如果你能弄清楚如何做一个假的
`curse`
测试框架,你会得到附加分,但是这将需要 Unix pty 系统的一些魔术技巧(我认为)。
使其可测试的更好方法是,将尽可能多的
`vi`
放入 Python 模块,以便你可以测试代码,而无需运行
`curses`
屏幕系统。当我说“模块”时,我并不意味着一个完整的 Python 模块,像使用
`ed`
模块一样,你可以使用
`pip`
安装它。我的意思是
`vi`
的代码中的模块,然后导入到你的项目中。
思考这个项目的方法是,将控制视图(
`curses`
)的代码与其余代码分开,以便你可以插入自己的假视图来测试。之后还剩下少量的功能,你可以通过实际运行你的
`vi`
来手动测试。
## 挑战练习
我们不会实现整个
`vi`
。我需要把它说清楚,因为实际的
`vi`
是旧的,非常复杂,所以实现一个完整的“代码大师副本”将需要很长时间。你实际上只做以下事情:
+
获取你的
`ed`
模块。
+
为其创建一个
`curses`
UI。
+
使其在多个文件上工作。
这或多或少是你正在做的事情,所以你应该关注的第一件事是,
`curses`
如何工作。阅读
`curses`
的文档,来了解它的工作原理,并根据需要编写尽可能多的测试来了解它。
一旦你掌握了
`curses`
,你就需要学习如何使用
`vi`
。我为这个练习包括一个
`vi`
速成课,你可以观看它,还有几个可以在线参考的
`vi`
速查表。我建议你看我的
`vi`
教程,并且在这个会话期间,尝试使用真正的
`vi`
来编辑代码。实际上从你的
`ed`
和
`sed`
的实现中,你可以了解
`vi`
如何工作。理论上,
`vi`
仅仅是图形化的
`ed`
,所以你几乎只是向
`ed`
提供一个更好的 UI。
## 研究性学习
+
你的
`ed`
实现中的有限状态机,如何与这个
`vi`
实现中的东西相匹配?假设你使用了这个设计。
+
实现 GUI 版本而不是
`curses`
,有多难?我不建议你这样做,但研究它,看看它需要什么。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录