2012-09-10 22 views
5

विम में अंतर्निहित GUID जनरेटर नहीं है। , इस प्रकारमैं विम में एक GUID कैसे उत्पन्न कर सकता हूं?

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

मैं एक प्रतिस्थापन के भीतर इस फोन:

परियोजना के लिए मैं पर काम कर रहा हूँ, मैं Powershell उपलब्ध होने पर, भरोसा कर सकते हैं तो निम्नलिखित मुझे एक GUID स्ट्रिंग देता

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

हालांकि यह काम करता है, यह प्रत्येक प्रतिस्थापन के लिए एक खिड़की को चमकता है और यह काफी धीमा है।

जो मैं वास्तव में चाहता हूं वह विम, पोर्टेबल और जल्दी के भीतर GUID उत्पन्न करने का एक तरीका है।

+0

आपके उदाहरण में, आप पहले 3 वर्णों ('[: 2] ') में GUID को छोटा कर रहे हैं; जो विशिष्टता संपत्ति खो देता है, और GUID को मूल (कुछ हद तक यादृच्छिक) संख्या में बदल देता है। क्या आप वाकई एक पूर्ण GUID, या केवल एक एन-लैंड यादृच्छिक संख्या की आवश्यकता है? –

+0

क्षमा करें कि यह होना चाहिए [: -2] - –

+0

से पिछली कचरा को ट्रिम करना, जैसा कि यहां बताया गया है [http://stackoverflow.com/a/7830645/1129682), आपको 'set shellquote = \ "सेट करना होगा। और 'powerxquote =' को 'system') बनाने के लिए शक्तियों के साथ सही ढंग से काम करें। – user1129682

उत्तर

8

आप पर विम के अजगर पटकथा समर्थन किया जा रहा उपलब्ध

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

दुर्भाग्य से नहीं। मैं विंडोज़ पर हूं, न तो रूबी और न ही पायथन आवश्यक रूप से उपलब्ध है - इसे विम के भीतर ही करना आदर्श है। –

+1

आज मैंने इस समाधान की कोशिश की लेकिन पाया कि पाइवल उपलब्ध नहीं था, इसलिए यह समाप्त हो गया: ': py vim.command (" s/nguid/"+ str (uuid.uuid4()) + "/ g") ' ... और फिर इसे दोहराएं, एक विम मैक्रो का उपयोग करना। आदर्श नहीं है, लेकिन यह अच्छी तरह से काम करता है, उस पर शुरुआत के लिए धन्यवाद। –

2

बदलें

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

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

साथ

कि मदद करता है?

+0

यही वह है जो मैं पहले से कर रहा हूं - खोल शक्तियों पर सेट है, लेकिन धन्यवाद। –

1

विंडोज़ पर भरोसा कर सकते हैं, तो system() आदेश एक कमांड विंडो (आमतौर पर पृष्ठभूमि में, हालांकि) दिखाई नहीं देता। इससे बचने का एक तरीका है विम में संकलित एक भाषा बाध्यकारी का उपयोग करना, उदा। अजगर:

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

यह दोनों तेजी से होता है और पॉपअप से बचा जाता है, लेकिन एक अजगर स्थापना और एक विम अजगर समर्थन हासिल है कि आवश्यकता होती है; आप शायद एक समान पर्ल या रुबी कार्यान्वयन के साथ आ सकते हैं, अगर किसी कारण से आप दूसरी भाषा पसंद करते हैं। दुर्भाग्यवश, अभी तक कोई पावरशेल भाषा बाध्यकारी नहीं है।

3

आप नहीं चाहते हैं/एक विम भाषा रैपिंग (जैसे Python या perl के) का उपयोग नहीं कर सकते हैं, तो आप Win32 UuidCreate() समारोह के लिए एक DLL आवरण लिखने और आह्वान है कि विम से libcall() के माध्यम से किया है। (सहायता कहती है कि आप सीधे विंडोज सिस्टम डीएलएल का आह्वान नहीं कर सकते क्योंकि कॉलिंग सम्मेलन मेल नहीं खाता है।)

रैपर शायद सरल और लिखना आसान है, लेकिन आपको अभी भी एक डीएलएल संकलित करने और प्रत्येक सिस्टम पर स्थापित करने की आवश्यकता है ।

1

मुझे लगता है कि आप यादृच्छिक हेक्स के साथ foo को प्रतिस्थापित करना चाहते हैं। यदि हां, तो आप इस तरह कर सकते हैं:

एम $ विंडोज:

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

यूनिक्स के लिए:

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

यह किसी अन्य शेल कमांड की तुलना में बहुत तेजी से किया जाएगा।

+0

libcall() 'का उपयोग करने का अच्छा उदाहरण। दुर्भाग्य से, GUID! = यादृच्छिक संख्या; उत्तरार्द्ध विशिष्टता की गारंटी नहीं देता है। –

+0

@IngoKarkat आप सही हैं, GUID एक यादृच्छिक संख्या नहीं है। उपयोग के मामले पर विचार करते समय: यह केवल GUID के पहले 3 हेक्स का उपयोग करता है। और GUID के कार्यान्वयन। इसलिए मैं बस अनुमान लगाता हूं कि इसे यादृच्छिक संख्या जनरेटर द्वारा प्रतिस्थापित किया जा सकता है। :) –

+0

अच्छी पकड़; मुझे पूरी तरह से एहसास नहीं हुआ कि GUID आउटपुट छोटा कर दिया गया है। इससे आपका समाधान एक अच्छा विकल्प बन जाता है; +1 –

0

मुझे यहां मिला क्योंकि प्रश्न-शीर्षक पूछता है कि यूयूआईडी कैसे बनाया जाए, हालांकि प्रश्न-पाठ वास्तव में नए बनाए गए यूयूआईडी के साथ मौजूदा टेक्स्टब्लॉक को प्रतिस्थापित करना चाहता है।

Marius Gedminas' Answer मुझे बहुत दूर हो गया, और किसी और को, बना सकते हैं और एक UUID सम्मिलित करना होता है, तो यहाँ कैसे है: map <m-g> :call Guid() <cr>

(मामले में:

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

आप <alt+G> से मैप करना चाहते हैं पाइथन, read this)

संबंधित मुद्दे