工欲善其事,必先利其器。vscode是一個值得花費時間去掌握精通的編輯器。css
打開vscode,把菜單看上三遍,仔細思考每一個菜單項的做用,思考爲啥要這樣歸類每一個菜單項。html
"文件/首選項"這個菜單相當重要,它包括以下四大塊配置功能:前端
{ "sout": { "prefix": "sout", "body": [ "System.out.println($1);", "$2" ], "description": "打印" }, "cla": { "prefix": "class", "body": [ "public class $1 {\n\t$2\n}" ], "description": "定義類" }, "main": { "prefix": "main", "body": [ "public static void main(String[]args){\n\t$1\n}" ], "description": "定義main函數" } }
prefix就是觸發條件,body就是插入的代碼片斷,description是一些提示性內容。在body中可使用$數字
的形式表示光標位置,使用tab鍵能夠逐個到達$數字
所在的位置。java
ctrl+P:打開文件
ctrl+shift+P:打開命令面板,這個快捷鍵堪稱最有用的快捷鍵。快捷鍵的缺點在於1)鍵少容易衝突;2)難於記憶。使用命令面板,咱們只須要記憶簡短的命令,既快又準。
ctrl+shift+E:打開文件資源管理器(Exploerer)
ctrl+shift+D:打開調試窗口(Debug)
ctrl+shift+G:代開Git窗口
ctrl+shift+X:打開包管理工具
ctrl+B:隱藏側邊欄
ctrl+`:打開控制檯node
把界面佈局中無關的視圖所有關閉,當須要某些視圖時使用快捷鍵調出。python
vscode默認的安裝位置。linux
每一個打開的文件夾均可以有單獨的配置,存放在.vscode中,主要包括launch.json、tasks.json、settings.json,分別是調試器設置、任務設置、項目自己的設置(會覆蓋全局的settings.json)。git
在~/.vscode目錄下,extensions存放了已安裝的擴展,想要學習如何編寫擴展,直接看這個文件夾就能夠了。github
在~/AppData/Roaming/Code下,文件夾包括備份、緩存、日誌、cookie、用戶配置等信息,其中用戶配置文件件User是最重要的,它包括:shell
vscode意識到了有太多文件夾不夠簡潔清晰,因而vscode提供了portable(便攜)模式,這種模式把全部數據文件都集中放在一個文件夾中。好處是便於移動,換環境以後免於從新配置(即使不是便攜模式,也可以經過複製相關文件夾的方式實現複製vscode配置);壞處是註冊表、路徑須要本身手動更新,須要手動設置許多文件關聯。
關於portable的模式的安裝方法詳見:https://code.visualstudio.com/docs/editor/portable
大概步驟以下:
%APP_DATA%/Code
複製到解壓後的安裝包的data目錄vscode內置了許多主題,這些主題都是經過json文件指定的。vscode在界面上並無提供修改主題文件的功能,但咱們能夠經過修改文本文件的方式來修改細節,例如:把註釋顏色調爲較亮的綠色。只須要修改vscode安裝目錄下的主題文件便可:C:\Program Files\Microsoft VS Code\resources\app\extensions\theme-monokai\themes
vscode的設置並無提供菜單欄、側邊欄的字體設置。可是咱們能夠經過修改
C:\Program Files\Microsoft VS Code\resources\app\out\vs\workbench\workbench.main.css
文件來實現界面定製。
其中文件導航側邊欄的css選擇器爲:
.monaco-workbench>.part>.content{ font-size:16px; font-family:"微軟雅黑"; line-height: 18px; }
好的系統都是開放的,vscode經過task和extension兩種方式向用戶開放。
打開命令面板,configure task命令設置task,會在當前目錄的.vscode目錄下生成一個tasks.json。再次打開命令面板,task run build命令會執行build過程,這個命令的快捷鍵爲ctrl+shift+B。這是會自動打開控制檯執行設定的命令。
若是爲每一個項目都設置不少task,那將會很是費事。而現有的一些構建工具如make、npm、maven等已經包含了不少命令,vscode正在和這些工具集成起來。例如使用npm時,在package.json中定義了run命令,就能夠直接經過命令面板執行run命令,不須要更改tasks.json。
目前vscode只把前端的npm、gulp、grunt等工具的可執行任務集成進來了。
假設在scripts文件夾下有一個test命令,咱們須要運行這個命令。
{ "version": "2.0.0", "tasks": [ { "label": "Run tests", "type": "shell", "command": "./scripts/test.sh" } ] }
task中的部分字段的含義以下:
關於task.json的配置細節,參考:https://code.visualstudio.com/docs/editor/tasks-appendix
有向無環圖DAG在工程界很受歡迎,彷佛任何項目中都沒法避開有向無環圖。緣由是由於:好項目一定複雜,複雜一定很大,大則須要拆分,拆分以後會獲得一堆小組件,小組件之間必有依賴,有依賴的項目必然構成一個有向無環圖,若是有環就變成死循環了。
vscode中的若干個task也能夠組合起來。這經過task的dependOn字段來實現。利用這個字段就可以把一系列task串聯起來實現逐步構建。
{ "version": "2.0.0", "tasks": [ { "label": "Client Build", "command": "gulp", "args": ["build"], "options": { "cwd": "${workspaceRoot}/client" } }, { "label": "Server Build", "command": "gulp", "args": ["build"], "options": { "cwd": "${workspaceRoot}/server" } }, { "label": "Build", "dependsOn": ["Client Build", "Server Build"] } ] }
然而,我認爲這個功能很雞肋,這已經超出了vscode的職責範圍了,沒有dependOn咱們照樣寫出逐步構建的代碼,徹底能夠把depend的一些命令寫在一個shell腳本中。
vscode task的一個重要做用就是語法檢測,在編輯代碼時,這些問題檢測程序一直在執行,vscode須要讀取這些語法檢測程序的輸出並可視化的展現給用戶。
problem matcher相關的內容較多,設計也很複雜,詳見參考資料。
{ "key": "ctrl+h", "command": "workbench.action.tasks.runTask", "args": "Run tests" }
給任務綁定的快捷鍵command都是相同的,只有args不一樣,args參數對應task的label字段。
在vscode中,最好不要給task綁定快捷鍵,由於keybinding.json是一個全局文件,.vscode文件夾中tasks.json是項目特有的文件。
在配置task時,咱們須要給命令行傳遞一些參數,如當前文件、當前文件夾。
例如:
${file}
表示當前文件名${workspaceFolder}
表示當前工做空間的名字${lineNumber}
當前文件的行號掌握這三個變量替換足夠用了,vscode還定義了許多並沒有卵用的變量,此處是一份詳細的變量列表。https://code.visualstudio.com/docs/editor/variables-reference
使用vscode常常編寫一些單文件程序,使用的語言有多種:
tasks.json
{ "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "lang", "args": [ // Ask msbuild to generate full paths for file names. "${file}" ], "group": "build", // Use the standard MS compiler pattern to detect errors, warnings and infos "problemMatcher": [], "promptOnClose": true } ] }
將lang.cmd這個命令放在全局變量PATH下
python %~dp0\lang.py %*
主體程序使用python實現
import sys import os import tempfile """ 使用單文件運行 """ if len(sys.argv) <= 1: print("usage : lang filename") exit(0) filename = sys.argv[1] print("正在運行", filename, "\n") if filename.endswith('.js'): os.system('node ' + filename) elif filename.endswith('.py'): os.system("python " + filename) elif filename.endswith('.java'): os.system("javac {} -d {}".format(filename, tempfile.gettempdir())) os.system("java -cp {} {}".format(tempfile.gettempdir(), os.path.basename(filename[:-5]))) elif filename.endswith('.cpp'): os.system("g++ {} -o {}/a.exe".format(filename, tempfile.gettempdir())) os.system(os.path.join(tempfile.gettempdir(), "a.exe")) elif filename.endswith(".html"): os.startfile(filename) else: print(filename, "是什麼文件?")
通過以上配置,就能夠快速實現對單文件的測試了。
在使用java語言編寫單文件程序時,每次運行老是彈出提示「Classpath is incomplete」,這個提示官方已經說明了,這個問題不是事,能夠直接設置java.errors.incompleteClasspath.severity
忽略掉這個問題。
vscode將哪些接口暴露給了擴展?擴展可以實現哪些功能?
這兩種類型的擴展遵循同一套vscode擴展基礎架構。這些類型的擴展都和外界工具鬆耦合,經過某種協議進行交流,vscode提供了調試器適配器協議用來和不一樣語言的調試器進行交流,提供了語言服務器協議和語言服務器進行交互。
vscode技巧,內容全面豐富,涉及vscode功能各個方面
https://code.visualstudio.com/docs/getstarted/tips-and-tricks
爲vscode編寫task
https://code.visualstudio.com/docs/editor/tasks
vscode插件體系概覽
https://code.visualstudio.com/docs/extensions/overview
LSP(language server protocol)協議是微軟提出的一種協議,功能包括代碼提示、查找引用等功能。
https://microsoft.github.io/language-server-protocol/