Vim 如何映射Shift Enter

Vim 如何映射Shift Enter,vim,Vim,我正在尝试自定义Vim中Enter键入Normal模式的行为。 这是我的.vimrc: nmap <CR> o<Esc> nmap <S-CR> i<CR><Esc> nmap o nmap i 我试图使Enter键在按下时在当前行后添加一个换行符。但是,当按下Shift-Enter组合键时,我想在光标处打断当前行 后者不起作用。每当我按下Shift Enter键时,它只会追加一行,而不会在光标处打断它。无论您如何努力,都无法在CL

我正在尝试自定义Vim中
Enter
键入
Normal
模式的行为。 这是我的
.vimrc

nmap <CR> o<Esc>
nmap <S-CR> i<CR><Esc>
nmap o
nmap i
我试图使Enter键在按下时在当前行后添加一个换行符。但是,当按下Shift-Enter组合键时,我想在光标处打断当前行

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

无论您如何努力,都无法在CLI Vim中映射
,因为Vim无法区分

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

编辑


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

由于键盘输入是在内部处理的,不幸的是,这在今天的Vim终端版本中通常不可能实现(
应在所有平台上的GVIM中以及在Windows控制台Vim中工作)。这是一个已知的痛点,也是关于Vim_dev和#Vim IRC频道的各种讨论的主题

一些人(最重要的是Paul LeoNerd Evans)希望解决这一问题(即使是支持这一点的终端中的console Vim),并提出了各种建议,cp

但到今天为止,还没有补丁或志愿者出现,尽管许多人表示希望在未来的Vim8主要版本中有这样的补丁或志愿者


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

:autocmd CmdwinEnter*nnoremap
:autocmd BufReadPost快速修复nnoremap
关于
:nmap
的注释:
;它使映射不受重新映射和递归的影响。

Ingo Karkat和Romaill是100%正确的。但是,您的问题很常见,所以我想给您一些选择

我个人建议使用Tim Pope的。它提供了许多映射,但您要查找的映射是
[
]
分别在当前行的上方和下方创建空行。Unpaired还提供了很好的映射,用于在快速修复列表、缓冲区列表、选项切换和许多其他内容中移动。有关更多信息,请参阅
:h Unpaired

如果您不想使用未损坏的插件,但像下面的映射一样,可以将一些快速映射放入
~/.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>
URxvt.keysym.S-Return:     \033[13;2u
URxvt.keysym.C-Return:     \033[13;5u
nnoremap[:put!=重复(['],v:count)]+1
nnoremap]:put=repeat([''],v:count)[-1
我还想映射,发现我无法让它在CLI模式下工作,直到我为映射的击键添加了第二个使用Ctrl+V的映射。但是,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)
nnoreo
GVIm需要nnoremap i
nnoremap^[0M i”是CLI VIm所需的(注意:^[0M是使用Ctrl+V Shift+Enter创建的,不要直接键入)

我在Ubuntu12.04上测试了这个。祝你Vimming快乐!

我成功地更正了Shift+Enter的终端键代码 通过发送Vim显然期望的密钥代码。根据您的终端, (添加Ctrl+Enter作为奖励!)

对于单个配置文件,请打开首选项→ 轮廓→ 钥匙→ [+](添加)
对于所有打开的配置文件首选项→ 钥匙→ [+](添加)

  • 键盘快捷键:(按Shift+Enter)
  • 操作:发送转义序列
  • Esc+
    [13;2u

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

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

nnoremap <silent> [<space>  :<c-u>put!=repeat([''],v:count)<bar>']+1<cr>
nnoremap <silent> ]<space>  :<c-u>put =repeat([''],v:count)<bar>'[-1<cr>
URxvt.keysym.S-Return:     \033[13;2u
URxvt.keysym.C-Return:     \033[13;5u
键绑定
下,将以下内容添加到
~/.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

备选方案:将
i
映射到。这将产生一个良好的二元性,用于拆分和连接行。并使用unpaird的
]
添加空行(如所建议的)。我正在尝试执行相同的操作=)这就是我最后所做的,谢谢你的
:nmap
vs
:noremap
,知道它非常有用。我可能会将它绑定到其他东西上。嘿,非常感谢!我刚刚意识到为什么我会有这种奇怪的行为(我设置了
nnoremap:
=P)。顺便问一句,你是怎么发现的?我冒昧地纠正了“黑线”:-)哦,还有+1的建议。事实上,我在中有自己的选择,因为我不喜欢Tim把一堆不相关的功能放在一起,只是按照常见的映射前缀进行分组。谢谢你的更改和提到你的LineJuggler插件。我喜欢有很多插件可供选择。干杯!有了iTerm,这是非常有用的可能可以映射任何您想要的疯狂组合,如果标准的转义序列用完,则可以使用自定义转义序列。使用PuTTY等工具,您可以在关键映射中编译,就像我使用F10和Backspace所做的那样。这应该是可接受的答案!(我只需要为
Shift+Enter
创建iTerm映射)这太棒了。
alacrity
中的映射总是很混乱。谢谢分享!在alacrity中,
绑定对我不起作用。
工作起来很有魅力,但
似乎相当于vim中的
zt
,这让我感到困惑!我在哪里可以找到关于转义序列vi的更多信息m需要?@jchook这可能是Vim配置中的一个设置。请尝试使用
-u NONE
或无配置运行。并验证您是否正确