SVN 에서 checkout 받은 repository의 주소가 변경 되었을 때, 다음과 같이 주소를 변경한다.



svn switch --relocate CUR_URL NEW_URL



Notice : 본 일련의 vim tips 시리즈를 보려면 category 에서 vim-tips 를 눌러 보면 된다.

1. TAGS 사용하기

http://orchistro.tistory.com/entry/vim-tips

2. Playing with make

http://orchistro.tistory.com/entry/vim-tips-2-make

3. Playing with grep

3-1. cscope 와 grep

앞선 section 들에서는 ctags 를 이용해서 소스 파일을 분석하고 따라 가는 방법과, make 를 이용해서 작업 능률을 한층 높이는 방법에 대해서 기록하였다.

그런데, 아직 뭔가 아쉬운 것이 있다. ctags 를 vim 과 함께 쓰면, 함수나 변수의 정의되어 있는 곳으로는 쉽사리 뛰어 갈 수 있는데, 그 역이 되는 일, 즉, 특정 함수를 호출하거나 특정 변수 (전역변수) 를 사용하는 곳을 찾는 방법은 없어 보인다.

여태껏 해 왔던 대로, shell 로 나가서 grep 을 한 다음 그 결과를 눈섭을 찡그리면서 읽고, 다시 vim 에서 해당 파일을 열어서 확인하는 과정을 거쳐야만 할까?

물론, 함수를 호출하는 부분들을 쉽사리 찾아가는 방법이 존재한다. 바로 cscope 를 이용하는 것인데, 내가 사용해 본 바로는, cscope 는 소스의 양이 많아지면 db 생성하는 데만도 수십초씩 걸렸다. 게다가, 인터페이스도 그다지 마음에 들지 않았다. 만약 수십명이 공동으로 작업해서 빠르게 변하는 소스 트리에서 작업한다면, 매번 소스 repository 에서 업데이트를 받을 때 마다 cscope DB 를 새로 빌드해 주어야 하는 귀찮음(!)을 감수해야만 할 것이다. 게다가 한번 DB 를 갱신하는데에 걸리는 시간이란!

그래서 나는 그냥 이전에 하는 대로 grep 을 이용하는 것을 선호하는 편이다.

여담인데, grep 이 왜 grep 인지 혹시 알고 있는가?

'g/re/p'

라는 ed 명령어가 그 이름의 기원이다. 믿거나 말거나... (vim 의 help 페이지에서 본 내용이다.)

혹시라도 이거, 정말 그런지 직접 해 보실 분은, 해 보시도록... grep 의 출력과 매우 흡사한 출력이 나온다.

$ ed foo.c
3456
g/foo/p
.
.
.
q
$

3-2. vimgrep vs. gnu-grep

방금 grep 을 언급했으니 당연히 앞 절의 make 처럼 grep 도 vim 에서 편리하게 쓰는 방법이 존재할 것이라는 눈치를 다들 챘을 것이다.

vim 에서 쓸 수 있는 grep 의 종류는 크게 두 가지이다. 

먼저, vim 7 부터 추가된 vim 의 내장 grep 과, 외부의 grep 프로그램이 그것인데, 먼저, 내장 grep 은 좀 느리고, 무엇보다 내가 써 보지 않았기 때문에 별로 권하고 싶지 않다. 그러면, external grep 을 쓰라는 이야기인데, 좋은 grep 프로그램으로 GNU grep 쓰기를 권한다 (아니, gnu grep 을 써야 앞으로 설명할 기능들을 사용할 수 있다.) 내가 알기로 현재 최신 버젼은 2.5.3 인데, -i 옵션에 버그가 (가끔 무한루프 -_-) 있는 것 처럼 보이긴 하지만, 가장 강력한 기능을 지원 (특히 --exclude-dir option) 하므로 그 버젼을 쓰기 바란다 (2.5.1 을 써도 기능 사용에 문제는 없다). 자신의 시스템에 grep 이 없다면, 간단하다. ftp://ftp.gnu.org 에서 소스를 받아서 컴파일해서 설치하면 된다. 컴파일이 귀찮은 분들은 아래 자료를 참조하시라 :

