2012-09-10 3 views
5

Vim non ha un generatore GUID incorporato.Come posso generare un GUID in Vim?

Per il progetto su cui sto lavorando, posso contare su PowerShell essendo disponibile, quindi il seguente mi dà una stringa GUID:

[guid]::NewGuid().ToString() 

Io chiamo questo all'interno di una sostituzione, come segue:

%s/foo/\=system('[guid]::NewGuid().ToString()')[:2]/ 

Mentre funziona, lampeggia una finestra per ogni sostituzione ed è piuttosto lento.

Quello che voglio veramente è un modo per generare GUID in Vim, portabilmente e rapidamente.

+0

Nel tuo esempio, stai troncando il GUID ai primi 3 caratteri ('[: 2]'); che perde la proprietà di unicità e trasforma il GUID in un numero di base (un po 'casuale). Sei sicuro di aver bisogno di un GUID completo o solo di un numero casuale di lunghezza N? –

+0

Mi spiace che dovrebbe essere [: -2] - basta tagliare la spazzatura finale off –

+0

Come notato [qui] (http://stackoverflow.com/a/7830645/1129682), devi impostare 'set shellquote = \" ' e 'imposta shellxquote =' per far sì che 'system()' funzioni correttamente con powershell – user1129682

risposta

8

Se si può fare affidamento sul sostegno di scripting Python Vim essendo disponibile

:py import uuid 
:%s/foo/\=pyeval('str(uuid.uuid4())')/ 
+0

Purtroppo no. Io sono su Windows, con né Ruby né Python necessariamente disponibile - farlo all'interno di Vim è l'ideale –

+1

Oggi ho provato questa soluzione ma ho scoperto che pyeval non era disponibile, così ho finito per fare: ': py vim.command (" s/nguid/"+ str (uuid.uuid4()) + "/ g") ' ... e poi ripetendo ciò, usando una macro vim. Non ideale, ma ha funzionato abbastanza bene, grazie per l'inizio su questo –

2

Sostituire

'[guid]::NewGuid().ToString()' 

con

'powershell.exe -command "[guid]::NewGuid().ToString()"' 

fa questo aiuto?

+0

Questo è quello che sto facendo già - shell è impostato su powershell, ma grazie –

1

Su Windows, il comando system() apre una finestra di comando (di solito in fondo, però). Un modo per evitare ciò è usare un binding di linguaggio compilato in Vim, ad es. Python:

:python import uuid, vim; vim.command("let g:uuid = '" + str(uuid.uuid1()) + "' 

Questo è sia più veloce ed evita la comparsa, ma richiede un'installazione Python e un Vim che ha il supporto Python; probabilmente puoi trovare un'implementazione Perl o Ruby simile, se per qualche motivo preferisci un'altra lingua. Sfortunatamente, non esiste ancora un collegamento in linguaggio PowerShell.

3

Se non si vuole/non può usare un linguaggio di avvolgimento Vim (ad esempio a Python o Perl), si deve scrivere un wrapper DLL per la funzione Win32 UuidCreate() e invocare che dal Vim via libcall(). (L'aiuto dice che non è possibile richiamare direttamente le DLL di sistema di Windows perché la convenzione di chiamata non corrisponde.)

Il wrapper è probabilmente semplice e facile da scrivere, ma è comunque necessario compilare una DLL e installarla su ciascun sistema .

1

Immagino che vogliate sostituire lo foo con un esagono casuale. Se è così, si può fare in questo modo:

M $ di Windows:

%s/foo/\=printf("%04X",libcallnr("msvcrt.dll","rand",localtime()))[:2]/ 

per UNIX:

%s/foo/\=printf("%04X",libcallnr("libc.so.6","rand",localtime()))[:2]/ 

Questo sarà molto più veloce di qualsiasi altro comando di shell.

+0

Bel esempio di usare 'libcall()'. Sfortunatamente, GUID! = Numero casuale; quest'ultimo non garantisce l'unicità. –

+0

@IngoKarkat Hai ragione, il GUID non è un numero casuale. Considerando il caso d'uso: usa solo il primo 3 esadecimale di GUID. E l'implementazione di GUID. Quindi ho solo supposto che possa essere sostituito da un generatore di numeri casuali. :) –

+0

Buona cattura; Non ho realizzato completamente che l'output GUID è stato troncato. Ciò rende la tua soluzione una buona alternativa; +1 –

0

Sono arrivato perché la domanda-titolo chiede come creare un UUID, tuttavia la domanda-testo in realtà vuole sostituire i blocchi di testo esistenti con un UUID appena creato.

Marius Gedminas' Answer mi ha fatto molta strada, e se qualcun altro ha bisogno di creare e inserire un UUID, ecco come:

function! Guid() 
python << EOF 
import uuid, vim 
vim.command("normal i" + str(uuid.uuid4())) 
EOF 
endfunction 

Se si desidera mappare a <alt+G>: map <m-g> :call Guid() <cr>

(Nel caso in cui il tuo Gvim si blocca dopo aver richiamato Python, read this)