Vim - in das Suchregister ziehen

79

Gibt es eine einfache / schnelle Möglichkeit, in das Register "Letzte Suche" von vim ("/)" zu ziehen "?

Aus der vim-Dokumentation geht hervor, dass die Antwort Nein lautet, aber über einen Befehl "let" zugewiesen werden kann:

It is writable with ":let", you can change it to have 'hlsearch' highlight
other matches without actually searching.  You can't yank or delete into this
register.

Im Idealfall möchte ich Folgendes tun:

"/5yw

Das würde die nächsten 5 Wörter unter den Cursor ziehen und sie in den letzten Suchpuffer legen

Wenn es alternativ eine Möglichkeit gibt, nach dem Inhalt eines benannten Registers zu suchen, würde dies auch funktionieren. Mit anderen Worten, wenn ich könnte:

"A5yw

und dann nach dem suchen, was sich in Register A befindet, das würde auch funktionieren.

Das nächste, was ich kommen kann, ist, in ein benanntes Register zu ziehen und dieses Register dann in das letzte Suchregister zu kopieren, z

"A5yw
:let @/=@A

Auf die Gefahr hin, eine lange Frage länger zu stellen, möchte ich sagen, dass es nicht immer 5 Wörter sind, die ich "ziehen und suchen" möchte - manchmal sind es 17 Zeichen, manchmal bis zum Ende der Zeile usw. Ein fest codiertes Makro bietet mir also nicht die Flexibilität, die ich mir wünschen würde.

Dan
quelle

Antworten:

108

Nachdem Sie gedrückt haben /, um eine Suchzeichenfolge einzugeben, können Sie Ctrl-Rden Buchstaben verwenden und den Buchstaben eingeben, der das Register darstellt, das Sie verwenden möchten.

z.B.

  • Zuerst, "Ayw um ein Wort in Register A zu ziehen
  • Dann, / ^R A um den Inhalt von Register A in die Suchzeichenfolge einzufügen.
a'r
quelle
1
Dies funktioniert natürlich, aber es hört sich so an, als ob das OP möglicherweise nicht wirklich suchen möchte, sondern nur die Hervorhebung erhält. In diesem Fall ist ein benutzerdefinierter Operator der richtige Weg.
Cascabel
1
Super - danke ar ... das ist genau das, was ich brauchte (nun, unter den Bedingungen, dass die perfekte Lösung überhaupt nicht möglich ist.) Danke für die prägnante Lösung.
Dan
11
Nur ein Kommentar ... "Ayw reißt das Wort nicht in das Register 'A' ... es hängt das Ding an das 'a'-Register an.
jkerian
1
+1 hat eine Weile danach gesucht, perfekte Lösung für das Problem, das ich zu lösen versuchte - danke.
Iblamefish
8
Aus Gründen der Klarheit verwendet vim den Fall des Registers, um zu bestimmen, ob es an den Inhalt angehängt oder ersetzt wird. Daher "aywwürde (in Kleinbuchstaben) der Inhalt des Registers 'a' ersetzt, während "Aywan das Register 'a' angehängt wird
Peter Gibson
38

Wenn Sie kein Register zum Speichern des zerrissenen Textes verwendet haben, verwendet vim das 0Register. Sie können , indem Sie für die Suche Ctrl-R 0nach /.

Ein komplizierteres Beispiel. Angenommen, Sie möchten in einem anderen Puffer nach dem Text in Anführungszeichen suchen, der sich gerade unter dem Cursor befindet:

  • Sie können das tun mit yi"(zerrte inneres Zitat)
  • Gehen Sie zu dem Puffer, in dem Sie suchen möchten
  • Art /Ctrl-R 0
csierra
quelle
1
Ich fand diese Lösung nützlicher als die von a'r, da das wiederholte Dirigieren "Ayw eine angehängte Zeichenfolge im Register A erzeugt. Aber einfach zu tippen ywund dann Ctrl-R 0danach zu /tippen, gibt immer genau das, was ich gerissen habe.
David Jung
10

Ich verwende dafür folgenden Code:

vnoremap <silent>* <ESC>:call VisualSearch('/')<CR>/<CR>
vnoremap <silent># <ESC>:call VisualSearch('?')<CR>?<CR>

    function! VisualSearch(dirrection)
        let l:register=@@
        normal! gvy
        let l:search=escape(@@, '$.*/\[]')
        if a:dirrection=='/'
            execute 'normal! /'.l:search
        else
            execute 'normal! ?'.l:search
        endif
        let @/=l:search
        normal! gV
        let @@=l:register
    endfunction
Nikolay Frantsev
quelle
Falls dies nicht klar ist, können Sie im visuellen Modus Text auswählen und mit * oder # nach diesem Text suchen.
Edward Anderson
6

Suche nach einer Auswahl:

Wenn Sie zuerst einen Abschnitt einer Linie ziehen möchten, verwenden Sie "v" und bewegen Sie sich mit den Cursorn, bis Sie markiert haben, was Sie möchten. Drücken Sie dann y, um zu ziehen, und jetzt befindet sich die Auswahl in Register 0

Sie können dann eingeben /Ctrl-R 0

serup
quelle
5

Also im Grunde eine erweiterte Version der Befehle # und *, oder? Es hört sich so an, als ob Sie einen benutzerdefinierten Operator definieren möchten (einen Befehl, der eine Bewegung erwartet). Ich habe das noch nie gemacht, aber ich habe ein Plugin gefunden, das es vielleicht einfacher macht. Es werden einige Beispiele bereitgestellt.

Cascabel
quelle