---
category: tool
tool: vim
contributors:
    - ["RadhikaG", "https://github.com/RadhikaG"]
translators:
    - ["Wooseop Kim", "https://github.com/linterpreteur"]
filename: LearnVim-kr.txt
lang: ko-kr
---

[Vim](www.vim.org)
(Vi IMproved)은 유닉스의 인기 있는 vi 에디터의 클론입니다. Vim은 속도와 생산성을 위해
설계된 텍스트 에디터로, 대부분의 유닉스 기반 시스템에 내장되어 있습니다. 다양한 단축 키를 통해
파일 안에서 빠르게 이동하고 편집할 수 있습니다.

## Vim 조작의 기본

```
    vim <filename>   # vim으로 <filename> 열기
    :q               # vim 종료
    :w               # 현재 파일 저장
    :wq              # 파일 저장 후 종료
    :q!              # 저장하지 않고 종료
                     # ! *강제로* :q를 실행하여, 저장 없이 종료
    :x               # 파일 저장 후 종료 (짧은 :wq)

    u                # 동작 취소
    CTRL+R           # 되돌리기

    h                # 한 글자 왼쪽으로 이동
    j                # 아래로 한 줄 이동
    k                # 위로 한 줄 이동
    l                # 한 글자 오른쪽으로 이동

    # 줄 안에서의 이동

    0                # 줄 시작으로 이동
    $                # 줄 끝으로 이동
    ^                # 줄의 공백이 아닌 첫 문자로 이동

    # 텍스트 검색

    /word            # 커서 뒤에 나타나는 해당 단어를 모두 하이라이트
    ?word            # 커서 앞에 나타나는 해당 단어를 모두 하이라이트
    n                # 해당 단어를 검색 후 다음으로 나타나는 위치로 이동
    N                # 이전에 나타나는 위치로 이동

    :%s/foo/bar/g    # 파일 모든 줄에 있는 'foo'를 'bar'로 치환
    :s/foo/bar/g     # 현재 줄에 있는 'foo'를 'bar'로 치환

    # 문자로 이동

    f<character>     # <character>로 건너뛰기
    t<character>     # <character>의 바로 뒤로 건너뛰기 

    # 예를 들어,  
    f<               # <로 건너뛰기
    t<               # <의 바로 뒤로 건너뛰기
    
    # 단어 단위로 이동

    w                # 한 단어 오른쪽으로 이동
    b                # 한 단어 왼쪽으로 이동
    e                # 현재 단어의 끝으로 이동

    # 기타 이동 명령어

    gg               # 파일 맨 위로 이동
    G                # 파일 맨 아래로 이동
    :NUM             # 줄 수 NUM(숫자)로 가기
    H                # 화면 꼭대기로 이동
    M                # 화면 중간으로 이동
    L                # 화면 바닥으로 이동
```

## 모드

Vim은 **모드**의 개념에 기초를 두고 있습니다.

명령어 모드   - vim을 시작하면 처음에 이 모드입니다. 이동과 명령어 입력에 사용합니다.
삽입 모드     - 파일을 수정합니다.
비주얼 모드   - 텍스트를 하이라이트하고 그 텍스트에 대한 작업을 합니다.
실행 모드     - ':' 이후 명령어를 입력합니다.

```
    i                # 커서 위치 앞에서 삽입 모드로 변경
    a                # 커서 위치 뒤에서 삽입 모드로 변경
    v                # 비주얼 모드로 변경    
    :                # 실행 모드로 변경
    <esc>            # 현재 모드를 벗어나 명령어 모드로 변경

    # 복사와 붙여넣기

    y                # 선택한 객체 복사(Yank)
    yy               # 현재 줄 복사
    d                # 선택한 객체 삭제
    dd               # 현재 줄 삭제
    p                # 커서 위치 뒤에 복사한 텍스트 붙여넣기
    P                # 커서 위치 뒤에 복사한 텍스트 붙여넣기
    x                # 현재 커서 위치의 문자 삭제
```

## vim의 문법

Vim의 명령어는 '서술어-수식어-목적어'로 생각할 수 있습니다.

