Kehren Sie nach dem Kopieren einer visuellen Auswahl auf die Tastatur zum ursprünglichen Speicherort zurück

18

Mein Cursor befindet sich in der Mitte eines Absatzes, wenn ich plötzlich beschließe, diesen Absatz zu kopieren:

Start

Also tippe ich vip, um den Absatz visuell auszuwählen:

ausgewählt

Jetzt drücke ich, um cmd+Cin die Zwischenablage zu kopieren (dies kann auf Ihrem System variieren, sollte aber für die zentrale Frage meines Posts nicht relevant sein), was den Cursor am Anfang des Absatzes belässt:

Finale

eher als die gewünschte Position, wo es war, als ich anfing.

Beachten Sie, dass das gleiche Problem auftritt, wenn Sie die Auswahl nicht visuell mit ziehen yip.

Ich möchte, dass das Standardverhalten "zur ursprünglichen Cursorposition zurückkehren" ist, nachdem Auswahl- / Kopieraktionen wie diese ausgeführt wurden. Gibt es eine Konfiguration, die dies ermöglicht?

Jona
quelle
11
Ja, ich finde das auch ärgerlich. Ich neige nur dazu, Markierungen für diesen Zweck zu verwenden: mm "+yap `m(Beachten Sie, dass "+yin Ihre System-Zwischenablage
reiht
3
Ich finde es sehr nützlich, den Cursor entweder am Anfang oder am Ende der gezogenen Zone zu platzieren. Was kann ich nun mit zerrissenem Text und Cursor tun? Es macht nicht viel Sinn, jetzt Put / Paste zu machen. Aber wenn ich das später machen will, kann ich auch später ruckeln ... vielleicht brauchst du jetzt nur eine Markierung.
VanLaser

Antworten:

14

Eine mögliche Lösung ist die Verwendung von Sprüngen:

Vor dem Ziehen oder visuellen Auswählen können Sie einen neuen Sprung festlegen, auf den Sie zugreifen können, nachdem sich der Cursor bewegt hat. Verwenden Sie dazu m`.

Dann, nachdem sich Ihr Cursor aufgrund des Ruckelns bewegt hat, können Sie in die Sprungliste ctrlozurückspringen. Sie können auch die Liste der verfügbaren Sprünge mit :jumpsund anzeigen und in dieser Liste mit ctrlound navigierenctrli

Zusammenfassend wäre Ihr Workflow:

  • m`
  • yip
  • ctrlo

Wie unter Verwendung von m` Sätzen eine Marke, können Sie mit ihm springen ``statt ctrlo.

Sie können :h mark-motionsund :h :jumpsfür weitere Informationen lesen .

statox
quelle
Ich mag das. Gibt es eine Möglichkeit, das einfache Anführungszeichen beim Springen generell wie ein Backtick zu verhalten? einfaches Anführungszeichen ist einfacher zu tippen, und normalerweise möchte ich zur richtigen Spaltenposition sowie zur richtigen Zeile springen ...
Jonah
1
@Jonah, ich map <leader>'zu sein `, das klappt bei mir ganz gut. (Ich benutze <space>als mein Anführer.)
Numeri sagt Reinstate Monica
@Jonah: Wie Numeri sagte, kann ein Mapping eine gute Lösung sein, ansonsten, wenn Sie das Backtick loswerden möchten, können Sie einen Blick darauf werfen :h 'langmap'. Ich sage nicht, dass es die ideale Lösung ist, aber vielleicht könnte es für Sie interessant sein.
statox
@Johah, ich tausche tatsächlich das einfache Anführungszeichen und den Back Tick mit noremap ' ` noremap ` '... Dies ist in meinem vimrc und funktioniert hervorragend
Niko Bellic
10

Sie können das Bewegen des Cursors vermeiden mit:

:'{,'}y

Siehe :help range, :help mark-motionsund :help :y.

