블로그 이미지
관리할 시간이 별로 없다는 핑계 제출중... sbin

카테고리

sbin story (32)
who is sbin (0)
sbin's equipment (2)
C language (8)
travel (0)
ubuntu (8)
Mac (3)
book & sentence (11)
헛소리.. (0)
Total50,586
Today7
Yesterday15
 이번 장에서는 스왑 기술을 다루겠습니다.
 모두가 알고 있는 기술이죠. 프로그램을 배우면서 여러번이나 반복 학습한 기술입니다. 간단하죠. 두개의 변수가 가지고 있는 데이터를 상호교환합니다.

void swap(int &a,int &b){
	int temp;
	temp	= *a;
	*b	= *a;
	*b	= temp;
}

 기본형은 위와 같고 정말 간단한 함수 입니다. 헌데 이게 왜 거창하게 프로그래밍 스킬 씩이나 될까요?
 프로그래밍 스킬이 되는 이유는 바로 사용법에 있습니다.
 우린 수많은 프로그래밍 기술을 배우게 됩니다. c, c++을 하며 포인터를 다루는 법이나 구조체 등을 다루는 법을 배우고, 자바를 배우면 객체 지향을 배우게 됩니다. 머 요즘은 객체 지향이 아닌 목적지향이 대세죠..^^
 헌데 우린 이렇게 배워온 스킬을 전혀 사용하지 않는 경향이 있습니다.
 위의 swap이 대표적이라고 할 수 있습니다.

 그럼 swap을 사용하는 대표적 구조가 무엇일까요?
 전 위에서 목적지향을 언급했습니다. 이때 필요 하죠 우린 필요에 의해서 일정 변수를 전역으로 지정하고 사용하게 됩니다. 다른 파일에선 볼수 없는 변수 이지만 파일 내부에선 사용이 자유롭죠.
 이 파일 안에 펑션 A가 있습니다. 그런데 이녀석은 전역 변수 b를 사용하는 군요 그런데 우리는 A와 같은 기능을 하되 b와 형태가 같은 c변수를 가지고 실행 하길 바랍니다.
 이때 A를 다시 전역 변수가 아닌 전송 받은 녀석으로 처리하게 변경하는 방법이 많이 사용 됩니다. 하지만 이는 속도 저하를 불러오게 됩니다. 자신이 연산하는게 외부에도 보내준 주소를 이용하는 것이라고 하면 일정 언어에서는 속도가 저하되게 되죠. 이를 보완하는 방법이 swap입니다. 그냥 b와 c의 형태가 같으니 연산전에 둘을 교체해두고 연산후 다시 교체하면 되는 일이죠.
 여러 반론이 나올수 있습니다. 우선은 가장 큰 반론 "우아한 퇴보" 컴퓨터는 만들어 지고 난뒤 가장 큰 이슈가 항상 일하게 하는 것이었죠. 하지만 컴퓨터의 발전은 너무 빨랐고 사람들은 이 이슈를 포기했습니다. 이걸 "우아한 퇴보" 라고 하죠. 즉 컴퓨터는 사용자 보다 연산이 빠르고 그렇기 때문에 사용자의 입력을 기다린다. 입니다. 실제로 이는 많은 분야에서 타당합니다. 우리는 동영상을 시청하면서 웹서핑도 하죠 이는 컴터가 두가지를 모두 처리할 수 있을 정도로 빠르기 때문입니다. 이런 컴터를 사용하는데 왜 프로그래머가 고작 1,2초를 줄일려고 더 힘든길을 택하는가 이죠.
 이는 프로그래머들 사이에서는 충분히 큰 이슈죠. 1.컴터가 빨라졌는데 왜 속도 최적화를 해야 하는가 차라리 보완이 쉽게 하자. 아니다 2.그래도 우리는 사용자를 위해 빠른 프로그램을 짜야한다. 전 눈치 채셨겠지만 후자 입니다.
 전 의공학쪽을 하거든요. 그 중에서도 방사능, 혹은 울트라 비전의 장비들에 이미징이 전문 입니다. 그렇다 보니 한번의 구동에 엄청난 시간을 할애하거든요.
 이런 분야는 저뿐만이 아닐 것입니다. 영상 공학쪽이나 네트워크는 짧은 시간 안에 많은 일을 해야하죠. 그렇기 때문에 우린 우아한 퇴보 든 머든 빨라야 한다는 것입니다.
 이게 이번 장에서 제가 말하고자 하는 첫번째 쾌속화입니다. 그럼 두번째 이번엔 시간 보장입니다. 이도  swap을 쓰게 됩니다. 이번엔 추상적인 설명보다 제 경험을 바탕으로 쓰겠습니다. 얼마전 유명 대회 출품 목적으로 영상처리를 하게 되었습니다. 이 과정에서는 당연히 전프레임과 현재 프레임을 비교 해야 했습니다.이를 위해 저는 현 프레임을 전프레임 변수에 할당해야 했죠. 문제는 간단히 해결 할 수 있죠. 첫번째 입니다.
	memcpy(prevImage, currentImage, imageScale);
    memcpy(prevImage, currentImage, imageScale);
