使windows下powershell像linux terminal一样好用
本文最后更新于 1207 天前,其中的信息可能已经有所发展或是发生改变。

主要描述 powershell 的 部分 Linux 命令扩展、主题以及提高效率的插件。为了方便后续使用 Git 中附带的 vim 编辑配置文件,此处先介绍部分 Linux 命令扩展。

1. 部分 Linux 命令扩展

使 powershell 使用 grep、awk、which等工具。

需要安装 Git,PATH 中除了 git 所需的 GitGit\cmd 之外,额外加入 Git\usr\bin 即可,如我的路径为 D:\Git\usr\bin,则环境变量如下图1:

image-20200520205918784

(figure 1)

这样就可以使用 grep 等等了,如下面提取 wlan 的 ip (图2):

ipconfig | grep -azio 'wlan.*' | grep -ai 'v4' -m 1 | awk '{print $NF}'

image-20200520212817045

(figure 2)

解释:

grep 参数 -a : 指定二进制的类型为 text,-z: 使结束符为文末,而不是换行符,用来全文匹配,-i: 忽略大小写,-o: 仅输出匹配部分,-m 1: 显示第一个匹配。

awk: 默认以 空格和 TAB 分割,'{print $NF}' 表示打印每行分割后的最后一项,$NF 为其内部变量,代表最后一项。

2. vim

使用 Git 中附带的 VIM,其 RUNTIME 在: GitInstalledPath\usr\share\vim\vim82,其可以自动检测到,故无所配置此项。

用户自定义配置在 $HOME\_vimrc,写入自己配置即可。

关于 vim 配置有以下三点需要额外增加:

  1. 关于 Vim E303: Unable to open swap file for “[No Name]”, recovery impossible 问题的解决方案(均测试通过)
  2. <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>
    
  3. 中文乱码,设置编码即可:
    set encoding=utf-8
    set fileencoding=utf-8
    

我的 vim 配置文件蓝奏云链接,下载后自己修改文件名,效果例图3:

image-20200522095636496

(figure 3)

3. 主题

这一部分的主题配置参考自 PowerShell 美化指南

以下过程推荐在 powershell 管理员权限下进行,这样会将模块放到全局用户的 C:\Program Files\WindowsPowerShell\Modules,而不是文档库(一般 C盘是固态盘,文档库所在盘不是固态盘,放在固态盘加载速度会快一点)。

步骤(有需要选择“是否”的,选择“是”):

  1. 使用 colortool 更改控制台配色方案。colortool 官方下载链接: Color Tool April 2019,iTerm2 配色方案: mbadolato/iTerm2-Color-Schemes,在 schemes 下下载自己喜欢的配色方案,下载后把 colortool 和配色文件放在一起,在当前文件夹打开 powershell,如我选择 DimmedMonokai,则输入以下:
    .\ColorTool.exe -b .\DimmedMonokai.itermcolors
    

    输入完成之后右击标题栏 –> 属性 –> 确定。上面文件就可以删除了。
    完成之后需要再微调下属性中的背景颜色,否则背景色很奇怪。

  2. 信任 PS 官方库:

    Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
    
  3. 安装 PSColor 以彩色显示文件列表:
    Install-Module PSColor
    

    加载 PSColor,首次加载时需要设置脚本执行策略:

    Set-ExecutionPolicy -Scope CurrentUser Bypass  # 加载策略更改
    Import-Module PSColor  # 加载测试 PSColor
    
  4. 安装 DirColors 以更改 PSColor 彩色文件列表的配色:
    Install-Module DirColors
    

    DirColors 配色方案 seebi/dircolors-solarized,例如我下载 dircolors.256dark,在 $home 路径下新建 dircolors 文件夹,复制配色文件到此处,生效配色方案:

    Update-DirColors ~\dircolors\dircolors.256dark
    
  5. 命令行主题,类似 ohmyzsh,Powershell 的主题引擎为 JanDeDobbeleer/oh-my-posh,安装:
    Install-Module posh-git  # 安装 ohmyposh 依赖
    Install-Module oh-my-posh  # 安装 ohmyposh
    

    配置主题:

    Set-Theme desiredTheme
    

    主题在 oh-my-posh 的安装路径的 Theme 下,我的主题是在 Paradox 基础上修改了自己喜欢的颜色以及添加了起始符,点击此处下载。效果如下图4:

    image-20200521174510125
    (figure 4)

主题和配色需要每次都执行,比较麻烦,此处将其写入到全局启动脚本中(见下面的<6. 启动脚本>),效果如下例图 5:

image-20200522100004271
(figure 5)

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 暗色主题下阅读困难):

Set-PSReadLineOption -Colors @{ Prediction = '#2F7004'}

效果如下例图6,输入 p 后,会根据输入历史以暗绿色提供建议:

image-20200522104431139

(figure 6)

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

目前已知 BUG:直接追加的操作不支持自定义函数,如: sudo TestUserFunc 会报错。我已经在其 repo 中发起 issue: Cannot call the function defined in profile,作者给的建议是不要在启动脚本放太多自定义函数,因为其会导致加载缓慢,针对提权后调用自定义函数有两种方案:

  • 先 sudo,然后再执行自定义函数;
  • 在 profile 中定义变量来拆分自定义函数。

6. 启动脚本

综上,此处将文件列表配色、主题加载、自动补全快捷键、自动补全背景色的配置加入全局启动脚本:

  1. 全局启动脚本位置: C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1,如果没有则自己新建,新建后定义一个变量存储启动脚本位置,方便后续 vim 编辑,此处再加入 hosts 文件的位置:
    $profile = "C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1"
    $hostfile = "C:\Windows\System32\drivers\etc\hosts"
    
    # 使用 `vim $profile` 编辑启动脚本
    # 使用 `vim $hostfile` 编辑 hosts 文件
    
  2. 将上面加载文件列表配色、主题的代码写入,如:
    #Import-Module DirColors
    #Import-Module posh-git
    #Import-Module oh-my-posh
    Update-DirColors ~\dircolors\dircolors.256dark
    Set-Theme Paradox_changeColor
    
  3. 自动补全快捷键、自动补全背景色的配置,见<4. 自动补全>,此处不再粘贴。

最终我的完整配置文件如下图 7:

image-20200611170307461

(figure 7)

评论

  1. root
    3年前
    2020-8-15 15:10:01

    更新:
    powerline 2.1.0-beta2 需要设置预测源:

    # Prediction from history
    Set-PSReadLineOption -PredictionSource History

    更多见官方 repo changeLog

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