Como faço para inserir uma quebra de linha onde o cursor está sem entrar no modo de inserção no Vim?

88

É possível inserir uma quebra de linha onde o cursor está no Vim sem entrar no modo de inserção? Aqui está um exemplo ( [x]significa que o cursor está ativado x):

if (some_condition) {[ ]return; }

Ocasionalmente, posso querer inserir mais algum código. Então, pressionaria ipara entrar no modo de inserção, pressione Enterpara inserir a quebra de linha e, em seguida, excluiria o espaço extra. Em seguida, entraria no modo normal e posicionaria o cursor antes da chave de fechamento e, em seguida, faria a mesma coisa para colocá-lo em sua própria linha.

Eu tenho feito isso há um tempo, mas certamente há uma maneira melhor de fazer isso?

Mark A. Nicolosi
fonte
Você deseja inserir algo sem entrar no modo INSERT?
Jeremy Cantrell,
26
@ jeremy-cantrell Sim, assim como "J" se junta à próxima linha e insere um espaço em branco sem entrar no modo INSERT!
awendt

Respostas:

107

Para o exemplo que você deu, você poderia usar rEnterpara substituir um único caractere (o espaço) por Enter. Então, fspace.para avançar para o próximo espaço e repetir o último comando.

Dependendo das configurações de recuo automático, o acima pode ou não recuar a instrução de retorno corretamente. Caso contrário, use sEnterTabEscpara substituir o espaço por uma nova linha, recuar a linha e sair do modo de inserção. Você teria que substituir o segundo espaço por um comando diferente para que não pudesse usar '.' nesse caso.

Greg Hewgill
fonte
1
Acho que essa é a solução mais fácil. Obrigado Greg.
Mark A. Nicolosi
4
'f [espaço]' deve ser equivalente a 'W' (ou seja, mover para a próxima área branca)
Nathan Fellman
4
'W' move um caractere longe demais, ele se move para o próximo caractere após o próximo espaço em branco.
Greg Hewgill
1
Você também pode usar >>e <<para ajudar a recuar se não quiser entrar no modo de inserção com s.
Conner
12

Veja como criar uma macro que insere uma nova linha no cursor sempre que você pressiona 'g' enquanto não está no modo de inserção:

No vim, digite:

:map g i[Ctrl+V][Enter][Ctrl+V][Esc][Enter]

Onde:

  • [Ctrl + V] significa segurar a tecla Ctrl e pressionar 'v'
  • [Enter] significa pressionar a tecla Enter
  • [Esc] significa pressionar a tecla Esc

Você verá o seguinte na parte inferior da janela do vim até pressionar o Enter final:

:map g i^M^[

Explicação:

[Ctrl + V] significa "citar o seguinte caractere" - permite que você insira a nova linha e os caracteres de escape no comando.

Então, você está mapeando a tecla 'g' para a sequência:

i [Enter] [Escape]

Este é o vim para inserir uma nova linha antes do cursor e, em seguida, sair do modo de inserção .

Ajustes:

  • Você pode substituir o 'g' por qualquer caractere que ainda não esteja vinculado a um comando que você usa.
  • Adicionar mais para o comando, por exemplo f}i^M^[O - Isso vai f ind o } e i NSERT outra nova linha, em seguida, fugir do modo de inserção e O pen uma linha vazia para que você digite mais código.
  • Você pode adicionar o comando ao seu arquivo .vimrc ou .exrc para torná-lo permanente. Apenas omita os dois pontos do início, então o comando começa com "map"

Aproveitar!

Adam Liss
fonte
Você respondeu à pergunta mal formulada no assunto, em vez da na postagem. O que ele quer saber é como se livrar facilmente do espaço em branco que estava no ponto em que a linha foi rompida, mas não tem mais utilidade.
Aristotle Pagaltzis
Obrigado. Atualizada a seção "Ajustes" para realizar o que (eu acho) o autor solicitou. Quando o testei, o vi removeu automaticamente os espaços extras para mim; use 'x' para excluí-los se o seu não. E por que os comandos do vi parecem ruído de linha de modem? :-)
Adam Liss
11

Um mapeamento simples para quebrar a linha do cursor pressionando Ctrl + Enter:

:nmap <c-cr> i<cr><Esc>

essencialmente entra no modo 'inserir', insere uma quebra de linha e volta ao modo normal.

coloque-o em seu arquivo .vimrc para uso futuro.

Yariv
fonte
5

Se você costuma expandir um bloco de uma linha para três linhas, tente a substituição. Mude o colchete de abertura para colchete / retorno, e o colchete de fechamento para retorno / colchete.

O comando para substituir colchete / retorno de colchete tem a seguinte aparência:

