我正在尝试在VIM中以Enter
模式自定义Normal
密钥的行为。
这是我的.vimrc
:
nmap <CR> o<Esc>
nmap <S-CR> i<CR><Esc>
我试图让Enter在按下当前行之后简单地添加换行符。但是,如果按下Shift-Enter
组合,我想打破光标处的当前行。
后者不起作用。每当我按下Shift-Enter
时,它只会附加一行而不会在光标处打破它。
答案 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 强>
对于单个配置文件,打开首选项→配置文件→键→ [+](添加)
对于所有配置文件,打开首选项→
键→ [+](添加)
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>