[vim] Vi (m)에서 편집중인 파일을 실행하는 방법

Vi (m)에서 편집중인 파일을 실행하고 SciTE와 같이 분할 창에서 출력을 얻는 방법은 무엇입니까?

물론 다음과 같이 실행할 수 있습니다.

:!scriptname

그러나 스크립트 이름을 작성하지 않고 화면 하단 대신 분할 창에서 출력을 얻는 방법을 피할 수 있습니까?



답변

make명령은. makeprg옵션에 설정된 명령을 실행합니다 . %현재 파일 이름에 대한 자리 표시 자로 사용 합니다. 예를 들어, Python 스크립트를 편집하는 경우 :

:set makeprg=python\ %

네, 공간을 탈출해야합니다. 그 후에 간단히 실행할 수 있습니다.

:make

원하는 경우 autowrite옵션을 설정할 수 있으며 다음 을 실행하기 전에 자동으로 저장됩니다 makeprg.

:set autowrite

이것은 실행 부분을 해결합니다. 파일로의 리디렉션을 포함하지 않는 분할 창으로 출력을 가져 오는 방법을 모릅니다.


답변

현재 버퍼의 파일 이름에 액세스하려면 %. 변수로 가져 오려면 expand()함수를 사용할 수 있습니다 . 새 버퍼로 새 창을 열려면 :new또는을 사용하십시오 :vnew. 명령의 출력을 현재 버퍼로 파이프하려면을 사용하십시오 :.!. 함께 모아서:

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

분명히 ruby원하는 명령으로 대체하십시오 . execute파일 이름을 따옴표로 묶을 수 있도록 사용 했으므로 파일 이름에 공백이 있으면 작동합니다.


답변

Vim에는 !VIM 창에서 직접 쉘 명령을 실행하는 ( “bang”) 명령이 있습니다. 또한 파이프와 연결된 명령 시퀀스를 시작하고 stdout을 읽을 수 있습니다.

예를 들면 :

! node %

명령 프롬프트 창을 열고 명령을 실행하는 것과 같습니다.

cd my_current_directory
node my_current_file

자세한 내용은 “Vim 팁 : 외부 명령 작업” 을 참조하십시오.


답변

내 vimrc에 바로 가기가 있습니다.

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>

이렇게하면 현재 버퍼를 쓰고 현재 파일을 실행 가능하게 만들고 (unix 만 해당) 실행 (unix 만 해당)하고 출력을 .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


답변

내가 사용한 쉘 스크립트의 경우

:set makeprg=%

:make


답변

Vim 8에는 대화 형 터미널이 내장되어 있습니다. 분할 창에서 현재 bash 스크립트를 실행하려면 :

: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.


답변

맵을 통해 약간 더 침입적인 메커니즘을 사용합니다.

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

저장하지 않아도되게 만든 다음 가십시오. 바로 가기.