:s/{/{\r/

Como você deseja usar isso com frequência, pode mapear a sequência completa para um pressionamento de tecla não usado como este:

:map <F7> :s/{/{\r/ ^M :s/}/\r}/ ^M

Onde você vir ^ M na sequência, digite [Ctrl-V] e pressione enter .

Agora, com o cursor em qualquer lugar na linha de amostra, pressione a tecla mapeada e os retornos de carro são adicionados.

Verifique os :help map-which-keysconselhos sobre como selecionar as teclas não utilizadas para mapear.

Urso-preguiça
fonte
BTW: gnão é mapeado porque é usado como chave de 'namespace' para muitos mapeamentos de vim que consistem em duas combinações de teclas (consulte :h g). Portanto, este mapeamento é realmente impossível.
Hotschke
Existe um bom comando que relata que gjá está em uso como uma chave de 'namespace'?
urso
Não em particular. Como eu disse, :help gé uma maneira de ver uma lista de gmapeamentos padrão + algo. z, [ ]são outras chaves de 'namespace', consulte, por exemplo :help index. Você pode invocar :verbose map gpara ver todos os mapeamentos definidos no momento, começando com g. Webresources úteis são viemu.com/vi-vim-cheat-sheet.gif , vimcasts.org/blog/2014/02/follow-my-leader , vimeo.com/85343734 (slides: speakerdeck.com/nelstrom/follow-my -leader )
Hotschke
3

Supondo que você esteja bem com o mapeamento Kpara outra coisa (escolha uma chave diferente de sua preferência) e usando o marcador 'como um marcador temporário, tudo bem, por que não fazer isso?

:nmap K m'a<CR><Esc>`'

agora, pressionar K no modo normal sobre o caractere após o qual você deseja que ocorra a quebra de linha dividirá a linha e deixará o cursor onde estava.

Mondaugen
fonte
1

O Vim eliminará automaticamente qualquer espaço em branco à direita do cursor se você quebrar uma linha em duas enquanto autoindent(ou qualquer outro auxílio de recuo) estiver habilitado.

Se você não quiser usar qualquer uma dessas configurações, use sem vez de ino fim de s ubstitute seu novo texto para o espaço em branco em vez de apenas inserir. (Se houver vários espaços em branco, coloque o cursor à esquerda e use em seu cwlugar.)

Aristotle Pagaltzis
fonte
1

Basicamente, ao dividir uma linha, você quer apenas inserir um retorno de carro ou, no caso de estar em um espaço, substitua-o por um retorno de carro. Bem, por que se contentar com um ou outro? Aqui está meu mapeamento para K:

"Have K split lines the way J joins lines
nnoremap <expr>K getline('.')[col('.')-1]==' ' ? "r<CR>" : "i<CR><Esc>"

Eu uso o operador ternário para condensar as duas ações em um mapa-chave. Dividindo-o, <expr>significa que a saída do mapa-chave pode ser dinâmica e, neste caso, depende da condição getline('.')[col('.')-1]==' 'que é a longa maneira de perguntar ao vim se o caractere sob o cursor é um espaço. Finalmente, o operador ternário familiar ? :substitui o espaço por quebra de linha ( r<CR>) ou insere um novo ( i<CR><Esc>)

Agora você tem um adorável mapa de teclas irmãs para o Jcomando.

ctrl
fonte
Isso é muito bom. Não tenho certeza se já usei K intencionalmente, mas isso pode valer a pena se livrar ou remapear em outro lugar.
dragon788
0

Defina este mapeamento de teclas em seu vimrc

:map <C-m> i<CR><Esc>h

Em seguida, pressione Ctrl + m se quiser usá-lo em seu vim.

Kiddo
fonte
0

IMHO, o mapeamento embutido gsnão é um mapeamento útil (colocar o vim para dormir), pode-se usar isso para dividir:

nmap gs i<CR><ESC>
Hotschke
fonte
0

No Vrapper, você pode usar o gql, que divide uma linha sem entrar no modo de inserção, mas nem sempre mantém o recuo.

Janac Meena
fonte
0

Na verdade, você precisa das seguintes operações combinadas:

  1. Pressione vpara entrar no modo visual
  2. Selecione a linha que deseja dividir
  3. Pressione :para entrar no Modo de Comando
  4. s/\s/\r/g
  5. Feito
Nathan
fonte
0

Se você tiver a informação:

aaa bbb ccc ddd

e deseja produzir

aaa
bbb
ccc
ddd

Você pode usar o comando

f r<ENTER>;.;.
Yarden Akin
fonte
0

Eu descobri que esta é a implementação mais fiel do que eu esperava que o comportamento oposto J

nnoremap S i<cr><esc>^mwgk:silent! s/\v +$//<cr>:noh<cr>`w

Ele faz a nova linha simplista no cursor, cuida de qualquer espaço em branco à direita na linha anterior, se houver algum presente, e então retorna o cursor para a posição correta.

i <cr> <esc> - esta é uma das soluções mais comuns sugeridas, ela não exclui caracteres que não sejam de espaço em branco sob o seu cursor, mas também deixa você com espaços em branco à direita

^mw - vá para o início da nova linha e crie uma marca sob w

gk - subir uma linha

:silent! s/\v +$//<cr> - regex substitui qualquer espaço em branco no final da linha

:noh<cr> - Limpe qualquer pesquisa destacando que o regex pode ter sido ativado

`w - devolver a marca sob w

Combina essencialmente o melhor de ambos r<esc><cr>ei<cr><esc>

Observação: eu tenho esse limite Sque potencialmente sobrescreve uma chave útil, mas é um sinônimo de cce, como não o uso com tanta frequência como faço as divisões, posso sobrescrevê-lo.

JaredMcAteer
fonte
0

o ESC comando vai fazer isso por você.

logbasex
fonte
-1

Esse mapeamento quebrará qualquer função de uma linha que você tenha. Basta colocar o cursor na linha e clicar em 'g' no modo normal:

:map g ^f{malr<CR>`a%hr<CR>`a

Isso pressupõe que você tenha um espaço após a chave de abertura e um espaço antes da chave de fechamento. Veja se isso funciona para você.

Lucas omã
fonte