Windows Terminal 安装与美化

1 概述

在我的上一篇文章中,我们学会了通过 Scoop 和 WSL 快速搭建各种开发环境,但是有没有发现默认的 powershell 很丑而且不好用,今天教大家怎样安装 Windows Terminal以及美化,Windows TerminalWSL2 的理想配套,它速度快、可配置、外观漂亮,并且提供了 Windows 和 Linux 开发的所有优点。

不多说,先看下美化后的 Windows Terminal。

2 安装

以管理员权限打开 powershell 并运行下面命令:

# 安装 Windows Terminal 最新版本
scoop install -g extras/windows-terminal
# 安装 powershell 最新版本, windows 默认的 powershell 版本很低
scoop install -g main/pwsh
# 安装字体
scoop install -g nerd-fonts/Cascadia-Code
# 安装openssh
scoop install -g main/openssh

3 windows-terminal 配置

3.1 配置右键菜单

新建 windows-terminal.reg 文件,文件内容如下:

Windows Registry Editor Version 5.00
 
[HKEY_CLASSES_ROOT\Directory\Background\shell\WindowsTerminal]
@="Windows Terminal Here"
"Icon"="D:\\Softwares\\Scoop\\GlobalApps\\apps\\windows-terminal\\current\\WindowsTerminal.exe"
 
[HKEY_CLASSES_ROOT\Directory\Background\shell\WindowsTerminal\command]
@="D:\\Softwares\\Scoop\\GlobalApps\\apps\\windows-terminal\\current\\WindowsTerminal.exe"

其中的路径是安装 windows-terminal的路径,配置完成后双击运行。

3.2 配置 pwsh

  1. 右键打开 windows-terminal, 选择设置。

  2. 选择添加新的配置文件。

  3. 选择复制配置文件。

  4. 修改配置文件为 pwsh 的配置文件。

  5. 修改启动为 pwsh

  6. 选择配色方案

3.3 全局配置

打开配置文件,进行全局配置,全局配置是在 defaults下配置的,list 下是单独配置每个命令行的,list 下的配置会覆盖全局配置的,如果在 defaults下已经配置了,list 下相同的配置需要删除,全局配置内容如下:

"defaults": {
    // 配置背景图片
    "backgroundImage": "D:\\SoftwareConfigs\\Windows-terminal\\background.jpg",
    // 配置透明度
    "backgroundImageOpacity": 0.1,
    // 配置主题
    "colorScheme": "One Half Dark",
    // 配置字体
    "font": {
        "face": "Cascadia Mono",
        "size": 12
    },
    // 配置历史记录大小
    "historySize": 9001,
    // 配置启动时进入的目录,配置为 null时会进入右键打开时所在的目录
    "startingDirectory": null,
    // 选择文本底色
    "selectionBackground": "#EE3A8C"
},

4 pwsh 配置

4.1 安装插件

为了让 pwsh 更好用,我们需要安装一些 powershell的插件,运行下面命令进行安装:

Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
Set-ExecutionPolicy remotesigned
# PowerShell 的彩色文件列表
Install-Module -AllowClobber Get-ChildItemColor -Scope AllUsers
# 增强 git 功能
PowerShellGet\Install-Module -Name posh-git -Scope AllUsers -AllowPrerelease -Force
PowerShellGet\Install-Module posh-sshell -Scope AllUsers
# 美化 powershell
Install-Module -Name oh-my-posh -Scope AllUsers
# git 别名支持
Install-Module -Name git-aliases -Scope AllUsers
# powershell 增强
Install-Module -Name PSReadLine -AllowPrerelease -Scope AllUsers -Force -SkipPublisherCheck
# 系统信息输出
Install-Module windows-screenfetch -Scope AllUsers -AllowClobber
Install-Module -Name InstallModuleFromGitHub -Scope AllUsers

4.2 windows-screenfetch 配置

windows-screenfetch 已经不适用于最新版本的 powershell ,所以需要更改下源码,找到 C:\Program Files\PowerShell\Modules\windows-screenfetch\1.0.2下的 Data.psm1文件,将里面所有内容替换为下面内容:

Add-Type -AssemblyName System.Windows.Forms
 
