vim modeline 삽질기

2009/08/31 01:23
코딩컨벤션 삽질기 2탄은 vim의 modeline 삽질기다.

제일 삽질했던것이 // vim 과 /* vim */ 의 설정 포멧이 다르다는것을 모르고 안된다고 이것저것해봤던것.
그것에 대한 차이점을 자세히 설명해놓은곳이 이곳이다.

두번째 삽질은, // vim 위치의 문제. 이 mode line 주석이 있을곳은 소스의 맨 처음이거나 맨 마지막이어야한다!
이걸 몰라서 우엉삽질을 했다.

참고로, modeline을 사용하려면 set modeline(혹은 set ml)이 설정되어 있어야한다. 일반적인 배포판에서 이것이 설정되어있는지는 모르겠으나, win32 gvim은 기본으로 설정되어 있더라.

결론적으로, 나는 소스의 맨 마지막줄에
// vim: ts=4:sw=4:nowrap
같은 modeline을 설정한다.

멀티플랫폼/개발환경 vim

vim tips : $HOME / ctags / :A

2009/08/02 02:57
vim의 환경변수중에 자주사용하는 환경변수로 $VIMRUNTIME과 $HOME 이 있다. 만일 $HOME이 정해지면 재미있는것들을 많이 할 수 있는데, 예를들면 ctags 파일이나 session 파일들을 한곳에 몰아둘 수 있다.

cygwin 터미널용 vim과 gvim win32 버전을 동시에 사용하고, vimrc파일을 공유할경우 - 내 경우는 win32 vimrc를 ~/.vimrc 파일로 심볼릭링크를 걸어서 공유한다 - $HOME 변수를 설정하는것이 조금 곤란하다. 왜냐하면 시그윈과 윈도우즈가 디렉토리를 다루는 방식이 상이하기 때문이다. 내 경우는 그래서 꼼수로 $VIMRUNTIME 변수를 이용해서 아예 그곳에 set_home.vim 파일을 따로 두어 각각읽어들이게 했다. 그래서 시그인용 vim은 /usr/share/vim/vim72/set_home.vim 을 읽고 (그곳에서 let $HOME="/cygdrive/c/Users/pok/Documents") gvim win32는 다른 set_home.vim을 읽어들인다.

(Language : perl)
source $VIMRUNTIME/set_home.vim
function MakeTags()
    let current_dir = getcwd()
    let filename = substitute( substitute(current_dir, "[*:*|*' '*]", "_", "g"), "[*\/*|*\\*]", "_", "g" )
    let filename = $HOME . '/workspace/ctags_cscope/' . filename . '.ctags'
    execute '!ctags -R -f ' . filename . ' "' . current_dir . '"'
    execute 'set tags+=' . filename
endfunction
function AddTags()
    let ctags_files = substitute(glob($HOME . '/workspace/ctags_cscope/*ctags'), "\n", ",", "g")
    execute 'set tags+=' . ctags_files
endfunction
call AddTags()
au VimEnter * :cd $HOME
let g:alternateSearchPath = 'sfr:../source,sfr:../src,sfr:../include,sfr:../inc,sfr:../,sfr:./include'

MakeTags라는 함수는 현재 작업하는 곳의 ctags 파일을 작업디렉토리에서 공백이나 :, /, \ 등의 문자를 _로 바꾸어 $HOME/workspace/ctags_cscope 디렉토리에 만들어저장하는 역할을 한다. AddTags라는 파일은, 처음에 vim을 로딩할때 만들어둔 ctags 파일들을 읽는 역할을 한다. 소스를 분석할 디렉토리에서 :call MakeTags()만 호출하면, ctrl+]등을 자유롭게 이용할수 있다.

소스분석에서 매우 자주사용하는 플러그인이 a.vim이라는 플러그인인데, ./include/a.h , ./a.cpp 이렇게 파일들이있다면 :A 커맨드가 원하는데로 되지 않는다. cpp와 h 파일이 a.vim이 기본으로 지원하는 SearchPath에 없어서 생긴 문제인데, g:alternateSearchPath를 변경하면 원하는 SearchPath를 추가할수 있다. 마지막에 있는 sfr:../,sfr:./include 가 위의 문제를 해결하기위해 기본 SearchPath에서 추가한 설정이다.

마지막으로, 현재 vim의 view나 설정들(열어놓은 파일들이나 버퍼의 현재 커서 줄)을 저장하는 방법이 있는데, session을 저장하는 방법이다. :mks 원하는이름.vim 이라고 하면 세션이 저장되고 부르려면 :source 원하는이름.vim, 덮어저장하련 :mks! 원하는이름.vim 이라고 하면 된다. 내경우에는 $HOME 디렉토리에 세션들을 모두 저장해놓고 있으며, vim을 시작하면 자동으로 cwd를 $HOME으로 변경시켜놓아서( au VimEnter * :cd $HOME ) :source 이름.vim을 하면 바로 저장해놓은 세션들을 읽어들인다.

