2012-09-10 15 views
5

Vim nie ma wbudowanego generatora GUID.Jak mogę wygenerować identyfikator GUID w Vimie?

Dla projektu pracuję nad, mogę polegać na PowerShell są dostępne, więc daje mi następujący ciąg GUID:

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

Ja nazywam to w substytucji, co następuje:

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

Podczas tej czynności miga w górę okienka dla każdej zmiany i jest dość powolna.

To, czego naprawdę chcę, to sposób generowania identyfikatorów GUID w Vimie, przenośnie i szybko.

+0

W twoim przykładzie obcinasz GUID do pierwszych 3 znaków ('[: 2]'); który traci właściwość unikalności i zmienia identyfikator GUID na podstawową (nieco losową) liczbę. Czy na pewno potrzebujesz pełnego identyfikatora GUID lub tylko losowego numeru N? –

+0

Przepraszam, że powinno być [: -2] - po prostu przycinanie ciągnących się śmieci –

+0

Jak wspomniano [tutaj] (http://stackoverflow.com/a/7830645/1129682), musisz ustawić 'set shellquote = \" ' i 'set shellxquote =', aby 'system()' działało poprawnie z Power Shell – user1129682

Odpowiedz

8

Jeśli można liczyć na wsparcie Python skryptów Vima jest dostępne

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

Niestety nie. Jestem w systemie Windows, bez Ruby ani Python jest koniecznie dostępny - robienie tego w samym Vimie jest idealnym –

+1

Dzisiaj próbowałem tego rozwiązania, ale stwierdziłem, że pyeval nie był dostępny, więc skończyło się: ': py vim.command (" s/nguid/"+ str (uuid.uuid4()) + "/ g") ' ... a następnie powtarzając to, używając makra vima .Nie idealne, ale działało wystarczająco dobrze, dziękuję za początek. –

2

Wymień

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

z

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

Czy to pomoże?

+0

To właśnie robię już - powłoka jest ustawiona na powershell, ale dziękuję –

1

W Windows komenda system() wyskakuje okno poleceń (zazwyczaj w tle, choć). Jednym ze sposobów uniknięcia tego jest użycie powiązania językowego skompilowanego z Vimem, np. Python:

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

Jest to zarówno szybsze i unika się okienko, ale wymaga instalacji Pythona i Vima, który ma wsparcie Pythona; prawdopodobnie możesz wymyślić podobną implementację Perla lub Ruby, jeśli z jakiegoś powodu wolisz inny język. Niestety, nie ma jeszcze powiązania języka PowerShell.

3

Jeśli nie chcesz/nie możesz używać pakowania języka Vim (np. Do Pythona lub Perla), musisz napisać wrapper DLL dla funkcji Win32 UuidCreate() i wywołać to z Vima przez libcall(). (Pomoc mówi, że nie można bezpośrednio wywoływać bibliotek DLL systemu Windows, ponieważ konwencja wywołująca nie pasuje).

Opakowanie jest prawdopodobnie proste i łatwe do napisania, ale nadal trzeba skompilować bibliotekę DLL i zainstalować ją w każdym systemie .

1

Domyślam się, że chcesz tylko zastąpić foo losowym hexem. Jeśli tak, można to zrobić tak:

M $ Windows:

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

dla systemu UNIX:

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

To będzie o wiele szybciej niż w jakimkolwiek innym poleceniem powłoki.

+0

Ładny przykład użycia 'libcall()'. Niestety GUID! = Liczba losowa; ta ostatnia nie gwarantuje wyjątkowości. –

+0

@IngoKarkat Masz rację, GUID nie jest liczbą losową. Rozważając przypadek użycia: wykorzystuje tylko pierwsze 3 szesnastkowe identyfikatory GUID. I wdrożenie GUID. Więc po prostu "zgaduję", że można go zastąpić generatorem liczb losowych. :) –

+0

Dobry połów; Nie w pełni zdałem sobie sprawę, że dane wyjściowe GUID są obcięte. To sprawia, że ​​twoje rozwiązanie jest dobrą alternatywą; +1 –

0

Dostałem się tutaj, ponieważ pytanie-tytuł prosi o utworzenie UUID, jednak tekst-pytanie rzeczywiście chce zastąpić istniejące blokady tekstu nowo utworzonym UUID.

Marius Gedminas' Answer dostał mnie bardzo daleko, a jeśli ktoś potrzebuje, aby utworzyć i wstawić UUID, oto jak:

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

Jeśli chcesz mapować go <alt+G>: map <m-g> :call Guid() <cr>

(W przypadku twój Gvim ulega awarii po wywołaniu Pythona, read this)

Powiązane problemy