Vsvim: cc setzt den Cursor nicht auf Einzug, wenn er sich in einer leeren Zeile befindet

Erstellt am 8. Mai 2012  ·  10Kommentare  ·  Quelle: VsVim/VsVim

cc löscht die aktuelle Zeile und versetzt den Cursor in den Einfügemodus (die Option 'Autoindent' bestimmt seine Position).

VsVim setzt den Cursor nicht immer an die richtige Position. Der einzige Fall, den ich konsequent reproduzieren konnte, ist, wenn Sie in einer leeren Zeile cc setzen, wird der Cursor eher in der ersten Spalte als im Einzug platziert.
Betrachten Sie den folgenden Start-C # -Code ([] ist der ncursor, | der icursor):

class Foo {
    public void Bar()
    [{]
    }
}

Drücken Sie o , um die folgende Zeile zu öffnen:

class Foo {
    public void Bar()
    {
        |
    }
}

Drücken Sie jetzt Esc :

class Foo {
    public void Bar()
    {
[ ]
    }
}

Drücken Sie jetzt cc . Hier unterscheiden sich Vim und VsVim: Vim platziert den eingerückten Cursor in der Leiste:

class Foo {
    public void Bar()
    {
        |
    }
}

während VsVim es in Zeile 0 platziert:

class Foo {
    public void Bar()
    {
|
    }
}

Alternativ können Sie diesen Code verwenden:

class Foo {
    public void Bar()
    {
        throw new NotImplementedException()[;]
    }
}

Sowohl in Vim als auch in VsVim platziert ein einzelnes cc den Cursor an der eingerückten Position, aber cc<Esc>cc platziert den Cursor in VsVim in Spalte 0 (während Vim ihn am rechten Einzug platziert).

bug

Hilfreichster Kommentar

Diese einfache Problemumgehung gibt mir das Verhalten, das ich von vim erwarte:

nmap S ddO
nmap cc S

Alle 10 Kommentare

Das Verhalten, das ich in VsVim sehe, spiegelt das wider, was ich in gVim sehe.