서술어     - 취할 동작 
수식어     - 동작을 취할 방식
목적어     - 동작을 취할 객체

'서술어', '수식어', '목적어'의 예시는 다음과 같습니다.

```
    # '서술어'
 
    d                # 지운다
    c                # 바꾼다
    y                # 복사한다
    v                # 선택한다

    # '수식어'

    i                # 안에
    a                # 근처에
    NUM              # (숫자)
    f                # 찾아서 그곳에
    t                # 찾아서 그 앞에
    /                # 문자열을 커서 뒤로 찾아서
    ?                # 문자열을 커서 앞으로 찾아서

    # '목적어'

    w                # 단어를
    s                # 문장을
    p                # 문단을
    b                # 블락을
    
    # 예시 '문장' (명령어)

    d2w              # 단어 2개를 지운다
    cis              # 문장 안을 바꾼다
    yip              # 문단 안을 복사한다
    ct<              # 여는 괄호까지 바꾼다
                     # 현재 위치에서 다음 여는 괄호까지의 텍스트를 바꾼다
    d$               # 줄 끝까지 지운다
```

## 몇 가지 트릭

        <!--TODO: Add more!-->
```
    >                # 선택한 영역 한 칸 들여쓰기
    <                # 선택한 영역 한 칸 내어쓰기
    :earlier 15m     # 15분 전의 상태로 되돌리기
    :later 15m       # 위의 명령어를 취소
    ddp              # 이어지는 줄과 위치 맞바꾸기 (dd 후 p)
    .                # 이전 동작 반복
    :w !sudo tee %   # 현재 파일을 루트 권한으로 저장
```

## 매크로

매크로는 기본적으로 녹화할 수 있는 동작을 말합니다.
매크로를 녹화하기 시작하면, 끝날 때까지 **모든** 동작과 명령어가 녹화됩니다.
매크로를 호출하면 선택한 텍스트에 대해 정확히 같은 순서의 동작과 명령어가 실행됩니다.

```
    qa               # 'a'라는 이름의 매크로 녹화 시작
    q                # 녹화 중지
    @a               # 매크로 실행
```

### ~/.vimrc 설정

.vimrc 파일은 Vim이 시작할 때의 설정을 결정합니다.

다음은 ~/.vimrc 파일의 예시입니다.

```
" ~/.vimrc 예시
" 2015.10 

" vim이 iMprove 되려면 필요
set nocompatible

" 자동 들여쓰기 등을 위해 파일 명으로부터 타입 결정
filetype indent plugin on

" 신택스 하이라이팅 켜기
syntax on

" 커맨드 라인 완성 향상
set wildmenu

" 대문자를 썼을 때가 아니면 대소문자 구분하지 않고 검색
set ignorecase
set smartcase

" 줄넘김을 했을 때 파일에 따른 들여쓰기가 켜져 있지 않다면
" 현재 줄과 같은 들여쓰기를 유지
set autoindent

" 좌측에 줄 번호 표시
set number

" 들여쓰기 설정 (개인 기호에 따라 변경)

" 탭 하나와 시각적으로 같을 스페이스 개수
set tabstop=4

" 편집할 때 탭 하나에 들어갈 스페이스 수
set softtabstop=4

" 들여쓰기 혹은 내어쓰기 작업(>>, <<)을 했을 때 움직일 스페이스 개수
set shiftwidth=4

" 탭을 스페이스로 변환
set expandtab

" 들여쓰기와 정렬에 자동 탭 및 스페이스 사용
set smarttab
```

### 참고 자료

[(영어) Vim 홈페이지](http://www.vim.org/index.php)

`$ vimtutor`

[(영어) vim 입문과 기초](https://danielmiessler.com/study/vim/)

[(영어) 엄마가 말해주지 않은 Vim의 어두운 구석들 (Stack Overflow 게시물)](http://stackoverflow.com/questions/726894/what-are-the-dark-corners-of-vim-your-mom-never-told-you-about)

[(영어) 아치 리눅스 위키](https://wiki.archlinux.org/index.php/Vim)
