Wie füge ich einen Zeilenumbruch ein, bei dem sich der Cursor befindet, ohne in Vim in den Einfügemodus zu wechseln?

86

Ist es möglich, einen Zeilenumbruch einzufügen, wenn sich der Cursor in Vim befindet, ohne in den Einfügemodus zu wechseln? Hier ist ein Beispiel ( [x]bedeutet, dass der Cursor eingeschaltet ist x):

if (some_condition) {[ ]return; }

Gelegentlich möchte ich vielleicht etwas mehr Code eingeben. Also würde ich drücken i, um in den Einfügemodus zu gelangen, drücken Enter, um den Zeilenumbruch einzufügen, und dann das zusätzliche Leerzeichen löschen. Als nächstes würde ich in den normalen Modus wechseln und den Cursor vor der schließenden Klammer positionieren und dann das Gleiche tun, um ihn in eine eigene Zeile zu bringen.

Ich mache das schon eine Weile, aber es gibt sicherlich einen besseren Weg, es zu tun?

Mark A. Nicolosi
quelle
Sie möchten etwas einfügen, ohne in den INSERT-Modus zu wechseln?
Jeremy Cantrell
25
@ jeremy-cantrell Ja, genau wie "J" sich der nächsten Zeile anschließt und ein Leerzeichen einfügt, ohne in den INSERT-Modus zu wechseln!
Awendt

Antworten:

105

In dem von Ihnen angegebenen Beispiel können Sie rEnterein einzelnes Zeichen (das Leerzeichen) durch die Eingabetaste ersetzen. Dann , fspace.um sich auf den nächsten Raum zu bewegen und den letzten Befehl wiederholen.

Abhängig von Ihren Einstellungen für die automatische Einrückung wird die return-Anweisung möglicherweise ordnungsgemäß eingerückt oder nicht. Wenn nicht, sEnterTabEscersetzen Sie stattdessen das Leerzeichen durch eine neue Zeile, rücken Sie die Zeile ein und beenden Sie den Einfügemodus. Sie müssten das zweite Leerzeichen durch einen anderen Befehl ersetzen, damit Sie '.' Nicht verwenden können. in diesem Fall.

Greg Hewgill
quelle
1
Ich denke, das ist die einfachste Lösung. Danke Greg.
Mark A. Nicolosi
4
'f [Leerzeichen]' sollte gleichbedeutend mit 'W' sein (dh zum nächsten Whitepsace wechseln)
Nathan Fellman
4
'W' bewegt ein Zeichen zu weit, es bewegt sich zum nächsten Zeichen nach dem nächsten Leerzeichen.
Greg Hewgill
1
Sie können auch >>und verwenden <<, um das Einrücken zu erleichtern, wenn Sie nicht mit in den Einfügemodus wechseln möchten s.
Conner
12

So erstellen Sie ein Makro, das eine neue Zeile am Cursor einfügt, wenn Sie 'g' drücken, während Sie sich nicht im Einfügemodus befinden:

Geben Sie in vim Folgendes ein:

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

Wo:

  • [Strg + V] bedeutet , dass Sie die Strg-Taste gedrückt halten und 'v' drücken.
  • [Enter] bedeutet , dass Sie die Enter-Taste drücken
  • [Esc] bedeutet , dass Sie die Esc-Taste drücken

Am unteren Rand Ihres VIM-Fensters wird Folgendes angezeigt, bis Sie die letzte Eingabetaste drücken:

:map g i^M^[

Erläuterung:

[Strg + V] bedeutet "das folgende Zeichen in Anführungszeichen setzen" - Sie können die Zeilenumbruch- und Escapezeichen in den Befehl einbetten.

Sie ordnen also der Sequenz den Schlüssel 'g' zu:

i [Enter] [Escape]

Dies ist vim, um eine neue Zeile vor dem Cursor einzufügen und dann den Einfügemodus zu verlassen .

Tweaks:

  • Sie können das 'g' durch jedes Zeichen ersetzen, das noch nicht mit einem von Ihnen verwendeten Befehl verknüpft ist.
  • Fügen Sie mehr auf den Befehl, zum Beispiel f}i^M^[O - das wird f ind des } und i nsert andere Newline, dann Flucht aus Insert - Modus und O Stift eine leere Zeile für Sie Code eingeben.
  • Sie können den Befehl zu Ihrer .vimrc- oder .exrc-Datei hinzufügen, um ihn dauerhaft zu machen. Lassen Sie den Doppelpunkt einfach von Anfang an weg, damit der Befehl mit "map" beginnt.

Genießen!

