大家好,歡迎來到“布道”指南的第二期。首先解釋下,標(biāo)題中的“布道”毫無任何宗教元素,只是來自和朋友間的玩笑,換句話說,理解成“你聽說 安利 么”就成。
解決問題
我的 VSCode 布道指南第二期,首先解決一些朋友們在實(shí)際使用中遇到的問題。
比如某一天,HHH 突然告訴我:“‘你的‘ VSCode 炸了!”
首先,我的 VSCode 用得好好的,最多是‘你的‘ VSCode 炸了好不好。然后,VSCode 原來還有爆炸這項(xiàng)技能?
據(jù)身處一線的消防戰(zhàn)士所說,當(dāng)時(shí)的爆炸現(xiàn)場是這樣的:
嗯,原來是編碼爆炸了

大致就是這樣的,稍微有點(diǎn)不一樣的是我這里用 GBK 編碼打開了 UTF-8 編碼的中文文件。而當(dāng)時(shí)的情況是她剛用 VSCode 打開了某個(gè)使用 GBK 編碼的中文文件,因?yàn)?VSCode 默認(rèn)的編碼方式是 UTF-8 ,所以產(chǎn)生了中文亂碼的情況。
關(guān)于編碼的問題,這里篇幅有限(估計(jì)大部分人也不感興趣)就不多討論了,讀者所需知道的就是:今天新建的文件,都應(yīng)該使用 UTF-8 這種現(xiàn)代,成熟的編碼方式。UTF-8 可以支持世界上所有的語言編碼,基本不會出現(xiàn)亂碼的情況。
但如果你在維護(hù)一份上年頭的代碼,代碼難以避免使用的是 GBK,GB2302 這一類過去的中文編碼方式。(吐槽一下:ARM Keil 對于中文編碼的處理真是坑爹?。¬SCode 對于編碼方式的充分支持也能幫你搞定這些歷史遺留問題。
如何使用不同的編碼打開文件
目光放到界面的右下角:

UTF-8 代表當(dāng)前使用的編碼方式。順帶介紹下:CRLF 代表當(dāng)前的換行方式使用的是 Windows 的換行:使用 \r\n 代表換行。Verilog 代表當(dāng)前的代碼語言。
點(diǎn)擊 UTF-8? 界面上方會出現(xiàn)

VSCode 支持的編碼方式很多,拉到菜單中部可以找到中文的編碼方式。

GBK 或者 GB18030 是兩種中文編碼方式,一般能夠解決中文亂碼的問題。
自動識別編碼
就中文亂碼這個(gè)問題而言,有更優(yōu)雅的解決方式。文件-首選項(xiàng)-設(shè)置,在搜索框中搜索編碼,即可以設(shè)置在打開文件時(shí)自動識別編碼類型,或者更改默認(rèn)編碼方式。

用戶代碼片段
言歸正傳,讓我們來說說上期結(jié)尾預(yù)告的用戶代碼片段。
以筆者自己經(jīng)常寫的 Verilog 語言為例,來了解一下用戶代碼片段的用處,Verilog 在同步設(shè)計(jì)中需要大量的 always 塊,用來表示一個(gè)時(shí)序數(shù)電電路。

同時(shí)也會使用到大量 begin...end 塊用來表示其中的代碼順序執(zhí)行。一個(gè)個(gè)手打豈不是很麻煩,安裝 Verilog 語言插件能給用戶省下不少事。在安裝完插件后,除了能提供語法高亮的功能以外,當(dāng)你打出 al 時(shí),編輯器能夠提供一個(gè)完整的 always 塊外殼,在按回車或者 TAB 鍵之后。

生成 always 塊后,再使用 TAB 鍵還可以在幾個(gè)需要填充的區(qū)域切換(下圖中有豎線的地方)

當(dāng)然還少不了 begin 塊

這個(gè)功能還是相當(dāng)好用的,歸根結(jié)底其實(shí)是 Verilog 插件通過 VSCode 的用戶代碼片段功能實(shí)現(xiàn)的。如果你對插件提供的片段不滿意(比如我就對插件提供的 always 塊換行后只縮進(jìn)兩格就很不滿意)或者有自己獨(dú)特的功能需求,就可以添加自己的用戶代碼片段。
設(shè)置自己的用戶代碼片段
用戶代碼是以語言為單位進(jìn)行管理的,存儲在 Verilog(/python/...).json 中,第一次設(shè)置需要創(chuàng)建這個(gè)文件。文件-首選項(xiàng)-用戶代碼片段,打開后可以看到 VSCode 提供的模板。(這個(gè)方式確實(shí)有點(diǎn)用戶不友好,不過設(shè)置界面之前也是這樣,所以完全有理由相信將來 VSCode 也會讓這個(gè)界面友好起來的。)

首先,你的用戶代碼片段得防置在整個(gè)文件的大括號內(nèi),然后讓我們來看一段演示:如果寫一篇知乎回答。
// "知乎回答": {···················································引號內(nèi)是你的片段的名稱,會在使用時(shí)顯示顯示? ? ? ? ? ? ? ? ? ? ? //? "prefix": "zhihu",········································prefix 代表觸發(fā)用戶代碼片段的觸發(fā)詞 //? "body": [ //? ? ? "謝 邀中就是用戶片段的主題部分?1 代表第一個(gè) Tab 后切到的位置,$2 是第二個(gè),以此類推。 //? ? ? "實(shí)名 $2 高票答案", //? ? ? "我認(rèn)為 $3" //? ], //? "description": "用于快速生成知乎回答"·······代碼片段的描述,也會在使用時(shí)顯示 // }
需要注意的是每個(gè)代碼片段之間需要用逗號相隔,另外 body 的大括號中每一行的內(nèi)容用""圈起,每行之間要使用逗號相隔。
最后的效果是這樣的,輸入 zhihu 會產(chǎn)生相應(yīng)提示


按 TAB 鍵就可以在之前的 ?2 $3 之間切換。
配置 Python 調(diào)試環(huán)境
VSCode 在編輯器中集成了幾種語言的調(diào)試環(huán)境,包括 Python,C/C++,C# 以及在 Chrome 中調(diào)試 JS 代碼。

調(diào)試 Python 的原理實(shí)際上還是調(diào)用外部 Python 真正的解釋器,換句話說,如果你在 VSCode 中啟動某個(gè) Python 程序的調(diào)試,實(shí)際上 VSCode 是在終端中執(zhí)行了這一系列操作:
cd 'd:\working_project\python4test';
${env:PYTHONIOENCODING}='UTF-8';
${env:PYTHONUNBUFFERED}='1';
${env:PYTHONPATH}='c:\Users\fan li\.vscode\extensions\ms-python.python-2018.8.0\pythonFiles\experimental\ptvsd';
& 'python' '-m' 'ptvsd' '--host' 'localhost' '--port' '55538' 'd:\working_project\python4test\tcp_test_server.py'
?
這段代碼中做了這么幾件事:將目錄切到當(dāng)前目錄;設(shè)定用于啟動 Python 的環(huán)境變量以及 VSCode 使用的 Python 調(diào)試器 ptvsd 的路徑。然后使用 "python 文件名" 的方式調(diào)用需要調(diào)試的文件,指定調(diào)試器為 ptvsd。
也就是說配置環(huán)境只需要做這么兩件事:
1.安裝 Python 插件,星最高的那個(gè)就行,是微軟官方推出的,包含了對調(diào)試功能的支持,也就是 ptvsd
2.將 Python 解釋器的路徑添加到 Windows 系統(tǒng)路徑中去,以便能直接在終端中運(yùn)行 Python
這是我的環(huán)境變量設(shè)置,可以看到 Python 所在的路徑

關(guān)于第二件事可以多說兩句,從上圖中可以看到兩個(gè)路徑,較長的一個(gè)路徑是在另一個(gè)較短的路徑的基礎(chǔ)上加上了 \script,長路徑是給包安裝工具 Pip 使用的,短路徑是 Python 解釋器所在的目錄。
你可以自行在上圖的界面中添加 Python 的路徑,最好再添加一個(gè) \script 的路徑。還有一種辦法是在安裝 Python 時(shí),注意這個(gè)選項(xiàng)

不過環(huán)境變量需要重啟之后才會起作用。
使用集成 Git 插件
Git 是一個(gè)被廣泛使用的,開源的版本管理工具。我這里暫時(shí)不想具體討論 Git 的由來,用途和使用方式,而是集中在使用 VSCode 集成的 Git 插件,實(shí)現(xiàn)一些基礎(chǔ)但很有用的 Git 操作。
原因在于我本人對于 Git 的理解不夠深,對于 Git 的實(shí)踐也比較基礎(chǔ),最重要的是,我認(rèn)為我講的肯定沒有下文鏈接中的廖雪峰老師講得好。
Git教程www.liaoxuefeng.com

首先你要下個(gè) Git,登錄官網(wǎng)下載最新的 Windows 版本,網(wǎng)速好像比較緩慢。
在工作目錄,建議不要將工作目錄定得太大,尤其不要把工作目錄定為 IDE 的工程目錄,這樣會包括太多不需要的,由 IDE 更新的文件。一般在 Verilog 開發(fā)中,把目錄定為 RTL 目錄即可。
創(chuàng)建 Git 倉庫
有兩種方法在工作目錄中創(chuàng)建 Git 倉庫。一種是在 Windows 資源管理器,右鍵菜單中的 Git Bash Here 打開 Git 命令行,使用 git init . 在當(dāng)前目錄中創(chuàng)建 Git 倉庫

然后回到 VSCode,打開左邊豎著的菜單欄中的第三個(gè)按鈕——源代碼管理,應(yīng)該就能看到當(dāng)前目錄所屬的倉庫。(如果看不到,關(guān)閉當(dāng)前的標(biāo)簽頁再打開?;蛘呖梢灾貑?VSCode 軟件。)

還有一種辦法則不需要離開編輯器,直接使用編輯器內(nèi)置的 Powershell 工具,輸入 git init .命令即可。在界面下方的終端中。

Git Add 操作
如果你還不知道 git 的 add 操作是什么,那么還是推薦去看一下廖雪峰老師的教程。本篇教程將著重于在 VSCode 上的使用。
當(dāng)我們創(chuàng)建了一個(gè) Git 倉庫時(shí),該目錄下的文件其實(shí)仍然和之前沒有什么差別,它們處于未被跟蹤的狀態(tài)。所以在創(chuàng)建了倉庫之后,我們首先需要將我們需要跟蹤的文件加入暫存區(qū),也就是 git add 操作。

點(diǎn)擊代表 untracked 的 U 邊上的加號,即可將該文件加入暫存區(qū)。文件進(jìn)入暫存的更改。
那么加入暫存區(qū)有什么用處?首先,可以跟蹤你的修改。當(dāng)你在原文件的基礎(chǔ)上做些改動時(shí),觀察發(fā)生的變化。
我們發(fā)現(xiàn)有了兩個(gè)變化,一是左邊的更改欄中又出現(xiàn)了這個(gè)文件,顯示 M ,代表有修改。上下兩個(gè)同名文件,分別位于暫存的更改和更改中,分別代表了之前 add 的版本以及后續(xù)有過修改的版本。另一個(gè)變化是,右邊我們新添加的內(nèi)容前面多了一條綠線,標(biāo)識出上一次 add 操作后的修改。這對于調(diào)試來說非常好用,有些同學(xué)可能改啊改,然后就不知道哪里改過了(比如我本人)。另外點(diǎn)擊更改中的文件還會有修改前后的比較,十分直觀。

如果你想刪除這次的修改,只需要在更改中選擇那個(gè)撤回的箭頭。世界又恢復(fù)到幾分鐘前了。
是的,我直接復(fù)制了之前的截圖。。

Git Commit 操作
在消息框中鍵入此次提交的標(biāo)題,按 Ctrl + Enter 鍵就可以進(jìn)行提交。提交之后,暫存的更改消失了,你可以理解這次 add 修改已經(jīng)被整合到此次 commit 的版本中,所以沒有所謂在暫存的更改了。這里 commit 先幾乎不講,之后的文章再仔細(xì)討論這個(gè)問題。
Git 創(chuàng)建和切換分支操作
如果你歷經(jīng)好多天調(diào)試之后終于完成了一個(gè)牛逼但是脆弱的程序之后(程序脆弱么。。還是挺正常的),老師又給你提出一個(gè)新需求,你肯定不會上手就開始改代碼吧?
這時(shí)候創(chuàng)建一個(gè)新的分支進(jìn)行開發(fā),萬一程序炸了,至少還能回到上一個(gè)復(fù)活點(diǎn)不是。
在將珍貴的程序 commit 之后,點(diǎn)擊左下角的 master,在上方彈出的界面中選擇創(chuàng)建新分支,填寫新分支的名字,切換到新分支。

然后開發(fā)開發(fā)...炸了,你想回到修改之前的樣子。但這篇廢墟也不想放棄,萬一還能搶救呢。于是暫存這段修改,并提交。
再點(diǎn)擊左下角的 dev,選擇回到 master,之前的程序又回來了。再回 dev 分支,之前的廢墟還在。。
特別提醒
如果你有不止一個(gè)源文件,在切換分支之前,不要只提交你想修改的那一個(gè)文件,而是你所有的源文件,不然切換回原分支,你會發(fā)現(xiàn)只剩一個(gè)單獨(dú)的文件了。
結(jié)語
本期首先回答了讀者來信(假裝是好了),順便介紹了編碼相關(guān)的問題;討論了使用用戶代碼片段的方法;配置 Python 環(huán)境的方法以及使用 Git 進(jìn)行一些基礎(chǔ)操作的方法。
至此,我可以負(fù)責(zé)任地說:我的存貨已經(jīng)基本上沒有了(畢竟 VSCode 只是一個(gè)簡單的編輯器,常用操作也就這么多)。
在之后的文章里,我會和大家一起學(xué)習(xí)一下 VSCode 的官方教程,看看有沒有什么能提高工作效率的技巧,鏈接在下面。除此之外,我會繼續(xù)看看有沒有讀者來信,然后會繼續(xù)深入 Git 的使用,這篇教程中的 Git 使用相當(dāng)基礎(chǔ),還想討論下在 VSCode 中的 Python 的調(diào)試方法。