চুপচাপ শেল কমান্ডগুলি কীভাবে কার্যকর করা যায়?


70

:!<command>শেলের মধ্যে একটি কমান্ড কার্যকর করতে ব্যবহার করা যেতে পারে। তবে এটি আমার টার্মিনালটিকে " stdoutদখল " করে এবং এটি নির্দিষ্ট কমান্ড দিয়ে পূরণ করে ।

আমি ব্যাকগ্রাউন্ডে একটি কমান্ড কীভাবে কার্যকর করব যা কেবলমাত্র শূন্য-বহির্গমন কোডে আমাকে জানিয়ে দেয়?


1
আপনি কি + পাইথন ইন্টারফেস, বা অন্য কোনও ভাষা ইন্টারফেস ব্যবহার করতে ইচ্ছুক?
জোয়েটউইডল

1
@ জোয়েটউইল হ্যাঁ
অরেঞ্জটক্স

উত্তর:


52

:silent exec "!command"

নোট করুন যে আপনার আদেশটি কার্যকর করার সময় আপনার ভিম সেশনটি এখনও দখল করা হবে। এটি ভিমের সিঙ্ক্রোনাস প্রকৃতির কারণে। আপনি এখনও সিটিআরএল + জেড (ব্যাকগ্রাউন্ডে ভিমকে প্রেরণে) টিপে আপনার শেলের কাছে ফিরে আসতে পারেন এবং তারপরে fgযথারীতি কমান্ডটি দিয়ে ভিএম পুনরায় শুরু করতে পারেন ।

অবিচ্ছিন্নভাবে কাজগুলি করার জন্য, টিম পোপের প্লাগইন ভিম -প্রেরণা বা প্রকল্প নিওভিমের দিকে নজর দিন যা অ্যাসিঙ্ক্রোনাস কমান্ড প্রয়োগের জন্য স্থানীয় সমর্থন রয়েছে, যা আপনি সহজেই প্লাগইন NeoMake ব্যবহার করতে পারবেন। ভিমের সর্বশেষতম সংস্করণে অ্যাসিক্রোনাস কার্যগুলির জন্য সমর্থনও রয়েছে।

দেখুন : এইচ: নীরব


5
আমি যখন প্রশ্নটি দেখেছিলাম তখন এটিই আমি প্রথম চেষ্টা করেছিলাম :-) তবে আপনি যদি স্ট্যান্ডআউট (বা স্টার্ডার) কে আউটপুট করে এমন কোনও কমান্ড ব্যবহার করেন তবে এটি আপনার মূল ভিম উইন্ডোটি "ক্লোবার" করবে (চেষ্টা করুন :silent !ls) ... এটিও করতে পারে না কোনও অ -0 প্রস্থান কোডে যথাযথ আউটপুট দেবেন না ... তাই আমি ভয় করি যে এটি ব্যবহার না করে কিছুটা বেশি জড়িত :silent...
মার্টিন টর্নোজ

ওহ দুঃখিত. আপনি আপনার মন্তব্য লেখার সময় অ্যাসিক্রোনাস এক্সিকিউশন সম্পর্কে কিছু নোট যুক্ত করেছেন। কীভাবে প্রস্থান স্থিতি ইস্যুটি মোকাবেলা করতে হয় তা জানেন না। আপনি হয়ত ফ্রিণোডে # ভিমে চেষ্টা করতে পারেন।
অলিভারউভ

আমি এটিও নোট করতে চাই যে আমার ভিম সংস্করণে, 7.4 প্যাচগুলি 1-213 এর সাথে কোনও আউটপুটও দেখায় না :silent exec "!ls"বা :silent !lsদেখায় না ।
অলিভারউভ

3
এইচএম, আমি যা পরে পেয়েছি তা এখানে :silent !ls: i.stack.imgur.com/1XvS6.png ... ^Lএটিকে আবার ঠিক করার জন্য আমাকে টিপতে হবে ...
মার্টিন টর্নয়েজ

