Wiederholen von Zeichen im VIM-Einfügemodus

141

Gibt es eine Möglichkeit, ein Zeichen im Einfügemodus von Vim zu wiederholen? Angenommen, ich möchte 80 Bindestriche in Emacs einfügen, die ich eingeben würde:

Ctrl+U   8 0 -

Die einzige Möglichkeit, wie ich es in VIM machen kann, besteht darin, den normalen Modus für das Wiederholungsargument zu verlassen, dann in den Einfügemodus zurückzukehren, um den Bindestrich einzugeben, dann zu beenden, um die tatsächlichen Striche einzufügen, und dann in den Einfügemodus zurückzukehren, um fortzufahren Tippen. Die Sequenz ist wirklich lang:

Esc 8 0 a - Esc a

Es wäre schön, nicht in den Modus ein- und auszuschalten.

Cthutu
quelle

Antworten:

20

Etwas andere Version der Eelvex-Lösung:

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
quelle
257

Wenn Sie den INSERT-Modus nur einmal (am Ende) verlassen können, funktioniert diese Sequenz wie folgt:

Ctrl+o 80i- Esc

  • Ctrl+ owird verwendet, um normale Befehle auszugeben, ohne den INSERT-Modus zu verlassen.
  • 80 die Wiederholung,
  • i einführen,
  • - das Zeichen, das Sie einfügen möchten,
  • Esc um den INSERT-Modus zu verlassen.

Eine andere, ohne jemals den INSERT-Modus zu verlassen:

Ctrl+o :norm 8ia Return

romainl
quelle
6
Ihre Antwort und die Antwort des OP sind die einzigen, die für mich funktionieren.
Twblamer
34
"<Co> wird verwendet, um normale Befehle auszugeben, ohne den INSERT-Modus zu verlassen" gewinnt meine Auszeichnung, ich kann nicht glauben, dass ich nie von dieser Auszeichnung gewusst habe!
Stallhund
11
<C-o>ist eine Abkürzung für Ctrl+ o.
Shaun Luttin
3
Es gibt auch den :normalBefehl, mit dem Sie sie an der Eingabeaufforderung ausgeben können. Gelegentlich sehr nützlich.
Mark Reed
157

Escnic Esc Esc.

ZB Esc4iJEsc Escwird ausgegeben JJJJ.

Martin Beckett
quelle
3
Leider funktioniert das auf meinem vim nur, wenn Sie wieder in den normalen Modus zurückkehren.
Cthutu
5
Aber dies ist die beste Antwort auf die "vim Weise".
Drasill
1
Ich kehre immer wieder in den Einfügemodus zurück, wenn ich das i drücke, also füge ich nur CHARACTER ein. Wie arbeite ich das?
Severo Raz
1
Dies ist die genaue Reihenfolge der Befehle, die das OP vermeiden wollte .
Kenny Evitt
1
Dies ist möglicherweise nicht die Antwort auf die gestellte Frage, aber es ist die beste Möglichkeit, dies zu tun, und es ist die Antwort auf die Frage, nach der ich gesucht habe.
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
quelle
8
Dies ist die genaue Reihenfolge der Befehle, die das OP vermeiden wollte .
Kenny Evitt
13

Durch einzelne Wiederholung:

Insert mode
-
Esc
80.

Weitere Details zur Einzelwiederholung: :help .

itsnikolay
quelle
Vielen Dank, aber für diese Lösung müssen Sie den Einfügemodus verlassen.
Cthutu
8

Sie können auch tun, Escnihello there EscEsc

Dabei ist n die Anzahl der Wiederholungen.

z.B, Esc5ihello there EscEsc

prashant
quelle
Dies sieht aus wie ein genaues Duplikat von Martin Becketts Antwort
mkobit
Es ist kein genaues Duplikat. Der andere hat bei mir nicht funktioniert. Hier wurde mir klar, dass ich Escdanach zweimal drücken muss . Vielen Dank @prashant
Sridhar Sarnobat
7

Es gibt viele andere Möglichkeiten, aber AFAIK, die Sie beschreiben, ist die kürzeste. In vim solltest du deine Zeit meistens im Befehlsmodus verbringen, das wären also nur 3 Tastenanschläge + die Anzahl der Wiederholungen (80i-).

Wenn Sie jedoch feststellen, dass Sie diese Wiederholungssache sehr häufig verwenden, können Sie sich zu diesem Zweck eine Funktion oder ein Makro erstellen. vielleicht so etwas wie:

: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
quelle
Es hat bei mir nicht funktioniert, aber danke für die Antwort. Meine Kenntnisse der Programmiersprache vim sind nicht gut genug, um herauszufinden, warum.
Cthutu
6

Sie sagten, es wäre "schön", im "Einfügen" -Modus zu bleiben, aber im Befehlsmodus würde die folgende Methode Ihre 2. vermeiden ESC : -

Obwohl ich weiß, dass dieser Beitrag alt ist, scheint es eine Schande zu sein, die offensichtliche Option "Ausschneiden / Kopieren und Einfügen" zu verpassen ...

x ...Schnitt

80 ...Anzahl der Kopien

p Einfügen

Hinweis: Dies ähnelt der von Martin Beckett vorgeschlagenen Methode. Bei der Ausgabe dieses Befehls tritt jedoch eine Verzögerung auf. Möglicherweise wird dieser Befehl sofort ausgeführt, da er mehrmals den Modus wechselt.

Inyoka
quelle
1
Ich musste verwenden, v yum in den visuellen Modus zu wechseln, dann 80 pzu ziehen und dann 80 Mal einzufügen . Vermisse ich etwas oder hast du einen Schritt vergessen?
Alexanderbird
Gut entdeckt, ich hätte 'x' zum Ausschneiden und Einfügen verwenden sollen. Danke, ich habe meine Antwort geändert.
Inyoka
1
schön, da dies tatsächlich schneller ist als die typische Wiederholungsmethode.
Auxiliary
3

Späte Antwort, aber für das, was es wert ist, können Sie den Befehl "letzten Befehl wiederholen" verwenden, wenn Sie Spam per Hand senden möchten: .

i"Phrase" 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).

Ich finde das besonders nützlich, wenn ich nicht genau weiß, wie viele Wiederholungen ich machen möchte, aber visuell weiß, wie lange es dauern soll. Grundsätzlich sprengen die .bis meine Augen zufrieden sind.

Gowrath
quelle
3

Ich bin überrascht, dass dies noch niemand vorgeschlagen hat:

Verwenden Sie im Einfügemodus <C-r>=repeat('-', 80)<CR>

Das ist:

  • Drücken Sie Ctrl-r=
  • Geben Sie an der resultierenden Eingabeaufforderung ein repeat('-', 80)
  • Drücken Sie Enter

Funktioniert, um ein beliebiges Zeichen beliebig oft zu wiederholen.

Dies verwendet mehr Tastenanschläge als die Antwort von @ romainl, verlässt jedoch den Einfügemodus überhaupt nicht.

gpanders
quelle
2

Zusätzlich zu der Schreibfunktion, mit der Text mehrmals wiederholt wird, können Sie Folgendes verwenden <C-x><C-l>: Wenn Sie bereits eine Zeile mit 80 Bindestrichen haben, schreiben Sie am Anfang einer neuen Zeile einige Bindestriche und drücken Sie <C-x><C-l>dann, um die Zeilen zu vervollständigen, die mit diesen wenigen Bindestrichen beginnen wahrscheinlich diese Linie mit 80 Strichen. Ich habe früher horizontale Linien (78 Striche) in Hilfedateien geschrieben.

ZyX
quelle
1

Für eine so einfache Aufgabe abbreviationsollte der Trick reichen. Fügen Sie Folgendes zu Ihrem hinzu.vimrc

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

Wenn Sie ab sofort --ein Leerzeichen eingeben (während Sie sich im Einfügemodus befinden), --wird das automatisch in das -80-fache konvertiert .

Mit der Funktion repeat Sie die Zeichenfolge so oft wiederholen, wie Sie möchten.

Beachten Sie, dass Sie es vor dem Aktualisieren testen können, .vimrcindem Sie in den commandModus wechseln und dann Folgendes ausgeben:iab <expr> -- repeat('-', 80)

Samir Sadek
quelle
1

Ich habe dies getan, ohne den INSERT-Modus mit den folgenden Schritten zu verlassen.

  1. Aktivieren Sie den INSERT-Modus.
  2. Geben Sie einen Bindestrich "-" ein.
  3. Strg + O.
  4. Kleinbuchstaben 'v' (um in den -- (insert) VISUAL --Modus zu wechseln)
  5. Kleinbuchstaben 'y' (zum Kopieren)
  6. Strg + O.
  7. Typ 80
  8. Dann gefolgt von Kleinbuchstaben 'p' (zum Einfügen).

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

Dadurch werden alle Striche horizontal in einer einzigen Zeile gedruckt.

hel
quelle