VI 실전에서 사용했던 테크닉 정리 by SWSSM 17기 구도훈

예전 수원 멤버십에서 신입회원 세미나 당시에 도훈이가 했던 내용인데 유용하게 정리된것 같아 blog에 따로 정리해 둡니다. 허락은 받지 않았습니다. 😛

SWSSM 17기 구도훈 2007.11.2 실전에 사용했던 테크닉 정리

1. 시작

이번 세미나에서는 vi를 다루려고 합니다. 기초적인 부분은 생략하기로 하고 코딩 시 유용한 것에 대해서 언급하려 합니다.
실제로 vi를 돌려서 어떻게 사용하는지 알아 볼 텐데 , 쓸만한 것은 체크를 해서 자기 것으로 만들었으면 좋겠습니다.

2. 화면 분할/이동, 버퍼이동

vi 고수처럼 보이게 만드는 화면 분할입니다.
모니터를 한 개 혹은 두 개 이상 쓰더라도, 가끔씩은 화면을 분할 할 필요가 있는 것 같습니다.
여기서는 윈도우를 어떻게 분할하는지 설명합니다.

윈도우 수직분할(vs)
윈도우 수평분할(sp)

윈도우 간 이동 CTRL-w + ( i, j, k,l)
윈도우 끄기 CTRL- q

윈도우 height 조정 CTRL – w – (+,-)
윈도우 width 조정 CTRL – w – (<,>)
윈도우 사이즈 같게 CTRL – w – =

다른 윈도우 화면에 놔두면서, 현 윈도우 최대한 크게 CTRL – w – |

버퍼 보기(ls)

해당 버퍼로 이동 예):1b
따라 해보기) 40vs .

3. mark 사용하기

현재 파일의 커서 위치에 마크를 해놓고 언제든지 다시 돌아올 수 있다.

마크된 리스트 보기 :marks
마크하는 방법 m{a-zA-Z}
해당 마크로 이동 ‘{a-zA-Z}

단 a-z 와 A-Z에는 차이가 있다.
‘a – ‘z 소문자는 현재파일안에서, ‘A – ‘Z 대문자는 파일들간에
A-Z 에 프로젝트에서 자주 사용하는 소스 파일을 맵핑 해놓고 바로 찾아갈 수 있다.

vi에서 특정 파일에 저장하는지 A-Z 마크내용은 vi를 재실행해도 볼수 있다.
아래의 내용을 .vimrc에 추가하면 현재 에디팅 되는 파일위치로 path가 자동 이동된다.
if(has(“autocmd”)

” Change to the directory the file in your current buffer is in
autocmd BufEnter * :cd %:p:h

endif ” has(“autocmd”)

4. 레코딩

vi를 사용하다 보면 단순 반복 작업을 할 때가 있습니다. 이때 레코딩 명령을 이요하면 유용합니다.
레코딩 시작과 끝은 q로 시작합니다

1. 레지스터에 레코딩 하는 법
명령 모드 상태에서 q 로 시작
q누르고 레지스터에 저장 가능(vi 레지스터에는 0-9a-zA-Z)
명령 모드 상태에서 q 로 끝

2. 레지스터에 저장된것 불러오는 방법
@누르고 저장된 레지스터입력
@@ 방금전 불러온 레지스터에서 불러오기

5. ctags와 같이 vi 활용하기

ctags에 여래개의 .c .h의 함수/변수/정의/선언 내용을 기록해놓고 vi에서 활용함.

따라해보세요 )
1. tags 파일 생성(c와 h파일에 해당)
ctags -R *.[ch]
2. vi가 tag파일 읽어올수 있도록 ~/.vimrc에 세팅
set tags=./tags,tags
set tags+=/usr/src/linux/tags
set tags+=../tags
set tags+=../../tags
set tags+=../../../tags
3. 사용하기
tags 파일 참조하여 함수/변수/정의/선언 위치로 이동 g], ctrl+]
돌아오기 ctrl + t
태그 스택 보기 – tag
4. 기타
cscope도 vi와 연동해서 사용합니다만 ctags랑 약간 차이가 있으니 한번 돌려보세요.

6. make 사용하기

컴파일 – :make
컴파일 결과보기:cw
!! 결과 창에서 에러 라인 선택하면 해당소스의 해당 라인으로 이동함.

90. 나머지 유용한것들

