VSCode加速自动补全和跳转语句,实现秒补全和秒跳转

1 你是否有如下问题,如果遇到过如下困难,可以参考一下本文章

  1. 觉得VSCode的自动补全功能很鸡肋,经常是自己敲了个首字母等了好久才跳出来,还不如自己打完。
  2. 觉得VSCode的跳转功能在遇到代码很多的情况下,也需要等待很久,体验很差,甚至可以去泡杯咖啡
  3. VSCode用久了后,觉得自己的C盘空间越来越小,空间越来越不够用了。

如果以上问题你都感同身受,那么如果你符合以下一个条件,那么就能实现秒跳和秒补全

  1. 你是否有一个编译服务器或者性能高的服务器/电脑,如果有,那么恭喜你。如果没有,有兴趣的话可以继续看下去。也许你公司/部门以后会购置编译服务器,亦或你是个人开发者,后续会买个好一些性能的VPS。

2 讲方法之前说一下原理,后续会更容易理解

了解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只是当做一个浏览器去使用,真正的后台查找,计算,缓存处理都丢给编译服务器做吧。这就是解决这问题的原理。一般在公司环境中,编译服务器都是内网,并且编译服务器速度都很快,所以即便工程很大,秒开也不是问题。

3 那么我们应该需要做什么

我们需要完成的东西

  1. WIndows版本/Mac版本的VSCode,用做人机交互。
  2. VSCode 插件市场里的,Remote - SSH,可以发现制作方是Microsof自己。
  3. 需要会设置SSH免密登陆,不然每次连接都要输入SSH密码体验好差。
  4. 需要在编译服务器中安装Linux版本的VSCode Server插件,这个东西的作用是真的帮忙我们去建立磁盘跳转缓存,分析代码自动补全,以及各种查找和后台工作,可以理解成脏活累活都是VSCode Server这个东西在做。
  5. 合理的设置一些插件机一些配置。

完成这些后,就可以愉快的写代码,享受丝滑的编码体验了。

4 让我们来一步一步干吧

1. WIndows版本/Mac版本的VSCode

这里就不做过多展开了,给你一个传送门,你自己wget或者下载都行,随便安装就好了。

2. VSCode 插件市场里的,Remote - SSH

VSCode加速自动补全和跳转语句,实现秒补全和秒跳转_第1张图片
在VSCode的扩展(插件市场)中,搜索Remote-SSH,找到上图中的插件,点击安装就行啦。

3. 需要会设置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里配置

这里打开VSCode,按照下图进行操作。

VSCode加速自动补全和跳转语句,实现秒补全和秒跳转_第2张图片
下图,选第一个就好,一般都是用第一个的

VSCode加速自动补全和跳转语句,实现秒补全和秒跳转_第3张图片
VSCode加速自动补全和跳转语句,实现秒补全和秒跳转_第4张图片
配置成功后,点击左边SSH TARGET列表里的名字,右边会出来一个文件夹,连他。

4. 如果编译服务器和VSCode的官网不通,则无法进行VSCode Server的自动部署,那么这么做吧

**Warnning!!!如果编译服务器和VSCode的官网是联通的,那么这一步其实后台会自动做好,以下都是在无法联通的时候的解决方案。**

如果出问题,会是在最后一步连他的时候报错了。报错是因为编译服务器没办法从VSCode官网拉取资源导致的。那么我们自己来部署吧,也不麻烦。

  1. 首先获取一个叫commit id的东西,需要用SSH客户端连接到编译服务器中,然后输入一下指令:

    xiaoyanyi@~$cd .vscode-server/bin/
    xiaoyanyi@bin$ls
    a0479759d6e9ea56afa657e454193f72aef85bd0     <-----这个就是commit id
    
  2. 在可以访问VSCode官网的地方,手动下载VSCode Server部署包

    https://update.code.visualstudio.com/commit:${commit_id}/server-linux-x64/stable

    注意${commit_id}用刚刚ls的结果代替

  3. 将下载好的vscode-server-linux-x64.tar.gz上传到编译服务器中,路径是 ~/.vscode-server/bin/${commit_id}/ ,并在此目录进行解压缩。注意解压后的内容应该直接在 ~/.vscode-server/bin/${commit_id}/ 此目录下,而不是再包含一个vscode-server-linux-x64目录。

  4. 在此目录~/.vscode-server/bin/${commit_id}/ 下,touch一个 0文件

    xiaoyanyi@a0479759d6e9ea56afa657e454193f72aef85bd0$touch 0
    

这个时候,在进行VSCode连接就能成功了,成功的时候切换到如下页面,会出现这样的样子。

VSCode加速自动补全和跳转语句,实现秒补全和秒跳转_第5张图片

5. 给编译服务器安装各种插件吧

那些跳转,自动补全功能的背后支持其实都是要遍历补全的类和文件,需要查找他们,文件越多就越慢,需要越大的缓存,那么这些事情还是给编译服务器做吧。那么我们来把编译服务器里安装上这些跳转和自动补全插件。

VSCode加速自动补全和跳转语句,实现秒补全和秒跳转_第6张图片

在一切正常的情况下,点了绿色的就直接会安装好,如果不行的话,可以 ctrl + shift + p,然后输入extensions找到扩展:从VSIX安装,然后选择对应的linux版本的VSIX就行了,VSIX可以支持离线下载。

VSCode加速自动补全和跳转语句,实现秒补全和秒跳转_第7张图片
安装完成插件后,还需要一些简单的配置。这里需要额外提醒一点,编译服务器中的配置和本地是独立的,如何修改编译服务器中的配置呢。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路径,这里设置成我们的交叉编译工具链的源文件路径能确定按照编译工具链的对应源码路径跳转。

5 这里推荐一些好用的C++插件

  1. C/C++,这个写C++都要用的。
  2. C/C++ Adavanced Lint,这个静态检查,看看代码有什么缺陷,有人说过时了,但是装上去有些问题其实是个提示。
  3. C++ Intellisense,这个也是补全相关的。
  4. CTags Support,这个是跳转相关的。
  5. Chinses Language Pack,不用苦苦看英文了。
  6. SVN,这个插件装了后,SVN自动在VSCode上显示了,也可以自动update,很方便了。
  7. Bracket Pair Colorizer,括号彩色标注,再也不用苦苦区分到底是否少括号了。
  8. Draw.io Integration,用VsCode画矢量流程图和简易图利器。
  9. Markdown Preview Enhanced,用VsCode写MarkDown附带实时预览和导出功能。

你可能感兴趣的:(linux,嵌入式,VSCode,c++,ide)