romainl
quelle
1
Gut zu wissen, aber ist es das, was Sie tatsächlich tun? Es scheint, als ob die Eingabe der 8 Tasten mit zwei Klammern dies schwieriger macht als die Markierungslösungen
Jonah,
Das würde ich tun, wenn ich in deiner Position wäre. Aber ich habe kein Problem mit dem von Ihnen beschriebenen Verhalten, also mache ich das eigentlich nicht.
Romainl
2
@Jonah Sie haben weiterhin die Möglichkeit, ein Mapping zu erstellen. So etwas :nmap <key> :'{,'}y<CR>sollte den Job machen.
statox
10

Mein Cursor befindet sich in der Mitte eines Absatzes

Wenn Sie es gerade bearbeitet haben, besteht die einfachste Lösung darin, den g ;Cursor an der letzten Bearbeitungsposition zu positionieren.

Und wenn Sie den Absatz nicht bearbeitet haben, können Sie eine einfache tun Operation ersetzen mit dem gleichen Charakter sind Sie an (zB du bist auf h, Sie geben rh) bearbeitet „Ereignis“ ausgelöst werden, ohne tatsächlich etwas zu bearbeiten.

Al.G.
quelle
2
+1: Ich habe es immer benutzt '., aber es kann sehr nützlich sein, zwischen den letzten Änderungen mit g;und zu navigieren g,.
MMontu
2
Gibt es eine Version, mit g;der Sie auch zur richtigen Spaltenposition gelangen?
Jonah
@Jonah das ist das Verhalten standardmäßig. Funktioniert es nicht für dich? Es bringt mich immer zur richtigen Spalten- und Zeilenposition.
Al.G.
4

Das vim-easyclip Plugin hat eine Einstellung dafür:

g:EasyClipPreserveCursorPositionAfterYank- Standard 0 (dh deaktiviert). Das Standardverhalten von Vim besteht darin, den Cursor am Anfang des Textes zu positionieren, was mit anderen Bewegungen übereinstimmt. Aktivieren Sie diese Option jedoch, wenn Sie möchten, dass die Cursorposition beim Ausführen von Yanks unverändert bleibt.

Es ist für mich ein bisschen viel, ein komplettes Plugin nur für diese kleine Funktion zu installieren, daher bevorzuge ich die Verwendung von Marken gemäß meinem Kommentar.

Fruglemonkey
quelle
0

Wenn wir die Antwort von Al.G. erweitern, können wir ohne Bearbeitung zum gewünschten Ort gehen. Lösung ist gi. Wir werden dieselbe Position erreichen, an der wir uns zuvor im letzten Einfügemodus befanden.

  • Sie befinden sich in der Mitte des Absatzes.
  • in den Einfügemodus wechseln.
  • in den normalen Modus wechseln.
  • drücken Sie vip.
  • drücken Sie gi.
  • in den normalen Modus wechseln. ( giwird uns den Einfügemodus überlassen)

Wenn wir zum Anfang oder Ende des markierten Texts gehen möchten.

 :help v_o 

Wenn Sie den markierten Text ziehen, kehren Sie ebenfalls in den normalen Modus zurück und behalten möglicherweise die ursprüngliche Cursorposition bei.

  1. Wenn Sie anfangen, von einer höheren zu einer niedrigeren Cursorposition zu markieren (von einer niedrigeren Zeilenspaltennummer zu einer höheren Zeilenspaltennummer), behalten Sie die ursprüngliche Cursorposition bei, wenn Sie drücken y
  2. Der Cursor bleibt auf der aktuellen Position, wenn die Hervorhebung von der unteren zur oberen Cursorposition beginnt.

Zurück zum ursprünglichen Ort nach dem Ziehen:
gv um das vorherige Highlight zu erhalten.

Jetzt können Sie im visuellen Modus mit der Taste
ooder zwischen der ursprünglichen und der aktuellen Position wechseln O.

Die Zeilen- und Spaltennummer der Statuszeile hilft dabei, die genaue Cursorposition zu ermitteln.
Dokumentation:

:help visual-change
vusan
quelle
Dies funktioniert nicht, vipwenn der Cursor in der Mitte eines Absatzes beginnt.
Antony
Oh ja, ich habe es nicht bemerkt, jetzt werde ich meine Antwort bearbeiten, anstatt sie zu löschen.
Vusan
@Antony Jetzt funktioniert es auch für vipmeine Bearbeitung.
Vusan