powershell beautify

先从PowerShell说起

Windows自带的Windows PowerShell一般为PowerShell 5, 相比于最新的PowerShell 7有着比较多的差异

本文后续的所有美化与功能加强都将基于PowerShell 7。建议在Github-PowerShell下载PowerShell 7+版本,即pwsh。注意,pwsh与原生Windows PowerShell为两个独立终端,pwsh做的工作并不会生效在Windows PowerShell上。

Windows Terminal

新版pwsh的界面依然不是很耐看,其自带的风格定义十分有限。且pwsh只是一个独立终端,不能满足多终端协同工作。Windows Terminal能集成PowerShell、Git Bash、Azure、WSL等终端,并且能定义界面背景、字体颜色等等。其依然可以在Github-terminal中下载,微软商城也能下载,但速度很慢。

新增终端pwsh

ctrl+,打开Windos Terminal的设置,新增配置文件,填入pwsh的路径

image-20230902164057151

Scoop

Scoop是一款适用于WIndows平台的命令行软件包管理工具,满足用户对软件包的安装管理需求。其作用可类比于macOS的homebrew、Linux的apt-get、python的pip等工具。

为什么Scoop

本章的Scoop主要用于安装oh-my-posh(终端主题)和各种unix工具。针对oh-my-posh而言,主流教程都是通过Install-Module oh-my-posh来安装,但经过笔者试验会报错

Install-Package: No match was found for the specified search criteria and module name ‘oh-my-posh’. Try Get-PSRepository to see all available registered module repositories.

这是因为PSRepository没被注册,自然无法找到需要安装的模块。但如果尝试Register-PSRepository -Default,或指定安装PSGallery,或改变管理端口,warning-unable-to-find-module-repositories。发现都无法生效时,建议使用Scoop安装。

安装Scoop

设置Powershell执行策略

1
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

安装Scoop

1
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')

该命令默认安装至C盘,如需要更改目录,则在执行上述命令前添加环境变量定义:

1
2
$env:SCOOP='D:\Applications\Scoop'
[Environment]::SetEnvironmentVariable('SCOOP', $env:SCOOP, 'User')

安装oh-my-posh

1
scoop install oh-my-posh

Oh-my-posh

Oh-my-posh作为一款终端Prompt个性化工具,衍生于Oh-my-zsh。如今除Windows外,Oh-my-posh还支持了WSL,macOS系统上的各式终端。Oh-my-posh预置了几十款主题,风格各异,通过Get-PoshThemes可以预览所有预置主题:

image-20230902164647627

在输出的尾部可以看到Themes的储存位置,用户还可以在官网主题下载主题并放置于此。

安装主题

1
oh-my-posh prompt init pwsh --config C:\Users\Levi\scoop\apps\oh-my-posh\18.0.1\themes\takuya.omp.json | Invoke-Expression

其中–config跟随的是目标主题的配置文件路径,如需要更换主题则修改路径即可

安装Nerd Font字体

有些主题的完整显示需要一些特殊字符或图标,否则表现成一个个方框。这里推荐安装Nerd Font,同样的如果无法访问就前往Github-NerdFonts下载

下载好的字体包,右键为所有用户安装即可安装字体,以AurulentSansM Nerd Font为例,在设置-个性化-字体 中可以找到安装的字体:

image-20230902164829377

打开Windoes Terminal的配置文件

找profile.defaults并修改font内容,注意face内容不是字体的元数据里的全称:

1
2
3
4
5
6
7
8
"profiles": {
"defaults": {
"font": {
"face": "AurulentSansM Nerd Font",
"size": 12.0
}
}
}

至此,重启Windows Terminal就能看到完整的主题了。

集成git bash

如果想像git bash一样,支持显示当前分支名等功能,可以尝试scoop install posh-git安装。具体步骤笔者没有亲试,感兴趣者可以通过关键词posh-git自行搜索相关流程。

Unix工具链

如果你是Linux用户,开始使用Windows时会十分不适应,主要因为Windows缺少很多实用工具如vim,cat,grep,甚至是ls的功能都不全!!!

当然,在Windows里是有些命令能对应到Linux,比如Get-ChildItem,但相比下并不好用。

安装busybox

busybox中涵盖了大多常用的Linux命令,包括awk、clear、tail、sed等等。通过scoop install busybox安装。之后通过busybox --list可以查看其支持的命令。