Adam Liss
quelle
Sie haben die schlecht formulierte Frage im Betreff beantwortet, anstatt die im Beitrag. Was er wissen möchte, ist, wie er das Leerzeichen, das sich an der Stelle befand, an der die Linie unterbrochen wurde, leicht loswerden kann, aber keinen Zweck mehr erfüllt.
Aristoteles Pagaltzis
Vielen Dank. Der Abschnitt "Tweaks" wurde aktualisiert, um das zu erreichen, was (glaube ich) der Autor angefordert hat. Als ich es getestet habe, hat vi automatisch die zusätzlichen Leerzeichen für mich entfernt. Verwenden Sie 'x', um sie zu löschen, wenn dies bei Ihnen nicht der Fall ist. Und warum sehen vi-Befehle wie Modemleitungsrauschen aus? :-)
Adam Liss
11

Eine einfache Zuordnung, um die Linie am Cursor durch Drücken von Strg + Eingabetaste zu unterbrechen:

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

wechselt im Wesentlichen in den Einfügemodus, fügt einen Zeilenumbruch ein und kehrt in den normalen Modus zurück.

Legen Sie es für die zukünftige Verwendung in Ihrer .vimrc-Datei ab.

Yariv
quelle
5

Wenn Sie normalerweise einen einzeiligen Block auf drei Zeilen erweitern, versuchen Sie, ihn zu ersetzen. Ändern Sie die öffnende Halterung in Halterung / Rücklauf und die schließende Halterung in Rücklauf / Halterung.

Der Befehl zum Ersetzen der Klammer / Rückgabe für die Klammer sieht folgendermaßen aus:

