我们项目组使用了 protobuf 作为传输协议,其好处不用多说。可是由于 go 默认数字类型是 int,且 go 属于强类型语言,切换类型就成了家常便饭。

一般来说,切换类型的步骤不外乎:

选中数字部分。

加括号。

输入新类型。

时间长了,不免觉得有些复杂。 Goland 是支持自定义后缀代码补全的,只需要合理设置即可。

而 vscode + gopls 没有对后缀代码补全的支持,需要通过扩展支持。 已有的插件 https://github.com/yokoe/vscode-postfix-go 是一个接近的选择,支持 len 这类表达。可惜没有提供 int 相关的支持。

在 issue 提出建议没有收到回应后,我决定在他的基础进行补充,毕竟两种表达相差不多。

Fork

首先将原项目 fork 出来,对作者信息以及许可证进行修改。

npm

vscode 扩展是通过 ts/js 实现的,自然少不了 npm 的使用。在 sudo pacman -S npm 安装好 npm 后,在项目目录使用 sudo npm install 进行安装。虽然不熟悉 npm 但我想这一步和 go install 应该相差无几。

~/code/vscode-postfix-go (master) [05:14:53]

p1gd0g$sudo npm install

> vscode-postfix-go-int@0.0.1 postinstall

> node ./node_modules/vscode/bin/install

Detected VS Code engine version: ^1.12.0

Found minimal version that qualifies engine range: 1.12.0

Fetching vscode.d.ts from: https://raw.githubusercontent.com/Microsoft/vscode/72672be0b7d3eef0784077b880615f91b7ec85aa/src/vs/vscode.d.ts

vscode.d.ts successfully installed!

Code

在项目中很容易就可以找到对应后缀代码补全的代码。

比如 len 的实现:

export class LenTemplate extends BaseExpressionTemplate {

buildCompletionItem (code: string, position: vsc.Position) {

const dotIdx = code.lastIndexOf('.', position.character)

const codeBeforeDot = code.substr(0, dotIdx)

let lastComponent = getLastComponent(codeBeforeDot)

let builder = CompletionItemBuilder

.create('len', lastComponent)

.description(`len(expr)`)

builder.insertText('len(' + lastComponent + ')')

builder.deleteTextBeforeCursor(position, lastComponent.length + 1)

return builder.build()

}

}

和 type 的实现:

export class TypeTemplate extends BaseExpressionTemplate {

constructor (private keyword: string) {

super()

}

buildCompletionItem (code: string, position: vsc.Position) {

return CompletionItemBuilder

.create(this.keyword, code)

.description(`type expr ${this.keyword}`)

.replace(`type {{expr}} ${this.keyword} {\n${getIndentCharacters()}\${0}\n}`, position, true)

.build()

}

}

我们要做的就是将两者结合起来。我想即使是没有接触 js/ts 的同学,只要有一定的基础,不难完成这一目标。 具体的思路不做介绍,结果如下:

export class IntTemplate extends BaseExpressionTemplate {

constructor(private keyword: string) {

super()

}

buildCompletionItem(code: string, position: vsc.Position) {

const dotIdx = code.lastIndexOf('.', position.character)

const codeBeforeDot = code.substr(0, dotIdx)

let lastComponent = getLastComponent(codeBeforeDot)

let builder = CompletionItemBuilder

.create(this.keyword, lastComponent)

.description(this.keyword + '(expr)')

builder.insertText(this.keyword + '(' + lastComponent + ')')

builder.deleteTextBeforeCursor(position, lastComponent.length + 1)

return builder.build()

}

}

Debug

通过 vscode 自带的调试,就可以看到我们想要的结果。

Package & Publish

发布成功后即可在 vscode 扩展上商店中看到我们自己的扩展。

以上内容不限于 go 语言。

