powershell自动补全与主题
主要描述 powershell 美化、自动补全,以及配合 git-bash 使用部分 Linux 命令。
文档:
1. 配合git-bash
使 powershell 使用 grep、awk、which…。
需要安装 Git for windows(关于 git-bash 安装 zsh 等的记录见 git-bash安装),PATH 中除了 git 所需的 Git
、Git\cmd
之外,额外加入 Git\usr\bin
即可,如我的完整路径为:
D:\Git
D:\Git\cmd
D:\Git\usr\bin
这样就可以使用 grep 等等了,如下面提取 wlan 的 ip (图2):
ipconfig | grep -azio 'wlan.*' | grep -ai 'v4' -m 1 | awk '{print $NF}'
解释:
grep 参数
-a
: 指定二进制的类型为 text,-z
: 使结束符为文末,而不是换行符,用来全文匹配,-i
: 忽略大小写,-o
: 仅输出匹配部分,-m 1
: 显示第一个匹配。awk: 默认以 空格和 TAB 分割,
'{print $NF}'
表示打印每行分割后的最后一项,$NF
为其内部变量,代表最后一项。
2. vim
使用 Git 中附带的 VIM,其 RUNTIME 在: \usr\share\vim\vim82
,其可以自动检测到,故无所配置此项。
用户自定义配置在 $HOME\.vimrc
,写入自己配置即可。
关于 vim 配置有以下三点需要额外增加:
关于 Vim E303: Unable to open swap file for “[No Name]”, recovery impossible 问题的解决方案(均测试通过)
更改缓存和备份文件目录,引自 Disabling swap files creation in vim 的回答: Set the following variables in .vimrc or /etc/vimrc to make vim put swap (需要手动创建这三个文件夹):
set backupdir=~/.vim/backup// set directory=~/.vim/swap// set undodir=~/.vim/undo//
禁止缓存和备份文件,引自 Disable any kind of backup/swap file?:
set nobackup set noswapfile
<ctrl+left>与<ctrl+right> 无法以 word 移动解决方案(引自 control-left and control-right not working in vim, within a screen session 的回答 My
.vimrc
in Ubuntu to handle ctrl arrow keys):map <Esc>[1;5A <C-Up> map <Esc>[1;5B <C-Down> map <Esc>[1;5D <C-Left> map <Esc>[1;5C <C-Right> cmap <Esc>[1;5A <C-Up> cmap <Esc>[1;5B <C-Down> cmap <Esc>[1;5D <C-Left> cmap <Esc>[1;5C <C-Right> map <Esc>[1;2D <S-Left> map <Esc>[1;2C <S-Right> cmap <Esc>[1;2D <S-Left> cmap <Esc>[1;2C <S-Right>
中文乱码,设置编码即可:
set encoding=utf-8 set fileencoding=utf-8
3. 主题
这一部分的主题配置参考自 PowerShell 美化指南 。
以下过程推荐在 powershell 管理员权限下进行,这样会将模块放到全局用户的 C:\Program Files\WindowsPowerShell\Modules
。
步骤(有需要选择“是否”的,选择“是”):
使用 colortool 更改控制台配色方案。colortool 官方下载链接: Color Tool April 2019,iTerm2 配色方案: mbadolato/iTerm2-Color-Schemes,在 schemes 下下载自己喜欢的配色方案,下载后把 colortool 和配色文件放在一起,在当前文件夹打开 powershell,如我选择 DimmedMonokai,则输入以下:
.\ColorTool.exe -b .\DimmedMonokai.itermcolors
输入完成之后右击标题栏 –> 属性 –> 确定。上面文件就可以删除了。 完成之后需要再微调下属性中的背景颜色,否则背景色很奇怪。
信任 PS 官方库:
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
安装 PSColor 以彩色显示文件列表:
Install-Module PSColor
加载 PSColor,首次加载时需要设置脚本执行策略:
Set-ExecutionPolicy -Scope CurrentUser Bypass # 加载策略更改 Import-Module PSColor # 加载测试 PSColor
安装 DirColors 以更改 PSColor 彩色文件列表的配色:
Install-Module DirColors
DirColors 配色方案 seebi/dircolors-solarized,例如我下载 dircolors.256dark,在 $home 路径下新建 .dircolors 文件夹,复制配色文件到此处,生效配色方案:
Update-DirColors ~\.dircolors\dircolors.256dark
命令行 git 信息:
Install-Module posh-git
oh-my-posh,Powershell 的主题,类似 ohmyzsh,安装:
Set-ExecutionPolicy Bypass -Scope Process -Force; Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://ohmyposh.dev/install.ps1'))
配置主题:
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/ys.omp.json" | Invoke-Expression
主题和配色配置只在当前会话生效,建议写入到全局启动脚本中(见下面的<6. 启动脚本>)
其他常用命令:
# 查看全部 profile
$PROFILE | Select-Object *
# 查看已安装 module 列表
Get-InstalledModule
# 查看某个已安装 module 的所有版本
Get-InstalledModule -Name PSReadLine -AllVersions
# 查看某个已安装 module 的详情
get-installedModule -Name PSReadLine | Select-Object *
4. 自动补全
基本需求是可以像 zsh-autosuggestions 那样提示和补全历史命令。
此功能由 PowerShell/PSReadLine issue 687: Fish-like autocompletion 发起讨论,并在 issue 1468: Predictive IntelliSense 中得到实现,有时间的伙伴可以点击链接去查看作者的解答,我这里简述下 1468 中完成的功能:1. 完成提示和补全历史命令;2. 增加动态提示函数以及参数。
将 PSReadLine 更新到 2.1.0-beta1 以上即可:
Install-Module -Name PowerShellGet -Force # 升级 PSGEt
Install-Module -Name PSReadLine -AllowPrerelease -Force # 升级 PSReadLine
在全局启动脚本中(见下面的<6. 启动脚本>)加入快捷键绑定:
Set-PSReadLineKeyHandler -Key "Ctrl+d" -Function MenuComplete
Set-PSReadLineKeyHandler -Key "Ctrl+f" -Function ForwardWord
Set-PSReadLineKeyHandler -Key "Ctrl+b" -Function BackwardWord
Set-PSReadLineKeyHandler -Key "Ctrl+z" -Function Undo
Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward
在加入颜色更改,此处修改提示的颜色为暗绿色(默认的浅灰色在 vscode 暗色主题下阅读困难):
# 当前版本 (2.2.6) 此配置已被移除
# Set-PSReadLineOption -Colors @{ Prediction = '#2F7004'}
5. sudo 提权
Linux 终端下比较便捷的一点就是让当前用户临时具有 root 权限,插件 gerardog/gsudo 可以实现 cmd/powershell 的提权,下面内容均取自作者 repo。
通过 powershell 安装:
PowerShell -Command "Set-ExecutionPolicy RemoteSigned -scope Process; iwr -useb https://raw.githubusercontent.com/gerardog/gsudo/master/installgsudo.ps1 | iex"
其命令是 gsudo
,在首次执行时其可以提示是否创建 sudo
的软链接。
其特性:
- 默认在当前窗口提权。(参数
-n
可以新打开窗口); - 权限缓存:UAC 弹窗一次后,几分钟内再次提权不再 UAC 弹窗(0.7 版本下我测试未起效);
- 可直接追加操作,如:
gsudo touch testSudo.md
目前已知问题:直接追加的操作不支持自定义函数,如: 。相关解决方案见 repo 中发起 issue: Cannot call the function defined in profile.sudo TestUserFunc
会报错
6. 启动脚本
综上,此处将文件列表配色、主题加载、自动补全快捷键、自动补全背景色的配置加入全局启动脚本:
# 使用 `vim $PROFILE.AllUsersAllHosts` 编辑全局启动脚本
# 使用 `vim $hostfile` 编辑 hosts 文件
## variables
$hostfile = "C:\Windows\System32\drivers\etc\hosts"
## Prediction from history
Set-PSReadLineOption -PredictionSource History
# autosuggestion key bind
Set-PSReadLineKeyHandler -Key "Ctrl+d" -Function MenuComplete
Set-PSReadLineKeyHandler -Key "Ctrl+f" -Function ForwardWord
Set-PSReadLineKeyHandler -Key "Ctrl+b" -Function BackwardWord
Set-PSReadLineKeyHandler -Key "Ctrl+z" -Function Undo
Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward
# gsudo
Import-Module 'gsudoModule'
## terminal theme
#Import-Module DirColors
#Import-Module posh-git
Update-DirColors ~/.dircolors/dircolors.256dark
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/ys.omp.json" | Invoke-Expression