उदाहरण के लिए, :echo strftime(%c)
नीचे का वर्तमान समय दिखाएगा, लेकिन पाठ (कर्सर के ठीक बाद) में इस समय स्ट्रिंग को कैसे सम्मिलित करें?
उदाहरण के लिए, :echo strftime(%c)
नीचे का वर्तमान समय दिखाएगा, लेकिन पाठ (कर्सर के ठीक बाद) में इस समय स्ट्रिंग को कैसे सम्मिलित करें?
जवाबों:
आप सामान्य मोड में या सम्मिलित मोड में , (या ) के साथ अभिव्यक्ति रजिस्टर का"=
उपयोग कर सकते हैं :p
P
<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>
"=
रजिस्टर। : - /
<C-R>=&sessionoptions
- यह वाइल्डमोड टैब-पूरा भी करता है!
<c-r>=
कमांड के लिए उपयोग धीमा है जिसमें बहुत अधिक आउटपुट हो सकता है और इंडेंट को भी तोड़ सकता है ताकि आउटपुट टेक्स्ट अपठनीय हो। उदाहरण के लिए, <c-r>=execute('nmap')
आउटपुट को लाइन द्वारा लाइन लिखा जाएगा, जो बहुत धीमा है।
:r!date +\%c
देख :help :r!
date
एक बाहरी कमांड है और बाहरी कमांड को !
कॉल करता है जबकि ओपी विम कमांड के लिए कहता है।
!
एक vi (m) कमांड है जो बाहरी कमांड को कॉल करता है । आप सही ओपी हो सकते हैं जो केवल वीआईएम कमांड का उत्पादन नहीं करना चाहते हैं लेकिन यदि वह ऐसा करता है, !
तो नहीं करेगा।
ये कमांड strftime("%c")
आपके कर्सर के अधिकार का आउटपुट डालेंगी:
:exe ":normal i" . strftime("%c")
तथा
:call feedkeys("i". strftime("%c"))
आप जो चाहते हैं उसे करने के अन्य तरीके हैं (जैसे, उदाहरण के लिए, मिकेल के जवाब पर )।
संपादित करें : इन-प्लेस डालने के लिए और भी बेहतर, क्रिस जॉन्सन के वर्णन के अनुसार=
रजिस्टर का उपयोग करें
यदि आप 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
और के लिए एक लिंक एक संबंधित आदेश।
set paste
आउटपुट वापस करने से पहले एक कमांड जोड़ा और set nopaste
बाद में, लाइनों के रिक्त स्थान से शुरू होने पर सीढ़ी इंडेंट से बचने के लिए। वास्तव में, मैं वर्तमान पेस्ट विकल्प के मूल्य को बचाना चाहता था और इसे वापस करना चाहता था लेकिन मैं ऐसा करने में असमर्थ था।
set nopaste
बाद काम नहीं करना चाहिए return output
, क्योंकि रिटर्न स्टेटमेंट फ़ंक्शन से बाहर निकलने का बिंदु है। मैंने इस पृष्ठ पर एक अलग उत्तर के रूप में इस समस्या के लिए अपना समाधान रखा है।
:call append(line('.'), strftime("%c"))
इसे अगली पंक्ति में रखेंगे, तब आप इसे वर्तमान स्थिति तक जोड़ने के लिए J
( Shift+ J) दबा सकते थे ।
या यदि आपको एक कमांड में इसकी आवश्यकता है, तो आप कर सकते हैं
:call setline(line('.'), getline(line('.')) . strftime("%c"))
या
:call setline(line('.'), getline(line('.')) . " " . strftime("%c"))
आप तारीख से पहले डाला गया स्थान चाहते हैं या नहीं इसके आधार पर।
अग्रणी व्हाट्सएप और बढ़ते इंडेंट के साथ समस्या से बचने के लिए @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
बफर के लिए डाले गए न हो।
यह मेरा इसे करने का तरीका है। यह कर्सर के ठीक बाद डालता है क्योंकि यह उपयोग करता है 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