간단한 솔루션이죠..^^..c에서 제공하는 기본 함수 이니 속도도 보장 됩니다.(기본 함수는 최적화가 되어 있는 상태로 릴리즈 됩니다.)
두번째 입니다.
	double * temp;
	temp	= currentImage;
	prevImage	= currentImage;
	currentImage	= temp;
이번엔 스왑 기술입니다. 실제 메모리에 할당된건 두 이미지(currentImage, prevImage)입니다. 이 구문을 통해 두 변수는 서로 자신의 값을 변경합니다. 다음 프레임을 처리할때에는 currentImage가 재할당 되지만 이는 전 프레임이 아닌 전전 프레임의 내용이니 상관없고 prev는 전프레임의 내용을 담고 있으니 조건 충족이죠.
 
  위 둘은 결국 같은 일을 합니다. 결과는 물론 여러가지로 다르지만 이건 프로그래머가 일부로 한것이니 문제 없겠죠. 그럼 이둘이 프로그램에 주는 효과는 무엇일까요?

 능숙한 프로그래머(속도 쪽으로)라면 눈치 채셨죠. 첫번째 알고리즘에 러시안 페인트공이 있습니다. 첫번째 알고리즘은 imageScale만큼의 메모리를 복사 하죠. 헌데 이는 이미지의 크기에 따라 변화합니다. 이 수치는 극히 짧을 수도 있고 수만,수백만의 크기일수도 있습니다.
 이에 반해 두번째는 그냥 3번 주소 재할당이 있었고 이는 imageScale의 크기에 상관없죠.

  이게 두번째 이슈 입니다. 프로그래머는 불확정 시간동안 프로그램이 구동하게 해서는 안됩니다. 이런걸 허용하면 처리해야할 데이터의 크기가 커졌을때 그 크기의 증가량 만큼만 쓰면 될 실행시간이 크기의 제곱 세제곱의 시간으로 늘어 나게 됩니다. 이게 러시안 페인트공의 무서운 점이죠. 사태가 이때 까지 가면 우린 무엇이 문제를 야기하는지도 찾기 힘들어 지죠..^^

여기서 제 이슈는 두가지였습니다.
1. 프로그래머는 프로그램이 빠른 시간안에 구동 되도록 보장해야 한다.
2. 프로그래머가 보장 못하는 정도의 시간을 쓰게 해서는 안된다.
추가로 하나 입니다.
 + 우리가 배운 수많은 프로그래밍 기법들은 조금만 변경해도 얼마든지 고급 프로그래밍 기술이 될 수 있다.
