vi (visual editor)는 유닉스, 리눅스에서 가장 많이 사용하는 에디터이며, vim (vi improved)은 vi에 추가적 확장 기능을 부여한 에디터이다. 리눅스에서는 vim이 사용되며, 유닉스, 맥OSX, Windows도 지원한다.
리눅스 데비안 계열에서는 sudo apt -y install vim
로 설치할 수 있다.
vim을 실행하려면 아래와 같이 명령을 입력한다.
$ vim [파일명]
만약 vim example.txt
로 파일명을 지정한다면 해당 파일을 열거나 파일이 없다면 만들어 연다.
파일명을 -
으로 지정하면 표준 입력인 -stdin-
을 의미한다. find . -name "*.txt" | vim -
이면 find의 결괏값을 vim 에디터의 입력으로 주어 해당 파일을 만든다는 이야기이다.
vi에서는 일반(normal mode) / 입력(insert) / 명령행(command-line) 모드가 존재했으며, vim에서 비주얼(visual) 모드가 추가되어 마우스 대신의 드래그 기능 등이 가능하다.
빔을 처음 실행하면 normal mode이다. 문서의 편집(타이핑)을 할 때는 a
, i
, o
등를 눌러 전환할 수 있으며 ESC
를 누르면 다시 normal 모드로 돌아간다.
:
을 누르면 명령어를 입력할 수 있는 command-line 모드로 가고, ESC
누르면 다시 normal 모드로 전환된다.
normal 모드는 단축키를 쓸 수 있는 모드이다. 빔처럼 text-based는 GUI 메뉴가 없으므로 shor-cut(단축어)으로 기능을 구현해야 하기 때문에 normal 모드가 필요하다.
① normal → insert 전환 단축키
단축키 | 약어 | 설명 |
---|---|---|
a, A | append | a: 현재 커서 위치에서 한 칸 뒤로 이동한 뒤 입력 모드로 전환 |
A : 형재 행 끝에서 전환 | ||
i, I | insert | i: 현재 커서 위치에서 입력모드로 전환 |
I: 현재 행의 맨 앞에서 전환 | ||
o, O | open line | o: 현재 행 아래에서 새로운 행 하나 만들고 입력모드로 전환 |
O: 현재 행 위에 새 행을 만들고 전환 | ||
R | replace | 수정 모드로 작동. 모든 글자가 덧씌워짐 |
② force 명령: !
를 뒤에 더한다.
예를 들어 vim에서 저장 않고 나가려 한다면 맨 아래 라인에 경고 문구를 띄운다. 여기서 !
가 force 명령에서 붙이는 것으로, 강제로 해당 명령을 수행하게 된다.
③ cursor 이동
normal mode에서 화살표 키 대신 h
, j
, k
, l
을 사용해 커서를 이동할 수 있다. 순서대로 좌, 하, 상, 우를 뜻한다
명령어 앞에 반복수를 넣을 수 있는데, 수를 생략하면 1칸 씩 이동한다.
명령어 | 설명 |
---|---|
[#]h | 왼쪽으로 #칸 이동 |
[#]j | 아래로 #칸 이동 |
[#]k | 위로 #칸 이동 |
[#]l | 오른쪽로 #칸 이동 |
^ | 행의 맨 앞으로 이동 |
$ | 행의 맨 뒤로 이동 |
④ scroll 이동
명령어 | 약어 | 설명 |
---|---|---|
Ctrl - B = Page Up | Back-ward | 위로 한 화면 스크롤 |
Ctrl - F = Page Down | Fore-ward | 아래로 한 화면 스크롤 |
Ctrl - U | Up-ward | 위로 1/2 화면 스크롤 |
Ctrl - D | Down-ward | 아래로 1/2 화면 스크롤 |
⑤ 특정 행으로 이동 line number를 vim에 띄울 수 있기 때문에 특정 행을 지정해 이동할 수 있다.
명령어 | 설명 |
---|---|
:# | #행으로 이동 |
[#]gg | #행으로 이동. # 생략 시 1을 의미. 사실상 맨 첫행으로 이동할 때만 사용 |
[#]G | #행으로 이동. # 생략 시 끝 행을 의미. 사실상 끝 행으로 이동할 때만 사용 |
vi에서 삭제는 임시 버퍼(vim에서 ‘register’라고 부름)에 잘라내기로 작동한다.
명령어 | 설명 |
---|---|
x | 커서에 위치한 문자를 삭제. Delete 키와 동일 |
dd, :d | 현재 행 삭제 |
D | 현재 column 위치에서 현재 행의 끝까지 삭제. d$와 동일 |
J | 아래 행을 현재 행 끝에 붙이며, 아래 행 앞 공백은 제거. 행 뒤에 붙은 개행문자를 삭제하는 격 |
여기서도 숫자를 앞에 붙여 반복을 지정할 수 있으므로, 3dd
를 하면 dd
가 3번 반복한다
현재 커서가 문장의 맨 끝에 있다고 해도 x
를 누른다고 밑의 행이 올라오지 않고, backspace 키로 작동해 앞의 문자가 지워진다. 앞의 문자가 다 지워져도 뒷 문장이 올라오진 않는다.
반면 커서가 중간에 있다고 하더라도 J
를 누르면 해당 행 맨 뒤에 다음 행이 앞 공백을 한 칸 공백으로 바꾼 뒤 붙는다.
잘라내기 해서 버퍼에 저장된 내용을 붙여넣을 수 있다. vim에서는 paste를 ‘put’이라고 부른다.
명령어 | 설명 |
---|---|
p, :pu | 현재 행에 붙여넣는다. 개행 문자가 있는 경우에는 현재 행 아래에 붙여 넣는다. |
P | 현재 행의 위에 붙여넣는다 |
같은 원리로 5p
라면 다섯 번을 붙이게 된다.
아래는 행 단위로만 복사하는 명령어이다. 복사는 ‘yank’라고 한다.
명령어 | 설명 |
---|---|
yy, :y, Y | 현재 행을 레지스터에 복사한다. |
명령어 | 설명 |
---|---|
u | undo. 직전 명령 하나 취소 |
Ctrl - R | redo. 직전에 취소한 명령 재실행 |
.(dot) | 이전 명령어 반복. 같은 작업을 여러번 하게 될 때 사용한다. |
command-line 모드에서 범위를 지정해 명령할 수 있으며, 특정 행 범위의 삭제 및 편집에 편리하다. 범위 연산의 meta character은 아래와 같다.
기호 | 설명 |
---|---|
. |
현재 행 |
$ | 문서의 맨 마지막 행 |
% | 문서 전체 |
+# | 현재 위치에서 #만큼 아래 행 |
-# | 현재 위치에서 #만큼 위 행 |
#,# | 범위를 지정 |
사용 예시는 아래와 같다.
명령어 | 설명 |
---|---|
:#d | #번 행을 삭제 |
:#,#d | 지정한 행의 범위 부분을 삭제 |
:#,$d | #부터 마지막 행까지 삭제 |
:-#,+#d | 현재 행부터 위로 #행, 아래로 #행을 삭제 |
:%y | 문서 전체를 복사. % = 1,$ |
:.,+#y | 현재 행부터 아래로 #행을 복사 |
:#pu | #번 행에 레지스터의 내용을 붙여넣기 |
① 블록 지정 vim에 추가된 기능인 비주얼 모드는 마우스의 드래그 기능을 대신한다.
명령어 | 설명 |
---|---|
v | 일반 visual mode로 현재 커서 위치에서 블록 지정 |
V | visual line mode로, 현재 커서 위치 행에서 행 단위로 블록 지정 |
Ctrl - V | visual block mode로, 열 단위로 블록 지정 |
visual mode에서도 위에서 본 cursor key를 그대로 사용할 수 있으므로, v
를 누르고 GG
를 누르면 해당 커서 위치부터 행 끝까지 블록을 잡는다.
② 범위 지정 (range)
또한 비주얼 모드에서 range 연산은 :
으로 자동으로 하단에 나타난다. 만약 이어서 d
를 누른다면 블록 부분을 삭제한다.
② visual block (열 편집)
특정 열에 문자열을 삽입하거나 교체하는 경우 자주 사용하는 기능이다.
Ctrl-V
를 누른 뒤 editing(I, A, R, c 등)을 누르고 수정한 뒤, ESC
를 두 번 눌러 완료한다.
I(=insert), A(=append), c(=change), ~(=switch case)의 의미를 갖는다.
실습으로 예시를 보자.
우선 vim client.txt
로 편집기를 열고 insert 모드에서 해당 내용을 입력하고 normal 모드로 빠져나온다
gg
를 눌러 맨 첫 행으로 가기 → ^
눌러 행의 맨 앞으로 가기 → Ctrl-V
눌러 visual column 모드로 바꾸기 → G
눌러 맨 아래 행 가기 → I
눌러 insert로 바꾸기 → 0000
을 추가하기 → ESC
두 번 눌러 빠져나오기
순서대로 시행하면 아래 사진처럼 선택한 모든 행에 0000 이 앞에 추가된다.
vim의 종류에 따라 아래와 같이 종류가 있다.
각 기능별로 RedHat, Debian 계열별로 패키지 이름과 실행파일이 다르다.
가장 많이 사용하는 enhanced vim의 경우 RedHat계열은 vim-enhanced 이름의 패키지를, Debian 계열은 vim-nox 이름의 패키지를 가지며, 둘 다 vim
명령어로 실행한다.
패키지를 설치해보자. Debian 계열의 경우
sudo apt -y install vim-gnome
제거는 sudo apt -y --auto-remove remove vim-gnome
로 할 수 있다.
보통 예약 명령어(alias)로 vi
가 vim
으로 잡혀있다. 따라서 터미널에 vi만 쳐도 빔이 실행된다. 단 루트 유저의 경우 둘이 서로 다르다.
vimx은 X window 환경에서 vim과 클립보드를 공유하기 위해 사용한다. Debian 계열은 vim-gnome을 설치한다.
vim -version
을 실행해 clipboard(일반 클립보드), xterm_clipboard(X window용 클립보드) 기능이 포함되었는지 확인해야 한다. -
붙어있으면 해당 기능 빠진 채 빌드된 것이다. +
가 되어 있어야 한다.
클립보드를 공유하기 위해서는 몇 가지 설정을 더 해줘야 한다.
~/.vimrc
은 빔에 대한 설정 파일인데, 아래의 unnamed 클립보드 설정을 입력하고 저장한다. 만약 해당 파일이 없다면 파일을 만든다.
$ gedit ~/.vimrc
필자는 vim 에디터 대신 gedit으로 설정 파일을 편집했다. gedit 대신 vim ~/.vimrc
해도 좋다.
" clipboard settings : Copy/Paste/Cut
if has('unnamedplus')
set clipboard=unnamed,unnamedplus
endif
.vimrc에서 "
로 시작하면 주석문이다.
복사를 테스트해보자. 한 터미널에 vim clientlist.txt
, 다른 터미널에 gedit
를 켜고, clientlist.txt에서 :y
로 한 행을 복사한 뒤 gedit에서 Ctrl-V
하면 붙여넣기가 된다. 반대로 geidt에서 복사한 뒤 빔에서 p
로 붙어넣을수 있다.
① 옵션 설정의 확인 및 설정, 해제
명령어 | 내용 |
---|---|
:set | 현재 옵션 설정을 보여준다. |
:set all | 모든 옵션 설정을 보여주며, 디폴트 옵션까지 출력한다 |
:set [no]name | 해당 이름의 옵션을 켜고 끄는 기능으로, no를 prefix로 지정하는 것이 off 이다 |
:set name! | 해당 옵션의 기능을 on/off를 바꾼다 |
:set name=value | 해당 옵션의 값을 할당한다 |
② 대표적 옵션 종류
옵션 | 내용 | |
---|---|---|
nu | number | 화면에 행번호를 표시한다. |
rnu | relativenu | 현재 행을 기준으로 상하로 상대적 행번호를 표시한다 |
ai | autoinident | 자동 들여쓰기 기능이다 |
cindent | C언어 스타일 들여쓰기. 중괄호 기준으로 들여쓰기를 한다 | |
ts=value | tabstop | 화면에 표시될 탭 크기를 지정한다. value를 4로 하면 탭 하나에 4칸 띄어쓰기가 된다 |
sw=value | shiftwidth | 자동 블록 이동 시의 열 너비를 말한다. |
fencs=value | fileencodings | 파일 인코딩 방식 리스트를 지정하며, 복수 개 지정 시 공백 없이 콤마로 구분한다. |
fenc=value | fileencoding | 현재 파일의 인코딩 방식을 지정한다. |
보통 ts, sw를 같은 값으로 맞춰준다.
③ ~/.vimrc 파일에서 옵션 저장 아래 예시처럼 설정 파일에 옵션을 저장해 매번 빔을 열 때마다 같은 옵션을 적용토록 한다.
set ai cindent
set ts=4 sw=4
set rnu
"euc-kr로 인코딩 된 파일을 읽기 위한 설정
set fencs=ucs-bom,utf-8,korea
④ 컬러 테마 지정
vim에서 :colorscheme
(또는 colo)이라고 하면 다양한 컬러 테마를 볼 수 있다.
한 번 띄고 Tab 키를 누를 때마다 테마가 번갈아 나오며 한 개씩 적용 가능하다. Ctrl-D
를 누르면 전체 목록이 나온다.
이 또한 ~/.vimrc
에 등록해두면 매번 자동으로 설정된다. 컬러 테마는 옵션은 아니기 때문에 set
은 붙이지 않아도 된다.
빔은 온라인 help를 지원하여 사용법을 검색할 수 있다. 기본적으로는 :help <검색어>
으로 사용하며 해당 검색어가 들어간 목록을 모두 보여준다.
사용되는 접두어는 아래와 같다.
상황 | 접두어 | 예시 |
---|---|---|
일반모드에서 사용됨 | 없음 | :help x |
입력모드에서 사용됨 | i_ | :help i_CTRL-N |
명령행 모드에서 사용됨 | : | :help :w |
비주얼 모드에서 사용됨 | v_ | :help v_u |
vim 실행 인수 | - | :help -r |
옵션 | ’ | :help ‘tabstap’ |
명령행 모드 특수 키 | c_ | :help c_CTRL-B |
help 결과창에서 특정 단어의 색이 다르게 보이는 것은 하이퍼링크로, 다른 문서와 연결된다.
또한 help 창을 켜면 아래의 편집 창이 함께 보인다.
help 창에서 사용할 수 있는 키들은 다음과 같다.
키 | 사용 |
---|---|
^] | 커서가 위치한 키워드의 정의로 이동 |
^T | 이동했다가 돌아온다 |
:tags | 태그 스택의 내용들을 보여준다. |
^W^W | help 창과 편집 창을 서로 이동한다. |
가령 :help cindent
에서 커서를 tabstap
으로 이동해 ^]
를 누르면 tabstap 명령어 페이지로 이동되고, ^T
를 누르면 다시 cindent로 돌아온다.
tapstap 화면에서 ‘ts’라 보이는 것은 약어 형태로, 이렇게로도 사용할 수 있음을 말한다.
어떤 파일을 vim 명령어로 열었는데 다음과 같이 생긴 에러 메시지가 나올 수 있다. (이미 다른 빔에서 편집중인 같은 파일을 열었을 때이다.)
윗쪽 문장을 보면 swap 파일(.swp)을 하나 발견했다고 한다. 빔에서 문서를 열면 swap 파일을 만드는데, 같은 파일명의 파일을 열었다면 또 만들려고 한다며 기존 swap 파일을 발견했다 알린 것이다.
swap file의 경우 편집하려는 문서명 맨 앞에 .
을 붙이고 맨 뒤에 .swp
을 붙여 명명한다.
중간에 케이스가 두 가지가 나타나는데, 첫 번째 케이스는 이미 다른 프로그램에서 해당 파일이 실행중임을 나타낸다. 바로 위에 process ID를 보면 still running(아직 실행중)이라고 뜬다.
하단에 제시된 바와 같이, 읽기전용으로 계속 보고 싶다면 O
, 그냥 나가고 싶다면 Q
를 입력한다.
두 번째 케이스는 프로세스 아이디에 Still running이 없다. 해당 프로세스 아이디를 가진 파일을 편집하다가 문제가 발생해 비정상적으로 종료되어 버린 경우이다.
이 경우 R
로 복구할 수 있다.
center, right, left 정렬이 가능하며, width를 기준으로 정렬을 한다. :center
을 한 것과 :center 50
을 한 것은 다르다.
문자 한 개를 검색한다.
명령어 | 설명 |
---|---|
fc | 문자 c를 전방에서 검색한다 |
Fc | 문자 c를 후방에서 검색한다 |
; | 최근 검색을 재검색한다 |
, | 최근 검색을 반대 방향으로 검색한다 |
fa
를 하면 a를 현재 위치에서 오른쪽, 아래로 가며 검색하며, ;
를 누르면 계속해서 a를 찾아나간다.
① 명령어
명령어 | 설명 |
---|---|
/string | string을 전방탐색한다 |
?string | string을 후방탐색한다 |
* | 현재 커서에 위치한 단어를 전방탐색한다 |
# | 현재 커서에 위치한 단어를 후방탐색한다 |
n | 그 다음 번 탐색 결과를 찾는다. next의 약어 |
N | 그 다음 번 탐색 결과를 반대 방향으로 찾는다 |
% | 괄호의 짝을 찾는다 |
/string 사용 시 접두어 \M, \V로 magic(특수 문자 대한 해석 기능) 탐색을 끌 수 있다.
② case-sensitive searching 켜고 끄기
대소문자를 정확히 구별하거나 구별하지 않기 위해 사용한다. \c
접두어를 사용하거나, ignorecase option으로 사용할 수 있다(:set ignorecase
). 접두어 \C
를 붙이면 대소문자를 구별해 검색한다
예를 들어 /\cinter
이면 inter과 Inter을 둘 다 검색한다.
③ 정규표현식 REGEX 이용해 검색도 가능하다.
예들 들어 /[a-g]re
하면 a~g 범위 문자 중 하나로 시작하고 re가 붙는 단어를 찾는다.
검색 후 결과로 나온 부분에 하이라이트를 설정하고 해제할 수 있다.
:nohl
하면 일회성으로 highlitsearch를 해제하고, :set nohls
하면 highlitsearch 옵션을 해제한다.
반대로 켜려면 :set hls
을 쓴다.
man page를 복사해 실습해보자.
$ man man > manpage.txt
$ vim manpage.txt
아래와 같은 파일이 열린다
:set hls
로 하이라이트 기능을 켜고 /section
으로 단어를 검색해보자.
/\csection
, /[section]
, /\M[section]
으로 바꾸어가며 검색해보자. 각각 대소문자 구별을 해제하고, s, e, c, t, i, o, n을 모두 찾고, 정규표현식의 매직 해석을 금지하는 검색이다.
빔에 sed의 기능이 import 된 것으로, sed 문법과 동일하다.
:[range]s/<찾는 문자열>/<교체할 문자열>/<옵션>
식으로 쓴다. 여기서 ‘range’가 생략되면 현재 라인에서만 적용된다. s
뒤에 붙는 것은 구분자(seperator)로, /
가 주로 사용되나 다른 문자를 사용해도 무방하다
‘교체할 문자열’ 부분을 비워두면 해당 문자열이 삭제된다. 뒤에 붙을 ‘옵션’은 아래와 같다.
옵션 | 뜻 | 설명 |
---|---|---|
g | global | 검색된 문자열 모두를 교체. 생략 시 처음 1개만 교체 |
i | ignore case | 대소문자 무시 |
c | confirm | 교체할 대마다 Yes, No을 확인 |
e | error | 교체 과정 중 에러 무시 |
만약 구분자가 찾으려는/교체하려는 문자열에 포함될 경우, 그것이 구분자가 아니라고 escape 시켜줘야 한다. 역슬래시(\
)를 앞에 붙인다.
만약 /home/linuxer
를 /home/unixer
로 교체한다고 하자.
(1) :%s//home/linuxer//home/unixer/g로 하면 안된다
(2) :%s/\/home\/linuxer/\/home\/unixer/g 로
(3) :%s,/home/linuxer,/home/unixer,g
(1)의 경우는 안된다. (2)의 경우엔 문자열 안에 들어가는 슬래시 앞에 역슬래시를 해 escape 시킨 것이다. 그러나 보기 매우 복잡하다. 따라서 (3)처럼 구분자를 ,
로 바꿔 표현하면 훨씬 좋다.
특수 문자를 교체할 수도 있다. 개행문자(NewLine)가 그 예시다.
DOS나 Windows에서는 개행문자가 CR+LF
이나, UNIX에서는 LF
이다. 따라서 두 운영체제 사이에서 문서가 이상하게 열릴 수도 있다.
Unix 포맷에서 CR
을 더하려면 ^V^M
또는 ^Q^M
으로 CR
을 입력할 수 있다. 하지만 이는 그저 연습용으로, 실제로 개행 문자를 바꾸기 위해서는 :set ff=dos
혹은 :set ff=unix
로 설정한 후 저장하는 방법을 쓴다.(ff = file format)
CR
을 삭제하려면 :%s/^V^M//g
으로 한다. :%s/\r//g
로도 가능하다.
아스키를 코드 값으로 입력하는 경우 <Ctrl-V> ###
하면 ###
에 10진수를 사용해 아스키를 입력하라는 뜻이며, 8진수와 16진수는 각각 o###
, x##
로 한다.
참고로 터미널에 man ascii
하면 아스키 코드를 모두 볼 수 있다.
Buffer, Register
buffer는 파일을 편집하기 위한 임시 공간이다. 실제 메모리까지 가기 전, 우리가 실제 편집하는 곳이 된다.
빔에서 :files
또는 :buffers
라고 입력하면 현재 버퍼 목록을 출력한다. 터미널에서는 vim buffer = file
로 버퍼를 연다.
register는 텍스트 일부를 저장하고 있는 임시 공간으로, CPU 레지스터와는 다른 용어이다. 앞에서 보았듯 텍스트를 dd
로 삭제한 뒤 p
로 붙일 수 있는 것도 register에 저장되기 때문이다.
① 빔에서 다른 파일을 편집
명령어 | 설명 |
---|---|
:e [filename] | 해당 파일을 편집 모드로 오픈하며, 파일명이 생략될 땐 현재 파일을 다시 오픈한다 |
:e #[count] | count 번 째 파일을 오픈한다. 이 수가 생략되면 바로 이전 파일을 말한다 |
:find filename | 해당 파일을 검색해 오픈한다. 매칭 결과가 여러 개이면 에러 메시지가 나온다 |
Ctrl - ^ | :e #와 같은 기능. 파일 두 개를 왔다갔다할 때 많이 쓴다 |
② multiple buffers
여러 개의 버퍼, 즉 여러 개의 파일을 열 수도 있다. vim file1 file2 file3
이라고 하면 fil1 ~ 3을 연 것이다. 세 파일은 :n
과 :N
으로 왔다갔다 할 수 있다.
③ quit (종료)
아래처럼 조합으로 종료 관련 기능을 사용한다.
명령어 | 설명 |
---|---|
:q[!] | 현재 창을 종료한다. !를 붙이면 강제종료 시키는데, 저장하지 않고 종료 시 주로 사용한다 |
:qa[!] | quit all의 약어이다. 여러 개의 창이 있다면 모든 창을 종료한다 |
:wq | 저장 후 종료, :x를 더 많이 쓴다 |
:wqa | 모든 창을 저장하면서 종료 |
④ 저장 (write, update)
명령어 | 설명 |
---|---|
:w [filename] | 파일명이 지정되면 해당 파일에 쓰기를 지정한다. 복사본을 만든단 것이다. 편집 중인 파일은 원래 파일이다. 생략되면 현재 파일에 쓰기를 지정한다. |
:sav new_filename | save as의 약어로, 현재 파일을 다른 이름으로 저장한다. |
:up | 변경된 점이 있다면 :w를 실행한다 |
:x | up+quit의 합성이다. 일반 모드에서는 ZZ(대문자. shift 누른 채로 z연타)를 쓸 수도 있다 |
파일 일부분만 저장할 수도 있다.
:10,50w history
이면 10~50번 행을 history라는 파일로 저장하라는 뜻이고, :.,+10w history
이면 현재 행에서 아래로 10번 행을, :10,$w history
이면 10행부터 끝까지 저장하라는 뜻이다
⑤ netrw: 빔으로 디렉터리를 엶(browsing)
vim .
을 하거나 :e <path>
를 하면 된다. 탭 키로 command completion 기능도 쓸 수 있다.
Ctrl-^
키도 작동되며, F1
키를 누르면 help도 열린다.
명령어를 더 살펴보면 아래와 같다
명령어 | 설명 |
---|---|
Enter키 | 파일을 현재 창에 엶 |
i | 파일 표시 방법 변경(한 줄 보기, 파일 정보도 보기,…) |
s | 정렬 방식 변경(이름, 시간, 크기 순…) |
o | 커서 위치의 파일을 수평 분할된 새 창으로 엶 |
v | 커서 위치의 파일을 수직 분할 새 창으로 엶 |
p | 커서 위치의 파일을 미리보기 창으로 엶. 닫을 때는 ^W z나 :pclose |
t | 새로운 탭으로 분할해 엶 |
- | 상위 디렉터리로 이동 |
⑥ 화면 분할 (split)
수평(horizon) 분할은 Ctrl-W
+ s
나 :sp [file]
으로 할 수 있다. sp는 split의 약자이다.
수직(vetical) 분할은 Ctrl-W
+ v
나 :vs [file]
으로 할 수 있다. vs는 vertical split의 약자이다.
명령어 | 설명 |
---|---|
:[#]sp [파일명] 또는 [#]Ctrl-W + s | 수직으로 창을 분할하며, 파일명 생략 시 현재 파일을 의미. #은 분할 창의 크기이며, 생략 시 절반 |
:[#]vs [파일명] 또는 [#]Ctrl-W + v | 수평으로 창을 분할하며, 기능은 위와 동일 |
:[#]new 또는 [#]Ctrl-W + n | 상하로 분할하고 위쪽에 새 창을 만듦 |
:[#]vnew 또는 [#]Ctrl-W + v | 좌우로 분할하고 왼쪽에 새 창을 만듦 |
애초에 빔을 실행할 때부터 분할하고 싶으면 vim -o (혹은 -O) file1 file2
로 두 파일을 분할해 열 수 있다.
두 파일을 비교할 수도 있다(diff). 소스코드나 설정파일을 비교 시 많이 쓰인다. vim -d file1 file2
으로 실행할 수 있다.
색칠이 되어 어디가 다른가 빨리 확인 가능하다. do
, dp
를 이용해 양쪽으로 get, put도 가능하다.
⑦ 창 이동
^W
+ ^방향키
또는 ^W
+ 방향키
로 이동하거나, ^W^W
로 할 수 있다.
⑧ 창 크기
^W =
는 모든 창의 크기를 동일하게 조정하고, ^W [#]+
는 모든 창의 크기를 #만큼 키운다. ^W [#]-
는 줄인다. #를 입력하지 않으면 1만큼 변경된다.
⑨ 탭 페이지 (tabpage)
분할 외에도 탭을 만들 수도 있다. 파일을 닫지 않고도 수정된 상태로 여러 파일을 열 수 있다.
vim -p file1 file2 file3
으로 빔 열 때부터 탭을 열 수도 있고, 아래와 같이 빔 편집기 내에서 탭을 열 수 있다.
명령어 | 설명 | |
---|---|---|
:[#]tabe[dit] file | tab edit. #번째 탭에 파일을 연다. 번호는 0번부터 시작하며 번호 생략 시 현재 탭 뒤에 생성된다 | |
:[#]tabenw file | tab new. #번째 위치에 비어있는 탭을 만든다 | |
:[#]tabc[lose] | tab close | #번째 탭을 닫는다. 번호 생략 시 현재 탭을 닫는다. 그냥 :q로 닫아도 된다 |
:[#]tabn[ext] 또는 [#]gt 또는 [#]Ctrl-PgDown | 다음 탭으로 이동. 일반 모드의 gt와 동일. #에 숫자 지정 시 탭 번호 지정 | |
:[#]tabp[revious] 또는 [#]gT 또는 [#]Ctrl-PgUp | 이전 탭으로 이동. 일반 모드의 gT와 동일. #에 숫자 지정 시 반복수 지정 | |
:tabm[ove] [#] | #번째 탭으로 현재 탭을 이동시킴. 숫자 생략 시 가장 오른쪽으로 이동 |
탭의 숫자는 0부터 시작한다.
⑩ 파일 번호의 상태 flags
상태 플래그 | 설명 |
---|---|
% | 현재 편집 중인 버퍼 |
# | 직전에 열었던 버퍼나 다음에 열도록 예비된 버퍼. Ctrl-^ 누르면 # 이 표시된 파일이 열린다 |
a | 활성화된(화면에 보이는) 버퍼로, 창 분할 기능 쓸 땐 여러 파일에 a가 나타난다 |
+ | 변경된 부분이 있는 버퍼 |
⑪ 파일명 아래의 cursor
커서 아래의 파일명을 인식해 오픈하는 기능이 있다. 해당 위치에서 gf
하면 그 파일로 이동하고, Ctrl-^
로 이전 파일로 돌아간다.
추가적으로 Ctrl-W
+ f
하면 커서 위치 파일명을 분할된 창에 열고, Ctrl-W
+ gf
하면 커서 위치 파일명을 탭에 연다.
C언어라면 #include
구문의 헤더파일도 인식한다.
file encoding supports이다. 파일을 읽을 때 확인할 encoding list를 설정한다. 설정된 리스트 순서대로 확인하며, 변환이 필요한 경우를 지정한다. ~/.vimrc 설정 파일에 설정되어 있어야만 중국어, 일어, 한국어와 같은 mulit-byte 기반 인코딩 파일을 읽을 수 있다.
set fencs=value
(예) fencs=ucs-bom,utf-8,korea,latin-1
→ BOM 확인 후 아니면 utf-8, korea(euc-kr,cp949), 마지막엔 ascii를 체크한다
BOM (Byte Order Mark)
USC(universial coded Character Set)의 판별 마크. 주로 생략하지만 관습적으로 옵션 설정 시 앞부분에 넣어준다(ucs-bom)
fenc, fencs에 사용 가능한 문자 세트는 :help encoding-values 도움말을 참조할 수 있다.
대표적 인코딩 형식 | 설명 |
---|---|
utf-8, utf8 | UTF-8 유니코드 형식 |
ucs-bom | BOM 마크에 의한 유니코드 형식 |
korea | 한글 지원(별칭). 유닉스에서는 euc-kr, 윈도우에서는 cp949로 자동 변환된다 |
euc-kr | 유닉스에서만 사용 가능한 한글 지원 |
cp949 | 유닉스와 윈도우 모두에서 상요 간으한 한글 지원 |
latin1, ansi | 영문 ascii 형식 |
현재 파일의 인코딩 방식을 지정한다. fenc
를 변경한 뒤에 저장하면 다른 문자 세트로 저장할 수 있다.
예를 들어, :set fenc=korea
로 변경한 후 저장하면 cat
으로 해당 파일을 열면 한글이 깨진다. 리눅스는 UTF-8이 기본 인코딩이라 EUC-KR로 저장하면 화면이 깨지는 것이다.
텍스트 파일을 리눅스에서 windows로 가저갈 땐, 변환을 거쳐 가져가야 한다. 아래 예에서 순서대로 newline 문자 변환, 파일 인코딩 변환을 거친 뒤 저장하는 것이 나온다.
:set ff=dos
:set fenc=korea
:wq
반대로 윈도우에서 리눅스로 가져올 땐, fencs가 제대로 설정되어 있다면 자동 변환되지만, 이후 저장할 때는 자동으로 dos & 완성형 한글로 변환 및 저장된다. 따라서 유닉스 텍스트 포맷과 UTF-8로 변환해 저장해야 한다.
:set ff=unix
:set fenc-utf8
:wq
키 | 설명 |
---|---|
0 | 0번째 열로 이동 |
^ | 공백이 아닌 실제 내용이 있는 시작 열로 이동 |
$ | 마지막 열, 즉 행의 끝으로 이동 |
w | 단어 경계 이동으로, 단어의 시작이나 문장부호의 경계 따라 이동한다. words forward |
e | 단어 경계 이동으로, 단어의 끝이나 문장부호의 경계 따라 이동한다. 둥 ㅐㄹ word |
b | 단어 경계 이동으로, w와 반대 방향으로 움직인다. words backward |
W, E, B | w, e, b와 비슷하나 단어가 가진 의미 따져 이동함 |
% | 최근접 괄호 짝으로 이동 |
( , ) | 문장 단위의 시작/끝으로 이동 |
{ , } | 문단 단위의 시작/끝으로 이동 |
[[ , ]] | 블록 단위의 시작/끝으로 이동 |
^
, $
는 정규표현식에 기반하여 이해하면 쉽다.
특정 단어 입력 시 대체 입력되는 기능이다. ab
, ia
(insert mode ONLY), ca
(command line mode ONLY) 등을 사용해 지정할 수 있다.
아래 예시와 같이 쓸 수 있다. 참고로 <CR>
은 해당 약어 뒤로 엔터를 쳐야 한단 뜻이다.
ab 메일 717lumos@gmail.com
ab srcDir /catkin_ws/src
ia 지금시간 <C-R>=strftime("%Y.%m.%d-%H:%M:%S")<CR>
ca
로는 한글 상태 오타를 변환할 수 있다.
ca ㅈ w
ca ㅈㅂ wq
명령어 | 설명 |
---|---|
nmap <단축키> <명령>명령>단축키> | normal mode에서 해당 단축키가 실행할 명령 지정 |
imap <단축키> <명령>명령>단축키> | insert mode에서 |
vmap <단축키> <명령>명령>단축키> | visual mode에서 |
cmap <단축키> <명령>명령>단축키> | command line mode에서 |
.vimrc
파일 수정도 가능하다.
" key map
nmap <F2> :up<CR>
nmap <F3> :tabnext<Enter> → gt로도 대체 가능, <Enter>로 써도 되고 <CR>로 써도 된다
nmap <F4> :tabnext<Enter> → gT로도 대체 가능
특정 상황에서 자동으로 실행할 명령을 지정할 수 있다. autocmd
는 au
로도 쓸 수 있다.
autocmd BufRead,BUfNewFile *.txt colo evening
→ txt 파일 열 때는 컬러 테마를 evening로 열어라
autocmd BufRead,BUfNewFile *.java colo morning|setlocal ts=2 sw=2
→ 자바 파일 열 때는 컬러 테마 morning로 열고 탭 공백을 이렇게 설정해라
au SwapExists * let v:swapchoice = 'o'
→ swap 파일이 존재할 때는 o로 바꿔라
v:swapchoice
는 swap 파일이 존재할 때 어떤 선택을 할지 지정한다. o
는 readonly(읽기 전용), q
는 quit
로 그냥 나가기를 지정한다. 중복 파일을 열었을 때 앞에서 본 vim 에러 화면이 표시되지 않고 지정한 대로 행해진다.
특정 경로명 패턴을 인식시킬 수도 있다
autocmd BufRead,BUfNewFile */include/* colo slate|setlocal ts=8 sw=8
→ include 경로에 있을 때
autocmd BufRead,BUfNewFile */src/* colo slate|setlocal ts=2 sw=2
→ src 경로에 있을 때
지금까지 살펴본 내용들을 추가한 .vimrc
의 예는 다음과 같다.
" vim runtime config.
set ai cindent ts=4 sw=4 hls
set fencs=ucs-bom,utf-8,korea,latin1
colorscheme peachpuff
" clipboard
if has('unnamedplus')
set clipboard=unmaned,unnamedplus
endif
" key map
nmap <F2> :up<ENTER>
nmap <F3> :tabprev<CR>
nmap <F4> :tabnext<CR>
" abbreviation
ab 메일 717lumos@gmail.com
ab srcDir /catkin_ws/src
ia 지금시간 <C-R>=strftime("%Y.%m.%d-%H:%M:%S")<CR>
ca ㅈ w
ca ㅈㅂ wq
ca ㅃ q!
ca ㅌ x
자동으로 vimrc를 만들어주는 곳이다. 여기서 만들어진 .vimrc
를 수정해서 사용하는 사람들이 많다.