ভিএম-প্রেরণ অবশ্যই প্রদত্ত সমস্যার সমাধান হিসাবে দেখায়।
জোয়েটউইডল

30

এন্টার মেসেজটি ট্রিগার না করে কোনও কমান্ড কার্যকর করতে যেমন:

চালিয়ে যেতে ENTER টিপুন বা কমান্ডটি টাইপ করুন

নিম্নলিখিত সহজ উদাহরণ চেষ্টা করুন:

:silent !echo Hello

তারপরে ভিমে ফিরে আসার পরে পর্দা রিফ্রেশ করতে Ctrl+ L(বা :redraw!) টিপুন ।

রিফ্রেশের প্রয়োজনীয়তা এড়াতে আপনি নিজের কাস্টম কমান্ডটি সংজ্ঞায়িত করতে পারেন, যেমন:

:command! -nargs=1 Silent execute ':silent !'.<q-args> | execute ':redraw!'

এখন, আপনি শেল কমান্ডটি চালাতে নতুন Vim কমান্ডটি ব্যবহার করতে পারেন (দ্রষ্টব্য: ছাড়া ! এবং মূলধন এস সহ ):

:Silent ps

উত্স: "অবিরত করতে হিট ENTER" এড়ানো ভিম উইকিয়া সাইটে অনুরোধ জানায়


1
শূন্য-বহির্গমন কোডে কীভাবে আপনি বিজ্ঞপ্তি পাবেন?
মার্টিন টর্নোইজ

1
শূন্য-বহির্গমন প্রস্থান কোডের সমাধান নয়, তবে এটি যুক্ত করার জন্য, এই সাইলেন্ট কমান্ডটি :Silent ctags -R . > /dev/null &ব্যাকগ্রাউন্ডে চালানো পছন্দকে আদেশ দেয় । Stdout / dev / null এ প্রেরণ আউটপুটকে ভিম বাফারে প্রদর্শিত হতে বাধা দেয়।
ftvs

10

একটি দ্রুত এবং নোংরা সমাধান (খাঁটি ভিমস্ক্রিপ্টে)

এটি পটভূমিতে একটি প্রক্রিয়া শুরু করতে পারে:

:!slow_command_here > /tmp/output 2>&1 &

প্রক্রিয়াটি কখন শেষ হবে এবং কীভাবে, তার জন্য ভিমের একটি উপায় প্রয়োজন এবং সুতরাং কীভাবে একটি চিহ্নিতকারী ফাইল ব্যবহার করুন:

:!(rm -f /tmp/finished; slow_command_here > /tmp/output 2>&1; echo "$?" > /tmp/finished) &

প্রক্রিয়াটি সম্পন্ন হয়েছে কিনা তা এখন আমরা ভিমকে যতবার ঘন ঘন পরীক্ষা করতে বলি:

:augroup WaitForCompletion
:autocmd!
:autocmd CursorHold * if filereadable('/tmp/finished') | exec "augroup WaitForCompletion" | exec "au!" | exec "augroup END" | echo "Process completed with exit code ".readfile('/tmp/finished')[0] | end
:augroup END

আরে এটি সুন্দর নয়, তবে এটি কাজ অনুসারে!

অসুবিধেও

দুর্ভাগ্যক্রমে উপরের অটোমডিটি কার্সারটি না সরানো পর্যন্ত ট্রিগার করবে না। এবং যদি আপনি একবারে একাধিক ব্যাকগ্রাউন্ড প্রক্রিয়া চালাতে চান, আপনাকে সেই ফাইলগুলিতে এবং স্বতঃআরএমডি গ্রুপের নামের সাথে অনন্য আইডি যুক্ত করতে হবে।

সুতরাং আপনি যদি কোনও অতিরিক্ত নির্ভরতা পরিচালনা করতে পারেন তবে আপনি অন্য উত্তরে উল্লিখিত ভিআইএম-প্রেরণ প্লাগইনের মতো একটি পরীক্ষিত-পরীক্ষিত সমাধানটি ব্যবহার করতে পারেন।

