【问题标题】:Why '$p' appears at the first line of vim in iterm?为什么'$p'出现在iterm中vim的第一行?
【发布时间】:2018-04-04 05:22:14
【问题描述】:

我使用的是 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 插件

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

Apple 的 Terminal.app 没有出现?

如何解决这个问题?

【问题讨论】:

  • 这里没有代码。这不是一个编程问题。试试superuser.com?
  • 其实是关于转义序列的问题,有话题。 vi.SE 不会提供更好的答案。

标签: macos vim xterm iterm2


【解决方案1】:

vim 假设 iTerm2 是 xterm(不是一个好的假设),并尝试通过发送包含 $p 的转义序列来确定 cursorBlink 资源的状态,而 iTerm2 无法处理正确(请参阅source-code 以了解转义序列的vim,以及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 或 home-brew 来实现。

运行 infocmp 以衡量(正确的)iterm2 条目和 linuxxterm-256color 之间的差异表明

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 然而,t_RC 只有在 (a) 它从终端描述中读取,或 (b) 从用户的本地配置中读取时才应该设置。由于RC 没有任何标准的终端描述(因为它在 termcap 中意味着完全不同的东西),听起来 (b) 就是这种情况。
    【解决方案3】:

    将终端显式设置为linux 为我解决了这个问题: export TERM=linux

    【讨论】:

      【解决方案4】:

      p 表示 print,这是给定范围的命令,是的.. 它向您显示该范围内的内容。

      vim 中,您可以查看 :help :range 和 :help :print 以了解有关其工作原理的更多信息。 sed 和其他编辑器也使用这些类型的范围。

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

      【讨论】:

      • 那么我怎样才能删除这些字符呢?我不想每次打开 vim 时都显示它们。输入vim -u NONE 使用vim 是一种解决方案,但是不方便
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 1970-01-01
      • 2015-01-09
      • 2012-06-16
      • 1970-01-01
      • 2023-01-26
      • 1970-01-01
      相关资源
      最近更新 更多