멀티플랫폼/개발환경 vim

vim tips : 두개의 file을 diff 하는 방법

2008/11/13 22:20
비교하고 싶은 두 파일이 있을때 vim을 이용하면 편리하다.

간단히 두 파일을 하나의 vim으로 열면 vim 하나에 두개의 버퍼가 있을것이다. 현재 vim에 어떤파일들이 열려있어서 어떤 버퍼들이 있는지를 보려면
:buffers
라는 명령을 치면 된다.

그러면 불친절한(?) 리스트가 뜨는데, 리스트에 나타난 기호와 알파벳의 정체는 이렇다.
  • % current window
  • # alternate buffer (switch using :e# or :b#)
  • a active (loaded and visible)
  • + modified

그 리스트 중에서 현재 편집중인 것과 diff하려는 버퍼를 split 하여 열면 된다.
:sb N
여기서 N은 리스트에 나타난 버퍼번호이다. 나는 diff를 할때 비교하려는 파일을 수직으로 나누어 보는것을 좋아하므로 버퍼를 항상 수직으로 연다.
:vert sb N
ctrl+W, W를 누르면 분할된 창끼리 넘나드는데 넘나들면서 각각의 버퍼에 diffthis명령을 준다.
:diffthis
그러면 두개의 창이 diff 모드가 된다. 만일 diff모드를 해제하고 싶다면 diffoff( 7.0이상이던가.. 그렇다)를 준다.
:diffoff

reference link
   - :buffers 명령시에 나타난 불친절한 메시지를 친절히 설명해 놓은 사이트
   - vimdiff의 더 많은 활용 from kldp

멀티플랫폼/개발환경 Development, vim

vim tips : 현재 편집중인 파일이름관련

2008/10/30 11:21
얼마전 회사동료분께서 notepad++ 의 'Current dir path to Clipboard' 기능이 파일 편집에 있어서 매우 유용하다라 요지의 말을 했었었다(-_- 한 1년전쯤?) 그리고 친구녀석이 vim에서 같은 기능을 찾았었던것 같다. 요새 Portable Apps 로 컴퓨터 사용환경을 바꾸면서 vim을 꾸미다가 생각이나서 관련자료들을 찾아보았다.

우선 vim에서 현재 편집중인 파일 - 버퍼 - 는 expand("%")라는 표현식을 통해서 문자열로 얻을수 있다. 예를들면, vim으로 문서를 열고
:echo expand("%")
라는 명령을 치면 커맨드라인에 현재 편집중인 버퍼의 이름이 출력된다.

둘째로, vim에는 'yank'등을 위한 register라는 특수한 변수들이 있다. 이러한 변수들은 @를 사용하여 vim script등에 사용할수 있다. 예를들면 제일만만한 이름없는 레지스터 "에 "hi"라는 값을 집어넣어서 p 단축키를 통해 "hi"를 붙여넣으려면
:let @" = "hi"
라고 커맨드 라인에서 입력하고 편집모드에서 p를 누르면 원하는대로 hi가 붙여넣어질 것이다. (좀더 자세한 사항은 :help let-@) 특별히, win32계열의 gvim에서 @* 는 윈도우 전역 클립보드를 의미한다.

