ksh 的 vi 模式有时会损坏编辑行 - GitHub 上的新版本修复了它

问题描述 投票:0回答:4

原始问题:

我注意到,有时当尝试编辑历史记录中的一行以重新运行命令时,ksh 会混淆该行并将光标向上移动一行。真的很奇怪。

  • 首先发现只是排长队才出现问题
  • 调试,发现
    COLUMNS
    变量未设置(非常确定
    Terminal
    用来设置它)

我可以手动将其设置为某个大数字,但随后出现了其他问题。

我找不到任何方法来强制终端在窗口大小调整时更新

COLUMNS
值 - 我该怎么做?

编辑:2023 年 4 月 Ventura 破坏了我的修复,因此窗口大小调整仍然使编辑命令行变得困难。

根据 Trey Valenta 的以下回答,我发现 Martijn Dekker 支持废弃的 ATT 源,并且迄今为止已经发布了 4 个版本; 点击此处获取链接

与 ATT 构建系统不同,这个东西真的很容易使用:

  • 将 src 下载为 zip 文件
  • 解压它
  • 使用 Markdown 阅读器打开 README.md
  • 按照说明进行操作,对我来说是:
    • sh bin/package make
    • sh bin/package test # 不必要,我是出于好奇才这么做的
    • bin/软件包安装/usr/local
    • 编辑终端首选项,以便从 /usr/local/bin 启动 ksh

确保编辑您的个人资料、.kshrc 等,以确保没有旧链接到 /bin/ksh

macos terminal ksh
4个回答
3
投票

我刚刚买了一台配备 M1 芯片和 Monterey 的新 14 英寸 MacBook,遇到了同样的问题。在我的 2015 年配备 MacOS 12.4 beta 的 MacBook Pro 上,这种情况没有发生,经过一番研究,我发现我可以使用 Korn Shell 进行更新如果我通过

arch -x86_64 /bin/ksh
在 x64_64 模式下运行二进制文件,则 SIGWINCH 上的变量。

我尝试在

WINCH
(窗口更改)上设置一个陷阱,以设置 COLUMNS 和 LINES 变量,但是当我调整 iTerm 窗口大小时,会发送多个 WINCH 信号,并且每次都会打印
PS1
提示。

为什么它可以在 x86_64 下运行,但不能在 arm64 下运行,这超出了我的理解。

可以以此为借口切换到zsh,但我的

.kshrc
文件的根源可以追溯到1991年,并且命令行编辑的工作方式存在足够的差异,这让我的肌肉记忆陷入了困境。


1
投票

我怀疑通用二进制文件的 ARM 部分被 MacOS 运行时加载程序以不同的方式处理/执行(并且没有正确地将

SIGWINCH
传播到正在运行的代码)。

翻阅 @trey-valenta 的 answer 详细说明了解决方法,我将其添加到我的

$HOME/.profile
的底部:

# workaround for defective arm64 binary on MacOS
[ "$(uname -m)" == arm64 ] && test -x $(whence arch) && file ${SHELL} | grep -q x86_64 && exec arch -x86_64 ${SHELL}

我考虑使用

lipo
,但以可移植性的名义选择了
file
(我通常在跨架构/操作系统中使用相同的
.profile
)。


0
投票

我花了很长时间才找到并解决这个问题。 ksh 将在运行任何命令之前运行一个

.env
文件,因此这是您可以设置值的挂钩,假设您可以找到该值。

经过高低搜索后,我发现

stty
会输出当前的行和列,但这些值被埋在大量其他信息的有效负载中。然后我绊倒了
resize
选项,该选项仅将行和列输出为两个数字。

通过过滤输出,可以获得列号。解决方案是将其添加到 .env 文件中,并确保

ENV
在您的 .profile 中设置。

COLUMNS=$(stty size | sed -e 's/[0-9]* \([0-9]\)/\1/')

0
投票

根据Dave的回答我能够找到另一种适合我的库存解决方案

ksh
,但它不是很漂亮。创建
~/.kshrc
如下:

trap 'COLUMNS=$(tput cols); LINES=$(tput lines)' WINCH
COLUMNS=$(tput cols)
LINES=$(tput lines)

这会在启动时和每次窗口更改后设置正确的值。

每当调整窗口大小时,

ksh
都会在每个
$PS1
信号上打印
WINCH
。这不是很漂亮,但它没有持久的效果,而且我很少调整窗口大小,所以我对这个解决方案很满意,它让我可以使用库存
ksh
二进制文件。

PS:也可以使用

~/.kshrc
以外的其他文件并将
ENV
设置为
.profile
中的文件名。

© www.soinside.com 2019 - 2024. All rights reserved.