2012-09-10 27 views
5

Vim no tiene un generador GUID incorporado.¿Cómo puedo generar un GUID en Vim?

Para el proyecto que estoy trabajando, puedo confiar en Powershell estar disponible, por lo que el siguiente me da una cadena GUID:

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

Yo llamo a esto dentro de una sustitución, de la siguiente manera:

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

Mientras esto funciona, parpadea una ventana para cada sustitución y es bastante lento.

Lo que realmente quiero es una forma de generar GUID dentro de Vim, de forma portátil y rápida.

+0

En su ejemplo, está truncando el GUID a los primeros 3 caracteres ('[: 2]'); que pierde la propiedad de unicidad y convierte el GUID en un número básico (algo aleatorio). ¿Estás seguro de que necesitas un GUID completo o solo un número aleatorio de N-longitud? –

+0

Disculpe que debería ser [: -2] - simplemente recorte los desperdicios finales –

+0

Como se indica [aquí] (http://stackoverflow.com/a/7830645/1129682), tiene que establecer 'set shellquote = \" ' y 'establecer shellxquote =' para hacer que 'system()' funcione correctamente con powershell. – user1129682

Respuesta

8

Si se puede contar con el apoyo de script Python de Vim estar disponible

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

Desafortunadamente no. Estoy en Windows, ni con Ruby ni Python necesariamente disponible - hacerlo dentro de Vim es lo ideal. –

+1

Hoy probé esta solución pero encontré que pyeval no estaba disponible, así que terminé haciendo: ': py vim.command (" s/nguid/"+ str (uuid.uuid4()) + "/ g") ' ... y luego repitiendo eso, usando una macro vim. No es ideal, pero funcionó bastante bien, gracias por el comienzo en eso. –

2

Reemplazar

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

con

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

ayuda eso?

+0

Eso es lo que estoy haciendo - shell está configurado en powershell, pero gracias. –

1

En Windows, el comando system() aparece una ventana de comandos (por lo general en el fondo, sin embargo). Una forma de evitar esto es utilizar un enlace de idioma compilado en Vim, p. Python:

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

Esto es más rápido y evita la ventana emergente, pero requiere una instalación de Python y un Vim que cuenta con el apoyo de Python; Probablemente pueda llegar a una implementación similar de Perl o Ruby, si por alguna razón prefiere otro idioma. Desafortunadamente, aún no hay un enlace de lenguaje PowerShell.

3

Si usted no quiere/no se puede utilizar un envoltorio lenguaje Vim (por ejemplo a Python o Perl), usted tiene que escribir una envoltura DLL para la función Win32 UuidCreate() e invocar que a partir de Vim a través de libcall(). (La ayuda dice que no puede invocar directamente las DLL del sistema de Windows porque la convención de llamadas no coincide.)

La envoltura es probablemente simple y fácil de escribir, pero aún necesita compilar una DLL e instalarla en cada sistema .

1

Supongo que solo quiere reemplazar el foo con hex al azar. Si es así, puede hacerlo de esta manera:

M $ de Windows:

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

para UNIX:

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

Esto será mucho más rápido que cualquier otro comando shell.

+0

Buen ejemplo de uso de 'libcall()'. Lamentablemente, GUID! = Número aleatorio; el último no garantiza la singularidad. –

+0

@IngoKarkat Tiene razón, el GUID no es un número aleatorio. Al considerar el caso de uso: solo usa los primeros 3 hexágonos de GUID. Y la implementación de GUID. Así que simplemente "supongo" que puede ser reemplazado por un generador de números aleatorios. :) –

+0

Buena captura; No me di cuenta completamente de que la salida GUID está truncada. Eso hace que su solución sea una buena alternativa; +1 –

0

Llegué aquí porque el título pregunta cómo crear un UUID, sin embargo, el texto de la pregunta realmente quiere reemplazar los bloques de texto existentes con un UUID recién creado.

Marius Gedminas' Answer me tiene muy lejos, y si alguien más tiene que crear e insertar un UUID, aquí es cómo:

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

Si desea asignar a <alt+G>: map <m-g> :call Guid() <cr>

(En caso su Gvim se bloquea al invocar Python, read this)