为什么' $ p'在iterm中出现在vim的第一行?

时间:2018-04-04 05:22:14

标签: macos vim xterm iterm2

我使用的是Mac OS 10.13.4。

iTerm2版本是Build 2.1.1

Vim版是 VIM - Vi IMproved 8.0(2016年9月12日,2017年11月29日编译18:37:46) 包含的补丁:1-503,505-680,682-1283 由root@apple.com编译

我安装了 Vundle插件

当我使用oh-my-zsh在iTerm2中打开vim时,$ p出现在第一行。 enter image description here

它不会出现在Apple的Terminal.app中吗?

如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

vim假设iTerm2是xterm(不是一个好的假设),并试图通过发送包含 $p 的转义序列来确定cursorBlink资源的状态iTerm2无法正常处理(有关转义序列的vim,请参阅source-code,以及uses the feature)。虽然vim以TERM设置开始(即" xterm"),但它会进行一些检查以排除gnome-terminal之类的内容,如源代码注释中所述。但在这种情况下,iTerm2恰好欺骗了vim。结果就到了屏幕。

XTerm Control Sequences 中记录如下:

CSI ? Ps$ p
          Request DEC private mode (DECRQM).  For VT300 and up, reply is
            CSI ? Ps; Pm$ y
          where Ps is the mode number as in DECSET/DECSET, Pm is the
          mode value as in the ANSI DECRQM.
          Two private modes are read-only (i.e., 1 3  and 1 4 ), pro-
          vided only for reporting their values using this control
          sequence.  They correspond to the resources cursorBlink and
          cursorBlinkXOR.

虽然vim在这里被愚弄,但问题是由于iTerm2,你可能已经将TERM环境变量设置为xterm-256color,或类似的东西。它不能很好地匹配iTerm2的行为(功能键不匹配等)。 ncurses提供了一个更好的。但开箱即用的MacOS有一个大约十年的终端数据库,并且没有这个条目。要获得一个好的终端数据库(例如,您可以将TERM设置为iterm2),您可以使用MacPorts或家庭酿造。

运行infocmp以衡量(正确的) iterm2 条目与 linux 之间的差异, {{1 <}> 显示

  • 它实际上更靠近 xterm-256color (一个Apple没有提供的Terminal.app的正确的条目)38行差异,
  • 下一个最近的 nsterm-256color ,包含76行和
  • 距离 linux 还有94行。

iTerm2中缺少或错误实现的功能不在终端描述中:它是vim必须猜测的特殊功能。

答案 1 :(得分:2)

如上所述,该$ p是由于vim发送了用于光标闪烁请求的控制序列。在您的.vimrc中,您可以通过清除t_RC终端选项来关闭光标闪烁请求。我将其包装在一个条件中,该条件仅对256色端子关闭。

if &term =~ '256color'
  set t_RC=
endif

答案 2 :(得分:0)

将终端明确设置为 export TERM=linux 为我解决了这个问题: Future.delayed

答案 3 :(得分:-1)

p表示 打印,这是给出范围的命令,是的..它会向您显示该范围内的内容。

vim 中,您可以查看:help:range和:help:print ,详细了解其工作原理。 sed和其他编辑也使用这些类型的范围。

他们可能会使用教程中的 1,$术语来明确,但请注意,您也可以使用作为其等价物。因此,%p 也会打印文件中的所有行。