: nach Cursor statt nach Zeile lesen

11

Ich benutze :r !uuidgenhäufig, um eine neue UUID in den Puffer einzufügen. Dies funktioniert, aber ich versuche im Allgemeinen, die UUID zwischen Anführungszeichen einzufügen und :r !uuidgendie UUID in einer neuen Zeile zu drucken.

Um dieses Problem zu umgehen, verwende ich derzeit eine einfache Keymap:

nnoremap <C-u> mm:r!uuidgen<CR>dW"_dd`mp

Dieses Makro setzt die Markierung mm, fügt die UUID ein r!uuidgen, löscht die eingefügte UUID dW, löscht die zusätzliche Zeile "_dd, kehrt zur Markierung zurück und fügt BACKTICKmschließlich die UUID ein p.

Gibt es eine Möglichkeit, :rdirekt hinter dem Cursor zu stehen, ohne dass dieses Makro / diese Tastenkombination ein Register verschwendet?


quelle
1
SU-Frage , auch mit Problemumgehungen wie dieser.
Muru

Antworten:

8

Sie können das Ausdrucksregister verwenden "=und system():

<C-r>=system("uuidgen | tr -d '\n'")<CR>

In einem Mapping im Einfügemodus würde es so aussehen:

inoremap <key> <C-r>=system("uuidgen | tr -d '\n'")<CR>

oder mit einer Ausdruckszuordnung:

inoremap <expr> <key> system("uuidgen \| tr -d '\n'")
romainl
quelle
5

Im Einfügemodus können Sie drücken Ctrl-Rund dann Folgendes eingeben:

=system('uuidgen')

Beachten Sie, dass dadurch eine nachgestellte neue Zeile hinzugefügt wird, da dies die Ausgabe ist uuidgen. Um dies zu beheben, könnten wir verwenden:

=system('uuidgen')[:-2]

So entfernen Sie die neue Zeile.

Von :help i_CTRL-R:

Fügen Sie den Inhalt eines Registers ein. Zwischen der Eingabe von STRG-R und dem zweiten Zeichen wird '"' angezeigt, um anzuzeigen, dass Sie den Namen eines Registers eingeben müssen.

[..]

'=' das Ausdrucksregister: Sie werden aufgefordert, einen Ausdruck einzugeben (siehe Ausdruck)

Um dies an Ctrl-uIhr Beispiel zu binden , können Sie Folgendes verwenden:

nnoremap <C-u> i<C-r>=system('uuidgen')[:-2]<CR><Esc>
Martin Tournoij
quelle
2

Noch eine mit :python:

:py import uuid, vim; vim.command(':normal i' + str(uuid.uuid1()))

Sie könnten wie folgt zuordnen:

:inoremap <key> <esc>:py import uuid, vim; vim.command(':normal a' + str(uuid.uuid1()))<cr>a

Die UUIDs werden vom Python-UUID-Modul generiert .

muru
quelle
1
Dies ist jedoch ein ziemlich verdrehter Weg.
Muru
0

Dies ist möglicherweise weniger vorzuziehen als die Verwendung einer Pure-Vim-Lösung. Wenn Sie jedoch einen Snippet-Manager wie Ultisnips verwenden, können Sie versuchen , ein Snippet wie das folgende hinzuzufügen :

snippet uuid "insert new uuid" w
`uuidgen`
endsnippet

Auf diese Weise können Sie uuidIhren Erweiterungsauslöser im Einfügemodus eingeben und drücken und uuidwerden durch die Ausgabe des entsprechenden Shell-Befehls ersetzt. Dies kann natürlich leicht für andere Befehle angepasst und auf leistungsstarke Weise erweitert werden, wie in den Ultisnips-Dokumenten beschrieben.

Simut
quelle