আমি ভাই (মি) এ সম্পাদনা করা ফাইলটি কীভাবে কার্যকর করা যায়


104

আমি যে ফাইলটি ভাই (মি) এ সম্পাদনা করছি এবং কীভাবে স্লিট উইন্ডোতে আউটপুট পাবেন (সায়টিই-র মতো)?

অবশ্যই আমি এটির মতো কার্যকর করতে পারি:

:!scriptname

তবে স্ক্রিপ্টের নাম লেখা এড়ানো এবং স্ক্রিনের ঠিক নীচের অংশে কীভাবে স্প্লিট উইন্ডোতে আউটপুট পাওয়া যায়?


21
:!% আপনাকে 'স্ক্রিপ্টনাম' লেখা এড়াতে দেবে। নীচের সমাধানগুলি আরও ভাল, তবে আমি ভেবেছিলাম আপনি সিদ্ধান্ত নেওয়ার ক্ষেত্রে আমি এটি উল্লেখ করব:!% যথেষ্ট যথেষ্ট is
চিন্তা কোরো

11
অন্য নোট, আপনি বর্তমান ফাইলটির পরম পথটি উল্লেখ করতে%: p (কেবলমাত্র% এর পরিবর্তে) ব্যবহার করতে পারেন। আপনার বর্তমান ডিরেক্টরি অন্য কোথাও থাকলে এটি প্রয়োজনীয় হতে পারে।
অ্যান্ডি

4
রুবি স্ক্রিপ্টগুলি চালাতে: রুবি% কৌতুকটি করবে
অ্যালেক্সিস পেরিয়ার

4
! @andy:%: P এছাড়াও ডিরেক্টরির $ PATH- এ হচ্ছে হচ্ছে না সমাধান করা
MayTheSForceBeWithYou

4
এবং :!"%:p"সাদা স্থান মোকাবেলা করতে।
ওজেফোর্ড

উত্তর:


110

নেই makeকমান্ড। এটি makeprgঅপশনে কমান্ড সেট চালায় । %বর্তমান ফাইলের নামের জন্য স্থানধারক হিসাবে ব্যবহার করুন । উদাহরণস্বরূপ, আপনি যদি একটি অজগর স্ক্রিপ্ট সম্পাদনা করতেন:

:set makeprg=python\ %

হ্যাঁ, আপনার স্থানটি পালাতে হবে। এর পরে আপনি কেবল চালাতে পারবেন:

:make

আপনি যদি চান, আপনি autowriteবিকল্পটি সেট করতে পারেন এবং এটি চালানোর আগে এটি স্বয়ংক্রিয়ভাবে সংরক্ষণ করবে makeprg:

:set autowrite

এটি এক্সিকিউট অংশটি সমাধান করে। ফাইলটি পুনর্নির্দেশ জড়িত না এমন একটি বিভক্ত উইন্ডোতে output আউটপুট পাওয়ার কোনও উপায় জানেন না।


5
আসলে, আপনার সমাধানটি একটি বিভক্ত উইন্ডোতে আউটপুট পায়। এটির নিজস্ব উইন্ডোটিতে :copenচালনা করে উত্পাদিত "ত্রুটি তালিকা" খোলার জন্য ব্যবহার করুন :make। দুর্ভাগ্যক্রমে, আউটপুটটি সঠিকভাবে ফর্ম্যাট করার জন্য, errorformatবিকল্পটির কিছু ফিনগলিং প্রয়োজনীয়। অন্যথায় আউটপুটটি জিসিসি প্রেরিত বিন্যাসের বলে ধরে নেওয়া হবে।
সুসংগত সংকলক

4
আপনি "ফিনগলিং" ত্রুটি ফর্ম্যাট সম্পর্কে নিশ্চিত। এটি আমি দেখেছি এমন কিছু পার্ল কোডের মতো দেখাচ্ছে ...
আর মার্টিনহো ফার্নান্দেস

4
এই সুবিধাটি ভিএম থেকে প্রকল্পের 'মেক' করার জন্য উপলব্ধ (উইমকে সামর্থ্যের মতো আইডিই দেয়)। ব্রায়ান কার্পারের সলিউশন ( :let f=expand("%")|vnew|execute '.!ruby "' . f . '"') যদিও ক্রিপ্টিক দেখায়, ঠিক ঠিক সেইভাবে কাজ করে যা প্রশ্নটির লেখক জিজ্ঞাসা করেছেন।
অজয় কুমারবাসুথকর