folding zf, zo
다음 괄호({},(),[])찾기 %
함수 프로토 타입 혹은 define내용을 한 줄로 보기 [i
현 파일 내에서 함수/변수/정의/선언 위치로 이동 gd,gD
현재 커서 밑에 있는 파일 에디트 – gf
이전 버퍼로 이동 ctrl-6
자동완성 ctrl + p
glibc 레퍼런스 – 함수위에서 2K(system call), 3K(standard library)
현재 라인에서 글자찾기 f(F) – 예를 들어 3을 찾는 다면 3f
대소문자 전환 u,U
정렬하기 -선택하고 sor(sor!)
현재커서위치에 있는 값 증가시키기 CTRL – A
아스키 코드 보는 방법 – ga
쉘 명령 사용 – 예제 !pwd
잠깐 쉘로 빠져 나오기 ctrl – z, 복귀는 fg
복사 붙이기 할때 사용해보세요. set paste
검색 시 대소문자 구분 무시 – set ignorecase

정말 모를 때는 help

99. 끝

추가 팁

마우스 스크롤이나 선택 복사를 하고 싶다면
:set mouse=a
특정 줄부터 줄까지 단어를 바꾸고 싶다면
:#,#s:/old/new/g
커서가 위치한 곳의 단어 찾기
Shift + 8
터미널에서 줄이 길어서 안보이면
:set wrap
Tab대신 space 사용
:set expandtab
Tab문자 간격
:set ts=8
Shif width
:set sw=8
한번에 다중 윈도우에 각각의 파일 열면서 시작하기
sp로? vim -o a b c
또는 vs로? vim -O a b c

makefile 견본

makefile 견본

.SUFFIXES : .c .o

CC = gcc

INC =
LIBS =
CFLAGS = -g $(INC)

OBJS = tbl.o
SRCS = tbl.c

TARGET = table

all : $(TARGET)

$(TARGET) : $(OBJS)
    $(CC) -o $@ $(OBJS) $(LIBS)

dep :
    gccmakedep $(INC) $(SRCS)

clean :
    rm -rf $(OBJS) $(TARGET) core

new :
    $(MAKE) clean
    $(MAKE)

자주 쓰는데도 항상 까먹는  makefile!-_-/

PROGNAME = calctest
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c, %.o, $(SRCS))

CC = gcc
CFLAGS = -Wall
LDFLAGS =

$(PROGNAME): $(OBJS)
    $(CC) $(LDFLAGS) -o $PROGNAME $^

clean:
    rm -f $(PROGNAME) $(OBJS) depend

depend: $(SRCS)
    $(CC) $(CFLAGS) -MM $^ > $@

-include depend

참고 : http://www.viper.pe.kr/docs/make-ko/make-ko_8.html

스킨 변경 ㅎㅎ

정말 오랜만의 포스팅!

그냥 기분 전환 겸 블로그 스킨 변경!

깔끔하긴 하지만 관리자 메뉴에서 스킨 변경을 할 수가 없다는 점.

그리고, 미리보기 기능이 동작하지 않는 점 이 약간 아쉬운 스킨!

스킨 이름은 fading-line 입니다.^^

제목에 영문이 대문자로만 나오는 것을 고치고, 그 밑에 메뉴(?)에 글 바로 쓰는 것(entry)만 추가해서

살짝 바꿔서 사용중입니다. ㅎㅎ

깔끔하니 좋네요!

거위의 꿈 – 인순이

