Como inserir uma nova linha sem sair do modo normal

24

Gostaria de saber se posso inserir uma nova linha sem sair do modo normal. Por exemplo, eu tenho duas linhas:

this is line one
this is line two

E o cursor está na linha um. Agora eu quero uma nova linha entre a linha um e a linha dois, assim:

this is line one

this is line two

Sei que quando estou no modo normal, posso simplesmente pressionar o. Mas isso entraria no modo de inserção.

Como posso inserir uma nova linha como e permanecer no modo normal?

Alex
fonte

Respostas:

10

Eu uso um mapeamento para isso:

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

Dessa forma, você pode inserir uma linha sob o cursor com <Leader>oe uma na linha anterior com <Leader>O.

Nota: Pode-se argumentar que isso exige o número de pressionamentos de teclas, o<Esc>mas espero que você tenha escolhido seu líder para facilitar esse tipo de mapeamento. Também não tenho certeza se existe uma maneira integrada de fazer isso.

statox
fonte
8

Uma solução que não passa pelo modo de inserção, não move o cursor e permite que você use um contador para acrescentar várias linhas ao mesmo tempo ( 3\oetc.):

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>
lcd047
fonte
5

Eu, pessoalmente, recomendo usar o plugin Unimpaired de Tim Pope . Ele fornece muitos mapeamentos, mas os que você procura são [<space>e ]<space>criam linhas em branco acima e abaixo da linha atual, respectivamente. O Unimpaired também fornece bons mapeamentos para percorrer a lista de correções rápidas, a lista de buffers, a alternância de opções e muitas outras. Veja :h unimpairedpara mais.

Se você não deseja usar um plug-in intacto, mas, como os mapeamentos abaixo, existem alguns mapeamentos rápidos para colocar em seu ~/.vimrcarquivo:

nnoremap <silent> [<space>  :<c-u>put!=repeat([''],v:count)<bar>']+1<cr>
nnoremap <silent> ]<space>  :<c-u>put =repeat([''],v:count)<bar>'[-1<cr>
Peter Rincker
fonte
5

Se você não deseja adicionar mapeamentos, pode puxar yyuma linha vazia e colá p-la abaixo do cursor e Pacima do cursor.

Gilbert
fonte
Esta é provavelmente a melhor resposta sem mapeamento.
Willem van Ketwich
Ou salve-o no oregistro "oyye cole-o a partir daí sempre que necessário "op.
mike23 3/12
4

Meu mapeamento usa Shift-Enter. Difere dos demais, pois o cursor é retornado para a mesma linha e coluna usando a marca 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
stefrobb
fonte
5
Observe que o mapeamento <S-Enter>não funciona em emuladores de terminal (ele funciona apenas no gVim). Então você terá que escolher uma combinação de teclas diffferent para mapeá-lo para ;-)
Martin Tournoij
2

Esta resposta de Maxim Kim foi transformadora:

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

e meu riff:

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

Coloque essas linhas no seu vimrc. Então vá para o início da segunda linha do seu arquivo e hit Space, Enterou ir para o final da primeira linha e hit Shift+Space, Enter. Você adicionará a linha vazia entre a primeira e a segunda linhas e o deixará no modo normal.

Você também pode usá-los para qualquer outra tecla - pressionada Spaceou Shift+Spaceseguida pela tecla desejada e ela será inserida ou anexada, respectivamente.

cxw
fonte
2

Esses mapeamentos farão exatamente o que você está procurando.

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

Eles inserem n número de novas linhas antes ou depois do cursor; mantendo o cursor exatamente onde está, sem alterar a lista de atalhos.

Outra solução é apenas criar um atalho que preencha o registro sem nome com uma nova linha. Então você pode simplesmente usar os comandos put, p ou P para inserir novas linhas. Por exemplo:

nnoremap "<cr> :let @@="\n"<cr>
Eric
fonte
1

Meu mapeamento para isso

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

Diferente do statox, pois mantém o cursor no mesmo local.

Kevin
fonte
o que <silent>significa
828 Alex
Impede ecoar qualquer coisa na linha de status. Tenho certeza de que não faz nada nesse caso específico, estava lá onde quer que eu o copiei, há muito tempo. Veja :h map-silent.
Kevin
-1

Minha solução pessoal coloca um caractere de nova linha no registro de expressão e o cola após a linha atual e depois volta à posição original:

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