2010-06-09 5 views
33

Wenn ich eine neue Zeile öffne (über 'o') springt mein Cursor zu einer korrekt eingerückten Position in der nächsten Zeile. Wenn Sie andererseits den Einfügemodus aufrufen, während sich der Cursor in einer leeren Zeile befindet, wird der Cursor nicht an die korrekt eingerückte Position bewegt.Vim: Smart Einzug beim Betreten des Einfügemodus auf leere Zeile?

Wie mache ich Vim richtig einrücken meinen Cursor beim Eingeben des Einfügemodus (über i) auf eine leere Zeile?

Antwort

64

cc wird den Inhalt der aktuellen Zeile ersetzen und Insert-Modus an der richtigen Vertiefung geben - so in einer leeren Zeile tun genau das, was Sie nach.

ich glaube, dass das Verhalten von i Sie beschreiben, richtig ist, weil es viele Anwendungsfälle, wo man will an dieser bestimmten Stelle auf einer Leerzeile einzufügen, anstatt springen zu, wo immer vim Vermutungen, die Sie einfügen möchten

+1

Nun, meine Lösung wird 'ich' so verhalten, nur wenn die Zeile leer ist - also nur ein Anwendungsfall. 'i' wird sich in allen anderen Situationen normal verhalten gesagt wird, cc ist eingebaut und passender imo.Akzeptieren –

+0

was ich an vim liebe ist egal, wie lange Sie es verwenden, können Sie immer noch neue Sachen jeden Tag lernen.Ich verwende dd, yy und c mit anderen Modifikatoren weitgehend alle Tag, kam mir nie vor, CC zu versuchen. +1 –

+0

Für mich funktioniert das nicht * wenn es eine leere Zeile * zwischen dem vorherigen lin ist e und die Zeile, die Sie einrücken möchten. (Sie haben zweimal "o" gedrückt, weil Sie einen Abstand zwischen der vorherigen Zeile und dem nächsten Codeabschnitt wünschen.) Ich würde immer noch gerne einen schnellen Weg sehen, um in den Einfügemodus zu springen. vorherige Zeile des tatsächlichen Codes *. – ELLIOTTCABLE

13

Nun, das war eigentlich nicht so schlimm, wie ich dachte, es wäre. Eine Möglichkeit, dies zu ermöglichen, ist Folgendes zu Ihrem ~/.vimrc

"smart indent when entering insert mode with i on empty lines 
function! IndentWithI() 
    if len(getline('.')) == 0 
     return "\"_ccO" 
    else 
     return "i" 
    endif 
endfunction 
nnoremap <expr> i IndentWithI() 

Es prüft einfach für eine leere Zeile hinzuzufügen, wenn Sie Hit ‚i‘ von Insert-Modus. Wenn Sie sich tatsächlich in einer leeren Zeile befinden, wird sie gelöscht und eine neue Zeile geöffnet, wodurch das "offene" Verhalten wirksam genutzt wird.

Hinweis: „_ vor der cc stellt sicher, dass Ihr Register nicht

abgewischt erhält
+0

nett. Das nervte mich immer. – michaelmichael

+1

Es gibt einen Fehler im aktuellen Code. In 'return" \ "_ ccO" 'muss das' O' entfernt werden, andernfalls wird im Einfügemodus ein Literal 'O' geschrieben (Ich habe es bearbeitet, aber die Verspätungen der Rezensenten haben das abgelehnt. Ursprünglich hatte der Code 'ddO', aber später hat jemand den Post editiert um das' dd' durch 'cc' zu ersetzen, aber vergaß das' O' zu entfernen.) – pcworld

+0

Ich fand, dass 'ccO' nicht funktionierte, aber' ddko' tat (delete aktuelle Zeile, zur vorherigen Zeile wechseln, neue Zeile hinzufügen) –

7

In einer leeren Zeile, um den Einfügemodus richtig eingerückt einzugeben, können Sie einfach verwenden.

Beachten Sie, dass s ein Synonym für cl ist, also wenn Sie nicht tatsächlich auf eine leere Zeile sind, wird es ein einzelnes Zeichen zu löschen und nicht einrücken enden. In diesem Fall ist es besser, cc zu verwenden, wie es vor etwa 18 Monaten vorgeschlagen wurde. Aber ich habe meine Punktzahl bei VimGolf durch diese Abkürzung oft verbessert, also dachte ich, ich würde es erwähnen. ;)

+2

Danke für den Tipp! Ich lerne immer noch Dinge über Vim jeden Tag. –

+0

@ DaneO'Connor wir alle sind! :) – Enrico