1) vi 시작:

   . $vi fname
       vi                                                vi편집기를 호출한다.
        vi filename                                기존에 있는 파일이면 그 파일을 열고 없는 파일이면 새로 만든다.
        vi + 10filename                        지정화일의 10번째 행부터 화일열기
        vi +/"school" filename  지정화일내의 school이란 단어가 처음나오는 시점부터 열기
        vi -r filename                        손상된 파일을 복구
        view filename                        수정없이 읽기전용으로 열기
        vi filenames                        여러 파일명이나 와일드카드(*,?)로 여러 파일을차례로 불러 편집할 수 있다.(':n' next)

2) 명령모드: 커서의 이동, 글자/단어/줄의 삭제나 블럭의 설정 등

   . 입력이 아닌 상태.
   . 작업 중 언제든지 를 누르면 명령모드가 된다.

3) 입력모드: 키보드로 입력되는 모든 글자가 입력되는 상태.

   . 입력모드(Insert mode) 들어가기 : 'i'나 'a'(커서 다음에 입력)
     화면 하단에 "Insert" 표시 됨(표시가 안되는 화면도 있음).
   . 입력모드에서는 커서를 이동시킬 수 없다.
     다만 버젼과 환경에 따라 화살표 키(-> <- up, down)로 이동이 되는 경우도 있음.   . 입력모드 나가기(exit):
   . 다음줄 입력 : 'o'
                a                                 커서 오른쪽에 문자삽입
                A                                 커서 오른쪽, 행의끝에 문자삽입
                i                                 커서 왼쪽에 문자삽입
                I                                 커서왼쪽, 행의 처음에 문자삽입
                o                                 커서 아래에 행 삽입
                O                                 커서 위에 행 삽입

4) Cursor 이동: up 'k', down 'j', left 'h', right 'l'

   * 명령모드에서만 사용하여야 함.
                h                                 왼쪽으로 이동
                j                                아래로 이동
                k                                위로 이동
                l                                 오른쪽으로 이동
                w                                 한단어 오른쪽으로이동
                b                                 한단어 왼쪽으로 이동
                Return                         한행아래로 이동
                Backspace                 한문자 왼쪽으로 이동
                Spacebar                 한문자 오른쪽으로 이동
                H                                 화면의 맨위로 이동
                M                                 화면의 중간으로 이동
                L                                 화면의 맨 아래로 이동
                ^F                                 한화면 앞으로 이동
                ^D                                 반화면 앞으로 이동
                ^B                                 한화면 뒤로 이동
                ^U                                 반화면 뒤로 이동

5) 삭제:
                x                                문자삭제
                dw                                단어삭제
                dd                                행 삭제
                D                                커서 오른쪽 행 삭제
                :5,10 d                         5-10째 행 삭제

6) 수정:

   . Modify 1 letter 'r' 화면 하단에 "Replace" 표시 됨.
   . Modify multi letters 'R'
                cw                                단어 변경
                cc                                행 변경
                C                                커서 오른쪽의 행 변경
                s                                커서가 위치한 문자열 대체
                r                                커서 위치 문자를 다른 문자로 대체
                r-Return                 행 분리
                J                                현재 행과 아래 행 결합
                xp                                커서 위치 문자와 오른쪽 문자교환
                -                                문자형(대,소문자) 변경
                u                                이진 명령 취소
                U                                행 변경 사항 취소
                :u                                이전의 최종행 취소

8) 텍스트 복사 및 이동
                yy                                현재 커서가 있는 행의 전체 복사
                Y                                행 yank(버퍼에 복사)
                yw                                현재 커서가 있는 단어 복사
                y$                                현재 커서가 있는 곳에서 그 행의 끝까지 복사
                y^                                현재 커서가 있는 곳에서 그 행의 시작까지 복사
                p                                yank 되거나 삭제된 행을 현재 행 아래에 삽입
                P                                yank되거나 삭제된 행을 현재 행 위에 삽입
                :1,2 co 3                1-2행을 3행 다음으로 복사
                :4,5 m 6                4-5행을 6행 다음으로 이동

9) 행 찾기 및 각 행마다 번호 표시
                G                                파일의 마지막 행으로 가기
                12G                                파일의 12번째 행으로 가기
                :set nu                        행번호 표시
                :set nonu                행번호 숨기기

