vi 를 자유 자제로 사용 하기 위해서는 vi레지스터에 대해서 알 필요가 있습니다.
대부분의 사용자들이 vi 레지스터에는 관심이 없이 y & p 명령으로 복사 하기 붙여 넣기를
사용하는게 일반적인데.. windows환경에서는 ctrl + c & ctrl + v 만 알면 일반유저들은
클립보드 내부를 알필요가 없이 복사 붙여 넣기를 자유 자제로 사용 하지만..
vi에서는 단순 복사 붙여 넣기가 아닌 막강한 기능을 제공하고 있습니다..
그럼에도 우리가 너무 ctrl + c & ctrl + v에 길들여져 있기에 대부분 처음 vi를 접하면 복잡하고..
불편하기 그지 없는데.. vi 에 익숙해 질때까 되면 윈도우 메모장에서 그냥 작업 하는거랑
vi 에서 작업하는거랑 엄청난 차이가 있음을 새삼 느끼게 되죠..^^ 서문이 길었는데…
이제 본격적으로 vi 파워유저로 거듭나기 위한 몇가지 팁에 대해서 알아 보겠습니다


일단 소스 작성시 가장 많이 사용 돼는 복사 & 붙이기 ,검색, 정렬등을 보다 효육적으로 하기 위한
몇가지 팁에 대해 알아 보겠습니다


제목에서 알수 있듯이 vi를 접해본분들을 대상으로 효율적인 tip을 주제로 다룰것이므로..
기초적인 문서 작성 저장.. 이런 것은 생략 하겠습니다 (다들 아실테니까요)


복사 & 붙이기


복사 (잘라내기) 를 재대로 이해 하기 위해서는 vi의 내부 레지스터 이해가 필요 합니다
vi는 내부적으로 기본 17개의 레지스터를 가지고 있습니다  ( 1 ~ 9 이외 특수 목적으로 사용 )
(여기서 레지스터란.. 실제 레지스터가 아니라 레지스터 버퍼를 말하는것입니다)
일반적으로 짤라내기 dd 명령등을 사용하면 aaaa문장을 짤라 냈을 경우 레지스터 버퍼에
들어가게 되는데 ..


----------------------------------------------------------------
"1        "2         "3         "4        "5        "6        "7         "8         "9
aaa
----------------------------------------------------------------


----------------------------------------------------------------
"1        "2         "3         "4        "5        "6        "7         "8         "9
bbb      aaa
----------------------------------------------------------------


----------------------------------------------------------------
"1        "2         "3         "4        "5        "6        "7         "8         "9
ccc      bbb      aaa
----------------------------------------------------------------


----------------------------------------------------------------
"1        "2         "3         "4        "5        "6        "7         "8         "9
ddd      ccc      bbb       aaa
----------------------------------------------------------------


이와 같은 큐  형식 으로 들어 가게 됩니다


vi 17개 레지스터 버퍼 ( (:)ex모드에서  :reg로 레지스터버퍼 확인할수 있습니다 )


" "   "0   "1   "2   "3    "4    "5    "6    "7    "8    "9    "-   ".   "%    "#    "/
    ""  레지스터  ->  바로 이전에 지워진 내용이 항상 들어 갑니다
"1 ~ "9 레지스터  ->  지워진 내용이 큐 형식으로 들어 갑니다
    ".  레지스터  ->  최근까지 타이핑 한 내용이 들어 갑니다
   "%  레지스터 ->  현재 편집하는 파일명이 들어 갑니다
    "/  레지스터 ->  가장 최근에 검색한 문자열이 들어 갑니다


레지스터에 들어 있는 내용을 p명령으로 붙여 넣기 할수 있습니다
p명령은 가장 마지막에 복사 & 잘라내기 한 ( " " 레지스터에 있는 내용) 이 붙여 넣기가 됩니다
p명령으로 붙여넣기를 할때 특정 레지스터를 지정 할수도 있습니다
  -> "2p 와 같이 하게 되면 2번 레지스터에 있는 내용이 붙여 넣기가 됩니다 (명령모드 에서)
