天下開發苦 Windows 久矣
Windows 的 cmd 黑窗口,性能拉胯,樣式奇醜,還有編碼問題,狗都不用。雖然現在有了 Windows Terminal,但是沒有 bash,開發體驗還是跟不上。用 WSL2 吧,但是跨檔案系統通訊性能也很拉胯,Oh My Posh?No!PowerShell 又長又臭,沒有 bash 靈活優雅,難道沒有更好的選擇?
非也!今天我們來一步一步把 Windows 終端大改造,從狗都嫌的辣雞改造成愛不釋手的效率工具,我們透過 Windows Terminal + cmder + Starship,從性能、shell、美化三個角度來全面升級體驗。教程比較長,但是請耐心跟著做,最終的結果絕對值得!
Win11 自帶 Windows Terminal,無需單獨安裝,但是有些低版本的 Win10 可能沒有,需要更新系統,或者到 Microsoft Store 安裝。
cmder 是一款為 Windows 打造的增強型命令列工具,可以把它理解為 Windows 自帶 cmd 的「專業美化加強版」。它的開發初衷,就是因為在 Windows 上缺少一款介面漂亮又好用的終端模擬器。
它本質上是一個軟體包,將幾款強大的工具整合在了一起:
ConEmu:提供多分頁、分割窗格、透明背景等豐富的介面功能。
Clink:為 cmd 帶來 bash 風格的命令自動補全、歷史記錄搜尋等增強特性。
Git for Windows(完整版):讓你在 Windows 下也能直接使用 grep、ls、ssh 等大量的 Linux/Unix 命令。
這裡我們並不是要直接使用 cmder,而是將 cmder 作為核心,套在 Windows Terminal 上使用,因為 cmder 的渲染性能遠比不上 Windows Terminal,而且有不少 bug
打開 Windows Terminal,打開設定,然後新增一個新設定,也可以打開 JSON 檔案來配置,以下是我的個人配置,可參考。字體用的是 Maple Mono Normal NL NF CN,不過要注意 cmder 的配置路徑 "cmd.exe /k \"C:\\cmder\\vendor\\init.bat\"",因為我是把 cmder 的目錄放在 C 槽,這個你可以按照你實際的路徑來修改。但是建議最好不要放 C 槽,因為會遇到一些權限問題,會導致歷史記錄讀取失敗。
json 代碼解讀複製代碼{
"$help": "https://aka.ms/terminal-documentation",
"$schema": "https://aka.ms/terminal-profiles-schema",
"actions": [
{
"command": {
"action": "copy",
"singleLine": false
},
"id": "User.copy.644BA8F2"
},
{
"command": {
"action": "globalSummon"
},
"id": "User.globalSummon.51A3D78C"
},
{
"command": {
"action": "quakeMode"
},
"id": "User.quakeMode.F1E129A4"
},
{
"command": "paste",
"id": "User.paste"
},
{
"command": "duplicateTab",
"id": "User.duplicateTab"
},
{
"command": "find",
"id": "User.find"
},
{
"command": {
"action": "splitPane",
"split": "auto",
"splitMode": "duplicate"
},
"id": "User.splitPane.A6751878"
}
],
"alwaysShowTabs": true,
"copyFormatting": "none",
"copyOnSelect": true,
"defaultProfile": "{f15b60f6-b700-472a-8b2f-d79c7bd4b9a5}",
"disabledProfileSources": [
"Windows.Terminal.Azure"
],
"firstWindowPreference": "defaultProfile",
"keybindings": [
{
"id": "User.copy.644BA8F2",
"keys": "ctrl+c"
},
{
"id": "User.duplicateTab",
"keys": "ctrl+shift+d"
},
{
"id": "User.paste",
"keys": "ctrl+v"
},
{
"id": "User.globalSummon.51A3D78C",
"keys": "alt+s"
},
{
"id": "User.splitPane.A6751878",
"keys": "alt+shift+d"
},
{
"id": "User.quakeMode.F1E129A4",
"keys": "alt+f2"
},
{
"id": "User.find",
"keys": "ctrl+f"
},
{
"id": null,
"keys": "alt+enter"
}
],
"newTabMenu": [
{
"type": "remainingProfiles"
}
],
"profiles": {
"defaults": {
"antialiasingMode": "grayscale",
"colorScheme": "Dark+",
"font": {
"face": "Cascadia Code"
},
"opacity": 79
},
"list": [
{
"adjustIndistinguishableColors": "indexed",
"antialiasingMode": "cleartype",
"colorScheme": "Dark+",
"commandline": "cmd.exe /k \"C:\\cmder\\vendor\\init.bat\"",
"elevate": false,
"experimental.rainbowSuggestions": true,
"font": {
"cellHeight": "1.4",
"face": "Maple Mono Normal NL NF CN",
"size": 12,
"weight": "semi-light"
},
"guid": "{f15b60f6-b700-472a-8b2f-d79c7bd4b9a5}",
"historySize": 9001,
"icon": "C:\\cmder\\icons\\cmder_green.ico",
"name": "Terminal",
"opacity": 73,
"padding": "6",
"snapOnInput": true,
"startingDirectory": "%USERPROFILE%",
"useAcrylic": true
},
{
"commandline": "%SystemRoot%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
"font": {
"face": "Maple Mono Normal NL NF CN"
},
"guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
"hidden": true,
"name": "Windows PowerShell",
"opacity": 73
},
{
"colorScheme": "Dark+",
"font": {
"face": "Maple Mono Normal NL NF CN"
},
"guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
"hidden": false,
"name": "PowerShell",
"opacity": 74,
"source": "Windows.Terminal.PowershellCore",
"useAcrylic": true
}
]
},
"rendering.graphicsAPI": "direct3d11",
"schemes": [],
"showTabsInTitlebar": true,
"theme": "dark",
"themes": [],
"useAcrylicInTabRow": true,
"windowingBehavior": "useAnyExisting"
}
當然配置好了之後,也希望在 VS Code 終端中使用我們的 cmder,那麼就可以在 settings.json 中加入:
json 代碼解讀複製代碼{
"terminal.integrated.profiles.windows": {
"Cmder": {
"overrideName": true,
"path": [
"${env:windir}\\Sysnative\\cmd.exe",
"${env:windir}\\System32\\cmd.exe"
],
"args": [
"/k",
"C:\\cmder\\vendor\\init.bat"
],
"icon": "terminal-cmd"
}
},
"terminal.integrated.defaultProfile.windows": "Cmder",
"terminal.integrated.copyOnSelection": true,
"terminal.integrated.fontFamily": "Maple Mono Normal NL NF CN",
}
}
Maple Mono Normal NL NF CN 是一款國人開發的、對中英文都有優秀支援的程式設計字體,Maple Mono Normal NL NF CN 中的 NF 是指嵌入 Nerd Font 的版本,安裝這個字體作為終端字體,為終端顯示圖示做準備。我們常常看到 macOS 的終端,會有很多 emoji 字體,會顯得生動形象好看,改善枯燥無聊的編譯執行體驗,Windows 總是顯示醜醜的 ? 號和亂碼字元,讓人很是惱火。有了這個字體,將完全和 macOS 終端拉平體驗。
Starship 是一款使用 Rust 編寫的高效能終端美化工具,支援 Linux、Windows、macOS,是 Windows 上拉平 macOS 終端體驗的關鍵。
powershell 代碼解讀複製代碼winget install --id Starship.Starship
因為我們使用的是 cmder,所以我們需要在 cmder/config 目錄中新增一個 starship.lua 檔案,使用 Lua 來在 Clink 中載入 Starship,這樣才能生效,內容如下:
在 C:\\Users{這裡是你的個人電腦使用者名稱}.config 目錄中新建一個 starship.toml 來配置,我的個人內容如下:
toml 代碼解讀複製代碼"$schema" = 'https://starship.rs/config-schema.json'
# 將提示符中的 '❯' 替換為 '➜'
[character] # 此組件名稱為 'character'
success_symbol = '[➜](bold green)'
error_symbol = '[➜](bold red)'
[dart]
format = "[$symbol]($style)"
[deno]
format = "[$symbol]($style)"
[golang]
format = '[$symbol]($style)'
[java]
format = '[$symbol]($style)'
[lua]
format = '[$symbol]($style)'
[nodejs]
disabled = true
[php]
format = '[$symbol]($style)'
[python]
format = '[$symbol]($style)'
[bun]
disabled = true
[package]
symbol = '🏷️ '
[git_status]
conflicted = '💥'
ahead = '🏎💨'
behind = '😰'
diverged = '😵'
up_to_date = '✨'
untracked = '⚡️'
stashed = '📦'
modified = '📝'
staged = '⏳[++\($count\)](green)'
renamed = '👅'
deleted = '🗑'
配置完成之後,home 目錄變成了 ~,有點那個味了,git status 也增加了形象的 emoji 表情來表示,你也可以按照你自己的理解來修改。
cmder 基於 Clink,而 Clink 實際上透過 Lua 擴充了自動完成的功能,非常好用,可以透過在終端中輸入以下命令開啟:
powershell 代碼解讀複製代碼# 開啟自動建議,打開後會在你輸入命令時根據以往的歷史記錄來顯示建議
# 你按 F2 的時候,還可以切換到歷史記錄下拉列表,實現模糊查找,關閉這個功能則是再按一下 F2
clink set autosuggest.enable true
在 macOS 或者 Linux 終端中,配置別名能提高我們的效率,但是在原生 Windows 終端中,別名的支援不是很好,在 cmder\config\user_aliases.cmd 中配置你的別名,就能實現一樣的體驗。
可以透過 $1 來表示取得第一個參數,如果有多個參數,可以使用 $*。注意 e. 命令可以在終端使用檔案總管打開目前目錄,類似於 macOS 中的 open 命令,也是非常好用。
powershell 代碼解讀複製代碼e.=explorer .
gcb=git checkout $1
gc=git stash
gd=git diff
glg=git log --stat
gcbn=git checkout -b $1
gs=git status
gl=git log
gpr=git pull origin $1
gpo=git push -u origin HEAD
gpc=git push origin HEAD
gbd=git branch -d $*
gbdf=git branch -D $*
gbm=git branch -m $1
gp=git push origin $*
ga=git add .
gf=git fetch
glg=git log --stat
clone=git clone $*
gbl=git branch
gcp=git stash pop
gcl=git stash list
gcne=git commit --amend --no-edit
pw
gfs=git flow feature start $1
gff=git flow feature finish $1
grs=git flow release start $1
grf=git flow release finish $1
ghs=git flow hotfix start $1
ghf=git flow hotfix finish $1
vi=vim $*
cc=claude --dangerously-skip-permissions $*
雖然我們的 home 目錄變成了 ~,但是如果我們使用 cd ~ 並不會跳轉 home 目錄,系統並不能識別這個符號,所以我們需要使用 Lua 擴充來實現這個功能。在 cmder\vendor 目錄中增加一個檔案 HomeClink.lua,內容如下:
lua 代碼解讀複製代碼-- Small clink script to automatically expand ~ to %HOME% in any command the user executes via Windows' CMD shell.
-- Look for escaped tildes, replaces any instance of "|~" with placeholder text.
local function tilde_escape(command)
return string.gsub(command, "|~", "##EXPANDEDTILDEFORTILDEEXPANDER##")
end
-- Turn escaped tildes back into a regular tilde "~" after we've expanded unescaped tildes.
local function tilde_descape(command)
return string.gsub(command, "##EXPANDEDTILDEFORTILDEEXPANDER##", "~")
end
-- Expand unescaped tildes with rl.expandetilde. Returns two values, the first is the expanded input command, the second is a boolean indicating whether any tildes were expanded. This second value not used in this script.
local function cmd_tilde_expander(input)
local escaped_input = tilde_escape(input)
local expanded_input, was_expanded = rl.expandtilde(escaped_input, true)
local descaped_input = tilde_descape(expanded_input)
return descaped_input
end
-- Register the main tilde expander function to run after the user has executed a command.
clink.onfilterinput(cmd_tilde_expander)
還有更多的 Clink 自動完成 Lua 腳本,可以在 github.com/chrisant996… 找找有沒有適合你使用的腳本。
在終端中切換目錄要頻繁使用 cd,先退出後進入,非常麻煩,在 macOS 上使用 zsh,有一個 autoJump、z 這類外掛可以實現目錄記憶功能,透過一個 z 或 j 命令去跳轉,實際上 Windows 也可以。安裝 zoxide,這是使用 Rust 實現的目錄跳轉工具,性能非常優秀。
powershell 代碼解讀複製代碼winget install ajeetdsouza.zoxide
由於我們用的是 cmder 套殼的,所以不能直接使用,還要使用 Lua 外掛才能支援,我們可以用 clink-zoxide,將它放到 cmder\vendor 目錄中,即可使用。
LSD 也是使用 Rust 編寫的高效能工具,是 ls 的替代品,支援按照檔案類型來顯示檔案圖示,但是要安裝了內建 Nerd Font 的字體才能正常顯示,上面我們已經安裝好了 Maple Mono Normal NL NF CN,那麼我們直接安裝就行了。
powershell 代碼解讀複製代碼winget install --id lsd-rs.lsd
lsd 可以直接替代 ls,所以我們這裡修改一下別名,讓 ls 命令指向 lsd:
powershell 代碼解讀複製代碼ls=lsd $*
la=lsd -a
ll= lsd -l
包含隱藏檔案補全,如果你發現 Tab 沒那麼好使了,可能就是這個設定被設為 false,把這個開啟,你會發現 Tab 能夠補全很多東西,比如你切換 git 分支的時候,它也能補全:
powershell 代碼解讀複製代碼clink set files.hidden true
在 cmder/config 目錄下新增 .inputrc 配置,增強自動補全的體驗:
powershell 代碼解讀複製代碼# 基礎配置
set colored-stats on # 啟用彩色補全
set colored-completion-prefix on # 為補全前綴著色
set completion-ignore-case on # 補全忽略大小寫
set show-all-if-ambiguous on # 立即顯示所有匹配項
set mark-symlinked-directories on # 標記符號連結目錄
set mark-symlinked-directories on # 標記符號連結目錄
經過以上配置,相信我們的終端體驗已經能達到 macOS 的水平,而且性能也是不錯的。總的來說,Windows 終端也能擁有 Mac 的體驗,只是並不是開箱即用的那種,而是要經過比較繁瑣的配置,但是配置完了之後,能夠讓你的體驗翻好幾倍。實際上 Clink 是一個非常強大的工具,它還有很多功能未用上,你可以自己折騰一下,來解鎖更多好玩好用的功能。