마지막으로 substitute라는 vim 내장함수가 있는데, 이것은 정규표현식을 이용하여 vim script의 문자변수를 치환해준다. 예를들면 현재 편집중인 버퍼이름으로부터 디렉토리 패쓰만을 뽑아오려면
substitute( expand("%"), '\(.*\\\)\(\).*', '\1', 'g' )
와 같이 사용하면 된다. (이 정규표현식에 대한 좋은 설명을 http://www.kldp.org/node/91397 에서 볼수 있다.)

이 세가지 팁들을 합쳐서
:let @*= substitute( expand("%"), '\(.*\\\)\(\).*', '\1', 'g' )
를 입력해주면 현재 편집중인 버퍼의 디렉토리 패쓰가 윈도우 클립보드에 저장되며, ctrl+v 등을 이용하여 붙여넣기 할수 있다. 만일 자주사용된다면 키맵을 하거나 메뉴를 편집하여 추가하면 될것이다.

멀티플랫폼/개발환경 Development, vim

vim 삽질

2008/07/26 19:12
NetBeans용 jVi의 감동으로 인해 이클립스내에서 vi키를 쓸수 있는 플러그인들을 sf에서 찾아보았다.

viPlugin은 0.2버전이후에 상용으로 돌아섰는데, 구버전은 쓸만하지 않다.
eclipseviplugin은 오픈소스중에서 그나마 쓸만한 녀석인데, 'v', 'shift+v'가 안된다. 으악.
vimeclipse는... 문제는 이녀석이다.

뭔가 있어보이는 이녀석은 이클립스안에 gvim을 임베이딩 해준다. 그리고 그게 전부다. 이렇게 하면 OutLine이나 뭐나 그런거 안된다. 이클립스 자동 채워주기 요런거 안된다. 그냥 임베이딩만 해준다. 이거 깔라고 잘쓰고 있던 vim 밀고 최신의 cream을 깔았는데 허무했다.

삽질의 하이라이트는 bufexplorer였다.
최신의 cream을 깔면서 플러그인들도 업그레이드 했는데 요 bufexplorer의 '\bs', '\bv'기능이 안되는거다. 물론 일반적으로 \be를 썼지만, 안되니까 신경질이났다.

가장 쉬워보이는, cream에서 다시 예전의 gvim7.1로 다운그래이를 해봐도 안되고 해서 bufexplorer 최신 버전이 아닌가.. 싶어서 스크립트 홈페이지에 가보니까

bufexplorer.zip 7.1.2 2007-11-07 6.0 jeff lanzarotta This is a MAJOR update.
* Added handling of tabs. (Dave Larson)
* Removed \bs and \bv commands because these are easier for the user to create horizontal and vertical windows. (Dave Larson)
* Fixed jumplist issue spotted by JiangJun.
* Went back to using just a plugin file, instead of both an autoload and plugin file. The splitting of the file caused issues with other plugins. So if you have a prior version of bufexplorer that has an autoload file, please remove autoload\bufexplorer and plugin\bufexplorer before installing this new version.
* Fixed E493 error spotted by Thomas Arendsen Hein.
* Minor cosmetic changes.
* Minor help file changes.

음? 이 뭥미? 정말 말그대로 완전 삽질했다.

그나마 삽질하면서 몇가지 건진게 있는데, 일단 글꼴문제.
http://gooom.kr/16
윈도우에 내가 원하는 글꼴셋을 묶는 기능이 없는지 궁금했는데 있더라. 아이좋아.

그리고 인코딩 문제.
http://kldp.org/node/32987
euc-kr 파일과 utf-8 파일을 구분하여 읽기중에 이렇게 간단한 방법이 있었다니!

이 두가지 해결한거에 3시간 삽질을 위로해야겠다

멀티플랫폼/개발환경 Eclipse, NetBeans, vim

vim fileformat 과 sln

2007/04/30 13:50
간혹 CVS를 통해 얻은 오픈소스의 sln 파일이 unrecognized version 으로 나올경우가 있다. 이건 십중팔구 sln text의 fileformat 문제다.

vim에서는 dos 와 unix 그리고 mac 의 text 파일포맷 변경을 쉽게 할수 있는 명령이 존재한다. fullname으로는 fileformat 이고 줄여서 ff 이다.

unix fileformat 을 dos로 바꾸는것은 간단하다.
:set fileformat=dos

:help fileformat 을 해보면 그밖에 자세한 사용법을 알 수 있다.

윈도우/개발환경 vim, 비주얼스튜디오

vim 윈도 위치설정 / acroread 설정 / 사운드 mute toggle

2006/07/29 10:14
1. vim 윈도위치 설정
devilspie 로 위치설정이 안된다. 대신 vim 옵션중에 winpos 라는 옵션이 있다.
기존 vimrc 설정
winpos 80 40
식으로 추가해준다.
ex. sudo vi /etc/vim/gvimrc
set guifont=DejaVu\ Sans\ Mono\ 11
set lines=32 columns=120
winpos 80 40
colors darkblue
set nu

2. acroread 설정
alien으로 어도비리더 rpm을 deb으로 바꾸어 깔아준후, 비어있는 /usr/bin/acroread에
#!/bin/sh
GTK_IM_MODULE=xim
exec /usr/local/Adobe/Acrobat7.0/bin/acroread "$1"

를 작성해준다.

3. 사운드 mute toggle
amixer sset PCM toggle

리눅스/실행환경 linux, vim

vim 버퍼 리스트

2006/06/27 21:02
vim 에서 파일리스트를 보고싶다면 :30vs ./
파일리스트에서 옆의 창으로 파일열기 shift+o
나누어진 버퍼창끼리 이동 ctrl+w+w
버퍼 리스트 보기 :ls
5번째 버퍼열기 :b5

멀티플랫폼/개발환경 vim

vim 설정

2006/06/27 13:46
/etc/vim/vimrc 파일(vim 과 gvim 동시에 적용)
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
set encoding=utf-8
set fileencodings=utf-8,cp949
endif

set autoindent
" back sapce 가능
" set bs=2
" set ts=8
" set sts=4
set ts=4
set sw=4
" 탭을 스페이스로
" set et
set nobackup
" 창을 나누어 열때 똑같이 만드는 옵션 제거
set noea
let $HOME="C:\\workspace"
au VimEnter * :Project


/etc/vim/gvimrc 파일
set guifont=DejaVu\ Sans\ Mono\ 11
" 윈도우의 크리의 위치를 지정할 수 있다.
set lines=32 columns=120
winpos 80 40
colors darkblue
set nu


tab 에 관련된 사용법 : http://kldp.org/node/65139

멀티플랫폼/개발환경 vim