이처럼 vi레지스터를 이해한다면 복사하기 붙이기를 좀더 효율적으로 사용 할수 있습니다

반복되는 문자열 저장해서 쓰기

vi에서는 기본 17개 레지스터 이외 26개의(a ~ z)레지스터(버퍼)를 지원 합니다
사용 방법으로는 복사하고자 하는 라인의 맨앞에 커서를 위치한후
ex) "a3yy ( a레지스터에 현제 위치에서 3줄 복사하여 저장) 복사하기
붙여 넣기 -> "ap 로 붙여 넣기 하실수 있습니다




메크로 사용하기
vi에서 메크로를 사용한다는게 언듯 무슨 말인가 싶기도 한데.. 간략히 설명한다면..
똑같은 패턴의 작업을 레지스터에 입력 해 두었다가 그걸 사용하는 아주 편한 방법입니다
첨에 보시면 손이 많이 가는 만큼이나 복잡하게 느껴지는데 익숙해 진다면..
아주 편하게 사용 하실수 있습니다


우선 사용방법으로는 명령 모드에서 q를 누르면 밑에 하단에 기록중 이라고 표시가 됩니다
q를 누른후 부터 누르는 키를 모두 기록하여 레지스터에 집어 넣는데.. 그르므로 필요없는 키를
누르면 잡다한 작업을 하게 만드는 결과가 생기므로 꼭 필요한 작업만 추가 한후 기록을 끝낼때는
다시 q를 눌러서 기록 모드를 종료 해야 합니다.


간단한 예제로 주석을 다는 작업을 할경우

리눅스에서 /* */  주석이 먹히지 않으므로 c표준 // 주석만 먹히는데 그래서 여러 라인 주석을
경우 상당히 귀찮아 지는데.. 이경우 사용하면 효과 적입니다..


명령모드에서 q레지스터 이름(a ~ z)를 누른후

a레지스터에 기록 할경우 qa 라고 누른후 (패턴을) 기록을 하시면 됩니다 기록중이라고 표시 돼었을때  i키를 눌러서 입력 모드로 바꾼후 //입력을 한후 스페이스바로 한칸 띄운후 ESC 키를 누른후 입력 모드를 종료 시키고 (그래도 기록모드는 계속 유지되고 있음 q를 다시 누를 때까지..) 다음 라인으로 가기 위해 enter키를 누른후 q를 다시 눌러 기록 모드를 종료 합니다



입력후 레지스터를 확인 하려면 ex모드에서 : reg 명령을 통해서 보실수 있습니다.
(ex모드 -> : 을 눌러서 실행명령을 입력 할수 있는 모드를 얘기 합니다)
그럼 a레지스터에 기록한 작업이 특수문자로 들어가있는데 그걸 사용 하려면..
적용 시킬 라인수 @ 레지스터 이름 으로 사용 하실수 있습니다
ex ) 5@a  (a레지스터에 있는 작업을 커서 위치로 부터 밑으로 5라인에 적용 합니다 )





블록 지정


블록 지정후 많은 작업을 할수 있는데 그것을 알아 보겠습니다.
일단 불록 지정하는 방법에는 2가지가 있습니다
  -> ctrl + v 로 지정하는 방법 (라인 지정이 아닌 범위 지정 특정 범위를 포함 할때 사용)
  -> shift + v 로 지정 하는 방법 (라인 지정 단위)
지정하는 차이를 모르겠다 싶은 분들은 직접 해보시면 바로 아실수 있어요..
지정후 많은 직업이 있는데 대표적인것만 다루 겠습니다


~  -> 대소문자 반전
u  -> 소문자로
U -> 대문자로
y  -> 복사하기
d  ->  삭제하기