Solaris : http://www.sunfreeware.com
HP-UX : http://hpux.connect.org.uk
AIX : 알아서 설치하세요. -_-;;;
ubuntu : 8.04 부터였던가... 아마 기본으로 깔린 grep 이 GNU grep 2.5.3 이었던 것 같다.
OSX (Leopard) : 2.5.1 이 깔려 있긴 한데, 그냥 위의 ftp 에서 받은 다음에 ./configure;make;make install 하면 문제 없이 잘 깔린다.
windows : cygwin 을 설치하면 grep 도 깔리더라....;;; 써 본 지가 하도 오래 되어서.. ( '-')

3-2. 설치

이제, grep 프로그램이 준비되었으므로 vim 과 grep 의 연결 작업을 해 줄 차례이다. 그러자면, vim 의 grep plugin 을 설치해야 한다. 뭐가 이렇게 복잡하냐고? grep 처럼 강력한 프로그램을 vim 에 통합(?) 시키는데, 이정도의 수고는 해 주어야 하지 않겠는가...;

사실, 별도의 vim plugin 설치 과정은 필요가 없기도 하다. 그렇지만, plugin 설치하는 방법도 알아 보고, 또, 무엇보다, grep plugin 을 쓰는 게 vim 의 grepprg 변수를 세팅해서 쓰는 것보다 편하니 plugin 을 설치하는 방법을 설명하겠다. 물론, 별도의 plugin 없이 사용하는 방법도 이 글 말미에 적어 놓도록 하겠다. 

우선, 아래의 파일을 다운로드 해서 여러분의 홈 디렉토리의 .vim/plugin/grep.vim 이라는 이름의 파일로 저장하도록 하자. 디렉토리가 존재하지 않는다면 만들자 : (심심하면 그리 어렵지 않으니 스크립트를 한번쯤 읽어 보는 것도 좋겠다. 내가 수정한 부분은s:RunGrepRecursive() 함수이다.)


이 플러그인은, 소스에도 나와 있지만, Yegappan Lakshmanan 씨의 스크립트를 약간 수정한 것이다.http://www.vim.org/scripts/script.php?script_id=311 에서 다운로드 받을 수 있다. Yegappan 씨의 스크립트는 gnu 버젼의 find 까지 요구하기 때문에 gnu-find-util 까지 설치해야 하는 부담이 따른다. 물론 여러분이 사용하는 운영체제가 리눅스라면 당연히 gnu-find 가 설치되어 있겠지만, 그 외의 운영체제에서는 find-util 을 또 깔아 주어야 하는 불편함이 있다. 

그래서 위에 리스팅 된 스크립트는 내가 find 에 의존하지 않도록 스크립트를 약간 손본 것이다. 

만약 여러분이 리눅스에서만 작업을 하신다면, 혹은 GNU find-util 이 설치되어 있는 환경에서만 작업을 하신다면 Yegappan 씨의 스크립트를 그대로 사용해도 좋겠다. Yegappan 씨의 스크립트를 사용하면서 유용한 옵션 중의 하나만 소개하도록 하겠다. 자세한 내용은 스크립트를 읽어 보거나 해당 홈페이지를 방문해서 알아 보도록 하자. :

let g:Grep_Skip_Dirs='.svn'

그리고 아래의 내용을 ${HOME}/.vimrc 에 넣어 두자.

"내가 설치한 gnu grep 이 있는 경로. 일반적으로 /usr/local/bin/ 에 설치되므로 이와 같이 해 두었다.
let Grep_Path = '/usr/local/bin/grep' 
let Grep_OpenQuickfixWindow = 1
let Grep_Default_Options = '-rn'

이왕지사 .vimrc 를 손대는 것, 아예, 키보드 매핑까지 해 두자. 아래의 라인도 ${HOME}/.vimrc 에 추가하자 :

nnoremap <silent> <F9> :Rgrep<CR>

플러그인을 어떻게 설치하는지 설명하는 것을 깜빡 잊어버렸으나, 앞에서 이미 넌지시 설명해 버렸다. 간단하다. pluginname.vim파일을 ${HOME}/.vim/plugin/ 디렉토리에 복사해 넣어 주면 된다. 그럼 다음번 vim 을 시작할 때, vim 은 플러그인을 읽어들이게 될 것이다. 


3-3. 활용

이제 활용을 위한 모든 준비는 끝났다. vim 을 열고 위에서 키맵을 해 둔 것처럼 <F9> 키를 눌러 보자.
아래와 같이 어떤 패턴을 찾을 것이냐는 질문이 화면 아래쪽에 나올 것이다 :




쉽다. 여기에 원하는 패턴을 입력해 주고 엔터키를 치면 된다. 어디 한번 해 보자. (( 너무 친절하게 설명해 주는 것 같다 -_-;;;; 

그리고, 아래 그림에서 보듯이, 원하는 단어 위에서 <F9> 키를 누르면 일일이 찾고자 하는 패턴을 입력할 필요 없이 커서가 위치해 있던 단어가 "Search for pattern: " 에 입력되어 나온다 :




화면에서 볼 수 있듯이 커서가 있던 자리의 단어가 <F9> 를 눌렀을 때 자동으로 표시된다.

찾고자 하는 패턴을 입력하고 엔터키를 치면 검색을 시작할 디렉토리를 묻는데, current working directory 가 기본으로 세팅되어서 나온다. tab 키로 자동완성이 된다.

디렉토리를 입력한 후에는 

Search in files matching pattern: *

이라고 나오는데, 이것은, 검색을 실시할 파일명의 패턴을 입력하라는 것이다. 만약 여러분이 *.c 파일에서만 검색을 하고자 한다면 .c 를 입력해서 아래처럼 보이게 만들어 주면 된다 :

Search in files matching pattern: *.c

그리고 엔터키를 입력하면, grep option 을 입력하라는 메뉴가 뜬다.

Grep options: -rn

만약 위쪽에서 내가 추천한 것 처럼 자신의 .vimrc 파일에 아래의 라인을 입력해 둔 분이라면 -rn 이 기본으로 나타나게 될 것이고, 그렇지 않으면 그냥 공란으로 나올 것이다. 이 곳에 grep 에 줄 option 을 적어 주면 된다.

let Grep_Default_Options = '-rn'

주의할 것은, -n 옵션이 빠져서는 안된다는 것이다. 
왜냐하면, vim 이 grep 의 -n 옵션으로 출력되는, 파일에서 패턴이 발견된 라인의 정보를 보고서 해당 파일을 자동으로 열어 주고, 그 라인으로 점프해 가기 때문에 -n 옵션을 주어야만 grep+vim 을 편리하게 사용할 수 있기 때문이다.

여기서 잠깐, 유용한 grep option 두가지를 알아보고 넘어가자:

-i : 대/소문자 구분을 하지 않는다.

-w : 정규표현식 < > 로 패턴을 둘러싼 것과 같은 효과가 난다. 즉, 예를 들어서 main 을 -w 옵션을 주고서 grep 했다면 main 만 grep 에 걸리고, main2, main_function 등은 걸리지 않는다.

필요에 따라 "Grep options: " 라고 묻는 라인의 뒤에 옵션 추가만 해 주면 된다 :





필요에 따라서 옵션을 추가했으면 엔터키를 누르자.

뭔가를 한참 뒤진(?) 후에 아래처럼 quick fix 윈도우가 화면에 나타나게 된다 :




화면을 자세히 보면, 패턴 정보가 나오고, 그 아랫줄에 검색에 사용된 명령어가 나온다.

검색되어 나온 결과 사이를 왔다갔다 하는 방법은 앞전의 Playing with make 게시물에 잘 나와 있으니 그 게시물을 참조하기 바란다.


3-4. GNU grep 사용 팁 약간

언제나 그렇듯, 가장 좋은 사용 설명서는 man page 이다. 수시로 man command 를 해서 심심할 때 마다, 잠이 오지 않을 때 마다 읽어 보도록 하자.

일단, quick start 로 몇가지 것들만 정리해 주겠다.

3-4-1. 환경변수 GREP_OPTIONS

그렇다. gnu grep 은 환경변수 GREP_OPTIONS 에 세팅되어 있는 값을 grep 을 실행할 때마다 옵션에 자동으로 붙여 주는 일을 해 준다. 

나는 주로 아래와 같은 값으로 세팅해 두고 생활하고 있다 :

shawn.castepo:~/Sources/httpd-2.2.4/srclib/apr/strings$ echo ${GREP_OPTIONS} 
--exclude-dir=.svn -I --color

음.. grep tip 을 이야기하겠다고 section 까지 만들었건만, 더 이상 할 이야기가 없다. -ㅅ-;; 
r, n, w, i 는 이미 앞에서 설명해 버렸고...

아무튼, grep plugin 과 gnu grep 을 이용해서 보다 편안한 개발자의 일상을 누리시길 바란다.

good luck!


4. quickfix window

5. navigating through source file(s)

6. help


출 처 : http://orchistro.tistory.com/106


$ git config [...] : 환경설정

───────────────────────────────────────────────

git help [...] : 명령어 도움말( ※ 명령어 사용전에 이걸로 사용법 확인하자 )

   ex > $git help config : config 도움말 

───────────────────────────────────────────────

$ git init : 기존 디렉토리를 Git 저장소로 만들기

───────────────────────────────────────────────

$ git clone [url] : 다른 프로젝트 또는 git 저장소 복사

   ex> $ git clone git://github.com/schacon/grit.git​

───────────────────────────────────────────────

$ git status : 현재 저장소의 파일 및 상태 표시​

───────────────────────────────────────────────

​$ git add [directory or file] : 현재 저장소에 파일 추가

───────────────────────────────────────────────

​$ cat .gitignore : 파일 무시하기

───────────────────────────────────────────────

​​$ git diff : 수정했지만 아직 staged상태가 아닌 파일 비교 (Working Directory 와 Staging Area 파일 비교 )

   ex > $​git diff --cached :  저장소 와 statging Area 비교 ( --staged도 같음 ) 

───────────────────────────────────────────────

​$ git commit : 로컬 저장소에 저장한다.

   ex > $ git commit -a -m '코멘트' : add + 코멘트 한번에 commit 한다.

   ex > $ git commit --amend : 커밋 수정하기​ ( 파일을 빼먹거나 추가 수정이 있을 때 )

───────────────────────────────────────────────

$ git rm ​[file] : 파일 삭제 (삭제하면 staged상태가 된다. 여기서 commit까지해야 지워짐 )

───────────────────────────────────────────────

$ git mv [BeforeFileName] [AfterFileName]: 파일 이름 변경​

───────────────────────────────────────────────

​$ git log [...] : 커밋 히스토리 조회

───────────────────────────────────────────────

$ ​git reset HEAD [file] : 해당파일을 unstage 상태로 변경

───────────────────────────────────────────────

​$ git checkout -- [file] : 해당 파일을 수정전( 최근 commit된 버전 )으로  되돌리기

​───────────────────────────────────────────────

​$ git remote : 리모트 저장소 확인하기

  ex > $ git remote -v : 저장소의 단축이름과 url 보기​

  ex > $ git ​remote add [단축이름] [url] : 리모트 저장소 추가하기

  ex > $ git remote rename [Before] [After]​ : 리모트 저장소 이름 변경

  ex > $ git remote rm [단축이름]​ : 리모트 저장소 삭제

  ex > $ git remote show [단축이름] : 저장소 상태 보기

───────────────────────────────────────────────

$ git​ fetch [단축이름 or url] : 리모트 저장소에서 데이터 가져오기 (자동 머지X)

$ git​ pull [단축이름 or url] : 리모트 저장소에서 데이터 가져오기 (자동 머지O)​

───────────────────────────────────────────────

$ git push [단축 이름] [브랜치 이름]​

   ex > git push origin master​ : master 브랜치를 origin 서버에 push

───────────────────────────────────────────────

$ git last : 최근 커밋 내용 확인​

───────────────────────────────────────────────

$ git checkout [...] : 위에 파일을 수정전으로 돌리는 일외에도 브랜치 이동 관련 명령어로 쓰임

   ex > $ git checkout -b [브랜치 이름]​ : 브랜치 생성과 동시에 Checkout 

───────────────────────────────────────────────

$ git ​merge [합칠 브랜치 이름] : 변경된 내용 현재 브랜치에 적용하기

  ex > $ git checkout master

         ​$ git merge hotfix  : master브랜치에 hotfix 내용을 적용한다.

───────────────────────────────────────────────

$ git branch [...]​ : 브랜치 관련 작업

───────────────────────────────────────────────


출 처 : http://blog.naver.com/kjyong86/220004773927


:windo se scrollbind




VHDL with Vim

If you intend to code VHDL with Vim, it is a good idea to take some time and set up Vim for VHDL. You can do amazing stuff if you invest a little time (and some features don't even need to be set up - take a look at :help ins-completion for instance).

During a semester project at ETH Zurich, I created some VHDL related Vim settings. They make Vim quite efficient - during my project I was able to do most of the work from within Vim, even running test-benches and doing simulations. I hope they may be useful to others as well and will therefore show you how to set them up.

ctags

First, we need ctags. Since ctags does not support VHDL, I created some simple regular expressions. To use them, copy this ctags-file to ~/.ctags. You also need to set the variable g:tlistvhdlsettings correctly (see my vimrc).

If you don't know what ctags is, look at the ctags homepage.

Taglist plugin

Now that we have ctags working, we can also use the taglist plugin for Vim, which allows to navigate through the code in a nice way. You can find it here.

Code highlighting and indenting

Scripts for highlighting and indenting come with Vim. If you happen to work at the ETH Zurich, you'll probably want to use DZ signal naming conventions and appropriate highlighting. For this, copy the file vhdl.vim to ~/.vim/syntax/. It only seems to work with GVim, which is what I usually used.

Automatic entity declaration and port mapping

For this, I found some scripts on the net and adjusted them to my needs. They are far from perfect, but useful nonetheless. You can find them in the scriptsdirectory.

Automatic code aligning

For code aligning, I wrote some scripts on my own. However, I later discovered ageneric Vim align plugin, which does a much better job. You may want to add appropriate key mappings for visual mode (see :help vmap).

Commenting

I use the Enhanced Commentify Plugin for easy commenting of blocks.

vimrc (lots of fun stuff)

The most important thing is of course the .vimrc file itself. It provides useful stuff like

  • automatic template loading
  • Hit F5 to compile and Vim automatically jumps to the relevant line if there is an error (requires a Makefile and you may need to adjust the errorformat)
  • jump between errors with F9 and F10 (also goes nicely with grep, btw.)
  • shortcuts (e.g. write a process name and hit CTRL-E p to create the process body; hit CTRL-j to jump to the mark (requires the jump-function from thevim-latex plugin))
  • abbreviations (e.g. write slv for std_logic_vector)
  • shortcuts for component declaration and instantiation
  • omni-completion is set to syntax-complete
  • automatically update sensitivity lists (this one is a bit dangerous, as it uses theEmacs VHDL-mode and runs Emacs in batch mode - see the comment in the vimrc) file

If you want to know more, just take a look at the the .vimrc file. This one only contains VHDL related settings.

Screenshot

Here's a nice screenshot with some of the features:



If you have questions or comments, just drop me a note.


출처 : http://0x7.ch/vim/vhdl/


1) global source navigation 

kscope, eclipse 등을 써봤지만, 역시 전 왠지 Gui 인터페이스는 불편함이 많더군요. command prompt 가 익숙해서인지. 
Vim 에서 전 ctags, cscope(또는 gtags) 혼용해서 씁니다. 
(사실은 cscope 하나만 써도 됩니다. ctags 기능은 모두 cscope 가 지원하기 때문에, 하지만 ctags 만 사용할 수도 있으므로) 
cscope 와 ctags 는 Vim 7.0 에서 기본적으로 script 지원 합니다. 

/home/danniill/src 폴더에 작업하는 소스가 위치해 있다고 가정하면, 
$> cd /home/danniill/src 
$> ctags -R . <= tags (ctags database 파일) 생성 
$> cscope -R -b <= cscope.out (cscope database 파일) 생성 

vim 을 구동시킬때 위에서 만든 tags/cscope.out 파일이 있는 디렉토리에서 시작하시는게 좋습니다. 
이유는 vim 이 시작한 디렉토리에서 부터 tags 파일과 cscope.out 파일을 찾기 때문이죠. 
위 파일들이 있는 디렉토리에서 vim . 하시면, netrw script 로 시작합니다. 

netrw 는 NASA 에서 근무중인 Charles Campbell 이 만든 network read/write 가능한 script 입니다. 
local 에서 directory browsing 등을 하는데도, 이만한 script 가 없다고 봅니다. 
netrw 모드로 디렉토리를 이동해서, 내가 edit 할려는 파일을 찾고, enter 를 치면 해당 파일을 엽니다. 

vim 안에서 default 로 set tags 하시면 tags=./tags,./TAGS,tags,TAGS 이렇게 나올겁니다. 
즉, 현재 디렉토리 아래에 tags 파일을 찾고, 없으면 TAGS 를 찾고, 없으면, 상위 디렉토리로 거슬러 올라가면서, tags 혹은 TAGS 파일을 찾습니다. 
ctags 는 C symbol 의 definition 은 찾아주지만, reference 혹은 callled funtion 등을 찾아 주지는 않습니다. 
해당 변수가 쓰여진 모든 경우를 찾고 싶을땐, cscope 나 gtags 를 쓰셔야 합니다. 
cscope 는 default 로 Vim 이 지원하기 때문에, 간단히 :cs 하시면 지원되는 명령어 들을 보실 수 있읍니다. 
하지만, 그냥 쓸려면 :cs find g <찾을려는 c symbol> 이런 형식으로 매번 치기가 여간 번거로운게 아닙니다. 
cscope help 파일을 vim 내에서 찾아보면 나오는 추천방식이 있읍니다. 
home direcotry 아래에 .vimrc 파일 같은걸 생성하시고, 거기에 아래와 같은 map 파일을 써 놓으면 편합니다. 

nmap <F5> :cs find g <C-R>=expand("<cword>") <CR><CR>
nmap <F6> :cs find c <C-R>=expand("<cword>") <CR><CR>
nmap <F7> :cs find s <C-R>=expand("<cword>") <CR><CR>

첫번째 문장만 보면, F5 키를 뒤의 문자열로 normal mode mapping 해주라는 거구요. 
(nmap 대신에 map 쓰시면, 모든 모드에서 지원) 
뒤의 :cs find g 는 cscope 를 이용해서 해당 c symbol의 정의(definition)을 찾으라는 겁니다. 
<C-R>=expand("<cword>")<CR><CR> 부분은 현재 cursor 가 위치한 문자열로 입력을 대체한다는 겁니다. 

두번째 문장은 첫번째 문장과 cscope find 명령만 다릅니다. 
이건 정의가 아닌 함수의 참조(reference)를 찾아주죠. 현재 커서가 위치한 함수를 calling 하는 함수를 찾아줍니다. 

세번째 문장은 현재 커서가 위치한 c symbol 의 모든 reference 를 보여줍니다. 
이건 함수가 아닌 변수도 해당됩니다. 

실제 사용례를 보면, 
커서가 위치한 변수(함수)의 정의를 보고 싶으면, F5 키를 
커서가 위치한 함수가 호출된 모든 경우를 보고 싶으면, F6 키를 
커서가 위치한 변수(함수)의 모든 사용례를 보고 싶으면, F7 키를 누르면 됩니다. 
꽤 쓸만하죠? 

위에서 F5 키는 ctags 명령인 CTRL-] 와 동일합니다. 



2) local source navigation / editing 

