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).
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):
class MyClass
{
public void Method()
{
goto MyLabel;
MyLabel:
return;
}
}
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.
Hilfreichster Kommentar
Diese einfache Problemumgehung gibt mir das Verhalten, das ich von vim erwarte: