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

this is line one
this is line two


光标位于第一行。现在,我要在第一行和第二行之间换行,就像这样:

this is line one

this is line two


我知道当我处于正常模式时,只需按o即可。但这将进入插入模式。

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

评论

看看:vim.wikia.com/wiki/Insert_newline_without_entering_insert_mode

#1 楼

我为此使用了一个映射:

" 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>一样多的击键,但是希望您选择了这个组长来简化这种映射。另外,我真的不确定是否有内置方法可以做到这一点。

#2 楼

一种不通过插入模式,不移动光标的解决方案,并且允许您使用计数器一次附加几行(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>


评论


那是一个很好的解决方案,我什至更喜欢使用oo和OO而不是 o

–沃克·波(Walker Boh)
19/12/31在9:33



@WalkerBoh我尝试使用oo和OO,但是之后使用o和O会有延迟。具体来说,您必须等待1秒才能使o和O生效,因为vim正在侦听另一个潜在的击键。您是如何解决的?

–VishnuVS
20-10-25在8:57



您可能想减少超时时间,例如设置timeoutlen = 250 ttimeoutlen = 0

–沃克·波(Walker Boh)
20-10-26在13:42



#3 楼

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

评论


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

–威廉·范·凯奇(Willem van Ketwich)
18年1月3日,9:31

或使用“ oyy将其保存到o寄存器中,并在需要时使用” op将其粘贴到o寄存器中。

–mike23
19/12/3在20:36



#4 楼

我个人建议使用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 楼

我的映射使用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


评论


请注意,映射在终端仿真器中不起作用(仅在gVim中起作用)。因此,您需要选择一个不同的键组合以将其映射到;-)

–马丁·图尔诺伊(Martin Tournoij)
15年7月8日在7:42



#6 楼

马克西姆·金(Maxim Kim)的回答改变了生活:

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


我的即兴之处:将这些行放在vimrc中。然后转到文件第二行的开头并按空格键,按Enter,或转到第一行末尾并按Shift + Space键,按Enter键。要么在第一行和第二行之间添加一个空行,然后让您处于正常模式。

您还可以将它们用于任何其他单个键-按空格键或Shift + Space键,然后再按一个键想要,它将分别插入或附加。

#7 楼

我在Visual Studio Code中使用Vim扩展名,并且可以在按住Ctrl + Enter的常规模式下插入新行。

评论


欢迎来到Vi和Vim!我已对您的信息进行了一些格式化。请注意,您所描述的内容听起来很像特定于VSCode的键序列,因为默认情况下在vim中该键不起作用。

– D. Ben Knoble♦
20年8月4日在23:24

我一直在尝试查找,由于插件,VSCode中的这种行为是吗?你有什么主意吗?

–Hamza Zubair
20年8月11日在14:24

@HamzaZubair我使用了这个插件

–zrodr22
20年8月12日15:30



抱歉,不是我要问的,我也在使用相同的扩展名,我要问的是,vscodevim-extension内部允许的行为是什么,是否是设置,是否是vscode-内部的vim插件?插入?

–Hamza Zubair
20年8月18日在6:52

#8 楼

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



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

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


#9 楼

我对此的映射

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


与statox的映射不同,因为这使光标保持在同一位置。

评论


是什么意思?

– Alex
15年7月8日在2:39

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

–凯文
15年7月8日在2:42

#10 楼

我的个人解决方案将换行符粘贴到表达式寄存器中,并将其粘贴到当前行之后,然后跳回到原始位置:

nnoremap K m`"="\n"<CR>p``


#11 楼

我认为最简单的当然是o,然后是Esc,然后根据需要添加任意行,您可以继续按.或像5.一样(例如,是否要5个空白新行)