Wie kann ich das erste Suchergebnis automatisch zentrieren?

7

Ich möchte das allererste Suchergebnis auf dem Bildschirm zentrieren. Ich kenne mich mit :nnoremap n nzzMapping aus, aber es funktioniert nur zum Zentrieren der nächsten Spiele, nicht der ersten.

Ich dachte, ich könnte vielleicht AutoCmd verwenden, habe aber kein passendes Ereignis gefunden.

Jan Warchoł
quelle

Antworten:

14

Sie können die folgende Zuordnung verwenden:

cnoremap <expr> <CR> getcmdtype() == '/' ? '<CR>zz' : '<CR>'

Was so erklärt werden kann:

  • cnoremap Erstellen Sie eine Zuordnung im Befehlszeilenmodus
  • <expr> Bei der Zuordnung wird ein Ausdruck ausgewertet (wobei Bedingungen verwendet werden können).
  • <CR> Der Schlüssel zum Remap ( Enter)
  • getcmdtype() Gibt ein Zeichen zurück, das angibt, welcher Befehlszeilenmodus verwendet wird
  • == '/' Hat a getcmdtype()zurückgegeben, /was bedeutet, dass wir uns im Suchmodus befinden?
  • '<CR>zz' Wenn wir uns im Suchmodus befinden, führen Sie zznach dem Drücken aus<CR>
  • '<CR>' Sonst nur ausführen <CR>

Verwandte Hilfethemen:


BEARBEITEN Beachten Sie, dass es interessant wäre, ein Mapping zu erstellen, das sowohl bei der Vorwärts- als auch bei der Rückwärtssuche funktioniert, dh bei der getcmdtype()Rückgabe /oder ?. Hier ist das Mapping, um das zu tun:

cnoremap <expr> <CR> (getcmdtype() == '?' \|\| getcmdtype() == '/') ? '<CR>zz' : '<CR>'

Beachten Sie das Escapezeichen der |Zeichen: Wenn es sich nicht um Escapezeichen handelt, wird vim cnoremap <expr> <CR> (getcmdtype() == '?'als erster auszuführender Befehl verstanden, gefolgt von einem Befehl, getcmdtype() == '/') ? '<CR>zz' : '<CR>'der keinen Sinn ergibt und einen Fehler verursacht.


EDIT 2 @Antony schlug dank ihm eine besser lesbare Lösung vor:

cnoremap <expr> <CR> getcmdtype() =~ '[/?]' ? '<CR>zz' : '<CR>'
statox
quelle
3
Vielleicht getcmdtype() =~ '[?/]'wäre es ein bisschen einfacher.
Antony
@ Anthony In der Tat ist das viel besser, ich habe meine Antwort bearbeitet. Vielen Dank!
Statox
2
Genial! Genau das, was ich brauche, danke! Und danke für detaillierte Erklärungen, sie sind sehr hilfreich beim Erlernen von Vimscript.
Jan Warchoł
Hatte kürzlich ein Problem mit dieser Verwendung /als Bewegung: zB c/searchwechselt von meiner aktuellen Position zur nächsten übereinstimmenden Position , fügt searchaber aufgrund der cnoremapden Text ein zz. Gedanken zu einer Problemumgehung oder sollte ich die Zuordnung entfernen?
D. Ben Knoble
1
@ DavidBenKnoble in der Tat, das ist ein Problem, über das ich nicht nachgedacht habe. Ich werde versuchen, eine Problemumgehung zu finden und meine Antwort zu bearbeiten, wenn ich eine finde.
Statox
5

Die Antwort von Statox ist definitiv die bisher beste, aber als Alternative habe ich gerade von Vim-slash erfahren, einem Plugin, das darauf abzielt, "das Sucherlebnis im Puffer zu verbessern".

Und aus der Readme:

Anpassung

zz nach der Suche

Platziert die aktuelle Übereinstimmung in der Mitte des Fensters.

noremap <plug>(slash-after) zz

Ich habe es gerade ausprobiert und es funktioniert reibungslos in beide Richtungen ( /und ?).

lsrdg
quelle