Windows의 Visual Studio 같은 통합 개발 환경(IDE)은 매우 편리하지만, 많은 개발 환경, 특히 서버는 그래픽 인터페이스(GUI)가 없는 터미널 기반의 리눅스로 운영된다.
따라서 터미널 환경에서 코드를 작성하고 컴파일하는 능력은 개발자의 기본 소양이다.
이번에 강의에서 UNIX를 다루게 되면서 처음엔 복사 붙여넣기도 제대로 못하고 Vim 모드에서 벗어나기도 힘들었다.
이처럼 윈도우에 익숙해진 나에게 어려운 점이 많아서 오래 기억하고 두고두고 볼 수 있도록 글을 써보려고한다.
Vim은 키보드만으로 모든 작업을 수행하는 터미널 기반의 강력한 텍스트 편집기이다.
최초의 유닉스용 화면 편집기이고 모든 유닉스/리눅스 시스템이 기본적으로 갖추고 있다.
Vim의 가장 큰 특징은 '모드(Mode)' 라는 개념이 있다는 것이다.
Vim을 효과적으로 사용하려면 아래 3가지 모드를 이해해야 한다.
명령 모드 (Normal Mode)
Vim을 실행했을 때의 기본 상태이다.
키를 입력하면 텍스트가 써지는 것이 아니라, 커서 이동, 내용 복사/붙여넣기, 삭제 등의 명령이 실행된다.
입력 모드 (Insert Mode)
실제로 텍스트를 입력하고 코드를 작성할 수 있는 모드이다.
명령 모드에서 i, a, o 등의 키를 눌러 진입할 수 있다.
이 모드에서 나가려면 ESC 키를 누르면 된다.
마지막 행 모드 (Command-Line Mode)
명령 모드에서 :(콜론) 키를 눌러 진입한다.
화면 맨 아래 줄에 명령어를 입력하여 파일 저장, 종료, 검색 등 강력한 기능을 수행한다.
hello.c 파일 작성하기1) Vim 실행 및 파일 생성
vim혹은 vi 명령어 뒤에 생성할 파일명을 입력한다. 파일이 존재하면 열리고, 없으면 새로 생성된다.
vi hello.c
실행하면 비어있는 화면이 나타나며, 현재는 명령 모드 상태이다.
2) 입력 모드로 전환
코드를 작성하기 위해 키보드에서 i 키를 누른다. 화면 하단에 -- 끼워넣기 -- 혹은 -- INSERT -- 라는 문구가 나타나면 입력 모드로 전환된 것이다.
3) 코드 작성
이제 자유롭게 C 코드를 작성할 수 있다.
#include <stdio.h>
int main(void)
{
printf("Hello, World!! \n");
return 0;
}

