Vim不好用?学不会?用Python山寨一个 

2020-02-12 21:37:24 2点赞 11收藏 2评论

Vim不好用?学不会?用Python山寨一个 

以Vim的操作之高效被称为编辑器之神,是绝对不夸张的。小编遇上大规模修改代码,一直靠Vim临时写个宏操作,一路确认下去几分钟就能搞定。换个编辑器就很难这样操作了。

但vim终究是老了,界面弄的再漂亮,总要开个命令行才行。又不支持图片,处理有格式的文本更是力不从心。虽然后起之辈很多,但总归没有vim编辑模式下移动那么方便。

用了PyQt里的QTextEditor后,发现模拟个Vim真的很方便。Vim与其它文本编辑器最大的区别是模式。通过Esc键切换到编辑模式,就可以快速修改文本。QTextEditor有只读模式,但是光标会消失。那只好自定义一个editing布尔类型变量来切换模式。

首先定义一个QTextEditor的子类,然后在keyReleaseEvent方法里判断按下的键,如果是Esc, 就设置editing变量为真。


def keyReleaseEvent(self, event):
   if event.key() == Qt.Key_Escape:
       self.editing = True

当进入到编辑模式后,输入字母键就不应该有回应了,除非是hjkl这样的光标操作键。QTextEditor的textCursor属性就是用来操作光标的。向下移动光标的实现代码如下


   def moveDown(self, cursor=None):
       if cursor == None:
           cursor = self.textCursor()
       cursor.movePosition(QTextCursor.Up, QTextCursor.MoveAnchor, 1)
       self.setTextCursor(cursor)
       return cursor

同理,只需要替换QTextCursor.Up为QTextCursor.Down, QTextCursor.Left, QTextCursor.Right 就可以实现hjkl键的功能


def keyPressEvent(self, event):
if self.editing:
 if event.key() == Qt.Key_K:
  self.moveUp()
 elif event.key() == Qt.Key_J:
  self.moveDown()
 elif event.key() == Qt.Key_H:
  self.moveLeft()
 elif event.key() == Qt.Key_L:
  self.moveRight()
 elif event.key() == Qt.Key_I:
  self.editing = False
 elif event.key() == Qt.Key_0:
  self.moveStartOfLine()
 elif event.key() == Qt.Key_Dollar:
  self.moveEndOfLine()
 elif event.key() == Qt.Key_A:
  self.moveEndOfLine()
  self.editing = False
 else:
  super().keyPressEvent(event)

else:
 super().keyPressEvent(event)

上面的代码还实现移动到行首,行尾以及添加和功能,一样可以用QTextCursor.StartOfLine, QTextCursor.EndOfLine 来实现。有的同学可能会奇怪为什么我们要用单独的方法,而不直接在keyPressEvent实现。这其实是一个简单的封装来隐藏Qt API。 如果将来要实现数字键加操作符或者解析vim脚本操作的话,大量调用Qt API就容易乱,不容易维护。而实现一套我们自己的API更好理解一些。

最后我们来实现一个markdown的功能,并且实时渲染。 这是vim或者neovim绝对做不到的。

   def keyReleaseEvent(self, event):
       if event.key() == Qt.Key_Return:
           text = self.toPlainText().splitlines()
           last_line = text[-1]
           print(last_line)
           if last_line.startswith('#'):
               self.moveUp()
               self.deleteLine()
               self.moveDown()
               self.deleteLine()
               self.textCursor().insertFragment(QTextDocumentFragment.fromHtml(f"<h1>{last_line}</h1>"))
               self.appendPlainText("")
               
   def deleteLine(self):
       self.moveStartOfLine()
       cursor = self.textCursor()
       cursor.select(QTextCursor.LineUnderCursor)
       cursor.removeSelectedText()
       cursor.deletePreviousChar()
       cursor.deletePreviousChar()
       self.setTextCursor(cursor)

如果最后一行也就是最新输入的一行以#开头的话,就代表是markdown里的H1, 我们删除最后一行以及回车键产生的空白行,再加上一行html代码。同时增加一行(因为按了回车键)

其实这样的代码跟vim脚本没有太大区别,当我们将来实现脚本解析引擎时,就可以按操作符替换为对应的方法名。

参考书目:

 

PythonQtGUI快速编程:PyQt编程指南61.8元京东去购买

 

未经授权,不得转载
展开 收起

Nintendo 任天堂 Switch《健身环大冒险》体感游戏套装

Nintendo 任天堂 Switch《健身环大冒险》体感游戏套装

339元起

《Plants vs. Zombies GOTY Edition(植物大战僵尸年度版)》 PC数字版游戏

《Plants vs. Zombies GOTY Edition(植物大战僵尸年度版)》 PC数字版游戏

暂无报价

《Squad(战术小队)》 PC数字版游戏

《Squad(战术小队)》 PC数字版游戏

134元起

Nintendo 任天堂 Switch NS 健身环大冒险 Ringfit

Nintendo 任天堂 Switch NS 健身环大冒险 Ringfit

799元起

烛龙 古剑奇谭三-数字标准版

烛龙 古剑奇谭三-数字标准版

72元起

Nintendo 任天堂 《新 超级马里奥兄弟U DX豪华版》游戏兑换卡

Nintendo 任天堂 《新 超级马里奥兄弟U DX豪华版》游戏兑换卡

299元起

HP 惠普 暗影精灵5代 台式主机(i5-9400F、8GB、256GB+1TB、GTX1650)

HP 惠普 暗影精灵5代 台式主机(i5-9400F、8GB、256GB+1TB、GTX1650)

4530元起

HP 惠普 暗影精灵5代 台式主机(i7-9700F、8GB、256GB+1TB、GTX1660Ti 6G)

HP 惠普 暗影精灵5代 台式主机(i7-9700F、8GB、256GB+1TB、GTX1660Ti 6G)

6331元起

索尼(SONY)【PS4国行游戏】地平线:零之曙光

索尼(SONY)【PS4国行游戏】地平线:零之曙光

79元起

索尼(SONY)【PS4国行游戏】最终幻想 15 Final Fantasy XV

索尼(SONY)【PS4国行游戏】最终幻想 15 Final Fantasy XV

249元起

Office 365 家庭版

Office 365 家庭版

249元起

微软 (Microsoft) Office 家庭学生版 2016 激活密钥 Mac专用 正版办公软件 一次购买 永久使用 非商业使用

微软 (Microsoft) Office 家庭学生版 2016 激活密钥 Mac专用 正版办公软件 一次购买 永久使用 非商业使用

749元起

Steam 《Chinese Parents(中国式家长)》 PC中文版游戏 国区礼物

Steam 《Chinese Parents(中国式家长)》 PC中文版游戏 国区礼物

24元起

Nintendo 任天堂 Switch NS 游戏主机 掌机 NS游戏卡带 游戏卡 不锁区 预购2月发煮糊了2 分手厨房 中文 年度合家欢游戏

Nintendo 任天堂 Switch NS 游戏主机 掌机 NS游戏卡带 游戏卡 不锁区 预购2月发煮糊了2 分手厨房 中文 年度合家欢游戏

322元起

UBISOFT 育碧 全境封锁2 Tom Clancy’s The Division 标准版 PC中文

UBISOFT 育碧 全境封锁2 Tom Clancy’s The Division 标准版 PC中文

78元起

《旺达与巨像》PS4实体版游戏

《旺达与巨像》PS4实体版游戏

163.5元起
2评论

发表评论请 登录
  • 最新
  • 最热
评论举报

请选择举报理由

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
11
扫一下,分享更方便,购买更轻松