Saturday, July 3, 2010

essential utility (vi)

c 언어를 공부하다가 컴파일을 하게 되고 컴파일을 하다보니 자연스레 make 파일을 알게 되고.. 이와 같은 이유로 좀 더 깊게 알고 싶은 생각에 "유닉스, 리눅스 프로그래밍 필수 유틸리티 (백창우 저)" 를 보기 시작했다. 책은 내용은 프로그래밍을 시작하기 위한 편집기에서부터 컴파일의 자동화를 위한 유틸리티, 디버깅, 그룹 프로그래밍시 프로그램 에디팅 할 때의 버젼 업관리 까지 실직적으로 프로그래밍 시작부터 마무리까지에 필요한 유틸리티를 자세하게 설명하고 있다. 책의 내용이 상당히 많은 관계로 여기서는 가장 기본적인 컨셉과 나에게 도움이 될만한 예를 기록하는것으로 하겠다.


vi

vi 는 visual edit의 준말이라는것 (어떻게 이것이 비쥬얼이란 말이 들어간다는 건지.. 그 이전 시대의 에디터를 설명하나 감이 오진 않는다). 올해 나이로 얼추 서른, 최장수 소프트웨어 중 하나란다. 이 책에서는 vim(Vi Improved) 를 사용하길 권장하고 이를 기준으로 설명한다.

vim 은 3가지 모드로 구성된다.

- 명령모드 : 키 입력을 통해 vim에게 명령을 내리는 모드. 커서이동, 삭제, 복사, 붙이기 등 편집을 위한 모드.
- 입력모드 : 실제로 문서 입력 및 편집을 위한 모드. 타이핑하는데로 화면에 출력.
- ex모드 : 라인 에디터인 ex 에디터(vi 의 바탕이 된 소프트웨어)의 기능을 사용하는 모드. 파일 저장, 종료, 치환 등의 기능


명령 앞에 숫자를 넣게 되면 그 명령을 앞에 누른 숫자 만큼 반복한다는 의미가 있다. 예를 들어 10x 를 누르게 되면 x를 10번누른 효과, 즉 10개의 글자가 삭제되며, 10dd를 누르면 10개의 행이 삭제 된다. 또 다른 예를 보자면 10yw를 누른뒤에 2p를 누르게 되면 10개의 단어가 복사 되고 복사한 내용을 두번 붙여넣게 된다.

붙여넣기를 이해하기 위해서는 레지스트를 알아야 한다. vi 는 총 17개의 레지스트를 갖고 있으며 이를 보기 위해서는 ex모드에서 :reg 명령을 넣으면 된다. 명령모드에서 "1p를 누르게 되면 1번 레지스트에 있는 내용을 붙이게 된다.



v를 누른 후 방향키나 h j k l 를 이용하여 커서를 이동하면 블록을 형성할수 있다(마우스 우클릭 효과). ctrl + v 를 누르면 사각형의 블록을 지정하게 된다. 이후 d 나 y를 누르면 삭제 복사가 이루어 지고 <는 탭 제거, >탭 삽입.

되돌리기는 u 되살리기는 ctrl + r.

치환은 ex 모드에서 :[범위]/[매칭문자열]/[치환 문자열]/[행 범위]. 예를 들어 :2,4s/old/new/g 2,4s는 2행에서 4행을 의미하며 g는 행 전체에 걸쳐 매치되는 문자열을 치환하라는 의미이며 :-1,+3s/old/new/ 에서 -1,+3은 현재 커서에서 위로 1행 아래로 3행을 뜻하고 마지막에 g가 없으므로 행에서 첫 번째 매치 문자열만 치환하라는 뜻이다.


-vi 의 고급 테크닉-

정규표현식:
vi 는 정규 표현식을 지원한다.

내가 정규식에 약하기 때문에 (항상 공부하겠다고 하고 스킵한 이유로...) 이 부분은 자세히 하고자 한다.


[a-z]\+[0-9]\+ 는 소문자 하나 이상 숫자 하나이상을 의미 하는 것으로 'like0101' 이나 'korea1117'을 의미 한다. OK\ [a-z]* 은 OK 문자뒤 하나의 공백 뒤에 소문자가 0개 이상 반복을 의미한다. 곧 'OK like'를 의미한다. ^[^0-9]\+.*[a-z]$ 에서 괄호 앞의 ^ 행의 시작을 의미하며 괄호 안의 ^는 not을 의미 하고 \+는 1 이상, .은 '\n'을 제외한 문자를 *는 0개 이상, $는 행의 끝을 의미하므로 숫자로 시작하지 않는 행이며 행 가운데는 아무 문자가 있을수도 있고 끝이 소문자로 끝나는 행 을 지징하게 된다. \에서 \<는 단어의 시작을 의미하고 \>는 단어의 끝을 의미하므로 단어중에 ko로 시작하고 a 로 끝나는 단어 예를 들어 'korea' 등을 뜻하게 된다. [A-z]\+[0-9]\{2,3\}는 영문자로 시작하고 숫자가 최소 2번에서 3번 반복되는 단어 즉 'graphy21' 과 같은 단어를 뜻하게 된다.



