使windows下powershell像linux terminal一样好用

  • 2020-05-22
  • 42
  • 0

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

1. 部分 Linux 命令扩展

使 powershell 使用 grep、awk等工具。

需要安装 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
    

我的配置文件蓝奏云链接,下载后自己修改文件名,效果例图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)

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

image-20200522100004271(figure 5)

4. 启动脚本

此处将文件列表配色、主题加载以及一个定位命令位置的函数放入全局启动脚本:

  1. 全局启动脚本位置: C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1,如果没有则自己新建,新建后定义一个变量存储启动脚本位置,方便后续 vim 编辑:
    $profile = "C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1"
    
    # 使用 `vim $profile` 编辑启动脚本
    
  2. 将上面加载文件列表配色、主题的代码写入,如:
    #Import-Module DirColors
    #Import-Module posh-git
    #Import-Module oh-my-posh
    Update-DirColors ~\dircolors\dircolors.256dark
    Set-Theme Paradox_changeColor
    
  3. 定位命令位置的函数:
    function which
    {
       $results =New-Object System.Collections.Generic.List[System.Object];
       foreach ($command in $args)
       {
           $path = (Get-Command $command).Source
           if ($path)
           {
               $results.Add($path);
           }
       }
       return $results;
    }
    

5. 自动补全

基本需求是可以像 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

在启动脚本 Profile 中绑定快捷键(全局配置在 C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1):

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)

6. 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 中定义变量来拆分自定义函数。

版权声明: 本网站所有资源采用BY-NC-SA 4.0协议进行授权,转载应当以相同方式注明文章来自:使windows下powershell像linux terminal一样好用 - 一方的天地

评论

还没有任何评论,你来说两句吧

发表评论

陕ICP备18010914号
知识共享许可协议
本作品由一方天地采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资源请尽快联系站长,本站会在24h内删除有争议的资源。 -