둘다 속도에 관한 이슈였죠..^^ 허접하지만 봐주셔서 감사합니다...^^
Posted by sbin
  이번엔 누구나 알듯한 ctags에 대해 다루도록 합니다..^^

  ctags는 속도가 빠른 vi에게 날개를 붙여 주는 프로그램이죠..^^
  ctags라는 날개를 얻음으로서 vi는 함수들 사이를 마구 마구 날아다닐 것입니다.

  vi의 장점은 숙련 되었을때 높은 에디트 능력과 속도를 제공한다는 데에 있습니다. 그 주요점은 검색&치환 입니다.windows를 사용할때 우린 검색 기능은 사용하지 않습니다. 드라이브 전체를 뒤지는 일이 있어도 윈도우의 내장 검색 기능은 무시해 버리죠...왜냐하면 한번 돌리면 퇴근해야 하니까요..ㅡㅡ;; 하지만 리눅스는 다릅니다. 현재 제 피씨의 하드 디스크는 320기가와 서브 백업용으로 1테라 입니다. 320기가는 거의 모든 영역을 사용하고 있구요. 하지만 리눅스의 검색명령을 내리고 키보드 옆에 커피를 몇 모금 마시고 나면 결과물이 나와 있습니다. 또 그 이후 검색은 몇초 걸리지도 않구요. (아마 내부적으로 태그를 사용하겠죠..^^) 이런 리눅스의 장점은 vi에서도 적용 됩니다. vi의 검색 및 치환 기능은 최고라고 해도 별 문제 없을 것입니다.(vol.1참조) ctags는 이런 기능의 확장이 됩니다.
  연관되는 함수의 태그를 생성해두고 사용자가 원할때 그 태그를 이용 원하는 함수로 이동시켜 주는게 ctags의 기능 입니다.

  일단 설치..^^
  sudo apt-get install ctags
  간단하죠..^^ 하지만 이걸로 끝일리는 없습니다. 우리는 프로그램을 짜면서 수많은 시스템 함수들을 사용합니다. ctags는 당연히 그녀석들의 태그도 가지고 있어야 겠죠..^^( 전 별로 시스템 쪽 태그는 사용하지 않습니다. 이 보다는 http://www.cplusplus.com/ 를 더 애용하는 편입니다. ) 웹에서 리눅스 커널 소스를 검색하시면 바로 찾으실수 있으실 거에요. 이 녀석을 원하는 곳에 풀어 놓으시고 폴더 안에서 ctag -R 명령을 내립니다. 이는 ctags가 사용할 tags 파일을 생성하는데 -R 옵션으로 인해서 제귀적(하위 폴더 포함) 생성을 하게 됩니다.
  자 폴더에 tags라는 이름의 파일이 생성 되었죠. 이제 vi가 이 tags파일에 접근하게 해줘야 겠죠..^^ 또 .vimrc파일 입니다.

set=./tags,/home/sbin550/workspace/kernel/linux-2.6.22.4/tags,../tags

  이녀석이 필요한 태그들을 링크하는 거죠..^^ 저같은 경우 시스템 커널의 소스가 제 workspace에 kernel이라는 폴더 안에 있군요. 이렇게 연결 해주셨으면 이제 ctags는 시스템 함수도 쉽게 찾아 줄것입니다.

  이제 vi를 쓰면서 ctags를 애용해 주시면 됩니다.
  사용법은 다음과 같습니다.

  :sts [함수명]
  :tj [함수명]

  입니다. printf함수를 찾고 싶다면 :tj printf라고 치면 되는 거죠. 그럼 유효한 함수 리스트가 디스플레이 되고 우린 그중 원하는 걸 선택하면 됩니다.sts와 tj의 차이는 창분할에 있습니다 tj는 현재 창이 이동하지만 sts는 창이 수평 분할 하게 됩니다. 전 이중 tj를 추천합니다. 왜냐하면 창이 분할 될 경우 창들 간 커서를 이동하는 명령을 이용하서 코딩해야 하는데 전....이게 귀찮아서 안쓰다 보니..ㅡㅡ;; 기억과 절교 했더군요....또 분할 된 화면을 좋아하는 프로그래머는 없지 않을까요....코드는 한번에 봐야 제맛이죠..^.~ 또 tj의 경우 이동 전 커서의 위치를 stack 에 넣어 둔답니다 그래서 언제든 돌아 가고 싶을때 "ctrl + t"만 눌러 주면 됩니다.^^
  이를 통해 우린 함수 사이로 마구 종횡무진 뛰어 다닐수 있습니다. 헌데 먼가 2%부족한 감이 있죠...:tj [함수명]입력하기 귀찮습니다. 그리고 저같은 경우 보통 함수 명도 모든 의미를 담아야한다는 주의 (sbin programming skill vol.2 참조) 이기 때문에 함수명이 상당히 깁니다. 이걸 언제 다 입력하고 있나요....제 .vimrc를 보시면 set tags 아래 추가적인 설정이 되어 있는 걸 보실 수 있으실 것입니다.
if version >= 500
     func! Sts()
         let st = expand("")
         exe "sts ".st
     endfunc
     nmap ,st : call Sts()
 
     func! Tj()
         let st = expand("")
         exe "tj ".st
     endfunc
     nmap ,tj :call Tj()
 endif
   bash로 출력했더니 이상한 값이 좀 변하거나 쓰래기 값이 들어 갔네요..>,.< 첫줄 gt는 if version >= 500 입니다.
   또 endif뒤의 명령은 무시해 주세요. 원본의 위의 스샷에 있죠...^^
 각각 sts와 tj를 쉽게 사용할 수 있도록 만들어 주는 펑션입니다. 이는 "유닉스.리눅스 프로그래밍 필수 유틸리티" 의 저자가 설정한 내역이구요..전...스크립트 언어를 잘 모릅니다...ㅜㅜ;; 곧 배워 둬야 겠다고 생각은 하고 있지만요... 제가 붙여 쓴 이상 설명도 불가능 한건 당연지사..^^ 여러분도 스크립트 언어를 공부하실게 아니시라면 특별히 분석하실 필요는 없겠죠..^^ 하지만 리눅스를 쓰면서 제가 느낀 바로는 언제 제대로 배워야 할듯한 언어 더군요..^^ 암튼 이녀석들을 .vimrc에 입력해 주세요. 이제 함수명을 다 입력하실 이유는 없습니다.
  원하는 함수를 호출 하는 부분에 커서를 위치 시킨후 ",tj"를 입력하세요. 머 매우 미약한 스크립트언어 이지만 제가 분석한 바로는 커서가 위치한 문자열을 기초로
  :tj [문자열]
  명령을 내려주는 거죠..^^ 그렇기 때문에 커서 아래에는 원하는 함수의 이름이 써있어야 합니다...^^
  또 하나 관련된 태그가 없습니다. 라는 메시지가 출력될 경우 "ctrl + shift +n"을 입력하세요..^^ 그럼 같은 폴더로 새로운 터미널이 뜨죠 거기서 입력합니다 ctags -R 당연히 내용은 tags파일을 새로 갱신하는 것입니다. 다시 창을 닫고 명령을 내리면 이동할 거에요...안되면 철자가 틀린거죠..^^

  vol 3.는 너무 짧네요..^^ 원체 ctags자체가 기능은 정말 좋지만 딱히 설명할 건 없는거 같아요..>,.< 이외 에도 ctags에는 만은 명령어(대략 20가지) 가 있지만 전 안쓰니까 설명도 안 합니다. 여러분도 한번 훌어 보시면 저와 같은 결론을 내리시게 될거 에요.
  정말 필요한 정보는 이렇죠
  원하는 함수에 커서를 두고 ,tj 입력시 함수 선언부로 이동
  "ctrl+t"를 누를 경우 이전 함수(,tj로 이동 진전 위치)로 이동

이상 입니다...^^

 그럼 vol.4에서는 cscope를 다루겠습니다.
Posted by sbin

  이번 편에선 미리 써 놓았던 데로 키 매핑입니다.
  말이 키 매핑 이지...이건 사용자가 원하는 데로 하는 거니까....이번 편의 부제목 대로 플러그 인쪽에 가깝겠죠...

  앞서 저는 vi의 유용한 키들을 설명하였습니다. 그런 키들은...혼자서 사용되는것 보다 여러키가 복합적인 효과를 주는게 더 많습니다.
  첫번째 설명할 폴딩,폴딩해제 기능이 그런것이라고 볼수 있죠.


  우선 프로젝트를 들어 가야 겠죠...이번엔 복수의 파일을 같이 열도록하겠습니다. 명령은 다음과 같은 형태죠.
  vi *.c src/*.c
  복수의 파일을 여는 이유는 태그리스트와 버퍼익스플로러를 설명하기 위함입니다...
  그럼 설명보다 스샷..ㅋㅋ


  보시면 함수 하나가 이름만 남고 접혀져 있죠...이게 폴딩 기능 입니다....이건 기나긴 코드를 볼때 필요한 기능 이다~~~~라고 설명하지만....제가 보기엔 쓸데 없는 기능 중 하나 입니다. 자신의 프로그램을 짜는 프로그래머( 복사 & 붙여넣기 에 익숙한 사람 제외)라면 자신이 찾는 코드가 대충 몇 번째 줄에 있는지 알수 있습니다. 위에 있는 코드가 자신이 찾던 코드가 아니라고 해서 폴딩 해가며 찾을 이유가 없죠. 또 폴딩하지 않고 코드만 조금 봐도 이녀석이 어떤 기능을 하는지 알구요.....보통 코드를 분석 할때 많이 쓰이 더군요....제 경험상으로는요....그러니 자신이 짠 코드라면 별로 필요 없는 기능 이겠죠. 이녀석 대신 버퍼 익스 플로러도 있으니까요....

  암튼 하는 법은 위의 vimrc에서 볼수 있듯 폴딩시 v]}zf 해제시 zo 이구요 이건 각 명령어들이 요약된것입니다.

  자 다음 둘은 태그 리스트와 버퍼 익스 플로러 입니다. 이녀석들을 키 매핑 해놓고 암만 눌러 바야 vi는 오류 메시지만 출력합니다. 왜냐하면 이 둘은 플러그인 이거든요..^^ 자 할 일이 따로 생겼습니다. 구글링~~~ 키워드는 'vim bufferexplorer' 입니다.

  제가 링크를 붙이지 않는 이유는....여러분이 해 놔야지 다음에 무리없이 하시게 되기 때문이죠..^.~..
자 검색 결과를 이용해서 태그리스트 를 받습니다. 압축을 풀면 두개의 폴더가 나오는 것을 보시게 될 것입니다.(파일만 달랑 나오면 다시 받는걸 추천해 드립니다.)

  그럼 이제 터미널을 여시고 명령
  sudo nautilus
  무슨 명령인지 아시죠..^_____^..터미널로 그냥 옮기실 분은...any way~~~
  열린 노틸러스의 폴더는 /usr/share/vim/vim[version]/으로 이동 시키시구요. 그럼 압축 풀어서 나온 폴더들과 동일 폴더가 있는 vim 폴더에 도착하실 겁니다. 하지만 안의 내용물은 당연히 다르겠죠 taglist쪽의 내용물은 맞는 폴더에 카피해 넣습니다. 이과정에 루트 개정이 필요하기에 sudo 명령을 내려달라구 요청한거구요..^^

  즉 지금까지의 과정은 bufferexplorer플러그 인을 받아서 /usr/share/vim/vim[version]/ 폴더에 덮어 씌운것입니다.

  이 녀석의 기능은 열려 있는 파일간의 이동 입니다.
  매번 파일 버퍼사이를 오가는 것보다 버퍼 익스플로러를 이용하는 편이 당연히 편리합니다.
  추가로 제일 위의 .vimrc스샷에서 "=====파일 버퍼 간 이동======" 관련 매핑은....전 전혀 사용하지 않구요. 이녀석도 열려있는 파일간의 이동 기능 입니다. 하지만 어떤 파일이 어느 순서로 열려있는지 모르면....황이죠...하지만 버퍼 익스플로러는 파일의 이름을 보여주고 선택하게 하기때문에 편리하답니다.

  다 끝내 셨으면 .vimrc에서 키매핑을 하시구요.(전 'f4'로 되어 있습니다.)
  다수의 파일을 한 vi에서 여신후 :BufExplorer를 입력하시거나 매핑한 키(저같은 경우 'f4')를 누르세요.
  그럼 열려있는 파일 리스트가 나오게 됩니다. 그 파일들 중 편집을 원하는 파일을 화살표나 jk키를 이용해서 선택해주면 그파일로 편집창이 이동한 것을 보실수 있으실 것입니다. 써 보시면 정말 유용한 플러그 인이라는 것을 알게 되실 것입니다.


자 다음은 태그리스트 입니다. 설정은 똑같이 vim Taglist로 하셔서 설치 하시구요.
이녀석은 창을 분할 하면서 열려있는 파일과 파일이 가지는 매크로, 전역 변수, 함수의 리스트를 보여 주고 원하는 곳에서 엔터 입력시 해당 위치로 이동 시켜주는 녀석입니다. 말이 필요 없겠네요...동영상을 통해 어떤 녀석인지 확인해 보세요..^^


  보시면 f5키를 눌렀을 때(매핑된 키) 창이 좌우로 분할 되며 좌측에 커서가 위치합니다. 그후 태그리스트와 같은 방법으로 원하는 함수로 이동한뒤 선택해 주면 커서가 오른쪽 창으로 넘어 오며 우측 창에선 선택한 함수가 있는 곳으로 이동하게 됩니다. 다시 매핑된 키를 누르면 사라지구요..^^

  그다음은 자동완성 기능 입니다.....이 기능은 원래 vol.1에 들어 가야 했는데 제가 깜박했더군요...절취선 아래 적으려다가 원악 중요한 내용이라서 이렇게 vol.2의 마지막을 장식하게 되었습니다.
  자동 완성 기능은 프로그래머 에게 있어서 매우 중요한 기능입니다. 그 중요성은 앞서 "sbin programming skill vol.2"에서 다룬 적이 있죠....그렇기때문에 당연히 vi 도 이 자동완성 기능을 제공 합니다. vi의 경우 "ctrl + p" 와 "ctrl +n"이 자동완성 키가 되겠습니다. 전 그냥 "ctrl + p"만 외우고 있는데 책을 보니 n도 있더군요.
  비쥬얼 스튜디오의 자동완성 기능을 써보신 분은 정말 짜증나는 점을 하나 발견하셨을 것입니다. 이노무 자동완성은 원하는 것을 찾을려면 한참 스크롤을 내려야 합니다...ㅡㅡ;; 이는 정렬방식에 큰 문제가 있다는 의미 이지요.
vi의 자동완성은 코드를 분석합니다. 자신이 연결된 모든 파일을 검사(시스템 포함) 하고 그 순서는 코딩중인 위치로 부터 위로 향합니다.  정렬도 마찬가지로 커서 에서 위쪽으로 제일 가까운 해당 값들이 정렬되구요.."n"의 경우 아래로 검색하여 아래쪽의 해당값이 먼저 올라 오구요. 이건 다른 정렬보다 훨신 편리 합니다. 변수는 대부분이 지역인 경우가 많고 지역변수는 커서 근처에 선언, 사용되었기 때문에 이런 정렬방식은 원하는 값을 바로 찾는다는 의미 이지요....이도 동영상을 준비 했습니다....헌데 제가 마우스 줌을 너무 당겨서 전체적으로 찍히진 않았더군요..^^ 죄송합니다.....그래도 어떻게 구현되는지는 이해 하실수 있으실거에요..^^

 그럼 vol3는 ctags를 다루도록 하겠습니다...^^
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
오늘도 나오는 절취선..^____^ 확인차 재생 해본 결과....vi를 모르시는 초보자 분들은 잘못 이해 하실거 같아서요..^^ 리눅스의 터미널은 마우스 명령따위 깡그리 무시합니다. 당연히 vi에서의 마우스 명령도 무시되죠. 제가 마우스를 사용한것은 보시는 분의 시선이 보셔야 할곳에 있게 하기 위함이나 화면의 줌을 당기기 위함입니다. 절대 마우스로 함수등을 선택하는 것은 불가능 합니다. 오해하지 말아주세요..^^
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0731 틀린 내역 수정 되었습니다....지적해주신 a2님께 깊은 감사를 그리고 그전에 보신 분들께 석고대죄를..>,.<
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Dr.Jung님께서 주신 조언에 의하면 vi에 마우스 명령을 처리할수 있게 해주는 명령어가 있더군요..^^
위에 써놓은 마우스에 관한 내역은 틀렸습니다.
함수 선택 등의 작업을 할수 있겠네요.
개인적인 의견으로 추천하지 않습니다. 마우스를 쓰지 않고 키보드로 줄수있는 여러 vi편집 명령( vol.1참조)을 사용했을때 이점은 매우 많으니까요..^^
Posted by sbin
누군가 요청했던 vi로 코딩하기 시리즈를 블로깅하려고 합니다..>,.<

이 블로그에서는 어떤 종류가 있는지 전부 나열하고 전부 설명하는 진부한 짓 안합니다...ㅡㅡ;;
그런건 위키 백과 뒤지세요......링크 첨부는 생략......왜냐하면 그정도 찾는건 인터넷 갓 시작한 사람도 할 줄 알고 모르는 사람이라면 배워야 하니까요..^____^

여기선 오로지 제가 vi로 코딩하면서 필요했던 것들만 쓰겠습니다. 그러니 실무에 적합할 것이고 내용은 부족할 것입니다. 자신이 제가 소개한 것들을 충분히 쓴다고 생각 된다면 한번쯤 위키백과를 검색하시거나 제가 추천해둔 리눅스 프로그래밍 필수 유틸리티 책을 보세요~~~

그럼 시작 합니다..^.~

우선 설치~~~~ 이게 왜 필요하냐는 아우성이 초큼 들리는데..... 필요 합니다..ㅡㅡ;; 왜냐면 제가 첨에 이거 때문에 뻘짓했거든요.....

일단 리눅스의 종류는 여러가지가 있죠....그중 어떤 리눅스(페도라) 는 vim(vi의 확장 이하 vi) 최신 버전을 기본 설치 하지만 최소화된 채로 말그대로 클라우드 컴퓨팅에 가까운 배포(우분투)를 하는 리눅스는 옛날 옛적 택스트 시절의 vi 를 설치합니다. 그 시절의 향수를 느끼고 싶은게 아니라면.....터미널에 다음 명령을 내려주세요~~~~
sudo apt-get install vim gcc
리눅서라면 이정도는 아시죠...gcc는 특별한 사유가 없는 이상 최신판을 사용해 주시구요~~~

일단 제 .vimrc의 설정 입니다. 기본 틀은 추천했던 필수 유틸리티에서 제공된 녀석과 같습니다. 그걸 제가 아주 조금 손본 상태죠.
앗....ctags까지 넣을려다 보니 제가 입력한건....안나왔네요..ㅡㅡ;; 머 간단한거고 이번장에서는 그것만 설명하려하니 글로 쓰겠습니다.

set hlsearch  << 검색된 글귀에 음영을 씌워 글귀의 위치를 알려줍니다. 저같이 검색을 많이 쓰는 사람은 필수 입니다.
set nu  << 스샷의 왼쪽에 숫자들 보이시죠?? 라인 넘버 입니다. 이녀석들을 나오게 해준답니다.
syn on << 글자에 맞는 색상을 입혀줍니다. 프로그래머라면 당연히 입력해야죠...^^

set ts=8
set sw=4
set sts=4 요녀석들은 탭에 관한 설정을 해줍니다. 설정한지 오래 된 후 안건들였 더니 정확한 내용은 모르겠어요.....궁금한 분은 구글링하시구요...^^ 이 설정 후 탭은 4칸으로 정의 됩니다. 보통 프로그램은 8칸을 쓰는데 (비쥬얼 스튜디오) 프로그래머 라면 4칸이 더 편하실 거에요...좌유로 길게 늘여진 프로그램.....썩 보기 좋진 않찮아요. 그래서 전 비쥬얼 스튜디오를 쓸 때에도 4칸으로 줄여서 씁니다.

그 다음 기본 변수는 모르겠습니다.....저도 기본 뼈대는 카피라서..ㅎㅎㅎ 그 뒤의 내용은 이후 버전에서 하거나 스킵하겠습니다. 제가 스킵한 부분으면....저도 잘 안쓰는 거니까....필요하면 공부하세요..>,.<

좋은 블로거는 친절해야해 근데 난 친절하지 안찮아??? 난 아마 안델거야~~좋은 블로거...ㅠ,.ㅠ

그럼 다음 장에서 할 내용은 제끼고..ㅡㅡ;;

기초 vi로 돌아 옵니다. ㅎㅎㅎ

vi는 3가지 명령모드가 있죠... 하나는 ex모드 였나...그거고 하나는 편집, 하나는 수정(<-아닐수도 있음 머...그게 중요하진 않찮아요?) 입니다.
편집모드는 말그대로 편집하는 것입니다. vi는 켜지면 ex모드 입니다. ex모드에서 상황에 따라 편집모드로 가는 방법은 여러가지가 있습니다. 일단 i 자신의 위치에서 삽입모드 설정, s 커서 위치 지우고 삽입모드 설정 a 커서 다음 위치 삽입 o 다음줄 삽입....그 외에도 수정모드로 들어가는 여러가지가 있는데 생각 안나네요....아시는 분은 댓글 플리즈..................이지만.....귀찮으시죠..초보자인데....외우기....간단하게 하나만 하죠...키보드에 insert키를 누르세요....삽입 모드 입니다. 한번 더 누르세요 수정모드입니다....참~~~쉽죠잉~~~
하지만  위에 제가 언급한 아이들이 있었다는 것 잊지 말아 주세요....오른손이 기본 자판 배열에서 안떠난다는게 vi의 최대 장점중 하나 입니다. 언젠가는 i,s,a,o를 누르는 것에 익숙해 지셔야 합니다....머 그전에 마우스로 안간다는 것만으로도 장족의 발전이지만요..^^

그리고 편집모드에서 ex모드나 수정모드로 가실때는 esc키를 누르시면 됩니다.
왼쪽 ex 가운데 편집 오른쪽 수정
참....위에 삽입모드와 수정 모드라고 했는데....이건 편집모드에서의 수정모드 이지 ex,편집,수정 할때의 모드는 아닙니다....편집시 수정모드는 그냥 한글을 쓰실때 수정모드와 같은 거에요.

자 편집 모드 설명은 접겠습니다. 더 할게 없거든요....창을 텍스트 창으로 만들었으니 열심히 글만 쓰시면 데요....그럼 ex모드와  수정 모드인데 ex모드 부터하고 정~~~말~~~중요한 수정 모드로 가겠습니다.
ex모드에서는 세가지만 기억하세요 e,w,q 추가로 ! ( 당연히 이외에도 많은 명령어가 있으니 필요 하신 분은 검색하세요~~)
e는 열기
w는 저장
q는 종료
!는 강제 입니다.
e text.txt
는 text.txt를 열거나 만듭니다.
w는 저장이고 이후에 전달자가 있으면 그이름으로 저장합니다.
q는 종료 이고 !는 강제 입니다. vi에서 파일이 수정 되었으면 w를 입력하지 않고 q를 누를 경우 저장하지 않았다고 종료 시키지 않습니다. 헌데...편집에 실수해서 저장하기 싫다면 q!를 누를경우 수정된 내용은 갱신되지 않고 강제 종료 되는 거죠.....

그럼~~~~정말 정말 중요한 수정 모드 입니다. 제가 이걸 설명하면서 ex모드의 명령어를 수정 모드라고 소개 하기도 할 것 입니다. 하지만.....그 기준은 누가 만든 건가요....전 제가 만든 기준을 사용 합니다. ex모드의 명령이지만 수정이라는 범주에서 많이 사용 되니까 전 수정 모드로 분류하는 것입니다. 여기에 대해서는 딴지 걸지 말아 주세요~~~

수정은 말그대로 문서를 수정하는 것 입니다. 편집 모드의 수정과 무엇이 다르냐구요???  타 편집기에서 오른손의 위치가 다릅니다. 다 른 편집기에서 사용자의 손이 마우스에 가있다면 이건 vi에선 수정 모드 입니다. 수정 모드에선 화살표나 hjkl키를 이용해서 커서의 이동이 가능합니다. 역시 초보자는 화살표가 편하지만( 저도 아직 화살표를 더 많이 쓴답니다.) hjkl키를 사용 함으로서 오른손이 떠나지 않게 노력해 주세요..^^
이 모드에선 중요한게 너무 많습니다.
일단 'v'키 입니다. 이 키는 마우스를 드레그하는 효과를 부여합니다. 일정범위를 택하는 거죠...
'v'를 누른 뒤 커서를 옮기면 커서가 있던 자리부터 옮겨진 자리까지 선택됩니다. 이후 삭제하시거나 카피하실수 있게 되는 거죠.
응용으로 'ctrl+v'와 'shift+v'가 있습니다. 전자는 블록 선택(줄단위가 아니라 커서의 원래 위치와 마지막 위치가 그리는 직사각형 영역 선택) 이구요 후자는 줄 단위 선택입니다.
왼쪽 보통 선택'v' 가운데 라인선택 'shift+v' 오른쪽 블록선택 'ctrl+v'
다음은 'd'입니다. 이녀석은 삭제 기능을 합니다. 글자 몇개정도는 'v'키를 이용해 선택한뒤 'd'를 눌러 삭제 하시구요.....
정말 중요한건 지금 부터죠...vi의 강점이 나온답니다.

'd'키를 두번 누르세요....커서가 있던 줄이 사라집니다. 'd''1''0''d'를 누르세요 'd'와 'd'사이에 10이라는 숫자가 들어갔죠 커서 위치 포함 아래로 10줄이 삭제 됩니다. 와우~~~ 우린 더이상 문서의 일정영역을 삭제하기위해 마우스로 드레그 한뒤 delete키를 누르지 않아도 된답니다.

다음은 'y'입니다. 이녀석은 카피 입니다. 사용자가 지정한 영역을 버퍼에 넣습니다. 사용법은 'd'와 같습니다. 'y'를 두번 눌러 한줄을 카피 하시던지 'y'사이에 숫자를 넣어 복수 행을 카피하세요~~

버퍼에 카피했으니 이번엔 문서에 붙이셔야 겠죠 'p'를 누르세요 커서 바로 다음에 버퍼에 저장한 내역이 붙습니다. 참~~쉽죠잉~~

이제 'u'입니다. u는 취소 명령입니다. 'd'를 잘 못 눌러서 원치 않는 행이 사라졌다면 u를 누르세요 복구해 줄것입니다. 또한 이 명령의 결과는 vi의 버퍼에 차곡차곡 쌓입니다......근데 이게 또 그렇게 심하게 필요하진 않아요.....필요한 사람은 검색..^^

장시간의 레이스~~~힘드시죠~~~ 마지막은 당연히 정말 중요한 녀석입니다...검색과 치환이죠....약간의 논설을 할테니 필요 없으시면 논설은 스킵하고 바로 검색과 치환 설명을 읽으세요..ㅎㅎ

검색과 치환.....이건 제가 리눅스를 쓰면서 리눅스의 최대 장점이라고 생각합니다. 윈도우의 경우 검색명령은 쓰지도 않고 쓰게 된다면 명령후 퇴근합니다.....다음날 출근 뒤 되어 있는지는 의문이죠....하지만 리눅스의 경우....명령을 내린뒤....커피 한잔 타오면 검색은 종료 되어 있습니다. 또 처음 검색때 태그가 생성 되어 있기 때문에 이후 검색은 명령과 동시에 결과를 출력하죠....매우 빠른 검색 이게 리눅스의 엄청난 장점이죠....이건 vi에서도 당연히 적용 됩니다.

그럼 이제 실무 vi의 검색명령은 /입니다. 수정중에 /를 입력하고 뒤에 원하는 문장을 넣으면 되죠....헌데 찾기만 하는 것으론 부족하시죠...치환 명령도 있습니다. 기본틀은 다음과 같습니다.

:[범위]s/[검색문구]/[치환문구]/[옵션]

첫번째 범위는 % 이거나 라인 넘버 입니다. 이것때문에 전 vi의 라인 넘버 표시를 켜놓는 것이랍니다.
10,13s라고 하면 10번째 줄부터 13번째 줄까지가 범위가 되는 것입니다.
%의 경우 문서 전체를 검색하는 것이구요.

검색문구와 치환문구는 아시죠..^^ 단 이 둘은 스크립트 인식됩니다. 그래서 /와 같은 특수 문자는 \를 붙여줘야 한다는 거 잊지 마세요....귀찮다고 생각 될지 모르지만 스크립트 인식은 이 귀찮음보다 훨씬 많은 이득을 제공 합니다. 제가 쓰는 스크립트만 적죠

$ 줄의 끝 부분을 지정합니다.
^ 줄의 처음 부분을 지정합니다.
& 치환 문구 위치에 넣을경우 검색문구가 그대로 적용 됩니다.

이 실예는 다음과 같습니다.
:10,15s/^/\/\/
이 명령의 결과는 10~15줄을  주석처리 합니다.
반대로
:10.100s/^\/\//^
는 10~100줄까지 중 줄단위 주석으로 잡혀있는 모든 줄을 주석해제합니다.
이런 아이들은 써보시면 금방...익숙해지고 좋아질 것입니다.

마지막 옵션 부분에서 제가 쓰는 건 오직 둘 'g'와 'c' 입니다.

'g'는 줄에서 다수를 선택합니다.(g가 없을 경우 그 줄에 검색결과가...2 이상이라고 해도 첫번째 것만 치환합니다.)
'c'는 치환전에 사용자에게 치환 유무를 물어 봅니다.

당연히 이 이상은....필요하시면 공부하세요

만약 치환에 실수를 하셨다면 그냥 'u'를 누르세요 치환 전의 상황으로 되돌려주는 착한 vi를 보실수 있으십니다. 그리고 나서 :입력후 위쪽 화살표 한번 눌러주시면 이전에 입력한 치환 문이 나올테니 잘못 된 것만 수정해서 다시 명령 내리시면 뎁니다...^^

머..제가 vi를 쓰면서...쓰는 것들만 나열했습니다. 이후에 꼭 필요하다고 생각되는게 있다면...절취선과 함께 추가 될것이구요....
허나 아마 없을거에요....그럼...다음에는 위 스샷에서 키 매핑에 있는 아이들에 대한 설명을 하겠습니다...^^
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
vimrc를 요청하시는 분은 보내 드립니다...많으면 첨부하구요..^^
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
글 올리고...일하려다...저도 모르게 여기 안써 놓은 기능을 쓰더군요...ㅡㅡ;; 정말 중요한 기능인데...
ex,수정 모드에서 :후 숫자를 쳐보세요...해당 라인으로 이동합니다. :1000이라고 치시면 파일의 1000번째 줄로 커서가 이동하는 거죠..^^
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
별로 신경 안쓰고 쓴 글인데 너무 많이 읽어 주셔서...ㅡㅡ;; 내일까지 스샷첨부해서...좀...이쁜 글로 만들어 놓겠습니다..>,.<
관심에 감사드립니다...^^
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
또 추가하는 군요..^^ 수정모드에서의 명령입니다. 'g''g' (g키 연속입력)수정모드에서 이 키는 파일의 제일 첫줄로 이동합니다. 또 대문자 'G'는 글의 제일 끝줄로 이동하죠....이 명령은 여러가지로 사용 됩니다. 중간에 'y'키나 'd'키등을 넣을 수 있거든요 'y'키를 삽입 할 경우 'g''g''y''G'가 되겠죠...이러면 파일 전체가 카피 됩니다. 또 'g''g''d''G'의 경우 파일 전체가 삭제 되구요. 또 추가 키 '='이녀석은 수정 모드에서 자동 들여쓰기 기능을 합니다. 'v'키로 영역 선택후 '='을 누르면 그 영역에 자동 들여쓰기가 적용 되는 거죠 마찬가지로 'g''g''=''G'를 이용 글 전체에 자동 들여쓰기를 적용 시킬수도 있구요. 이 기능은 매우 중요합니다. 왜냐하면 디버그를 돕거든요 프로그램 짜다 보면 괄호가 덜 닫혀있다는 메시지를 많이 보실 것입니다. 이경우 'g''g''=''G'를 입력하면 들여쓰기 기능때문에 닫히지 않은 괄호를 쉽게 찾으실수 있죠..^^
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0722 스샷 첨부 하였습니다...ㅡㅡ;; 많이 늦었죠...약속한거 보다....스샷보다 사용법을 동영상으로 올리는게 나을 것 같아...새벽에 찍어 놨는데....안올라 가네요..ㅡㅡ;; 내일 서브 PC나 노트북으로 다시 해봐야 겠어요..^^

Posted by sbin

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

티스토리 툴바