it-swarm.com.de

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

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

if (some_condition) {[ ]return; }

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

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

75

Für das Beispiel, das Sie angegeben haben, könnten Sie verwenden rEnter um ein einzelnes Zeichen (das Leerzeichen) durch die Eingabetaste zu ersetzen. Dann, fspace. um zum nächsten Leerzeichen zu gelangen und den letzten Befehl zu 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, verwenden Sie sEnterTabEsc Um das Leerzeichen durch eine neue Zeile zu ersetzen, 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.

96
Greg Hewgill

So erstellen Sie ein Makro, das eine neue Zeile am Cursor einfügt, wenn Sie im Einfügemodus auf not drücken:

Geben Sie innerhalb von vim Folgendes ein:

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

Woher: 

  • [Strg + V] bedeutet halten Sie die Strg-Taste gedrückt und drücken Sie 'v'.
  • [Eingabe] bedeutet Drücken Sie die Eingabetaste.
  • [Esc] bedeutet Esc-Taste drücken

Am unteren Rand Ihres vim-Fensters sehen Sie Folgendes, bis Sie die letzte Eingabetaste drücken:

:map g i^M^[

Erklärung:

[Strg + V] bedeutet "Zitat des folgenden Zeichens" - Damit können Sie die Zeilenvorschub- und Escape-Zeichen in den Befehl einbetten.

Sie ordnen also die 'g'-Taste der Sequenz zu: 

i [Enter] [Escape]

Dies ist vim für eine neue Zeile vor dem Cursor, und dann den Einfügemodus.

Tweaks:

  • Sie können das 'g' durch ein beliebiges Zeichen ersetzen, das nicht bereits mit einem von Ihnen verwendeten Befehl verknüpft ist.
  • Fügen Sie dem Befehl mehr hinzu, z.f}i^M^[O - Dies wird f ind der} und i nsert eine weitere Newline, dann verlassen Sie den Insert-Modus undOgeben Sie eine leere Zeile ein, die Sie eingeben können mehr Code.
  • Sie können den Befehl zu Ihrer .vimrc- oder .exrc-Datei hinzufügen, um ihn dauerhaft zu machen. Lassen Sie einfach den Doppelpunkt am Anfang weg, sodass der Befehl mit "map" beginnt.

Genießen!

11
Adam Liss

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

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

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

legen Sie es zur späteren Verwendung in Ihre .vimrc-Datei.

8
Yariv

Wenn Sie einen Block mit einer Zeile normalerweise auf drei Zeilen erweitern, versuchen Sie es mit der Ersetzung. Ändern Sie die Öffnungshalterung in Halterung/Rücklauf und die Schließhalterung in Rückführung/Halterung.

Der Befehl zum Ersetzen von Bracket/Return für Bracket sieht folgendermaßen aus:

:s/{/{\r/

Da Sie dies häufig verwenden möchten, können Sie die vollständige Sequenz einem ungenutzten Tastenanschlag folgendermaßen 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 dann Enter .

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

Unter :help map-which-keys finden Sie Hinweise zur Auswahl nicht verwendeter Tastenanschläge für die Zuordnung.

4
slothbear

Angenommen, Sie sind in Ordnung mit der Zuordnung von K zu etwas anderem (wählen Sie eine andere Taste nach Ihrem Geschmack), und verwenden Sie den Marker ' als temporären Marker.

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

durch Drücken von K im normalen Modus über dem Zeichen, nach dem der Zeilenumbruch erfolgen soll, wird die Zeile geteilt und der Cursor bleibt an der Stelle, an der er sich befindet.

2
mondaugen

Vim beendet automatisch alle Leerzeichen rechts vom Cursor, wenn Sie eine Zeile durchbrechen, während autoindent (oder eine andere Einrückhilfe) aktiviert ist.

Wenn Sie keine dieser Einstellungen verwenden möchten, verwenden Sie s anstelle von i sersetzen Sie Ihren neuen Text für das Leerzeichen und nicht nur das Einfügen. (Wenn mehrere Leerzeichen vorhanden sind, setzen Sie den Cursor ganz links auf und verwenden stattdessen cw.)

1

Ich fand, dass dies die genaueste Umsetzung dessen ist, was ich von dem entgegengesetzten Verhalten zu J erwarten würde.

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 setzt den Cursor dann an die richtige Position zurück.

i<cr><esc> - Dies ist eine der am häufigsten vorgeschlagenen Lösungen. Es werden keine Nicht-Leerzeichen unter Ihrem Cursor gelöscht, aber es verbleibt auch ein nachgestelltes Leerzeichen

^mw - gehe zum Anfang einer 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> - Löschen Sie alle Suchmarkierungen, bei denen der reguläre Ausdruck möglicherweise aktiviert wurde

`w - die Markierung unter w zurückgeben

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

Anmerkung: Ich habe dies gebunden an S die möglicherweise einen nützlichen Schlüssel überschreibt, aber es ist ein Synonym für cc und da ich es nicht so oft benutze wie Splits, kann ich es auch überschreiben.

0
JaredMcAteer

Legen Sie diese Schlüsselzuordnung in Ihrer Vimrc fest

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

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

0
Kiddo

Wenn Sie die Eingabe haben:

aaa bbb ccc ddd

und wollen ausgeben

aaa
bbb
ccc
ddd

Sie können den Befehl verwenden

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

IMHO ist die integrierte Zuordnung gs keine nützliche Zuordnung (setzen Sie vim in den Ruhezustand).

nmap gs i<CR><ESC>
0
Hotschke

In Vrapper können Sie gql verwenden, das eine Zeile aufteilt, ohne den Einfügemodus zu aktivieren, die Einrückung jedoch nicht immer beibehalten wird. 

0
Janac Meena

Wenn Sie eine Linie teilen, möchten Sie entweder einfach einen Wagenrücklauf einfügen oder, falls Sie sich auf einer Leerstelle befinden, diese durch einen Wagenrücklauf ersetzen. Warum sollte man 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 verwende den ternären Operator, um die beiden Aktionen zu einer Schlüsselkarte zusammenzufassen. Wenn Sie es zerlegen, bedeutet <expr>, dass die Ausgabe der Keymap dynamisch sein kann. In diesem Fall hängt sie von der Bedingung getline('.')[col('.')-1]==' ' ab. Dies ist der langwierige Weg, 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 einen neuen ein (i<CR><Esc>).

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

0
ctrl

Tatsächlich benötigen Sie die folgenden kombinierten Operationen:

  1. Drücken Sie v um in den visuellen Modus zu wechseln
  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. Erledigt
0
Nathan