Repetindo caracteres no modo de inserção do VIM

141

Existe uma maneira de repetir um caractere enquanto estiver no modo de inserção do Vim? Por exemplo, digamos que eu gostaria de inserir 80 traços, em algo como o emacs, digite:

Ctrl+U   8 0 -

A única maneira de saber como fazê-lo no VIM é sair do modo normal para o argumento de repetição, depois voltar ao modo de inserção para digitar o traço, sair para inserir os traços reais E voltar ao modo de inserção para continuar digitando. A sequência é realmente longa:

Esc 8 0 a - Esc a

Seria bom não ativar e desativar os modos.

Cthutu
fonte

Respostas:

20

Versão ligeiramente diferente da solução da Eelvex:

function! Repeat()
    let times = input("Count: ")
    let char  = input("Char: ")
    exe ":normal a" . repeat(char, times)
endfunction

imap <C-u> <C-o>:call Repeat()<cr>
Matteo Riva
fonte
259

Se você sair do modo INSERT apenas uma vez (no final), esta sequência funcionará:

Ctrl+o 80i- Esc

  • Ctrl+ oé usado para emitir comandos normais sem sair do modo INSERT,
  • 80 a repetição,
  • i inserir,
  • - o caractere que você deseja inserir,
  • Esc para sair do modo INSERT.

Outro sem NUNCA sair do modo INSERT:

Ctrl+o :norm 8ia Return

romainl
fonte
6
Sua resposta e a resposta do OP são as únicas que funcionam para mim.
twblamer
34
"<Co> é usado para emitir comandos normais sem sair do modo INSERT" ganha meu prêmio "não posso acreditar que nunca soube sobre esse prêmio!"
Stabledog
11
<C-o>é uma abreviação de Ctrl+ o.
Shaun Luttin
3
Há também o :normalcomando que permite emiti-los no prompt de comando. Ocasionalmente bastante útil.
Re
157

Escnic Esc Esc.

Por exemplo, Esc4iJEsc Escserá exibido JJJJ.

Martin Beckett
fonte
3
Infelizmente isso não funciona no meu vim, a menos que você volte ao modo normal.
Cthutu
5
Mas esta é a melhor resposta da "maneira vim".
Drasill
1
Eu sempre me pego voltando ao modo de inserção quando pressiono o i, então apenas inserirei CHARACTER. Como eu trabalho isso?
precisa
1
Essa é a sequência exata de comandos que o OP queria evitar .
Kenny Evitt
1
Esta pode não ser a resposta para a pergunta que foi feita, mas é a melhor maneira de fazê-lo e é a resposta para a pergunta que eu estava procurando.
Michael Leonard
20
<ESC> 
<the number of times you want to repeat>
i 
<the char you want to repeat> 
<ESC>

for example: <ESC>12ia<ESC> will insert 12 a's.
qed
fonte
8
Essa é a sequência exata de comandos que o OP queria evitar .
Kenny Evitt
13

Através da repetição única:

Insert mode
-
Esc
80.

Mais detalhes sobre a repetição única: :help .

itsnikolay
fonte
Obrigado, mas esta solução exige que você saia do modo de inserção.
Cthutu
8

Você também pode fazer, Escnihello there EscEsc

onde, n é o número de repetições.

por exemplo, Esc5ihello there EscEsc

prashant
fonte
Este parece ser uma cópia exata do de Martin Beckett resposta
mkobit
Não é uma duplicata exata. O outro não funcionou para mim. Aqui eu percebi que tenho que pressionar Escduas vezes depois. Obrigado @prashant
Sridhar Sarnobat
7

Existem muitas outras maneiras, mas a AFAIK, a que você descreve, é a mais curta. No vim, você costuma gastar seu tempo no modo de comando, de modo que seriam apenas 3 pressionamentos de tecla + o número de repetições (80i-).

No entanto, se você achar que costuma usar essa coisa repetida, pode se tornar uma função ou macro para esse fim; talvez algo como:

