Gibt es eine Verknüpfung, um den Suchbegriff des Findens und Ersetzens wiederzuverwenden?

8

Ich denke, es gibt eine eindeutige Möglichkeit, dass diese Frage bereits gestellt wurde, aber ich kann sie nicht finden.

Wenn ich so etwas mache :s/foo/bar/gund das dann in der nächsten Zeile noch einmal aufrufen möchte, aber mit bazstatt bargibt es einen schnelleren Weg, das zu tun? Ich habe das Gefühl, es &bazsollte funktionieren, aber das tut es nicht.

Eli Sadoff
quelle

Antworten:

11

Nicht genau das, wonach Sie fragen, aber Sie können das tun:

:s/foo/bar/g

Und dann:

:s//baz/g

Sie können dies verwenden, da bei Verwendung :sdas gesuchte Muster im Suchregister gespeichert wird. Was Sie mit sehen können :reg /.


Work in Progress: Sie können Ihren Workflow beschleunigen mit:

nnoremap && :s<UP><C-F>F/cT/

Und benutze es so:

:s/foo/bar/g

und dann

&&baz<CR>

Zerlegen:

nnoremap &&         " define a new mapping
:s<UP>              " get the last :s command in the history
<C-F>               " use this command in the cmdline window
F/                  " go back to the last /
cT/                 " change back up to the last /

Einige Notizen:

  • Dies funktioniert nicht, wenn Sie keine Flagge haben
  • Dies funktioniert nicht, wenn Sie keine Ersatzzeichenfolge haben
  • Es sollte anders funktionieren

(Lass es mich wissen, wenn ich es verbessern kann).

Einige lesen:

  • :h cmdline-window
  • :h c_CTRL-F
nobe4
quelle
2
Das ist definitiv besser als das, was ich vorher gemacht habe. Ich gehe davon aus, dass es leider keinen schnelleren Weg gibt :(.
Eli Sadoff
Nicht AFAIK, und ich versuche, ein Mapping zu erstellen, das genau das tut, was Sie wollen, aber ich bin mir ziemlich sicher, dass Sie den Ersatzausdruck
nobe4
5

Zusätzlich zur Antwort von @ nobe4 verfügt Damian Conway über zwei interessante Zuordnungen, um die Suche zu beschleunigen und Aktionen zu ersetzen. Sie kommen aus diesem Interview, das es absolut wert ist, vollständig gelesen zu werden.

Um ihn zu zitieren:

[...] Ich stellte fest, dass ich für immer globales Suchen und Ersetzen (dh :%s/X/Y/g<CR>) durchführte, und beseitigte daher die wiederholte Eingabe, indem ich den nie verwendeten (von mir) SBefehl stahl :

nmap  S  :%s//g<LEFT><LEFT>

Jetzt muss ich nur noch Folgendes eingeben: SX / Y.

Aber dann bemerkte ich, wie oft ich nach einem Muster gesucht hatte und wollte, nachdem ich die Übereinstimmungen durchgesehen hatte, alle global ersetzen. Selbst mit dem S-Mapping war das eine nervigere Wiederholung: Erst die Suche: / pattern, dann das Ersetzen: Spattern / replace Also habe ich den (auch von mir nie verwendeten) M-Befehl dafür gestohlen:

nmap <expr>  M  ':%s/' . @/ . '//g<LEFT><LEFT>'

Jetzt ist es nur noch: Suche: / Muster und ersetze dann alle Übereinstimmungen: Fehlplatzierung


Um Ihre Frage zu beantworten, können Sie das erste Mapping für etwas wie das folgende leicht ändern:

nmap  S  :s///g<LEFT><LEFT>

Auf diese Weise können Sie zuerst Ihre Ersetzung vornehmen :s/foo/bar/g, zur nächsten Zeile gehen, drücken Sund Sie erhalten: :s//|/gWo |sich der Cursor befindet, können Sie jetzt Ihre neue Ersetzung eingeben.

statox
quelle