VIM - 如何映射Shift-Enter

时间:2013-05-03 13:19:07

标签: vim

我正在尝试在VIM中以Enter模式自定义Normal密钥的行为。 这是我的.vimrc

nmap <CR> o<Esc>
nmap <S-CR> i<CR><Esc>

我试图让Enter在按下当前行之后简单地添加换行符。但是,如果按下Shift-Enter组合,我想打破光标处的当前行。

后者不起作用。每当我按下Shift-Enter时,它只会附加一行而不会在光标处打破它。

5 个答案:

答案 0 :(得分:37)

由于内部处理键盘输入的方式,遗憾的是今天在Vim的终端版本中通常不可能(<S-CR>应该在所有平台上的GVIM中运行,并且在Windows控制台Vim中) 。这是一个众所周知的痛点,也是关于vim_dev和#vim IRC频道的各种讨论的主题。

有些人(最重要的是Paul LeoNerd Evans)希望解决这个问题(即使是支持Vim的终端中的控制台Vim),并提出了各种提案,cp。 http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

但截至今天,尚未有任何补丁或志愿者挺身而出,尽管许多人表示希望在未来的Vim 8主要版本中有这个。


关于映射<CR>的注意事项:

如果您在正常模式下映射<CR>,它将干扰命令行窗口中历史项目的选择以及在quickfix /位置列表窗口中跳转到错误下的错误! (除非你添加以下内容:)

:autocmd CmdwinEnter * nnoremap <CR> <CR>
:autocmd BufReadPost quickfix nnoremap <CR> <CR>

关于:nmap的注释:

You should use :noremap;它使映射不受重映射和递归的影响。

答案 1 :(得分:13)

我还想映射&lt; S-CR&gt;并发现我无法让它在CLI模式下工作,直到我使用Ctrl + V添加第二个映射然后&lt; Shift + Enter&gt;用于映射的击键。 &lt; S-CR&gt;然而,GVIm仍然需要映射才能按预期工作。这会将您的.vimrc片段呈现如下:

nnoremap <CR> o<Esc>
nnoremap <S-CR> i<CR><Esc> " Needed for GVIm
nnoremap ^[0M i<CR><Esc>   " Needed for CLI VIm (Note: ^[0M was created with Ctrl+V Shift+Enter, don't type it directly)

我在Ubuntu 12.04上测试了这个。快乐的Vimming!

答案 2 :(得分:12)

我设法纠正 Shift + Enter 的终端密码 通过发送密钥代码Vim显然期望。根据您的终端, (添加 Ctrl + 输入作为奖励!)

<强> iTerm2

对于单个配置文件,打开首选项配置文件 [+](添加)
对于所有配置文件,打开首选项 [+](添加)

  • 键盘快捷键:(点击 Shift + 输入
  • 操作: 发送转义序列
  • Esc + [13;2u

    重复 Ctrl + 输入,顺序为:[13;5u

urxvt ,附加到您的.Xresources文件:

URxvt.keysym.S-Return:     \033[13;2u
URxvt.keysym.C-Return:     \033[13;5u

Alacritty ,在key_bindings下,将以下内容添加到您的~/.config/alacritty/alacritty.yml

- { key: Return,   mods: Shift,   chars: "\x1b[13;2u" }
- { key: Return,   mods: Control, chars: "\x1b[13;5u" }

答案 3 :(得分:5)

无论您尝试多么努力,都无法在CLI Vim中映射<S-CR>,因为Vim无法区分<S-CR><CR>

您必须找到另一个映射或坚持使用GVim / MacVim。

修改

某些终端仿真程序(如Mac OS X上的iTerm.app或Terminal.app)允许您设置快捷方式以将特定字符序列发送到shell。如果你有这种可能性,它可能值得一试,但你会很快习惯一个无法移植的平台专用的gyzmo,好吧......我真的不推荐它。

答案 4 :(得分:5)

Ingo Karkat和romainl 100%正确。不过你要问的是常见的,所以我想给你一些选择。

我个人建议使用Tim Pope的Unimpaired plugin。它提供了许多映射,但您要查找的映射是[<space>]<space>,它们分别在当前行的上方和下方创建空白行。 Unimpaired还提供了很好的映射,可以通过quickfix列表,缓冲区列表,选项切换等等。有关详情,请参阅:h unimpaired

如果你不想使用未受损的插件,但是下面的映射是一些快速映射放在你的~/.vimrc文件中:

nnoremap <silent> [<space>  :<c-u>put!=repeat([''],v:count)<bar>']+1<cr>
nnoremap <silent> ]<space>  :<c-u>put =repeat([''],v:count)<bar>'[-1<cr>