29

বর্তমান বাফারের ফাইল নাম অ্যাক্সেস করতে, ব্যবহার করুন %। এটিকে ভেরিয়েবলে আনতে আপনি expand()ফাংশনটি ব্যবহার করতে পারেন । নতুন বাফার দিয়ে একটি নতুন উইন্ডো খুলতে, ব্যবহার করুন :newবা :vnew। কমান্ড থেকে বর্তমান বাফারে আউটপুটটি পাইপ করতে, ব্যবহার করুন :.!। সবগুলোকে একত্রে রাখ:

:let f=expand("%")|vnew|execute '.!ruby "' . f . '"'

স্পষ্টতই rubyআপনি যা যা আদেশ চান তা প্রতিস্থাপন । আমি ব্যবহার করেছি executeযাতে আমি ফাইলের নামটি উদ্ধৃতি চিহ্ন সহ ঘিরে রাখতে পারি, সুতরাং যদি ফাইলনামে ফাঁকা স্থান থাকে তবে এটি কাজ করবে।


4
@ বাবুন ওয়ার্কসফাইন তার কমান্ড কার্যকর :command! R let f=expand("%")|vnew|execute '.!ruby "' . f . '"'করতে কেবলমাত্র ব্যবহার করতে সক্ষম হতে ব্যবহার করুন:R
xorpaul

সম্পাদনা করার সময় ব্যবহারকারীর ইনপুট প্রয়োজন এমন স্ক্রিপ্টগুলি দিয়েও কি এই রান করা সম্ভব হবে?
ইলস্টাম

23

ভিমের !("bang") কমান্ড রয়েছে যা ভিআইএম উইন্ডো থেকে সরাসরি শেল কমান্ড কার্যকর করে। তদতিরিক্ত এটি কমান্ডগুলির সিকোয়েন্স চালু করার অনুমতি দেয় যা পাইপ এবং পড়া স্টাডাউটের সাথে সংযুক্ত থাকে।

উদাহরণ স্বরূপ:

! node %

কমান্ড প্রম্পট উইন্ডো খোলার এবং কমান্ড প্রবর্তনের সমতুল্য:

cd my_current_directory 
node my_current_file

দেখুন : "বাহ্যিক কমান্ড নিয়ে কাজ তেজ টিপস" বিস্তারিত জানার জন্য।


11

আমার ভিএমআরসি-তে এর জন্য আমার একটি শর্টকাট রয়েছে:

nmap <F6> :w<CR>:silent !chmod 755 %<CR>:silent !./% > .tmp.xyz<CR>
     \ :tabnew<CR>:r .tmp.xyz<CR>:silent !rm .tmp.xyz<CR>:redraw!<CR>

এটি বর্তমান বাফার লিখেছে, বর্তমান ফাইলটিকে এক্সিকিউটেবল (কেবল ইউনিক্স) করে তোলে, এটি চালায় (কেবল ইউনিক্স) এবং আউটপুটটিকে .tmp.xyz এ পুনর্নির্দেশ করে, তারপরে একটি নতুন ট্যাব তৈরি করে, ফাইলটি পড়ে এবং তারপরে এটি মুছে ফেলা হয়।

এটি ভেঙে দেওয়া:

:w<CR>                             write current buffer
:silent !chmod 755 %<CR>           make file executable
:silent !./% > .tmp.xyz<CR>        execute file, redirect output
:tabnew<CR>                        new tab
:r .tmp.xyz<CR>                    read file in new tab
:silent !rm .tmp.xyz<CR>           remove file
:redraw!<CR>                       in terminal mode, vim get scrambled
                                   this fixes it

