: lê depois do cursor em vez de depois da linha


11

Uso :r !uuidgenfrequentemente para inserir um novo uuid no buffer. Isso funciona, mas geralmente estou tentando inserir o uuid entre aspas e :r !uuidgenimprime o uuid em uma nova linha.

Para contornar esse problema, atualmente estou usando um mapa de teclas simples:

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

Essa macro define a marca mm, insere o uuid r!uuidgen, exclui o uuid inserido dW, exclui a linha extra "_dd, volta à marca BACKTICKme, finalmente, cola o uuid p.

Existe uma maneira de :rseguir o cursor sem essa macro / combinação de teclas que desperdiça um registro?


1
Pergunta SU , também com soluções alternativas como esta.
muru

Respostas:


8

Você pode usar a expressão registradora "=e system():

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

Seria assim em um mapeamento no modo de inserção:

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

ou, com um mapeamento de expressão:

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

5

No modo de inserção, você pode clicar Ctrl-Re digitar:

=system('uuidgen')

Observe que isso adicionará uma nova linha à direita, porque é isso que uuidgengera; para consertar isso, poderíamos usar:

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

Para remover a nova linha.

De :help i_CTRL-R:

Insira o conteúdo de um registro. Entre a digitação de CTRL-R e o segundo caractere, '"' será exibido para indicar que você deve digitar o nome de um registro.

[..]

'=' o registro da expressão: você é solicitado a inserir uma expressão (consulte a expressão)

Para vincular isso Ctrl-ucomo seu exemplo, você pode usar:

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

2

Mais um, com :python:

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

Você pode mapear como:

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

Os UUIDs são gerados pelo módulo Python UUID .


1
Esta é uma maneira bastante distorcida de se fazer, no entanto.
187 muru

0

Talvez seja menos preferível do que usar uma solução pure-vim, no entanto, se você usar um gerenciador de trechos como o Ultisnips , poderá tentar adicionar um trecho como o seguinte:

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

Dessa forma, você pode digitar uuide pressionar seu gatilho de expansão no modo de inserção e uuidserá substituído pela saída do comando shell relevante. Obviamente, isso pode ser facilmente adaptado a outros comandos e expandido de maneiras poderosas, conforme descrito nos documentos do Ultisnips.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.