寫出好代碼,卻不知道從哪里開始?想刪除死代碼?想在代碼庫中找出未被使用的變量?想在代碼中找出有問題的模式?
你是多元化團隊的負責人嗎?你的團隊中有新來的開發人員嗎?你擔心他們會寫出不符合標準的代碼嗎?在代碼評審時是否花了一整天的時間去檢查代碼標準,而不是實際的邏輯實現?
我一直在做這樣的事情,經常忙得像熱鍋上的螞蟻。但從現在開始,我們要保證永遠不再擔心這類問題。在閱讀本文過程中,如果遇到困難,可以參考代碼庫(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小時內與您取得聯系。