10) 단어나 문장 찾기 및 바꾸기
                /string/                 string탐색
                ?string?                  string 역 방향 탐색
                n(N)                         string의 다음(이전) 계속 탐색
                :g/search-string/s//replace-string/gc 각 발생 탐색후 확인하고 대체
                :s/str/rep/         현재 행의 str을 rep로 대체
                :1,.s/str/rep/         1부터 현재 행의 str을 rep로 전부 대체
                :%s/str/rep/g         파일 전체 str을 rep로 전부 대체

11) 마크 설정과 마크 호출
        . 문자 'm' 다음에 마크 이름으로 'a'에서 'z' 사이의 문자 하나를 선택한다.
                  예) 'a'라는 이름으로 마크 설정: ma

    . 이동이나 호출은 '(single quotation mark)후 'a'에서 'z' 사이의 문자 하나를 선택 한다.
                     예) 'a                설정된 마크 'a'로 이동
                     예) :'a, d        마크 a에서부터 현재 커서가 있는 줄까지 삭제.

12) Buffering(특정 이름의 버퍼에 저장)
    . "(a-z)nyy                (a-z)라는 이름의 버퍼에 n줄 저장
              예) "a5yy                'a'라는 이름의 버퍼에 현재 줄부터 5줄을 저장.
    . "(a-z)p                (a-z)버퍼의 내용을 다음 줄에(p) 넣음.

13) 다른 파일 삽입
                :r filename         커서 다음에 파일 삽입
                :20 r filename         파일을 20번째 행 다음에 삽입

14) 단축 단어나 키(abbreviation) 사용법
    . :ab 약어(단축단어나 키) 바꿀 단어나 키
              예) :ab WW w!?/tmp/test        ':WW'명령 /tmp/test'로 저장.
              예) :ab inp internet programming
          입력모드에서 'inp'를 넣고 빈칸이나 줄바꿈 등을 치면 'internet programming'으로바뀐다.

15) 현재 로드된 파일 정보
           . Refresh(다시 보기) '^L'
           . Current information(파일 정보) '^G'
           . Search a word(찾기) '/word'
           . Search again(다시 찾기) 'n'
           . 현재 설정된 vi 환경보기 ':set'

16) Undo(실행 취소) 'u'

17) Repeat(실행 반복) '.'

18) 일련의 명령들을 하나의 명령으로 만들기
            :map (a-z,A-Z) 명령들
                    예) :map z ncwPARK^[  'z' 명령으로 앞에서 찾은 단어('/단어' 실행)를 찾은(n) 후 해당 단어를 PARK로 바꾼다.('^['는 로 '^V'로 입력한다.)
                    예) :map Z dwwP        명령 'Z'는 현재 커서가 위치한 단어와 다음 단어를 맞바꾼다.

19) 저장:
   . 저장 ':w'
   . 'tt'라는 이름으로 저장 ':w tt'
   . 'tt'라는 이름의 파일이 이미 존재할 때에는 덮어쓰기(강제 save)의 의미로 '!'을 추가.  ':w! tt'
   . 현재의 파일로 저장하고 나가기(종료) 'ZZ', ':wq'
   . Vi 나가기 ':q'
   . 저장하지 않고 나가기 ':q!'
                :w         변경사항 저장
                :w filename 지정한 파일로 저장
                :wq         변경사항 저장후 vi종료
                ZZ         변경사항 저장후 vi종료
                :q!          변경사항을 저장하지 않고 vi종료
   . MS Windows OS에서 사용하는 Vim이나 윈도우 텍스트 편집기 등에서 작성된 문서는 다음줄(줄 바꾸기) 문자코드가 유닉스()와 다르다. DOS(Windows)텍스트 문서를 유닉스 vi로 보면 ^M로 보인다(DOS 형식인데 안 보일 수도 있음).
     문서를 저장하기 전에 :set로 보아 fileformat=unix 혹은 fileformat=dos로 저장 형식을 알 수 있다. 아래 환경설정 참조)
             :set fileformat=unix 한 후 저장하면 유닉스 형식으로 저장된다.
                     혹은 모든 '^M'코드를 삭제하면 유닉스형식이 된다. ':%s/^M//'        여기서 '^M'은 '^V^M'로 입력할 수 있다.
                :set fileformat=unix        저장시 유닉형식 설정.
                :set fileformat=dos        저장시 DOS 형식 설정.

