使用代码片段的正确姿势,打造高效的vscode开发环境

全文3928字,阅读时间 10分钟,未来节约时间 15分钟/每天

代码片段(code snippet) 相信大家都或多或少有接触过。

在完成一个项目以后,往往都会写出许多有价值的代码,或是绞尽脑汁解决的难题,或是灵光一现的小技巧,又或是需要给组里的人分享经验,分享代码。

对于我而言,我有时确实会把足够酷炫或者自豪的项目封装成一个包(例如npm或者是nuget等等),但面对粒度再小一点的一个function甚至是一行代码就不太合适了。

我自己遇到困难的几个场景

  • electron-builder 打包后,为了修改electron国内镜像下载地址,往往会配置vue.config.js。这个地址很长一段时间都不会变,包括这个配置的结构等主要内容其实都不太会变,每次要写的时候都会忘记,在找了好一会之前写的代码后,终于找到了之前的配置文件,复制-粘贴

  • 我的vue项目中会使用vuetify,而vuetify的各种配置都会写在一起,说复杂也不复杂,但我没有记,每次都是用到的时候打开官网然后,复制-粘贴

  • 还有一些其他配置文件,例如 axios,echart,signalr等配置文件,大部分情况下都不需要修改,直接,复制-粘贴

  • ....

为了能够减少以上重复工作,提高效率,我也尝试过不少办法

  • 制作项目模板,使用vue init 来初始化项目

  • 使用 github gist

  • 在vscode 中使用code snippet