আউটপুট প্রদর্শিত হচ্ছে

আপনি যদি কেবল প্রস্থান কোডের পরিবর্তে প্রক্রিয়াটির আউটপুট দেখতে চান তবে উপরের চূড়ান্ত প্রতিস্থাপন করুন :echo

silent botright pedit /tmp/output

এটি পূর্বরূপ উইন্ডো খুলবে। পরিবর্তে কুইকফিক্স ত্রুটি তালিকাটি ব্যবহার করতে:

silent cget /tmp/output | copen

কুইকফিক্স তালিকা আপনাকে ত্রুটিগুলি ব্যবহার করে সহজেই নেভিগেট করতে দেয় :cnext। তবে copenআপনার কার্সারটি খোলার সাথে সাথে কিক্সফিক্স উইন্ডোতে সরানো হয়েছে, যা সম্ভবত অবাক / বিরক্তিকর হবে।

(এর জন্য একটি :copenকার্যপ্রণালী হ'ল প্রারম্ভিকভাবে প্রক্রিয়া শুরু করার সাথে কিউএফ উইন্ডোটি খুলতে হবে, সুতরাং আপনাকে শেষে এটি কল করার প্রয়োজন হবে না ))


2
এখানে একমাত্র উত্তর যা আসলে এই প্রশ্নের উত্তর দেয়: "ব্যাকগ্রাউন্ডে একটি কমান্ড কার্যকর করুন যা কেবলমাত্র শূন্য-বহির্গমন কোডে আমাকে জানিয়ে দেয় " ... অন্য উত্তরগুলি এমনকি মোটামুটি কেনো আছে তা আমার কোনও ধারণা নেই ...
মার্টিন টর্নয়েজ

2
আমি বিশ্বাস করি যে তাদের উত্সাহ আছে কারণ তারা প্রশ্নের শিরোনামের পুরোপুরি উত্তর দেয় , যা এই পৃষ্ঠায় দর্শকদের নিয়ে আসে। "নিঃশব্দে শেল কমান্ডগুলি কীভাবে কার্যকর করা যায়?" একটি সাধারণ এসই ঘটনা! দর্শনার্থীরা কৃতজ্ঞ, তবে সম্ভবত শৃঙ্খলাবদ্ধ নয়।
জোয়েটউইল

একটি আদর্শ বিশ্বে আমাদের সম্ভবত দুটি পৃথক প্রশ্ন থাকবে: "শেল কমান্ড চুপচাপ কীভাবে কার্যকর করা যায়?" এবং "পটভূমিতে শেল কমান্ডগুলি কীভাবে কার্যকর করা যায়?" যাতে গুগলরা তাদের সন্ধান করছে can
জোয়েটউইডল

6

পটভূমিতে একটি কমান্ড চালানো

আমি একটি কমান্ড চালিয়ে যাচ্ছিলাম যা কিছুটা অবরুদ্ধ ছিল এবং আমি আউটপুটটির বিষয়ে সত্যই যত্ন নিই না। এটি টার্মিনাল / এমুলেটর নয় বরং সিস্টেমের সাথে সংযুক্ত প্রক্রিয়া শুরু করে এবং সমস্ত আউটপুটকে / dev / নালটিতে পুনর্নির্দেশের মাধ্যমে যত্ন নেওয়া যেতে পারে। উদাহরণ স্বরূপ:

:silent exec "!(espeak 'speaking in background'&) > /dev/null"

এটি (...&)পটভূমিতে চলে এবং > /dev/nullসমস্ত আউটপুট /dev/null(কিছুই নয়) এ পুনঃনির্দেশ করে ।

প্রথম বন্ধনী আউটপুটটিকে একটি সাব-শেল (বা এমন কিছু) এর মধ্যে আটকে দেয়, তবে এটির বর্তমান শেলের সাথে সংযুক্ত না হওয়ার পার্শ্ব-প্রতিক্রিয়া রয়েছে (কোনও বড় বিষয় নয়)।

ম্যাপিং সহ পটভূমিতে নিঃশব্দে একটি আদেশ চালানো

আমি কেবল বুঝতে পেরেছি যে আপনি যদি প্রকৃতপক্ষে এটিকে ম্যাপিং করেন তবে আপনি এর মতো কিছু করতে পারেন

nnoremap <silent> <leader>e :!$(espeak 'speaking in the background'&) > /dev/null

উপরেরটি কমান্ড বারে কিছুই প্রদর্শন করবে না এবং ভিআইমের বাইরে টার্মিনালে কিছু প্রদর্শন করবে না। এটি ম্যাপ করা হবে <leader> e, যা \ eপূর্বনির্ধারিত।

কমান্ড চালানো, এর আউটপুট ক্যাপচার করা, এর বিষয়বস্তু প্রদর্শন করা

(অন্য একটি সম্পাদনা - এবং সম্ভবত সবচেয়ে নিকৃষ্টতম)। এই এক হবে প্রদর্শন আউটপুট একটি কমান্ডের যদি আপনি তা নির্বাচন করুন:


একটি নতুন ট্যাব ভিতরে:

silent exec "!(echo 'hello. I'm a process! :)') > /tmp/vim_process" | :tabedit /tmp/vim_process

একটি আসল স্প্লিট ভিতরে:

silent exec "!(echo 'hello. I'm a process :)') > /tmp/vim_process" | :vs /tmp/vim_process

একটি আধ্যাত্মিক স্প্লিট ভিতরে:

silent exec "!(echo 'hello. I'm a process :)') > /tmp/vim_process" | :sp /tmp/vim_process

... যা ইচ্ছা কর


5

আপনি যদি প্রস্থান কোড সম্পর্কে চিন্তা না করেন তবে আপনি এটি সহ যেতে পারেন:

:call system('/usr/bin/zathura using-docker.pdf &')

1
যদি আপনি প্রস্থান v:shell_error
কোডটির

4

এটি আপনার প্রয়োজনের জন্য উপযুক্ত কিনা তা নিশ্চিত নয়, (ব্যাকগ্রাউন্ড প্রক্রিয়াগুলিকে হ্যান্ডেল করে না foo & - এটি "পটভূমিতে" বলতে চাইছেন কিনা তা নিশ্চিত নন ) তবে কাস্টম কমান্ডটি এখানে হিসাবে ব্যবহার করা যেতে পারে:

fun! s:PraeceptumTacet(cmd)
    silent let f = systemlist(a:cmd)
    if v:shell_error
        echohl Error
        echom "ERROR #" . v:shell_error
        echohl WarningMsg
        for e in f
            echom e
        endfor
        echohl None
    endif
endfun

command! -nargs=+ PT call s:PraeceptumTacet(<q-args>)

তারপরে যেমন ব্যবহার করুন:

:PT ls -l
:PT foobar
ERROR #127
/bin/bash: foobar: command not found

যদি আপনার ত্রুটির বার্তাটি প্রয়োজন না / চান তবে একটি সরল system()পর্যাপ্ত পরিমাণ যথেষ্ট হতে পারে তবে চেক করুন v:shell_errorএবং উদাহরণস্বরূপ প্রতিবেদন করুন echo Error!

সহায়তা থেকে ভি: শেল_আরার :

                                        v:shell_error shell_error-variable
v:shell_error   Result of the last shell command.  When non-zero, the last
                shell command had an error.  When zero, there was no problem.
                This only works when the shell returns the error code to Vim.
                The value -1 is often used when the command could not be
                executed.  Read-only.
                Example: >
    :!mv foo bar
    :if v:shell_error
    :  echo 'could not rename "foo" to "bar"!'
    :endif
                "shell_error" also works, for backwards compatibility.

এটি সত্যই এটি পটভূমিতে চলছে না; এটি শেষ হওয়ার জন্য আপনাকে এখনও অপেক্ষা করতে হবে।
মার্টিন টর্নোইজ

@ কার্পেটসমোকার: হ্যাঁ, এইভাবে আমার মন্তব্য "… ব্যাকগ্রাউন্ড প্রক্রিয়াগুলিকে হ্যান্ডেল করে না foo &..." । কিউ টেক্সট থেকে সামগ্রিকভাবে আমি এটি হয় বা হয় বলে ব্যাখ্যা করেছি। উভয় ক্ষেত্রেই "বহিরাগত কমান্ড ওরফে পটভূমি হিসেবে নির্বাহ করা" বা "পটভূমি প্রক্রিয়া হিসেবে বহিরাগত কমান্ড _and_ যেমন সম্পাদন।" । আমি প্রধানত Q ইত্যাদি শিরোনামের উপর ভিত্তি করে উত্তর দিয়েছি - এবং "নিশ্চিত নই…" - এর উপরে একটি মন্তব্য যুক্ত করেছি এবং যদি হয় বা হয় তবে তা স্পষ্ট করতে ওপিতে ছেড়ে দিয়েছি ।
রুনিয়াম

3

ভিম 8 পেশা সমর্থন চালু। প্লাগইনগুলির উপর নির্ভর না করে কেউ পটভূমিতে বাহ্যিক কমান্ড চালাতে পারে। উদাহরণস্বরূপ, বর্তমান অবস্থানে একটি মার্কডাউন সার্ভার ( মার্কসভার ) চালানো এবং ভিম সেশনটি অবরুদ্ধ নয়:

:call job_start('markserv .')

এটি বর্তমান ভিম প্রক্রিয়াটির উপ-প্রক্রিয়া হিসাবে মার্কসার প্রক্রিয়া শুরু করে। আপনি এটি দিয়ে যাচাই করতে পারেন pstree

জব_ স্টার্ট দেখুন


2

আমি নিম্নলিখিত কোড ব্যবহার করি:

command! -nargs=1 Silent call SilentExec(<q-args>)

function! SilentExec(cmd)
  let cmd = substitute(a:cmd, '^!', '', '')
  let cmd = substitute(cmd, '%', shellescape(expand('%')), '')
  call system(cmd)
endfunction

এখন আপনি নিম্নলিখিত টাইপ করতে পারেন

:Silent !your_command

এটি প্রায় silent !মূলধন ব্যতীত ভিমের অন্তর্নির্মিত কমান্ডের মতো দেখায় S। এমনকি এটি কোনও !আরও similarচ্ছিককে এটিকে আরও বেশি সাদৃশ্যযুক্ত করার অনুমতি দেয় । system()শেল কমান্ডটিকে সত্যই নিঃশব্দ করার জন্য কল করা হয়েছে : কোনও স্ক্রিন জ্বলছে না এবং কোনও পুনরায় আঁকবে না।

(এবং যদি আপনার কোনও স্থিতি কোডের প্রয়োজন হয় তবে আপনি v:shell_errorভেরিয়েবলটি পরীক্ষা করতে পারেন , আরও তথ্যের জন্য সহায়তা দেখুন)


1

AsyncRun প্লাগইন এই জন্য ডিজাইন করা, আপনার Vim8 / NeoVim পটভূমি জন্য শেল কমান্ড চালাতে এবং quickfix উইন্ডোতে আউটপুট প্রদর্শন করতে পারবেন।

ঠিক !কমান্ডের প্রতিস্থাপন হিসাবে :

:AsyncRun ls -la /

আপনি আউটপুটটি কুইকফিক্স উইন্ডোতে পুরোপুরি আড়াল করতে পারেন:

:AsyncRun -mode=3 ls -la /

কাজ শেষ হয়ে গেলে, AsyncRun একটি বিকল্প পাস করে আপনাকে অবহিত করবে -post:

:AsyncRun -post=some_vim_script   ls -la /

দ্বারা নির্ধারিত ভিএম স্ক্রিপ্টটি -postকাজ শেষ হওয়ার পরে কার্যকর করা হবে।

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