20) Tips: 다음 과 ^L(refresh)를 자주 사용하시오!

21) 라인(줄) 편집 명령:
   . Line 명령은 ':'로 시작한다. 화면 하단에 ":" 표시.
   . :[n1,n2] command        [범위] 명령
             예1) Read and insert a file fnme('fname' 파일을 커서 앞에 끼워 넣기) ':r fname'
             예2) Cancel all modification and edit again(저장한 이후 모든 작업을 취소하고 다시 편집함) ':e!'

22) vi를 종료하지 않고 리눅스 명령어를 수행 할 수 있습니다.

            :!  '를 입력하고, 수행하기 원하는 명령어를 치면 됩니다.

            :!ls
            :!data
            :r  !date
            --> 명령을 실행하고 실행 결과를 현재 파일안에 삽입한다.


23) 환경 설정
   . :set  (set 의 관련 옵션 목록을 보고 싶으면 " set all " 입력을 하면 모두 나온다.)
     vi에서는 vi 환경변수로 다음의 옵션들을 사용할 수 있는데 :set 명령과 다음의 옵션을 함께
     사용하면 그 옵션이 설정되고, 이 옵션앞에 no라는 접두어가 붙으면 그 옵션의 설정이 해제된다.


        autoindent              modelines                        showmode
        autoprint               number                           slowopen
        autowrite               novice                           tabstop=4
        beautify                optimize                         taglength=0
        directory=/var/tmp      paragraphs=IPLPPPQPP LIpplpipnpb tags=tags /usr/lib/tags
        edcompatible            prompt                           tagstack
        errorbells              readonly                         term=sun-cmd
        noexrc                  redraw                           terse
        flash                   remap                            timeout
        hardtabs=8              report=5                         ttytype=sun-cmd
        ignorecase              scroll=17                        warn
        lisp                    sections=NHSHH HUuhsh+c          window=34
        list                    shell=/bin/csh                   wrapscan
        magic                   shiftwidth=4                     wrapmargin=0
        mesg                    showmatch                        writeany

        주요 vi 옵션 설명
        옵션                         약어                                 설명
        autoident                 ai                         새로운 각 행을 이전 행 또는 새로운 행이 생길 때 커서가 어떤        위치에 자동으로 인덴트되도록 한다. c 프로그래밍할 때 유리하다.
        autowrite                 aw                         다른 화일로 옮겨갈 명령을 실행하기 전 또는 쉘로 잠시 나오기 전에 현재 화일을 강제로 저장한다.
        autoprint                ap                        줄이 바뀔때 현재 줄을 화면상에 출력
        errobells                ed                        명령 에러가 발생시 삑 소리나게함
        ignorecase                 ic                         검색과 대치시 대소문자 구분을 무시한다.
        magic                                                 모든 정규식 문자를 사용할 수 있게 한다.
        mesg                                                 문서 편집 동안 메시지가 화면에 출력되는 것을 허용한다.
        number                         nu                        문서의 행에 행번호를 붙여 화면에 출력한다.
        report                        report                편집시 메세지를 보낼 편집변화 크기 지정
        showmatch                 sm                         닫기 괄호 사용시 일치하는 여는 괄호 표시
        showmode                                         상태 행에 현재 편집 모드를 출력한다.
        wam                                wam                        저장 하지 않고 종료시 경고 메세지 나오게 함
        wrapscan                 ws                         vi가 매번 화일 전체를 검색하도록 한다. 검색은 항상 현재 행부터 시작해서 화일의 끝으로 진행된다.
        tabstopp=n                 ts=n                탭 공백을 n 수만큼 지정
        wrapmargin=n        wm=n                 텍스트 오른쪽 여백을 n 수만큼 지정




        예1) 문서의 각행에 행번호를 출력하는 예제
             :set number
        예2) 행번호 출력을 해제하는 예제
             :set nonumber
        예3) 현재 vi 모드를 출력하는 예제
             :set showmode



이 문서는 http://blog.naver.com/ahndongju?Redirect=Log&logNo=100034622313 (아봉님)
에서 가져와 나름대로 수정하고 추가 하였습니다.

태그: *리눅스 *초보