Ripetizione di caratteri in modalità inserimento VIM


141

C'è un modo per ripetere un personaggio nella modalità di inserimento di Vim? Ad esempio, supponiamo che vorrei inserire 80 trattini, in qualcosa come emacs digitare:

Ctrl+U   8 0 -

L'unico modo in cui so come farlo in VIM è uscire dalla modalità normale per l'argomento repeat, quindi tornare alla modalità di inserimento per digitare il trattino, quindi uscire per inserire i trattini effettivi, quindi tornare alla modalità di inserimento per continuare digitando. La sequenza è davvero lunga:

Esc 8 0 a - Esc a

Sarebbe bello non attivare o disattivare le modalità.

Risposte:


20

Versione leggermente diversa della soluzione di 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>

259

Se stai bene lasciando la modalità INSERT una sola volta (alla fine), questa sequenza funziona:

Ctrl+o 80i- Esc

  • Ctrl+ oviene utilizzato per inviare i normali comandi senza uscire dalla modalità INSERT,
  • 80 la ripetizione,
  • i inserire,
  • - il personaggio che vuoi inserire,
  • Esc per uscire dalla modalità INSERT.

Un altro senza MAI uscire dalla modalità INSERT:

Ctrl+o :norm 8ia Return


6
La tua risposta e la risposta del PO sono le uniche che funzionano per me.
twblamer,

34
"<Co> è usato per impartire comandi normali senza uscire dalla modalità INSERT" vince il mio premio "non posso credere-non-non-non-ho-saputo-di-questo"!
Stabledog

11
<C-o>è una scorciatoia per Ctrl+ o.
Shaun Luttin,

3
C'è anche il :normalcomando che ti consente di emetterli dal prompt dei comandi. Occasionalmente abbastanza utile.
Mark Reed,

157

Escnic Esc Esc.

Ad esempio Esc4iJEsc Escverrà emesso JJJJ.


3
Sfortunatamente questo non funziona su Vim a meno che non si ritorni alla modalità normale.
Cthutu,

5
Ma questa è la migliore risposta nel "modo vim".
Drasill,

1
Mi ritrovo sempre a tornare alla modalità di inserimento quando premo la i, quindi inserirò solo il PERSONAGGIO. Come lo lavoro?
Severo Raz

1
Questa è l'esatta sequenza di comandi che l'OP ha voluto evitare .
Kenny Evitt,

1
Questa potrebbe non essere la risposta alla domanda che è stata posta, ma è il modo migliore per farlo ed è la risposta alla domanda che stavo cercando.
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.

8
Questa è l'esatta sequenza di comandi che l'OP ha voluto evitare .
Kenny Evitt,

13

Tramite ripetizione singola:

Insert mode
-
Esc
80.

Maggiori dettagli sulla ripetizione singola: :help .


Grazie, ma questa soluzione richiede di uscire dalla modalità di inserimento.
Cthutu,

8

Puoi anche fare, Escnihello there EscEsc

dove, n è il numero di ripetizioni.

per esempio, Esc5ihello there EscEsc


Sembra un duplicato esatto della risposta
mkobit,

Non è un duplicato esatto. L'altro non ha funzionato per me. Qui mi sono reso conto che devo premere Escdue volte dopo. Grazie @prashant
Sridhar Sarnobat il

7

Ci sono molti altri modi, ma AFAIK quello che descrivi è il più breve. In realtà dovresti principalmente passare il tuo tempo in modalità comando, quindi sarebbero solo 3 sequenze di tasti + il numero di ripetizioni (80i-).

Tuttavia, se scopri che usi spesso questa cosa ripetuta, puoi farti una funzione o una macro a tal fine; forse qualcosa del tipo:

: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>

Non ha funzionato per me, ma grazie per la risposta. La mia conoscenza del linguaggio di programmazione VIM non è abbastanza buona da capire perché.
Cthutu,

6

Hai detto che sarebbe "bello" rimanere in modalità "Inserisci", tuttavia in modalità Comando il seguente metodo eviterebbe il tuo secondo ESC: -

Mentre so che questo post è vecchio, sembra un peccato perdere l'evidente opzione 'Taglia / Copia e Incolla' ...

x ...tagliare

80 ...numero di copie

p Incolla

Nota: questo è simile al metodo suggerito da Martin Beckett, tuttavia ottengo un ritardo quando si emette quel comando, forse perché cambia modalità più volte, questo comando viene eseguito immediatamente.


1
Ho dovuto usare v yper accedere alla modalità visiva, quindi strattonare, quindi 80 pincollarlo 80 volte. Mi sto perdendo qualcosa o hai dimenticato un passaggio?
alexanderbird,

Ben individuato, avrei dovuto usare 'x' per tagliare, quindi incollare. Grazie ho modificato la mia risposta.
Inyoka,

1
bello dal momento che questo è in realtà più veloce del tipico metodo di ripetizione.
Ausiliario,

3

Risposta tardiva ma per quello che vale, se vuoi spargerlo a mano, puoi usare il comando "ripeti l'ultimo comando": .

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).

Lo trovo particolarmente utile quando non so esattamente quante ripetizioni voglio fare, ma so visivamente quanto tempo voglio che sia. Fondamentalmente sparo .fino a quando i miei occhi sono contenti.


3

Sono sorpreso che nessuno l'abbia ancora suggerito:

In modalità Inserisci, utilizzare <C-r>=repeat('-', 80)<CR>

Questo è:

  • stampa Ctrl-r=
  • Alla richiesta risultante, immettere repeat('-', 80)
  • stampa Enter

Funziona per ripetere qualsiasi personaggio un numero qualsiasi di volte.

Questo utilizza più sequenze di tasti della risposta di @ romainl, ma non lascia affatto la modalità Inserisci.


2

Oltre alla funzione di scrittura che ripeterà più volte il testo, è possibile utilizzare <C-x><C-l>: se si dispone già di una riga che contiene 80 trattini, scrivere alcuni trattini all'inizio di una nuova riga e quindi premere <C-x><C-l>completerà le righe che iniziano con questi pochi trattini che probabilmente quella linea con 80 trattini. In questo modo scrivevo linee orizzontali (78 trattini) nei file della guida.


1

Per un compito così semplice abbreviationdovrebbe fare il trucco. Aggiungi quanto segue al tuo.vimrc

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

e da ora, quando digiti --seguito da uno spazio (mentre sei in modalità inserimento), --verrà automaticamente convertito in -80 volte.

Usando la funzione repeatsei in grado di ripetere la stringa quante volte vuoi.

Si noti che è possibile testarlo prima di aggiornare .vimrcentrando in commandmodalità e quindi emettendo quanto segue:iab <expr> -- repeat('-', 80)


1

L'ho fatto senza uscire dalla modalità INSERT utilizzando i passaggi seguenti.

  1. Abilita la modalità INSERT.
  2. Digitare un trattino "-".
  3. Ctrl + O
  4. 'v' minuscola (per accedere alla -- (insert) VISUAL --modalità)
  5. 'y' minuscola (da copiare)
  6. Ctrl + O
  7. Digitare 80
  8. Quindi, seguito da una 'p' minuscola (per incollare).

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

Ciò stamperà tutti i trattini in orizzontale su una sola riga.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.