: czytaj po kursorze zamiast po linii

11

:r !uuidgenCzęsto używam do wstawiania nowego UUID do bufora. To działa, ale ogólnie próbuję wstawić identyfikator użytkownika między cudzysłowami i :r !uuidgenwypisuje go w nowej linii.

Aby obejść ten problem, używam obecnie prostej mapy klawiszy:

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

To makro ustawia znak mm, wstawia identyfikator UUID r!uuidgen, usuwa wstawiony identyfikator UUID dW, usuwa dodatkową linię "_dd, wraca do znaku BACKTICKmi na koniec wkleja UUID p.

Czy istnieje sposób :rtuż za kursorem bez tego przypisania makra / klawisza, które marnuje rejestr?


źródło
1
Pytanie SU , również z takimi obejściami.
muru

Odpowiedzi:

8

Możesz użyć rejestru wyrażeń "=i system():

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

To wyglądałoby tak w trybie mapowania w trybie wstawiania:

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

lub z mapowaniem wyrażeń:

inoremap <expr> <key> system("uuidgen \| tr -d '\n'")
romainl
źródło
5

W trybie wstawiania możesz nacisnąć Ctrl-R, a następnie wpisać:

=system('uuidgen')

Zauważ, że doda to końcowy znak nowej linii, ponieważ to właśnie uuidgenwyjściowe; aby to naprawić, możemy użyć:

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

Aby usunąć nową linię.

Od :help i_CTRL-R:

Wstaw zawartość rejestru. Pomiędzy wpisaniem CTRL-R a drugim znakiem pojawi się „”, aby wskazać, że należy wprowadzić nazwę rejestru.

[..]

'=' rejestr wyrażeń: pojawi się monit o wprowadzenie wyrażenia (patrz wyrażenie)

Aby powiązać to z Ctrl-utwoim przykładem, możesz użyć:

nnoremap <C-u> i<C-r>=system('uuidgen')[:-2]<CR><Esc>
Martin Tournoij
źródło
2

Jeszcze jedno :python:

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

Możesz mapować jako:

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

Identyfikatory UUID są generowane przez moduł UUID języka Python .

muru
źródło
1
Jest to jednak dość pokręcona droga.
muru
0

Jest to być może mniej preferowane niż użycie rozwiązania czystego vima, jednak jeśli używasz menedżera fragmentów, takiego jak Ultisnips, możesz spróbować dodać fragment taki jak:

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

W ten sposób możesz wpisać uuidi nacisnąć twój rozwijany wyzwalacz w trybie wstawiania i uuidzostanie on zastąpiony wyjściem odpowiedniego polecenia powłoki. Można to oczywiście łatwo dostosować do innych poleceń i rozwinąć w potężny sposób, jak opisano w dokumentach Ultisnips.

Simut
źródło