【问题标题】:Mapping command s to :w in vim在 vim 中将命令 s 映射到 :w
【发布时间】:2016-01-08 17:15:10
【问题描述】:

如何在 vim 中将 Command S 映射到 :w

我已经尝试了其他线程的所有方法,但在 Mac OS X El Capitan 中似乎没有任何效果。

这应该在以前的版本中有效,但我尝试过,但没有成功。

noremap  <silent> <C-S>    :update<CR>
vnoremap <silent> <C-S>    <C-C>:update<CR>
inoremap <silent> <C-S>    <C-O>:update<CR>

我能找到的关于这个主题的所有内容都已有数年历史,不再适用。我可以找到this 线程或this 线程,但它们都已经三年多了,不再工作了。这就是为什么我要求当前版本的 Mac OS X (El Capitan)

【问题讨论】:

  • 我将您的问题误读为有关 MacVim 的问题,但您在终端中谈论的是 vim。我已经删除了我的答案,因为它没有意义。
  • 好的。我非常感谢您非常彻底的回答。
  • 我试图让终端 Vim 识别 Cmd-S,但我还没有找到方法。 MacVim 处理它,但终端 Vim 要么不处理它,要么我尝试过的终端(终端和 iTerm2)正在吞噬它而不是通过它。我将终端中当前的 Cmd-S 命令重新映射到不同的键,但 Vim 仍然没有使用 映射。

标签: vim terminal osx-elcapitan


【解决方案1】:

完全可以通过使用 Iterm2 和自定义映射键映射绑定来映射 cmd+s 或任何 cmd 组合。

因此,要将cmd+s 映射到终端vim 中,您首先需要更改Iterm2 配置:

  • 转到Preferences -&gt; Keys并按下窗口底部的+按钮,然后,添加键盘快捷键并选择名为Send text with "vim" Special Chars的操作和特殊字符:\&lt;C-s&gt;(注意\前缀),像这样:

  • 其次,进入vim配置,添加如下图:
noremap  <silent> <C-s> :w<CR>
inoremap <silent> <C-s> <ESC>:w<CR>i

请注意,Iterm2 会将击键cmd+s 转换为ctrl+s 并直接发送到vim。所以你可以考虑到这一点来做一些其他的事情。例如,您可以禁用cmd-w(通常会在Iterm2中关闭窗口)并以&lt;C-w&gt;直接发送到vim以拆分窗口,这种情况下您不需要更改vim端的任何内容,只需映射&lt;cmd-w&gt; 到 Iterm2 中的 \&lt;C-w&gt;。此外,您可以禁用 cmd+p 以防止烦人的 Iterm2 打印对话框并在 vim 中调用 :fzf o 类似的东西。

唯一的缺点是您需要单独创建所有地图:

顺便说一句,如果您想映射一些“非常特殊”的键,例如 cmd+/(例如使用 NERDCommenter 注释行),您需要使用“发送 Scape 序列”操作来做一个稍微不同的键映射:

然后,在 vim 中,为^[/ 击键设置映射(注意特殊的^[ 符号是通过按&lt;ctrl-v&gt; 然后按&lt;esc&gt; 生成的)。

【讨论】:

    【解决方案2】:

    来自 romainl 的回答让我走上了正轨,但不幸的是对我不起作用(OS X Sierra,MBP 2017)。同样使用(任意)键 F6 作为中间映射:

    将以下行添加到您的 ~/.vimrc

    nnoremap <F6> :w<CR>
    

    在 Iterm2 中创建一个新的键盘快捷键

    • 快捷键:cmd-s
    • 动作:发送转义序列
    • Esc+: [17~

    Iterm2 keyboard shortcut config

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:
      1. &lt;C-Control 键的符号。命令键是&lt;D-

      2. Command 键仅对 MacVim 可见,并且仅在使用 GUI 前端时可见。无论您在 Terminal.app 或 iTerm.app 中使用什么 Vim(MacVim 或任何其他版本),它永远不会看到命令键。

        换句话说,你不能指望&lt;D- 映射在 CLI Vim 中工作。这根本不可能。

      3. 唯一方法是让 CLI Vim 在 Mac OS X 上按下 Cmd+something 后执行任何操作,就是将该组合映射到您的终端模拟器模拟按下另一个键,它本身映射到 Vim 中所需的命令。

        ~/.vimrc

        nnoremap <F6> :w<CR>
        

        在 iTerm.app 中…

        仅供参考,0x112&lt;F1&gt;0x113&lt;F2&gt;,等等。我对 &lt;F6&gt; 的选择是任意的,使用适合你的任何东西。

        在 Terminal.app 中……

        我没有 El Capitan,所以我不知道在新的 Terminal.app 中可以做什么,但它以前的版本不允许您重新映射任意键 - 只有一个预定义的集合 - 所以我不认为没有一些假设的第三方工具在这里是可行的。

      4. 在 Vim 中使用 Cmd+S 的整个想法非常糟糕。改用 Vim 的方式吧。

      【讨论】:

      • 感谢您向我们展示如何在 vim 中使用 cmd+s 进行保存。您介意解释第 4 点吗?我觉得用cmd+s来保存是很自然的。它只需要 2 次击键,而 vim 方式需要 4 次。只是想知道为什么即使 vim 鼓励我们以最少的击键完成工作,它为什么不是首选?
      • 1.如果当时不存在也没关系。现在可以了,使用它应该有任何危害。 2. 当它做完全相同的事情时,它如何更具表现力和强大? 3. vimrc 的存在是有原因的。我们可以以一种对我们来说更舒适的方式自定义 vim,而不会失去 vim 的功能。
      【解决方案4】:

      &lt;C-S&gt; 中的 C 代表 Control,而不是 Command。如果要映射Command+S,则需要&lt;D-S&gt;。 (不,我不知道 D 代表什么。)

      请注意,这仅适用于 MacVim。 Command 键不会传递给终端应用程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-20
        • 2023-03-29
        相关资源
        最近更新 更多