FreeBSD 的 vi 不能正确执行 control-D 取消缩进?

FreeBSD 的 vi 不能正确执行 control-D 取消缩进?

我使用的是极简 FreeBSD 系统,需要使用内置编辑器来编辑文件。具体来说,这不是 vim、vim-tiny 或其他替代品。它是“4BSD bug-for-bug 兼容”nvi 编辑器。

它几乎按预期工作。这手册页表示 control-T 和 control-D 将根据 缩进/取消缩进shiftwidth。 Control-T 有效,但 control-D 无效。它实际上将 ^D 字符输入到文件中。

如果我确实让 vim 进入系统,control-T 和 control-D 会按预期工作,所以这不是终端错误解释按键的问题。 Vi 本身并不解释 control-D。

有人遇到过这个吗?解决方案?使用 vim 不是一个选择。

答案1

太长;博士; vim不是vi

在 中vi,您应该使用 Control-T 而不是 Tab 来缩进一行。

如果您发现很难重新训练,您可以添加从 Tab 到 Control-T 的输入模式映射:

printf 'map! \x16\t \x14\n' >> ~/.nexrc

在真实的vinvi克隆的(在 FreeBSD 中使用)中,control-D 将擦除自动缩进字符直到之前的“shiftwidth”边界。它会不是通过按 Control-I、Tab 或 Space,擦除您手动输入的 Tab 或 Space 字符。

答案2

这是 bug 与 bug 兼容性的一部分。

在源代码的评论中对此进行了很长的讨论,在/usr/src/contrib/nvi/vi/v_txt.c.输入被视为文字字符除非 ai模式已开启最后插入的字符是自动缩进字符(通过Control+T或新行上的自动缩进)。

注释还指出,原始viControl+TControl+D受到更多限制,只有在它们是在插入模式下键入的第一个内容时才会影响缩进。

相关内容