tools/vim

Learn Vimscript The Hard Way - 52. External Commands - part one

seul chan 2020. 5. 7. 23:48

External Commands - part one

해당 장도 두 포스트로 나누어서 작성할 예정이다.

Vim은 UNIX의 "do one thing well" 철학을 따른다. 에디터에 필요한 기능을 쑤셔넣는 대신에, vim은 적절한 외부 커맨드를 선정하여 일을 위임한다.

Potion 컴파일러와 interaction을 만들어서 vim의 외부 커맨드에 발을 담궈보자.

Compliling

우리는 먼저 현재 potion file을 컴파일하여 실행하는 명령어를 추가할 것이다. 아주 많은 방법이 있지만, 지금은 간단하게 외부 커맨드를 사용하도록 하자.

potion/ftplugin/potion/running.vim을 플러그인 레파지토리에 만들자. 이는 potion 파일들의 compiling과 running과 관련된 매핑이 들어갈 것이다.

if !exists("g:potion_command")
    let g:potion_command = "potion"
endif

function! PotionCompileAndRunFile()
    silent !clear
    execute "!" . g:potion_command . " " . bufname("%")
endfunction

nnoremap <buffer> <localleader>r :call PotionCompileAndRunFile()<cr>

첫 번째 덩어리는 만약 "potion_command" 변수가 실행되지 않았다면 이를 정의한다.

이는 potion$PATH에 없을 경우 ~/.vimrc에서 let g:potion_command = "/Users/sjl/src/potion/potion"과 같은 줄을 통해서 오버라이드 할 수 있게 한다.

마지막 줄은 위에 정의된 함수를 호출하는 buffer-local 매핑이다. 위 파일이 ftdetect/potion 디렉토리에 있어 filetypepotion으로 정의될 때 마다 실행된다는 것을 기억하다.

진짜 기능은 PotionCompileAndRunFile() 함수에 있다. 파일을 저장하고, factorial.pn을 열고 <localleader>r로 매핑을 실행시켜보고 무슨 일이 일어나는지 살펴보자.

localleader가 설정되어있어야 한다. 나는 역슬래쉬(\)로 설정해두고 쓰고 있다. let maplocalleader = "\\"~/.vimrc에 추가해주면 된다.

potion$PATH에 추가되어 있담녀 결과물을 반환할 것이고, 그렇지 않다면 potion 커맨드가 없다는 에러가 발생할 것이다. 그렇다면 위의 g:potion_command~/.vimrc에 추가해주어야 한다.

let g:potion_command = "/Users/sjl/src/potion/potion" 여기서 경로는 실제로 potion이 깔려있는 경로를 추가해주면 된다.

추가 후 :sorce ~/.vimrc를 하고 <localleader>r을 실행시키면 결과가 나오는 것을 볼 수 있다.

0! is: 0
1! is: 1
2! is: 2
3! is: 6
4! is: 24
5! is: 120
6! is: 720
7! is: 5040
8! is: 40320
9! is: 362880

어떻게 PotionCompileAndRunFile() 함수가 작동하는지 살펴보자.

Bang!

:! 명령어 ("bang"이라고 읽는다)는 vim이 외부 명령어를 실행시키고 결과물을 출력하는 명령어이다. 다음 명령어를 실행시켜보아라.

:!ls

vim은 ls 명령어의 결과물을 "Press ENTER or type command to continue" 메세지와 함께 보여줄 것이다.

이 방식으로 실행되면 어떤 input도 받지 않는다. 다음을 실행시켜보자.

:!cat

몇몇 단어를 쓰면 vim 밖에서 cat 명령어를 실행한 것처럼 cat 명령어가 그대로 이를 뱉어내는 것을 볼 수 있다. Ctrl - D를 눌러서 종료할 수 있다.

Press ENTER or type command to continue 프롬프트 없이 외부 프로그램을 실행시키려면 :silent !를 사용하면 된다.

:silent !echo Hello, world.

MacVim이나 gVim같은 GUI Vim에서 실행시켰다면 Hello, world.가 보이지 않을 것이다.

만약 터미널 vim에서 실행시켰다면 이는 설정에 따라 다를 것이다. :silent ! 명령어를 실행한 이후 :redraw!로 스크린을 고쳐야 할 수도 있다.

명령어가 :silent!가 아닌 :silent !라는 것을 명확히 하자. 이들은 완전 다른 명령어이다.

PotionCompileAndRunFile() 함수를 다시 살펴보자.

function! PotionCompileAndRunFile()
    silent !clear
    execute "!" . g:potion_command . " " . bufname("%")
endfunction

먼저 silent !clear 명령어를 사용하여 스크린을 clear시킨다. 이는 이 명령어를 계속 사용해도 첫 명령어만 보이게 하는 효과를 준다.

다음 줄은 execute 명령어를 통해 명령어를 만들고 있다. 다음과 같은 명령어가 만들어진다.

!potion factorial.pn

결과물을 출력해야 하므로 silent 없이 실행하고 있다.

다음 내용은 다음 포스트에...