Vim不好用腐缤?學(xué)不會(huì)?用Python山寨一個(gè)

以Vim的操作之高效被稱(chēng)為編輯器之神肛响,是絕對(duì)不夸張的岭粤。小編遇上大規(guī)模修改代碼,一直靠Vim臨時(shí)寫(xiě)個(gè)宏操作特笋,一路確認(rèn)下去幾分鐘就能搞定剃浇。換個(gè)編輯器就很難這樣操作了。

但vim終究是老了猎物,界面弄的再漂亮虎囚,總要開(kāi)個(gè)命令行才行。又不支持圖片蔫磨,處理有格式的文本更是力不從心淘讥。雖然后起之輩很多,但總歸沒(méi)有vim編輯模式下移動(dòng)那么方便堤如。

用了PyQt里的QTextEditor后蒲列,發(fā)現(xiàn)模擬個(gè)Vim真的很方便。Vim與其它文本編輯器最大的區(qū)別是模式煤惩。通過(guò)Esc鍵切換到編輯模式嫉嘀,就可以快速修改文本。QTextEditor有只讀模式魄揉,但是光標(biāo)會(huì)消失剪侮。那只好自定義一個(gè)editing布爾類(lèi)型變量來(lái)切換模式。

首先定義一個(gè)QTextEditor的子類(lèi),然后在keyReleaseEvent方法里判斷按下的鍵瓣俯,如果是Esc, 就設(shè)置editing變量為真杰标。

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

當(dāng)進(jìn)入到編輯模式后,輸入字母鍵就不應(yīng)該有回應(yīng)了彩匕,除非是hjkl這樣的光標(biāo)操作鍵腔剂。QTextEditor的textCursor屬性就是用來(lái)操作光標(biāo)的。向下移動(dòng)光標(biāo)的實(shí)現(xiàn)代碼如下

    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 就可以實(shí)現(xiàn)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)

上面的代碼還實(shí)現(xiàn)移動(dòng)到行首掸犬,行尾以及添加和功能,一樣可以用QTextCursor.StartOfLine绪爸, QTextCursor.EndOfLine 來(lái)實(shí)現(xiàn)湾碎。有的同學(xué)可能會(huì)奇怪為什么我們要用單獨(dú)的方法,而不直接在keyPressEvent實(shí)現(xiàn)奠货。這其實(shí)是一個(gè)簡(jiǎn)單的封裝來(lái)隱藏Qt API介褥。 如果將來(lái)要實(shí)現(xiàn)數(shù)字鍵加操作符或者解析vim腳本操作的話,大量調(diào)用Qt API就容易亂递惋,不容易維護(hù)柔滔。而實(shí)現(xiàn)一套我們自己的API更好理解一些。

最后我們來(lái)實(shí)現(xiàn)一個(gè)markdown的功能萍虽,并且實(shí)時(shí)渲染睛廊。 這是vim或者neovim絕對(duì)做不到的。

    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)

如果最后一行也就是最新輸入的一行以#開(kāi)頭的話贩挣,就代表是markdown里的H1, 我們刪除最后一行以及回車(chē)鍵產(chǎn)生的空白行喉前,再加上一行html代碼。同時(shí)增加一行(因?yàn)榘戳嘶剀?chē)鍵)

其實(shí)這樣的代碼跟vim腳本沒(méi)有太大區(qū)別王财,當(dāng)我們將來(lái)實(shí)現(xiàn)腳本解析引擎時(shí),就可以按操作符替換為對(duì)應(yīng)的方法名裕便。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绒净,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子偿衰,更是在濱河造成了極大的恐慌挂疆,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件下翎,死亡現(xiàn)場(chǎng)離奇詭異缤言,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)视事,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)胆萧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事跌穗《┥危” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵蚌吸,是天一觀的道長(zhǎng)锈拨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)羹唠,這世上最難降的妖魔是什么奕枢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮佩微,結(jié)果婚禮上验辞,老公的妹妹穿的比我還像新娘。我一直安慰自己喊衫,他們只是感情好跌造,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著族购,像睡著了一般壳贪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寝杖,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天违施,我揣著相機(jī)與錄音,去河邊找鬼瑟幕。 笑死磕蒲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的只盹。 我是一名探鬼主播辣往,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼殖卑!你這毒婦竟也來(lái)了站削?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤孵稽,失蹤者是張志新(化名)和其女友劉穎许起,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體菩鲜,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡园细,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了接校。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猛频。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伦乔,到底是詐尸還是另有隱情厉亏,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布烈和,位于F島的核電站爱只,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏招刹。R本人自食惡果不足惜恬试,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疯暑。 院中可真熱鬧训柴,春花似錦、人聲如沸妇拯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)越锈。三九已至仗嗦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甘凭,已是汗流浹背稀拐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丹弱,地道東北人德撬。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像躲胳,于是被迫代替她去往敵國(guó)和親蜓洪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • vim一直是程序員之間比較有爭(zhēng)議的一個(gè)話題泛鸟。有人認(rèn)為她是編輯器之神蝠咆,有人則認(rèn)為她古老過(guò)時(shí),遠(yuǎn)遠(yuǎn)不如IDE北滥,或是以當(dāng)...
    擦柱而出閱讀 1,600評(píng)論 0 41
  • 一. Vim是什么 都說(shuō)程序員只用兩種編輯器,一種是編輯器之神Vim闸翅,一種是神的編輯器Emacs再芋,可現(xiàn)實(shí)生活中,我...
    程序員在深圳閱讀 7,635評(píng)論 9 58
  • vim常用操作簡(jiǎn)明教程附我用了多年的vim配置文件 為配合演示,加了個(gè)Makefile坚冀,并特意加了詳細(xì)注釋,是我平...
    程序大飛閱讀 1,857評(píng)論 0 11
  • 前言: 以下是我跟著老師的講解操作跟著做了一遍济赎,刷新了自己對(duì)編輯器使用的慣性思維,比如鍵盤(pán)上hjkl的移動(dòng)光標(biāo)它處...
    饑人谷_遠(yuǎn)方閱讀 1,598評(píng)論 0 0
  • 工作中、生活中想做的事很多司训,但都半途而廢了构捡,準(zhǔn)確說(shuō)可能都沒(méi)半途就廢了,多是轟轟烈烈開(kāi)始后不久就煙消霧散了壳猜。 ...
    靜靜的榕樹(shù)林_淵榮閱讀 205評(píng)論 4 3