Windows 命令行相关配置
常用 shell
一直以来 windows 的命令行方案都很多,个人感觉都有不太好用的点,怎么配置也是仁者见仁智者见智的一个事情。先总结一下常用shell 方案
powershell
官方shell,各种工具库支持最全,缺点自带的命令太长,以至于完全没有日常使用的想法。msys2
windows 上的类 unix 环境,基于现代 Cygwin (POSIX兼容层) 和 MinGW-w64(工具包)。确实像 unix,一般命令可以无缝迁移。缺点是兼容性,需要手动配置很多东西,比如是否继承 windows 环境变量,不继承的话不想维护两份环境,继承了又容易冲突。git bash
msys2 阉割版,无包管理,多了 git。wsl
完全的 Linux 子系统,但太占内存。
方案选择
我需求
- 常用命令必须是类 unix 命令
- 有包管理器,各类命令行工具配置友好且兼容性不错。
- 不要太占内存
结果发现这就是经典的三圈相交,没有任何一个常用方案能满足以上要求。
最后,我决定用 powershell。除了第一条外都满足。后面两条属于难以解决的硬伤,而第一条可以编写脚本,将常用的命令模拟。
powershell 配置流程
包含工具包、终端美化。
- Install the latest Powershell Core
- Install git-bash for basic bash and git tools
- Install Windows Terminal and open Powershell
- Install PSReadLine
- Install posh-git
- Install oh-my-posh for showing extra info in term.
- Install gsudo for softlink
- Install eza for listing
- open
$PROFILE
in powershell, append the contents of Microsoft.PowerShell_profile.ps1
大致介绍一下用途。
- git-bash,一系列类 unix 工具,git 一类的
- Windows Terminal,微软的终端。我拒绝终端用 electron 去套的……
- PSReadLine,改变一系列 powershell 的行为。比如复制粘贴的快捷键。可惜在 vscode 里会没用,只能右键粘贴。
- posh-git,显示 git 的状态
- oh-my-posh,美化。具体主题可能需要会自己改一下,要么丑,要么不支持提示 conda 环境或者 npm 环境。
- gsudo,提权,类似 unix 的 sudo。可能运行时会被杀软报毒,需要加入信任区。
- eza,2024年了,终于有了一个像样的 ls 替代……
powershell 的用户配置文件输入 $PROFILE
就能找到。
我的配置文件上传到了 Microsoft.PowerShell_profile.ps1。需要挂代理打开。配置文件包含 ls
ln
open
grep
which
等命令模拟。powershell 的缩写默认支持了 mv
cat
rm
等命令,配合起来日常基本够用。
终端代理
我在配置文件中设置了proxy
和unproxy
函数,以快速设置与取消终端的代理连接。自己改下端口就能用。因为我自己习惯上不开系统代理,都是软件内的 http 连接。
# Proxy Togglers
function proxy {
$portInUse = netstat -ano | findstr "LISTENING" | findstr "7890"
$portInUse2 = netstat -ano | findstr "LISTENING" | findstr "10808"
if ($portInUse -ne $null) {
$env:HTTP_PROXY = "socks5://127.0.0.1:7890"
$env:HTTPS_PROXY = "socks5://127.0.0.1:7890"
Write-Host "Proxy set to socks port 7890"
} elseif ($portInUse2 -ne $null) {
$env:HTTP_PROXY = "socks5://127.0.0.1:10808"
$env:HTTPS_PROXY = "socks5://127.0.0.1:10808"
Write-Host "Proxy set to socks port 10808"
} else {
$env:HTTP_PROXY = "socks5://127.0.0.1:1080"
$env:HTTPS_PROXY = "socks5://127.0.0.1:1080"
Write-Host "Proxy set to socks port "
}
}
function unproxy {
$env:HTTP_PROXY = ""
$env:HTTPS_PROXY = ""
}
其他常用工具
-
winget:自带的包管理器,命令行工具都是这个装的。部分用的 scoop,非常少。还有的直接用的官网 setup。
-
nvim:命令行编辑器,vim 的替代品。我用的是发行版 AstroNvim。之前也有自己折腾插件,太懒得维护了,算了。
-
nodejs:JS 环境,nvim 的插件要用,开发也要用
-
zoxide:快速跳转目录。最有用的功能没有之一。类似 unix 的 autojump
-
Terminal-Icons:ls 命令加 icon,还能解决 ls 不高亮的问题。但是,颜色很丑。但是,我不也想再配置了,配置真的心好累。
-
ripgrep:类似 grep 的用法。我在模拟 grep 命令时只是单纯替换成了 findstr,真的 grep 建议用 ripgrep (rg) 替代。nvim 的 telescope 一些插件也会用到。
安装脚本汇总:
winget install conda
winget install neovim
git clone --depth 1 https://github.com/AstroNvim/AstroNvim ~/.config/nvim
winget install gerardog.gsudo
winget install OpenJS.NodeJSLTS
Install-Module -Name Terminal-Icons -Repository PSGallery; Import-Module -Name Terminal-Icons
# z-jump
winget install zoxide # z-jump, see https://github.com/ajeetdsouza/zoxide
winget install BurntSushi.ripgrep.MSVC # grep 的完全替代品
ZSH
有关 zsh 相关的配置,我放在了 Windows 命令行相关配置之 msys2+zsh+zi 。