কোনও কমান্ডের ফলাফলটি ভিএম-এ টেক্সটে কীভাবে সন্নিবেশ করা যায়?


42

উদাহরণস্বরূপ, :echo strftime(%c)নীচের অংশে বর্তমান সময়টি প্রদর্শিত হবে, তবে কীভাবে এই সময়ের স্ট্রিংটি পাঠ্যটিতে প্রবেশ করানো হবে (কার্সারের ঠিক পরে)?


1
আমি বিশ্বাস করি যে ওপিটির অর্থ "টেক্সটে কোনও ভিম ​​এক্সপ্রেশনের ফলাফল কীভাবে sertোকানো যায়?"
অ্যালাস্টার ইরভিন

এটি উল্লেখ করার মতো বিষয় যে স্থির পাঠ্যের একটি ব্লক সন্নিবেশ করানোর জন্য একটি ভিআইএম ফাংশন লেখার মতো একই প্রশ্ন নয় , তবে কিছু উত্তর এখনও প্রয়োগ হয়।
অ্যালাস্টার ইরভিন

আপনার উদাহরণটি আক্ষরিকভাবে আমার ব্যবহারের কেস এবং এর জন্য আমি আপনাকে সালাম জানাই।
জো

: একটি রেজিস্টার মধ্যে পুনঃনির্দেশিত দেখুন stackoverflow.com/questions/2573021/...
NeilG

উত্তর:


49

আপনি ব্যবহার করতে পারেন অভিব্যক্তি রেজিস্টার, "=, সঙ্গে 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>

2
+1 অফ কোর্স! "=রেজিস্টার। : - /
এভেলেক্স

2
একটি ভিম ভেরিয়েবলের মান পেতে (উদাহরণস্বরূপ, অধিবেশন): <C-R>=&sessionoptionsএটি এমনকি ওয়াইল্ডমোড ট্যাব-সমাপ্তিও করে!
জাস্টিন এম কেজ 18

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

সন্নিবেশ মোডে, <c-r>=কমান্ডের জন্য ধীর গতিতে ব্যবহৃত হয় যার প্রচুর আউটপুট থাকতে পারে এবং ইনডেন্টও ভেঙে যেতে পারে যাতে আউটপুট পাঠ্য অপঠনযোগ্য হয়। উদাহরণস্বরূপ, <c-r>=execute('nmap')আউটপুট লাইন দ্বারা লাইন লিখিত হবে, যা খুব ধীর।
jdhao

22

:r!date +\%c

দেখা :help :r!


1
dateবাহ্যিক কমান্ড এবং !বাহ্যিক আদেশগুলি কল করে যখন ওপি ভিআইএম কমান্ডের জন্য জিজ্ঞাসা করে।
ইয়েলেক্স

@Eellx না তিনি করেননি। এবং ! একটি vim, এবং vi, আদেশ। এটি আধ্যাত্মিক পদ্ধতি। পাশাপাশি অনেক অন্যান্য কাজ করে।
কীথ

5
@ কীথ: হ্যাঁ !একটি vi (এম) কমান্ড যা বাহ্যিক আদেশগুলি কল করে। আপনি ঠিক ওএম হতে পারেন কেবলমাত্র ভিআইএম কমান্ড আউটপুট করতে চান না তবে (গুলি) সে যদি করে তবে তা !করবে না।
ইলেভেক্স

11

এই আদেশগুলি strftime("%c")ডানদিকে আউটপুট প্রবেশ করবে যেখানে আপনার কার্সারটি রয়েছে:

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

এবং

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

আপনি যা চান তা করার অন্যান্য উপায় রয়েছে (উদাহরণস্বরূপ, মাইকের জবাব অনুসারে )।

সম্পাদনা করুন : আরও ভাল, ইনস-প্লেস সন্নিবেশের জন্য, ক্রিস জনসন= যেমন বর্ণনা করেছেন তেমন রেজিস্টারটি ব্যবহার করুন


10

আপনি যদি কোনও ভিআইএম কমান্ডের আউটপুট সন্নিবেশ করতে চান ( কোনও ফাংশন কলের রিটার্ন মানটির বিপরীতে ), আপনাকে এটি ক্যাপচার করতে হবে। এটি :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এবং একটি লিঙ্ক সম্পর্কিত কমান্ড


2
এটি দুর্দান্ত কাজ করে। লাইন ফাঁকা দিয়ে শুরু হলে সিঁড়ি ইনডেন্ট এড়াতে আমি set pasteআউটপুট ফেরার আগে এবং তার set nopasteপরে একটি কমান্ড যুক্ত করেছি । প্রকৃতপক্ষে, আমি বর্তমানের পেস্ট বিকল্পটির মান সংরক্ষণ করতে এবং এটি ফিরিয়ে দিতে চেয়েছিলাম কিন্তু আমি এটি করতে পারিনি।
হুয়ান ল্যানাস

1
@ জুয়ানলানাস এর 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"))

আপনি তারিখের আগে কোনও স্থান sertedোকাতে চান কিনা তার উপর নির্ভর করে।


4

শীর্ষস্থানীয় হোয়াইটস্পেস এবং ক্রমবর্ধমান ইনডেন্টের সমস্যাটি এড়াতে @ অদ্ভূত উত্তরের উন্নতি:

"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বাফার প্রবেশ করানো না হয়ে যায়।


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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.