현재 open 된 source 파일 내에서 특정 변수의 정의로 가고 싶을 땐, gdnnnn 쳐보세요. 
문서의 처음으로 갈땐 gg, 마지막은 G (다들 아시겠지만) 

auto completion 기능이 지원됩니다. 
어떤 함수나 변수, 또는 문장의 처음 몇글자만 쳐 넣고 , Ctrl-N(또는 Ctrl-P), Ctrl-X Ctrl-L 를 눌러보세요. 
더 자세한 사용법은 ins-completion 부분을 vim 내에서 help 해보세요. 
:help ins-completion 

visual mode 기능이 지원됩니다. 
전통적으로는 3줄 copy 할려면, 3y 한후에, 커서 이동, p 눌렀어야 됬죠. 
전 요새는 V (line 단위 visual 모드가 됩니다) n 또는 p 눌러서 block 선택, 커서 이동, p 누릅니다. 
내가 copy 할려는 부분이 visual 하게 표시되니깐.. 좀 더 편하더군요.


3) 기타 유용한 vim 명령및 스크립트 

:ls <= 현재 open 된 파일들의 list 를 보여줍니다. 
이동은 :buffer 0 또는 :buffer 1 이런식으로 

:marks <= vim 은 0,1,2,3,4,5,6,7,8,9,`,[,]," 에 대해서 marking 을 해 놓습니다. 
각 marking 은 한 화일내의 특정 위치 일 수도, 서로다른 화일내의 특정 위치일 수도 있읍니다. 
이동은 `(숫자1 좌측에 있는) 누르고 mark 표시 (0,1,2,3,....) `` 두번 누르면 직전 편집위치, `0 누르면그전 편집위치, `1 누르면 그전.. 이런식으로 

