
Vim는 CLI(Command Line Interface) 환경에서 동작하는 텍스트 에디터이다.
우리가 윈도우에서 사용하던 메모장은 GUI(Graphic User Interface) 기반의 텍스트 에디터이다.
우분투 22.04 LTS를 설치한 뒤 한글 설정을 한 뒤 거의 처음으로 시작하는 리눅스 공부이다!! 😆
먼저 실습을 진행할 디렉토리를 mkdir 명령어를 이용해 생성하고, 해당 디렉토리로 이동하자.

이제, 텍스트 파일을 생성해보자. 텍스트 파일 생성은 다음과 같이 할 수 있다.
vi [FILENAME]
# vi와 vim은 다르지만, 요즘 대부분의 UNIX와 LINUX 배포판에서는 터미널에 vi를 입력하면
# vim의 vi 호환모드가 나타나게 설계되어 있다.
필자는 test.txt라는 텍스트 파일을 생성하였다.
그러면 이렇게 새 텍스트 파일이 생기게 된다.
vi에는 mode가 존재한다. 총 4가지의 mode가 있으며, 각각의 모드는 다음과 같다.
Normal Mode
처음 실행한 상태. 모드 변환 시 항상 이 Normal Mode를 거쳐야 한다.Insert Mode
I,i,A,a,O,o를 누르면 진입하는 모드로, 해당 모드에서 입력이 가능하다.Command Mode
Normal Mode에서:을 입력한 상태. 하단에 명령을 입력할 수 있다.Visual Mode
V또는Ctrl+V를 눌러서 블록 선택을 할 수 있는 상태.
mode에 대하여 알아보았으니, 다음은 vi에서 사용하는 명령어를 정리해 보자.
빈 파일을 생성하고 싶으면, 명령어 vi를 입력하면 된다.
vi
그러면 vi 에디터가 열리고, 이렇게 생성한 파일은 Command Mode에서 파일명을 정할 수 있다.

