vscode开发环境基础配置
vscode开发环境基础配置
此文用于记录我的VS Code环境配置(只涉及通用化配置,不包含诸如自定义代码段等定制化配置),主要用于算法/深度学习的日常开发,涉及语言为Python和C++,操作系统为Linux(偶尔用MAC OSX,极少用Windows),开发机器以远程服务器为主, 本地环境为辅。
使用和配置IDE的前提是你真正需要它 (适合自己的才是最好的,其实你是VIM党,也可以直接无视本文),虽说 "工欲善其事必先利其器" ,但我还是建议多将时间花在钻研技术或科研上。
Basic Settings
首先是比较基础的配置,包括插件以及一些settings配置(主要从硕士期间的编码习惯以及在公司实习期间的开发状况演变而来),此套配置方案比较适合从事深度学习/算法研究,使用Python和C++作为主要开发语言的童鞋。
Extensions
先罗列一下插件(extensions):
- Python ms-python.python
- C/C++ ms-vscode.cpptools
- C/C++ Clang Command Adapter mitaki28.vscode-clang
- Markdown All in One yzhang.markdown-all-in-one
- GitLens eamodio.gitlens
- Remote-SSH ms-vscode-remote.remote-ssh
- Settings Sync shan.code-settings-sync
- Best Dark Themes Pack ==> One Dark Pro
- vscode-iconsvscode-icons-team.vscode-icons
- Markdown Preview Enhanced (实时预览markdown,markdown使用者必备)
- Bracket Pair Colorizer (括号配对着色) 和 Indent Rainbow(彩虹缩进)
- Material Theme (Visual Studio Code 最悠久的主题!)
- Auto Import (自动去查找、分析、然后提供代码补全)
- mermaid (可以在 markdown 文档中直接编辑时序图,替代在线时序图编辑器!)
稍微解释一下各个插件的功能与用途:
首先,代码高亮和语法检查是日常开发必须的, 这里我直接选用微软官方的 Python 和 C/C++ 这两个插件, 针对 C/C++ 的语法检查与代码补全,我选用的是 C/C++ Clang Command Adapter,后边还会提到。
因为个人还经常使用markdown,这里再加一款优秀的Markdown插件 Markdown All in One,满足日常开发需求。
GitLens 则是代码版本管理与合作开发方面的不二选择。
Remote-SSH 则可以说是VS Code最大的神器之一,让远程编写/调式代码变得异常舒适。
主题方面One Dark Pro,图标则是 vscode-icons。
前面说了这些是我认为比较通用的插件,其他较为定制化的插件的使用,因人而异,请自行安装与配置。
Settings
使用快捷键:
Crtl + Shift + P
之后输入settings.json,点击下图第二项进入文件
再来看一下配置文件(settings.json):
{
"remote.SSH.remotePlatform": {
"192.168.1.1": "linux",
},
"window.zoomLevel": 1,
// theme
"workbench.colorTheme": "One Dark Pro",
"workbench.colorCustomizations": {
"[Atom One Light]": {
"editor.background": "#C7EDCC",
"sideBar.background": "#C7EDCC",
"activityBar.background": "#C7EDCC",
},
},
"workbench.iconTheme": "vscode-icons",
// editor settings
// 显示缩进参考线,很有用,特别是在嵌套很多层的时候
"editor.renderIndentGuides": true,
// 在保存时对代码进行格式化,非常有用
"editor.formatOnSave": true,
// 当按tab键是,用空格代替
// PS: 开启这个可以充分避免因为tab键和space键混用而导致的代码一团糟
// 特别是在编写python代码的时候 XD
"editor.insertSpaces": true,
// 按住 Ctrl 键并滚动鼠标滚轮时对编辑器字体大小进行缩放
// 如在meeting适,share屏幕下VS Code字体太小,就能进行调节
"editor.mouseWheelZoom": true,
// 显示控制字符
// 这个也非常有用,有时候一些看不到的特殊字符可能会让你debug半天
"editor.renderControlCharacters": true,
// 显示空白字符
// 我使用的是 boundary 模式,这样可以比较清晰地看到每行开头和结尾的空格字符
"editor.renderWhitespace": "boundary",
// 文件的EOL,统一成 "\n",
"files.eol": "\n",
"editor.suggestSelection": "first",
"vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
"editor.gotoLocation.multipleDefinitions": "goto",
"editor.gotoLocation.multipleTypeDefinitions": "goto",
"files.autoSave": "onFocusChange",
// python settings
"python.formatting.provider": "black",
"python.formatting.blackArgs": [
"-l 120"
],
"[python]": {
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
"editor.tabSize": 4
},
"python.envFile": "${workspaceFolder}/build/.env",
"python.analysis.extraPaths": [
"./build/tvm/python",
"./build/tvm/topi/python",
"./python"
],
"python.languageServer": "Pylance",
"python.testing.pytestEnabled": true,
// c plus plus settings
"C_Cpp.clang_format_fallbackStyle": "Clang-Format",
"[cpp]": {
"editor.detectIndentation": true,
"editor.tabSize": 2
},
"cmake.environment": {
"RISCV": "/usr/local/xxx",
"LD_LIBRARY_PATH": "$RISCV/lib:$LD_LIBRARY_PATH"
},
"cmake.configureEnvironment": {
"RISCV": "/usr/local/xxx",
"LD_LIBRARY_PATH": "$RISCV/lib:$LD_LIBRARY_PATH"
},
"cmake.configureArgs": [
"-DUSE_LLVM=${env:RISCV}/bin/llvm-config",
"-DUSE_xxxx=1",
"-DUSE_CLANG_12=ON",
"-DUSE_xxxx=ON",
],
"cmake.configureOnEdit": false,
"terminal.integrated.env.linux": {
"PYTHONPATH": "${workspaceFolder}/0520/tvm/python:${workspaceFolder}/tvm/topi/python:${workspaceFolder}/python:${workspaceFolder}/tests/common:${env:PYTHONPATH}",
// "DUMP_IR_FLAG": "True",
// "TVM_CONST_DEBUG": "on"
},
"files.associations": {
"*.ir": "cpp",
"array": "cpp",
"atomic": "cpp",
"*.tcc": "cpp",
"bitset": "cpp",
"cctype": "cpp",
"chrono": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"condition_variable": "cpp",
"csetjmp": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"list": "cpp",
"unordered_map": "cpp",
"unordered_set": "cpp",
"vector": "cpp",
"exception": "cpp",
"algorithm": "cpp",
"functional": "cpp",
"iterator": "cpp",
"map": "cpp",
"memory": "cpp",
"memory_resource": "cpp",
"numeric": "cpp",
"optional": "cpp",
"random": "cpp",
"ratio": "cpp",
"set": "cpp",
"string": "cpp",
"string_view": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"fstream": "cpp",
"future": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"iosfwd": "cpp",
"iostream": "cpp",
"istream": "cpp",
"limits": "cpp",
"mutex": "cpp",
"new": "cpp",
"ostream": "cpp",
"shared_mutex": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"thread": "cpp",
"cinttypes": "cpp",
"typeindex": "cpp",
"typeinfo": "cpp",
"csignal": "cpp",
"regex": "cpp",
"*.hc": "cpp",
"bit": "cpp",
"*.def": "cpp",
"*.inc": "cpp"
}
}
Python Linting & Formatting
Python的代码检查与格式化,我使用了 isort + black + flake8 的方案,类似的方案也可以在众多开源项目中看到,如 FAIR 的图像分类训练框架 pycls, 通用检测训练框架 Detectron2 等等。
- isort 是一个专门用来对imports进行排序的工具
- 你可能经常会有到底import的这些package怎么摆放,isort帮你统一解决了这个问题
- 官宣很有意思: isort your imports, so you don't have to.
- black 代替默认的pylint对代码进行格式化
官方的说法是 Black is the uncompromising Python code formatter - flake8 是目前比较常用的静态代码检查工具
我个人认为团队统一的代码风格和开发规范是很重要的
// provider 选择black
"python.formatting.provider": "black",
"[python]": {
// 在保存 python 文件的时候,用isort进行import 排序
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
// tab键占用4个字符
"editor.tabSize": 4
}
可以优先在自己使用conda环境中装好(忘记装也不要紧,Lint或者Format的时候VS Code会提示你):
conda install black flake8 isort -y
全部配置好后会产生如下效果:
ctrl + s 进行文件保存
调用isort对imports进行排序
调用black进行代码格式化
保存结束
不管是团队还是个人,统一的 Linting 和 Formatting 都是重要的,我们应该把精力花在coding本身,而不应该在代码风格和排版上纠结
C++ Linting & Formatting
C++ 这里,我简单配置了 Google Style,从下面的配置也能看清晰看出
"C_Cpp.clang_format_fallbackStyle": "Google",
"[cpp]": {
"editor.detectIndentation": true,
"editor.tabSize": 2
}
- 大部分情况下还是推荐用 Clang-Format 来做 C++ 代码风格管理,大家熟悉的 TensorFlow / PyTorch / Electron 等开源 C++ 项目均有使用
- 如果是做一些ICPC的比赛,更推荐直接使用 Vim / Code::Blocks,或者更轻量级的 Sublime Text
Debugging
代码调试这块可能并不是VS Code的强项,对于一些小的项目或者比较单一的代码段,使用默认的调试工具进行简单调试即可,某些比较大型的项目,建议还是在terminal用GDB仔细调试。
Remote-SSH
相对于本地调试,更多时候我们可能需要在远程服务器上进行实验与开发工作,这个时候 Remote-SSH 这个神器就体现出它的优越性了
SSH Key
SSH的连接,主要有如下三种情况:
- SSH直连: 比较懒惰的做法就是ssh直连到实验室的服务器上,这样每次输入账号密码就行了
- 免密登录: 稍微舒服一点的做法是配置一下 ssh key ,做到免密登录
generate a new ssh-key - Jump跳板机: 通过配置 ProxyCommand 或者 ProxyJump ,实现跳过堡垒机/跳板机, 关于如何配置 ProxyCommand/ProxyJump,推荐两篇文章给大家,分别对应Windows和Linux,这里我就不展开了
- VSCode Remote ssh跳板机配置(windows)
虽然我不推荐使用windows作为日常开发的系统 - SSH 通过跳板机直接访问内网机器(Linux/Mac OSX)
- VSCode Remote ssh跳板机配置(windows)
# 直连,设置HostName 和 User 即可
Host v100-dota2
HostName v100.dota2-ai.com
User bigballon
# 再加上 IdentityFile 即可实现免密登录
Host 3090-dota2
HostName rtx3090.dota2-ai.com
User bigballon
IdentityFile ~/.ssh/id_ed25519_RTX3090
# 再配置 ProxyJump 实现Jump跳板机
Host dota2-ai-lab
HostName lab.dota2-ai.com
User bg
IdentityFile ~/.ssh/id_ed25519_dota2
ProxyJump bg@jump.dota2-ai.com
# ProxyJump 或 ProxyCommand 都可以
# 使用 ProxyJump 需要 OpenSSH > 7.3 才可以使用
More Features
Remote-SSH的功能 远不止 通过SSH方式连接远程服务器 这么简单:
在remote端安装对应的extension
选择remote端的interpreter
与remote连接上的terminal,
可以到达与本地几乎完全相同的使用体验,甚至可以直接右键单击文件或文件夹进行下载, 将文件或文件夹拖拽进VS Code进行上传,这样你无需再开启filezilla之类的传输工具, 而VS Code自带的终端,也同步连接至远程服务器,而且支持多开,分屏等功能,几乎所有的操作都可以在VS Code中完成
ssh
extension1
extension2
interpreter
overview
至此,你拥有了一个通用且较为舒适的 VS Code 开发环境, 无论是对于本地还是远程服务器的开发,配置同步,还是语法检查/自动格式化与代码调试,甚至是文件上传下载终端操作等功能,它都是舒心的。 那么接下来,全心投入到你的学习和研究与工作中去吧。
gdb 调试 launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"env": {
// "DUMP_IR_FLAG": "True",
"PYTHONPATH": "${workspaceFolder}/0520/build/tvm/python:${workspaceFolder}/build/tvm/topi/python:${workspaceFolder}/tests/common:${workspaceFolder}/tests/op:${env:PYTHONPATH}",
}
},
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "enter program name, for example ${workspaceFolder}/a.out",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
},
{
"type": "gdb",
"request": "launch",
"name": "GDB",
"program": "${workspaceFolder}/${command:AskForProgramName}",
"stopOnEntry": true,
"arguments": ""
}
]
}