写出好代码,却不知道从哪里开始?想删除死代码?想在代码库中找出未被使用的变量?想在代码中找出有问题的模式?
你是多元化团队的负责人吗?你的团队中有新来的开发人员吗?你担心他们会写出不符合标准的代码吗?在代码评审时是否花了一整天的时间去检查代码标准,而不是实际的逻辑实现?
我一直在做这样的事情,经常忙得像热锅上的蚂蚁。但从现在开始,我们要保证永远不再担心这类问题。在阅读本文过程中,如果遇到困难,可以参考代码库(https://github.com/adeelibr/react-starter-kit)。
本文更多地是针对 React 应用程序,但同样适用于其他 Web 项目。
1、什么是 Prettier?
Prettier 是一种代码格式化程序,它以特定的方式为你格式化代码。
请看这个 GIF:
2、我们为什么需要 Prettier?
3、如何设置 Prettier?
创建一个叫作 app 的文件夹,进入该文件夹,在命令行中敲入:
复制代码
npm init -y
这将在 app 文件夹中创建一个 package.json 文件。
我将在本文中使用 yarn,但你也可以使用 npm。
安装我们的第一个依赖项:
复制代码
yarn add --dev prettier
这将安装 package.json 中指定的开发依赖项,如下所示:
复制代码
{ "name": "react-boiler-plate", "version": "1.0.0", "description": "A react boiler plate", "main": "src/index.js", "author": "Adeel Imran", "license": "MIT", "scripts": { "prettier": "prettier --write src/**/*.js" }, "devDependencies": { "prettier": "^1.14.3" } }
稍后我会解释“prettier”: “prettier?—?write src/**/*.js”的作用,现在先让我们在 app 文件夹中创建一个 src/ 文件夹。在 src/ 文件夹中,再创建一个名为 index.js 的文件——名字可以随意起。
在 index.js 文件中,按原样粘贴这句话:
复制代码
let person={ name: "Yoda", designation: 'Jedi Master ' }; function trainJedi (jediWarrion) { if (jediWarrion.name==='Yoda') { console.log('No need! already trained'); } console.log(`Training ${jediWarrion.name} complete`) } trainJedi(person) trainJedi({ name: 'Adeel', designation: 'padawan' });
到目前为止,我们有了一个 src/app/index.js 文件,包含了一些难看的代码。
我们可以做三件事:
我打算选择第二项,所以我们安装了一个依赖项,并在 package.json 中声明了 Prettier。
现在在 app 根文件夹中创建一个 prettier.config.js 文件,并在其中添加一些 Prettier 规则:
复制代码
module.exports={ printWidth: 100, singleQuote: true, trailingComma: 'all', bracketSpacing: true, jsxBracketSameLine: false, tabWidth: 2, semi: true, };
printWidth 将确保你的单行代码不会超过 100 个字符。
singleQuote 会将所有双引号转换为单引号。
trailingComma 将确保在最后一个对象属性的末尾会有一个逗号。
bracketSpacing 在对象字面量之间打印空格:
复制代码
If bracketSpacing is true - Example: { foo: bar } If bracketSpacing is false - Example: {foo: bar}
jsxBracketSameLine 将在多行 JSX 元素的最后一行放置 >:
复制代码
// true example <button className="prettier-class" id="prettier-id" onClick={this.handleClick}> Click Here </button> // false example <button className="prettier-class" id="prettier-id" onClick={this.handleClick} > Click Here </button>
tabWidth 指定单个缩进的空格数。
如果 semi 设置为 true,将在语句末尾加上 ;。
现在让我们来说说这个脚本的作用:
复制代码
“prettier”: “prettier — write src/**/*.js”
它的意思是运行 prettier,并让它在 src/ 文件夹中查找所有的.js 文件。–write 标志告诉 prettier 要把格式化好的内容保存到文件中,并找出格式化过程中发现的任何异常。
现在在终端中运行这个脚本:
复制代码
yarn prettier
这是我在运行代码时看到的:
1、什么是代码 linter?
代码 linting 是一种代码静态分析,通常被用于查找不符合某些样式指南的有问题的模式或代码。大多数编程语言都有代码 linting,编译器有时会在编译过程中加入 linting。——来自 ESLint
为什么 JavaScript 需要 linter?
由于 JavaScript 是动态类型的,而且是一种松散类型的语言,因此开发人员在使用这门语言时很容易犯错。因为不经过编译,所以通常需要在执行.js 文件的情况下才能发现语法或其他错误。
像 ESLint 这样的 linting 工具可以帮助开发人员在不执行 JavaScript 代码的情况下发现问题。
2、是什么让 ESLint 如此特别?
ESLint 中的所有东西都是可插拔的,你甚至可以在运行时添加规则。你添加的每个 linting 规则都是独立的,任何一个规则都可以独自打开或关闭。每个规则都可以设置为警告或错误级别。
现在有 2 个流行的风格指南:
我一直在使用 Airbnb 的风格指南。这个风格指南一直有人在维护,在本文中,我将使用受 Airbnb 风格指南启发的规则集。
首先更新 package.json 文件:
复制代码
{ "name": "react-boiler-plate", "version": "1.0.0", "description": "A react boiler plate", "main": "src/index.js", "author": "Adeel Imran", "license": "MIT", "scripts": { "lint": "eslint --debug src/", "lint:write": "eslint --debug src/ --fix", "prettier": "prettier --write src/**/*.js" }, "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "*.(js|jsx)": ["npm run lint:write", "git add"] }, "devDependencies": { "babel-eslint": "^8.2.3", "eslint": "^4.19.1", "eslint-config-airbnb": "^17.0.0", "eslint-config-jest-enzyme": "^6.0.2", "eslint-plugin-babel": "^5.1.0", "eslint-plugin-import": "^2.12.0", "eslint-plugin-jest": "^21.18.0", "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-prettier": "^2.6.0", "eslint-plugin-react": "^7.9.1", "husky": "^1.1.2", "lint-staged": "^7.3.0", "prettier": "^1.14.3" } }
在开始进行配置之前,先让我们来看看每个依赖包的功能。
babel-eslint:这个包让你可以轻松在 Babel 上使用 lint。如果你不使用 ESLint 尚不支持的 Flow 或实验性功能,则不一定需要这个插件。
eslint:这是 lint 代码所需的主要工具。
eslint-config-airbnb:这个包提供了所有 Airbnb 的 ESLint 配置,你可以修改它们。
eslint-plugin-babel:babel-eslint 的插件伴侣。
eslint-plugin-import:这个插件旨在支持 ES2015+(ES6+)的导入 / 导出语法,并防止出现拼写错误的文件路径和导入名称。
eslint-plugin-jsx-a11y:适用于 JSX 元素可访问性规则的 linting 规则。
eslint-plugin-prettier:让 ESLint 与 Prettier 的使用更顺畅。
eslint-plugin-react:特定于 React 的 linting 规则。
eslint-config-jest-enzyme:用于特定于 React 和 Enzyme 的全局变量。这个 lint 配置让 ESLint 知道有哪些全局变量,并且不会针对它们发出警告——有点像断言 it 和 describe。
eslint-plugin-jest:Jest 的 ESLint 插件。
husky:在自动化部分会进行更多介绍。
lint-staged:在自动化部分会进行更多介绍。
现在我们已经有了基本的了解,接下来可以开始了。
在 app/ 根目录创建.eslintrc.js 文件:
复制代码
module.exports={ env: { es6: true, browser: true, node: true, }, extends: ['airbnb', 'plugin:jest/recommended', 'jest-enzyme'], plugins: [ 'babel', 'import', 'jsx-a11y', 'react', 'prettier', ], parser: 'babel-eslint', parserOptions: { ecmaVersion: 6, sourceType: 'module', ecmaFeatures: { jsx: true } }, rules: { 'linebreak-style': 'off', // Don't play nicely with Windows. 'arrow-parens': 'off', // Incompatible with prettier 'object-curly-newline': 'off', // Incompatible with prettier 'no-mixed-operators': 'off', // Incompatible with prettier 'arrow-body-style': 'off', // Not our taste? 'function-paren-newline': 'off', // Incompatible with prettier 'no-plusplus': 'off', 'space-before-function-paren': 0, // Incompatible with prettier 'max-len': ['error', 100, 2, { ignoreUrls: true, }], // airbnb is allowing some edge cases 'no-console': 'error', // airbnb is using warn 'no-alert': 'error', // airbnb is using warn 'no-param-reassign': 'off', // Not our taste? "radix": "off", // parseInt, parseFloat radix turned off. Not my taste. 'react/require-default-props': 'off', // airbnb use error 'react/forbid-prop-types': 'off', // airbnb use error 'react/jsx-filename-extension': ['error', { extensions: ['.js'] }], // airbnb is using .jsx 'prefer-destructuring': 'off', 'react/no-find-dom-node': 'off', // I don't know 'react/no-did-mount-set-state': 'off', 'react/no-unused-prop-types': 'off', // Is still buggy 'react/jsx-one-expression-per-line': 'off', "jsx-a11y/anchor-is-valid": ["error", { "components": ["Link"], "specialLink": ["to"] }], "jsx-a11y/label-has-for": [2, { "required": { "every": ["id"] } }], // for nested label htmlFor error 'prettier/prettier': ['error'], }, };
还要在 app/ 根目录中添加.eslintignore 文件:
复制代码
/.git /.vscode node_modules
我们先介绍一下.eslintrc.js 文件的作用。
先把它拆分一下:
复制代码
module.exports={ env:{}, extends: {}, plugin: {}, parser: {}, parserOptions: {}, rules: {}, };
3、现在介绍一下.eslintignore。
.eslintignore 里包含了我们不希望 ESLint 对它们进行 lint 的路径列表。这里我只指定三个:
接下来让我们来看看 package.json 中新添加的脚本。
复制代码
"lint": "eslint --debug src/" "lint:write": "eslint --debug src/ --fix"
到目前为止,我们设置好了 prettier 和 eslint,但每次我们都要运行脚本。接下来我们让它更加自动化一些。
要在保存代码时进行格式化和 lint,需要使用像 VS Code 这样的编辑器:
安装 ESLint 扩展插件。在此(https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)下载插件或在 VS Code 编辑器中按下 ctrl + shift + x 打开扩展模块,搜索 eslint,将出现一系列插件。安装 Dirk Ba??eumer 开发的那个。安装完成后,点击 reload 按钮重新启动编辑器。
安装好这个插件后,在 app/ 根文件夹中创建一个名为.vscode/ 的文件夹 ——不要忘了那个点号,这个非常重要。
在文件夹中创建一个 settings.json 文件,如下所示:
复制代码
{ "editor.formatOnSave": false, "eslint.autoFixOnSave": true, }
需要注意的是,当你运行 yarn lint:write 时,它也会 lint 和美化你的代码。
试想一下,如果你有 2 万行代码,然后通过手动的方式进行审计和改进,然后再想象一下用一个命令就可以完成所有事情。手动方法可能需要 30 天,而自动方法可能只需要 30 秒。
脚本已经设置好了,每次点击保存时,编辑器都会对特定文件做出神奇的回应。但是,并不是团队中的每个人都会选择使用 VS Code。不过没关系,我们可以更自动化一些。
1、什么是 husky?
husky(https://github.com/typicode/husky)是一个 Git 钩子,你可以在提交代码前或在将代码推送到分支时执行某些特定的操作。
你所要做的就是安装 husky:
复制代码
yarn add --dev husky
然后在 package.json 文件中添加以下内容:
复制代码
"husky": { "hooks": { "pre-commit": "YOUR_COMMAND_HERE", "pre-push": "YOUR_COMMAND_HERE" } },
每次在提交或推送代码时,它都会执行某个脚本或命令——比如运行测试用例或格式化代码。
1、什么是 lint-staged?
lint-staged(https://github.com/okonet/lint-staged)可以在暂存(Git staged)文件上运行 linter,这样就不会将错误的代码推送到分支上。
为什么要用 lint-staged?
在提交代码之前进行 lint 是很有意义的,你可以确保没有错误进入到代码库中,并且可以强制应用代码样式。但在整个项目上运行 lint 过程会很慢,而且有些 lint 结果可能无关紧要。你可能只想对要提交的文件进行 lint。
这个项目提供了一个脚本,这个脚本将执行任意的 shell 任务,并将暂存文件列表作为参数,按指定的通配模式进行文件过滤。
你要做的是安装 lint-staged:
复制代码
yarn add --dev lint-staged
然后在 package.json 文件中添加:
复制代码
"lint-staged": { "*.(js|jsx)": ["npm run lint:write", "git add"] },
这段配置的意思是先运行 lint:write 命令,然后将文件添加到暂存区域。它仅针对.js 和.jsx 文件运行这个命令,但你也可以根据需要针对其他文件运行这个命令。
每次提交代码之前,都会运行一个叫作 lint-staged 的脚本,这个脚本将运行 npm run lint:write 命令,这个将 lint 并格式化你的代码,然后将代码添加到暂存区并提交。
最终的 package.json 文件应如下所示。
复制代码
{ "name": "react-boiler-plate", "version": "1.0.0", "description": "A react boiler plate", "main": "src/index.js", "author": "Adeel Imran", "license": "MIT", "scripts": { "lint": "eslint --debug src/", "lint:write": "eslint --debug src/ --fix", "prettier": "prettier --write src/**/*.js" }, "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "*.(js|jsx)": ["npm run lint:write", "git add"] }, "devDependencies": { "babel-eslint": "^8.2.3", "eslint": "^4.19.1", "eslint-config-airbnb": "^17.0.0", "eslint-config-jest-enzyme": "^6.0.2", "eslint-plugin-babel": "^5.1.0", "eslint-plugin-import": "^2.12.0", "eslint-plugin-jest": "^21.18.0", "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-prettier": "^2.6.0", "eslint-plugin-react": "^7.9.1", "husky": "^1.1.2", "lint-staged": "^7.3.0", "prettier": "^1.14.3" } }
现在,每当你提交代码时:
复制代码
$ git add . $ git commit -m "some descriptive message here"
它将根据.eslintrc.js 文件的所有规则对代码进行 lint 和格式化。有了这个,你就可以确保没有坏代码被推到生产环境中。
首先在 app/ 根文件夹中创建一个.editorconfig 文件,然后在该文件中粘贴以下代码:
复制代码
# EditorConfig is awesome: http://EditorConfig.org # top-most EditorConfig file root=true [*.md] trim_trailing_whitespace=false [*.js] trim_trailing_whitespace=true # Unix-style newlines with a newline ending every file [*] indent_style=space indent_size=2 end_of_line=lf charset=utf-8 insert_final_newline=true max_line_length=100
那么 EditorConfig 是什么东西?
并不是每个人都会使用 VS Code,所以为了让每个人保持统一(例如在制表符空格或换行方面),我们使用.editorconfig,这样有助于强制执行某些规则。
支持 EditorConfig(https://editorconfig.org/)的编辑器包括 Web Storm、App Code、Atom、Eclipse、Emacs、bbedit,等等。
上述的配置将执行以下操作:
英文原文:https://medium.freecodecamp.org/these-tools-will-help-you-write-clean-code-da4b5401f68e
《学习 Dart 的 10 大理由》
《你的前端知识框架,该如何搭建?》
《最新 Go 语言学习路线图》
......
查看文章,点击了解更多
. 代码缩进问题
```java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("xxx");
}
}
```
{}要和对应的语句块开头对齐。
2. 起名不注意规范,例如:HelloWorld helloworld(反例)
一般Java类名/源文件名应该遵循大驼峰命名法/帕斯卡命名法。
> 首字母要大写,如果有多个单词,每个单词的首字母都要大写。
3. 不写作业
- 不找理由,当场现写
- 当场现写,不搭理你
- 没电脑,写不了
- 现在代码都是以背为主,所以在纸上写吧。(好记性不如烂笔头)
## 1. 程序开发步骤
1. 创建一个文本文档,命名为HelloWorld
2. 然后打开文本文档,在其中编写基础语法结构
```java
public class HelloWorld {
public static void main(String[] args) {
}
}
```
3. 在语法结构中编写指令集
```java
System.out.println("xxx");
```
4. 将文本文档的扩展名转换为`.java`(Java的源代码文件的扩展名是java)
5. 利用`javac`将源代码文件编译为字节码(byte code)文件`.class`文件
6. 利用`java`将字节码文件运行起来
**总结步骤:**
1. 编写源代码
2. 编译源代码
3. 运行程序
## 2. 基本结构语法
```java
// 类声明(声明一个类),因为Java中以类为基本单元
// class关键字后修饰的内容,我们称为类名
// 它的名字应该遵循大驼峰命名法,还应该和文件名保持一致(后续说什么时候不需要保持一致)
// public:公共的 class:类别
public class HelloWorld {
// 方法声明(声明一个方法),因为Java中在执行功能时需要以方法为单位
// main方法是一个稍微特别的方法,语法固定,它是Java程序的程序入口(以它为起点来运行)
// static:静态的 void:空、无效的 main:主要的
// main容易写成mian,写错一点就不可以运行了,稍加注意
public static void main(String[] args) {
// 功能指令
System.out.println("xxx");
}
}
```
### 2.1 输出指令
- `System.out.println();` 利用系统输出流实现内容打印及换行操作
- System:系统
- out:输出
- print:打印
- println:打印完内容后换行
- `System.out.print();` 利用系统输出流实现内容打印
> 这些转义符号必须放在字符串中,双引号中。
| 转义符号 | 作用 |
| :------: | :-----------------------------: |
| `\n` | 换行 |
| `\t` | 一个制表位(多个空格,一个Tab) |
```
没用\t的效果
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
....
1*7=7 2*7=14 3*7=21
用了\t之后的效果:(会自动调整一定的空格间隙,表格)
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
....
1*7=7 2*7=14 3*7=21
```
### 2.2 注释
在 Java 的编写过程中我们需要对一些程序进行注释,这样除了自己更方便阅读,别人也更好理解我们的程序,所以我们一定要适时的加一些注释,可以是编程思路或者是程序的作用。
> 前期,对大家写代码的要求,注释量不允许低于代码量的40%。
>
> 你写了10行代码,其中至少应该有4行注释。
>
> 注释有时候是一种捋清楚你思路的手段,在容易出错的代码行上反复添加注释,可以有效降低出错概率。
- `// 单行注释`
- `/* 多行注释 */`
- `/** Java Doc (文档)注释 */`
```java
/*
* 第一个Java程序
* @author Charles
* @date 2021-01-04
*/
public class HelloWorld{ // 类声明
// 程序的入口
public static void main(String[] args) {
// 输出内容
System.out.print("Hello World\n");
System.out.print("Hello World");
}
}
```
> 你也不用担心注释写太多影响你的代码性能,因为在编译过程中,注释就已经被移除了,所以不会影响到你。
> 程序在CMD中运行时,需要注意中文乱码问题。CMD支持GBK编码格式,所以我们可以使用记事本的另存为功能去修改编码为ANSI即可。
## 3. 跨平台原理
Java在当初一经推出,就火起来了!
除了它优秀的性能和简洁的语法之外,还有一个主打的优势:跨平台。(write once,run anywhere,写一次,可以到处运行)
**为什么以前其他语言,C语言等没有实现跨平台呢?**
原因是:编写程序要经过编写源代码、编译源程序、运行程序三个大阶段,其中编译好的源程序是对应于某个平台(某个系统:Windows、Mac、Android...)的专属版本,所以不同平台就需要准备很多份。
但是Java编写的程序编译之后,并非是直接运行在某个平台上,而是运行在JVM(Java虚拟机)上,同样也是由于JVM的原因,跨平台、垃圾回收等功能就可以使用了。
所以你只要准备好适配于不同平台的JVM就可以保证Java程序到处运行了。

> **Java如何实现的跨平台?** [面试题]
>
> Java不同于其他语言,直接将源代码编译为对应平台的机器码(二进制文件)。它是将源代码编译为字节码文件,然后将字节码文件运行在JVM(JVM包含在JRE中)上,由JVM在执行过程中,转换为对应平台的机器码。
>
> 所以只要在对应平台上安装好Java环境,Java程序就可以运行了,这就是Java实现跨平台的原理。
## 4. 反编译
**编译:** 将源文件(.java)转换成字节码文件(.class)的过程称为编译。
**反编译:** 将字节码文件(.class)转换回源文件(.java)的过程称为反编译。(常用有Jad、FrontEnd、jd-gui)
## 5. Eclipse使用
### 5.1 IDE概述
IDE(Integrated Development Environment,集成开发环境),集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。
**在Java开发领域有什么常用IDE:**
- Eclipse:Eclipse基金会的开源产品,在Java领域里可以算得上应用最广的产品。
- MyEclipse:它是基于Eclipse演化出的一个商业产品,更适合于Java EE开发。
- Intellij IDEA:它是JetBrains公司开发的IDE中的一种,非常适合现代化开发,近两年Eclipse的市场被它蚕食的很快。
- VS Code:它是微软开发的一个编辑器,安装相应插件可以实现IDE的效果。
- ....

### 5.2 Eclipse
- workspace 工作空间
- 是用来存放Eclipse中开发的项目的
- 每个工作空间相互独立,配置等方面不受影响
- project 项目/工程
- 在Eclipse的工作空间中,编写Java程序是以项目/工程为组织单元的
- 例如:要开发一个微信,那么就可以创建一个项目 wechat,在该项目中编写大量的代码源文件。
**使用Eclipse开发第一个Java程序步骤:**
切换到Java视图后。
1. 新建Java工程/项目
- File菜单 -> New -> Java Project
- 在导航区域空白处右键 -> New -> Java Project
- **JRE System Library** :JRE的系统库,Java中定义了很多API(功能接口),直接可以使用。
- **src:** source,编写Java源代码
2. 在src下新建Java文件(类class文件)
作者:lucida
链接:http://lucida.me/blog/sublime-text-complete-guide/
本文系统全面的介绍了 Sublime Text,旨在成为最优秀的 Sublime Text 中文教程。
1.2014/09/27:完成初稿
2.2014/09/28:
更正打开控制台的快捷键为 Ctrl + `
更正全局替换的快捷键为 Ctrl + Alt + Enter
3.2016/09/15:作者已全面转向 Visual Studio Code
Sublime Text 是一款跨平台代码编辑器(Code Editor),从最初的 Sublime Text 1.0,到现在的 Sublime Text 3.0,Sublime Text 从一个不知名的编辑器演变到现在几乎是各平台首选的 GUI 编辑器。而这样优秀的编辑器却没有一个靠谱的中文教程,所以我试图通过本文弥补这个缺陷。
从初学编程到现在,我用过的编辑器有 EditPlus、UltraEdit、Notepad++、Vim、TextMate 和 Sublime Text,如果让我从中推荐,我会毫不犹豫的推荐 Vim 和 Sublime Text,原因有下面几点:
1.跨平台:Vim 和 Sublime Text 均为跨平台编辑器(在 Linux、OS X 和 Windows 下均可使用)。作为一个程序员,切换系统是常有的事情,为了减少重复学习,使用一个跨平台的编辑器是很有必要的。
2.可扩展:Vim 和 Sublime Text 都是可扩展的(Extensible),并包含大量实用插件,我们可以通过安装自己领域的插件来成倍提高工作效率。
3.互补:Vim 和 Sublime Text 分别是命令行环境(CLI)和图形界面环境(GUI)下的最佳选择,同时使用两者会大大提高工作效率。
我是一名非常典型的程序员:平时工作主要在 Linux 环境下使用 Java 和 Python,偶尔会用 HTML+CSS+JavaScript 编写网页;业余时会在 Windows 环境编写一些 C# 程序(包括控制台程序(Console Application)和移动应用(Mobile App),也会玩一些非主流语言(比如 Haskell,ML 和 Ruby 等)以拓展见识。
所以这篇文章会我的个人工作内容为主要使用场景(Scenario),尽管无法覆盖到所有的使用场景,但我认为依然可以覆盖到绝大部分,如果您认为我遗漏了什么内容,请在文章下面回复,我会尽量更新。
受益于 K&R C 的写作风格,我倾向于以实际案例来讲解 Sublime Text 的功能,所以本文中的例子均源于我在实际开发时遇到的问题。
此外,把本文会使用大量动画(GIF)演示 Sublime Text 的编辑功能,因为我发现图片难以演示完整的编辑流程(Workflow),而视频又过于重量级。本文的GIF动画均使用 ScreenToGif 进行录制。
我经常看到一些程序员拿编辑器和 IDE 进行比较,诸如 Vim 比 Eclipse 强大或是 Visual Studio 太慢不如 Notepad++ 好使之类的讨论比比皆是,个人认为这些讨论没有意义,因为编辑器和 IDE 根本是面向两种不同使用场景的工具:
1.编辑器面向无语义的纯文本,不涉及领域逻辑,因此速度快体积小,适合编写单独的配置文件和动态语言脚本(Shell、Python 和 Ruby 等)。
2.IDE 面向有语义的代码,会涉及到大量领域逻辑,因此速度偏慢体积庞大,适合编写静态语言项目(Java、C++ 和 C# 等)。
我认为应当使用正确的工具去做有价值的事情,并把效率最大化,所以我会用 Eclipse 编写 Java 项目,用 Vim 编写Shell,用 Sublime Text 编写 JavaScript/HTML/Python,用 Visual Studio 编写C#。
前言到此结束,下面进入正题。
Sublime Text 官方网站 提供了 Sublime Text 各系统各版本的下载,目前Sublime Text 的最新版本是 Sublime Text 3。这里以 Windows 版本的 Sublime Text 安装为例。
注意在安装时勾选 Add to explorer context menu,这样在右键单击文件时就可以直接使用 Sublime Text 打开。
使用 Win + R 运行 sysdm.cpl 打开 “系统属性”。
然后在 “高级” 选项卡里选择 “环境变量”,编辑 “Path”,增加 Sublime Text 的安装目录(例如 D:\Program Files\Sublime Text 3)。
接下来你就可以在命令行里面利用 subl 命令直接使用 Sublime Text 了:
subl file :: 使用 Sublime Text 打开 file 文件
subl folder :: 使用 Sublime Text 打开 folder 文件夹
subl . :: 使用 Sublime Text 当前文件夹
进入 Package Control 的 官网,里面有详细的 安装教程。Package Control 支持 Sublime Text 2 和 3,本文只给出 3 的安装流程:
1.使用 Ctrl + ` 打开 Sublime Text 控制台。
2.将下面的代码粘贴到控制台里:
import urllib.request,os,hashlib; h='7183a2d3e96f11eeadd761d777e62404' + 'e330c659d4bb41d3bdf0
3.等待 Package Control 安装完成。之后使用 Ctrl + Shift + P 打开命令板,输入 PC 应出现 Package Control:
成功安装 Package Control 之后,我们就可以方便的安装使用 Sublime Text 的各种插件:
Sublime Text 是一个收费闭源软件,这在一定程度上成为了我支持 Sublime Text 的理由(我心中的软件靠谱程度:免费开源 << 免费闭源 < 收费开源 < 收费闭源):在 这里 购买。
不过不购买 Sublime Text 也可以 “正常” 使用它,只是 Sublime Text 会时不时的弹出一个对话框提醒你购买,此外窗口处会有一个很屌丝很 low 逼的 (UNREGISTERED)。(在高频操作下,一般 20 分钟提示一次,个人认为算是很厚道了)
也许不少人会觉着 Sublime Text 70 刀的价格太贵,但相比它的功能和带来的效率提升,70 刀真的不值一提,如果你不方便使用 Paypal 付款可以邮件联系我,你支付宝给我打款然后我帮你付款,价格按当日汇率折算(450 元左右)。
Sublime Text 的界面如下:
1.标签(Tab):无需介绍。
2.编辑区(Editing Area):无需介绍。
3.侧栏(Side Bar):包含当前打开的文件以及文件夹视图。
4.缩略图(Minimap):如其名。
5.命令板(Command Palette):Sublime Text 的操作中心,它使得我们基本可以脱离鼠标和菜单栏进行操作。
6.控制台(Console):使用 Ctrl + ` 调出,它既是一个标准的 Python REPL,也可以直接对 Sublime Text 进行配置。
7.状态栏(Status Bar):显示当前行号、当前语言和Tab格式等信息。
与其他 GUI 环境下的编辑器不同,Sublime Text 并没有一个专门的配置界面,与之相反,Sublime Text 使用 JSON 配置文件,例如:
{
"font_size": 12,
"highlight_line": true,
}
会将默认字体大小调整为 12,并高亮当前行。
JSON 配置文件的引入简化了 Sublime Text 的界面,但也使得配置变的复杂,一般我会到 这里 查看可用的 Sublime Text 配置。
Sublime Text 的编辑十分人性化——它不像 Vim 那样反人类(尽管我也用 Vim 但我还是要说 Vim 的快捷键设定绝壁连代谢产物都不如),少量的快捷键就可以完成绝大多数编辑任务。
# 基本编辑(Basic Editing)
↑↓←→ 就是 ↑↓←→,不是 KJHL,(没错我就是在吐槽 Vim,尼玛设成 WSAD 也比这个强啊),粘贴剪切复制均和系统一致。
Ctrl + Enter 在当前行下面新增一行然后跳至该行;Ctrl + Shift + Enter 在当前行上面增加一行并跳至该行。
Ctrl + ←/→ 进行逐词移动,相应的,Ctrl + Shift + ←/→ 进行逐词选择。
Ctrl + ↑/↓ 移动当前显示区域,Ctrl + Shift + ↑/↓ 移动当前行。
Sublime Text 的一大亮点是支持多重选择——同时选择多个区域,然后同时进行编辑。
Ctrl + D 选择当前光标所在的词并高亮该词所有出现的位置,再次 Ctrl + D 选择该词出现的下一个位置,在多重选词的过程中,使用 Ctrl + K 进行跳过,使用 Ctrl + U 进行回退,使用 Esc 退出多重编辑。
多重选词的一大应用场景就是重命名——从而使得代码更加整洁。尽管 Sublime Text 无法像 IDE(例如 Eclipse)那样进行自动重命名,但我们可以通过多重选词+多重编辑进行直观且便捷的重命名:
有时我们需要对一片区域的所有行进行同时编辑,Ctrl + Shift + L 可以将当前选中区域打散,然后进行同时编辑:
有打散自然就有合并,Ctrl + J 可以把当前选中区域合并为一行:
Sublime Text 提供了强大的查找(和替换)功能,为了提供一个清晰的介绍,我将 Sublime Text 的查找功能分为 快速查找、标准查找 和 多文件查找 三种类型。
# 快速查找&替换
多数情况下,我们需要查找文中某个关键字出现的其它位置,这时并不需要重新将该关键字重新输入一遍然后搜索,我们只需要使用 Shift + ←/→ 或 Ctrl + D 选中关键字,然后 F3 跳到其下一个出现位置, Shift + F3 跳到其上一个出现位置,此外还可以用 Alt + F3 选中其出现的所有位置(之后可以进行多重编辑,也就是快速替换)。
另一种常见的使用场景是搜索某个已知但不在当前显示区域的关键字,这时可以使用 Ctrl + F 调出搜索框进行搜索:
以及使用 Ctrl + H 进行替换:
对于普通用户来说,常规的关键字搜索就可以满足其需求:在搜索框输入关键字后 Enter 跳至关键字当前光标的下一个位置, Shift + Enter 跳至上一个位置, Alt + Enter 选中其出现的所有位置(同样的,接下来可以进行快速替换)。
Sublime Text 的查找有不同的模式:Alt + C 切换大小写敏感(Case-sensitive)模式, Alt + W 切换整字匹配(Whole matching)模式,除此之外Sublime Text还支持在选中范围内搜索(Search in selection),这个功能没有对应的快捷键,但可以通过以下配置项自动开启。
"auto_find_in_selection": true
这样之后在选中文本的状态下范围内搜索就会自动开启,配合这个功能,局部重命名(Local Renaming)变的非常方便:
使用 Ctrl + H 进行标准替换,输入替换内容后,使用 Ctrl + Shift + H 替换当前关键字, Ctrl + Alt + Enter 替换所有匹配关键字。
# 正则表达式查找&替换
正则表达式 是非常强大的文本查找&替换工具,Sublime Text中使用 Alt + R 切换正则匹配模式的开启/关闭。Sublime Text的使用Boost里的Perl正则表达式风格。
出于篇幅原因,本文不会对正则表达式进行详细介绍,Mastering Regex(中译本:精通正则表达式)对正则表达式的原理和各语言下的使用进行了详细介绍。此外网上有大量正则表达式的优秀教程(“正则表达式30分钟入门教程” 和 MSDN正则表达式教程.aspx)),以及在线测试工具(regexpal 和 regexer)。
# 多文件搜索&替换
使用 Ctrl + Shift + F 开启多文件搜索&替换(注意此快捷键和搜狗输入法的简繁切换快捷键有冲突):
多文件搜索&替换默认在当前打开的文件和文件夹进行搜索/替换,我们也可以指定文件/文件夹进行搜索/替换。
Sublime Text 提供了强大的跳转功能使得我们可以在不同的文件/方法/函数中无缝切换。就我的使用经验而言,目前还没有哪一款编辑器可以在这个方面超越Sublime Text。
# 跳转到文件
Ctrl + P 会列出当前打开的文件(或者是当前文件夹的文件),输入文件名然后 Enter 跳转至该文件。
需要注意的是,Sublime Text使用模糊字符串匹配(Fuzzy String Matching),这也就意味着你可以通过文件名的前缀、首字母或是某部分进行匹配:例如, EIS 、 Eclip 和 Stupid 都可以匹配 EclipseIsStupid.java 。
尽管是一个文本编辑器,Sublime Text 能够对代码符号进行一定程度的索引。Ctrl + R 会列出当前文件中的符号(例如类名和函数名,但无法深入到变量名),输入符号名称 Enter 即可以跳转到该处。
此外,还可以使用 F12 快速跳转到当前光标所在符号的定义处(Jump to Definition)。
比较有意思的是,对于 Markdown, Ctrl + R 会列出其大纲,非常实用。
Ctrl + G 然后输入行号以跳转到指定行:
# 组合跳转
在 Ctrl + P 匹配到文件后,我们可以进行后续输入以跳转到更精确的位置:
1.@ 符号跳转:输入 @symbol 跳转到 symbol 符号所在的位置
2.# 关键字跳转:输入 #keyword 跳转到 keyword 所在的位置
3.: 行号跳转:输入 :12 跳转到文件的第12行。
所以 Sublime Text 把 Ctrl + P 称之为 “Go To Anything”,这个功能如此好用,以至于我认为没有其它编辑器能够超越它。
从 Sublime Text 的初版(1.0)到现在(3.0 3065),中文输入法(包括日文输入法)都有一个问题:输入框不跟随。
目前官方还没有修复这个 bug,解决方法是安装 IMESupport 插件,之后重启 Sublime Text 问题就解决了。
Sublime Text 支持以文件夹做为单位进行编辑,这在编辑一个文件夹下的代码时尤其有用。在 File 下 Open Folder :
你会发现右边多了一个侧栏,这个侧栏列出了当前打开的文件和文件夹的文件,使用 Ctrl + K, Ctrl + B 显示或隐藏侧栏,使用 Ctrl + P 快速跳转到文件夹里的文件。
Sublime Text 是一个多窗口多标签编辑器:我们既可以开多个Sublime Text窗口,也可以在一个Sublime Text窗口内开多个标签。
使用 Ctrl + Shift + N 创建一个新窗口(该快捷键再次和搜狗输入法快捷键冲突,个人建议禁用所有搜狗输入法快捷键)。
当窗口内没有标签时,使用 Ctrl + W 关闭该窗口。
使用 Ctrl + N 在当前窗口创建一个新标签, Ctrl + W 关闭当前标签, Ctrl + Shift + T 恢复刚刚关闭的标签。
编辑代码时我们经常会开多个窗口,所以分屏很重要。Alt + Shift + 2 进行左右分屏, Alt + Shift + 8 进行上下分屏, Alt + Shift + 5 进行上下左右分屏(即分为四屏)。
分屏之后,使用 Ctrl + 数字键 跳转到指定屏,使用 Ctrl + Shift + 数字键 将当前屏移动到指定屏。例如, Ctrl + 1 会跳转到1屏,而 Ctrl + Shift + 2 会将当前屏移动到2屏。
# 全屏(Full Screen)
Sublime Text 有两种全屏模式:普通全屏和无干扰全屏。
个人强烈建议在开启全屏前关闭菜单栏(Toggle Menu),否则全屏效果会大打折扣。
F11 切换普通全屏:
Shift + F11 切换无干扰全屏:
风格对于任何软件都很重要,对编辑器也是如此,尤其是GUI环境下的编辑器。作为一个程序员,我希望我的编辑器足够简洁且足够个性。
Notepad++ 默认界面
Sublime Text 默认界面
所以在用过 Sublime Text 之后,我立刻就卸掉了 Notepad++。
Sublime Text 自带的风格是我喜欢的深色风格(也可以调成浅色),默认主题是Monokai Bright,这两者的搭配已经很不错了,不过我们还可以做得更好:接下来我将会展示如何通过设置偏好项和添加自定义风格/主题使得 Sublime Text 更加 Stylish。
# 一些设置(Miscellaneous Settings)
下面是我个人使用的设置项。
// 设置Sans-serif(无衬线)等宽字体,以便阅读
"font_face": "YaHei Consolas Hybrid",
"font_size": 12,
// 使光标闪动更加柔和
"caret_style": "phase",
// 高亮当前行
"highlight_line": true,
// 高亮有修改的标签
"highlight_modified_tabs": true,
设置之后的效果如下:
Sublime Text 有大量第三方主题:[https://sublime.wbond.net/browse/labels/theme],这里我给出几个个人感觉不错的主题:
Soda Dark
colorsublime 包含了大量 Sublime Text 配色方案,并支持在线预览,配色方案的安装教程在 这里,恕不赘述。
我个人使用的是 Nexus 主题和 Flatland Dark 配色,配置如下:
"theme": "Nexus.sublime-theme",
"color_scheme": "Packages/Theme - Flatland/Flatland Dark.tmTheme",
# 编码(Coding)
优秀的编辑器使编码变的更加容易,所以 Sublime Text 提供了一系列功能以提高开发效率。
# 良好实践(Good Practices)
良好的代码应该是规范的,所以Google为每一门主流语言都设置了其代码规范(Code Style Guideline)。我自己通过下面的设置使以规范化自己的代码。
// 设置tab的大小为2
"tab_size": 2,
// 使用空格代替tab
"translate_tabs_to_spaces": true,
// 添加行宽标尺
"rulers": [80, 100],
// 显示空白字符
"draw_white_space": "all",
// 保存时自动去除行末空白
"trim_trailing_white_space_on_save": true,
// 保存时自动增加文件末尾换行
"ensure_newline_at_eof_on_save": true,
Sublime Text 支持代码段(Code Snippet),输入代码段名称后 Tab 即可生成代码段。
你可以通过Package Control安装第三方代码段,也可以自己创建代码段,参考这里。
# 格式化(Formatting)
Sublime Text 基本的手动格式化操作包括:Ctrl + [ 向左缩进, Ctrl + ] 向右缩进,此外 Ctrl + Shift + V 可以以当前缩进粘贴代码(非常实用)。
除了手动格式化,我们也可以通过安装插件实现自动缩进和智能对齐:
1.HTMLBeautify:格式化HTML。
2.AutoPEP8:格式化Python代码。
3.Alignment:进行智能对齐。
Sublime Text 支持一定的自动完成,按 Tab 自动补全。
编写代码时会碰到大量的括号,利用 Ctrl + M 可以快速的在起始括号和结尾括号间切换, Ctrl + Shift + M 则可以快速选择括号间的内容,对于缩进型语言(例如Python)则可以使用 Ctrl + Shift + J 。
此外,我使用 BracketHighlighter 插件以高亮显示配对括号以及当前光标所在区域,效果如下:
尽管提供了 Python 控制台,但 Sublime Text 的控制台仅支持单行输入,十分不方便,所以我使用 SublimeREPL 以进行一些编码实验(Experiments)。
尽管我试图在本文包含尽可能多的 Sublime Text 实用技能,但受限于篇幅和我的个人经验,本文仍不免有所遗漏,欢迎在评论里指出本文的错误及遗漏。
下面是一些可能有用但我很少用到的功能:
1.宏(Macro):Sublime Text 支持录制宏,但我在实际工作中并未发现宏有多大用处。
2.其它平台(Other Platforms):本文只介绍了 Windows 平台上 Sublime Text 的使用,不过 Linux 和 OS X 上Sublime Text的使用方式和Windows差别不大,只是在快捷键上有所差异,请参考 Windows/Linux快捷键 和 OS X 快捷键。
3.项目(Projects):Sublime Text支持简单的 项目管理,但我一般只用到文件夹。
4.Vim模式(Vintage):Sublime Text自带 Vim模式。
5.构建(Build):通过配置,Sublime Text可以进行 源码构建。
6.调试(Debug):通过安装 插件,Sublime Text 可以对代码进行调试。
我把本文出现的Sublime Text按其类型整理在这里,以便查阅。
1.↑↓←→:上下左右移动光标,注意不是不是 KJHL !
2.Alt:调出菜单
3.Ctrl + Shift + P:调出命令板(Command Palette)
4.Ctrl + ` :调出控制台
1.Ctrl + Enter:在当前行下面新增一行然后跳至该行
2.Ctrl + Shift + Enter:在当前行上面增加一行并跳至该行
3.Ctrl + ←/→:进行逐词移动
4.Ctrl + Shift + ←/→进行逐词选择
5.Ctrl + ↑/↓移动当前显示区域
6.Ctrl + Shift + ↑/↓移动当前行
1.Ctrl + D:选择当前光标所在的词并高亮该词所有出现的位置,再次 Ctrl + D 选择该词出现的下一个位置,在多重选词的过程中,使用 Ctrl + K 进行跳过,使用 Ctrl + U 进行回退,使用 Esc 退出多重编辑
2.Ctrl + Shift + L:将当前选中区域打散
3.Ctrl + J:把当前选中区域合并为一行
4.Ctrl + M:在起始括号和结尾括号间切换
5.Ctrl + Shift + M:快速选择括号间的内容
6.Ctrl + Shift + J:快速选择同缩进的内容
7.Ctrl + Shift + Space:快速选择当前作用域(Scope)的内容
1.F3:跳至当前关键字下一个位置
2.Shift + F3:跳到当前关键字上一个位置
3.Alt + F3:选中当前关键字出现的所有位置
4.Ctrl + F/H:进行标准查找/替换,之后:
5.Alt + C:切换大小写敏感(Case-sensitive)模式
6.Alt + W:切换整字匹配(Whole matching)模式
7.Alt + R:切换正则匹配(Regex matching)模式
8.Ctrl + Shift + H:替换当前关键字
9.Ctrl + Alt + Enter:替换所有关键字匹配
10.Ctrl + Shift + F:多文件搜索&替换
1.Ctrl + P:跳转到指定文件,输入文件名后可以:
2.@ 符号跳转:输入 @symbol 跳转到 symbol 符号所在的位置
3.# 关键字跳转:输入 #keyword 跳转到 keyword 所在的位置
4.: 行号跳转:输入 :12 跳转到文件的第12行。
5.Ctrl + R:跳转到指定符号
6.Ctrl + G:跳转到指定行号
1.Ctrl + Shift + N:创建一个新窗口
2.Ctrl + N:在当前窗口创建一个新标签
3.Ctrl + W:关闭当前标签,当窗口内没有标签时会关闭该窗口
4.Ctrl + Shift + T:恢复刚刚关闭的标签
1.F11:切换普通全屏
2.Shift + F11:切换无干扰全屏
3.Alt + Shift + 2:进行左右分屏
4.Alt + Shift + 8:进行上下分屏
5.Alt + Shift + 5:进行上下左右分屏
6.分屏之后,使用 Ctrl + 数字键 跳转到指定屏,使用 Ctrl + Shift + 数字键 将当前屏移动到指定屏
Mastering Sublime Text:我读过的唯一一本关于 Sublime Text 的书籍,书中介绍的插件很实用,但对编辑技巧介绍不全。
Instant Sublime Text Starter:另外一本关于 Sublime Text的书,我没有读过。
1.官方文档:http://www.sublimetext.com/docs/3/
2.官方论坛:http://www.sublimetext.com/forum/
3.Stack Overflow 的 Sublime Text 频道:4.http://stackoverflow.com/questions/tagged/sublimetext
5.http://stackoverflow.com/questions/tagged/sublimetext2
6.http://stackoverflow.com/questions/tagged/sublimetext3
7.非官方文档:http://sublime-text-unofficial-documentation.readthedocs.org/ 甚至比官方文档还要全面!
8.Package Control:https://sublime.wbond.net/ 大量的 Sublime Text 插件和主题。
# 视频(Videos)
1.Getting Started with SublimeText:https://www.youtube.com/watch?v=04gKiTiRlq8
2.Sublime Text Pefect Workflow:https://www.youtube.com/watch?v=bpEp0ePIOEM&list=PLuwqxbvf3olpLsnFvo06gbrkcEB5o7K0g
我目前是在职Java开发,如果你现在正在了解Java技术,想要学好Java,渴望成为一名Java开发工程师,在入门学习Java的过程当中缺乏基础的入门视频教程,你可以关注并私信我:01。我这里有一套最新的Java基础JavaSE的精讲视频教程,这套视频教程是我在年初的时候,根据市场技术栈需求录制的,非常的系统完整。
*请认真填写需求信息,我们会在24小时内与您取得联系。