2012-07-19 10 views
6

मैं एक विम मैक्रो को परिभाषित करना चाहता हूं जो कुछ समय पर उपयोगकर्ता इनपुट के लिए टूट जाता है, क्या यह संभव है?क्या आप विम में इंटरैक्टिव मैक्रोज़ या रिकॉर्डिंग कर सकते हैं?

संपादित करें: बाहर कर देता है मैं रिकॉर्डिंग (क्यू), नहीं मैक्रो

यह एक रिकॉर्डिंग में इनपुट आदेश का उपयोग करना संभव है जाहिर है, लेकिन यह अधिक परेशानी से इसके लायक है।

मैं पहली बार एक महत्वपूर्ण

:map <F2> a<C-R>=input('input: ')<CR> 

फिर डालने इनपुट भागने मैप किया मैं क्ष रजिस्टर

name: 

में इस रिकॉर्डिंग बना दिया है और एक नया टैब

iname: ^[ 

में चिपकाया और अंतिम भागने के बाद मैंने <C-V><F2> दबाया लाइन:

iname ^[^[OQ 

कि मैं क्यू बफर पर वापस झुक गया, फिर मैक्रो का उपयोग किया, जिससे मुझे इनपुट फ़ंक्शन का उपयोग करने दिया गया। यह काम करता है, लेकिन बहुत ही काम करता है।

उत्तर

3

हां। फंक्शन input({prompt}, [, {text} [, {completion}] ]) देखें। एक संवाद पॉपअप के लिए भी inputdialog({prompt} [, {text} [, {cancelreturn}]]) है।

+0

विम बस कमाल है! क्या कोई सवाल है जैसे "क्या मैं xxx में vim कर सकता हूं" उत्तर के साथ? :) – moritz

+0

इनपुट() मैक्रोज़ में उपलब्ध नहीं प्रतीत होता है (यहां तक ​​कि 'Ctrl-R = इनपुट (' प्रॉम्प्ट: ')' के माध्यम से भी नहीं) लेकिन यदि आप सामान्य मैपिंग या फ़ंक्शंस के साथ ठीक हैं तो यह अच्छी तरह से काम करेगा । – mogelbrod

+0

@ विक्टरहॉलबर्ग: हम्म। बस (पुनः) कोशिश की। मेरे लिए काम करता है (विम 7.3.547)। बस मामले में, _macro_ से आपका क्या मतलब है? क्या नहीं 'मदद मैक्रो' बताता है? – fork0

1

दुर्भाग्यवश ऐसा संभव नहीं लगता है। आप मैक्रो के अंदर input() ट्रिगर कर सकते हैं, लेकिन बाद में जारी रखना संभव नहीं लगता है क्योंकि इनपुट प्रॉम्प्ट में दर्ज कोई भी अतिरिक्त इनपुट डाला जाता है।

किसी नामित रजिस्टर ("qY) में लाइन को यंक करें और इसे चलाने के लिए इसे (@q) चलाएं।
नोट: ^R और ^M को Ctrl-V Ctrl-R/M के साथ बदलें (:help i_CTRL-V देखें)।

  • oBEFORE ^R=input('prompt> ')- काम करता है
  • oBEFORE ^R=input('prompt> ')^Mitest- काम करता है, लेकिन शीघ्र
  • oBEFORE ^R=input('prompt> ')<CR>testमें itest सम्मिलित करता है -
+0

मैंने एक ही चीज़ देखी। यह सुविधा अच्छी होगी अगर यह सुविधा लागू की गई थी। – everett1992

+0

@ everett1992: यह 'inputsave()' और 'inputrestore()' के रूप में है; मेरे जवाब पर एक नज़र डालें। –

2

विफल रहता है यदि आपको मानचित्र या मैक्रो में किसी एक input() उपयोग करते हैं, शेष पात्रों को इनपुट के रूप में लिया जाएगा, जो नहीं है तुम्हें चाहिए। विम inputsave() और inputrestore() फ़ंक्शन अस्थायी रूप से मैपिंग वर्ण स्ट्रीम से पढ़ने को निलंबित करने के लिए प्रदान करता है।

mogelbrod के उत्तर के आधार पर, यह काम नहीं करता है; itest इनपुट के रूप में में पढ़ा जाता है:

oBEFORE ^R=input('prompt> ')^Mitest 

लेकिन इस करता है:

function! Input() 
    call inputsave() 
    let text = input('prompt> ') 
    call inputrestore() 
    return text 
endfunction 
oBEFORE ^R=Input()^Mitest 

दुर्भाग्य से, क्योंकि <C-R> एक अभिव्यक्ति लेता है, हम नहीं आदेशों इनलाइन डाल सकते हैं, लेकिन एक अलग Input() समारोह को परिभाषित करने के लिए है।

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