【问题标题】:How to get Cmd-left/right working with iTerm2 and Vim (without requiring .vimrc changes)?如何让 Cmd-left/right 与 iTerm2 和 Vim 一起使用(无需更改 .vimrc)?
【发布时间】:2012-03-24 15:15:36
【问题描述】:

我希望能够在 Vim 中使用 Option-left 和 Option-right 跳过单词(以及 Cmd-left/right 转到行首和行尾),就像在我的 shell 提示符下一样。我的 Iterm2 首选项具有执行此操作的映射(例如,Option-leftEsc-H 和一个用于 option-rightEsc-F 的映射以跳过单词),这适用于本地 shell 或 ssh'd 到远程服务器.

当我在本地或远程使用 Vim 时,option-left 有效,但 option-right 无效。我怀疑这是因为 Vim 自然会监听 Esc-H,而不是 Esc-F。我可以通过将 .vimrc 文件修改为 Esc-bbEsc-ff 来解决这个问题,但我不想对我连接的每台服务器都这样做。

同样,我对 Cmd-left/right 有相同的所需设置,用于转到一行的开头和结尾。我可以通过 Iterm2 映射(例如 Cmd-leftEsc-[h)在 shell 中让它工作,但是除非我再次映射键(例如 Esc-[h^),否则 Vim 根本不会对此做出响应。

更新:我刚刚弄清楚如何让选项左/右工作。我将 iTerm2 中的映射分别更改为 escape-[1;5Descape-[1;5C。不过,我仍然想解决 Cmd-left/right 问题(我更改了问题的标题以反映这一点)。有什么想法吗?

【问题讨论】:

  • 你的 shell 和 Vim 都不会对 Cmd 键做出反应。另外,作为一个长期使用 mac 的用户,我发现 ^$bBeEwW 的效率要高得多:如果您要认真使用 Vim,为什么不按设计使用它?
  • @romainl 你确定吗?它适用于我在 linux、Windows 和 Solaris 上以及跨终端仿真器(如 screen 和/或 Putty)
  • 是的。按下Cmd 键没有被shell 注册(没有修饰符Cmd 的ANSI 代码)所以AFAIK 没有办法将Cmd 发送到Vim,它甚至不理解Cmd:它只支持MacVim ,任何操作系统上的其他版本的 Vim、CLI 或 GUI 都不能使用 <D-> 映射。因此,在 CLI Vim 映射中使用 Cmd 键的唯一方法是将其与其他一些键交换:AltCtrlShift,无论如何,有很多应用程序/黑客。显然,这样做可能会引发大量问题,并且实际上取代了问题,因为我们仍然拥有相同数量的修饰键。
  • 当您看到模态编辑和单键命令的辉煌时。
  • 我已经有 iTerm2 映射 Cmd+left/right 映射到其他键,所以我不需要 Vim 来监听,但是,如果有其他一些 Vim 支持的 Escape/hex 代码默认情况下作为“$”和“^”的替代品,那么也许我可以更新我的映射以使用它。例如,Home 和 End 键适用于标准 Linux 安装。知道那些发送的键序列是什么吗?

标签: macos shell vim keyboard-shortcuts iterm


【解决方案1】:

我使用的是 iTerm2 3.4.2,实际上您可以为您的个人资料选择一个预设来启用此功能。

【讨论】:

    【解决方案2】:

    FWIW,dolan 的回答在 Mac OS X 10.7.3 上的 iTerm 2 1.0.0.20120203 上对我不起作用。他的解决方案只在我按下快捷键时将~5D/5C 插入到我的终端中。

    相反,我使用了以下解决方案:

    YMMV,不确定为什么一组解决方案会起作用,而另一组则不起作用

    【讨论】:

    • 我正在运行相同版本的 iTerm 2 和 OS X。我使用“xterm-256color”作为终端类型,使用“Unicode (UTF-8)”作为我的字符编码。也许看看你那里是否有不同的设置?
    • 我有同样的设置。我尝试在 Keys 和 Profiles > Keys 中输入您的转义码,效果相同。不知道有什么不同
    • 我发现你的设置和我的设置都在命令行上工作,但我在 Vim 和 Python shell 中得到了不同的行为。我的设置在 Python shell 中不起作用(你提到的 ~/5D/5C 是),在 Vim 中(默认 vim,不是 MacVim),你的设置会触发其他一些功能或不起作用,具体取决于我的命令m 使用(例如 cmd-right 将窗口滚动一行)。如果有机会,请检查 Vim 是否有上述命令。如果你在命令行中得到 ~/5D/5C,你能否澄清一下
    • 作为@evan-krall commented above,当使用readline时,readline会超过解析输入(包括如何处理转义序列),所以configuring special keys in it's config file is required
    【解决方案3】:

    为了模仿 OS X 将Cmd-left/right 发送到行首/行尾的行为,我在 iTerm2 中添加了以下映射:

    • Cmd-left 转义序列 [1~
    • Cmd-right 转义序列 [4~

    为了模仿 OS X 将Option-left/right 发送到上一个/下一个单词的行为,我在 iTerm2 中添加了以下映射:

    • Option-left 转义序列 [1;5D
    • Option-right 转义序列 [1;5C

    特别感谢 this blog post 跟踪我在 cmd-left/right 映射中遗漏的内容

    【讨论】:

    • 注意:这在我在 OS X 上的本地 python shell 中不起作用,但是当 ssh'd 到 linux 机器时,这些在 python shell 中工作。不知道为什么。如果我使用下面提到的映射 ilias,它们在 Vim 中不起作用,但在其他任何地方,包括 python,它们都起作用
    • OS X 中的 python shell 不使用 readline,除非你安装 pypi.python.org/pypi/readline
    • 这在vim 中工作得很好,但在bash 中不起作用(例如,在编写长命令时):(
    • 嗨@DolanAntenucci,.vimrc 中的等效映射是什么(我的工作流程是 Terminal.app、tmux 和 vim)?像地图 [1;5D 和 [1;5C ?
    • 这个解决方案和 Karim 都不适用于我的 Cmd-left/right 绑定。我必须在我的~/.zshrc 中设置bindkey '^[[1~' beginning-of-linebindkey '^[[4~' end-of-line,然后我才能根据这个答案设置转义码。现在在 iTerm2 和 Vim 中一切正常。
    【解决方案4】:

    我没有 MacOS,所以我无法确切了解您的情况,但我认识到其他操作系统的问题。

    基本上,这意味着终端发送 vim 无法理解的键码。我过去通过这样做来修复它

     TERM=something
     export TERM
    

    在调用 vim 之前

    例如为了让所有键语法突出显示在 AIX 5.3 上的 Putty/screen 上工作,我需要使用

     TERM=iris-ansi vim
    

    如果您传递了错误的 TERM,则会有一个内置终端类型列表

    【讨论】:

    • 我认为这需要在我连接的远程服务器上添加这个变量。此外,iTerm2 允许我更改它模拟的终端类型(当前设置为“xterm”,但还有其他类似“xterm256-color”),所以也许我需要切换终端类型?查看我上面关于 Home/End 键为什么起作用的评论,以及是否有办法模仿它。谢谢!
    • @dolan AFAIR Putty 和 ssh 可以选择“发送”环境变量,这通常更有意义。我建议摆弄 TERM 类型,看看会发生什么
    猜你喜欢
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2018-08-23
    • 2011-03-12
    相关资源
    最近更新 更多