如何在不退出普通模式的情况下插入换行符


24

我想知道是否可以在不离开普通模式的情况下插入新行。例如,我有两行:

this is line one
this is line two

光标在第一行。现在,我要在第一行和第二行之间换行,如下所示:

this is line one

this is line two

我知道在正常模式下,只需按即可o。但这将进入插入模式。

如何插入新行并保持正常模式?


Answers:


10

我为此使用映射:

" Quickly insert an empty new line without entering insert mode
    nnoremap <Leader>o o<Esc>
    nnoremap <Leader>O O<Esc>

这样,您可以在光标下方插入一行,<Leader>o而在上一行插入一行<Leader>O

注意:有人可能会说它需要的击键次数与之相同,o<Esc>但希望您选择了领导者来简化这种映射。另外,我真的不确定是否有内置方法可以做到这一点。


8

一种不通过插入模式,不移动光标的解决方案,并且允许您使用计数器一次附加几行(3\o等等):

nnoremap <silent> <leader>o :<C-u>call append(line("."),   repeat([""], v:count1))<CR>
nnoremap <silent> <leader>O :<C-u>call append(line(".")-1, repeat([""], v:count1))<CR>

5

我个人建议使用Tim Pope的Unimpaired插件。它提供了许多映射,但是你会寻找那些是[<space>]<space>它创造的空行上面分别当前线以下。Unimpaired还为快速修复列表,缓冲区列表,选项切换以及许多其他操作提供了不错的映射。查看: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>

5

如果不想添加映射,则可以拉yy空一行,然后将其粘贴p到光标下方和P光标上方。


这可能是没有映射的最佳答案。
Willem van Ketwich

或者将其保存到o寄存器中,"oyy并在需要时从那里粘贴它"op
mike23

4

我的映射使用Shift-Enter。它与其他方法的不同之处在于,使用标记o 将光标返回到同一行同一

" Insert new line above without going into insert mode
" (uses mark o to return to the previous cursor column)
nnoremap <S-Enter> moO<Esc>`o

5
请注意,映射<S-Enter>在终端仿真器中无效(仅在gVim中有效)。因此,您需要选择一个不同的键组合以将其映射到;-)
Martin Tournoij 2015年

2

Maxim Kim的回答改变了生活:

noremap <silent> <space> :exe "normal i".nr2char(getchar())<CR>

和我的即兴表演:

noremap <silent> <s-space> :exe "normal a".nr2char(getchar())<CR>

将这些行放在您的计算机中vimrc。然后转到您的文件和命中的第二行的开头SpaceEnter或去第一线和命中结束Shift+SpaceEnter。要么在第一行和第二行之间添加空行,然后将您置于普通模式。

您还可以将这些键用于其他任何单个键-击中SpaceShift+Space跟随所需的键,它将分别插入或追加。


2

这些映射将完全满足您的需求。

nnoremap <c-n> @="m`o\eg``"<cr>
nnoremap <c-p> @="m`O\eg``"<cr>   

它们在光标之前或之后插入n个换行符;将光标保持在正确的位置,而无需更改跳转列表。

另一种解决方案是仅创建一个快捷方式,以换行符填充未命名的寄存器。然后,您可以只使用put命令p或P插入换行符。例如:

nnoremap "<cr> :let @@="\n"<cr>

1

我对此的映射

 " Create Blank Newlines and stay in Normal mode
nnoremap <silent> zj o<Esc>k
nnoremap <silent> zk O<Esc>j

statox的不同之处在于,这使光标保持在同一位置。


什么<silent>意思
Alex

它可以防止在状态行中回显任何内容。我很确定它在这种特定情况下不做任何事情,就在我很早以前从那里复制它的地方。请参阅:h map-silent
凯文

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.