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

Rox*_*oxy 3 freebsd vi

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

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

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

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

mos*_*svy 6

tl;博士; vim不是vi

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

如果你觉得很难再训练,你可以添加一个从 Tab 到 Control-T 的输入模式映射:

printf 'map! \x16\t \x14\n' >> ~/.nexrc
Run Code Online (Sandbox Code Playgroud)

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


Jde*_*eBP 5

这是 bug-for-bug 兼容性的一部分。

在来源的评论中有一个冗长的讨论,在/usr/src/contrib/nvi/vi/v_txt.c。输入被视为文字字符,除非 ai模式打开并且插入的最后一个字符是自动缩进字符(通过Control+T或自动缩进新行)。

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