4) 저장 및 종료
코드 작성을 마쳤다면, 파일을 저장하고 Vim을 종료해야 한다.
ESC 키를 눌러 명령 모드로 돌아간다. (-- INSERT -- 문구가 사라진다.)
:(콜론)을 입력하여 마지막 행 모드로 전환한다.
원하는 명령어를 입력하고 Enter를 누른다.
:w : (Write) 현재 파일을 저장한다.
:q : (Quit) Vim을 종료한다. (저장되지 않은 변경 사항이 있으면 오류가 발생한다.)
:wq : 파일을 저장하고 종료한다. (가장 일반적으로 사용)
:q! : 변경 사항을 저장하지 않고 강제로 종료한다.
이제 터미널에 ls 명령어를 입력하면 hello.c 파일이 생성된 것을 확인할 수 있다.
GCC(GNU Compiler Collection)는 C, C++, Objective-C 등 다양한 언어를 컴파일할 수 있는 컴파일러 모음이며, 리눅스 환경의 표준 C 컴파일러이다. 컴파일이란 우리가 작성한 C언어 소스 코드(.c 파일)를 컴퓨터가 이해하고 실행할 수 있는 기계어 파일(실행 파일)로 변환하는 과정을 말한다.
hello.c 컴파일 및 실행하기1) 기본 컴파일
gcc 명령어 뒤에 컴파일할 소스 파일명을 입력한다.
gcc hello.c
컴파일 과정에서 오류가 없다면 아무런 메시지 없이 명령어 입력이 끝난다. ls 명령어로 확인해 보면 a.out이라는 파일이 새로 생성된 것을 볼 수 있다. 이 a.out이 바로 실행 파일이다.
2) 프로그램 실행
리눅스 터미널에서 현재 디렉터리에 있는 실행 파일을 실행하려면 파일명 앞에 ./를 붙여야 한다.
./a.out
실행 결과:
Hello, World!
3) 원하는 이름으로 실행 파일 생성 (-o 옵션)
a.out이라는 기본 이름 대신 원하는 이름으로 실행 파일을 만들고 싶을 때는 -o (output) 옵션을 사용한다.
#사용법: gcc -o [생성할 실행 파일명] [소스 파일명]
gcc -o hello hello.c
ls 명령어로 확인하면 a.out 대신 hello라는 이름의 실행 파일이 생성된 것을 볼 수 있다. 실행 방법은 동일하다.
./hello```
**실행 결과:**
Hello, World!
교수님께서도 처음에는 익숙하지 않을 수 있다고 적어놓고 쓰다보면 외워진다고 하셨다.
근데 평소엔 다른 IDE에서 개발하는 나에게는 실습때마다 도저히 안외워져서 정리해보겠다.
Vim을 처음 사용할 때 다른 것은 잊어버리더라도 아래 4가지만 기억하면 기본적인 문서 작성이 가능하다.
| 단계 | 명령어 | 설명 |
|---|---|---|
| 1. 파일 열기 | vim 파일명 | 터미널에서 Vim을 실행하며 파일을 연다. (새 파일 생성) |
| 2. 입력 시작 | i | 입력 모드로 전환하여 텍스트를 입력한다. |
| 3. 입력 종료 | ESC | 명령 모드로 돌아와 명령을 내릴 준비를 한다. |
| 4. 저장 및 종료 | :wq | 마지막 행 모드에서 파일을 저장하고 Vim을 종료한다. |
Vim의 기본 모드로, 키보드 입력이 명령으로 인식된다. ESC 키를 누르면 언제나 명령 모드로 돌아온다.
| 명령어 | 설명 |
|---|---|
h, j, k, l | 왼쪽, 아래, 위, 오른쪽으로 한 칸씩 이동한다. (방향키 역할) |
w | 다음 단어(word)의 시작으로 이동한다. |
b | 이전 단어(word)의 시작으로 이동한다. |
^ 또는 0 | 현재 줄의 맨 앞으로 이동한다. |
$ | 현재 줄의 맨 끝으로 이동한다. |
gg | 파일의 맨 첫 번째 줄로 이동한다. |
G | 파일의 맨 마지막 줄로 이동한다. |
[숫자]G | 지정한 숫자의 라인으로 바로 이동한다. (예: 15G -> 15번째 줄로 이동) |
| 명령어 | 설명 |
|---|---|
x | 현재 커서 위치의 글자 하나를 삭제한다. |
dw | 커서 위치부터 단어 하나를 삭제한다. |
dd | 현재 줄 전체를 삭제한다. |
[숫자]dd | 현재 줄부터 지정한 숫자만큼의 줄을 삭제한다. (예: 5dd -> 5줄 삭제) |
r | 커서 위치의 글자 하나를 다른 글자로 변경한다. (r 누르고 바꿀 글자 입력) |
cw | 커서 위치부터 단어 하나를 지우고 바로 입력 모드로 전환한다. |
cc 또는 S | 현재 줄 전체를 지우고 바로 입력 모드로 전환한다. |
| 명령어 | 설명 |
|---|---|
yy 또는 Y | 현재 줄 전체를 복사(Yank)한다. |
[숫자]yy | 현재 줄부터 지정한 숫자만큼의 줄을 복사한다. (예: 3yy -> 3줄 복사) |
p | 복사한 내용을 현재 커서의 아래에 붙여넣기(Put)한다. |
P | 복사한 내용을 현재 커서의 위에 붙여넣기(Put)한다. |
| 명령어 | 설명 |
|---|---|
u | 이전 명령을 취소한다. (Undo) |
Ctrl + r | 취소했던 명령을 다시 실행한다. (Redo) |
. | 바로 직전에 실행했던 명령을 반복한다. |
| 명령어 | 설명 |
|---|---|
i | 현재 커서 앞(왼쪽)에서 입력을 시작한다. |
a | 현재 커서 뒤(오른쪽)에서 입력을 시작한다. |
o | 현재 줄의 아래에 새 줄을 만들고 입력을 시작한다. |
O | 현재 줄의 위에 새 줄을 만들고 입력을 시작한다. |
ESC | 명령 모드로 돌아간다. |
명령 모드에서 :(콜론)을 입력하여 진입한다. 화면 하단에 명령어를 입력하여 파일 제어, 검색, 설정 변경 등을 수행한다.
| 명령어 | 설명 |
|---|---|
:w | 파일을 저장한다. (Write) |
:w 파일명 | 다른 이름으로 파일을 저장한다. (Save As) |
:q | Vim을 종료한다. (Quit) |
:wq | 파일을 저장하고 종료한다. |
:q! | 변경 내용을 무시하고 강제로 종료한다. |
| 명령어 | 설명 |
|---|---|
/[검색어] | 아래 방향으로 검색어를 찾는다. n (다음 찾기), N (이전 찾기) |
?[검색어] | 위 방향으로 검색어를 찾는다. n, N 키는 동일하게 동작한다. |
:%s/[찾을내용]/[바꿀내용]/g | 파일 전체(%)에서 '찾을내용'을 '바꿀내용'으로 모두(g) 바꾼다. |
:%s/[찾을내용]/[바꿀내용]/gc | 바꿀 때마다 사용자에게 확인(confirm)을 받는다. |
| 명령어 | 설명 |
|---|---|
:set number | 줄 번호를 표시한다. (축약형: :set nu) |
:set nonumber | 줄 번호를 숨긴다. (축약형: :set nonu) |
:set autoindent | 자동 들여쓰기 기능을 활성화한다. |
한번에 다 외울수는 없겠지만 실습때나 Vi 편집기를 사용할때 켜놓고 최대한 기능을 많이 써보며 IDE를 쓸때만큼 편리하게 쓸 수 있도록 여러 명령어들에 익숙해져야겠다.
사용할줄 아는 수준에서 더 나아가 여러 명령어들이 익숙해져 나중에는 VIM 모드가 더 편할 정도의 수준이 되어서 마우스 없이 나의 생각을 그 즉시 키보드로 빠르게 칠 수 있는 수준의 개발자가 되고싶다.