...
VI / VIM 에디터
파일을 작성하거나 수정하기 위해서는 편집기가 필요하기 마련이다. 윈도우에서는 메모장을 편집기의 기본으로 지원하는 반면, 리눅스에서는 기본 편집기로 vi 편집기를 지원한다.
처음에는 단축키를 익혀야 하기 때문에 진입장벽이 높은 편이지만, 익숙해지기만 한다면 마우스로 하나하나 클릭하는것이 아닌 단축키만으로 모든 작업이 가능하기 때문에 더욱 더 빠르게 작업이 가능하다는 장점을 가진다.
VIM은 Vi IMproved의 약자 이다. 즉, vi에디터를 업그레이드 시킨 것이 vim에디터라고 생각하면 된다.
vi는 텍스트 편집에 필요한 최소한의 기능만을 가지고 있어서 사용하기 불편하다. 흔한 문법 강조 기능도 없다.
반면에 vim은 강력한 기능들이 많이 추가되어 있다. vim은 리눅스에서도 많이 쓰이지만 인텔리제이나 안드로이드 스튜디오 같은 최신 툴을 포함한 거의 모든 툴에 추가적으로 지원하는 경우가 많다. 따라서 vim은 거의 모든 터미널에서 지원하며 맥에서도 기본적으로 추가되어 있기도 하다.
리눅스에도 vim에디터가 설치되어 있다. 그래서 vi라고 쳐도 vim이라고 쳐도 vim으로 실행된다. 결론은 둘 다 똑같다고 보면 된다. 만일 설치가 안되어있으면 다음 명령어를 통해 설치가 가능하다.
$ apt install vim
VIM 환경설정
그대로 VIM을 써도 되지만, 기본적인 TAB에 대한 설정을 해주는 것이 좋다.
왜냐하면 다른 컴퓨터에서 받은 파일을 열때 tab사이즈가 뒤죽박죽이 될 수 있기 때문이다.
$ cd ~ # 사용자 홈으로 이동한다.
$ vi .vimrc # .vimrc 라는 vi환경설정 파일을 만든다.
vi 에디터를 열었으면, a나 i를 눌러 쓰기 모드로 변경하고, 다음 코드를 적는다.
set smartindent
set tabstop=4
set expandtab
set shiftwidth=4
코드를 다 적었으면, ESC를 누르고 :wq 를 치고 엔터를 누르면 vi 작성이 완료되고 에디터에서 나가진다.
방금 시행했던 이러한 일련의 과정들이 바로 vi에디터를 다룬 것이다. 윈도우에서 메모장을 다루는 것과 매우 다르다. 왜냐하면 마우스커서로 조작하는것이 아닌 키보드로 모든걸 조작해야 되기 때문이다.
VI 3가지 모드
vi 편집기는 명령모드, 입력모드, 마지막 행 모드로 총 3가지 모드로 구성되어있다. 흔히 사람들이 말하는 vi 명령어는 이 세가지 모드를 자유자재로 왔다갔다 하면서 코드나 글을 작성하는 것을 말한다.
모드 | 역할 및 특징 |
명령 모드 | vi를 실행시키면 가장 먼저 접하는 기본이 되는 모드로 커서의 이동, 수정, 삭제, 복사 붙이기, 탐색 등을 한다. 입력 모드 전환키인 i,a,o,I,A,O 등을 입력하면 입력 모드로 전환되고, 명령 모드로 다시 전환하려면 [Esc] 키를 누르면 된다. |
입력 모드 | 입력 모드 이외에도 편집 모드, input mode, insert mode 등으로 불리며, 글자를 입력하는 문서를 만드는 모드이다. 명령 모드에서 입력 전환키를 눌러서 전환하면 화면 아래에 '-- INSERT --'라고 표시된다. |
마지막 행 모드 | 명령 모드에서 ':'키를 입력했을 때 화면 맨 아랫줄에서 :______ 명령을 수행하는 모드로 저장, 종료, 탐색, 치환 및 vi 환경 설정 등의 역할을 하는 모드이다. |
vi 파일명 -> 명령모드진입 -> i 또는 a로 입력모드 진입
-> 작성 및 수정완료한 뒤 -> esc로 명령 모드진입
-> 콜론(:)으로 마지막 행 모드 진입 -> 저장(w), 종료(q), 취소(i), 저장 후 종료(wq)
vi를 비정상 종료하게 되면 swp 파일이 남게된다.
경고창에서 그냥 y 누르고 넘어가거나, ls -a로 숨긴파일을 확인하여 swp 파일 확인하고 삭제해주면 된다.
VI 명령어 정리
주로 쓰는 명령어는 가독성 좋게 진한 보라색으로 표기 하였다. 우선적으로 보라색 강조 표시한 키 부터 습득하는걸 추천하는 바다.
vi 열기 명령어
명령어 | 설명 | 예제 |
vi {파일명} | 파일열기, 작성 만일 존재하는 파일이면 수정 만일 존재하지 않는 파일이면 생성 |
$ vi test.txt |
vi +{행번호} {파일명} | 파일을 열고, 입력한 행으로 커서 이동 | $ vi -100 test.txt |
vi +/"{검색 문자열}" {파일명} | “문자열”의 처음발생 단어부터 열기 | $ vi -/"adc" test.txt |
vi –r {파일명} | 손상된 파일 회복 | $ vi -r test.txt |
view {파일명} | 읽기 전용으로 열기기 | $ view test.txt |
vi 커서 이동
커서 | 설명 |
h (←) | 왼쪽으로 커서 이동 |
j (↓) | 아래로 커서 이동 |
k (↑) | 위로 커서 이동 |
l (→) | 오른쪽으로 커서 이동 |
w | 오른쪽 한 단어의 끝 부분으로 커서 이동 |
e | 오른쪽 한 단어의 앞 부분으로 커서 이동 |
b | 왼쪽 한 단어의 앞 부분으로 커서 이동 |
W | 오른쪽 한 단어의 끝 부분으로 커서 이동 (띄어쓰기 기준이라 더 많이 커서 이동이 된다.) |
+ / Enter | 한 행 아래로 커서 이동 |
Back space | 한 문자 왼쪽으로 커서 이동 |
Space Bar | 한 문자 오른쪽으로 커서 이동 |
^ / 0 | 행의 맨 왼쪽으로 커서 이동 |
$ | 행의 맨 오른쪽으로 커서 이동 |
H | 화면의 맨 위로 이동 |
M | 화면의 중간으로 이동 |
L | 화면의 맨 아래로 이동 |
vi 화면 이동(스크롤)
커서 | 설명 |
Ctrl + u | 화면의 절반 만큼 위로 이동 |
Ctrl + d | 화면의 절반 만큼 아래로 이동 |
Ctrl + b / Page Up | 한화면 위로 이동 |
Ctrl + f / Page Down | 한화면 아래로 이동 |
Ctrl + y | 화면을 한 행 위로 이동 (마치 마우스로 스크롤 하는 것과 같음) |
Ctrl + e | 화면을 한 행 아래로 이동 (마치 마우스로 스크롤 하는 것과 같음) |
vi 입력 모드 명령어
커서 | 설명 |
i | 현재 커서 앞에서 입력 |
a | 현재 커서 뒤에서 입력 |
o | 현재 커서 아래 행에 개행하고 입력 |
I | 현재 커서 행의 처음에서 입력 |
A | 현재 커서 행의 끝에서 입력 |
O | 현재 커서 위 행에 개행하고 입력 |
vi 라인 이동 명령어
- 맨앞으로 - 1G / gg
- 맨뒤로 - G
명령어 | 설명 |
gg | 파일의 맨 처음 행으로 가기 |
G | 파일의 맨 마지막 행으로 가기 |
21G | 파일의 21번째 행으로 가기 |
Ctrl + G | 현재 File name과 커서의 라인 정보 |
:행번호 | 지정한 행번호로 커서를 이동 (마지막 행 모드) |
:$ | 파일의 마지막 행으로 커서를 이동 (마지막 행 모드) |
vi 내용 변경 명령어
명령어 | 설명 |
cw | 단어 변경 |
cc | 행 변경 |
C | 커서 오른쪽의 행 변경 |
s | 커서가 위치한 문자열 대체 |
S | 커서가 위치한 라인의 문자열 대체 |
r | 커서 위치 문자를 다른 문자로 대체 |
r-Enter | 행 분리 |
J | 현재 행과 아래 행 결합 |
xp | 커서 위치 문자와 오른쪽 문자 교환 |
~ | 문자형(대, 소문자) 변경 |
vi 내용 삭제 명령어
명령어 | 설명 |
x | 커서가 있는 문자 한글자 삭제 (반대인 del은 윈도우와 똑같다) |
nx | 커서가 있는 위치부터 n개의 문자를 삭제 |
dw | 현재 커서에 있는 한 단어 삭제 |
dd | 커서가 있는 라인(행) 삭제 |
ndd | 커서가 있는 라인부터 n개의 라인 삭제 |
db | 커서의 위치에서 거꾸로 한 단어 삭제 |
D | 커서 오른쪽 행 삭제 |
:5,10d | 5~10번째 행 삭제 |
vi 되돌리기 명령어
명령어 | 설명 |
u | 이전 명령 취소 (되돌리기) |
U | 행 변경 사항 취소, 이전의 최종 행 취소 |
. | 이전 최종 명령 반복 |
vi 복붙 및 이동 명령어
명령어 | 설명 |
yy | 커서가 위치한 줄 복사 |
Y | 행 yank 또는 복사 |
yh | 커서의 왼쪽 문자 복사 |
yl | 커서에 위치한 문자 복사 |
yi | 커서가 위치한 줄과 그 아랫줄 복사 |
yk | 커서가 위치한 줄과 그 윗줄 복사 |
p | 붙여넣기 (행 위로 삽입) |
P | 붙여넣기 (행 아래에 삽입) |
:1,2 co 3 | 1~2행을 3행 다음으로 복사 |
:4,5 m 6 | 4~5행을 6행 위로 이동 |
한줄 복사
해당 라인에서 'yy' 누르면 캐시에 저장이 된다.
붙여넣기를 원하는 곳으로 이동하여 'p'를 누르면 커서 다음 라인에 붙여넣기가 된다.
블럭 복사
'v'키를 누른 후 커서를 이동하여 블력을 설정한다.
(putty의 경우 블럭이 설정되는 모습이 보이나, ssh의 경우 블럭 모습이 나타나지 않으나 실제로는 설정되고 있다.)
원하는 부분을 블럭으로 설정한 뒤(설정 완료키는 없다) 'y'키를 누르면 캐시에 복사가 된다.
같은 방법으로 원하는 곳으로 이동하여 'p'를 누르면 커서 다음 라인에 붙여넣기가 된다.
vi 행 번호 표시
명령어 | 설명 |
:set nu 또는 :set number | 에디터의 각 행의 좌측에 행 번호 표시. |
:set nonu | 에디터의 각 행의 좌측 행 번호 숨기기 |
vi 검색 명령어
윈도우의 ctrl + f 기능이라 보면 된다.
명령어 | 설명 |
/{검색할 문자열} | 오른쪽 아래 방향으로 문자열 검색 |
?{검색할 문자열} | 왼쪽 위 방향으로 문자열 검색 |
n | 문자열의 다음으로 계속 검색 |
N | 문자열의 이전으로 계속 검색 |
vi 저장 및 종료
명령어 | 설명 |
:w | 변경사항 저장 |
:w {파일명} | 변경사항 입력한 파일명으로 저장 |
:wq | 변경사항 보관 후 vi 종료. ZZ 명령과 같음. :w(기록)과 :q(종료) 를 연속적으로 수행. |
ZZ | 변경사항 보관 후 vi 종료. 임시 버퍼의 내용을 vi로 호출할때 사용되었던 파일에 기록한 후 vi를 빠져나옴. |
:q! | 변경 내용을 저장하지 않고 종료 |
:q | 작업한게 없으면 그대로 종료 |
:e! | 마지막으로 저장했던 내용 이후의 수정한 것들을 취소하고 다시 편집상태로 |
vi 내용 바꾸기 명령어
윈도우의 ctrl + h 기능이라 보면 된다.
문자열을 바꿀때에는 마지막 행모드로 전환을 해야만 사용이 가능하다
명령 키 | 설명 |
:s/[대상문자열]/[바꿀문자열] | 커서가 위치한 행에서 첫번째로 나오는 대상문자열을 바꿀문자열로 치환 |
:%s[대상문자열]/[바꿀문자열] | 파일 전체에서 모든 대상문자열을 바꿀문자열로 치환 |
:[범위]s[대상문자열]/[바꿀문자열] | 범위 내 모든 각 행에서 첫번쨰로 나오는 대상문자열을 바꿀문자열로 치환 |
:[범위]s[대상문자열]/[바꿀문자열]g | 범위 내 모든 행에서 대상문자열을 바꿀문자열로 치환 |
:[범위]s[대상문자열]/[바꿀문자열]gc | 범위 내 모든 행에서 대상문자열을 바꿀문자열로 바꾸되 수정할 지 여부를 묻는다 |
# 문자열 치환은 다음과 같은 구조로 이루어져 있다.
: [범위] / [매칭문자열] / [치환문자열] / [행범위]
#편집기 전체에서 old단어를 new단어로 replace한다.
: %s / old단어 / new단어 / g
#편집기 전체에서 old단어를 new단어로 replace하는데 확인하면서 replace할건지 물어본다
: %s / old단어 / new단어 / cg
:s/old/new # 현재 행의 처음 old를 new로 교체
:s/old/new/g # 현재 행의 모든 old를 new로 교체
:10, 20s/old/new/g # 10번째 행부터 20번째 행까지 모든 old를 new로 교체
:-3, +4s/old/new/g # 현재 커서 위치에서 3행 위부터 4행 아래까지 old를 new로 교체
:%s/old/new/g # 문서 전체에서 old를 new로 교체
:%s/old/new/gc # 문서 전체에서 old를 new로 확인하며 교체
:g/pattern/s/old/new/g # pattern이 있는 모든 행의 old를 new로 교체
vi 화면 정리
명령어 | 설명 |
Ctrl + l | 불필요한 화면정리 후 다시 표시 |
vi 파일 명령어
명령어 | 설명 | 예제 |
:r {파일명} | 커서 다음에 파일 삽입 | :r test.txt |
:{행번호} r {파일명} | 입력한 파일을 입력한 행번호 다음에 삽입 | :10 r test.txt |
vi 기타 명령어
문자 | 설명 |
. | 현재 line |
% | 전체 line |
$ | 파일 맨끝 line |
1,$ | % |
2,3 | 2 ~ 3 line |
vi 쉘 실행 명령어
보통 vi 코딩을 하고, :wq해서 저장하고 나가서 쉘을 실행하겠지만, 단순히 동작 테스트를 위해 계속 왔다갔다 하는것 보다, vi에서 쉘 명령을 실행하게 하고, 결과값을 확인하고 바로 자동으로 vi 에디터로 돌아오도록 할 수 있다.
단축키 | 기능 |
:! 셸명령 | vi 작업을 잠시 중단하고 셸 명령을 실행 (vi로 돌아오려면 Enter키 입력) |
:sh | vi 를 잠시 빠져나가 셸 명령을 실행 (vi 로 돌아오려면 exit명령어 입력) |
vi 코딩 명령어
단축키 | 기능 |
ctrl+wf | 헤더 열기 |
zf | 코드 접기 |
zi | 코드 접기 / 펴기 (토글) |
gg=G | 코드 들여쓰기 |
ctrl + p / ctrl + n | 코드 자동완성 |
헤더파일 열어 확인하기
헤더파일이 있는 라인에 ctrl+wf 를 누르면 헤더파일의 내용을 창분할로 볼 수 있다.
코드 접기 기능
코드가 너무 길어서 어느 함수 부분 내용을 접고싶다면 폴딩 기능을 사용할 수 있다.
편집기에서 v로 함수 모두를 선택하거나 v를 누르고 화살표로 선택을 한다.
그리고 '$'를 눌러 가장 맨 끝 줄로 이동하고 '%'를 눌러 함수 전체를 선택한다.
- zf : 폴딩하려면 함수가 모두 선택된 상황에서 zf를 누르면 된다.
- zi : 폴딩된 상태에서 함수를 보고 싶어서 피거나, 아니면 핀것을 다시 접으려면 zi를 입력하면 된다. 토글방식으로 접었다 폈다할 수 있다.
코드 들여쓰기 기능
한번에 들여쓰려면 gg=G 입력 하면 된다.
gg는 문서의 맨앞을 의미, G는 문서의 끝을 의미한다. =은 tab의 간격으로 들여쓰기 하라는 명령이다.
코드 자동 완성 기능
ctrl + p , ctrl + n 으로 IDE처럼 코드 자동완성 기능을 지원 한다.
둘의 차이는 어느쪽으로 펼쳐지느냐만 다를 뿐이다.
문자를 쓰는 편집 모드에서 ctrl + p, ctrl + n을 사용한다. (esc 누르고 사용하는게 아님)
# 참고자료
손에 잡히는 Vim - 인사이트
https://blockdmask.tistory.com/25
https://reakwon.tistory.com/182
https://potato-yong.tistory.com/132
https://tttap.tistory.com/m/216
https://coding-factory.tistory.com/505
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.