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

作者 : 开心源码 本文共2205个字,预计阅读时间需要6分钟 发布时间: 2022-05-13 共207人阅读

以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脚本没有太大区别,当我们将来实现脚本解析引擎时,即可以按操作符替换为对应的方法名。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Vim不好用?学不会?用Python山寨一个

发表回复