49

I am trying to customize the behaviour of Enter key in Normal mode in Vim. Here is my .vimrc:

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

I am trying to make Enter simply append a newline after the current line when pressed. However, when the Shift-Enter combination is pressed, I want to break the current line at the cursor.

The latter does not work. Whenever I press Shift-Enter it just appends a line without breaking it at the cursor.

4

5 回答 5

50

我设法通过发送 Vim 显然期望的键码来更正我的终端键ShiftEnter 。根据您的终端, (添加Ctrl+Enter作为奖励!)

iTerm2

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

  • 键盘快捷键:(点击Shift+ Enter
  • 动作: 发送转义序列
  • ESC+ [13;2u

    重复Ctrl+ Enter,序列:[13;5u

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

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

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

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

小猫,在~/.config/kitty/kitty.conf

map shift+enter send_text all \x1b[13;2u
map ctrl+enter send_text all \x1b[13;5u
于 2017-02-25T21:06:24.057 回答
48

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

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

但是截至今天,还没有补丁或志愿者出现,尽管许多人表示希望在未来的 Vim 8 主要版本中拥有它。


映射注意事项<CR>

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

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

注意事项:nmap

你应该使用:noremap; 它使映射不受重新映射和递归的影响。

于 2013-05-03T13:29:01.187 回答
14

我还想映射 <S-CR> 并发现我无法让它在 CLI 模式下工作,直到我使用 Ctrl+V 添加第二个映射,然后为映射的按键添加 <Shift+Enter>。然而,<S-CR> 映射仍然需要 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 上对此进行了测试。快乐维明!

于 2013-06-21T19:01:23.743 回答
8

无论你怎么努力,你都无法<S-CR>在 CLI Vim 中映射,因为 Vim 无法<S-CR>区分<CR>.

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

编辑

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

于 2013-05-03T13:27:01.813 回答
6

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>
于 2013-05-03T13:47:47.890 回答