답변:
:silent exec "!command"
명령이 실행되는 동안 vim 세션은 계속 사용됩니다. 이것은 Vim의 동기 특성 때문입니다. CTRL + z를 눌러 (Vim을 백그라운드로 보내려면) 쉘로 돌아간 다음 fg
평소 와 같이 명령 으로 vim을 다시 시작할 수 있습니다.
비동기식으로 작업하려면 Tim Pope의 플러그인 vim-dispatch 또는 NeoMake 플러그인을 사용하여 쉽게 활용할 수있는 비동기 명령 실행을 기본적으로 지원하는 프로젝트 NeoVim을 살펴보십시오. Vim의 최신 버전은 비동기 작업도 지원합니다.
: h : silent 참조
:silent !ls
) ... 0이 아닌 종료 코드에서 적절한 결과를 제공하지 않습니다. 따라서 사용하는 것보다 조금 더 복잡합니다 :silent
.
:silent exec "!ls"
나 :silent !ls
패치 1-213와 빔, 7.4의 내 버전에 전혀 출력을 보여줍니다.
Enter 메시지를 트리거하지 않고 명령을 실행하려면 다음과 같이하십시오.
계속하려면 Enter 키를 누르거나 command를 입력하십시오.
다음 간단한 예제를 시도하십시오.
:silent !echo Hello
그런 다음 Vim으로 돌아갈 때 Ctrl+ L(또는 :redraw!
)를 눌러 화면을 새로 고칩니다.
새로 고침이 필요하지 않도록 다음과 같이 사용자 정의 명령을 정의 할 수 있습니다.
:command! -nargs=1 Silent execute ':silent !'.<q-args> | execute ':redraw!'
이제 새로운 Vim 명령을 사용하여 쉘 명령을 실행할 수 있습니다 (참고 : ! 없이 대문자 S 사용 ).
:Silent ps
출처 : Vim Wikia 사이트에서 "계속하려면 Enter 키를 누르십시오"메시지가 표시되지 않음
:Silent ctags -R . > /dev/null &
하면 백그라운드에서 명령 을 실행할 수 있습니다 . stdout을 / dev / null로 보내면 출력이 vim 버퍼에 나타나지 않습니다.
백그라운드에서 프로세스를 시작할 수 있습니다.
:!slow_command_here > /tmp/output 2>&1 &
그러나 Vim은 프로세스가 언제 완료되었는지, 어떻게 마커 파일을 사용하는지 알아낼 방법이 필요합니다.
:!(rm -f /tmp/finished; slow_command_here > /tmp/output 2>&1; echo "$?" > /tmp/finished) &
이제 Vim에게 프로세스가 완료되었는지 여부를 자주 확인하도록 요청할 수 있습니다.
: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
이봐, 예쁘지 않지만 일종의 작동합니다!
불행히도 위의 autocmd는 커서를 움직일 때까지 트리거되지 않습니다. 한 번에 둘 이상의 백그라운드 프로세스를 실행하려면 해당 파일과 autocmd 그룹 이름에 고유 ID를 추가해야합니다.
따라서 추가 종속성을 처리 할 수 있으면 다른 답변에서 언급 한 vim-dispatch 플러그인과 같은 시도되고 테스트 된 솔루션을 사용하는 것이 좋습니다.
종료 코드가 아닌 프로세스 출력 을 보려면 위 의 마지막을 다음으로 바꾸십시오 .echo
silent botright pedit /tmp/output
미리보기 창이 열립니다. 빠른 수정 오류 목록을 대신 사용하려면
silent cget /tmp/output | copen
빠른 수정 사항 목록을 사용하면을 사용하여 오류를 쉽게 탐색 할 수 있습니다 :cnext
. 그러나 copen
커서가 열릴 때 빠른 수정 창으로 커서를 이동하면 놀랍고 성 가실 것입니다.
(이를위한 해결책 :copen
은 프로세스를 처음 시작할 때 QF 창을 여는 것이므로 마지막에 호출 할 필요 가 없습니다 .)
나는 조금 막는 명령을 실행하고 있었고 실제로 출력에 신경 쓰지 않았습니다. 이것은 터미널 / 에뮬레이터가 아닌 시스템에 연결된 프로세스를 시작하고 모든 출력을 / dev / null로 리디렉션하여 처리 할 수 있습니다. 예를 들면 다음과 같습니다.
:silent exec "!(espeak 'speaking in background'&) > /dev/null"
는 (...&)
배경에서 그것을 실행하고 > /dev/null
모든 출력 리디렉션 /dev/null
(아무것도).
괄호는 출력을 서브 쉘 (또는 이와 유사한 것)에 트랩하지만 현재 쉘에 첨부되지 않은 부작용이 있습니다 (대부분은 아님).
방금 당신 이 실제로 그것을 매핑하면 다음과 같은 것을 할 수 있음을 깨달았습니다.
nnoremap <silent> <leader>e :!$(espeak 'speaking in the background'&) > /dev/null
위의 명령 표시 줄에는 아무것도 표시되지 않으며 vim 외부의 터미널에는 아무것도 표시되지 않습니다. 에 매핑 될 것 <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
... 너가 원하는 것을해라
종료 코드에 신경 쓰지 않으면 다음과 같이 할 수 있습니다.
:call system('/usr/bin/zathura using-docker.pdf &')
v:shell_error
변수가 알려줄 것입니다.
이것이 귀하의 요구에 맞는지 확실하지 않지만 (백그라운드 프로세스를에서와 같이 처리하지 않고 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 :
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 &
…… 에서와 같은 백그라운드 프로세스를 처리하지 않습니다 . Q 텍스트 전체에서 나는 그것을 또는로 해석했습니다. “외부 명령 AKA 배경으로 실행 ” 또는 “백그라운드 프로세스로 외부 명령 _and_로 실행 ” 중 하나 입니다. 나는 주로 Q 등의 제목을 바탕으로 답변을했으며 “잘 모르겠 음…” 에 대한 의견을 추가했습니다 .
다음 코드를 사용합니다.
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 !
capital을 제외하고 Vim의 내장 명령 과 거의 같습니다 S
. 심지어 옵션 !
이 더 비슷하게 보이도록 할 수도 있습니다. system()
쉘 명령을 진정으로 조용하게하는 호출 : 화면이 깜박이지 않고 다시 그리기가 없습니다.
(상태 코드가 필요한 경우 v:shell_error
변수를 확인할 수 있습니다. 자세한 내용은 도움말을 참조하십시오)
AsyncRun의 이 용으로 설계된 경우 플러그인은, 당신이 Vim8 / NeoVim에서 백그라운드에서 쉘 명령을 실행하고 quickfix 창에 출력을 표시 할 수 있습니다.
!
명령 대신
:AsyncRun ls -la /
빠른 수정 창에서 출력을 완전히 숨길 수도 있습니다.
:AsyncRun -mode=3 ls -la /
작업이 완료되면 AsyncRun은 옵션을 전달하여 알려줍니다 -post
.
:AsyncRun -post=some_vim_script ls -la /
에 의해 정의 된 vim 스크립트 -post
는 작업 완료 후 실행됩니다.