taglist 스크립트 추천합니다. 
Yegappan Lakshmanan 이라는 친구가 만든 source browsing 하는 스크립트 입니다. 
설치후에 :TlistToggle 하면 화면 좌측에 symbol window 를 표시해 줍니다. 
nmap <F2> :TlistToggle <= F2 키 누르면 symbol window 토글 시켜줍니다. 


4) Vim quickfix 기능 

editing => compile => editing 을 반복하는게 프로그래머들의 일상이죠. 
이 순환 싸이클을 줄여보자는게 목적입니다. 

간단히 요점만 설명하면, 모든 컴파일러는 컴파일 과정중에 log message를 console에 출력해 줍니다. 
vim 은 내부 기능으로 이 출력된 log message를 분석해서 error 가 발생한 파일로 점프 할 수 있게 지원합니다. 

:set makeprg <= default make 프로그램을 보여줍니다. 전 makeprg=make 라고 나오는 군요. 
:set efm <= error file format 을 보여줍니다. 전 이게 너무 많더라구요. 각종 컴파일러 포맷을 지원할려고 해서 그런지. 

ubuntu 8.04 + gcc 4.2.3 버전쓰시는 분들은 아래 efm 으로 바꿔서 사용해 보시면 될듯 합니다. 
gcc 표준 에러파일만 인식하도록 바꾼건데, 제 PC 에서는 잘 동작하네요. 
set efm=%f:%l: %m,%Dmake[%*d]: Entering directory `%f',%Xmake[%*d]: Leaving directory `%f' 