[#M_가사보기..|가사 숨기기..|

거위의 꿈

난 난 꿈이 있었죠
버려지고 찢겨 남루하여도

내 가슴 깊숙이
보물과 같이 간직했던~ 꿈

혹 때론 누군가가
뜻 모를 비웃음 내 등 뒤에 흘릴 때도

난 참아야 했죠
참을수 있었죠 그 날을 위해

늘 걱정하듯 말하죠 헛된 꿈은 독이라고
세상은 끝이 정해진 책처럼 이미 돌이킬 수 없는
현실이라고

그래요
난 난 꿈이 있어~요
그 꿈을 믿어~요
나를 지켜봐요

저 차갑게 서있는
운명이란 벽 앞에 당당히 마주칠수 있어~요

언젠가 난 그 벽을 넘고~서
저 하늘을 높~이 날을수 있어요

이 무거운 세상도 나를 묶을순 없죠
내 삶의 끝에서~ 나 웃을 그 날을
함께 해요

늘 걱정하듯 말하죠
헛된 꿈은 독이라고
세상은 끝이 정해진 책처럼
이미 돌이킬수 없는 현실이라고

그래요
난 난 꿈이 있어~요
그 꿈을 믿어~요
나를 지켜봐요

저 차갑게 서있는
운명이란 벽앞에 당당히 마주칠수 있어~요

언젠가 나
그 벽을 넘고~서 저 하늘을 높~이
날을 수 있어요

이 무거운 세상도 나를 묶을순 없죠
내 삶의 끝에서~
나 웃을 그날을 함께 해요
(난 난 꿈이 있어요)
(그 꿈을 믿어요)
(나를 지켜봐요)

_M#]
인순이의 거위의 꿈. 우연하게 듣게 되었는데 카니발의 원곡보다 더 가슴이 찡한 뭔가가 있다.

인순이의 인생때문일까..

CMonthCalCtrl의 버그

PRB: CMonthCalCtl::GetCurSel(CTime) Returns Wrong Value

Article ID : 235355
Last Review : November 21, 2006
Revision : 2.1
This article was previously published under Q235355

SYMPTOMS

When you use the CMonthCalCtrl::GetCurSel(CTime) to get the date selected
from the Month Calendar Common control, the date in the CTime class is incorrect.

Back to the top

CAUSE

MFC’s implementation of CMonthCalCtrl::GetCurSel() for the CTime class calls SendMessage(MCM_GETCURSEL, &sysTime) where sysTime is a SYSTEMTIME
structure. The MCM_GETCURSEL message does not fill in the hours,
minutes, and seconds part of the sysTime Structure with valid values.
However, the constructor for CTime class takes these values into consideration, so the date in CTime class is incorrect.

Back to the top

RESOLUTION


The workaround is to use the CMonthCalCtrl::GetCurSel(SYSTEMTIME*)
version of GetCurSel for this class to get the correct date. The code
will look like the following example:

   SYSTEMTIME sysTime;

m_MonthCal.GetCurSel(&sysTime);

sysTime.wHour = sysTime.wMinute = sysTime.wSecond = sysTime.wMilliseconds = 0;

CTime l_time(sysTime);


위와 같은 버그로 인해서 CMonthCalCtrl을 쓸 때는 위와 같은 형식으로 날짜/시간을 얻어와야 합니다.

MoniWiki의 메뉴 추가

사용자 삽입 이미지
모니 위키의 메뉴는 기본적으로 대문, 찾기, 목록, 바뀐글, 환경설정 입니다. 이 외에 다른 메뉴항목을 추가하고 싶을 때는 config.php의 $menu 항목을 수정하면 됩니다.

참고로 제 위키의 위 그림과 같은 메뉴를 위한 설정은

$menu=array(‘FrontPage’=>1,’FindPage’=>4,’TitleIndex’=>3,’RecentChanges’=>2,’UserPreferences’=>”,'[wiki:TodoList 할 일 목록]’=>”,'[http://blog.dasomoli.org 블로그]’=>”);

와 같습니다. => 다음에 붙는 저 건 뭔지 잘 모르겠네요;; 왜 메뉴에 숫자가?;;

+ 블로그에도 위쪽에 보시면 “WIKI”가 추가된 걸 보실 수 있습니다. 흐흐.. 😉

꿈 속의 내가 정신을 잃는 순간 현실의 내가 눈뜨게 된다면 당신은?

오늘 새벽에 저는 열람실에서 프로젝트를 하고 있었습니다.
이유모를 두통에 도저히 안되겠다 싶어서 집에 가서 두통약 두 알을 먹고 어차피 머리아픈 동안은 하지 못할테니 약기운이 돌아 조금 괜찮아질 때까지만 누워있자고 생각하고 두통에 시달리며 잠시 누웠습니다. 대개 그렇듯이 이렇게 누우면 잠들죠. 하지만 전 그 날 낮에 23시간-_-을 잔 후였으므로 잠들지 않을거라고 생각했습니다. 그렇지만 역시 잠들더군요.-_-;;;;

여기는 어두운 밤 중의 학교 건물과 비슷한 장소입니다.제 앞에는 복도 가운데 쯤의 계단이 보이고 저 오른편 끝에는 복도끝이 보입니다. 전 당직 같은 걸 서고 있었던 것 같아요. 가운데 계단으로 손전등을 들고 올라가던 중 누군가를 만나서 두런두런 이야기를 합니다. 그러자 저 복도 끝에서 여러명의 남자들이 나타납니다.(제가 다녔던 회사 사람들인데 왜 여기 나오는지 모르겠네요) 나타나서는 귀신인 줄 알았다며 아깝다는 듯 투덜거립니다. 여기 귀신이 있다고 잡으려고 한다네요.

귀신이랍니다! 전 복도를 달려 복도 끝의 어느 방안으로 들어섭니다! 사람들이 모두 덮쳐 저는 바닥에 누운채로 움직일 수 없습니다. 제 왼편 옆구리곁에는 희끄므레한 사람 형체의 것이 있네요. 누운채로 있으니 천장이 보이는데 천장에는 전등을 감싸는 둥그런 실내장식이 두 개 보입니다. 그 것이 조금 흔들리는 듯 해서 제가 옆으로 허리만 움직여 겨우 피하자 하나가 떨어져 내립니다.

제 왼편의 희끄므레한 것이 그 걸 맞은 사람이 범인이라며 외치자 사람들이 덮쳐듭니다. 그를 덮쳐서 잡자마자 희끄므레한 것이 저를 향해 외칩니다.
“얘도! 얘도!”
사람들이 저를 덮칩니다.
“얘도 범인이야?”
그러자 그 것이 답답하다는 듯 외칩니다.
“범인이면서 범인이 아니야”
저를 잡고있는 한 사람이 말합니다.
“범인이면서 범인이 아니라니 무슨 소리야!”

“아아..”
제가 탄식성을 외칩니다. 순간 제 머리속에 어떤 모습이 떠오릅니다. 정신을 잃은 제 손으로 범인이 살해당하는 자의 목을 조르고 있습니다.
저는 울음을 터뜨리며 이렇게 외치고는 정신을 잃습니다. “무기가 아니면서 무기인 것!”

꿈 속의 제가 이렇게 정신을 잃으면서 현실 속 제 정신이 조금씩 또렷해지면서 이내 완전히 또렷해져 잠에서 깹니다. 잠에서 깨는 제 눈에 제 방 천장의 아까 떨어져내린 실내장식과 거의 비슷한 모양의 전등이 보입니다. 시간은 새벽 4시 55분.. 몸의 모든 털들이 쭈뼛쭈뼛 곤두섭니다. 머리를 감다가 샴푸질을 하고 다시 눈을 뜨며 몸을 일으켜 거울을 보면서 흠칫 놀랍니다. 아무것도 없습니다. 그래도 계속 쭈뼛쭈뼛합니다.

여러분은 꿈 속의 내가 정신을 잃는 순간 현실의 제가 눈을 뜨게 된다면 어떤 기분이 드시겠어요?

음.. 전 어떤 종교도 가지고 있지 않습니다만, 왠지 저와 제 주변의 사람들이 다른 어떤 곳에서 어떤 다른 관계로 또 존재하고 있는 것이 아닐까 하는 생각이 들었답니다. 회사 사람들이 아까 잡으러 온 사람들인 것처럼요.(그 것이 전생이든, 또 다른 시점의 나이든 말이예요.) 어쩌면 제가 눈뜨는 순간 다른 나는 잠들고, 내가 잠드는 동안 다른 내가 잠에서 깨어 움직이고 있을 지도 모르겠습니다. 그래서 제가 잠이 많은지도요..

p.s : 아무튼 프로젝트는 이렇게 못했습니다.-_-;

정말 답답하고 화나는 새벽입니다.

 지금 시간은 새벽 5시 40분입니다.
시험기간을 앞두고 제가 하고 있는 일은 동아리 선배님 랩의 아르바이트 입니다.

왜 이 지경에 이르렀는지 답답한 마음에 조금 적어보자면..

가장 큰 이유는 제가 하기 싫어졌다는 거겠죠.

하기 싫어진 이유는 몇가지가 있는데 그 중 하나는 원래 하려고 했던 부분보다 조금씩 조금씩 확장되어 나가게 되서 부담이 커졌다는 것입니다. 이렇게 해서 제가 한학기 동안 해야 하는 일은, 학과 공부(공부 + 레포트 + 프로젝트) + 아르바이트 + 소프트웨어 멤버십(출석 + 프로젝트 + 세미나)가 되버렸거든요. 이로 인해 받는 스트레스가 정말 장난이 아니군요. 전 하나를 하면 대충 하지 못하므로, 하지 않거나 혹은 제대로 하거나 둘 중 하나가 될 가능성이 큽니다. 대충 하느니 안하는 게 낫다고 생각하거든요(고칠 점 중 하나입니다. 대충 하는 것도 잘 해야하는데..). 그렇다고 안하면, 해야될 일을 못한다고 생각하게 되면 그건 또 그 것대로 정말 스트레스를 받습니다. 제 성격이 좀 그렇습니다-_-.. 시간 문제로 선배님이 기능을 좀 축소해주시긴 했지만 축소 부분은 축소하지 않으면 도저히 그 시간안에 할 수 없다고 판단되었기 때문에 할 수 있는 정도로 줄여주신 겁니다(말그대로 빡시게 열심히 하고 하는 도중 아무 문제없이  진행되었을 때 다 할 수 있는 정도). 엄살이라고 보기엔 정말 너무 할 일이 많군요.

두번째는 거기다가 하지 않기로 했던 부분은 예전에 짰던 색기들(죄송합니다만, 정말 욕나와요-_-)의 코드가 정말 엉망이라는 것입니다. 자기들이 만들어 놓은 변수체크도 제대로 못하는 코드에(이건 뭐 ㅂㅅ도 아니고..), indent고 뭐고 전혀 일괄성을 찾아볼 수 없는 코딩 스타일에(일단 쳐다보기가 싫어집니다), 변수 초기화를 이상한 값으로 타입 상관없이 다 때려박아놓고.. 정말 욕하고 싶은 것이 한두가지가 아닙니다. 이 시간까지 제가 자지 못하고 있는 이유의 큰 부분이 이 놈들 때문이예요. 이 놈들 코드를 디버깅하면서 프로그램을 완성해야하니 원래 추가하기로 했던 부분을 작성하는데 시간이 더 걸리는건 당연한 일입니다. 게다가 이 놈들이 짰던 코드 부분을 발표해야한다고 수정해달라고 요구를 받았는데 당장 발표라는데 안해요 할 수도 없고, 하다보니 결국은 모든 부분을 제가 맡게(원래 안하기로 했었다구요!) 되었으니.. 쩝..

세번째는 제대로 된 보상이 없었다는 겁니다. 아르바이트를 시작한 건 코드 분석부터 시작하면 12월 말? 1월초?부터 시작했는데 원래 받기로 했던 3월은 커녕 5월달에나 되서 일부가 나왔습니다. 아쉬운 소리해서 선배님한테 겨우 50만원 더 받았는데, 그래도 햄버거 가게에서 일한 정도 밖에 안되니 그동안 몇 달동안 열심히 한 게 허탈해지면서 더하기가 싫어지더군요. 거기다 동아리 선배님이니 하기 싫어도 그만 할 수도 없고.. 나중에 끝나면 잘 주겠단 말씀도 솔직히 믿음이 안가게 되더군요. 무작정 선배 얼굴만 보고 힘든일 할 수도 없고 열심히 한 일에 대한 보상마저 보장이 안되니 일은 하기 싫고.. 게다가 다른 할 일은 쌓이고 쌓였고.. 정말 하기 싫었습니다. 5월 동안 소스를 커밋한 걸 보면 이전 달들에 비해서 정말 미미한 정도입니다. 중간고사때도 이렇게 하진 않았던 것 같아요.

네번째는 첫번째와 비슷할 수도 있는데, 무리한 계획을 실행하는 것에 더해 무리한 계획보다 늦어지게 되면 그 늦어진 것에 대한 부담이 저에게 그대로 다음번 계획 때 가중되서 돌아온다는 겁니다(사실 이건 제 성격 탓일 수도 있겠습니다). 프로그램 개발 도중에 개발 일정 수립에 대한 요구를 많이 받았는데, 일정 때마다 해야 할 일에 비해 매우 빡빡한 데드라인이 정해지곤 했는데, 이 데드라인에 맞추다보니 꽤 무리해서 수행할 수 밖에 없었습니다. 무리한 계획은 거의가 계획대로 진행되지 못하게 되는 경우가 많죠. 거의가 “이거 맞추기 너무 힘든데요.. 뭐 해봐야죠 뭐..”라고 울며 겨자먹기로 시작해서 결국은 마치려고 했던 부분까지 못하는 경우가 많았습니다. “이 기능은 꼭 들어가야해”라는 것만 넣어도 빡빡한 일정이었습니다. 한다고는 했었으니 못한거에 대해 열심히 하고서도 죄송스런 마음이 들고, 다음 번 계획 때는 이전에 못했던 부분 + 무리한 일정을 다시 세우다보니 너무 힘들어지더군요. 그래서 원래 그만하려고 했던 시기보다 계속 딜레이되고, 거기다 제 일을 넘겨받아 할 사람을 구하기 힘들다고 제가 한 부분까지만 하고 마칠거란 이야기를 듣고나서는 부가기능을 뺀 주기능은 미구현 상태로 남길 수도 없는 상황이 되어버렸으니.. 뭐.. 답답합니다.

에구.. 쓰면 쓸수록 제가 왜 이 프로젝트를 하고 있는지 모르겠네요. 지금 하는 이유는 하겠다고 약속했으니 약속한 부분까지는 마친다. 라는 마음과 동아리 선배님을 봐서 정도겠네요. 랩실 내부 사정이긴 합니다만, 선배님이 굉장히 힘들어지셨거든요. 동아리 선배님이 정말 좋은 분이고 존경하고 좋아하는 분인데, 괜히 이 일로 껄끄러워지지 않았으면 좋겠습니다.

뭐.. 그래도 어찌됐건 힘드네요.