2013-08-05 4 views
0

나는 --cmd "source path/to/file.vim"으로 소싱 중이라는 vim 스크립트를 가지고 있습니다. 전체 명령은 조금 더 길고 마지막 명령은 vim을 그렇게 종료하는 것입니다. 이 파일에서 Vim에서 stdout 에코를 캡처

vim --cmd 'source path/to/file1.vim' [... source other files] --cmd ':q' 

나는 echomsg과 정력에 메시지를 출력 일부 처리를하고있는 중이 야. 이 메시지를 stdout에 캡처하고 싶습니다.

이 처리 중 일부는 sleep으로 잠자리를 필요로하는 것이 문제입니다. 그러나 sleep을 실행하면 vim이 화면을 다시 그립니다. 결과적으로이 화면에서는 초기에 에코 된 메시지가 부분적으로 지워집니다.

일단 Vim을 종료하면 메시지가 셸에서 순서대로 올바르게 출력되었지만 간헐적 인 다시 그리기로 인해 디스플레이가 엉망이되었습니다.

하나의 해결 방법은 writefile을 사용하여 stdout을 사용하는 대신 파일에 메시지를 쓰는 것이지만 진행률 표시 기능이 느슨합니다.

vimscript에서 표준 출력으로 echo'ed 메시지를 캡처하는 더 좋은 방법이 있습니까? 메시지가 진행됨에 따라 메시지를 표시하고 싶습니다.

감사합니다. A는 나중에 메시지를 만들 수 있습니다 그리기

+0

가능한 중복 (http://stackoverflow.com/questions/16739300/redirect [VIM에서 STDOUT에 전직 명령을 리디렉션] : 메시지 (echomsg)는 예를 들어, 리디렉션을위한 필요없이도 표시된다 -ex-command-to-stdout-in-vi m) – glts

+0

[Vim 명령을 실행하고 stdout을 통해 버퍼 보내기] (http://stackoverflow.com/q/17266098)를 참조하십시오. – glts

+0

이 두 가지 모두 좋은 답변이지만 문제를 해결하지는 못합니다. 1. vimrc 억제 때문에'-s'를 사용할 수 없습니다. 2. vim이 종료 된 후에 파이프가 작동하므로 파이프가 작동하지 않습니다. 진행 상태를 표시하기 위해 메시지를 보내면 화면이 업데이트되기를 원합니다. 가장 큰 문제는 이전에 보내진 echo 메세지를 지우는'sleep' 트리거를 다시 그리는 것입니다. –

답변

0

그렇게 : 당신이 redraw 강제 수

:new | redraw | echo "there is a new window" 

을 예컨대을 피하기 위해 또는 의견에 따라 대신 lazyredraw을 확인 사라집니다.

당신이 redir 명령을 사용할 수 있습니다, 표준 출력에 에코 (또는 다른 메시지)을 캡처하려면, 예를 들면 :

당신이 파일이 공급되는 대한 메시지에 관심이 있다면
$ ex +"redir>>/dev/stdout | echomsg 'foo' | redir END" -scq! 
foo 

때문에, -V 매개 변수를 사용하여 의

$ ex -V +"echomsg 'foo'" -scq! 
... 
Searching for "vimfiles/after/plugin/**/*.vim" 
Searching for ".vim/after/plugin/**/*.vim" 
foo 
관련 문제