:s/{/{\r/

Da Sie dies häufig verwenden möchten, können Sie die gesamte Sequenz einem nicht verwendeten Tastenanschlag wie folgt zuordnen:

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

Wenn Sie ^ M in der Sequenz sehen, geben Sie [Strg-V] ein und drücken Sie die Eingabetaste .

Drücken Sie nun mit dem Cursor an einer beliebigen Stelle in Ihrer Beispielzeile die zugeordnete Taste, und die Wagenrückläufe werden hinzugefügt.

Suchen Sie :help map-which-keysnach Ratschlägen zur Auswahl nicht verwendeter Tastenanschläge für die Zuordnung.

Lippenbär
quelle
Übrigens: gwird nicht zugeordnet, da es als Namespace-Schlüssel für viele vim-Zuordnungen verwendet wird, die aus zwei Tastenanschlägen bestehen (siehe :h g). Dieses Mapping ist also eigentlich ein No-Go.
Hotschke
Gibt es einen guten Befehl für Berichte, der gbereits als Namespace-Schlüssel verwendet wird?
Faultier am
Nicht besonders. Wie gesagt, :help gist eine Möglichkeit, eine Liste der Standard- g+ Etwas-Zuordnungen anzuzeigen. z, [ ]Sind weitere ‚Namespace‘ Schlüssel, siehe zB :help index. Sie können aufrufen :verbose map g, um alle aktuell definierten Zuordnungen anzuzeigen, die mit g beginnen. Hilfreiche Webressourcen sind viemu.com/vi-vim-cheat-sheet.gif , vimcasts.org/blog/2014/02/follow-my-leader , vimeo.com/85343734 (Folien: Speakerdeck.com/nelstrom/follow-my -Leiter )
Hotschke
3

Angenommen, Sie können eine Zuordnung Kzu etwas anderem vornehmen (wählen Sie einen anderen Schlüssel nach Ihren Wünschen), und die Verwendung eines Markers 'als temporären Marker ist in Ordnung. Warum nicht?

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

Wenn Sie nun im normalen Modus K über dem Zeichen drücken, nach dem der Zeilenumbruch erfolgen soll, wird die Zeile geteilt und der Cursor bleibt dort, wo er war.

Mondaugen
quelle
1

Vim beendet automatisch alle Leerzeichen rechts vom Cursor, wenn Sie eine Zeile in zwei Teile unterbrechen, während autoindent(oder eine andere Einrückungshilfe) aktiviert ist.

Wenn Sie keine dieser Einstellungen verwenden möchten, verwenden Sie s Sie statt , ium s ubstitute Ihren neuen Text für den Rohling nicht nur einfügen. (Wenn mehrere Leerzeichen vorhanden sind, setzen Sie den Cursor ganz links und verwenden Sie cwstattdessen.)

Aristoteles Pagaltzis
quelle
1

Wenn Sie eine Zeile teilen, möchten Sie entweder nur einen Wagenrücklauf einfügen oder, falls Sie sich in einem Leerzeichen befinden, diesen durch einen Wagenrücklauf ersetzen. Warum sich mit dem einen oder anderen zufrieden geben? Hier ist mein Mapping für K:

"Have K split lines the way J joins lines
nnoremap <expr>K getline('.')[col('.')-1]==' ' ? "r<CR>" : "i<CR><Esc>"

Ich benutze den ternären Operator, um die beiden Aktionen in einer Key Map zusammenzufassen. Eine Aufschlüsselung <expr>bedeutet , dass die Ausgabe der Tastenkarte dynamisch sein kann und in diesem Fall von der Bedingung abhängt, getline('.')[col('.')-1]==' 'die die langwierige Methode ist, um vim zu fragen, ob das Zeichen unter dem Cursor ein Leerzeichen ist. Schließlich ersetzt der bekannte ternäre Operator ? :entweder das Leerzeichen durch Zeilenumbruch ( r<CR>) oder fügt ein neues ein (i<CR><Esc> )

Jetzt haben Sie eine schöne Schwesterschlüsselkarte für den JBefehl.

Strg
quelle
Das ist ziemlich schlau. Ich bin mir nicht sicher, ob ich jemals absichtlich K verwendet habe, aber dies könnte es wert sein, es loszuwerden oder woanders neu zuzuordnen.
Dragon788
0

Stellen Sie diese Schlüsselzuordnung in Ihrem vimrc ein

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

Drücken Sie dann Strg + m, wenn Sie es in Ihrem vim verwenden möchten.

Kiddo
quelle
0

IMHO, das eingebaute Mapping gsist kein nützliches Mapping (vim in den Ruhezustand versetzen), man könnte dies zum Teilen verwenden:

nmap gs i<CR><ESC>
Hotschke
quelle
0

In Vrapper können Sie gql verwenden, das eine Zeile teilt, ohne in den Einfügemodus zu wechseln, aber möglicherweise nicht immer die Einrückung beibehält.

Janac Meena
quelle
0

In der Tat benötigen Sie die folgenden kombinierten Operationen:

  1. Drücken Sie v, um den visuellen Modus aufzurufen
  2. Wählen Sie die Linie aus, die Sie teilen möchten
  3. Drücken Sie :, um in den Befehlsmodus zu gelangen
  4. s/\s/\r/g
  5. Getan
Nathan
quelle
0

Wenn Sie die Eingabe haben:

aaa bbb ccc ddd

und ausgeben wollen

aaa
bbb
ccc
ddd

Sie können den Befehl verwenden

f r<ENTER>;.;.
Yarden Akin
quelle
0

Ich fand, dass dies die treueste Umsetzung dessen ist, was ich vom gegenteiligen Verhalten erwarten würde J

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

Es führt die vereinfachte neue Zeile am Cursor aus, kümmert sich um alle nachgestellten Leerzeichen in der vorherigen Zeile, falls vorhanden, und bringt den Cursor dann an die richtige Position zurück.

i <cr> <esc> - Dies ist eine der am häufigsten vorgeschlagenen Lösungen. Sie löscht keine Nicht-Leerzeichen unter Ihrem Cursor, sondern hinterlässt auch nachgestellte Leerzeichen

^mw - gehe zum Beginn der neuen Zeile und erstelle eine Markierung unter w

gk - eine Zeile nach oben gehen

:silent! s/\v +$//<cr> - Regex ersetzt alle Leerzeichen am Ende der Zeile

:noh<cr> - Deaktivieren Sie alle Suchmarkierungen, die möglicherweise den regulären Ausdruck aktiviert haben

`w - Geben Sie die Markierung unter zurück w

Kombiniert im Wesentlichen das Beste aus beiden r<esc><cr>undi<cr><esc>

Hinweis: Ich habe diese Bindung, an Sdie möglicherweise ein nützlicher Schlüssel überschrieben wird, aber es ist ein Synonym für ccund da ich ihn nicht so oft verwende wie Splits, kann ich ihn überschreiben.

JaredMcAteer
quelle
0

o ESC Befehl wird es für Sie tun.

logbasex
quelle
-1

Diese Zuordnung löst alle einzeiligen Funktionen auf, die Sie haben. Setzen Sie einfach Ihren Cursor auf die Linie und drücken Sie im normalen Modus 'g':

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

Dies setzt voraus, dass Sie nach der öffnenden Klammer ein Leerzeichen und vor der schließenden Klammer ein Leerzeichen haben. Sehen Sie, ob das für Sie funktioniert.

Lucas Oman
quelle