优雅地使用VSCode与WSL在Windows 10下开发

Quank123Wip

2020-02-14 11:54:47

Personal

自Luogu日报开办以来已经有了许许多多的VSCode配置指南,但这些配置指南多多少少有着一些问题,例如: - 配置起来在不同的设备上有着区别,没有办法找到一个通用的解决方案。 - 编译依赖MinGW或Cygwin等Windows环境下的编辑器,没有办法获得与OJ上类似的Linux环境。 - **常常会出现大量的环境变量问题以及库未包含问题**(常见如不能找到```bits/stdc++.h```) - 对C++新标准的不支持 ![](https://cdn.luogu.com.cn/upload/image_hosting/mnk82m92.png) 因此今天我要介绍一种不同的方法,使用WSL(Windows Subsystem for Linux)配合VSCode实现在Windows 10下近似Linux环境开发 ## WSL配置 前置小知识:WSL是由微软开发,提供了在Windows 10下运行,近似Linux的一个环境。WSL通过Windows NT内核,在Windows内核之上运行了一个Linux发行版(常见如Ubuntu)。WSL可以基本上视为一个完整的Linux,并且能直接在WSL环境中运行Windows程序。然而也有一些小缺陷,比如对Unix Socket没有支持,不能支持访问GPU等等等等问题,这些问题在基于Hyper-V虚拟化技术的WSL2上得到或者将要得到改善(并且WSL1能和WSL2共存),但截至笔者撰写本篇文章时,WSL2仅在Windows 10 2004(或者说是Windows 10 20H1)及更高版本中可用,且Windows 10 2004版本并没有推送,因此这里并不过多介绍,已经升级到Windows 10 20H1的同学可以以管理员身份打开Powershell,将WSL上的某个发行版升级到WSL2(当然也能降级到WSL),如: ``` wsl --set-version ubuntu 2 ``` 就能完成WSL版本的转换。 言归正传,我们开始介绍WSL的安装。 首先,确保你的Windows 10版本足够新,包含了WSL功能,并打开控制面板中的程序与功能,在“启用或关闭Windows功能”,启用”适用于Linux的Windows子系统“。(可能需要重启) ![](https://cdn.luogu.com.cn/upload/image_hosting/615pkoq4.png) 之后,进入Microsoft Store,寻找你心仪的一款或几款WSL发行版,安装即可。(本文使用Ubuntu) ![](https://cdn.luogu.com.cn/upload/image_hosting/sv0rwtky.png) 笔者注:选择Ubuntu的理由是因为在一众Microsoft Store中的WSL发行版中,Ubuntu是最开箱即用的,Debian和SUSE配置上都比Ubuntu复杂,并且apt包管理器对于大部分Linux用户来说也更熟悉更友好。笔者使用的是Github上的ArchWSL,如有想要折腾的同学可以尝试[yuk7/ArchWSL](https://github.com/yuk7/ArchWSL)。~~(pacman天下第一)~~ 安装好之后,打开开始菜单里面的Ubuntu,它会自动安装。等待一会,它会要求你输入用户名及密码(并重复密码),这里是设置Linux环境下的用户名与密码,并没有必要与Windows中的用户名密码相同。 之后,你需要安装一定的编译用环境: ``` sudo apt update sudo apt install build-essential ``` 如果下载过慢可以自行参考配置[清华大学镜像源](https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/)或者其他国内镜像源。 之后,基本的WSL环境就已经配置完毕了。 ## WSL的配置(进阶) 我们配置好的WSL只是一个基本的Linux环境,想要它胜任一些复杂工作可以进行一些小优化小美化。 ### Oh My Zsh > "Oh My Zsh!" 熟悉Linux的同学大概都知道zsh这款好用的终端,这里就给没有接触过Linux的同学介绍一下,Zsh可以用于替代Linux环境下预置的Bash,有很多方便的特性,还支持各种各样的插件。 安装方法如下: ``` sudo apt install git zsh curl sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" ``` 之后可以通过: ``` bash ~/.zshrc ``` 来配置你的zsh。例如可以替换默认的zsh主题,这里推荐```agnoster```这个主题。(替换文件中的```ZSH_THEME="robbyrussell"```为```ZSH_THEME="agnoster"```) ### 终端模拟器 WSL自带的终端不是很美观,就算经过美观也难以比拟konsole等终端模拟器,这里推荐两款Windows下的终端模拟器。 #### Terminus 一款基于Electron的现代开源终端模拟器,非常美观易用,配置界面可以使用GUI来配置,适合新手使用,详情可参考[Eugeny/terminus]。(https://github.com/Eugeny/terminus) ![](https://cdn.luogu.com.cn/upload/image_hosting/aqxherf7.png) #### Windows Terminal Windows Terminal是2019年微软推出的开源终端模拟器,但截至本文编写时,该项目还处于Beta阶段,相关功能并不是十分完善,适合对Windows/Linux有一定经验的同学使用,详情可参考Microsoft Store以及开源项目[Microsoft/terminal](https://github.com/Microsoft/terminal)。 ![](https://cdn.luogu.com.cn/upload/image_hosting/y9pekenn.png) ### 图形环境 ``` sudo apt install xfce4 startxfce4 ``` #### X410 X410是一个UWP下的Linux Xserver客户端实现,它支持高DPI等各种独特的特性,但是这是一个收费软件,如果觉得好可以自行去Microsoft Store购买。 #### Xming Xming是一个开源Xserver客户端实现,免费,可以自行去SourceForge下载安装,相关的配置应该已经有人讲述清楚了,这里不多做赘述 ## VSCode的配置 WSL毕竟只是一个环境,使用它与VSCode一起开发还需要VSCode本身配合。 打开VSCode,搜索并安装插件“Remote - WSL”和“C/C++”。 如有需要,还可以下载中文语言包和你喜欢的配色,这里不多作介绍。 完成插件的安装之后,我们回到WSL,创建一个目录,并在VSCode中打开,使用如下指令: ``` mkdir OI code OI ``` 若提示没有code这条指令,可打开VSCode的指令栏(Ctrl+Shift+P),输入“Remote-WSL: New Window using Distro”,选择Ubuntu,之后点击打开文件夹,选择你创建的OI目录即可。 ![](https://cdn.luogu.com.cn/upload/image_hosting/q6vt9nj8.png) 完成了以上操作以后,你就获得了一个在Windows 10下运行,却有着同Linux一般的开发环境的VSCode! 但是,我们仍然没有结束,因为最重要的功能,调试还没有配置好。 很多同学使用的是Code Runner,但它并不能满足我们的调试需求,在这里我选择使用C/C++插件自带的调试功能。在VSCode的资源管理器下建立目录.vscode,在这个目录下新建两个文件```launch.json```和```tasks.json```。 具体文件可参见我的Github gists。(需要hosts或者**上网查看) [链接](https://gist.github.com/quank123wip/3dc5b138e2d78ec8ed20a55af68d6979) 不能看Github gists的可以看Ubuntu Pastebin。(失效请联系我) [launch.json](https://paste.ubuntu.com/p/k5nRf5BNJj/) [tasks.json](https://paste.ubuntu.com/p/zSvFYKWsvM/) 这是基础的配置文件,你可以根据你自己的口味自定义(例如更改tasks.json中的args来修改编译器参数),这里不多做赘述。 之后你就可以在VSCode的调试菜单里直接调试你的代码了。 另外,推荐几个好用的插件 ### Live Share Live Share是近几年Microsoft推出的又一黑科技,这个插件支持你与其他的VSCode共享编辑器协作任务,甚至能够语音通话,适合大家一起复习算法或者开发项目时使用 ### Bracket Pair Colorizer 这个插件会帮助你的代码变得更加可读,它会配对每一对括号并且使他们变成彩色,让你的~~毒瘤~~代码中的括号关系一目了然 ### indent-rainbow 这个插件同样是一个增加可读性的插件,它会给同样等级的缩进着色 ### Onedark Pro 这是一个编辑器主题,继承自Github的经典编辑器Atom的经典主题Onedark ### Visual Studio IntelliCode 神器!人工智能代码补全,适用于Python/JavaScript/TypeScript/Java/T-SQL,C++的支持在Visual Studio中有,相信以后也会加入VSCode的吧。 ## 后记 近几年来MS给开发者发的糖真的是越来越多...Windows Terminal也很好,或许在它适合小白用户之后我会撰写一篇文章来详细的讲一下它。WSL的性能相比于原生Linux很快,只是fork等上面存在一些小问题,WSL2也解决了,用来写OI真的是再好不过了。关于配置文件,大家可以把自己的OI目录变成一个git仓库publish到Github,方便自己记录下自己OI练习的点点滴滴,自己的复习,还有自己的配置文件,以后要使用只需要git clone就好了。(附上自己的OI仓库[Quank123Wip/Quank123Wip-OI](https://github.com/Quank123Wip/Quank123Wip-OI)) ![可爱的Windows Terminal](https://cdn.luogu.com.cn/upload/image_hosting/lzk21qji.png) 关于WSL2的小问题,这个不需要我多加赘述,但用在OI上基本没有问题了。如果是开发Linux下的项目,也有很多解决方案解决,如[arkane-systems/genie](https://github.com/arkane-systems/genie)已经解决了WSL2下的Systemd问题,之前提到的[yuk7/ArchWSL](https://github.com/yuk7/ArchWSL)也解决了发行版不够丰富的问题。TCP-Socket,硬盘IO等一众在WSL中的毛病,在WSL2中得到了微软的解决,相信不久之后的未来,随着Windows 10 20H1推送,甚至21H1的推送,WSL2将会成为大家开发环境上更加诱人的一个选择。