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.

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>'

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 ?).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.