0. 前言

最近在折腾Windows下的开发环境,发现MSYS2是一个非常强大的工具,十分适合我这种喜欢极致轻量化的人
做此记录,以便日后查阅

主要优势

  • 轻量化(相比臃肿的MSVC)
  • Unix工具链的Windows实现
  • 完善的包管理系统

1. 安装MSYS2

环境选择

  • MSYS2 提供了不同的环境,这些环境之间的主要区别在于工具链和实现。如果不确定使用哪个,请选择 UCRT64
Name Prefix Toolchain Architecture C Library C++ Library
MSYS /usr gcc x86_64 cygwin libstdc++
UCRT64 /ucrt64 gcc x86_64 ucrt libstdc++
CLANG64 /clang64 llvm x86_64 ucrt libc++
CLANGARM64 /clangarm64 llvm aarch64 ucrt libc++
MINGW64 /mingw64 gcc x86_64 msvcrt libstdc++

Note:
路径说明
安装路径示例:C:\msys2\ucrt64
软件安装路径:对应环境的bin目录,例如:C:\msys2\ucrt64\bin

安装基本编译器:

1
2
3
4
5
6
7
#可选:使用tuna镜像
sed -i "s#https\?://mirror.msys2.org/#https://mirrors.tuna.tsinghua.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*

pacman -Syu # 更新软件包数据库并升级系统,需要重启MSYS2
pacman -S pactoys # 安装pactoys
pacboy -S toolchain zsh # 安装工具链、zsh
pacman -S git # 安装git

Note:

  • pactoys 是MSYS2提供的软件包管理工具,它功能与pacman基本相同,但是它可以直接安装对应环境的软件包,例如:UCRT64环境下pacboy -S gcc等价于pacman -S mingw-w64-ucrt-x86_64-gcc

2. 配置环境变量

环境变量注意:

  • ⚠️危险操作(避免冲突):
    不要将 /usr/bin 加入系统PATH

  • 推荐配置:
    只添加对应环境的bin目录:
    C:\msys2\ucrt64\bin

Windows Terminal配置

替代方案详见Step.7

  • Windows Terminal 的配置文件中,添加如下内容:
1
2
3
4
5
6
7
8
9
10
11
"list": 
[
{
"commandline": "C:\\msys2\\msys2_shell.cmd -defterm -here -no-start -ucrt64 -shell zsh",
"guid": "{fd57d26d-d3d0-448a-8bd5-e44632685d72}",
"hidden": false,
"icon": "C:\\msys2\\ucrt64.ico",
"name": "MSYS2 UCRT64",
"startingDirectory": "C:\\msys2\\home\\%USERNAME%"
}
]

Note:

  • 如果你不使用zsh,可以将-shell zsh修改为-shell bash等。
  • 你也可以在GUI中添加,以上参数分别对应:
    参数 说明
    commandline 命令行
    icon 图标
    name 名称
    startingDirectory 启动目录
  • 有关zsh的相关配置,这里不再赘述

3. 配置开发环境

  1. vscode 必备插件:

    • C/C++
    • C/C++ Extensions
    • CMake Tools
    • Code Runner
  2. C++插件配置(.vscode/c_cpp_properties.json)示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"C:/msys2/ucrt64/include/**"
],
"defines": [],
"compilerPath": "C:/msys2/ucrt64/bin/gcc.exe", //编译器路径
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
}
  1. vscode 必备插件:

    • Clangd
    • Cmake Tools
    • Code Runner
  2. 配置clangd与coderunner,在settings.json中添加如下内容:

1
2
3
4
5
6
7
{
"clangd.path": "C:\\msys2\\clang64\\bin\\clangd.exe",
"code-runner.executorMap": {
"c": "cd $dir && clang $fileName -o $fileNameWithoutExt && ./$fileNameWithoutExt",
"cpp": "cd $dir && clang++ $fileName -o $fileNameWithoutExt && ./$fileNameWithoutExt"
}
}

这部分内容算是提供一种思路 实际上我不太习惯neovim,所以没有深入研究(*/ω\*)

  1. 在msys2中安装neovim:
1
pacboy -S neovim
  1. 配置LazyVim:
1
2
3
4
git clone https://github.com/LazyVim/starter $env:LOCALAPPDATA\nvim
Remove-Item $env:LOCALAPPDATA\nvim\.git -Recurse -Force

nvim

等待安装即可

  1. 配置基本语言服务器:
    • 在Neovim中,按下<Space>cm,打开Mason
    • 选择clangd,按下i安装

推荐阅读
Dusty Phillips的模态编辑书籍:LazyVim for Ambitious Developers

4. Qt环境

  • MSYS2,输入以下命令安装Qt:
1
2
3
4
5
pacboy -S qt-creator # 安装qt-creator
pacboy -S qt6 # 安装qt6

#按需安装
pacboy -S qt6-static # 安装qt6静态库
  • PowerShell或MSYS2 中,运行以下命令,启动Qt Creator:
