Windows 10 CMD/Powershell 仅在放大控制台时调整缓冲区 window;不是收缩的时候。使固定?

Windows 10 CMD/Powershell Buffer adjusts only when enlarging the console window; not when shrinking. Fix?

我有一个看似简单的问题,但我的 google-fu 却让我失望了:

我最近开始在我的工作流程中更多地使用 CMD / Powershell,用于无数事情,包括 VIM、编译和 Bash (Window' s Ubuntu 子系统)。这些都是 window 的 shell 界面中的 运行(如果这是正确的术语?与 Console 2/ConEmu 不同,它们只是 shell 的包装器)并且不要改变它的行为)。

这是我的问题: 将 shell window 大小调整得更大时,缓冲区会调整大小以适应它。 但是,当重新调整 window 大小时,缓冲区仍然很大并且出现滚动条,我必须使用滚动条来查看我的整个 window.

我不想要这种行为的后半部分,因为它会导致像 VIM 这样的程序出现问题,而且很烦人。

我实际上喜欢 windows 10 中的旧式控制台行为,就好像它不能动态调整大小一样,它可以最小化或最大化,并且缓冲区大小会随这两个操作一起调整。但是,我不能简单地启用此选项,因为 Bash 等某些东西需要现代 windows 10 控制台,而在传统模式下不会 运行。

对于 CMD 或 Powershell 或 运行 Power[=,是否有任何其他方法可以正确调整缓冲区大小以及 window 的大小33=] 与 CMD 的设置不同(所以我可以在一个中启用旧版控制台,而在另一个中不启用——它们目前似乎共享相同的设置)。

此外,如果有任何替代修复程序或控制台 shell 可以解决此问题,请随时提出这些建议!我已经尝试过 Mintty,它几乎是完美的,但是弄乱了我在 vim.

中的 register/clipboard 设置
  • 如您所见,在 Windows10 上切换到 legacy 控制台(通过不幸的是,控制台快捷方式的属性对话框、选项卡选项、复选框 Use legacy console (requires relaunch)a global 设置 (影响所有未来的控制台 windows, 不考虑其中的 shell 运行).

  • Windows 10 的 new console 在您使用 调整大小时总是将缓冲区宽度设置为 window 宽度mouse,避免水平滚动的需要(而当您 window narrower使用鼠标,此时会出现一个水平滚动条;顺便说一句:旧版控制台不允许使用鼠标 window 更宽

    • 如果您的快捷方式文件在未处于传统模式时不以这种方式运行,重新创建快捷方式文件

注意:上面的 legacynew console 指的是 legacy 的 modes基于 conhost.exe 的控制台 windows 总体而言,与其现代继任者 Windows Terminal.

不同

因此,此答案的其余部分仅在满足以下任一条件时才有意义:

  • 使用 旧版 控制台 - 要么是因为您在 Windows 10 或者因为你 运行 正在使用 Windows 8.1 或更低版本 - 并且想要一个 简单命令来修复水平滚动问题 .

  • 你想通过快捷方式文件修改控制台启动的尺寸window .

  • 您对脚本感兴趣,该脚本以编程方式调整控制台大小window


没有简单的 UI 修复来避免在使用鼠标缩小 window 时出现水平滚动 - 除了使用 window 的系统菜单 Properties使缓冲区宽度与 window 匹配的对话框,但这很麻烦。

这是您可以在 mouse-based 调整大小后 运行 修复水平滚动问题的命令:

  • PowerShell:

      [console]::BufferWidth = [console]::WindowWidth
    

    所以你不必每次都输入这个,把它放在一个函数中,比如 fixwin,然后将它添加到你的 $PROFILE(初始化脚本):

      function fixwin { [console]::BufferWidth = [console]::WindowWidth }
    
  • cmd.exe:

    使用 mode 不是 一个选项,因为它会将您的缓冲区 height 设置为 window高度也是如此,所以你会失去你的 scroll-back 缓冲区 - 见 this answer.

    但是,您可以使用 DOSKEY 宏调用上述 PowerShell 命令 ad-hoc:

      doskey fixwin=powershell -noprofile -command "[console]::bufferwidth = [console]::windowwidth"
    

    因此您不必在每个会话中都定义宏,将命令保存到 批处理文件,例如 .cmdrc.cmd 文件夹 %USERPROFILE% ],然后修改你用来启动cmd.exe的快捷方式文件如下:

    • 打开快捷方式文件的属性对话框(通过快捷方式菜单,按right-clicking;对于任务栏项目,right-click对于taskbar-related快捷方式菜单,然后right-click 表示基础快捷方式文件的倒数第二个项目)。

    • 在“快捷方式”选项卡中,将文本框 Target 的现有内容替换为以下内容:
      %windir%\system32\cmd.exe /k "%USERPROFILE%\.cmdrc.cmd"


作为事后调整 window 大小的替代方法,您可以使用 快捷方式文件 启动具有预配置尺寸的控制台,适用于旧版和新版游戏机:

  • 创建指向感兴趣的可执行文件(cmd.exepowershell.exe)的快捷方式文件。

  • 启动快捷方式。

  • 使用 window 系统菜单的 Properties 对话框来设置所需的 window 和缓冲区尺寸。

下次启动该快捷方式文件时,之前配置的维度应该会再次生效。

要同时记住 window 位置 ,根据需要定位 window,打开系统菜单的 Properties 对话框(再次),取消选中 Let system position window,然后单击 OK


cmd.exe / PowerShell script 用于修复 buffer-width 问题 and/or 以编程方式调整 window:

如果您按照以下说明操作,您将能够:

  • 鼠标点击后直接执行rw(for resize window)缩小 window,使缓冲区宽度与 window 宽度相同。

  • 或者,调用 rw <new-width> [<new-height>] 以编程方式调整 window 的大小,这也会将缓冲区宽度设置为 window 宽度。

说明:

  • %PATH% 中选择或添加一个目录来放置脚本 belw.

  • 创建包装器批处理文件 rw.cmd,内容如下:

      @powershell.exe -executionpolicy unrestricted -noprofile -file "%~dpn0.ps1" %*
    
  • 使用以下内容创建 PowerShell 脚本 rw.ps1(忽略损坏的 syntax-highlighting):

<#
.SYNOPSIS
Resizes the console window.

.DESCRIPTION
Resizes the current console window to the specified width (in columns)
and/or height (in lines.

Note that the window position doesn't change; i.e., the top-left corner of
the window remains in place, and the width / height expands or shrinks.

To only change the width, specify a single value; e.g.: 120

To only change the height, specify 0 for the width; e.g.: 0 60

Specify neither if you don't want to resize, but want to ensure that the
buffer width is set to the same value as the window width, so as to avoid
the need for horizontal scrolling.
This is convenient after having resized the window with the mouse.

Note that specifying values that are too large causes an error.


.PARAMETER Width
The new width (in columns) to resize the current console window to.

.PARAMETER Height
The new height (in lines) to resize the current console window to.

.PARAMETER KeepBufferWidth
By default, the buffer width is always set to the resulting window width, 
so as to avoid the need for horizontal scrolling. 
Use this switch if you want to keep the current buffer width.

.EXAMPLE
> rw 100 50
Makes the current console window 100 columns wide, and 50 lines tall.

> rw 100
Makes the current console window 100 columns, without changing the height.

> rw 0 70
Makes the current console window 70 lines tall, without changing the width.

> rw
Doesn't perform resizing, but ensures that the buffer width equals the
window width, so as to prevent horizontal scrolling.

#>

[cmdletbinding()]
param(
  [uint16] $Width,
  [uint16] $Height, 
  [switch] $KeepBufferWidth
)

if ($width) { [console]::WindowWidth = $width }
if ($height) { [console]::WindowHeight = $height }
# Unless asked not to, always set the buffer width to the window width to 
# prevent horizontal scrolling.
if (-not $KeepBufferWidth) { [console]::BufferWidth = [console]::WindowWidth }