将命令s映射为在vim中保存的快捷键:w

7

我该如何将 Command S 映射为 :w 在vim中?

我尝试了其他帖子提供的所有方法,但在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>

我找到的有关此主题的所有内容都已经过时不再适用。我能找到这个帖子或者这个帖子,但是它们都超过三年的时间且不再适用。这就是为什么我要问当前版本的 Mac OS X(El Capitan)的原因。


我误读了你的问题,以为是关于MacVim的,但你说的是在终端中使用vim。我已经删除了我的答案,因为它没有意义。 - Dan Lowe
好的。我非常感谢您详尽的回答。 - intboolstring
我尝试让终端的Vim识别Cmd-S,但我还没有找到方法。MacVim可以处理它,但是终端的Vim要么无法处理它,要么我尝试过的终端(Terminal和iTerm2)正在吞噬它而不是传递它。我将当前在终端中的Cmd-S命令重新映射到另一个键,但是Vim仍然没有使用<D-s>映射。 - Dan Lowe
4个回答

10
  1. <C- is the notation for the Control key. It's <D- for the Command key.

  2. The Command key is only visible to MacVim and only when using the GUI front end. No matter what Vim you use in Terminal.app or iTerm.app (MacVim or any other build), it will never see the command key.

    In other words, you can't expect <D- mappings to work in CLI Vim. It is simply impossible.

  3. The only way to get CLI Vim to do anything upon pressing Cmd+something on Mac OS X is to map that combo in your terminal emulator to emulate pressing on another key, itself mapped to the desired command in Vim.

    In ~/.vimrc

    nnoremap <F6> :w<CR>
    

    In iTerm.app…

    enter image description here

    FYI, 0x112 is <F1>, 0x113 is <F2>, etc. My choice of <F6> is arbitrary, use whatever works for you.

    In Terminal.app…

    I don't have El Capitan so I have no idea of what can be done in the new Terminal.app but its previous incarnations didn't allow you to remap arbitrary keys — only a predefined set — so I don't think it's doable here without some hypothetical third-party tool.

  4. The whole idea of using Cmd+S in Vim is very bad. Get used to the Vim way instead.


1
谢谢您向我们展示如何在vim中使用cmd+s保存。您介意解释一下第4点吗?我认为使用cmd+s保存非常自然,只需要2个按键,而vim的方式需要4个按键。我想知道为什么即使vim鼓励我们以最少的按键完成工作,为什么它不被优先考虑? - UsamaMan
1
  1. 如果它以前不存在并不重要,现在它存在了,使用它也不会有任何伤害。
  2. 当它执行完全相同的操作时,它如何更具表现力和强大?
  3. vimrc 是有其存在的理由的。我们可以自定义 vim 以更符合我们的需求,而不会失去 vim 的强大功能。
- UsamaMan

5

romainl的答案让我找到了正确的方向,但不幸的是在我的电脑上(OS X Sierra, MBP 2017)没有起作用。同时使用(随意)键F6作为中间映射:

将以下行添加到您的~/.vimrc文件中:

nnoremap <F6> :w<CR>

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

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

Iterm2 键盘快捷方式配置

希望这可以帮助到您。


5
可以完全通过使用Iterm2和自定义映射键绑定来映射cmd+s或任何cmd组合键。因此,要将cmd+s映射到在终端vim中保存,您首先需要在Iterm2配置中进行更改:
1. 转到“首选项->键”,并按窗口底部的“+”按钮,然后添加键盘快捷键并选择名为“发送带有“vim”特殊字符的文本”的操作以及特殊字符:(请注意前缀\),如下所示:

enter image description here

  • 其次,进入vim配置文件并添加以下映射:
noremap  <silent> <C-s> :w<CR>
inoremap <silent> <C-s> <ESC>:w<CR>i

请注意,Iterm2会将按键组合cmd+s转换为ctrl+s并直接发送到vim。因此您可以在此基础上做一些其他事情。例如,您可以禁用cmd-w(通常会在Iterm2中关闭窗口),并将其作为<C-w>直接发送到vim以分割窗口,在这种情况下,您不需要在vim侧进行任何更改,只需在Iterm2中将<cmd-w>映射到\<C-w>即可。此外,您可以禁用cmd+p以防止烦人的Iterm2打印对话框,并在vim中调用:fzf o之类的命令。
唯一的缺点是您需要逐个创建所有映射:

enter image description here

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

enter image description here

然后,在vim中,为^[/键设置映射(注意,特殊的^[符号是通过按下<ctrl-v>,然后再按下<esc>生成的)。

enter image description here


4
<C-S>中的C代表控制(Control),而不是命令(Command)。如果您想将Command+S映射为快捷键,则需要使用<D-S>。(不过,我不知道D代表什么)。请注意,这仅适用于MacVim。命令键无法传递给终端应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接