windows 終端體驗大升級,讓你擁有 macOS 級別的美化

天下開發苦 Windows 久矣

Windows 的 cmd 黑窗口,性能拉胯,樣式奇醜,還有編碼問題,狗都不用。雖然現在有了 Windows Terminal,但是沒有 bash,開發體驗還是跟不上。用 WSL2 吧,但是跨檔案系統通訊性能也很拉胯,Oh My Posh?No!PowerShell 又長又臭,沒有 bash 靈活優雅,難道沒有更好的選擇?

非也!今天我們來一步一步把 Windows 終端大改造,從狗都嫌的辣雞改造成愛不釋手的效率工具,我們透過 Windows Terminal + cmder + Starship,從性能、shell、美化三個角度來全面升級體驗。教程比較長,但是請耐心跟著做,最終的結果絕對值得!

Windows Terminal

Win11 自帶 Windows Terminal,無需單獨安裝,但是有些低版本的 Win10 可能沒有,需要更新系統,或者到 Microsoft Store 安裝。

cmder

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

打開 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

當然配置好了之後,也希望在 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 終端拉平體驗。

gitee 下載

github 下載

Starship

Starship 是一款使用 Rust 編寫的高效能終端美化工具,支援 Linux、Windows、macOS,是 Windows 上拉平 macOS 終端體驗的關鍵。

安裝

powershell 代碼解讀複製代碼winget install --id Starship.Starship

cmder 配置

因為我們使用的是 cmder,所以我們需要在 cmder/config 目錄中新增一個 starship.lua 檔案,使用 Lua 來在 Clink 中載入 Starship,這樣才能生效,內容如下:

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 配置

自動完成

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 跳轉

雖然我們的 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 是一個非常強大的工具,它還有很多功能未用上,你可以自己折騰一下,來解鎖更多好玩好用的功能。

改造完成終端的效果

image.png


原文出處:https://juejin.cn/post/7657755366327664680


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝15   💬3   ❤️3
652
🥈
我愛JS
📝2   💬3   ❤️3
128
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登