vim-python是什么_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"

{last_line}

"))

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值