=> 간단히 설명하자면, 
=> %f:%l: %m <== %f (파일이름) 뒤에 공백없이 : 기호가 붙고, %l(라인넘버)가 뒤따르며, 또 : 기호가 붙고 한칸 공백후에( ) error 라는 에러메세지가 나오는 포맷이다. 
=> %Dmake[%*d]: Entering directory `%f' <== make[1] Entering directory 를 이해시키위한 포맷 
=> %Xmake[%*d]: Leaving directory `%f' <== 디렉토리 stack 에서 빠져나가는 포맷 (위의 %D.... 포맷과 쌍으로 씌여져야 한다) 

사용방법은 vim 을 구동한 상태에서 
필요한 소스 수정 
:make <= make 실행 에러가 발생할 경우 첫번째 에러난 소스 파일로 vim 이 자동으로 jump 한다. 
:cl <= 전체 에러 리스트를 보고 싶을때 
:cn <= 현재 에러 위치 수정을 마치고, 다음 에러위치로 이동할때

출처 : http://flytospace.tistory.com/13


출처 : http://kldp.org/node/52160

 

svn diff a.c 
를 하면 vimdiff로 바로 보이게 하려면.

 

1. 적당한 디렉토리에 vimdiff.sh를 만들고 PATH를 걸어준다
$ more ~/bin/vimdiff.sh
#!/bin/sh
while test $# -gt 2; do shift; done
vimdiff $@


