vim 에서 manpage 보기
Computing/vim tips 2010. 3. 23. 14:26systam call 이나 library call 을 거의 쓰지 않기 때문에 (사실, wrapper 만 호출해 왔다) 코딩을 하면서 manpage 를 참조할 일이 거의 없었다. ctags 만 있으면 wrapper 의 소스를 바로 볼 수 있기 때문에 소스 코드 외에 다른 문서가 필요 없었다.
그러나 최근 wrapper 를 쓰지 않고 프로그램을 만드는 연습을 하자니 매번 터미널에서 manpage 를 찾아 보는 게 너무나 번거롭게 느껴졌다.
그래서, k 로 매핑해 놓았던 K 의 매핑을 없애고, 대신, man | col -b 를 쓸까 했는데, 만족할 만한 결과가 나오지 않았다.
"틀림없이 누군가가 만들어 둔 script 가 존재할 거야" 라는 생각으로 vim.org 를 검색했는데, 아니나 다를까, 있었다.
http://www.vim.org/scripts/script.php?script_id=489
위 링크에서 .vba 파일을 받은 후, 받은 파일을 .vim 디렉토리로 옮긴다. 물론 .gz 압축을 풀어 주어야 함은 두말하면 잔소리.
그리고, vim 으로 .vba 파일을 open 한 후, 아래의 커맨드를 입력하면, vimball 로 묶여 있는 내용이 풀리게 된다 :
:so %
설치는 이것으로 끗.
사용방법은, manpage 를 보고자 하는 함수에 커서를 위치시키고, manpage section number 를 입력한 후, K 를 누르면 된다.
manpage section number 를 누르지 않으면, 터미널에서 그냥 man <function name> 을 한 것과 같은 결과가 나온다. 아래의 그림에 예시된 바와 같다 :
1. K 를 누르기 전의 화면
2. K 만 입력했을 때의 manpage
3. 2K 를 입력했을 때의 manpage
크나큰 문제점 한가지!! 그리고 해결방법!!
문제는, 내가 코딩할 때 vsplit 을 해서 두 개의 윈도우를 사용한다는 것이다. 아래 그림처럼 사용하되, 각각 80컬럼씩 맞춰 놓고 쓴다.
그런데, vim 이 외부의 프로그램, 이를테면 man 과 같은 것을 호출할 때에는 terminal width 가 vim 윈도우의 크기로 설정되는 모양인 듯 하다. 그래서 man 을 해 보면 아래의 그림과 같이 매우 불편한 상황이 연출된다 :
위 그림을 자세히 보면 오른쪽의 문장이 다 짤려 있는 것을 확인할 수 있다. 커서를 오른쪽으로 이동하면 화면이 스크롤 되면서 나머지 문장이 나타난다. 그렇다고
:set nowrap
을 사용할 수도 없는 것이, 그렇게 하면, formtting 이 완전히 깨져서 안하느니만 못하게 된다.
해결 방법으로 두 가지를 생각해 볼 수 있겠다 :
- :wincmd K 를 사용해서 man page 의 내용을 윈도우 전체의 폭을 활용해서 위로 올려 버리는 것.
그러나 이 방법은 자연스럽지 않다.
- man man 을 해 보면, man 이 $MANWIDTH 라는 환경변수를 사용한다는 것을 확인할 수 있다. 물론, linux 에서만 가능한 방법이지만, 어차피 HPUX 나 Solaris, AIX 의 man page 는 80컬럼에 맞춰져서 나오므로 문제될 것이 없다.
위 두 가지 방법 중 2번 방법이 나아 보이며, 실제 결과도 더 나았다.
그러면, 2 번 방법을 어떻게 적용하는가?
아래의 diff 를 ${HOME}/.vim/autoload/manpageview.vim 에 적용시키면 된다. 아래의 diff 에는 1번 방법과 2번 방법이 모두 나오는데, 주석처리된 부분은 1번 방법. 주석처리되지 않은 방법은 2번 방법이니, 취향에 따라 선택해서 사용하면 된다 :
shawn.mdw:~/env/vim$ svn diff
Index: autoload/manpageview.vim
===================================================================
--- autoload/manpageview.vim (revision 155)
+++ autoload/manpageview.vim (working copy)
@@ -389,6 +389,7 @@
" call Decho("hsplit mode")
if &ft != manpageview_syntax
wincmd s
+ "wincmd K
enew!
wincmd _
3wincmd -
@@ -399,6 +400,7 @@
" call Decho("hsplit= mode")
if &ft != manpageview_syntax
wincmd s
+ "wincmd K
endif
enew!
elseif g:manpageview_winopen == "vsplit"
@@ -522,6 +524,7 @@
" ---------------------------
" use manpage_lookup function {{{4
" ---------------------------
+ let $MANWIDTH=winwidth(0)
if exists("g:manpageview_lookup_{ext}")
" call Decho("lookup: exe call ".g:manpageview_lookup_{ext}."(".manpagebook.",".manpagetopic.")")
exe "call ".fnameescape(g:manpageview_lookup_{ext}."(".manpagebook.",".manpagetopic.")")
그럼, 2 번 방법을 적용시킨 후의 스크린샷을 보자. 깔끔하게 원하는 형식으로 출력되었다.