php强类型 vscode,VSCode 扩展入门,后缀代码补全的实现相关推荐

  1. vscode插件快餐教程(5) - 代码补全

    vscode插件快餐教程(5) - 代码补全 上节我们介绍了lsp的基本框架和协议的三次握手. 下面我们先学习一个最简单的功能协议:给vscode发送一条通知. LSP窗口消息 在LSP协议中,跟窗口 ...

  2. scala入门之代码补全

    为什么80%的码农都做不了架构师?>>>    在scala的shell命令行中,我们可以使用像Linux那样的代码补全功能.Linux中是使用Tab键补全,scala的shell命 ...

  3. c语言 vscode代码自动补全_借助C/C++ Extension实现VSCode C++代码补全

    在VSCode C/C++ IntelliSense领域,目前有两位实力相当的选手,它们分别是基于微软闭源技术的C/C++ Extension和开源方案clangd.根据我目前体验,它俩的特性可以总结 ...

  4. 【Unity开发】VSCode 代码补全缺失问题的各种修复方法

    [Unity开发]VSCode 代码补全缺失问题的各种修复方法 尝试:VSC的各种配置 尝试:更改配置语言 尝试:更新 VSCode Editor 在 Unity 内 尝试:.Net 安装 没错!我被 ...

  5. html没有代码补全 vscode_借助clangd实现VSCode C++代码补全

    YCM推荐选项 由于C++语言的复杂性,根据语义对C++进行代码补全并非易事.最近浏览YouCompleteMe项目,发现它已经开始向用户推荐使用clangd作为C++ Completer.与libc ...

  6. Vscode配置Vue插件Vetur自动补全和Eslint校验,正在保存“index.vue”: 从 “‘ESLint‘, ‘Vetur‘“ (configure)中获取代码操作

    出现这个问题,主要原因是vetur插件自己升级了,我真服了... 问题描述:一直都是这个提示,然后文件保存不了,然后也无法格式化和代码提示 经过一番调教之后,发现通过降级vetur插件搞定了,降级操作 ...

  7. vscode代码补全一个非常奇怪的问题

    一个node项目,代码补全的建议总是显示的非常慢,比如输入一个for,显示补全的建议可能等待需要2-3秒.使用 ctrl+i 快捷键的话就会显示正在加载中...,也需要等2-3秒才能显示出补全建议 比 ...

  8. unity的vscode代码补全问题

    unity的vscode代码补全问题(安装了插件却无法显示unity的要用到名词) vscode中,这里打了tr却无法显示transform,或者直接就找不到这个词 原因 unity是基于c#语言,但 ...

  9. 图片高亮处理编程_GMT语法高亮-智能提示-代码补全插件

    GMT(Generic Mappint Tools)是地学界应用非常广泛的一款绘图兼数据处理的开源软件.其开发团队也是非常活跃,此软件还在不断的发展和更新中,变得越来越强大.目前已经有164个模块,而 ...

最新文章

  1. TP-GAN 让图像生成再获突破,根据单一侧脸生成正面逼真人脸
  2. 数据库诞生40年,阿里云AWS用技术推动第三次变革
  3. Web Essentials之样式表StyleSheets
  4. 使用sys导出oracle,oracle 让sys用户执行exp导出操作
  5. github page hexo博客gitee_GitHub+hexo快速搭建个人博客
  6. Axure图片不显示
  7. CE修改器基础操作教程
  8. 透彻解读mysql的可重复读、幻读及实现原理
  9. 【Python】PDF转图片
  10. 2022腾讯实习生移动客户端开发一面(IEG)
  11. 【Json】Json校验工具
  12. 数据结构 Hash,哈希冲突,哈希聚集,BloomFilter,分布式一致性hash
  13. miui系统分身测试软件,【MIUI 8评测】手机分身初上手,黑科技值爆表!
  14. 【报告分享】2021百度快消人群洞察-百度营销研究院(附下载)
  15. 【计算智能】模糊控制(一)模糊集合及其基本运算
  16. java中 toast的意思,英语:toast意思
  17. stm32g4 下载算法_手把手教你制作基于IAR、STM32H7的下载算法
  18. b374k php webshell
  19. Pytorch学习(三)Linear层
  20. 大数据对互联网金融的作用和影响(理财篇)

热门文章

  1. Java导出Excel和Word
  2. 密歇根安娜堡大学计算机科学教授,UMich的EECS「密歇根大学安娜堡分校电气工程与计算机科学系」...
  3. excel跑数计算机卡,电脑使用excel很卡甚至死机怎么样解决
  4. NLP Stemming与Lemmatization的区别
  5. Intel IPP密码库 IPPCP 2018——第二部分 对称密码算法开发说明与示例代码
  6. 计算机等级考试 12月,2020年12月计算机等级考试成绩什么时候公布
  7. 国内设计师经常逛的5个素材网站
  8. Android一键清理原理
  9. html5闪光效果,css特效-一道闪光在图片上划过
  10. 微信小程序开发13 云开发:云原生一体化应用开发平台