Vim में टेक्स्ट में कमांड का परिणाम कैसे डालें?


42

उदाहरण के लिए, :echo strftime(%c)नीचे का वर्तमान समय दिखाएगा, लेकिन पाठ (कर्सर के ठीक बाद) में इस समय स्ट्रिंग को कैसे सम्मिलित करें?


1
मेरा मानना ​​है कि ओपी का अर्थ है "पाठ में विम अभिव्यक्ति के परिणाम कैसे सम्मिलित करें?"
एलिस्टेयर इरविन

यह भी ध्यान देने योग्य है कि यह वैसा ही सवाल नहीं है जैसा कि स्टेटिक टेक्स्ट के ब्लॉक को सम्मिलित करने के लिए vim फंक्शन को लिखना है , हालांकि कुछ उत्तर भी लागू होते हैं।
एलिस्टेयर इरविन

आपका उदाहरण वस्तुतः मेरा उपयोग मामला है और मैं इसके लिए आपको सलाम करता हूं।
जो

एक रजिस्टर में पुनर्निर्देशित करना भी देखें: stackoverflow.com/questions/2573021/…
NeilG

जवाबों:


49

आप सामान्य मोड में या सम्मिलित मोड में , (या ) के साथ अभिव्यक्ति रजिस्टर का"= उपयोग कर सकते हैं :pP<C-R>

सामान्य मोड में:
( <C-M>यहाँ का अर्थ है Control+ M, या सिर्फ प्रेस Enter/ Return)

"=strftime('%c')<C-M>p

इन्सर्ट मोड में:
( <C-M>ऊपर का अर्थ वही है, जिसका अर्थ <C-R>है Control+ R)

<C-R>=strftime('%c')<C-M>

आप एक ही अभिव्यक्ति कई बार का परिणाम सम्मिलित करना चाहते हैं, तो आप में कुंजी पर उन्हें मैप करने के लिए चाहते हो सकता है अपने .vimrc:
(यहाँ <C-M>और <C-R>सचमुच लिखे जाने चाहिए (पांच प्रिंट करने योग्य का एक अनुक्रम वर्ण-विम उन्हें आंतरिक रूप से अनुवाद करेगा))

:nmap <F2> "=strftime('%c')<C-M>p
:imap <F2> <C-R>=strftime('%c')<C-M>

2
+1 कोर्स! "=रजिस्टर। : - /
आठवीं

2
विम वैरिएबल का मान प्राप्त करने के लिए (उदाहरण के लिए, सेप्टॉप्शन): <C-R>=&sessionoptions- यह वाइल्डमोड टैब-पूरा भी करता है!
जस्टिन एम। कीज़

2
: put = strftime ('% c') <CM>
brunch875

इन्सर्ट मोड में, <c-r>=कमांड के लिए उपयोग धीमा है जिसमें बहुत अधिक आउटपुट हो सकता है और इंडेंट को भी तोड़ सकता है ताकि आउटपुट टेक्स्ट अपठनीय हो। उदाहरण के लिए, <c-r>=execute('nmap')आउटपुट को लाइन द्वारा लाइन लिखा जाएगा, जो बहुत धीमा है।
jdhao

22

:r!date +\%c

देख :help :r!


1
dateएक बाहरी कमांड है और बाहरी कमांड को !कॉल करता है जबकि ओपी विम कमांड के लिए कहता है।
आठ

@eelvex नहीं उसने नहीं किया। और यह ! एक विम, और vi, कमांड है। यह विहित विधि है। कई अन्य चीजों के लिए भी काम करता है।
कीथ

5
@ कीथ: हाँ !एक vi (m) कमांड है जो बाहरी कमांड को कॉल करता है । आप सही ओपी हो सकते हैं जो केवल वीआईएम कमांड का उत्पादन नहीं करना चाहते हैं लेकिन यदि वह ऐसा करता है, !तो नहीं करेगा।
बारह

11

ये कमांड strftime("%c")आपके कर्सर के अधिकार का आउटपुट डालेंगी:

:exe ":normal i" . strftime("%c")

तथा

:call feedkeys("i". strftime("%c"))

आप जो चाहते हैं उसे करने के अन्य तरीके हैं (जैसे, उदाहरण के लिए, मिकेल के जवाब पर )।

संपादित करें : इन-प्लेस डालने के लिए और भी बेहतर, क्रिस जॉन्सन के वर्णन के अनुसार= रजिस्टर का उपयोग करें


10

यदि आप vim कमांड का आउटपुट सम्मिलित करना चाहते हैं (जैसा कि फंक्शन कॉल के रिटर्न वैल्यू के विपरीत ), तो आपको इसे कैप्चर करना होगा। यह :redirकमांड के माध्यम से पूरा किया जाता है , जो आपको चर के मानक मानक के बराबर को चर, फ़ाइल, रजिस्टर या अन्य लक्ष्य में रीडायरेक्ट करने की अनुमति देता है।