Function Get-SystemSpecifications()
{
 
    $UserInfo = Get-UserInformation;
    $OS = Get-OS;
    $Kernel = Get-Kernel;
    $Uptime = Get-Uptime;
    $Motherboard = Get-Mobo;
    $Shell = Get-Shell;
    $Displays = Get-Displays;
    $WM = Get-WM;
    $Font = Get-Font;
    $CPU = Get-CPU;
    $GPU = Get-GPU;
    $RAM = Get-RAM;
    $Disks = Get-Disks;
 
 
    [System.Collections.ArrayList] $SystemInfoCollection =
        $UserInfo,
        $OS,
        $Kernel,
        $Uptime,
        $Motherboard,
        $Shell,
        $Displays,
        $WM,
        $Font,
        $CPU,
        $GPU,
        $RAM;
 
    foreach ($Disk in $Disks)
    {
        [void]$SystemInfoCollection.Add($Disk);
    }
 
    return $SystemInfoCollection;
}
 
Function Get-LineToTitleMappings()
{
    $TitleMappings = @{
        0 = "";
        1 = "OS: ";
        2 = "Kernel: ";
        3 = "Uptime: ";
        4 = "Motherboard: ";
        5 = "Shell: ";
        6 = "Resolution: ";
        7 = "Window Manager: ";
        8 = "Font: ";
        9 = "CPU: ";
        10 = "GPU ";
        11 = "RAM: ";
    };
 
    return $TitleMappings;
}
 
Function Get-UserInformation()
{
    return $env:USERNAME + "@" + (Get-CimInstance Win32_OperatingSystem).CSName;
}
 
Function Get-OS()
{
    return (Get-CimInstance Win32_OperatingSystem).Caption + " " +
        (Get-CimInstance Win32_OperatingSystem).OSArchitecture;
}
 
Function Get-Kernel()
{
    return (Get-CimInstance  Win32_OperatingSystem).Version;
}
 
Function Get-Uptime()
{
    $Uptime = (Get-CimInstance Win32_OperatingSystem).LocalDateTime - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime;
 
    $FormattedUptime =  $Uptime.Days.ToString() + "d " + $Uptime.Hours.ToString() + "h " + $Uptime.Minutes.ToString() + "m " + $Uptime.Seconds.ToString() + "s ";
    return $FormattedUptime;
}
 
Function Get-Mobo()
{
    $Motherboard = Get-CimInstance Win32_BaseBoard | Select-Object Manufacturer, Product;
    return $Motherboard.Manufacturer + " " + $Motherboard.Product;
 
}
 
Function Get-Shell()
{
    return "PowerShell $($PSVersionTable.PSVersion.ToString())";
}
 
Function Get-Displays()
{
    $Displays = New-Object System.Collections.Generic.List[System.Object];
 
    # This gives the available resolutions
    $monitors = Get-CimInstance -N "root\wmi" -Class WmiMonitorListedSupportedSourceModes
 
    foreach($monitor in $monitors)
    {
        # Sort the available modes by display area (width*height)
        $sortedResolutions = $monitor.MonitorSourceModes | sort -property {$_.HorizontalActivePixels * $_.VerticalActivePixels}
        $maxResolutions = $sortedResolutions | select @{N="MaxRes";E={"$($_.HorizontalActivePixels) x $($_.VerticalActivePixels) "}}
 
        $Displays.Add(($maxResolutions | select -last 1).MaxRes);
    }
 
    return $Displays;
}
 
Function Get-WM()
{
    return "DWM";
}
 
Function Get-Font()
{
    return "Segoe UI";
}
 
Function Get-CPU()
{
    return (((Get-CimInstance Win32_Processor).Name) -replace '\s+', ' ');
}
 
Function Get-GPU()
{
    return (Get-CimInstance Win32_DisplayConfiguration).DeviceName;
}
 
