Wie bewege ich den Cursor in die Mitte der aktuellen Zeile?

16

Gibt es eine Möglichkeit, den Cursor in die Mitte der aktuellen Zeile zu bewegen? (die Mitte der Textzeile - nicht die Mitte der Bildschirmbreite)

Ich habe mich gefragt, ob es eine ähnliche Verknüpfung gibt M, mit der der Cursor in die Mitte des Bildschirms bewegt wird.

BEARBEITEN : Klarstellung in Klammern hinzugefügt

Thameera
quelle
2
Befindet sich also die Mitte in der vollen Zeile oder in der Mitte der Bildschirmbreite?
muru
@muru dachte an Mitte der vollen Linie
Thameera
2
Könnten Sie das auch der Frage hinzufügen? Und was erwarten Sie von der Verpackung?
muru

Antworten:

16

Ich kenne keinen eingebauten Weg, um dies zu tun, aber Sie können leicht eine Karte haben, um es zu tun:

nnoremap µ :exe 'normal! '.(virtcol('$')/2).'\|'<cr>

@Ingo Karkat schlug folgende Variante vor, die auch im VISUAL-Modus funktioniert.

noremap <expr> gM (virtcol('$') / 2) . '<Bar>'

Leider wird es auch im SELECT-Modus ausgelöst. Als Konsequenz bevorzuge ich das Paar:

nnoremap <expr> gM (virtcol('$') / 2) . '<Bar>'
xnoremap <expr> gM (virtcol('$') / 2) . '<Bar>'
Luc Hermitte
quelle
3
Diese Variante funktioniert auch im visuellen Modus korrekt:noremap <expr> gM (virtcol('$') / 2) . '<Bar>'
Ingo Karkat
15

Der eingebaute gmmacht genau das.

tommcdo
quelle
6
Beachten Sie, dass Sie auf diese Weise in Bezug auf die Konsolenbreite und nicht in Bezug auf die Linienlänge zur Mitte der Linie gelangen . Wenn Sie also eine Zeile mit 10 Zeichen und eine Konsole mit 80 Zeichen Breite haben, wird der Cursor auf das 10. Zeichen in der Zeile gesetzt (weil "versucht" wird, zum 40. zu gelangen), nicht zum 5. Zeichen.
Apnorton
3
Ja. Aus der Frage ist nicht ersichtlich, ob wir nach der Mitte der Linie oder der Mitte des Bildschirms suchen. Basierend auf der Analogie zu M, nahm ich Bildschirm.
tommcdo
1
Eigentlich habe ich das gerade auf einem großen Bildschirm (ca. 180 Zeichen) mit 80-Zeichen-Text versucht. Der Cursor sprang an das Ende der Zeile. Scheint kein sehr nützlicher Befehl zu sein.
Ben
@Ben Ging es bis zum Ende der Linie oder so nahe an die Mitte der Bildschirmbreite heran, wie es nur geht? Versuchen Sie es mit einer Linie, die mehr als 50% so breit ist wie der Bildschirm, oder versuchen Sie es mit :set virtualedit=all.
8bittree
Ja, aber das OP hat nach einem Befehl gefragt, der zur Mitte des Zeilentexts und nicht zur Mitte des Bildschirms springen soll. Es beantwortet also nicht die Frage.
Ben
3

Um Lucs Antwort zu ergänzen, gibt es auch das Easymotion- Plugin, mit dem das schnelle Bewegen zu einer bestimmten Position ein Kinderspiel ist. Durch Drücken von <Leader><Leader>wwird hervorgehoben, welche Taste Sie drücken können, um zu einem bestimmten Wort zu gelangen. Auf diese Weise können Sie leicht zu einem Wort in der Mitte der aktuellen Zeile wechseln.

Daanavitch
quelle
1

Wenn Sie in die Mitte des Textes springen möchten (ohne das Leerzeichen am Anfang der Zeile zu berücksichtigen), funktioniert Folgendes:

function! s:Gm()
  execute 'normal! ^'
  let first_col = virtcol('.')
  execute 'normal! g_'
  let last_col  = virtcol('.')
  execute 'normal! ' . (first_col + last_col) / 2 . '|'
endfunction
nnoremap <silent> gm :call <SID>Gm()<CR>

Ich denke jedoch nicht, dass dies im visuellen Modus funktioniert.

user11824
quelle