:redirउपयोग करने के लिए दर्दनाक असुविधाजनक है; मैं अपनी कार्यक्षमता को और अधिक सुविधाजनक तरीके से एनकोड करने के लिए एक फ़ंक्शन लिखूंगा, कुछ ऐसा

funct! Exec(command)
    redir =>output
    silent exec a:command
    redir END
    return output
endfunct!

एक बार जब आप इस तरह के फ़ंक्शन की घोषणा करते हैं, तो आप कर्सर स्थिति पर कमांड के आउटपुट को सम्मिलित करने के लिए अभिव्यक्ति रजिस्टर (जैसा कि क्रिस जॉन्सन द्वारा समझाया गया है) का उपयोग कर सकते हैं। इसलिए, सामान्य मोड से, i^R=Exec('ls')विम के वर्तमान बफ़र्स की सूची सम्मिलित करने के लिए हिट करें।

ज्ञात रहे कि कमांड फंक्शन नेमस्पेस में निष्पादित होगा, इसलिए यदि आप एक ग्लोबल वैरिएबल का उपयोग करते हैं, तो आपको इसके साथ प्रीफिक्स करके इसे स्पष्ट रूप से नाम स्थान देना होगा g:। यह भी ध्यान दें कि Exec(), जैसा कि ऊपर लिखा गया है, एक समाप्ति वाली न्यूलाइन को एक-लाइन आउटपुट में जोड़ देगा। इससे substitute()बचने के लिए आप फ़ंक्शन में कॉल जोड़ना चाह सकते हैं ।

यह भी देखें https://stackoverflow.com/questions/2573021/vim-how-to-redirect-ex-command-output-into-current-buffer-or-file/2573054#2573054 अधिक के बारे में पर blathering के लिए redirऔर के लिए एक लिंक एक संबंधित आदेश।


2
यह बहुत अच्छा काम करता है। मैंने set pasteआउटपुट वापस करने से पहले एक कमांड जोड़ा और set nopasteबाद में, लाइनों के रिक्त स्थान से शुरू होने पर सीढ़ी इंडेंट से बचने के लिए। वास्तव में, मैं वर्तमान पेस्ट विकल्प के मूल्य को बचाना चाहता था और इसे वापस करना चाहता था लेकिन मैं ऐसा करने में असमर्थ था।
जुआन लानुस

1
@JuanLanus के set nopasteबाद काम नहीं करना चाहिए return output, क्योंकि रिटर्न स्टेटमेंट फ़ंक्शन से बाहर निकलने का बिंदु है। मैंने इस पृष्ठ पर एक अलग उत्तर के रूप में इस समस्या के लिए अपना समाधान रखा है।
इवगेनी सर्गेव

4
:call append(line('.'), strftime("%c"))

इसे अगली पंक्ति में रखेंगे, तब आप इसे वर्तमान स्थिति तक जोड़ने के लिए J( Shift+ J) दबा सकते थे ।

या यदि आपको एक कमांड में इसकी आवश्यकता है, तो आप कर सकते हैं

:call setline(line('.'), getline(line('.')) . strftime("%c"))

या

:call setline(line('.'), getline(line('.')) . " " . strftime("%c"))

आप तारीख से पहले डाला गया स्थान चाहते हैं या नहीं इसके आधार पर।


4

अग्रणी व्हाट्सएप और बढ़ते इंडेंट के साथ समस्या से बचने के लिए @intuited जवाब में सुधार:

"Examples:
":call Exec('buffers')
"This will include the output of :buffers into the current buffer.
"
"Also try:
":call Exec('ls')
":call Exec('autocmd')
"
funct! Exec(command)
    redir =>output
    silent exec a:command
    redir END
    let @o = output
    execute "put o"
    return ''
endfunct!

जब आप :call Exec('command')सामान्य मोड से फ़ाइल में वर्तमान स्थान पर बस सम्मिलित करेंगे । जैसा कि टिप्पणी में कहा गया है , स्ट्रिंग लौटाने के =Exec('command')साथ मूल (इन्सर्ट-मोड) Ctrl + R दृष्टिकोण Exec(..)का उपयोग करके आंशिक रूप से ठीक किया जा सकता है set paste, लेकिन set nopasteकहीं भी डालने का अवसर नहीं देता है।

let @o = outputवाक्य रचना रजिस्टर सेट oचर की सामग्री को output, जैसा कि यहां बताया: https://stackoverflow.com/a/22738310/1143274

return ''लाइन ताकि के डिफ़ॉल्ट वापसी मान है 0बफर के लिए डाले गए न हो।


2

यह मेरा इसे करने का तरीका है। यह कर्सर के ठीक बाद डालता है क्योंकि यह उपयोग करता है p

" save previous yank
let reg_save = @@

" save your text to the '@' register
let @@ = strftime('%c')
" paste it after the cursor
exec "normal! p"

" restore previous yank
let @@ = reg_save
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.