惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
P
Palo Alto Networks Blog
C
Cisco Blogs
The Hacker News
The Hacker News
T
Threatpost
S
Schneier on Security
K
Kaspersky official blog
Spread Privacy
Spread Privacy
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
NISL@THU
NISL@THU
量子位
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Google DeepMind News
Google DeepMind News
Security Latest
Security Latest
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
博客园 - 叶小钗
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
News and Events Feed by Topic
爱范儿
爱范儿
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
Project Zero
Project Zero
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Cisco Talos Blog
Cisco Talos Blog
GbyAI
GbyAI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Apple Machine Learning Research
Apple Machine Learning Research
T
Tenable Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
Vulnerabilities – Threatpost
Forbes - Security
Forbes - Security
博客园 - 三生石上(FineUI控件)
C
Cyber Attacks, Cyber Crime and Cyber Security
N
News and Events Feed by Topic
V
V2EX
Webroot Blog
Webroot Blog
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Blog — PlanetScale
Blog — PlanetScale
M
MIT News - Artificial intelligence
Scott Helme
Scott Helme
Simon Willison's Weblog
Simon Willison's Weblog
L
LangChain Blog
W
WeLiveSecurity
Cloudbric
Cloudbric

ZDDHUB

PixelsMeasure 开发第二年总结 PixelsMeasure 开发一年总结 Swift/SwiftUI 踩坑记 为什么说 GPT 利好程序员 ChatGPT 编程实现 Web 数字水印 Web 数字水印探究 Micro Frontends for Mobile URL 加载系统(URL Loading System) Protocol Buffers GraphQL 从 0 到 1 开发一款 IOS 应用 - Swift MV* 软件设计架构 不停机数据库迁移 Rspec 如何 mock update 方法更新自己? Rails 使用 mysql2 出现的段错误 使用 Docker-compose 部署 Rails 应用到生产环境 Cocoa troubleshooting 独孤九剑 Dit (0x05) - 终端篇 Gem-based Jekyll theme 开发小记 Miscellaneous 前端手记 TodoMVC 之 Redux 篇 前端手记 TodoMVC 之 Server 篇 前端手记 TodoMVC 之 React 篇 前端手记 TodoMVC 之 CSS 篇 独孤九剑 Dit (0x04) - 测试篇 独孤九剑 Dit (0x03) - 缓存篇 英语小抄 LLDB debug Golang Make mistakes 大牛俱乐部上线啦 独孤九剑 Dit (0x02) - 数据结构篇 独孤九剑 Dit (0x01) - 总决 独孤九剑 Dit (0x00) - 我为什么要做 Dit 零值强制类型转换的使用 终端颜色输出重定向 Go语法简略 - 正则表达式 Makefile Go语法简略 - Duck框架探索 Go语法简略 - 依赖注入 Go语法简略 - web应用框架 Go语法简略 - 反射 Go语法简略 - 面向对象 Go语法简略 - goroutine Go语法简略 - 方法和接口 Go语法简略 - 基础篇 大牛 轻松科研 未来这几年 为 Android Studio 创建图标 Shell Git Vim 金庸答百问 论拖延症 Flex, A fast scanner generator 有理想的人 从虚拟到现实 常用视频转接口 Recognizer configuration on CentOS 整个世界清静了 《Python源码剖析》读书笔记
学习一个新技巧需要多久?
zddhub · 2020-07-12 · via ZDDHUB

学习一个新技巧需要多久?

还记得最近学会的新技巧,一共花了多久吗?这里记录了我学习 VS Code 设置语言命令(Change language mode)的路线图,总共花了 5 个小时。

背景

在大公司待过的人一定非常能理解,跟日志打交道的时间远远大于写代码的时间。很长的一段时间里,我都是在 Jira 和 log 里度过的。因为经常要从日志里复制出一段 json,通过它来找到程序的 bug。但不便利的是,日志里的 json 是没有格式化的,如果想格式化(我用 VS Code),必须做以下几步:

痛苦的步骤:
新建一个标签 -> 复制内容到新标签 -> 保存为 .json 文件 -> 格式化 -> 用完后删除刚保存的文件

通常来说,拿到一段 log,格式化后看上几个关键字段,接着就不用了。按上面的流程,总是要保存文件,并且几分钟后又要删除它(尤其对我这种强迫症患者),很难受。

需要解决的问题

为什么要保存立马要删除的文件呢?我理想的流程应该像下面这样子:

理想的步骤:
新建一个标签 -> 复制内容到新标签 -> 格式化 -> 用完后关闭标签