vi는 POSIX 문자 클래스를 지원한다. 또한 확장 정규 표현식도 지원한다. 이는 생략하기로 한다.



여러 파일 편집시 예를 들어 vi를 이용해 확장자가 .py로 끝나는 파일을 열었다고 했을때(vi *.py) 열린 파일 리스트를 보기 위해서는 :ls 는 이용해 가능하고 지정 파일로의 이동은 :b2 (두번째 파일 버퍼를 의미한다) 식의 ex모드 명령어로 가능하다. :map 명령어는 단축키 지정시 사용한다.

vim 설정하기 : 사용자 홈 디렉토리에 .vimrc 파일을 생성하게 되면 vim은 실행 할때 이 파일을 읽어서 수행하게 된다. 그래서 .vimrc 파일을 이용해 원하는 사용자에 맞도록 vim를 설정할 수 있다. .vimrc파일에서 주석은 "로 시작한다.

매크로의 사용 : 예를 들어 perl로 코딩을 했는데 python에 익숙한 나머지 행 마지막에 ; 를 빼먹었다. 그러면 커서를 문장의 맨뒤로 보낸뒤 입력모드로 바꾸고 ;를 입력한다음 행을 바뀌야 한다. 이를 수행하는 과정을 나열하자면 $ i ; Esc Enter 이다 (물론 $ i 다음에 그냥 행아래로 내려가서 계속 ;를 넣으면 가능한긴하다). 이를 매번 치기 귀찮으니 명령어 과정을 vim에서 제공하는 레지스트(a-z 레지스트) 에 저장해서 이용할수 단축키로 이용 할수 있다. 명령모드에서 qb를 누르면 b레지스트에 기록시작을 뜻하며 $ i ; Esc Enter 를 순서대로 입력수 q를 누르면 b레지스트에 저장이 된다. 그뒤 다시 명령모드에서 5@b 라고 치면 b레지스트에 있는 매크로가 5번 수행하는 결과를 가져와서, 곧 5개의 행 뒤에 ;를 붙인다.

다중창 사용하기 :
Ctrl+w n : 가로 분할로 새창이 띄어짐, 여기서 :e 명령어로 파일을 불러올수 있다.
Ctrl+ww : 창간커서 전환
Ctrl+w s : 현재 파일을 가로로 분할, 같은 파일의 다른 부분을 참조할 때 이용한다.
Ctrl+w v : 현재 파일을 세로로 분할


-vim 의 조력자들 ctags, cscope, 기타 플러그 인-

연동 프로그램은 바이너리 형식의 실행 파일로 vim과 독자적으로 동작할수 있다. ctags, cscope, man등이 있다.
내장 스크립트는 vim이 기능확장을 위해 자체적으로 가지고 있는 것으로 vim 플러그 인아리 부르고 .vim의 확장자를 갖는 것으로 bufexplorer, taglist, calendar, vimspell등이 있다.

ctags :


-알아두면 유용한 팁-

파일 탐색 : :r !ls 는 원래 :!를 이용해 쉘명령어를 이용할수 있는데 :!ls를 하면 vim상태에서 ls를 실행하게 된다. 결국 ls 명령어로 출력되는 결과를 현재 커서의 위치에 삽입하라는 명령어가 된다.
:20vs ./ 이는 explorer 플러그 인이 설치 되어 있어야 한다. 파일의 리스트를 보고 싶을때 !ls를 이용할 수도 있지만 :20vs 를 이용하여 선택하면 바로 열리게 된다. 뒤의 ./는 현재 디렉토리를 뜻한다.

폴딩 기능 : 보기 싫은 긴 함수 같은 경우 '{' 위에 커서를 두고 v]}zf 명령어를 치면 함수가 폴딩되고 zo를 치면 다시 풀리게 된다. 사실 좀더 일반적으로 v로 영역을 지정하여 zf를 누르면 이부분이 폴딩된다. v는 앞에서 배운 드레그의 의미이다.

여러 행 앞에 탭 끼워넣기 : [N]>> 는 커서 위치서부터 N 행에 탭넣기 [N]<< 탭제거. 예를 들어 7>> 이면 7행 앞부분에 탭넣기가 된다.

자동 완성 기능 : 코딩중에 앞에서 사용한 함수 이름이나 변수를 일부만 치고 Ctrl+p를 누르면 앞에서 사용된 변수들 중 입력한 문자가 들어가는 변수들이 리스트업 된다.