定向查找

对于busybox没有涵盖的命令或功能不全的命令,如zip。可以通过scoop search unzip查看提供该功能的工具包,选择一个即可安装。

注意,新安装的工具包内如果有命令与其他工具包的命令重名,新工具包的命令会取代现有命令。

自动补全与历史显示

Linux除了常用的命令外,TAB键的自动补全功能也能有效提高工作效率,尤其是在进入层层目录的时候。

image-20230902165259514

通过命令Set-PSReadlineKeyHandler -Key Tab -Function Complete可以加上该功能,挑选目录时也可以通过方向键选择。

此外,根据历史命令预测本次命令的功能也能极大改善使用体验。这里我只需要输入cd,终端就能根据最近的历史命令向我提供补全提示,按下右方向键即可补全完整命令了:

image-20230902165343779

通过命令Set-PSReadLineOption -PredictionSource History -ShowToolTips可以加上该功能。

其他选用工具

1
2
3
4
Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete  //自动补全的风格为zsh风格
Set-PSReadLineKeyHandler -Key "Ctrl+z" -Function Undo //撤销最近的输入
Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward //向上查阅命令历史
Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward //向下查阅命令历史

配置自启动

以上功能包括oh-my-posh主题、自动补全等在新建pwsh窗口时都会失效,因为命令行方式启动只会作用于当前窗口。为了保证每一新建窗口都应用上配置的功能,我们需要改动pwsh的启动配置文件(.ps1文件)

在pwsh上执行$PROFILE可以看到pwsh的启动文件位置。注意,该文件有可能不存在,这是正常的,我们只需要照着路径创建该文件即可:touch $PROFILE。打开该文件,将需要的预命令写入:

1
2
3
4
5
# TAB菜单选项
Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete
Set-PSReadLineOption -PredictionSource History -ShowToolTips
# 推荐velvet,ys等主题
oh-my-posh prompt init pwsh --config C:\Users\Levi\scoop\apps\oh-my-posh\18.0.1\themes\takuya.omp.json | Invoke-Expression

至此,一套改装完的,崭新的Windows终端就完全配置好了。相信它能够满足你的日常使用。

集成VsCode

笔者习惯使用VsCode作为日常的IDE,当然VsCode也需要同样集成pwsh。

更改默认终端

打开VsCode的用户setting.json(ctrl+shift+P,再输入user setting json关键字)。在terminal.integrated.profiles.windows中新增pwsh的路径:

1
2
3
4
5
"pwsh": {
"path": "D:\\PowerShell\\pwsh.exe",
"icon": "terminal-powershell",
"color": "terminal.ansiGreen"
}

同时设置"terminal.integrated.defaultProfile.windows": "pwsh"

设置Nerd Font字体

笔者实践时发现VsCode终端的字体与pwsh并不同步,需要单独设置。同样在用户setting.json中,添加以下两行:

1
2
"terminal.integrated.fontFamily": "AurulentSansM Nerd Font",
"terminal.integrated.fontSize": 12,

其他改善

自定义命令

pwsh的启动配置文件提供了function块,我们可以据此实现一些自定义的命令。比如busybox提供的ls命令功能十分有限,既不能高亮输出,也不能简略输出内容。在启动配置文件中添加:

1
2
3
4
5
6
7
8
9
10
function ll{
param(
[switch]$al
)
if ($al){
sh -c 'ls -al'
}else{
sh -c 'ls'
}
}

可以通过ll来模拟bash中的ls命令,效果如下:

image-20230902165636782

自定义高亮颜色

Set-PSReadLineOption -Colors可以自定义命令行各个部分的颜色,色值既可以使用ANSI escape code也可以使用16色值。推荐网站中国色

微软提供以下一些可自定义颜色的选项,主要关注Command、Selection、inlinePrediction即可。以下为笔者使用的,可供参考:

1
2
3
4
5
6
7
8
9
10
11
Set-PSReadLineOption -Colors @{`
Command = 'Yellow'
Type = 'Blue'
Variable = 'DarkGreen'
Parameter = 'DarkGreen'
ContinuationPrompt = 'DarkGray'
Default = 'DarkGray'
Selection = '#F05E1C'
inlinePrediction = '#91AD70'
Error = 'Red'
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!