首先不保存文件,其次,关闭标签比删除文件更轻量。那么,我们要解决的问题是,VS Code 如何在不保存文件的情况下,格式化代码呢?

现实很骨感

VS Code 的人应该都知道,新建标签在没有保存时,会有个默认名,叫做 Untitled-1(或者Untitled-n), 它是一个文本文件(plaintext)。如果你在这个时候运行 Format Document, VS Code 会非常温馨地提示你 There is no formatter for 'plaintext' files installed., 希望你安装插件。

Format-Untitled-File

解决方案

  • 寻找插件

按照 VS Code 的提示,最便捷的方案就是寻找并安装插件了。如果已经有人遇到了相同的痛点并且解决了, 那就找到它,然后安装。

一番寻觅,也安装了若干插件,结果都没能解决我的问题。我想,没有人会有像我这么变态的需求。

  • 开发一款自己的插件

静默了一周之后,我终于忍不了了。像这种问题,如果你没觉得它是个问题,完全可以创建一个 json 文件,专门用来格式化 json,如果一但觉得是个问题,在使用时就会一遍遍的抗拒,直到非解决不可为止。

自己开发一个格式化的插件有技术含量吗?VS Code 已经有强大的 Format Document 了,按照它运行的流程可以想见,Format Document 先通过文件后缀名判断语言,然后根据特定语言进行格式化操作。那么我们要做的只是把判断语言的操作给替换掉就可以了。VS Code 是开源的,格式化的代码应该也能找见。我理想的命令是这样的 Format JSON 格式化 json,Format JavaScript 格式化 JavaScript, …。难度不大,但有用。说干就干。

因为是第一次开发 VS Code 插件,照着官网先来了个 Hello World,大概学了一下 VS Code 的基本概念和目录结构,大概花了二十分钟

学完 Hello World,命令和架子都打好了,现在需要的就是填入格式化代码了,搜了一下 VS Code 源码,看了 FormatDocumentAction 的实现,确实有些复杂,直接调用的可能性不大,如果复制一份到插件里,VS Code 的更新不能及时同步到插件,头大。

在 FormatDocumentAction 里最大的发现就是它的 id editor.action.formatDocument, 如果能直接用它调 Format Document 是再好不过了,搜了一下 API 文档,还真的找到了一个命令 vscode.commands.executeCommand,写到 Hello World 里试了一把,还真可以。这一过程大概花了半个小时

现在的问题是如何把语言的信息告诉 VS Code,又继续搜了一下 API,找到了一个只读属性,languageId, 文档是这样描述的 The identifier of the language associated with this document。赶紧试了一下,Untitled 文件输出的 languageId=plaintext, JSON 文件的 languageId=json。是它,真的是它。一分钟后我就找到了设置它的方法 setTextDocumentLanguage。到此为止,我的七巧板凑齐了。这个过程大概花了十分钟

接下来就简单了,把七巧板组装一下,一个私人定制的 VS Code 插件就出来了。源码在这里,有兴趣的同学可以去看看。为了能在公司的电脑上使用,我当然是选择发布在 Marketplace 上了,可以去下载,或者在插件里搜索 format-code 找到它。发布的过程很顺滑,官方文档写的真是相当好呀。

其实可以支持更多的语言,但是懒人如我,只支持了自己常用的几种,在命令面板输入 Format JSON 就可以格式化 JSON 文件了。

Format-Code

至此,我的问题解决了,整个人都舒服多了。

  • 遇到新命令

从写代码到发布,大概用了一个小时,之后完善了一下 Readme,又读了读文档,发现有一篇文章写的很不错,名字叫 Creating a Formatter Extension,里面讲到一些开发 Format 类插件的最佳实践,其中最重要的一条就是,使用 Format DocumentFormat Selection 这样通用的命令,尤其应该避免使用像 Format Foo File. 这种名字,我就是个反例呀。

如果不用 Format JSON 的话,我的插件应该只设置 languageId,然后再调用 Format Document 格式化代码。等等,难道 VS Code 不能自己设置语言?

what-the-fuck

靠,还真有呀!!!

Change language mode

喜人的名字加上好看的 language list。

写在最后

比较一下两种方案:

  • 使用插件:CMD+SHIFT+P -> 输入 Format JSON -> 格式化完成
  • 使用原生命令: CMD+SHIFT+P -> Change language mode -> 输入JSON选择语言 -> 输入 Format Document -> 格式化完成

流程上,插件还是短了一截的,我是一定会用的,你呢?

学习这个技巧花费的时间:实现 2.5 小时 + 2.5 小时写这篇文章。

如果你喜欢这篇文章,欢迎赞赏作者以示鼓励