VIM - 如何映射Shift-Enter

if *_*one 31 vim

我试图在VIM中自定义Enter密钥Normal模式的行为.这是我的.vimrc:

nmap <CR> o<Esc>
nmap <S-CR> i<CR><Esc>
Run Code Online (Sandbox Code Playgroud)

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

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

Ing*_*kat 38

由于键盘输入在内部处理的方式,遗憾的是今天在Vim的终端版本中通常不可能(<S-CR>在所有平台和Windows控制台Vim中都应该在GVIM中工作).这是一个众所周知的痛点,也是关于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>在正常模式下映射,它将干扰命令行窗口中历史项的选择,并在quickfix /位置列表窗口中跳转到错误下的错误!(除非你添加以下内容:)

:autocmd CmdwinEnter * nnoremap <CR> <CR>
:autocmd BufReadPost quickfix nnoremap <CR> <CR>
Run Code Online (Sandbox Code Playgroud)

注意事项:nmap:

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

  • 感谢`:nmap` vs`:noremap`,非常有用.我可能会将它绑定到别的东西上. (2认同)

Raf*_* B. 15

我设法纠正我的终端键码Shift+ Enter 通过发送键码的Vim显然希望.取决于您的终端, (添加Ctrl+ Enter作为奖励!)

iTerm2

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

  • 键盘快捷键:(点击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
Run Code Online (Sandbox Code Playgroud)

Alacritty,在下面key_bindings,添加以下内容~/.config/alacritty/alacritty.yml:

- { key: Return,   mods: Shift,   chars: "\x1b[13;2u" }
- { key: Return,   mods: Control, chars: "\x1b[13;5u" }
Run Code Online (Sandbox Code Playgroud)

  • 在 tmux 3.2a 上(至少在 macOS 和 FreeBSD 中),您还需要在 `~/.tmux.conf` 行中添加 `bind -n S-Enter send-keys Escape "[13;2u"` 等。否则tmux 不会将代码传递给 neovim。 (7认同)
  • 这应该是公认的答案!(我只需要为 `Shift+Enter` 创建 iTerm 映射) (2认同)
  • 这太棒了。“Alacrrity”中的映射总是那么令人困惑。感谢分享! (2认同)
  • 如何找到 vim 对于某个给定的按键绑定所需的按键代码?@拉菲 (2认同)

Cor*_*ren 13

我还想映射<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)
Run Code Online (Sandbox Code Playgroud)

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

  • 这在OSX上对我不起作用. (5认同)
  • 这个解决方案适合我(使用konsole).谢谢. (2认同)

rom*_*inl 5

不能映射<S-CR>在CLI Vim的,不管你怎么努力,因为Vim无法区分<S-CR><CR>.

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

编辑

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


Pet*_*ker 5

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

我个人推荐使用Tim Pope的Unimpaired插件.它提供了许多映射,但是你会寻找那些是[<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>
Run Code Online (Sandbox Code Playgroud)