-
참고 : <C-키>
는 CTRL
과 해당 키를 함께 누르는 것을 의미합니다.
-
한번에 여러 파일을 열어놓고 작업하는 경우를 다룹니다.
-
현대적인 IDE는 여러 파일을 편집할 경우 tab 만 신경쓰면 됩니다. 탭을 닫으면 파일도 닫히고, 파일을 열면 탭이 열립니다. 하지만 VIM은 tab 이전에 buffer와 window가 있습니다. 이 세 가지 개념은 VIM 초보에게는 꽤 어려울 수 있지만, 일단 익숙해지면 여러 개의 파일을 다양한 레이아웃으로 열어놓고 자유롭게 작업할 수 있습니다.
- 버퍼와 윈도우와 탭의 차이를 알아 봅시다.
:help windows-intro
를 입력하면 다음과 같은 설명을 볼 수 있습니다.
Summary:
- A buffer is the in-memory text of a file.
- A window is a viewport on a buffer.
- A tab page is a collection of windows.
-
버퍼는 메모리에 로드된 파일 내용입니다.
:w
로 저장할 때마다 버퍼의 내용이 파일에 저장됩니다.
하나의 파일은 하나의 버퍼만 사용할 수 있습니다. A 파일을 열고, :badd A
로 A 파일을 한 번 더 열어 본 다음, :ls
명령으로 확인해보면 버퍼가 2개가 아니라 여전히 1개임을 알 수 있습니다.
-
윈도우는 버퍼를 보여주는 화면을 말합니다.
:vs
명령을 써서 하나의 파일을 두 개의 윈도우에서 열고, 한 윈도우에서 내용을 편집해 보면 다른 윈도우의 내용도 똑같이 바뀌는 것을 볼 수 있습니다. 두 윈도우가 하나의 버퍼를 보여주고 있기 때문입니다.
새로운 윈도우를 열고, 새로운 파일을 편집한 다음, 윈도우를 종료해 봅시다. :ls
로 확인해 보면 윈도우만 닫혔고 버퍼는 닫히지 않았음을 확인할 수 있습니다.
-
탭은 윈도우의 모음입니다.
A 파일을 열고, :tabe A
명령으로 새로운 탭에서 A 파일을 또 열어 봅시다. 이때 :ls
명령으로 버퍼 목록을 확인해 보면 역시 버퍼는 2 개가 아니라 1 개임을 알 수 있습니다.
하나의 탭 안에 여러 개의 윈도우를 배치할 수 있습니다. 좌/우 또는 상/하로 화면을 쪼갤 수 있는 것은 물론이고, 수십 개의 윈도우를 격자 모양으로 배열할 수도 있습니다.
$ vim file1 file2 file3 ...
- VIM 실행 후에 파일을 불러오고 닫는 방법.
키 |
설명 |
같은 명령 |
:edit |
파일을 새로운 버퍼로 불러오고, 편집할 수 있도록 보여준다. |
:e |
:badd |
파일을 새로운 버퍼로 불러오기만 한다. 보여주지는 않는다. |
:bad |
:enew |
empty 버퍼를 새로 열어준다. 저장하면 새로운 파일이 디스크에 저장된다. |
:ene |
:bdelete |
현재 버퍼를 닫는다. |
:bd , :bdel |
키 |
설명 |
:e test.txt |
test.txt 파일을 버퍼로 불러온다. 만약 존재하지 않는 파일이라면 빈 버퍼로 열어준다. |
:e + test.txt |
test.txt 파일을 열고, 커서를 마지막 라인으로 옮긴다. |
:e +42 test.txt |
test.txt 파일을 열고, 커서를 42번째 라인으로 옮긴다. |
:e +/regex test.txt |
test.txt 파일을 열고 regex검색 결과의 첫 번째 라인으로 커서를 옮긴다. |
:bad test.txt |
test.txt 파일을 버퍼로 불러온다. 이후 :ls 로 확인해보면 버퍼가 추가되어 있다. |
:bd |
현재 버퍼를 닫는다. |
:bd! |
변경 사항을 무시하고 (저장하지 않고) 현재 버퍼를 닫는다. |
:bd! 20 |
20 번 버퍼를 저장하지 않고 닫는다. 버퍼 번호는 :ls 로 확인할 수 있다. |
- 버퍼 목록 확인은
:ls
만 기억해두면 됩니다.
- 버퍼 이동시 편집한 내용을 저장하지 않았다면, 경고가 발생합니다.
- 경고 없이 버퍼 이동을 하고 싶다면 명령어 뒤에
!
를 붙여 주면 됩니다.
키 |
설명 |
같은 명령 |
:buffers |
현재 버퍼 목록을 본다. 버퍼 넘버와 파일 이름이 리스트로 출력된다. |
:ls , :files |
:buffer |
지정한 버퍼로 이동한다. |
:b |
:edit #숫자 |
:buffer 숫자 와 같다. |
:e #숫자 |
<C-^> |
이전에 편집하던 버퍼. |
<C-6> |
숫자<C-^> |
:buffer 숫자 와 같다. |
숫자<C-6> |
:buffer 파일명 |
파일명에 해당하는 버퍼를 보여준다. <TAB> 파일명 자동완성도 가능. |
:b 파일명 |
:bprevious |
버퍼 목록의 이전 버퍼로 이동한다. |
:bp , :bN |
:bnext |
버퍼 목록의 다음 버퍼로 이동한다. |
:bn |
:bfirst |
버퍼 목록의 첫 번째 버퍼로 이동한다. |
:bf |
:blast |
버퍼 목록의 마지막 버퍼로 이동한다. |
:bl |
키 |
설명 |
:ls |
전체 버퍼 목록을 본다. |
:ls h |
숨겨진 버퍼 목록을 본다. |
:ls + |
편집된 (아직 저장되지 않은) 버퍼 목록을 본다. |
:ls h+ |
편집된 숨겨진 버퍼 목록을 본다. |
<C-6> |
이전 버퍼로 돌아간다. 다른 프로그램과 단축키가 겹친다면 <C-^> 을 쓰면 된다. |
:20b |
20번 버퍼로 이동한다. :b20 , :e#20 , 20<C-6> , 20<C-^> 도 된다. |
:1b! |
현재 버퍼를 저장하지 않고 1번 버퍼로 이동한다. 현재 버퍼의 변경 사항이 사라지지는 않는다. :b!1 도 된다. |
:bn3 |
현재 버퍼로부터 다음 3번째 버퍼로 이동한다. :3bn 도 된다. |
:bn +7 |
다음 버퍼로 이동한 다음, 커서를 7번째 라인으로 옮긴다. |
:bp4 +/test |
이전 4 번째 버퍼로 이동한 다음, test를 검색한 결과의 첫 번째 위치로 커서를 옮긴다. |
:blast +3,10d |
마지막 버퍼로 이동한 다음, 3~10 번 라인을 삭제한다. |
:b e |
파일명이 e 로 시작하는 버퍼로 이동한다. 파일명으로 검색이 가능하다는 의미. |
:b +3 e |
위와 같다. 단, 버퍼로 이동한 다음 커서를 3번째 라인으로 옮긴다. |
:buffers
, :ls
를 통해 버퍼 목록을 보면 왼쪽에 특수기호로 상태 표시를 하고 있음을 알 수 있습니다.
기호 |
설명 |
% |
현재 편집중인 버퍼. |
# |
이전 버퍼. |
a |
현재 보여주고 있는 버퍼. |
h |
숨겨진 버퍼. |
+ |
편집된 이후 아직 파일로 저장되지 않은 버퍼. |
= |
readonly 버퍼. |
x |
읽기 에러가 발생한 버퍼. |
$ # 3개의 파일을 3개의 버퍼로 읽되, 버퍼마다 상하분할된 윈도우로 보여준다. 즉 3 개의 윈도우가 열린다.
$ vim -o file1 file2 file3
$ # 3개의 파일을 3개의 버퍼로 읽되, 버퍼마다 좌우분할된 윈도우로 보여준다. 즉 3 개의 윈도우가 열린다.
$ vim -O file1 file2 file3
키 |
설명 |
같은 명령 |
:split |
탭을 상하분할하는 윈도우 하나를 추가하고 편집중인 버퍼를 보여준다. |
:sp , <C-w>s |
:split filename |
:split 과 같으나, filename 파일을 열어준다. |
:sp filename |
:vsplit |
화면을 좌우분할한다. v 는 vertical 을 의미. |
:vs , <C-w>v |
:vsplit filename |
:vsplit 과 같으나, filename 파일을 열어준다. |
:vs filename |
:new |
탭을 상하분할하는 윈도우 하나를 추가하고 새로운 버퍼를 보여준다. |
<C-w>n |
:vnew |
탭을 좌우분할하는 윈도우 하나를 추가하고 새로운 버퍼를 보여준다. |
|
:ball |
모든 버퍼를 열어준다. (버퍼 수 만큼 새로운 상하분할 윈도우가 열린다.) |
:ba |
:vertical ball |
모든 버퍼를 열어준다. (버퍼 수 만큼 새로운 좌우분할 윈도우가 열린다.) |
:vert ba |
키 |
설명 |
:sp |
현재 버퍼를 상하분할하여 새로운 윈도우에서 연다. |
:20sp |
:sp 와 같다. 단, 새로운 버퍼의 height는 20 라인이다. |
:20sp test.txt |
test.txt 파일을 상하분할하여 새로운 윈도우에서 연다. 새로운 버퍼의 height는 20 라인이다. |
:20sp +/regex test.txt |
:20split test.txt 와 같다. 단, 파일이 열리면 커서를 regex 검색 결과의 첫 번째 위치로 옮긴다. |
:20vs +/regex test.txt |
상하분할이 아니라 좌우분할로 열린다. 나머지는 위와 같다. |
:new |
새로운 버퍼를 상하분할하는 새로운 윈도우에서 연다. |
:10new |
:new 와 같다. 단, height 는 10 라인이다. |
:15vnew |
새로운 버퍼를 좌우분할하는 새로운 윈도우에서 연다. width 는 15 이다. :15vne 도 된다. |
<C-키1>키2
방식으로 입력하는 조합의 대부분은 <C-키1><C-키2>
로도 작동하니 테스트 해보자. <C-키>
에서 손가락을 떼지 않아도 되어 편리하다.
키 |
설명 |
같은 명령 |
<C-w>w |
커서를 다음 윈도우로 옮긴다. |
<C-w><C-w> |
<C-w>W |
커서를 이전 윈도우로 옮긴다. |
|
<C-w>h |
커서를 왼쪽 윈도우로 옮긴다. |
<C-w><C-h> , <C-w><Left> , <C-w><BS> |
<C-w>j |
커서를 아래쪽 윈도우로 옮긴다. |
<C-w><C-j> , <C-w><Down> |
<C-w>k |
커서를 위쪽 윈도우로 옮긴다. |
<C-w><C-k> , <C-w><Up> |
<C-w>l |
커서를 오른쪽 윈도우로 옮긴다. |
<C-w><C-l> , <C-w><Right> |
<C-w>t |
커서를 가장 위쪽 윈도우로 옮긴다. |
<C-w><C-t> |
<C-w>b |
커서를 가장 아래쪽 윈도우로 옮긴다. |
<C-w><C-b> |
<C-w>p |
커서를 이전에 방문했던 윈도우로 옮긴다. |
<C-w><C-p> |
키 |
설명 |
3<C-w>w |
3 번째 윈도우로 이동한다. |
키 |
설명 |
같은 명령 |
<C-w>H |
현재 윈도우를 가장 왼쪽으로 옮긴다. |
|
<C-w>J |
현재 윈도우를 가장 아래쪽으로 옮긴다. |
|
<C-w>K |
현재 윈도우를 가장 위쪽으로 옮긴다. |
|
<C-w>L |
현재 윈도우를 가장 오른쪽으로 옮긴다. |
|
<C-w>r |
각 윈도우가 보여주는 버퍼를 회전시킨다. |
<C-w><C-r> |
<C-w>R |
각 윈도우가 보여주는 버퍼를 회전시킨다.(역방향) |
|
<C-w>x |
현재 윈도우를 다음 윈도우와 바꾼다. 숫자를 입력한 다음 사용하면 n번째 윈도우와 바꾼다. |
<C-w><C-x> |
<C-w>T |
현재 윈도우를 새로운 탭으로 옮긴다. 현재 탭에 윈도우가 하나뿐이라면 실패한다. |
|
키 |
설명 |
3<C-w>x |
현재 윈도우를 3번째 윈도우와 바꾼다. (현재 윈도우는 1번째 윈도우) |
키 |
설명 |
같은 명령 |
<C-w>= |
모든 윈도우를 같은 크기로 조정한다. |
|
:resize 숫자 |
숫자 만큼의 라인 수 만큼 윈도우 크기를 늘인다. 숫자 앞에 + ,- 를 붙여 증가, 감소를 지정할 수 있다. |
:res숫자 |
<C-w>- |
윈도우 height를 한 줄 줄인다. 숫자 <C-w>- 방식으로 숫자 조합 사용 가능. |
:res-숫자 |
<C-w>+ |
윈도우 height를 한 줄 늘인다. 숫자 조합 사용 가능. |
:res+숫자 |
<C-w>_ |
윈도우 height를 최대화한다. 숫자 조합 사용 가능. |
<C-w><C-_> , :res숫자 |
z숫자<Enter> |
윈도우 height 를 지정한다. |
:res숫자 |
<C-w>> |
윈도우 width를 한 줄 늘인다. 숫자 조합 사용 가능. |
|
<C-w>< |
윈도우 width를 한 줄 줄인다. 숫자 조합 사용 가능. |
|
<C-w> | |
윈도우 width 를 최대화한다. 숫자 조합 사용 가능. |
|
<C-w>o |
현재 편집중인 윈도우를 제외한 모든 윈도우를 닫는다. |
:only , :on , <C-w><C-o> |
<C-w>c |
윈도우를 닫는다. |
:close , :clo |
<C-w>q |
윈도우를 닫는다. |
<C-w><C-q> , :quit , :q |
키 |
설명 |
:res |
현재 윈도우의 height를 최대화한다. <C-w>_ , <C-w><C-_> 도 된다. |
:res 20 |
현재 윈도우의 height를 20 라인으로 설정한다. 20<C-w>_ , 20<C-w><C-_> , z20<Enter> 도 된다. |
:res -2 |
현재 윈도우의 height를 2 라인만큼 줄인다. 3<C-w>- 도 된다. |
:res +5 |
현재 윈도우의 height를 5 라인만큼 늘인다. 5<C-w>+ 도 된다. |
<C-w>< |
현재 윈도우의 width를 1 줄인다. |
<C-w>> |
현재 윈도우의 width를 1 늘인다. |
5<C-w>> |
현재 윈도우의 width를 5 늘인다. |
<C-w> | |
현재 윈도우의 width를 최대화한다. |
20<C-w> | |
현재 윈도우의 width를 20으로 설정한다. |
:only |
현재 윈도우만 남기고 나머지 모든 윈도우를 닫는다. 버퍼는 남아 있으므로 유실되는 자료는 없다. |
<C-w><C-c> |
아무 일도 하지 않는다. |
<C-w>c
가 윈도우 종료이니까 <C-w><C-c>
도 윈도우 종료일 것 같지만, <C-c>
는 명령을 취소하는 기능이 있다.
:help tab-page
키 |
설명 |
같은 명령 |
:tabedit |
새로운 (오른쪽)탭에서 파일을 열어준다. |
:tabe , :tabnew |
:-tabedit |
왼쪽에 새로운 탭을 열어준다. |
|
:0tabedit |
가장 왼쪽에 새로운 탭을 열어준다. |
|
:$tabedit |
가장 오른쪽에 새로운 탭을 열어준다. |
|
:tabclose |
탭을 닫는다. |
:tabc |
:tabonly |
현재 편집중인 탭을 제외한 나머지 모든 탭을 종료한다. |
:tabo |
키 |
설명 |
:tabe test.txt |
새로운 탭(오른쪽)에 test.txt 파일을 열어준다. |
:tabe +3 test.txt |
위와 똑같다. 다만, 탭이 열린 다음 3 번 라인으로 커서를 옮겨준다. |
:tabe +/regex test.txt |
위와 똑같다. 다만, 탭이 열린 다음 regex 검색 결과의 첫번째로 커서를 옮겨준다. |
:tabc |
탭을 닫는다. |
:-tabc |
이전 탭을 닫는다. |
:+tabc |
다음 탭을 닫는다. |
:1tabc |
1번째 탭을 닫는다. |
:$tabc |
마지막 탭을 닫는다. |
:tabo |
현재 탭만 남기고 나머지 탭을 모두 닫는다. |
:-tabo |
이전 탭만 남기고 나머지 탭을 모두 닫는다. |
:+tabo |
다음 탭만 남기고 나머지 탭을 모두 닫는다. (- , + 외에 1 ,$ 도 된다.) |
키 |
설명 |
같은 명령 |
:tabs |
탭 목록을 본다. |
|
:tabnext |
다음 탭을 연다. :tabn숫자 형식으로도 사용할 수 있다. |
:tabn , gt , <C-PageDown> |
:tabprevious |
이전 탭을 연다. :tabp숫자 형식으로도 사용할 수 있다. |
:tabp , :tabNext , :tabN , gT , <C-PageUp> |
:tabfirst |
첫 번째 탭을 연다. |
:tabfir , :tabrewind , :tabre |
:tablast |
마지막 탭을 연다. |
:tabl |
:tabmove 숫자 |
n 번째 위치로 탭을 이동한다. |
:tabm 숫자 |
:tabs
에 대하여: >
기호는 현재 커서가 있는 윈도우를 의미하며, +
기호는 아직 저장되지 않은 버퍼가 표시되고 있는 윈도우를 의미한다.
키 |
설명 |
gt |
다음 탭으로 간다. :tabn 도 된다. |
3gt |
3 번 탭으로 간다. :tabn 3 도 된다. |
gT |
이전 탭으로 간다. :tabp 도 된다. |
:-tabm |
탭을 왼쪽으로 옮긴다. |
:+tabm |
탭을 오른쪽으로 옮긴다. |
:0tabm |
탭을 가장 왼쪽으로 옮긴다. |
:$tabm |
탭을 가장 오른쪽으로 옮긴다. |
키 |
설명 |
같은 명령 |
CTRL+w f |
커서가 위치한 문자열이 주소 형식이라면 해당 파일을 :split 으로 열어준다. 웹 주소라면 다운받아 열어준다. |
|
gf |
CTRL+w f 처럼 주소 형식을 열어준다. 단, 새로운 탭을 사용하지 않고, 현재 윈도우에 열어준다. |
|
:tabdo 명령어 숫자 |
현재 탭부터 n 번째 탭까지 루프를 돌면서 명령어를 실행한다. |
:tabd 명령어 숫자 |