4
আমি আপনার সমাধানটি অনেক পছন্দ করেছি এবং এটি ব্যবহার করার কিছুক্ষণ পরে, আমি অনুভব করেছি যে এটি আরও উন্নত হতে পারে। সুতরাং আমি এখানে এটি গ্রহণ করি: :w<CR>:silent !chmod +x %:p<CR>:silent !%:p 2>&1 | tee ~/.vim/output<CR>:split ~/.vim/output<CR>:redraw!<CR>- এটি স্ট্ডআউট এবং স্ট্ডার উভয়ই টেম্প ফাইলটিতে পুনঃনির্দেশ করে এবং এটি করার আগে এটি স্টাডআউটে সমস্ত কিছু প্রিন্ট করে, সুতরাং যদি কোনও স্ক্রিপ্ট আপনাকে চালাতে দীর্ঘ সময় নেয় তবে এটি আসলে কাজ করে দেখবে। এছাড়াও, এটি ডিরেক্টরি-স্বতন্ত্র (তাদের পরম পথ দিয়ে ফাইলগুলি খোলার সময় আমি ত্রুটিগুলি পেয়েছিলাম)। এটি স্ক্রিপ্টগুলি ইন্টারেক্টিভভাবে চালায় না, তবে এটি করার কোনও উপায় আমি খুঁজে পাইনি।
অজানা শিল্পী

4
fyi - @ সিরিলের সমাধানে, আমাকে পাইপের প্রতীকটি এড়াতে হয়েছিল: | ->। |
ম্যাপেটিস


3

ভিম 8 এর একটি ইন্টারেক্টিভ টার্মিনাল অন্তর্নির্মিত রয়েছে a বর্তমান স্পর্শ বিভাজনে স্ক্রিপ্টটি চালাতে:

:terminal bash %

বা সংক্ষেপে

:ter bash %

% বর্তমান ফাইলের নামটিতে প্রসারিত হয়।

থেকে :help terminal:

The terminal feature is optional, use this to check if your Vim has it:
    echo has('terminal')
If the result is "1" you have it.

1

আমি মানচিত্রের মাধ্যমে আরও খানিকটা অনুপ্রবেশমূলক প্রক্রিয়া ব্যবহার করি:

map ;e :w<CR>:exe ":!python " . getreg("%") . "" <CR>

কেবল এটি তৈরি করে যাতে আমাকে সংরক্ষণ করতে হবে না, তবে যাও। শুধু যাও.


4
আপনি যদি স্বাক্ষরকরণ বিকল্পটি সেট করেন তবে আপনি চালাতে পারেন: তৈরি করুন এবং এটি ... স্বয়ংক্রিয়র আগে সংরক্ষণ করে।
আর মার্টিনহো ফার্নান্দিস

1

আপনি ভিআইএম এর প্লাগইন বেক্সেক ব্যবহার করতে পারেন । আমার জানা মতে সর্বশেষ সংস্করণটি 0.5।

তারপরে:

$ mkdir -p ~/.vim/plugin
$ mv bexec-0.5.vba ~/.vim/plugin
$ vim ~/.vim/plugin/bexec-0.5.vba

.Vba ফাইলটি সম্পাদনা করার সময় নিজেই ভিমের ভিতরে

:so %

কিছু আউটপুট আপনাকে জানাতে দেবে যে bexec.vim ডকুমেন্টেশন ইত্যাদির পাশাপাশি লেখা হয়েছে been

