---
# System prepended metadata

title: 使用Oh my posh來美化Terminal

---

# 使用Oh my posh來美化Terminal

Terminal的美化 不只是看起來的好看 更重要的是好操作
- 看起來順眼
- 更好配置操作指令
- git、ssh、python、nodejs、docker 等等環境的運行狀態

![image](https://hackmd.io/_uploads/B1XhlvhVbx.png)

## 運作原理

分為最主要的三步:載入、觸發、渲染

1. 載入: 腳本注入 (Injection)
運行shell時透過初始化的配置文件(.bash_profile/.zshrc/$PROFILE) 載入腳本/程式
2. 觸發: 事件掛鉤(Hooking)
透過shell提供的Hook(類似API) 去監聽、攔截、觸發、覆寫一些行為
    像是:
    - 更改外觀就是透過覆寫shell的繪製過程
    - 能看到git狀態 是透過每次按下enter時 觸發腳本 檢查git狀態、更新顯示
3. 渲染: ANSI 轉義序列 (Rendering)
    - 當狀態更新完畢 會輸出對應的ANSI序列[^ANSI序列] 例如:`\e[32m \ue0b0 \e[0`
    - 最後整合各個插件的ANSI序列 轉譯為各色背景+圖標的組合
    - 最終繪製出自定義的顯示內容

而使用者要做的 就是config配置好 把這工具掛載到shell的初始化上即可
```mermaid
graph LR
    B[初始化掛載] --> C[觸發 Shell Hook]
    C --> D[執行插件]
    D --> E[封裝ANSI]
    E --> F[渲染]
    F --> C
```

整體設計模式為Decoupled Architecture(解耦架構)

## 背景介紹

最初在bash及zsh上 是在終端執行一行一行的腳本來完成簡易的輔助功能

演變成Oh My Zsh(OMZ)這種具有插件功能的工具 透過類似上圖的方式 給單純的終端附加了各種補全、捷徑、文字GUI 等等的互動功能

隨著WSL及跨平台需求增加 後人基於OMZ使用GO語言推出了Oh My Posh(OMP) 透過統一執行各平台編譯好的程式 來解決不同shell有不同腳本程式的問題

核心理念是透過通用的ANSI渲染引擎 達到無論在哪種Shell 只要配置同樣的設定檔 呼叫這個工具 就能達到畫面的統一


**配置起來非常簡潔** 且移植容易 所以選擇使用Oh my posh配置

> 需要更多擴充功能 可再配置OMZ來擴充功能套件

## windows terminal配置 [^微軟教學] [^美化win] [^美化你的命令行] [^CLI安裝]

主要分為4個步驟:
環境設定、安裝字體、配置設定檔、選主題

::::spoiler 可選: 安裝powershell 7、更改預設啟動、vscode預設終端
:::info
### 安裝powershell 7
win預設是5.1 新的7.0 主要差異是在速度、跨平臺

安裝方式 win+r輸入`wt` 透過winget安裝

``` shell
winget install Microsoft.PowerShell
```

此時win+r 輸入`pwsh` 應該會出現

```shell
PowerShell 7.x.x
PS C:\Users\xxx> 
```

而輸入`powershell` 執行的就會是舊版

### 更改預設啟動
在win terminal修改預設啟動PowerShell (7)
![image](https://hackmd.io/_uploads/B1-drI3NZx.png)

### vscode預設終端
ctrl+shift+p `Terminal: Select Default Profile`
選PowerShell (7)
![image](https://hackmd.io/_uploads/r160ULnEZx.png)
:::
::::

以下流程官方doc皆有教學 以最新版為主
### 1. 安裝[Oh my posh](https://ohmyposh.dev/)

1. win+r輸入pwsh開啟powershell 輸入
    `winget install JanDeDobbeleer.OhMyPosh --source winget`
2. 重啟Windows Terminal輸入`oh-my-posh.exe` 有跳出東西就OK了

### 2. 安裝對應字體

可執行指令安裝:
`oh-my-posh font install`

或是從 [Nerd Font](https://www.nerdfonts.com/) 選一個喜歡的下載並安裝 解壓縮後框選所有字體檔案 右鍵"為所有使用者安裝"

重啟terminal 設定>預設值>外觀>字型 選擇安裝的Nerd Font
![image](https://hackmd.io/_uploads/HkOgAInVZl.png)

>[!Note]
為了美化terminal 需要使用該字體的圖標擴充版 稱為Nerd Font(NF)
>更祥細的字體補充 [^字體補充]

### 3. 啟動shell時載入oh my posh

目前運行的powershell的設定檔
`Microsoft.PowerShell_profile.ps1` 

> 其位置可透過 `echo $PROFILE` 查看 去編輯這個檔案即可

這邊使用vscode編輯 `code $PROFILE` 或是記事本編輯 `notepad $PROFILE`

在.ps1中輸入初始化的指令並存檔 [^prompt使用]:

```shell
oh-my-posh init pwsh --eval | Invoke-Expression
```
> oh-my-posh init \[shell\] 會根據環境生成指令來初始化


:::spoiler 
使用`--eval`速度會較慢 但不用可能出現".ps1檔案無法載入"

PowerShell 有4種執行原則：
1. Restricted：所有Script(.ps1) 皆無法執行(預設)
2. AllSigned：所有Script都要經過受信任的發行者簽屬過後才可執行
3. RemoteSigned：異地Script需要簽屬過後才可執行，本機Script可直接執行
4. Unrestricted：無限制，所有Script皆可執行
 
用系統管理員執行指令將其設定為RemoteSigned即可 [^PS簽章]
`> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine`
:::



接著再重啟一次 即可完成 到這邊就OK了
![image](https://hackmd.io/_uploads/SyV73D2Nbl.png)

## 4. 選擇喜歡的主題

首先從官方doc的[Themes頁面](https://ohmyposh.dev/docs/themes)挑一個順眼的主題 記住他的名稱

在我使用的v29.0.1版本 安裝時不再內建主題 需手動配置config

1. 從 [Released](https://github.com/JanDeDobbeleer/oh-my-posh/releases/tag/v29.0.1) 下載themes.zip 並解壓縮到一個地方
(這邊在`%USERPROFILE%`創了資料夾放在裡面 `~/username/ohmyposh/theme`)

2. `code $PROFILE` 編輯 `Microsoft.PowerShell_profile.ps1`
    ```
    將原本的
    oh-my-posh init pwsh | Invoke-Expression
    更改成
    oh-my-posh init pwsh --config [你的主題資料夾]/[theme名稱].omp.json | Invoke-Expression

    oh-my-posh init pwsh --config ~/ohmyposh/themes/powerlevel10k_rainbow.omp.json | Invoke-Expression
    ```
    執行`. $PROFILE`或是重啟terminla 其可完成設定

>[!Note]
>其設定檔`xxx.omp.json` 可備份後任意自訂樣式 theme資料夾只是調整好的樣板
>
看到主題改變就完成了
![image](https://hackmd.io/_uploads/ryb3Wd3VZx.png)

## Git Bash [^gitbash配置]

windows安裝git時 通常會自帶一個bash shell
其配置方法也一樣 參考官方的Linux配置教學即可

如果已經如上文配置powershell 只要修改`~/.bash_proflie` 
加入設定檔位置 重新啟動即可:
```shell
eval "$(oh-my-posh --init --shell bash --config [你的主題資料夾]/[theme名稱].omp.json.)"
```

![image](https://hackmd.io/_uploads/SkJuqt2VWe.png)



## Ref 其他相關知識
終端機

[^ANSI序列]: [ANSI跳脫序列](https://zh.wikipedia.org/zh-tw/ANSI%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97)


[^美化win]: [美化Windows Terminal](https://hackmd.io/@Yuuzi/wt)

[^美化你的命令行]: [美化你的命令行：使用 PowerShell 7 和 Oh My Posh 的终极指南 - F4lc0n的文章 - 知乎](https://zhuanlan.zhihu.com/p/690118041)

[^微軟教學]: [微軟教學課程 - 使用 Oh My Posh 設定 PowerShell 或 WSL 的自訂提示](https://learn.microsoft.com/zh-tw/windows/terminal/tutorials/custom-prompt-setup)

[^字體補充]: [写代码用哪种字体看起来最舒适？ - Snowflyt的回答 - 知乎](https://www.zhihu.com/question/32058777/answer/3561707776)

[^PS簽章]: [如何對PowerShell腳本檔案進行數位簽章](https://blog.miniasp.com/post/2024/09/07/How-to-digitally-sign-PowerShell-script-files)

[^prompt使用]: https://ohmyposh.dev/docs/installation/prompt

[^gitbash配置]: [用 oh-my-posh 美化 Git bash](https://blog.awin.one/posts/2022/%E7%94%A8-oh-my-posh-%E7%BE%8E%E5%8C%96-git-bash/)

[^CLI安裝]: [透過 CLI 的方式，來安裝 Windows Terminal + PowerShell 7 + Oh My Posh](https://eandev.com/post/software/windows-terminal-powershell-7-oh-my-posh-setup/)

[^gitbash問題]: [Git for Windows (git-bash with mintty) badly handles CTRL+c / Break](https://www.reddit.com/r/git/comments/9aeq85/git_for_windows_gitbash_with_mintty_badly_handles/)

[^winpty流程圖]: [Cygwin系列（十一）：折腾终端2](https://silaoa.github.io/2020/2020-01-13-Cygwin%E7%B3%BB%E5%88%97%EF%BC%88%E5%8D%81%E4%B8%80%EF%BC%89%EF%BC%9A%E6%8A%98%E8%85%BE%E7%BB%88%E7%AB%AF2.html)


