前言

Windows 推出了新的终端 Windows Teminal,虽然外观有所进步,但还是达不到自己预期,因此可以自己简单修改一下。

准备工作

计算机上启动 Windows PowerShell 时,执行策略很可能是 Restricted(默认设置)。

  • Restricted 执行策略不允许任何脚本运行。
  • AllSignedRemoteSigned 执行策略可防止 Windows PowerShell 运行没有数字签名的脚本。

因此如果直接安装很可能出现无法运行脚本的错误。

查看当前策略

打开 Windows PowerShell 然后输入:

1
2
3
4
get-executionpolicy

PS C:\WINDOWS\system32> get-executionpolicy
Restricted

修改策略

以管理员身份打开 Windows Posershell,执行下列命令:

1
2
set-executionpolicy remotesigned
# 运行后输入 Y

安装 Windows 终端

直接在微软商店搜索下载 Windows Terminal

安装 PowerShell 7

按照官方的教程 或者直接使用下面的命令:

1
winget install --id Microsoft.Powershell --source winget

安装好后打开 Windows 终端,在 设置-启动-默认配置文件 中修改为 PowerShell,注意不是 Windows PowerShell,保存修改。

如果提示没有 winget 命令,首先通过微软商店安装,参考官方文档

WinGet 命令行工具仅在 Windows 10 1709(版本 16299)或更高版本上受支持。 在你首次以用户身份登录 Windows(这会触发 Microsoft Store 将 Windows 程序包管理器注册为异步进程的一部分)之前,WinGet 工具不可用。 如果最近已经以用户身份进行了首次登录,但发现 WinGet 尚不可用,则可以打开 PowerShell 并输入以下命令来请求此 WinGet 注册:Add-AppxPackage -RegisterByFamilyName -MainPackage Microsoft.DesktopAppInstaller_8wekyb3d8bbwe

优化

外观

使用 oh-my-posh 来优化功能,美化界面。安装方法两种,一种是在微软商店搜索下载,另一种是 winget 下载。

1
winget install JanDeDobbeleer.OhMyPosh -s winget

接下来安装并设置字体。安装作者推荐的 MesloLGM NF 字体,点此下载,这样可以解决部分字体图标渲染问题。打开 Windows Terminal,按 Ctrl + Shift + , 打开设置文件,然后在第 41profilesdefault 中添加字体设置,在第 43 行回车,然后添加如下代码后保存。

1
2
3
4
"font":
{
    "face": "MesloLGM NF"
}

加载 oh-my-posh 设置,在 Windows Terminal 中输入下面第一行命令创建新配置文件,创建后输入两条命名创建配置文件并使用记事本打开:

1
2
if (!(Test-Path -Path $PROFILE )) { New-Item -Type File -Path $PROFILE -Force }
notepad $profile

写入配置:

1
oh-my-posh init pwsh | Invoke-Expression

这样 oh-my-posh 就安装完成了,接下来可以自己选择主题。

主题

oh-my-posh 有很多主题,可以在官方文档页面预览,地址如下:

主题预览

选择好自己的主题后,在终端输入下面的命令:

1
Get-PoshThemes

然后终端会出现所有的主题预览,最后会出现主题文件所在地址,打开即可看到所有的主题文件,再次输入 notepad $profile,然后将配置修改为以下:

1
oh-my-posh init pwsh --config $env:POSH_THEMES_PATH/cloud-native-azure.omp.json | Invoke-Expression

可以将主题名称修改为自己想要的主题,保存后即可完成。

配置自动补全

自动补全插件为 PSReadLine

在终端安装模块:

1
2
Install-Module -Name PowerShellGet -Force -Scope CurrentUser
Install-Module PSReadLine -Scope CurrentUser

或者可以使用管理员打开终端,这样命令后就不需要加 -Scope CurrentUser

安装好模块后输入 `notepad $PROFILE 打开配置文件,添加下列命令:

1
2
Import-Module PSReadLine
Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete

或者可以直接在配置文件中添加官方示例的代码,地址点击这里,需要注意的是,下面两行代码需要放到最开头,同时在 Import-Module PSReadLine 下一行添加 Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete

1
2
3
4
5
6
# 放到开头
using namespace System.Management.Automation
using namespace System.Management.Automation.Language
...
Import-Module PSReadLine
Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete

Posh-git

安装命令如下:

1
PowerShellGet\Install-Module posh-git -Scope CurrentUser -Force

安装后在 notepad $PROFILE 打开配置文件引入模块:

1
Import-Module posh-git

个人配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 初始化配置及主题
oh-my-posh init pwsh --config $env:POSH_THEMES_PATH/robbyrussell.omp.json | Invoke-Expression
# 导入 PSReadLine 模块
Import-Module PSReadLine
# 设置 TAB 键补全
Set-PSReadlineKeyHandler -Key Tab -Function Complete
# 设置 Ctrl+z 为撤销
Set-PSReadLineKeyHandler -Key "Ctrl+z" -Function Undo
# 设置向上键为后向搜索历史记录
Set-PSReadLineKeyHandler -Key UpArrow -ScriptBlock {

  [Microsoft.PowerShell.PSConsoleReadLine]::HistorySearchBackward()

  [Microsoft.PowerShell.PSConsoleReadLine]::EndOfLine()

}
# 设置向下键为前向搜索历史纪录
Set-PSReadLineKeyHandler -Key DownArrow -ScriptBlock {

  [Microsoft.PowerShell.PSConsoleReadLine]::HistorySearchForward()

  [Microsoft.PowerShell.PSConsoleReadLine]::EndOfLine()

}
# 插入引号优化

Set-PSReadLineKeyHandler -Chord '"',"'" `

                         -BriefDescription SmartInsertQuote `

                         -LongDescription "Insert paired quotes if not already on a quote" `

                         -ScriptBlock {

    param($key, $arg)

  

    $line = $null

    $cursor = $null

    [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line, [ref]$cursor)

  

    if ($line.Length -gt $cursor -and $line[$cursor] -eq $key.KeyChar) {

        # Just move the cursor

        [Microsoft.PowerShell.PSConsoleReadLine]::SetCursorPosition($cursor + 1)

    }

    else {

        # Insert matching quotes, move cursor to be in between the quotes

        [Microsoft.PowerShell.PSConsoleReadLine]::Insert("$($key.KeyChar)" * 2)

        [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line, [ref]$cursor)

        [Microsoft.PowerShell.PSConsoleReadLine]::SetCursorPosition($cursor - 1)

    }

}
# git自动补全
Import-Module posh-git

参考