--- tags: 環境設置 --- # **WSL 搭配 Visual Studio Code (VSC)** ## 0. 目錄 第一篇:[WSL 原理介紹](https://hackmd.io/s/Bkh8oAmGX) 第二篇:[WSL 環境設定](https://hackmd.io/s/BJByCIUHf) 第三篇:[WSL 補充內容](https://hackmd.io/s/SyL3pzzQm) 第四篇:本篇 ## 1. 安裝設置 ### 1.1. 事前須知 市面上編輯器這麼多,為何要選 VSC?答案其實很簡單,因為 VSC 除了開源以及大量人員持續開發外,也提供內建的 git 和 debugger 的框架,同時在編輯中也提供了相當多便利的功能,以及不少擴充功能可供安裝。 筆者個人也很喜歡 VSC 在重大更新的時候,會詳列出更動的部分以及解說,同時在最後感謝各個協助開源的工程師們。 歡迎參考這篇一起服用~ [Visual Studio Code](https://hackmd.io/s/rJPKpohsx) ### 1.2. 下載 VSC 直接到[官網](https://code.visualstudio.com/)下載最新版,切記不是 Visual Studio。 <img src="https://i.imgur.com/pDEmCKV.png" width=100%> 安裝過程中可以自己勾選喜愛的設定,下圖為筆者設定。 <img src="https://i.imgur.com/W6aGVzd.png" width=80%> 進到歡迎畫面後,一般應該會看到程式提示說找不到 Git,所以我們需要先在 Windows 安裝 Git。 <img src="https://i.imgur.com/dqIFbZ8.png" width=100%> ### 1.3.安裝 Git 直接到[官網](https://git-scm.com/)下載最新版。 <img src="https://i.imgur.com/rHL0zaT.png" width=100%> 一開始的安裝選項我選擇不和檔案總管做整合,因為原生的 bash 和 GUI 實際上很少會用到。 <img src="https://i.imgur.com/vIyxeSc.png" width=80%> 接下來我選擇使用 VSC 作為 Git 的預設編輯器,不過這部分使用預設 Vim 也可以。 <img src="https://i.imgur.com/ueDVeA0.png" width=80%> 之後基本上一直按 Next 即可完成安裝,打開命令提示字元並輸入 `git --version` 檢查是否正常安裝。 <img src="https://i.imgur.com/rBKZpsK.png" width=80%> 由於使用 git 需要先輸入使用者資訊,所以請先照下面並修改成自己的資訊輸入。提醒一下**這裡的 git 是給 VSC 用的**,**WSL 是使用自己獨立的 git**,所以最好也在裡面輸入一次使用者資訊。 ``` $ git config --global user.name "xxxxx" $ git config --global user.email "xxxxx@xxx.com" ``` 輸入完後可以用 `git config --list` 檢查全域設定是否正確。 <img src="https://i.imgur.com/1kpre4y.png" width=90%> <img src="https://i.imgur.com/CIOVmt7.png" width=90%> ### 1.3. 環境設定 需要搜尋什麼指令,按下 `Ctrl`+`Shift`+`P` 開啟「**命令選擇區**」可以很方便查找,像是搜尋 `icon` 可以調整檔案總管裡檔案的圖示,搜尋 `theme` 則可以改變 VSC 整體主題配色。 <img src="https://i.imgur.com/nqscMvA.png" width=100%> > 2017 年 11 月更新,在命令提示字元裡輸入 `code --status` 可以看到 VSC 內部的資源使用狀況。 <img src="https://i.imgur.com/eYJSOJp.png" width=100%> 從「檔案 > 喜好設定 > 設定」或 `Ctrl`+`,` 進入**使用者設定**,這個檔案以筆者而言會位於以下路徑,要備份的話可以記起來。 ``` C:\Users\使用者名稱\AppData\Roaming\Code\User\settings.json ``` 在此提供一些設定範例,請依照自己喜愛去做調整,預設設定或使用者設定都可以直接按**筆狀圖示**修改。使用者設定比較偏**全域設定**,而工作區設定則可以個別獨立。 ```jsx { //編輯器 // 控制字型家族,有空格的才要+'。 "editor.fontFamily": " 'Ubuntu Mono derivative Powerline' , 'monospace' ", // 控制游標動畫樣式,可能的值為 'blink'、'smooth'、'phase'、'expand' 和 'solid' "editor.cursorBlinking": "expand", // 開啟檔案時,會依據檔案內容來偵測 `editor.tabSize` 及 `editor.insertSpaces`。 "editor.detectIndentation": false, // 控制字型大小 (以像素為單位)。 "editor.fontSize": 18, // 控制是否應在輸入時自動顯示建議 "editor.quickSuggestions": { "other": true, "comments": true, "strings": true }, // 使用滑鼠滾輪並按住 Ctrl 時,縮放編輯器的字型 "editor.mouseWheelZoom": true, // 控制編輯器是否會捲動到最後一行之後 "editor.scrollBeyondLastLine": false, // 控制是否自動換行。可以是: // - 'off' (停用換行), // - 'on' (檢視區換行), // - 'wordWrapColumn' (於 'editor.wordWrapColumn' 換行`) 或 // - 'bounded' (當檢視區縮至最小並設定 'editor.wordWrapColumn' 時換行). "editor.wordWrap": "on", // 當 `editor.wordWrap` 為 [wordWrapColumn] 或 [bounded] 時,控制編輯器中的資料行換行。 "editor.wordWrapColumn": 80, // 指定在工作台中使用的圖示主題,或設定為 'null' 不顯示任何檔案圖示。 "workbench.iconTheme": "material-icon-theme", //視窗 // 控制重新啟動後視窗重新開啟的方式。選取 [無] 一律以空白工作區開始、選取 [一] 從上一個編輯的視窗重新開啟、選取 [資料夾] 重新開啟所有資料夾曾經開啟的視窗,或選取 [全部] 重新開啟上一個工作階段的所有視窗。 "window.restoreWindows": "all", //檔案 // 若啟用,將在儲存檔案時修剪尾端空白。 "files.trimTrailingWhitespace": true, // 啟用時,請在儲存檔案時在其結尾插入最後一個新行。 "files.insertFinalNewline": false, // 若啟用,則會在儲存檔案時,修剪檔案末新行尾的所有新行。 "files.trimFinalNewlines": true, // 預設結尾斷行字元.LF使用 \n , CRLF使用\r\n "files.eol": "\n", // 控制已變更之檔案的自動儲存。接受的值: 'off'、'afterDelay、'onFocusChange' (編輯器失去焦點)、'onWindowChange' (視窗失去焦點)。若設為 'afterDelay',可以在 "files.autoSaveDelay" 中設定延遲。 "files.autoSave": "onFocusChange", //檔案總管 // 控制檔案與資料夾在總管中的排列順序。除了預設排序外,您也可以將順序設定為 'mixed' (檔案與資料夾)、'type' (依檔案類型)、'modified' (依最後修改日期) 或 'filesFirst' (將檔案排序在資料夾前)。 "explorer.sortOrder": "type", //整合式終端機 // 控制終端機資料指標是否閃爍。 "terminal.integrated.cursorBlinking": true, // 控制終端機資料指標的樣式。 "terminal.integrated.cursorStyle": "line", // 控制終端機的字型大小 (以像素為單位) "terminal.integrated.fontSize": 18, // 終端機在 Windows 上使用的殼層路徑。使用隨附於 Windows 的殼層 (cmd、PowerShell 或 Bash on Ubuntu) 時。 "terminal.integrated.shell.windows": "wsl.exe", } ``` 最重要的是在整合式終端機的部分,在第二章有提到幾個開啟 WSL 的方法,為了方便直接導向到使用者目前位置,所以在此選擇 `wsl.exe`,他會幫我們以預設的 shell (zsh) 開啟。 若使用 `bash.exe` 或 `ubuntu.exe`,則需要加上 `"terminal.integrated.shellArgs.windows": ["-c", "zsh"]`。 透過 VSC「檔案 > 選擇資料夾」開啟想要測試的資料,再開啟「檢視>**整合式終端機**」(`Ctrl`+` ),可以看到兩者路徑是相同的,而且透過 VSC 開啟的終端機變得相當美觀。 <img src="https://i.imgur.com/YXXTWUC.png" width=100%> > 2018 年 2 月更新,可以分割整合式終端機以達到類 tmux 的功能,需要注意我們使用 zsh 主題的關係,調整大小不慎就會變成這樣,不過 WSL 很早就支援 tmux 了,自己可以衡量一下。 <img src="https://i.imgur.com/aK6kv9i.png" width=100%> 參考資料:[User and Workspace Settings](https://code.visualstudio.com/docs/getstarted/settings) ### 7.安裝擴充功能 一般這些擴充功能是協助我們在開發中,對於 code 語法的自動建議或偵錯。 請先點擊左邊側邊欄最後一個,開啟擴充功能後,預設是會顯示熱門的擴充,安裝好的會顯示齒輪圖示。 <img src="https://i.imgur.com/oFzmDSm.png" width=100%> 基本上越多人安裝的可靠性越高,當然這部分也是看個人開發語言的偏好去安裝,若沒有特別的需求可以先考慮安裝下面所列的幾個功能,詳細說明也都可以在裡面看到。 * Python * C/C++ * GitLens * Git History * Astyle (詳見下面) ### 8.安裝 Astyle 由於 VSC 有 Astyle 的擴充套件,再加上其在 C/C++、Java 的格式化提供相當多的選擇,對於程式碼的整理相當有幫助。在此會以 Windows 的搭配來介紹,在 WSL 裡也可以安裝 Astyle,但是不能被擴充功能支援。 到[官網](http://astyle.sourceforge.net/)找到 Download 並安裝最新版 <img src="https://i.imgur.com/AyFITLO.png" width=100%> 下載後請解壓縮到 C 槽 (或是任何你想要的位置),記住這個位置。由於我們已經安裝了 Astyle 的擴充功能,在使用者設定裡應該會看到像下圖的選項。 <img src="https://i.imgur.com/Z5u80E3.png" width=60%> 以下是參考設定,請加在原本的使用者設定後面,執行路徑就是剛才解壓縮後放的位置再加上 `/bin/AStyle.exe`,後綴的引數可以根據[官方文件](http://astyle.sourceforge.net/astyle.html)選擇自己需要的。 ```jsx //Astyle // astyle executable path "astyle.executable": "C:/AStyle/bin/AStyle.exe", // array of command line options "astyle.cmd_options": [ "--style=java", //-A2 "--max-code-length=80", //-xC "--indent=spaces=4", //-s "--indent-classes", //-C "--indent-switches", //-S "--indent-after-parens", //-xU "--indent-col1-comments", //-Y "--pad-oper", //-p "--pad-comma", //-xg "--unpad-paren", //-U "--align-pointer=name", //-k3 "--align-reference=name", //-W3 "--break-closing-braces", //-y "--break-one-line-headers", //-xb "--remove-braces", //-xj "--break-after-logical", //-xL "--suffix=none", //-n "--convert-tabs" //-c ] ``` ### 9.執行第一個程式與一些小技巧 更多關於 VSC 小技巧可以參考台灣官方教學影片[活用 Visual Studio Code](https://channel9.msdn.com/Series/Mastering-Visual-Studio-Code)。 #### 使用Astyle 在此會先以以下很醜的範例 code 來說明。 ```clike= #include <stdio.h> #include <stdlib.h> int main( ) {int i=1,j=2,k=3; printf("num1:%d\n",i); printf("num2:%d\n",j); printf("num3:%d\n",k); if( i==1 && j< k){ printf("true~\n"); } else {printf("false~\n");} return 0; } ``` 在剛才的測試資料夾裡新增一個 `test.c`,並打上剛才的程式碼。 > 2018 年 1 月更新,可以在左側檔案總管看到 errors 和 warnings 的提示。 <img src="https://i.imgur.com/nqBQ5fP.png" width=100%> 接著按下右鍵選擇「文件格式化」(`Shift`+`Alt`+`F`),一下就自動幫我們排版好了。 <img src="https://i.imgur.com/ThXfdA4.png" width=100%> #### 執行第一個程式 在這裡就先以 C 程式來解說,請先輸入以下指令安裝裝 gcc 和 g++。 ``` $ sudo apt-get install build-essential ``` 0. 綠底的部分是由於 VSC 在 Windows 環境無法找到這些標頭檔,但我們會透過 WSL 來執行,所以可以不用管。 1. 輸入 `gcc -o test test.c` 編譯後,檔案的更動都會在左邊欄位即時顯示 2. 輸入 `./test` 執行 3. 結果如圖,可以看到即使檔案不是位於 Linux 用戶所熟知的根目錄等位置,WSL 依然可以正常辨識這些檔案 <img src="https://i.imgur.com/EUYT2aQ.png" width=100%> 4. VSC 在編輯上提供了相當多的快捷鍵,想知道的可以點[這裡](https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf),像是下圖利用 `Ctrl`+`H` 就可以開啟取代功能,或是直接使用 `Ctrl`+`Shift`+`L` 同時修改多處地方 <img src="https://i.imgur.com/adcAsCk.png" width=100%> <img src="https://i.imgur.com/pQy9sDi.png" width=100%> 5. 我們也可以透過 `Ctrl`+`Shift`+`方向鍵` 來選取程式碼片段 <img src="https://i.imgur.com/S4Ps3ES.png" width=100%> 6. 再建一個測試的標頭檔如下 <img src="https://i.imgur.com/k1CcsoP.png" width=100%> 7. 回到原本的 `.c` 檔,像下圖這種提供自動建議的部分就是 VSC 所支援的 intellisence <img src="https://i.imgur.com/aUCZR5l.png" width=100%> 8. VSC 還提供了 peek definition 的功能,按下 `Alt`+`F12` 可以直接在底下查看 function 或 class 的定義,直接按 `F12` 會直接跳轉至定義,或是按住 `Ctrl` 來查看。 > (待補充) 由於我們 gcc 是在 WSL 裡,這些標頭檔尚無法透過 Windows 找到,所以自動建議和查找定義只能透過開啟的資料夾做關聯,如果是 Linux 的 OS 使用 VSC 一般就不會有這種困擾 <img src="https://i.imgur.com/cj01Kwk.png" width=100%> 9. VSC 還有不錯的快速註解功能 * `Ctrl`+`/`:Line comment <img src="https://i.imgur.com/TcLYchC.png" width=100%> * `Shift`+`Alt`+`A`:Block comment <img src="https://i.imgur.com/V2IqZuG.png" width=100%> #### 使用 Git 在這裡會簡單介紹在 VSC 裡使用 git,若要使用終端機等可以參考 [git 新手入門教學](https://hellolynn.hpd.io/2017/01/18/git新手入門教學-part-1/)或其他相關網站~ 0. 先確定一下自己是否有 [github](https://github.com/) 的帳號,以及是否有照前面章節設定好 git 使用者資訊 1. 這裡可以選擇先在 github 建立新的 repo 再 clone 下來,或是直接從現有檔案建立 repo 再 remote,就以和 WSL 搭配而言,前者會相對省事一些,以下是後者的說明。 2. 首先點擊左邊側邊欄的「原始檔控制」,下面的終端機可以先切換至「輸出 > Git」以方便觀察 <img src="https://i.imgur.com/CFnviIU.png" width=100%> 3. 之後點擊左側的一個圖示「初始化儲存庫」,選擇資料夾後就會變成下圖這樣,同時資料夾裡會多了 `.git` 的隱藏資料夾 > 2017 的 10 月更新,可以直接在左側的檔案總管檢視 repo 的 git status,像是 modified 或 untracked 等。 <img src="https://i.imgur.com/BifO1GI.png" width=100%> 4. 在左側變更那裏點擊一個加號「暫存所有變更」,當然也可以自己選擇哪些檔案要暫存,這等同於 `git add` 的部分,取消暫存只需按減號即可 <img src="https://i.imgur.com/M6QYZB8.png" width=40%> 5. 在訊息欄位填上自己的備註後就可以按下勾勾送出就結束了,這等同於 `git commit` 的部分 6. 這時可以用我們之前裝好的擴充功能,我們先回到檔案總管,左下角的「GITLENS」可以方便查看 repo 的資訊,而點擊右上的圖示「Git: View History」可以詳細看到自己每一次的 commit 的訊息與更動,最底下的狀態列也會有圖示表示 <img src="https://i.imgur.com/CycPpPi.png" width=100%> 7. 由於我們現在都還算是在本地端,所以先到 github 建立一個新的 repo <img src="https://i.imgur.com/kejjWMH.png" width=50%> 8. 名稱請和本地端的資料夾名一致 <img src="https://i.imgur.com/8kdF4lT.png" width=100%> 9. VSC 裡面雖然有提供 clone 的介面,但卻沒有選項將本地端新建的丟上去,所以在此得用終端機來處理,首先把網站底下兩行指令記下 <img src="https://i.imgur.com/e0GcpgX.png" width=100%> ``` $ git remote add origin https://github.com/xxxxxx/test.git $ git push -u origin master ``` 10. 因為這裡都是連結在同一個資料夾位置,終端機可以選擇要透過 Windows 還是 WSL 來 remote,但若 repo 是位於 WSL 裡,因為檔案系統的關係就只能使用 WSL,再注意一下兩者的使用者資訊都一樣即可 11. (WSL 直接從步驟 12 開始) 開啟資料夾並點擊「檔案 > 開啟 Windows PowerShell」,方便確保路徑相同 <img src="https://i.imgur.com/eFuL36n.png" width=100%> 12. 把指令依序打上後會出現登入畫面 (WSL 會是文字介面輸入) <img src="https://i.imgur.com/JaclHDL.png" width=100%> <img src="https://i.imgur.com/eLAJt88.png" width=50%> 13. 登入後就完成 repo 的 remote 了 <img src="https://i.imgur.com/BzKsYc9.png" width=100%> 14. 去 github 上面也會發現東西都 push 上去了 <img src="https://i.imgur.com/3OsB0xQ.png" width=100%> 15. 接下來試著增加一些東西再來按下勾勾 (commit) 一次,並透過 Git History 檢查。如果想要比較和上次的版本哪裡不一樣,點擊檔案查看即可,但需要在 commit 前 <img src="https://i.imgur.com/TKOlNb9.png" width=100%> <img src="https://i.imgur.com/Um1TH70.png" width=100%> 16. 如果 commit 完後想反悔,就點選旁邊的「復原上次認可」,在 push 前都還可以 <img src="https://i.imgur.com/GWjhsxU.png" width=60%> 17. 按下後就會回復上次 commit 之前的狀態,體驗過後還是重新 commit 吧 <img src="https://i.imgur.com/G2pfL9a.png" width=100%> 18. commit 完後請按下「推送」,就完成了 repo 的更新 <img src="https://i.imgur.com/uzPMi86.png" width=60%> 19. 在右上角應該會發現多了一個圖示,在這裡可以概觀自己每次 commit 的部分 <img src="https://i.imgur.com/XGJH4d3.png" width=100%> 20. 回去刪減一點再次 push,這次回到檔案總管,透過 GITLENS 可以更明確找到每次變更的地方 <img src="https://i.imgur.com/oc4DQ8z.png" width=100%>