এখন, আপনি এটি পরীক্ষা করতে পারেন আপনার (ভাষাভাষার যে কোনও স্ক্রিপ্টের একটি #! অনুবাদক সঠিকভাবে কাজ করছে) ভিম এবং চালনায় খোলার মাধ্যমে

:Bexec 

দ্রষ্টব্য: আমি চেয়েছিলাম যে বিভাজনটি অনুভূমিকের চেয়ে উল্লম্ব হয়ে উঠুক, তাই আমি করেছি:

$ grep -i -n split ~/.vim/plugin/bexec.vim | grep -i hor
102:    let bexec_splitdir = "hor" " hor|ver
261:        exec {"ver":"vsp", "hor":"sp"}[g:bexec_splitdir]

এবং "হর" থেকে "ভের" -এর মান পরিবর্তন করে ..

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি আশা করি এটি এখানকার কাউকে সাহায্য করতে পারে। আমি কোরসারার স্টার্টআপ ইঞ্জিনিয়ারিং কোর্সটি নেওয়ার সময় একই ইস্যুতে চলছি যেখানে অধ্যাপক পলাজি ইমাস ব্যবহার করেন এবং আমি ইমাকস পছন্দ করি না ..


আপনার স্থানীয় .vimrc এ আপনার পছন্দ সম্পর্কিত সেটিংস পরিবর্তন করা উচিত। বেক্সেক "লেট বেেক্সেক_স্প্লিটডির = 'হর'" সেটিংস অফার করে যা প্লাগইন কোডটি পরিবর্তন না করে এটি করতে পারে।
সৌরভ হিরানী

0

@ শেঠক্রিটিকোস এবং @ কিরিল উত্তরগুলির ভিত্তিতে আমি এখন নিম্নলিখিতটি ব্যবহার করি:

function! Setup_ExecNDisplay()
  execute "w"
  execute "silent !chmod +x %:p"
  let n=expand('%:t')
  execute "silent !%:p 2>&1 | tee ~/.vim/output_".n
  " I prefer vsplit
  "execute "split ~/.vim/output_".n
  execute "vsplit ~/.vim/output_".n
  execute "redraw!"
  set autoread
endfunction

function! ExecNDisplay()
  execute "w"
  let n=expand('%:t')
  execute "silent !%:p 2>&1 | tee ~/.vim/output_".n
  " I use set autoread
  "execute "1 . 'wincmd e'"
endfunction

:nmap <F9> :call Setup_ExecNDisplay()<CR>
:nmap <F2> :call ExecNDisplay()<CR>

নতুন উইন্ডোটি সেট আপ করতে F9 এবং আপনার স্ক্রিপ্টটি কার্যকর করতে F2 এবং আপনার আউটপুট ফাইতে টি ব্যবহার করুন।

আমি আউটপুট ফাইলের নামের সাথে স্ক্রিপ্টের নামটিও যুক্ত করেছি, যাতে আপনি এটি একই সাথে একাধিক স্ক্রিপ্টগুলির জন্য ব্যবহার করতে পারেন।


0

আপনার মধ্যে .vimrcআপনি এই ফাংশনটি পেস্ট করতে পারেন

function! s:ExecuteInShell(command)
  let command = join(map(split(a:command), 'expand(v:val)'))
  let winnr = bufwinnr('^' . command . '$')
  silent! execute ':w'
  silent! execute  winnr < 0 ? 'vnew ' . fnameescape(command) : winnr . 'wincmd w'
  setlocal buftype=nowrite bufhidden=wipe nobuflisted noswapfile nowrap number
  silent! execute 'silent %!'. command
  silent! redraw
  silent! execute 'au BufUnload <buffer> execute bufwinnr(' . bufnr('#') . ') . ''wincmd w'''
  silent! execute 'nnoremap <silent> <buffer> <LocalLeader>r :call <SID>ExecuteInShell(''' . command . ''')<CR>'
  silent! execute 'wincmd w'
  " echo 'Shell command ' . command . ' executed.'
endfunction
command! -complete=shellcmd -nargs=+ Shell call s:ExecuteInShell(<q-args>)
cabbrev shell Shell

এর পরে, উদাহরণস্বরূপ vimরান কমান্ডে :shell python ~/p.py। এবং আপনি বিভক্ত উইন্ডোতে আউটপুট পাবেন। p.pyউদাহরণস্বরূপ পরিবর্তনের পরে আপনি আবার একই কমান্ডটি চালাবেন, এই ফাংশনটি আবার নতুন উইন্ডো তৈরি করবে না, এটি পূর্ববর্তী (একই) বিভক্ত উইন্ডোতে ফলাফলটি প্রদর্শন করবে।


এটি দুর্দান্ত, ধন্যবাদ! আপনি যখন আবার বাফারটি লেখেন তখন কীভাবে আপনি এটি পুনরায় যুক্ত করতে পারেন?
এলজি

0

@ এক্সরপল

আমি বেশ কিছুদিন ধরে এই স্ক্রিপ্টটির (পাইথন / উইন্ডোজ) সন্ধান করছিলাম। উইন্ডোজে কোনও "টি" নেই বলে আমি এটিকে এটিতে পরিবর্তন করেছি:

function! Setup_ExecNDisplay()
  execute "w"
  let n=expand('%:t')
  execute "silent ! python % > d:\\temp\\output_".n ." 2>&1"
  execute "vsplit d:\\temp\\output_".n
  execute "redraw!"
  set autoread
endfunction

function! ExecNDisplay()
  execute "w"
  let n=expand('%:t')
  execute "silent ! python % > d:\\temp\\output_".n . " 2>&1"
endfunction

:nmap <F9> :call Setup_ExecNDisplay()<CR>
:nmap <F2> :call ExecNDisplay()<CR>

0

নীচে প্রদর্শিত হিসাবে কেবল কোলন এবং উদ্দীপনা চিহ্ন ব্যবহার করুন

:! <স্ক্রিপ্ট_নাম>


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