>  ->  들여쓰기 ( visual c++ => Tab )
<  -> 내어쓰기  ( visual c++ => Shift + Tab )
=  -> 자동정렬  ( visual c++ => Alt+ F8 )


특히 들여 쓰기, 내어 쓰기, 자동 정렬 기능이 강력하지만 모르는 분들이 의외로 많은 기능..




검색 하기


검색하기는 / 나 ? 로 사용 하는게 일반적인데… 그외 {} 괄호 짝찾기 ,
같은 단어 찾기 에대해서 알아 보겠습니다
일반적인 검색하기이외  for,if 문이 중첩되어 소스가 복잡해질때 빠진 괄호 찾기가 쉽지가 않은데
그때 사용 하는 방법이 짝을 찾고자 하는 {} 괄호에 커서를 위치 시킨후 명령모드에서 % 를 입력
하면 가장 가까운 괄호 짝을 찾아 갑니다


(visual c++ 에선 crtl + ] 로 괄호 찾기가 가능하지만 vi에서는 ctrl + ] 키는 ctags 가 설정
되어 있을경우 tags를 찾아 감으로 주의가 필요 합니다 )


같은 단어 찾기


-> 찾고자 하는 단어에 커서를 위치 시킨후 (단어내 어디든 무관) 명령모드에서 * 입력
같은 단어가 찾아 집니다  일반 /검색후 찾아 가듯이 n 다음 단어 ctrl + n 뒤로 가실수 있습니다



정렬 하기


위에 블록 지정으로 정렬 하기가 강력해서 그것만으로도 충분하지만
전체 정렬하기 등 몇가지 tip을 살펴 보겠습니다


들여쓰기 , 내어쓰기


라인수 >>, << 입력으로 들여쓰기 및 내어 쓰기를 할수 있습니다



정렬하기


함수 시작 { 에 커서를 위치 시킨후 명령모드(ESC누른상태) 에서 =100 을 누른후 방향키를 이동
해보시면 정렬이 되는걸 확인 할수 있습니다 특히 마우스 오른쪽을 눌러서 복사를 하게 되면
자동으로 들여쓰기가 되면서 소스가 파도타기 처럼 엉망이 되기 쉬운데 이때 정말 효율적이죠
=100 은 { } 범위 안에서만 정렬이 됩니다
파일 전체에 범위를 주려면 명령모드에서 gg=G  입력후 방향키를 움직이면 정렬이 됩니다



둘다 명령모드에서 입력후 방향키를 입력 안하면 정렬이 됐지만 변경된거 확인 할수가 없는데.
방향키를 눌러서 커서를 이동 시키면 그때 실제 정렬이 이루어 집니다





마킹으로 이동하기


마킹으로 이동하는 방법은 주로 사용 하지는 않지만 vi가 지원하는 기능이므로 알아 보겠습니다
마킹에는 크게 3가지 종류가 있지만 주로 2가지만 사용 합니다


전역 마킹 (A ~ Z) -> 현재 파일을 포함한 다른 파일에서도 사용 가능 합니다
지역 마킹 (a ~ z) -> 현재 파일에서만 마킹이 가능 합니다



사용 형식


m[마킹 알파벳 (전역 대문자, 지역 소문자)] - 마킹하기


'[이동할 마킹 알파벳] -> 마킹된 위치로 이동하기



마킹하기는 사용하는 유저에 성향에 따라 편할수도 불현할수도 있습니다
저 같은 경우 불현해서 잘 쓰지 않지만.. 편해서 쓰는 분도 있을테니까요..^^
출처 - 한빛미디어 - 유닉스 리눅스 프로그래밍 필수 유틸리티, 저자 -백창우-
책에 있는 내용지지만 급하게 볼때 책보단 정리된 파일이 편함으로 정리 삼아 만들어 봤습니다
안돼는게 있으면 댓글 달아주세요..

vi 파워유저로 거듭나기

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다