Ich denke, wir haben eine andere Einstellung umgeschaltet. Ich sehe tatsächlich einen Verhaltensunterschied nach dem 'o'-Schritt oben. Mein Cursor wird in derselben Spalte wie { angezeigt und nicht wie Ihr eingerückt.

Können Sie :set ausführen und die Ausgabe einfügen?

autoindent scheint eine der Optionen zu sein, die ich in meinem vimrc festgelegt habe, die ich dann in vsvimrc source habe.

hlsearch
ignorecase
incsearch
scrolloff=5
smartcase
vimrc="C:\Users\pmateescu\_vsvimrc"
vimrcpaths="C:\Users\pmateescu;C:\Users\pmateescu"
autoindent
number
tabstop=4

Berücksichtigt VsVim die Einrückungseinstellungen in VS? Wenn ja, hier meine (unter Optionen -> Texteditor -> C # -> Formatierung):

  1. Einrückung (Blockinhalt, Groß- / Kleinschreibung, Beschriftungen einrücken, Klammern nicht öffnen / schließen)
class MyClass
{
    public void Method()
    {
        goto MyLabel;
MyLabel:
        return;
    }
}
  1. Unter Neue Zeilen habe ich alles überprüft
  2. Abstand: Alles außer "Andere Abstandsoptionen festlegen" deaktiviert - Leerzeichen nach Schlüsselwörtern in Kontrollflussanweisungen einfügen; "Abstand für Trennzeichen festlegen" -: nach Doppelpunkt für Basis, nach Komma, nach Semikolon in für, vor Doppelpunkt für Basis; "Abstand für Operatoren einstellen": vorher und nachher.

Ich weiß auch nicht, ob dies wichtig ist, aber ich habe die Einrückung auf Smart, Größe 4, Tabs beibehalten eingestellt.

HTH

Ja, Autoindent scheint der Unterschied zu sein. Sobald ich das + eingestellt und als .c-Datei gespeichert habe, konnte ich das Verhalten erhalten, das Sie sahen.

Wirf einen kurzen Blick auf den Code und es scheint ein Problem mit leeren Zeilen zu sein. Der Code berücksichtigt autoindent wenn die gelöschte Zeile leer war, was anscheinend der Fall sein sollte.

Im Allgemeinen bevorzugt VsVim den Visual Studio-Einzug gegenüber dem Vim-Einzug. Dies kann durch Deaktivieren der Option vsvim_useeditorindent überschrieben werden.

Das klappt meistens. Leider bieten 2010 nicht alle Sprachen gute APIs für Einrückungsdienste. C # hat das Beste, VB hat praktisch keine und C ++ ist ein Würfelwurf. Ich glaube, dass es in VS11 besser wird, aber ich habe noch nicht genug herumgespielt, um zu sehen, wie viel.

Ich werde versuchen, dieses Update in 1.3 zu komprimieren

Spielte ein bisschen mehr herum und dieses Verhalten ist tatsächlich von cindent und nicht von autoindent . Dies ist einer der Gründe, warum ich so lange gebraucht habe, um das Problem zu wiederholen. Ich habe in Textdateien experimentiert, in denen autoindent aktiviert war. Dies wird nur in C-Dateien mit cindent aktiviert.

Du hast recht, ich habe es auch geschafft, es zu reproduzieren, nachdem du es mit vim -U NONE -u NONE -cmd 'set cindent' index.cs erwähnt hast

In normalen Einstellungen scheint Vim in C-ähnlichen Dateien automatisch cindent zu aktivieren (wird in :setl sowohl in C # als auch in JS angezeigt).
Doch das gleiche Verhalten - Entfernen indent auf <Esc> , re-indent auf cc - scheint in nicht geschehen cindent Dateien für mich auftauchte sowohl in CSS und HTML, aber in diesen Fällen könnte es der Effekt von bestimmten indentexpr .

@ Philipmat
@jaredpar

Hallo Leute, ich habe das gleiche Problem festgestellt.
Ist es in der neuesten Version behoben?
Ausgabe nach :set

backspace="indent,eol,start"
hlsearch
ignorecase
incsearch
autoindent

@lookforit im Moment nein. Dieses Verhalten ist tatsächlich ein Teil von cindent der derzeit von VsVim nicht unterstützt wird.

Diese einfache Problemumgehung gibt mir das Verhalten, das ich von vim erwarte:

nmap S ddO
nmap cc S

Dies wäre immer noch eine schöne Sache. Mein intuitiver Sinn ist, dass das 'cc', um eine Zeile zu löschen und mit der Bearbeitung zu beginnen, auf derselben Einrückungsstufe beginnen sollte wie das Erstellen einer neuen Zeile. Gibt es eine interne Vim / VS-Argumentation, dass dies nicht so sein sollte? Ich kann es als Einstieg in die Arbeit mit dem Projekt angehen.

Die Lösung für dieses Problem war oberflächlich gesehen nichts anderes als "für cc tun, was auch immer o bereits tat" (weshalb die Umgehung von @shkm funktioniert), aber die notwendige Operation machte es ziemlich

VsVim hat bereits das Richtige für den sogenannten "vim-Einzug" getan, den Einzug, den VsVim verwendet, wenn kein Sprachdienst verfügbar ist. Um Tests für dieses Problem hinzuzufügen, musste ich den Tests eine Infrastruktur hinzufügen, um einen Sprachdienst zu simulieren. Die Trennung bestand also darin, dass alle vorhandenen Tests "vim indent" verwenden, aber 99% der Benutzer "host indent" verwenden, dh Dateien bearbeiten, in denen Visual Studio einen Einrückungsdienst bereitstellt.

Um das Problem weiter zu verkomplizieren, gab es einen Fehler, den niemand jemals mit "vim indent" gemeldet hat, bei dem es nicht richtig funktionierte, wenn die Registerkarten nicht erweitert wurden (siehe Problem Nr. 2302). Auch aus praktischer Sicht verwendet niemand "vim indent", so dass dies nach Überlegung nicht so überraschend ist.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

kalebpederson picture kalebpederson  ·  6Kommentare

ArnisL picture ArnisL  ·  5Kommentare

keithn picture keithn  ·  3Kommentare

DanielKeogh picture DanielKeogh  ·  3Kommentare

prat0088 picture prat0088  ·  4Kommentare