이 방법 이외에도, 앞에서 test.txt를 생성한 것처럼 vi 파일을 생성하거나 열 수 있다.
vi [FILENAME]
입력된 이름을 가진 텍스트 파일이 존재하지 않으면 해당 이름의 파일을 생성하고, 존재하면 파일을 연다.
내용 편집 후 vi 파일을 저장하거나 종료하기 위해서는 Command Mode로 변환하여 명령어를 입력해야 한다.
:q작업 내용이 없을 때 종료
:q!저장하지 않고 강제로 종료
:w저장
:w [FILENAME]저장 후 파일 이름 지정
:wq저장 후 종료
:wq!저장 후 강제 종료
:wq [FILENAME]저장 후 파일 이름 지정 뒤 종료
ZZ저장 후 종료 ( =:wq)
※ vi 에디터에서는 비정상 종료 시 .swp 파일이 생성되므로, 필요하지 않으면 삭제하자.
i현재 커서 위치 앞에 입력
a현재 커서 위치 뒤에 입력
o현재 커서 다음 행에 입력
I커서가 위치한 행의 첫 컬럼으로 이동하여 입력
A커서가 위치한 행의 마지막 컬럼으로 이동하여 입력
O현재 커서 이전 행에 입력
이중 i와 a를 가장 많이 사용하니 알아두자!
ESCNomal Mode로 모드 변환
기본적으로 화살표를 사용하여 이동 가능하지만 h, j, k, l를 화살표 대신 사용할 수 있다.
( 화살표 대신 h, j, k, l를 사용하도록 연습하자!! )
< Nomal Mode에서 사용 가능 >
←,h왼쪽으로 한 칸 이동
↓,j아래로 한 칸 이동
↑,k위로 한 칸 이동
→,l오른쪽으로 한 칸 이동
한 칸씩이 아닌 단어를 기준으로, 줄을 기준, 혹은 문서를 기준으로 이동하는 것도 가능하다.
< Nomal Mode에서 사용 가능 >
w다음 단어의 첫 칸으로 이동
b이전 단어의 첫 칸으로 이동
^,0현재 줄의 첫 칸으로 이동
$현재 줄의 마지막 칸으로 이동
:[NUMBER]NUMBER 번째 줄 첫 칸으로 이동 (예:77번째 줄 첫 칸으로 이동)
gg문서 첫 줄의 첫 칸으로 이동
G문서 마지막 줄의 첫 칸으로 이동
※ :[INDEX]는 예외로 Command Mode에서 사용한다.
삭제된 내용은 buffer에 저장되어 붙여넣기가 가능하다. (잘라내기라고 보아도 무방)
< Nomal Mode에서 사용 가능 >
x현재 커서의 앞 글자 삭제
[NUMBER]x커서 위치를 포함해서, NUMBER 글자만큼 삭제
X현재 커서의 글자 삭제
dw커서를 기준으로 뒤에 있는 단어 글자 삭제 (커서 포함)
[NUMBER]dw커서를 기준으로 뒤에 있는 단어 NUMBER개 삭제 (커서 포함)
db커서를 기준으로 앞에 있는 단어 글자 삭제 (커서 미포함)
[NUMBER]db커서를 기준으로 앞에 있는 단어 NUMBER개 삭제 (커서 미포함)
dd현재 줄 삭제
[NUMBER]dd현재 줄부터 NUMBER 줄만큼 삭제(현재 줄 포함)
D현재 커서의 글자부터 현재 줄의 마지막까지 삭제
※ 커서 기준이란??
예를 들어 I wanna be a linux programmer 이라는 문장에서, 커서가 linux의 n에 있다고 하자.
이 상태에서 명령어 dw를 사용하게 되면 n을 포함한 커서 뒤의 단어 nux가 사라지게 된다.
그 결과 문장은 I wanna be a liprogrammer가 될 것이고, 커서는 p의 자리에 위치하게 될 것이다.
같은 방식으로, 앞의 예제에서 db를 사용하게 되면 n을 제외한 커서 앞의 단어 li가 사라지게 된다.
그 결과 문장은 I wanna be a nux programmer가 될 것이고, 커서는 그대로 n의 자리에 위치한다.
같은 텍스트를 여러 번 입력해야 할 때, 복사 및 붙여넣기를 이용하면 편리하다.
< Nomal Mode에서 사용 가능 >
복사
yy현재 줄을 복사
[NUMBER]yy현재 위치부터 NUMBER 개의 줄을 복사
yw커서를 기준으로 뒤에 있는 단어 복사 (커서 포함)
[NUMBER]yw커서를 기준으로 뒤에 있는 단어 NUMBER 개 복사 (커서 포함)
yb커서를 기준으로 앞에 있는 단어 복사 (커서 미포함)
[NUMBER]yb커서를 기준으로 앞에 있는 단어 NUMBER 개 복사 (커서 미포함)
붙여넣기
p현재 커서의 글자 삭제
P현재 줄부터 NUMBER 줄만큼 삭제(현재 줄 포함)
< Nomal Mode에서 사용 가능 >
/[String]문서의 앞에서부터 해당 문자열을 검색
?[String]문서의 뒤에서부터 해당 문자열을 검색
n다음 검색
N이전 검색
:%s/oldString/newString각 행의 첫 oldString을 NewString으로 치환
:%s/oldString/newString/g문서의 모든 oldString을 NewString으로 치환
:%s/oldString/newString/gc문서의 모든 oldString을 사용자에게 하나씩 확인해가며 NewString으로 치환
윈도우에서 Ctrl+Z로 명령을 취소하는 것처럼, Vim에서도 명령을 취소할 수 있는 커맨드가 존재한다.
u명령 취소
U현재 줄의 모든 명령 취소
< Command Mode에서 사용 가능 >
:set nu행 인덱스 나타내기
:set nonu행 인덱스 숨기기
실습 중에 undo 명령을 위해 u 키워드를 입력하였는데, 한 번은 undo가 잘 되었지만 연속으로 undo를 하게 되면 undo 명령을 다시 undo하여 결과적으로 redo하는 현상이 발생하였다.
그 이유에 대하여 구글링도 해보고 열심히 찾아보았지만 찾을 수 없었다..
그러다 help 명령어를 입력하였더니 내가 사용하고 있던 게 vim-tiny였다고 한다 😅
혹시 ubuntu를 처음 깔아 바로 vi를 실습하였다면 자신이 사용하고 있는 게 vim-tiny인지 확인해보도록 하자!
필자는 다음 명령을 터미널에서 실행하여 vim-tiny를 삭제하였다.
sudo apt-get remove vim-tiny
이후, vim 설치를 위하여 다음 명령을 실행하였다.
sudo apt-get install vim
그랬더니.. undo가 정상적으로 실행된다!!! 😆