উদাহরণস্বরূপ, :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>
অক্ষরে অক্ষরে টাইপ করা উচিত (পাঁচটি মুদ্রণযোগ্য অক্ষরের অনুক্রম im ভিম অভ্যন্তরীণভাবে অনুবাদ করবে))
: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 (এম) কমান্ড যা বাহ্যিক আদেশগুলি কল করে। আপনি ঠিক ওএম হতে পারেন কেবলমাত্র ভিআইএম কমান্ড আউটপুট করতে চান না তবে (গুলি) সে যদি করে তবে তা !
করবে না।
এই আদেশগুলি strftime("%c")
ডানদিকে আউটপুট প্রবেশ করবে যেখানে আপনার কার্সারটি রয়েছে:
:exe ":normal i" . strftime("%c")
এবং
:call feedkeys("i". strftime("%c"))
আপনি যা চান তা করার অন্যান্য উপায় রয়েছে (উদাহরণস্বরূপ, মাইকের জবাব অনুসারে )।
সম্পাদনা করুন : আরও ভাল, ইনস-প্লেস সন্নিবেশের জন্য, ক্রিস জনসন=
যেমন বর্ণনা করেছেন তেমন রেজিস্টারটি ব্যবহার করুন
আপনি যদি কোনও ভিআইএম কমান্ডের আউটপুট সন্নিবেশ করতে চান ( কোনও ফাংশন কলের রিটার্ন মানটির বিপরীতে ), আপনাকে এটি ক্যাপচার করতে হবে। এটি :redir
কমান্ডের মাধ্যমে সম্পন্ন হয় , যা আপনাকে ভিআইএম এর সমমানের আউটপুটের সমতুল্যকে একটি ভেরিয়েবল, ফাইল, রেজিস্টার বা অন্যান্য টার্গেটে পুনঃনির্দেশ করতে দেয়।
:redir
ধরণের ব্যবহারে অসুবিধাজনক; আমি আরও একটি সুবিধাজনক উপায়ে এর কার্যকারিতা encapsulate একটি ফাংশন লিখতে হবে, যেমন কিছু
funct! Exec(command)
redir =>output
silent exec a:command
redir END
return output
endfunct!
একবার আপনি এই জাতীয় ফাংশন ঘোষণা করার পরে, আপনি কার্সার অবস্থানে একটি কমান্ডের আউটপুট inোকাতে এক্সপ্রেশন রেজিস্টার (ক্রিস জনসনের ব্যাখ্যা অনুসারে) ব্যবহার করতে পারেন। সুতরাং, সাধারণ মোড থেকে 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"))
আপনি তারিখের আগে কোনও স্থান sertedোকাতে চান কিনা তার উপর নির্ভর করে।
শীর্ষস্থানীয় হোয়াইটস্পেস এবং ক্রমবর্ধমান ইনডেন্টের সমস্যাটি এড়াতে @ অদ্ভূত উত্তরের উন্নতি:
"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')
সাধারণ মোড থেকে আসেন তখন এটি কেবল ফাইলের বর্তমান অবস্থানে প্রবেশ করাবে। মন্তব্যে যেমন উল্লেখ করা হয়েছে , মূল (সন্নিবেশ-মোড) Ctrl + R =Exec('command')
পদ্ধতির সাথে 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