# Vi / Vim 에디터
텍스트 편집기는 프로그래밍에서 중요한 도구 중 하나이다. 그중에서도 `Vi` 및 `Vim`은 강력한 기능을 제공하며, CLI(명령줄 인터페이스) 환경에서 효율적으로 텍스트 작업을 수행할 수 있게 한다.
`VI`는 Unix 기반 운영체제에서 처음 소개된 텍스트 편집기로, 간단하면서도 강력한 기능을 제공한다. `VIM`은 "Vi IMproved"의 약자로, VI의 기능을 확장하여 더 많은 기능을 제공한다. VIM은 무료로 제공되며, 다양한 플랫폼에서 사용할 수 있다.
이 에디터는 진입장벽이 높은 편이지만, 마우스를 사용하지 않고 키보드만으로 텍스트를 효율적으로 편집할 수 있게 해주기 때문에 익숙해지기만 한다면 아주 효율적으로 텍스트를 편집할 수 있다.
## Vim 을 사용하는 이유
현대에는 많은 좋은 텍스트 편집기가 존재한다. 그럼에도 불구하고 `Vim`을 사용하는 이유는 다음과 같다.
1. CLI 환경에서 사용 가능: `Vim`은 CLI 환경에서도 사용 가능하다. 따라서 원격 서버에 접속하여 텍스트 파일을 편집할 때도 편리하다.
2. 다양한 플랫폼에서 사용 가능: `Vim`은 다양한 플랫폼에서 사용 가능하다. 따라서 어떤 환경에서도 일관된 환경에서 텍스트 편집을 수행할 수 있다.
3. 별도의 설치 없이 사용 가능: 대부분의 Unix 기반 운영체제에는 기본적으로 `Vim`이 설치되어 있다. 따라서 별도의 설치 없이 바로 사용할 수 있다. (윈도우에서는 별도의 설치가 필요하다)
서버는 주로 CLI 환경인 경우가 많고, 이 환경에서 텍스트 파일을 편집할 때 `Vim`은 매우 유용하다. 따라서 서버 관리자나 개발자들은 `Vim`을 익히는 것이 좋다.
## Vi의 세 가지 모드

Vi 에디터는 기본적으로 세 가지 모드로 작동한다
| 모드 | 설명 |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| 일반 모드 (Normal Mode) | Vi/Vim을 실행하면 기본적으로 이 모드에 진입한다. 텍스트를 편집할 때 명령어를 입력하거나 이동 작업을 수행할 수 있다. |
| 입력 모드 (Insert Mode) | 텍스트를 입력할 때 사용하는 모드이다. `i` 키를 누르면 이 모드로 전환할 수 있다. 입력 모드에서는 일반적인 텍스트 에디터와 유사하게 입력할 수 있다. |
| 명령 모드 (Command Mode) | `:` (콜론)을 입력하면 명령 모드로 전환된다. 이 모드에서는 저장, 종료 등 다양한 명령어를 사용할 수 있다. |
> 이 외에도 비쥬얼 모드 (Visual Mode), 선택 모드 (Select Mode) 등 다양한 모드가 존재하지만, 여기서는 주로 사용되는 세 가지 모드에 대해서만 다룬다.
## Vi 열기
Vi로 텍스트 파일을 열 때는 다음과 같이 명령어를 입력한다.
```bash
vi filename
```
이 외에도 다양한 열기 방법들이 있다.
| 명령어 | 설명 |
| ------------------------------ | ----------------------------------------------------------- |
| `vi {filename}` | 새로운 파일을 열 때 사용한다. |
| `vi -r {filename}` | 이전에 작업하던 파일을 열 때 사용한다. |
| `vi +{line_number} {filename}` | 지정한 라인부터 파일을 열 때 사용한다. |
| `vi +/{pattern} {filename}` | 지정한 패턴을 검색하여 해당 라인부터 파일을 열 때 사용한다. |
## Vi 커서 이동
Vi 에디터에서는 다양한 방법으로 커서를 이동할 수 있다.
가장 일반적인 방법은 `h`, `j`, `k`, `l` 키를 사용하는 방법이다.

