自动补全功能
很鸡肋,经常是自己敲了个首字母等了好久
才跳出来,还不如自己打完。跳转
功能在遇到代码很多
的情况下,也需要等待很久,体验很差,甚至可以去泡杯咖啡。越来越小
,空间越来越不够用了。了解VSCode的人,也许会知道,这玩意是用Electron写的。那么什么是Electron呢。来个官方解释:
Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库。 Electron通过将Chromium和Node.js合并到同一个运行时环境中,并将其打包为Mac,Windows和Linux系统下的应用来实现这一目的。
Electron于2013年作为构建Github上可编程的文本编辑器Atom的框架而被开发出来。这两个项目在2014春季开源。
是不是不好懂。如果你知识栈够深,可能看了就明白了,这东西是Chromium + Node.js。如果你不懂这些也没关系,你可以理解成,这玩意是一个web服务器 + web客户端放一起去了。这样有什么好处呢?这和我们今天要说的秒开有什么关系么?机智的人或许已经猜到了,我们要做的是,将补全和跳转这种耗费CPU和占用硬盘缓存空间的东西都丢到编译服务器上去。我们自己的VSCode只是当做一个浏览器去使用,真正的后台查找,计算,缓存处理都丢给编译服务器做吧。这就是解决这问题的原理。一般在公司环境中,编译服务器都是内网,并且编译服务器速度都很快,所以即便工程很大,秒开也不是问题。
完成这些后,就可以愉快的写代码,享受丝滑的编码体验了。
这里就不做过多展开了,给你一个传送门,你自己wget或者下载都行,随便安装就好了。
在VSCode的扩展(插件市场)中,搜索Remote-SSH,找到上图中的插件,点击安装就行啦。
在编译服务器(高性能服务器中),先用任何一个SSH客户端登陆,然后输入以下命令:
xiaoyanyi@~$cd ~/.ssh/
[email protected]$ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/data1/xiaoyanyi/.ssh/id_rsa): <----这里直接回车
Enter passphrase (empty for no passphrase): <----这里直接回车
Enter same passphrase again: <----这里直接回车
Your identification has been saved in /data1/xiaoyanyi/.ssh/id_rsa.
Your public key has been saved in /data1/xiaoyanyi/.ssh/id_rsa.pub.
The key fingerprint is:
<----这里省略,每个人的都不一样
[email protected]$ls
authorized_keys id_rsa.pub <----这里主要多了id_ras.pub和id_rsa
id_rsa known_hosts
[email protected]$cat id_rsa.pub >> authorized_keys <----这里主要多了id_ras.pub和id_rsa这里是把公钥写入服务器验证列表
然后把id_rsa放到自己本地机器,也就是步骤1中安装了VSCode的那台机器的.ssh文件夹里即可。如果是Windows平台,则.ssh目录一般在C:\Users\{这里是你自己ide}\.ssh
这里打开VSCode,按照下图进行操作。
配置成功后,点击左边SSH TARGET列表里的名字,右边会出来一个文件夹,连他。
**Warnning!!!如果编译服务器和VSCode的官网是联通的,那么这一步其实后台会自动做好,以下都是在无法联通的时候的解决方案。**
如果出问题,会是在最后一步连他的时候报错了。报错是因为编译服务器没办法从VSCode官网拉取资源导致的。那么我们自己来部署吧,也不麻烦。
首先获取一个叫commit id
的东西,需要用SSH客户端连接到编译服务器中,然后输入一下指令:
xiaoyanyi@~$cd .vscode-server/bin/
xiaoyanyi@bin$ls
a0479759d6e9ea56afa657e454193f72aef85bd0 <-----这个就是commit id
在可以访问VSCode官网的地方,手动下载VSCode Server部署包
https://update.code.visualstudio.com/commit:${commit_id}/server-linux-x64/stable
注意${commit_id}
用刚刚ls
的结果代替
将下载好的vscode-server-linux-x64.tar.gz
上传到编译服务器中,路径是 ~/.vscode-server/bin/${commit_id}/
,并在此目录进行解压缩。注意解压后的内容应该直接在 ~/.vscode-server/bin/${commit_id}/
此目录下,而不是再包含一个vscode-server-linux-x64
目录。
在此目录~/.vscode-server/bin/${commit_id}/
下,touch一个 0文件
xiaoyanyi@a0479759d6e9ea56afa657e454193f72aef85bd0$touch 0
这个时候,在进行VSCode连接就能成功了,成功的时候切换到如下页面,会出现这样的样子。
那些跳转,自动补全功能的背后支持其实都是要遍历补全的类和文件,需要查找他们,文件越多就越慢,需要越大的缓存,那么这些事情还是给编译服务器做吧。那么我们来把编译服务器里安装上这些跳转和自动补全插件。
在一切正常的情况下,点了绿色的就直接会安装好,如果不行的话,可以 ctrl + shift + p
,然后输入extensions
找到扩展:从VSIX安装
,然后选择对应的linux版本的VSIX就行了,VSIX可以支持离线下载。
安装完成插件后,还需要一些简单的配置。这里需要额外提醒一点,编译服务器中的配置和本地是独立的,如何修改编译服务器中的配置呢。ctrl + shift + p
,然后输入remote settings
可以打开编译服务器的settings.json
。
这里推荐一个我的配置。
{
"breadcrumbs.enabled": true,
"editor.mouseWheelZoom": true,
"editor.renderWhitespace": "all",
"c-cpp-flylint.flexelint.enable": false,
"c-cpp-flylint.cppcheck.force": true,
"c-cpp-flylint.cppcheck.language": "c++",
"c-cpp-flylint.cppcheck.verbose": true,
"editor.fontSize": 18,
"C_Cpp.updateChannel": "Insiders",
"c-cpp-flylint.cppcheck.platform": "unix64",
"c-cpp-flylint.debug": true,
"c-cpp-flylint.clang.blocks": false,
"c-cpp-flylint.cppcheck.inconclusive": true,
"C_Cpp.default.intelliSenseMode": "linux-gcc-arm",
// "C_Cpp.default.systemIncludePath": [
// "/data1/xiaoyanyi/cross-tool/arm-imx6ul-linux-gnueabihf/arm-imx6ul-linux-gnueabihf/include/c++/5.4.0/**",
// "/data1/xiaoyanyi/cross-tool/arm-at91-linux-gnueabi/arm-at91-linux-gnueabi/include/c++/4.9.2/**",
// "/data1/xiaoyanyi/cross-tool/arm-imx6ul-linux-gnueabihf/arm-imx6ul-linux-gnueabihf/sysroot/usr/include",
// "/data1/xiaoyanyi/cross-tool/arm-at91-linux-gnueabi/arm-at91-linux-gnueabi/sysroot/usr/include",
// ],
"[cpp]": {
"editor.quickSuggestions": true
},
"[c]": {
"editor.quickSuggestions": true
},
"C_Cpp.default.includePath": [
"/data1/xiaoyanyi/cross-tool/arm-imx6ul-linux-gnueabihf/arm-imx6ul-linux-gnueabihf/include/c++/5.4.0/**",
"/data1/xiaoyanyi/cross-tool/arm-at91-linux-gnueabi/arm-at91-linux-gnueabi/include/c++/4.9.2/**",
"/data1/xiaoyanyi/cross-tool/arm-imx6ul-linux-gnueabihf/arm-imx6ul-linux-gnueabihf/sysroot/usr/include",
"/data1/xiaoyanyi/cross-tool/arm-at91-linux-gnueabi/arm-at91-linux-gnueabi/sysroot/usr/include",
"/data1/xiaoyanyi/work/common/**",
"${workspaceFolder}/**",
],
"C_Cpp.default.cppStandard": "c++11",
"C_Cpp.default.cStandard": "c99",
"C_Cpp.intelliSenseEngineFallback": "Enabled",
"C_Cpp.loggingLevel": "Debug",
"explorer.confirmDelete": false,
"workbench.colorTheme": "Monokai",
"python.pythonPath": "/usr/bin/python3",
"window.zoomLevel": 0,
"C_Cpp.commentContinuationPatterns": [
"/**"
],
"markdown-preview-enhanced.revealjsTheme": "black.css",
"markdown-preview-enhanced.automaticallyShowPreviewOfMarkdownBeingEdited": true,
"markdown-preview-enhanced.previewTheme": "solarized-light.css",
"hediet.vscode-drawio.local-storage": "eyIuZHJhd2lvLWNvbmZpZyI6IntcImxhbmd1YWdlXCI6XCJcIixcImN1c3RvbUZvbnRzXCI6W10sXCJsaWJyYXJpZXNcIjpcImdlbmVyYWxcIixcImN1c3RvbUxpYnJhcmllc1wiOltcIkwuc2NyYXRjaHBhZFwiXSxcInBsdWdpbnNcIjpbXSxcInJlY2VudENvbG9yc1wiOltdLFwiZm9ybWF0V2lkdGhcIjpcIjI0MFwiLFwiY3JlYXRlVGFyZ2V0XCI6ZmFsc2UsXCJwYWdlRm9ybWF0XCI6e1wieFwiOjAsXCJ5XCI6MCxcIndpZHRoXCI6ODI3LFwiaGVpZ2h0XCI6MTE2OX0sXCJzZWFyY2hcIjp0cnVlLFwic2hvd1N0YXJ0U2NyZWVuXCI6dHJ1ZSxcImdyaWRDb2xvclwiOlwiI2QwZDBkMFwiLFwiZGFya0dyaWRDb2xvclwiOlwiIzZlNmU2ZVwiLFwiYXV0b3NhdmVcIjp0cnVlLFwicmVzaXplSW1hZ2VzXCI6bnVsbCxcIm9wZW5Db3VudGVyXCI6MCxcInZlcnNpb25cIjoxOCxcInVuaXRcIjoxLFwiaXNSdWxlck9uXCI6ZmFsc2UsXCJ1aVwiOlwiXCJ9In0=",
"remote.SSH.showLoginTerminal": true,
"remote.SSH.remotePlatform": {
"10.1.74.245": "linux"
},
"c-cpp-flylint.clang.enable": false,
"c-cpp-flylint.flawfinder.enable": false,
"c-cpp-flylint.lizard.enable": false,
"eslint.format.enable": true,
"remote.autoForwardPortsSource": "output",
"markdown-preview-enhanced.enableScriptExecution": true,
"markdown-preview-enhanced.codeBlockTheme": "github.css",
"markdown-preview-enhanced.enableHTML5Embed": true,
"markdown-preview-enhanced.HTML5EmbedIsAllowedHttp": true,
"markdown-preview-enhanced.printBackground": true,
"fileheader.customMade": {
"Date": "Do not edit", // 文件创建时间(不变)
"Author": "Adam Xiao",
"LastEditors": "Adam Xiao", // 文件最后编辑者
"LastEditTime": "Do not edit", // 文件最后编辑时间
"FilePath": "Do not edit" // 文件在项目中的相对路径 自动更新
},
"fileheader.cursorMode": {
// 默认字段
"description":"",
"param":"",
"return":""
},
"markdown.preview.typographer": true
}
需要额外强调的一点是, "C_Cpp.default.includePath"
这个路径就是自动跳转和补全的PATH路径,这里设置成我们的交叉编译工具链的源文件路径能确定按照编译工具链的对应源码路径跳转。