powershell 的 tmux/screen 替代品

powershell 的 tmux/screen 替代品

有没有可以在 Windows 上使用 Powershell 的 tmux/screen 替代品?我知道 Powerscreen,但它似乎已经停用很长时间了。Cygwin 不能与 Powershell 一起使用,对吧?Console2 是非常穷人的解决方案。

还有其他想法吗?

答案1

尽管最初提出这个问题时这是不可能的,但有了适用于 Linux 的 Windows 子系统,现在可以使用“真实的”tmux来管理 PowerShell 窗口。

简洁版本

在已安装的 WSL 实例中tmux,使用以下命令进行设置~/.tmux.conf

set -g default-command "cd $(pwsh.exe -c 'Write-Host -NoNewLine \$env:userprofile' | xargs -0 wslpath); exec pwsh.exe --nologo"
set-window-option -g automatic-rename off
bind c new-window -n "PowerShell"

优点和特点

大部分您通常期望的功能tmux,包括:

  • 完整(?)热键支持
  • PowerShell 的回滚/复制模式
  • 还有很多

限制

  • 如果原始会话断开,重新连接将导致管道断裂。但是,只要原始会话保持打开状态,您就可以同时连接多个客户端。

更多细节

有几种方法可以进行设置,但目前我采用以下方法:

  • 安装适用于 Linux 的 Windows 子系统。您不必启用 WSL2;只需 WSL v1 即可完成此操作(可能比 WSL2 更好)。

  • 安装 Alpine Linux 发行版。我使用它作为 tmux 功能的基础,因为它的开销非常小(包括 在内的开销不到 12MB tmux)。

  • 接下来的几个步骤是可选的。我为 PowerShell tmux 创建了一个新的克隆 WSL 实例。您可以只使用默认的 Alpine 实例,但我喜欢拥有单一用途的 WSL 实例,类似于 Docker 容器。

    mkdir $env:userprofile\Documents\WSL\instances # Or wherever you want to set this up
    mkdir $env:userprofile\Documents\WSL\images
    cd $env:userprofile\Documents\WSL
    wsl --export Alpine .\images\alpine_base.tar
    mkdir .\instances\posh_tmux
    wsl --import posh_tmux .\instances\posh_tmux .\images\alpine_base.tar --version 1 
    
  • 使用 root 身份启动 WSL 实例wsl -d posh_tmux -u root

  • adduser tmux,并设置密码。

  • /etc/wsl.conf通过创建以下内容来设置实例的默认用户:

    [user]
    default = tmux
    
  • apk add tmux安装tmux

  • 退出会话,重新启动wsl ~ -d tmux(省略用户名,因为它现在默认为 tmux 用户)

  • ~/.tmux.conf使用以下内容创建:

    set -g default-command "cd $(pwsh.exe -c 'Write-Host -NoNewLine \$env:userprofile' | xargs -0 wslpath); exec pwsh.exe --nologo"
    set-window-option -g automatic-rename off
    bind c new-window -n "PowerShell"
    
    # Give this tmux a "PowerShell blue" color to differentiate it
    set -g status-bg blue
    
    # Use UTF8
    set -qg utf8
    set-window-option -qg utf8 on
    
    # Recommended, to avoid the Ctrl+B finger-gymnastics
    # Change default prefix to Screen's
    unbind C-b
    set-option -g prefix C-a
    bind-key C-a send-prefix
    bind-key -n C-b send-prefix
    bind C-a last-window
    
    # Optional
    # split panes using - and |
    bind | split-window -h
    bind - split-window -v
    unbind '"'
    unbind %
    
    set -g history-limit 10000
    
    set -g default-terminal "screen-256color"
    
  • ~/.profile使用以下内容创建:

    if tmux has-session -t=posh; then
      exec tmux attach-session -t posh
    else
      exec tmux new-session -s posh -n PowerShell
    fi
    
  • 在 Windows Terminal、ConEmu 或您喜欢的任何方式中设置PowerShell Core tmux配置文件。启动命令很简单wsl -d tmux_posh

  • 如果您需要在不进入 tmux/PowerShell 的情况下访问实例(例如,进入sudo apk upgrade或 编辑配置),请改用wsl ~ -d tmux_posh -e sh(或wsl ~ -d tmux_posh -u root)启动。

  • 您可以tmux通过 访问 PowerShell 中的命令wsl -d tmux_posh -e tmux <tmux_command。例如,wsl -d tmux_posh -e tmux rename-window host1。TODO:tmux为此创建一个包装器 PowerShell 函数。

  • TODO:PowerShell 提示函数将窗口名称动态设置为最后执行的命令

答案2

它与 tmux 或 screen 并不完全类似,但 PowerShell 具有管理远程会话的功能。Ed Wilson 写了一篇关于它的博客文章,标题为了解如何管理远程 PowerShell 会话,这可能会有所帮助。另请参阅about_PSSessions PowerShell 帮助主题

你能详细说一下你想要实现的目标吗?

答案3

试试 Cmder。它太棒了!它甚至与 Windows 版 git 捆绑在一起。 https://cmder.app/

答案4

我已经有一段时间没用过 Windows 了,但刚刚偶然发现https://wezfurlong.org/wezterm/features.html很符合我的要求

除其他外,它还有标签和垂直/水平分割

相关内容