但以上的解决方案或多或少有些问题,长期使用感觉不现实

  • 制作项目模板的话,需要挺大的启动决心的,并且投入大,见效慢,如果需要普适项目需要花大力气抽象,而不普适有没有复用价值。去建设去维护一个项目模板是一件需要权衡的事情

  • 使用gist 呢,我一直没有找到使用gist的正确姿势,我可以很开心的写gist,也可以很开心的看,但 我如何使用呢?打开网页,搜索,然后?复制粘贴,但这不又回去了(没有简化太多

  • 使用code snippet 可以参看vscode官方文档如何书写snippets,写起来说复杂也不复杂,但是感觉维护和管理也是一个问题。而且那个body需要多行字符串,导致书写的时候还得转换一次,简单的还好,复杂的肯定不能手写了吧。

直到前几天,我在vscode 插件市场里逛街的时候,发现了一个还不错的gist书写工具 GistPad

GistPad是一个Visual Studio Code扩展,它允许您完全在编辑器中远程编辑GitHub Gist和存储库。您可以打开,创建,删除,分叉和加星号信息库和存储库,然后无缝地开始编辑文件,就好像它们是本地文件一样,而无需克隆,推送或拉取任何内容。就像您自己的开发人员库一样,它用于构建和引用代码段,常用配置/脚本,与编程相关的注释/文档,知识库和交互式示例。

用了几天以后觉得还挺好用的。虽然还没有到我的要求,但 那至少,我写gist方便很多了对吧。

另外,逛街的时候也发现网友和我有相同的问题呢

要是能够又能够轻易的查看管理自己的gist,又能在vscode中快速使用就好了啊。

感觉?也不是不行?

额,好像是可以的哈,其实只需要能够自动将gist自动转换为code-snippets文件就可以了哈


Gist+Snippet=Gisnippet

于是经过我的捣鼓,gist+snippet的转换工具,gisnippet就完成啦。

0. 第一版

在项目制作之初,就决定写npm 全局包而不是vscode 插件。一方面是不带GUI,稍微方便点;另一方面是我偶尔也会用visual studio,所以写个npm包方便在那边用;另外提一句有点坑的是vscode 的snippet和vsstudio中的snippet竟然格式不一样。

这个工具会访问github gist,下载当前代码端的文件,并且按照指定的代码段的格式来修改,最后存储到当前工作区或者是全局代码段文件夹。

项目依赖如下

  • octokit/rest 来作为github gist的api 访问工具。

  • chalk 来让控制台界面漂漂亮亮

  • commander 来让控制台程序接受指令,并提供帮助说明

  • lowdb 来存储必要的信息,例如登录数据

commander-让程序接受指令

利用commander能够很方便的创建交互式控制台程序

command中<>表示必选参数,若用[]则表示必须参数

图中展示了如何用一个函数响应命令行中的命令,并打印出参数


lowdb-爽快的数据持久化

lowdb是一个建立在json文件上的极其简单的数据存储库。

下图展示了如何使用其进行初始化,以及简单的读写操作

一开始需要有一段配置,包括文件设置,以及初始的json文件结构

设置值,同步到文件需要加上write()

读取值,最后需要加上value()

用起来还是非常简单爽快的哈


chalk-让控制台程序也能漂漂亮亮

像这样

就能够让控制台输出红色的文本啦 一般用于警告报错之类的


octokit/rest-js也能访问你的github啦

初始化连接

访问当前用户所有gist

通过id来访问某一条gist


组合以上几个工具,gisnippet 就完成啦,欢迎大家来star

https://github.com/legenself/gisnippet

安装方法

npm install -g gisnippet

使用方法

$ gisnippet -h
# output
Usage: index [options] [command]Options:-v                     output the version number-g, --global           localed your snippets  (default: false)-f, --force            force convert all your gist file to snippets (default: false)-h, --help             display help for commandCommands:login <token>          login with github tokenset <key> <value>      set your vscode snippets settingssetting                get your vscode snippets settingsglobalfolder <folder>  set your vscode snippets foldersync <id>              sync your gists to vscode snippets,if id is empty,mg will sync all your gistsshow                   show your gistshelp [command]         display help for command

首先需要登录你的github,获取一个可以访问gist的token,并登录

gisnippet login <yourtoken>

然后需要配置你的vscode 代码段路径 一般在这个目录下 C:\Users\yourname\AppData\Roaming\Code\User\snippets

gisnippet globalfolder <folder>

使用show命令查看你当前的代码段

gisnippet show

使用sync id 来同步某个代码段

gisnippet sync id [-g]

加上-g 将安装到vscode全局目录,否则将装在当前文件夹

gist格式说明

但是还存在问题

我现在转换的是一条gist中的所有文件。这样就导致转换出来的code-snippet的触发输入只能用文件名来做,但这样很不直观,描述也没地方写,所以我参考 generate-snippet库的格式,利用yaml头来描述一条gist所含有的元数据

一条gist的文件开头应该像这样

标明 触发键,描述,作用文件

这样就解决了配置触发输入,和配置描述的问题

不过为了兼容以前的版本加入了-f --force命令,表示强制转换所有文件为code-snippets

一个完整的示例是这样

---
prefix: lowdb.get
description: lowdb获取数据
scope: javascript,typescript
---
```js
db.get('$1').value()
```

最后就是答应大家的福利啦

为了让大家开发 有关lowdb,commandar,chalk,octokit/rest相关的项目的时候少搜索几次,这里提供了我总结出的项目片段。

利用本文的gisnippet 就能够同步代码段到vscode

octokit fff647ac21cf48dca9e96cd627329ecc 2020-10-19T13:13:42Z
- octokit.gist.md 205
- octokit.gists.md 180
- octokit.init.md 155
chalk deec6aa8df4c04bf28de65fddab145d3 2020-10-19T12:53:32Z
- chalk.blue.md 104
- chalk.red.md 101
- chalk.yellow.md 110
commander 2712af98e1ddffaef49bc8652e4201db 2020-10-19T12:46:00Z
- commandar.action.md 256
lowdb 5e0ecea015b9e23fea08170b7806a05d 2020-10-19T12:45:17Z
- lowdb.get.md 116
- lowdb.init.md 399
- lowdb.set.md 121
npm-cli-app f16a9659296be09ef05e0300c0b9de23 2020-10-19T12:46:01Z
- lowdb.get.md 117
- lowdb.init.md 399
- lowdb.set.md 121
- program.command.md 256
md a9859a37565dc0ff3666f1682af92d1e 2020-10-19T12:43:53Z
- gist-header.md 126

看看安装好的样子

我也能够很轻易的制作自己的代码段,预计将省去我30%百度重复问题的时间,保守估计15分钟起步吧

相信应该也能够节省大家不少时间吧~

如果本文有帮助到您的话,欢迎点个赞,喜欢 鼓励一下我哈哈哈哈哈,那就再好不过了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode周赛6074. 字母在字符串中的百分比

这个简单题也比较狗 上午做的时候一直有个测试点不过 但是题目不给出什么测试点不过 原来是100这个答案 给跪了 一:题目 二:上码 class Solution { public:int percentageLetter(string s, char letter) {if (s.size() 0) return 0;int count 0;for (int i 0; i < s.si…

leetcode周赛6075. 装满石头的背包的最大数量

一:题目 二:上码 class Solution { public:/**思路:求差&#xff0c;将结果放到一个容器当中&#xff0c;然后的话&#xff0c;排序&#xff0c;*/int maximumBags(vector<int>& capacity, vector<int>& rocks, int additionalRocks) {vector<int> …

学完这篇依赖注入,与面试官扯皮就没有问题了。

IOC: Inversion Of Control 控制反转DI: Dependency Injection 依赖注入1.控制反转 Inversion Of Control 的前世今生1.1 IOC理论产生的背景讨论控制反转之前&#xff0c;先看看软件系统提出控制反转的前世今生。一个完整精密的软件系统&#xff0c;组件之间就像齿轮&…

SpringCloud微服之Nacos的学习

1:使用前提 第一步:解压启动Nocos SpringCloudAlibaba 推出了一个名为 Nacos 的注册中心&#xff0c;在国外也有大量的使用。 startup.cmd -m standalone 访问http://localhost:8848/nacos/ 第二步:服务注册 工程目录 在父工程中添加依赖 <dependency><groupI…

前端大佬谈国产开源:VUE 的成功在于社区运营

喜欢就关注我们吧&#xff01;近日&#xff0c;国内首个开源软件基金会 —— 开放原子基金会在深圳国际开源谷举办了 TOC 圆桌论坛。论坛上&#xff0c;基金会 TOC 之一、国内知名前端大佬贺师俊表达了一些有趣的观点&#xff0c;阐述了自己对于国内开源生态的见解。贺师俊认为…

停止精神内耗 每日分享

停止反复犹豫 作家脱不花曾说&#xff1a;“人总是有很多左右为难的事情&#xff0c;如果你在做与不做之间来回纠结&#xff0c;那就停止来回推演&#xff0c;立即去做” 所谓三思而后行 那么如果只停留在三思 那么所有的愿景都将成为遗憾 放弃脑海当中左右不定的想法 扔掉徘…

eShopOnContainers 知多少[12]:Envoy gateways

1. 引言在最新的eShopOnContainers 3.0 中Ocelot 网关被Envoy Proxy 替换。下面就来简要带大家了解下Envoy&#xff0c;并尝试梳理下为什么要使用Envoy替代Ocelot。2. Hello EnvoyENVOY IS AN OPEN SOURCE EDGE AND SERVICE PROXY, DESIGNED FOR CLOUD-NATIVE APPLICATIONS.En…

为啥 Response.Write 后,View就不渲染了?

一&#xff1a;背景 1. 讲故事前几天群里有一位朋友聊到&#xff0c;为什么我在 Action 中执行一句 Response.Write 之后&#xff0c;后续的 View 就不呈现了&#xff0c;如果脑子中没有画面&#xff0c;那就上测试代码&#xff1a;public class HomeController : Controller{p…

3. 无重复字符的最长子串(滑动窗口详解版)

一:题目 二&#xff1a;上码 class Solution {/**分析&#xff1a;1.滑动窗口问题2.何时更改窗口的起点位置当出现重复的时候 需要从重复的字符的下一个字符开始计算*/public int lengthOfLongestSubstring(String s) {if (s.length() < 1) {return s.length();}int slowIn…

121. 买卖股票的最佳时机

一:题目 二:上码 class Solution {// public int maxProfit(int[] prices) {// int max 0;// for (int i 0; i < prices.length; i) {// //求出i后面的最大值// int temp 0;// for (int j i 1; j < prices.length; j) {// …

IdentityServer4系列 | 快速搭建简易项目

一 、前言从上一篇关于 常见术语说明中&#xff0c;主要是对「IdentityServer4」的说明&#xff0c;以及其中涉及常见的术语的表述说明&#xff0c;包括对身份认证服务器、用户、客户端、资源以及各个令牌等进行对比区别说明。而在这一篇中&#xff0c;我们将尝试通过简单的方式…

136. 只出现一次的数字(hot100)

一:题目 二:上码 class Solution {public int singleNumber(int[] nums) {int ans -100;Arrays.sort(nums);for (int i 0; i < nums.length-1; i2) {if (nums[i] ! nums [i1]) {ans nums[i];break;}}return ans -100 ? nums[nums.length-1] : ans;} }

高并发项目Java是标配?.NET Core要将它拉下“神坛”!

电商的秒杀和抢购&#xff0c;对我们来说&#xff0c;都不是一个陌生的东西。然而&#xff0c;从技术的角度来说&#xff0c;这对于Web系统是一个巨大的考验。当一个Web系统&#xff0c;在一秒钟内收到数以万计甚至更多请求时&#xff0c;系统的优化和稳定至关重要。缓存技术是…

141. 环形链表(hot100)

一:题目 二:上码 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {public boolean hasCycle(ListNode head) {ListNode fa…

程序员修神之路--分布式系统使用网关到底是好还是坏?

“灵魂拷问分布式系统需要统一的网关吗&#xff1f;网关会带来哪些优势&#xff1f;引入网关会带来灾难吗&#xff1f;分布式系统的设计大体上分为中心化和非中心化&#xff0c;像现在流行的微服务模式&#xff0c;本质上是把各种业务拆分为独立的进程来实现业务的扩展性。伴随…

160. 相交链表(hot100)

一:题目 二:上码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListN…

.NET Core开源任务调度平台ScheduleMaster上新了

ScheduleMaster上一次比较大的更新还是在6月份&#xff0c;转眼已经快过去4个月了&#xff0c;这段时间比较忙&#xff0c;中间只更新过一次修复了几个小bug。要总结这次更新的话&#xff0c;必须要用“千呼万唤始出来”了&#xff0c;因为这次不仅经历的时间比较久&#xff0c…

234. 回文链表(hot100)

一:题目 二:上码 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ …

T-SQL | 逻辑查询处理内幕学习

【T-SQL】| 作者 / Edison Zhou这是EdisonTalk的第296篇学习分享T-SQL是ANSI和ISO SQL标准的MS SQL扩展&#xff0c;其正式名称为Transact-SQL&#xff0c;但一般程序员都称其为T-SQL。本文是我学习《T-SQL查询》一书的读书笔记&#xff0c;为你讲解逻辑查询的内幕。1逻辑查询处…

461. 汉明距离(详解)

一:题目 二:上码 class Solution {/**在信息论中&#xff0c;两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数换句话说就是将字符串转换成另一个字符串需要替换的字符的个数*/public int hammingDistance(int x, int y) {int count 0;if (x y) return 0;…