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



$ su -

# echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list

# echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list

# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886

# apt-get update

# apt-get install oracle-java7-installer






svn import 시  *.a , *.la, *.so, *.o 확장자는 import 되지 않는다.


위의 확장자는 svn default 제외 확장자에 속하므로 checkout 후 위의 파일을 찾지 못하여 에러가 발생할 수 있다.


http://subversion.apache.org/docs/api/1.6/svn__config_8h.html

위의 링크를 보면 아래와 같이 default ignore로 설정된 사항을 볼 수 있다.


#define SVN_CONFIG__DEFAULT_GLOBAL_IGNORES_LINE_1   "*.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo"
#define SVN_CONFIG__DEFAULT_GLOBAL_IGNORES_LINE_2   "*.rej *~ #*# .#* .*.swp .DS_Store"



제외된 파일을 다시 commit 하기 위해서 다음을 수행한다.


원본 소스에서 파일을 복사한다.


$ find . -name "*.a" -exec cp {} /checkout directory/{} \;


checkout 한 directory에서 add 시킨다.


$ find . -name "*.a" -exec svn add {} \;


모든 확장자를 동일한 작업을 한 후 commit 한다.


$ svn commit



보통 리눅스에서 빌드시 make 툴을 이용하여 빌드를 하게 되는데.. 빌드 타임을 알고 싶으면 다음과 같이 명령을 수행하면 된다.


$ time sh -c 'make'




# apt-get install libsdl1.2-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev




리눅스에서 cron을 설정하기 위해서는 /etc/crontab 파일을 수정해야 한다.





10번째줄 아래에 나와있는 부분이 실제 설정하는 부분이며, 의미는 다음과 같다.


분 / 시 / 일 / 월 / 요일 / 실행권한 / 명령


먼저, log를 변경할 수 있게 설정을 변경해야 한다.

subversion 프로젝트 디렉토리의 hooks 디렉토리에 pre-revprop-change 파일을 생성한다.
기존에 pre-revprop-change.tmpl 파일이 존재하며, 이 파일을 그대로 복사하면 된다.
또한, 이 파일에 실행 권한을 주어야 한다.

$ cp pre-revprop-change.tmpl pre-revprop-change
$ chmod 711 pre-revprop-change


위와 같이 설정한 후, 다음의 방법을 이용하여 commit log를 변경하면 된다.
1. svn propset svn:log --revprop -r <REVISION> "My corrected log message" <URL>
2. svn propset svn:log --revprop -r <REVISION> -F <file-with-corrected-log-message.txt> <URL>
3. svn propedit svn:log --revprop -r <REVISION>


gcc-3.4-base_3.4.6-6ubuntu2_i386.deb
cpp-3.4_3.4.6-6ubuntu2_i386.deb
gcc-3.4_3.4.6-6ubuntu2_i386.deb
libstdc++6-dev_3.4.6-6ubuntu2_i386.deb
g++-3.4_3.4.6-6ubuntu2_i386.deb

의 항목을

http://archive.ubuntu.com/ubuntu/pool/main/g/gcc-3.4/

에서 받아서 순서대로 설치합니다.
단, 아래의 두개는

sudo dpkg --force-depends -i ./libstdc++6-dev_3.4.6-6ubuntu2_i386.deb

명령을 사용하여 의존성 문제를 무시해야 합니다.



설치할때 주의할점은
libstdc++ 과 g++ 사이의 의존성 때문에 libstdc++ 설치시 그냥 dpkg -i 로 설치하면 안되고,
dpkg --force-depends -i 를 사용

설최된 3.x 는 목록을 검색후 심볼릭 링크를 변경해주면됩니다..

ls /usr/bin/gcc*
ls /usr/bin/c++*
ls /usr/bin/g++*

rm /usr/bin/gcc
ln -s /usr/bin/gcc-3.3 /usr/bin/gcc
rm /usr/bin/cpp
ln -s /usr/bin/cpp-3.3 /usr/bin/cpp
rm /usr/bin/g++
ln -s /usr/bin/g++-3.3 /usr/bin/g++

이렇게 하면 원래 있던 심볼릭을 지우고 새로 설치한 심볼릭으로 만들어줍니다

아 그리고 심볼릭 링크 관리  명령어는
update-alternatives
라고 하면 명령어가 사용 가능합니다.
Ubuntu에서 deb파일을 패키지로 설치하기 위해서는

sudo dpkg -i 파일명.deb  (deb파일이 많은 경우 *.deb해도 됨.)

의 명령을 실행하면 된다.

putty 에서 EUC-KR을 사용하려고 Translation 설정에 보면, EUC-KR를 뜻하는 cp949가 없다


그러므로 이 설정을 위해서는 레지스트리 편집이 필요하다.


1. [HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions] 에서 원하는 세션을 선택한다.


2. LineCodePage 값을 cp949로 변경한다.



디렉토리 명

설 명

/dev/fd0

플로피 디스크 드라이브

/dev/hda

첫 번째 슬롯 마스터 IDE 하드 디스크 드라이브

/dev/hdb

첫 번째 슬롯 슬레이브 IDE 하드 디스크 드라이브

/dev/hdc

두 번째 슬롯 마스터 IDE 하드 디스크 드라이브

/dev/hdd

두 번째 슬롯 슬레이브 IDE 하드 디스크 드라이브

/dev/sda

첫 번째 SCSI 하드 디스크 드라이브

/dev/sdb

두 번째 SCSI 하드 디스크 드라이브

/dev/st0

첫 번째 SCSI 테이프 드라이브

/dev/st1

두 번째 SCSI 테이프 드라이브

/dev/scd0

첫 번째 SCSI CD 롬 드라이브

/dev/scd1

두 번째 SCSI CD 롬 드라이브

/dev/cdrom

IDE CD 롬 드라이브

/dev/mouse

마우스

/dev/ttyS0

COM 1 시리얼 포트

/dev/ttyS1

COM 2 시리얼 포트

/dev/lp0

첫 번째 병렬 포트

/dev/lp1

두 번째 병렬 포트

/dev/console

시스템 콘솔 장치

/dev/null

아무것도 없는 장치 하수구라고 생각하시면 되겠습니다. 예로 어떤 출력을 해야 하는데, 그 출력을 그냥 버리고 싶다면 출력 방향을 이 장치로 설정하면 그냥 하수구로 버리듯이 모든 출력이 사라집니다.

이 장치는 프로그램에서 열기 명령을 사용하면 항상 OK가 됩니다. 그러므로 프로그램에서도 디버깅에 사용되며, 셀 명령 실행에서 보기 싫은 출력 문자열을 없앨 때에도 사용됩니다.

/dev/zero

/dev/null처럼 가상 파일이면서 이 장치에 쓰기를 하면 출력이 사라지지만 특정한 길이의 초기화 된 더미 파일을 임시 스왑 파일을 만들 때 사용한도고 합니다.

/dev/loop

블럭 장치와 연관되지 않는 파일 시스템을 마운트 하는데 사용하는 장치

+ Recent posts