1
qtcreator

5. Node.js环境

使用nvm管理Node.js版本

1
2
3
4
5
6
nvm node_mirror https://npmmirror.com/mirrors/node/ # 设置nodejs镜像
nvm npm_mirror https://npmmirror.com/mirrors/npm/ # 设置npm镜像

nvm install lts # 安装最新的LTS版本

nvm use lts # 使用最新的LTS版本

关于配置文件详见:nvm wiki

6. Python环境

使用MiniConda管理Python版本

1
2
3
4
5
6
7
conda create -n myenv python=3.8 # 创建一个名为myenv的虚拟环境,并安装Python 3.8
conda activate myenv # 激活myenv虚拟环境
conda deactivate # 退出虚拟环境
conda install numpy # 在当前虚拟环境中安装numpy
conda remove numpy # 在当前虚拟环境中卸载numpy
conda env list # 列出所有虚拟环境
conda env remove -n myenv # 删除myenv虚拟环境

7. Powershell增强

使用 PowerShell 7

  • 提示符美化
  • PSReadLine
    • 历史命令预测
    • Tab菜单补全
    • 上下箭头历史搜索
  • 实用工具别名
    • 常用别名:’which’、’pnpmAL’、’pnpmALG’
    • Conda环境管理:’MiniConda’、’condaA’、’condaD’
    • MSYS2快捷启动:’msys2’
    • Eza用作ls,并沿用Linux使用习惯
      • 若不想使用Eza,请将 Eza Function(行73到末尾) 部分删除
  • 详细配置文件(记得替换Conda和Msys2路径):
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH\montys.omp.json" | Invoke-Expression #载入oh-my-posh主题

Set-Alias -Name 'which' -Value 'Get-Command' # 设置别名,将which命令映射到Get-Command命令

Set-PSReadLineOption -PredictionSource History # 设置PSReadLine的预测源为历史记录
Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete # 设置Tab键的键处理函数为MenuComplete,用于自动补全
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()
}

#Pnpm Aliases
Function pnpmAL {
pnpm approve-builds
}
Function pnpmALG {
pnpm approve-builds --global
}
#End Of Pnpm Aliases

#Explorer Aliases
Function Exf {
param(
[Parameter(Mandatory = $false)]
[string]$Path
)
if ($Path) {
explorer $Path
} else {
explorer .
}
}
#End Of Explorer Aliases

#Conda Aliases
Function MiniConda {
param(
[Parameter(Mandatory = $false)]
[string]$EnvName
)
& 'D:\MiniConda\shell\condabin\conda-hook.ps1' ##修改'D:\MiniConda'为你的MiniConda路径
conda activate 'D:\MiniConda' ##修改'D:\MiniConda'为你的MiniConda路径
if ($EnvName) {
conda activate $EnvName
}
}

Function condaA {
param(
[Parameter(Mandatory = $true)]
[string]$EnvName
)
conda activate $EnvName
}

Function condaD {
param(
[Parameter(Mandatory = $false)]
[string]$EnvName
)
if ($EnvName) {
conda deactivate $EnvName
} else {
conda deactivate
}
}
#End Of Conda Aliases

#MSYS2 Functions
Function Msys2 {
& 'D:\MSYS2\msys2_shell.cmd' -defterm -no-start -clang64 -shell zsh ##修改'D:\MSYS2'为你的msys2路径;修改-clang64为你的环境
}
#End Of MSYS2 Functions

#Eza Functions
$eza_params = @(
'--git', '--icons', '--group', '--group-directories-first',
'--time-style=long-iso', '--color-scale=all'
)

Function ezals {
param(
[Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)]
[string[]]$EParams = @()
)
eza ($eza_params + $EParams)
}

Set-Alias -Name 'ls' -Value 'ezals'

Function l {
param(
[Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)]
[string[]]$EParams = @()
)
eza --git-ignore ($eza_params + $EParams)
}

Function ll {
param(
[Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)]
[string[]]$EParams = @()
)
eza --all --header --long ($eza_params + $EParams)
}

Function llm {
param(
[Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)]
[string[]]$EParams = @()
)
eza --all --header --long --sort=modified ($eza_params + $EParams)
}

Function la {
param(
[Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)]
[string[]]$EParams = @()
)
eza -lbhHigUmuSa ($eza_params + $EParams)
}

Function lx {
param(
[Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)]
[string[]]$EParams = @()
)
eza -lbhHigUmuSa@ ($eza_params + $EParams)
}

Function lt {
param(
[Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)]
[string[]]$EParams = @()
)
eza --tree ($eza_params + $EParams)
}

Function tree {
param(
[Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)]
[string[]]$EParams = @()
)
eza --tree ($eza_params + $EParams)
}
#End Of Eza Functions

8. 结语

完成后,你将获得:

  • ✅ MSYS2
  • ✅ C/C++
  • ✅ Qt
  • ✅ Node.js
  • ✅ Python

记录完