2. vimdiff.sh를 실행 가능으로 만든다.

$ chmod a+x ~/bin/vimdiff.sh

 

3. svn 설정 파일에 diff-cmd 값을 지정한다.

$ cat ~/.subversion/config | grep diff-cmd
diff-cmd = vimdiff.sh

폴딩을 걸어 놓은 상태에서 다음에 파일을 열 때도 기존에 해 놨던 폴딩을 보고 싶으면,
명령행에 :mkview을 입력해서 폴딩 상태를 저장한다.

다시 읽어오고 싶으면, :loadview을 사용해서 폴딩정보를 로드하도록 한다.

출처 : http://shellbt.tistory.com/298872

vim의ㅣ 폴딩 기능이 유용할 것 같긴 한데..
저장하고 다시 열면 접었던 것들이 다 날아가서
실제로 사용하기가 힘들었죠.
오래 헤멘 끝에 마침내 영구적으로 폴딩 기능을
사용할 수 있는 방법을 알아냈습니다.

먼저 foldmarker에 대해 아셔야 합니다.
이름 그대로 폴딩을 위한 마커입니다.
"{{{", "}}}"을 접고자 하는 라인 위 아래에 넣어줍니다.
그냥 넣으면 안되니 라인 주석으로 "//" 감싸줍니다.