`h` 키는 왼쪽으로, `j` 키는 아래로, `k` 키는 위로, `l` 키는 오른쪽으로 커서를 이동시킨다.
이 외에도 다양한 방법으로 커서를 이동할 수 있다. 주로 사용되는 몇 가지 방법들은 다음과 같다.
| 키 | 설명 |
| ---------------- | ------------------------- |
| `h` | 왼쪽으로 이동 |
| `j` | 아래로 이동 |
| `k` | 위로 이동 |
| `l` | 오른쪽으로 이동 |
| `w` | 다음 단어로 이동 |
| `b` | 이전 단어로 이동 |
| `0` | 현재 라인의 처음으로 이동 |
| `$` | 현재 라인의 끝으로 이동 |
| `gg` | 파일의 처음으로 이동 |
| `G` | 파일의 끝으로 이동 |
| `{line_number}G` | 지정한 라인으로 이동 |
| ... | ... |
## Vi 텍스트 편집
커서를 이동하였다면, 이제 원하는 텍스트를 편집할 차례이다.
Vi 에디터에서 텍스트를 편집하기 위해서는 입력 모드로 전환해야 한다. 입력 모드는 일반 모드에서 특정 키를 눌러서 전환할 수 있다.
| 키 | 설명 |
| --- | ---------------------------------------- |
| `i` | 현재 커서 위치에서 입력 모드로 전환 |
| `a` | 현재 커서 다음 위치에서 입력 모드로 전환 |
| `o` | 현재 커서 다음 라인에서 입력 모드로 전환 |
| `I` | 현재 라인의 처음에서 입력 모드로 전환 |
| `A` | 현재 라인의 끝에서 입력 모드로 전환 |
| `O` | 현재 커서 이전 라인에서 입력 모드로 전환 |
입력 모드로 전환하면 일반적인 텍스트 에디터와 유사하게 텍스트를 입력할 수 있다. 사용자는 일반 모드와 입력 모드를 자유롭게 전환하면서 텍스트를 편집할 수 있다.
## 명령 모드
일반적인 텍스트 편집은 일반 모드와 입력 모드로 충분하다. 그러나 Vi 에디터는 명령 모드를 제공하여 다양한 명령어를 사용할 수 있다.
명령모드는 일반 모드에서 `:` (콜론)을 입력하면 전환할 수 있다.
그러면 하단에 `:` 문자가 나타나며, 다양한 명령어를 입력할 수 있다. 이 명령어를 통해 파일 저장, 종료, 검색 등 다양한 작업을 수행할 수 있다.
| 명령어 | 설명 |
| --------------------------- | --------------------------------------------------- |
| `:w` | 저장 (Write) |
| `:q` | 종료 (Quit) |
| `:q!` | 강제 종료 (Quit). |
| `:wq` | 저장 후 종료 (Write & Quit) |
| `:wq!` | 강제 저장 후 종료 (Write & Quit) |
| `:w {filename}` | 다른 이름으로 저장하기 |
| `:set nu` | 라인 번호 표시 |
| `:set nonu` | 라인 번호 숨기기 |
| `:/{pattern}` | 지정한 패턴 검색 |
| `:n` | 다음 검색 결과로 이동 |
| `:N` | 이전 검색 결과로 이동 |
| `:s/{pattern}/{replace}/g` | 지정한 패턴을 지정한 문자열로 대체 |
| `:s/{pattern}/{replace}/gc` | 지정한 패턴을 지정한 문자열로 대체 (대체 여부 확인) |
| `:set ic` | 대소문자 구분 없이 검색 |
| `:set noic` | 대소문자 구분하여 검색 |
| ... | ... |
이 기능들은 아주 간단한 것들이지만, 이를 조합하면 다양한 작업을 수행할 수 있다. 또한 이 외에도 수많은 명령어들이 존재하므로, 필요할 때마다 찾아서 사용하면 된다.