Cursorbewegung nach $ motion
Ich spiele das großartige Spiel namens VIM Adventures (von dem die Bilder unten sind). Die Frage stammt aus dem Spiel, ist aber auch in VIM reproduzierbar. Dies ist also der Ort, den ich frage.
Angenommen, Sie befinden sich in normal modeeiner Zeile nund Spalte m. Wenn Sie die Taste drücken j, wird Ihre Position zur Zeile n+1und zur gleichen Spalte m. Wenn die Zeile n+1weniger Spalten enthält als beispielsweise m, owerden Sie an der Spalte platziert o. Drücken Sie erneut j. Sie werden in die Zeile n+2in der Spalte verschoben m(gleiche Prüfung wie zuvor). Die Spalte, bei der Sie begonnen haben m, wird gespeichert. Dies ist auf dem ersten Bild zu sehen, wobei rote Linien die jBewegung darstellen.
Wenn Sie sich jedoch befinden normal modeund die Taste drücken $, werden Sie an das Ende der aktuellen Zeile verschoben. Betrachten Sie nun den gleichen Bewegungsablauf wie im vorherigen Absatz beschrieben. Jede Bewegung jbringt Sie zum letzten Zeichen in dieser Zeile. mwird in diesem Fall nicht erinnert. Dies ist auf dem zweiten Bild zu sehen. Durch Drücken von first $wird coursor am Ende der ersten Zeile platziert. Durch Drücken mehrerer jBewegungen landet jeder Kursleiter am Ende der Zeile und ignoriert dies m, woran im ersten Absatz erinnert wurde.
Ich kann dies in keiner VIM-Dokumentation finden. Können Sie mir erklären, wie dieser Erinnerungsmechanismus funktioniert, oder mich auf den Teil der Dokumentation verweisen, der dies erklärt?
Antworten
Tatsächlich gibt es in der Dokumentation des $Befehls selbst keine sehr direkten Hinweise auf dieses Verhalten .
Die Dokumentation des g$Antrags bezieht sich jedoch tatsächlich auf dieses Verhalten, indem erklärt wird, wie g$sich Folgendes unterscheidet von $:
Unterscheidet sich davon,
$wann das letzte Zeichen der Zeile nicht auf dem Bildschirm angezeigt wird oder wann eine Zählung verwendet wird. Darüber hinaus behalten vertikale Bewegungen die Spalte bei, anstatt bis zum Ende der Linie zu gehen.
Anders als in der Dokumentation können Sie einen Blick darauf werfen, wie Vim diese Spaltenverfolgung tatsächlich implementiert , da Funktionen wie das getcurpos()Exportieren dieser Informationen als "Curswant" -Attribut:
Die
curswantZahl ist die bevorzugte Spalte, wenn Sie den Cursor vertikal bewegen.
(Das Attribut "curswant" finden Sie auch im Dict, das von zurückgegeben wird winsaveview().)
Wenn Sie beispielsweise horizontal auf einer langen Zeile zu Spalte 24 und dann vertikal zu einer Zeile mit nur 17 Spalten verschoben haben, wird Folgendes angezeigt:
: echo getcurpos () [0, 39, 17 , 0, 24 ]
Sie können also sehen, dass Sie sich in Spalte 17 befinden, aber "curswant" ist Spalte 24, und Vim wechselt zu einer Spalte bis zu 24, wenn eine Zeile genügend Spalten enthält.
Nachdem Sie gedrückt haben $und einen weiteren Blick auf die getcurpos()Ausgabe werfen , sehen Sie nun:
: echo getcurpos () [0, 39, 17, 0, 2147483647 ]
Sie werden also sehen, dass Vim das $Verhalten implementiert, indem Sie "curswant" auf eine sehr große Anzahl setzen. Dies ist die größte Anzahl von Spalten, die Vim möglicherweise in einer einzelnen Zeile speichern kann.
(Diese Zahl ist tatsächlich 2 31 - 1, was die maximale positive Ganzzahl ist, die Sie in einem signierten intTyp in der Sprache C speichern können .)