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.

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>

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


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.


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.

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 .


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


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>

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.


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.


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.


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.


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)


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.