:function Repeat(char)
: let counter = input("How many times?: ")
: call feedkeys("i")
: call feedkeys(repeat(a:char,counter))
:endfunction
:imap <C-U> <ESC>h"ryl :call Repeat(@r)<CR>
Eelvex
fonte
Não funcionou para mim, mas obrigado pela resposta. Meu conhecimento da linguagem de programação vim não é bom o suficiente para descobrir o porquê.
Cthutu
6

Você disse que seria "bom" permanecer no modo "Inserir", no entanto, no modo de comando, o seguinte método evitaria o seu segundo ESC:

Embora eu saiba que este post é antigo, parece uma pena perder a opção óbvia de 'Cortar / Copiar e Colar' ...

x ...cortar

80 ...número de cópias

p Colar

Nota: Isso é semelhante ao método sugerido por Martin Beckett; no entanto, recebo um atraso ao emitir esse comando, talvez porque ele mude de modo várias vezes, esse comando seja executado instantaneamente.

Inyoka
fonte
1
Eu tive que usar v ypara entrar no modo visual, depois puxar e 80 pcolar 80 vezes. Estou perdendo alguma coisa, ou você esqueceu um passo?
Alexanderbird #
Bem manchado, eu deveria ter usado 'x' para cortar e colar. Obrigado, eu alterei minha resposta.
Inyoka 11/11/19
1
agradável, pois isso é realmente mais rápido que o método de repetição típico.
Auxiliar
3

Resposta tardia, mas pelo que vale a pena, se você quiser enviar spam, use o comando "repeat last command": .

i"Frase" Esc -i to insert, enter phrase/character, esc to go normal mode

. - Spam till you are satisfied. Will repeatedly input the phrase you typed (it repeats your last command).

Acho isso especialmente útil quando não sei exatamente quantas repetições quero fazer, mas sei visualmente quanto tempo quero. Basicamente explodir .até meus olhos estarem satisfeitos.

gowrath
fonte
3

Estou surpreso que ninguém tenha sugerido isso ainda:

No modo Inserir, use <C-r>=repeat('-', 80)<CR>

Isso é:

  • pressione Ctrl-r=
  • No prompt resultante, digite repeat('-', 80)
  • pressione Enter

Funciona para repetir qualquer caractere várias vezes.

Isso usa mais teclas do que a resposta de @ romainl, mas não sai do modo Inserir.

gpanders
fonte
2

Além da função de escrita que repetirá o texto várias vezes, você pode usar <C-x><C-l>: se você já possui uma linha que contém 80 traços, escreva alguns traços no início da nova linha e pressione-o <C-x><C-l>para concluir as linhas que começam com esses poucos traços. provavelmente essa linha com 80 traços. Eu costumava escrever linhas horizontais (78 traços) nos arquivos de ajuda dessa maneira.

ZyX
fonte
1

Para uma tarefa tão fácil abbreviationdeve fazer o truque. Adicione o seguinte ao seu.vimrc

iab <expr> -- repeat('-', 80)

e a partir de agora, quando você digitar --seguido por um espaço (enquanto estiver no modo de inserção), --ele será automaticamente convertido para -80 vezes.

Usando a função repeat você pode repetir a sequência quantas vezes quiser.

Observe que você pode testá-lo antes de atualizar .vimrc, entrando no commandmodo e emitindo o seguinte:iab <expr> -- repeat('-', 80)

Samir Sadek
fonte
1

Fiz isso sem sair do modo INSERT usando as etapas abaixo.

  1. Ative o modo INSERIR.
  2. Digite um traço "-".
  3. Ctrl + O
  4. 'v' minúsculo (para entrar no -- (insert) VISUAL --modo)
  5. 'y' minúsculo (para copiar)
  6. Ctrl + O
  7. Tipo 80
  8. Em seguida, seguido de 'p' em minúsculas (para colar).

i - Ctrl+o v y Ctrl+o 80 p

Isso imprimirá todos os traços horizontalmente em uma única linha.

hel
fonte