Como insiro uma quebra de linha onde está o cursor sem entrar em modo de inserção no vim?

StackOverflow https://stackoverflow.com/questions/237383

  •  04-07-2019
  •  | 
  •  

Pergunta

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

if (some_condition) {[ ]return; }

Às vezes, eu poderia querer entrar mais algum código. Então eu pressionar i para entrar no modo de inserção, pressione Enter para inserir a quebra de linha e, em seguida, excluir o espaço extra. Em seguida, eu iria entrar no modo normal e posicione o cursor antes da chave de fechamento e, em seguida, fazer a mesma coisa para obtê-lo em sua própria linha.

Eu venho fazendo isso há algum tempo, mas há certamente uma maneira melhor de fazer isso?

Foi útil?

Solução

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

Dependendo das configurações autoindent, o acima pode ou não pode recuar a instrução de retorno corretamente. Se não, então use s Enter Tab Esc em vez de substituir o espaço com uma nova linha, recuar a linha, e sair do modo de inserção. Você teria que substituir o segundo espaço com um comando diferente para que você não pode usar '' neste caso.

Outras dicas

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

De dentro vim, digite:

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

Onde:

  • [Ctrl + V] significa segure a tecla Ctrl e pressione 'v'
  • [Enter] meios pressione a tecla Enter
  • [Esc] significa pressione a tecla Esc

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

:map g i^M^[

Explicação:

[Ctrl + V] significa "citar o seguinte caráter." - ele permite que você incorporar o newline e escapar caracteres no comando

Então, você está mapeando o 'g' chave para a seqüência:

i [Enter] [Escape]

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

Tweaks:

  • Você pode substituir o 'g' com qualquer caractere que não esteja ligado a um comando que você usar.
  • Adicionar mais para o comando, ex f}i^M^[O - Esta vontade 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 de código.
  • Você pode adicionar o comando ao seu .vimrc ou .exrc arquivo para torná-lo permanente. Basta omitir o cólon desde o início, portanto, o comando começa com "mapa"

Aproveite!

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

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

essencialmente entra no modo de 'inserção', insere uma quebra de linha e volta para o modo normal.

colocá-lo em seu arquivo .vimrc para uso futuro.

Se você está geralmente expansão de um bloco de uma linha de três linhas, tente substituição. Alterar o colchete de abertura no suporte / retorno, e o colchete de fechamento em retorno / suporte.

O comando de substituição de suporte / troca de olhares suporte como este:

:s/{/{\r/

Uma vez que você quiser usar isso muitas vezes, você pode mapear a sequência completa de um keystroke não utilizado assim:

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

Onde você vê ^ M na seqüência, digite [Ctrl-V] , em seguida, pressione insira .

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

Verifique :help map-which-keys para aconselhamento sobre a seleção de combinações de teclas não utilizadas para mapear.

Assumindo que você está bem com o mapeamento K para outra coisa (escolher uma chave diferente do seu gosto), e usando o marcador ' como um marcador temporário é bom, por que não fazer isso?

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

Agora pressionando K no modo normal sobre o caráter após o qual pretende a quebra de linha para ocorrer irá dividir a linha e deixar o cursor onde estava.

Vim vai matar automaticamente qualquer espaço em branco à direita do cursor se você quebrar uma linha em dois, enquanto autoindent (ou qualquer outro auxílio recuo) está habilitado.

Se você não quiser usar qualquer uma dessas configurações, use s vez de i, a 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 sobre o mais à esquerda e à utilização cw vez.)

Definir esse mapeamento chave em seu vimrc

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

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

IMHO, o embutido gs mapeamento não é um mapeamento útil (vim colocar a dormir), pode-se utilizar esta para a separação:

nmap gs i<CR><ESC>

Na Vrapper você pode usar gql que irá dividir uma linha sem entrar modo de inserção, mas não pode sempre manter o recuo.

Basicamente, quando você dividir uma linha você ou quiser apenas inserir um retorno de carro, ou no caso em que você está em um espaço, trocar por um retorno de carro. Bem, por que se contentar com um ou o outro? Aqui está a minha 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. Dividi-lo, <expr> significa do mapa chave saída pode dinâmica e neste caso dobradiças da getline('.')[col('.')-1]==' ' condição que é a maneira de longo fôlego para perguntar vim se o personagem sob o cursor é um espaço. Finalmente, o familiar ? : operador ternário, quer substitui o espaço com linebreak (r<CR>) ou inserções uma nova (i<CR><Esc>)

Agora você tem um mapa chave irmã linda ao comando J.

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

  1. Pressione v para 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. Concluído

Se você tem a entrada:

aaa bbb ccc ddd

e querem saída

aaa
bbb
ccc
ddd

Você pode usar o comando

f r<ENTER>;.;.

Eu encontrei este para ser a implementação mais fiel do que eu esperaria o comportamento oposto ao J

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

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

i - esta é uma das soluções mais comuns sugeridas, isso não exclui não-espaço em branco caracteres sob o cursor mas também deixa-lo com espaços em branco

^ mw - Goto início da nova linha e criar uma marca sob w

gk - subir uma linha

: em silêncio! s / \ v + $ // - regex substituir qualquer espaço em branco no final da linha

: noh - Clear qualquer pesquisa destacando que a regex poderia ter ligado

`w - devolver a marca sob w

Essencialmente combina o melhor de ambos r e i < cr>

Nota: Eu tenho este obrigado a S , que potencialmente substitui uma chave útil, mas é um sinônimo para cc e desde que eu não usá-lo tão frequentemente como eu fazer splits Eu estou bem com substituí-lo.

Esse mapeamento vai quebrar qualquer função de uma linha que você tem. Simplesmente ponha seu cursor na linha e clique em 'g' no modo normal:

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

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top