-------------
//{{{ function foobar(str1, str2)

/**
* foobar
*
*/
function foobar(str1, str2)
{
}

//}}}
//{{{ function barfoo(str)
------------

이런 식으로 넣고 :set fdm=marker 하면 자동으로
{{{, }}}로 감싼 부분이 폴딩됩니다.
외국 소스를 보다보면 위와 같은 코딩 관습이 종종
발견되는데 역시 다 이유가 있는 거였더군요. :)


이번엔 보너스팁입니다.
.vimrc 에 fdm=marker를 추가하셔도 되고,
소스 파일에 vim에서만 인식되는 다음 주석을
처음이나 끝에 추가하시면 됩니다.

-----------
/*
* vim60: ts=4 sw=4 fdm=marker
*/
-----------

출처 : http://kltp.kldp.net/stories.php?story=02/11/16/6893604

현재 내가 사용 중인 vim plugin 목록

1. ctags
2. cscope
3. taglist
4. buf explorer
5. source explorer
6. NERD Tree


.vimrc 설정...

1. ctags
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
set tags=./tags

if version >= 500
func! Sts()
	let st = expand("<cword>")
	exe "sts ".st
endfunc
nmap ,st :call Sts()<cr>

func! Tj()
	let st = expand("<cword>")
	exe "tj ".st
endfunc
nmap ,tj :call Tj()<cr>
endif

2. cscope
1
2
3
4
5
6
7
8
9
10
11
12
13
14
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb

if filereadable("./cscope.out")
	cs add cscope.out
endif
set csverb

nmap ,cs :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap ,cg :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap ,cd :cs find d <C-R>=expand("<cword>")<CR><CR>
nmap ,cc :cs find c <C-R>=expand("<cword>")<CR><CR>

3. taglist / buf explorer
1
2
map <F3> :Tlist<cr><C-W><C-W>
map <F4> :BufExplorer<cr>

4. source explorer
1
2
3
4
5
6
7
8
9
10
11
nmap <F8> :SrcExplToggle<CR>
nmap <C-H> <C-W>h
nmap <C-J> <C-W>j
nmap <C-K> <C-W>k
nmap <C-L> <C-W>l

let g:SrcExpl_winHeight=8
let g:SrcExpl_refreshTime=100
let g:SrcExpl_jumpKey="<ENTER>"
let g:SrcExpl_gobackKey="<SPACE>"
let g:SrcExpl_isUpdateTags=0

5. NERD Tree
1
2
let NERDTreeWinPos = "left"
nmap <F9> :NERDTreeToggle

+ Recent posts