Function Get-RAM()
{
    $FreeRam = ([math]::Truncate((Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory / 1KB));
    $TotalRam = ([math]::Truncate((Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1MB));
    $UsedRam = $TotalRam - $FreeRam;
    $FreeRamPercent = ($FreeRam / $TotalRam) * 100;
    $FreeRamPercent = "{0:N0}" -f $FreeRamPercent;
    $UsedRamPercent = ($UsedRam / $TotalRam) * 100;
    $UsedRamPercent = "{0:N0}" -f $UsedRamPercent;
 
    return $UsedRam.ToString() + "MB / " + $TotalRam.ToString() + " MB " + "(" + $UsedRamPercent.ToString() + "%" + ")";
}
 
Function Get-Disks()
{   
    $FormattedDisks = New-Object System.Collections.Generic.List[System.Object];
 
    $NumDisks = (Get-CimInstance Win32_LogicalDisk).Count;
 
    if ($NumDisks)
    {
        for ($i=0; $i -lt ($NumDisks); $i++)
        {
            $DiskID = (Get-CimInstance Win32_LogicalDisk)[$i].DeviceId;
 
            $FreeDiskSize = (Get-CimInstance Win32_LogicalDisk)[$i].FreeSpace
            $FreeDiskSizeGB = $FreeDiskSize / 1073741824;
            $FreeDiskSizeGB = "{0:N0}" -f $FreeDiskSizeGB;
 
            $DiskSize = (Get-CimInstance Win32_LogicalDisk)[$i].Size;
            $DiskSizeGB = $DiskSize / 1073741824;
            $DiskSizeGB = "{0:N0}" -f $DiskSizeGB;
 
            $FreeDiskPercent = ($FreeDiskSizeGB / $DiskSizeGB) * 100;
            $FreeDiskPercent = "{0:N0}" -f $FreeDiskPercent;
 
            $UsedDiskSizeGB = $DiskSizeGB - $FreeDiskSizeGB;
            $UsedDiskPercent = ($UsedDiskSizeGB / $DiskSizeGB) * 100;
            $UsedDiskPercent = "{0:N0}" -f $UsedDiskPercent;
 
            $FormattedDisk = "Disk " + $DiskID.ToString() + " " +
                $UsedDiskSizeGB.ToString() + "GB" + " / " + $DiskSizeGB.ToString() + "GB " +
                "(" + $UsedDiskPercent.ToString() + "%" + ")";
            $FormattedDisks.Add($FormattedDisk);
        }
    }
    else
    {
        $DiskID = (Get-CimInstance Win32_LogicalDisk).DeviceId;
 
        $FreeDiskSize = (Get-CimInstance Win32_LogicalDisk).FreeSpace
        $FreeDiskSizeGB = $FreeDiskSize / 1073741824;
        $FreeDiskSizeGB = "{0:N0}" -f $FreeDiskSizeGB;
 
        $DiskSize = (Get-CimInstance Win32_LogicalDisk).Size;
        $DiskSizeGB = $DiskSize / 1073741824;
        $DiskSizeGB = "{0:N0}" -f $DiskSizeGB;
 
        if ($DiskSize -gt 0)
        {
            $FreeDiskPercent = ($FreeDiskSizeGB / $DiskSizeGB) * 100;
            $FreeDiskPercent = "{0:N0}" -f $FreeDiskPercent;
 
            $UsedDiskSizeGB = $DiskSizeGB - $FreeDiskSizeGB;
            $UsedDiskPercent = ($UsedDiskSizeGB / $DiskSizeGB) * 100;
            $UsedDiskPercent = "{0:N0}" -f $UsedDiskPercent;
 
            $FormattedDisk = "Disk " + $DiskID.ToString() + " " +
                $UsedDiskSizeGB.ToString() + "GB" + " / " + $DiskSizeGB.ToString() + "GB " +
                "(" + $UsedDiskPercent.ToString() + "%" + ")";
            $FormattedDisks.Add($FormattedDisk);
        }
        else
        {
            $FormattedDisk = "Disk " + $DiskID.ToString() + " Empty";
            $FormattedDisks.Add($FormattedDisk);
        }
    }
 
    return $FormattedDisks;
}

4.3 启动时加载插件

为了启动时加载插件,我们需要创建一个 Microsoft.PowerShell_profile.ps1文件,放到 C:\Users\自己的用户名\Documents\PowerShell目录下,文件内容为:

Import-Module windows-screenfetch
Import-Module posh-git
Import-Module posh-sshell
Import-Module oh-my-posh
Import-Module git-aliases -DisableNameChecking
Import-Module PSReadLine
Import-Module InstallModuleFromGitHub
Import-Module Get-ChildItemColor
 
Screenfetch
Set-PoshPrompt -Theme Material # 设置主题为 Material
Set-PSReadlineKeyHandler -Key Tab -Function Complete # 设置 Tab 键补全
Set-PSReadLineKeyHandler -Key "Ctrl+d" -Function MenuComplete # 设置 Ctrl+d 为菜单补全和 Intellisense
Set-PSReadLineKeyHandler -Key "Ctrl+z" -Function Undo # 设置 Ctrl+z 为撤销
Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward # 设置向上键为后向搜索历史记录
Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward # 设置向下键为前向搜索历史纪录

5 总结

Windows Terminal的安装与美化到这里就已经结束了,其中 pwsh 安装的一些插件,如果大家想了解其具体用法,大家可以去官网查看。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容