曾經(jīng)非常羨慕mac平臺上的iTerm2+oh-my-zsh組合,可以實(shí)現(xiàn)一個非常好看又實(shí)用的終端,十分希望windows平臺上也有類似的東西,然而在很長時間里都沒有出現(xiàn),以前最好的方案還是cmder,直到微軟發(fā)布了Windows Terminal。
Windows Terminal
Windows Terminal正式版已經(jīng)發(fā)布了,可以直接通過Windows商店安裝,現(xiàn)在已經(jīng)支持可視化的設(shè)置界面了,大多數(shù)的美化教程可能都會介紹Windows Terminal結(jié)合WSL使用,但我個人使用下來發(fā)現(xiàn)幾個問題:一個是WSL啟動較慢,二是開啟WSL后vmmem會占用大量內(nèi)存,第三是通過vscode訪問WSL有時會出現(xiàn)斷開連接,所以我放棄了WSL這個方案。
oh-my-posh
oh-my-posh是PowerShell的一套主題,聽名字就知道和oh-my-zsh是類似的,最新版本是 Oh My Posh 3
開始安裝
oh-my-posh的安裝還是比較簡單的
- 通過管理員權(quán)限打開PowerShell
- 繞過PowerShell執(zhí)行策略,使其可以執(zhí)行腳本文件
Set-ExecutionPolicy Bypass
復(fù)制代碼
- 安裝oh-my-posh主題
Install-Module oh-my-posh -Scope CurrentUser
復(fù)制代碼
- 安裝posh-git將git信息添加到提示中
Install-Module posh-git -Scope CurrentUser
復(fù)制代碼
注意:如果中途有詢問,直接Y或A就好了
- 通過這個 地址 下載安裝字體,推薦安裝DejaVuSansMono Nerd Font(其他的我也沒試過)
修改配置
安裝完成之后,修改PowerShell的配置文件
- 啟動編輯PowerShell配置文件的引擎
if (!(Test-Path -Path $PROFILE )) { New-Item -Type File -Path $PROFILE -Force }
復(fù)制代碼
- 使用vscode打開配置文件(也可以用其他方式打開),配置文件地址一般是:C:Users${username}DocumentsWindowsPowerShellMicrosoft.PowerShell_profile.ps1
code $PROFILE
復(fù)制代碼
- 添加以下配置內(nèi)容
Import-Module posh-git # 導(dǎo)入posh-git
Import-Module oh-my-posh # 導(dǎo)入oh-my-posh
Set-PoshPrompt -Theme M365Princess # 設(shè)置主題為M365Princess
復(fù)制代碼
- 最終效果如圖,也可以通過Get-PoshThemes查看全部可用主題
自定義別名
本來美化教程到這兒就差不多結(jié)束了,但是有一說一,這個東西網(wǎng)上的教程其實(shí)已經(jīng)有很多了,在這兒發(fā)一個類似的東西屬實(shí)沒啥必要,所以下面要整點(diǎn)不一樣的東西。
通過上面那個配置文件,可以自定義一些命令行的別名,類似于一些簡單的跳轉(zhuǎn):
function Go-Up {
# 跳轉(zhuǎn)上級
cd ../
}
function Go-Home {
# 跳轉(zhuǎn)根目錄
cd ~
}
Set-Alias '..' Go-up
Set-Alias '~' Go-Home
復(fù)制代碼
在使用PowerShell的過程中,一直有個不太喜歡的點(diǎn),就是PowerShell查看當(dāng)前目錄下的文件可以使用 ls、dir、Get-ChildItem,這幾個效果都是一樣的,如下:
而我想要實(shí)現(xiàn)類似于bash的文件名稱橫向排布,并且不同的文件類型顯示不同的顏色的輸出,類似于下圖:
PowerShell沒有提供類似的方法,但我們可以自定義實(shí)現(xiàn),代碼如下:
# >>> 移除默認(rèn)別名 >>>
Remove-Item alias:ls
# >>> 自定義函數(shù) >>>
function Color-List($str) {
$regex_opts = ([System.Text.RegularExpressions.RegexOptions]::IgnoreCase-bor [System.Text.RegularExpressions.RegexOptions]::Compiled)
$fore = $Host.UI.RawUI.ForegroundColor
$compressed = New-Object System.Text.RegularExpressions.Regex('.(zip|tar|gz|rar|jar|war|7z)$', $regex_opts)
$executable = New-Object System.Text.RegularExpressions.Regex('.(exe|bat|cmd|py|ps1|psm1|vbs|rb|reg|sh|zsh)$', $regex_opts)
$code_files = New-Object System.Text.RegularExpressions.Regex('.(ini|csv|log|xml|yml|json|JAVA|c|cpp|css|sass|js|ts|jsx|tsx|vue)$', $regex_opts)
$itemList = @()
Invoke-Expression ("Get-ChildItem" + " " + $str) | ForEach-Object {
$item = New-Object object
if ($_.GetType().Name -eq 'DirectoryInfo')
{
$item | Add-Member NoteProperty name ("`e[34m" + $_.name) # 目錄名稱藍(lán)色
}
elseif ($compressed.IsMatch($_.Name))
{
$item | Add-Member NoteProperty name ("`e[31m" + $_.name) # 壓縮文件紅色
}
elseif ($executable.IsMatch($_.Name))
{
$item | Add-Member NoteProperty name ("`e[36m" + $_.name) # 可執(zhí)行文件青色
}
elseif ($code_files.IsMatch($_.Name))
{
$item | Add-Member NoteProperty name ("`e[33m" + $_.name) # 代碼文件黃色
}
else
{
$item | Add-Member NoteProperty name ("`e[37m" + $_.name) # 其他文件默認(rèn)白色
}
$itemList += $item
}
echo $itemList | Format-Wide -AutoSize # 格式化輸出
}
function Get-List {
Color-List "-Exclude .*"
}
function Get-All-List {
Color-List "$args"
}
# >>> 重新定義別名 >>>
Set-Alias ls Get-List
Set-Alias la Get-All-List
復(fù)制代碼
最終效果如下: