練習(xí) 50:vi
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
自豪地采用谷歌翻譯
你有一個模塊芦缰,實(shí)現(xiàn)了ed
和sed
中使用的功能。顯然墨榄,下一步是實(shí)現(xiàn)世界歷史上最討厭和實(shí)用的文本編輯器:vi
貌夕。如果你知道 Lisp 可以實(shí)現(xiàn) Emacs,但沒有人有時間創(chuàng)建一個偽裝成文本編輯器的全新操作系統(tǒng)胡桃。人生苦短食绿,不能整天按住三個按鍵并敲擊 TAB 鍵侈咕。
這個練習(xí)的目的不是做一個非常精確的vi
的副本。這是一個非常大的項(xiàng)目器紧,但如果你想嘗試它耀销,那么就去做吧。你這個項(xiàng)目中的目標(biāo)是铲汪,再次復(fù)用你的ed
模塊树姨,并玩轉(zhuǎn) Python 的 curse
模塊。curse
模塊讓你處理舊式的文本終端窗口和圖形操作桥状。實(shí)際上“圖形”應(yīng)該加引號帽揪,因?yàn)?code>curse中的實(shí)際圖形很少。
你將使用curse
來創(chuàng)建一個低級的vi
實(shí)現(xiàn)辅斟,它可以打開文件转晰,使用模塊運(yùn)行ed
和sed
命令,并使用curse
將其顯示到終端屏幕士飒。你也會發(fā)現(xiàn)查邢,嘗試自動化測試它是非常困難的。如果你能弄清楚如何做一個假的curse
測試框架酵幕,你會得到附加分扰藕,但是這將需要 Unix pty 系統(tǒng)的一些魔術(shù)技巧(我認(rèn)為)。
使其可測試的更好方法是芳撒,將盡可能多的vi
放入 Python 模塊邓深,以便你可以測試代碼,而無需運(yùn)行curses
屏幕系統(tǒng)笔刹。當(dāng)我說“模塊”時芥备,我并不意味著一個完整的 Python 模塊,像使用ed
模塊一樣舌菜,你可以使用pip
安裝它萌壳。我的意思是vi
的代碼中的模塊,然后導(dǎo)入到你的項(xiàng)目中。
思考這個項(xiàng)目的方法是袱瓮,將控制視圖(curses
)的代碼與其余代碼分開缤骨,以便你可以插入自己的假視圖來測試。之后還剩下少量的功能尺借,你可以通過實(shí)際運(yùn)行你的vi
來手動測試荷憋。
挑戰(zhàn)練習(xí)
我們不會實(shí)現(xiàn)整個vi
。我需要把它說清楚褐望,因?yàn)閷?shí)際的vi
是舊的,非常復(fù)雜串前,所以實(shí)現(xiàn)一個完整的“代碼大師副本”將需要很長時間瘫里。你實(shí)際上只做以下事情:
- 獲取你的
ed
模塊。 - 為其創(chuàng)建一個
curses
UI荡碾。 - 使其在多個文件上工作谨读。
這或多或少是你正在做的事情,所以你應(yīng)該關(guān)注的第一件事是坛吁,curses
如何工作劳殖。閱讀curses
的文檔,來了解它的工作原理拨脉,并根據(jù)需要編寫盡可能多的測試來了解它哆姻。
一旦你掌握了curses
,你就需要學(xué)習(xí)如何使用vi
玫膀。我為這個練習(xí)包括一個vi
速成課矛缨,你可以觀看它,還有幾個可以在線參考的vi
速查表帖旨。我建議你看我的vi
教程箕昭,并且在這個會話期間,嘗試使用真正的vi
來編輯代碼解阅。實(shí)際上從你的ed
和sed
的實(shí)現(xiàn)中落竹,你可以了解vi
如何工作。理論上货抄,vi
僅僅是圖形化的ed
述召,所以你幾乎只是向ed
提供一個更好的 UI。
研究性學(xué)習(xí)
- 你的
ed
實(shí)現(xiàn)中的有限狀態(tài)機(jī)蟹地,如何與這個vi
實(shí)現(xiàn)中的東西相匹配桨武?假設(shè)你使用了這個設(shè)計(jì)。 - 實(shí)現(xiàn) GUI 版本而不是
curses
锈津,有多難呀酸?我不建議你這樣做,但研究它琼梆,看看它需要什么性誉。