Skip to content

Latest commit

 

History

History
314 lines (254 loc) · 21.4 KB

multiple_files.md

File metadata and controls

314 lines (254 loc) · 21.4 KB

여러 파일을 편집하기


  • 참고 : <C-키>CTRL과 해당 키를 함께 누르는 것을 의미합니다.

  • 한번에 여러 파일을 열어놓고 작업하는 경우를 다룹니다.

  • 현대적인 IDE는 여러 파일을 편집할 경우 tab 만 신경쓰면 됩니다. 탭을 닫으면 파일도 닫히고, 파일을 열면 탭이 열립니다. 하지만 VIM은 tab 이전에 buffer와 window가 있습니다. 이 세 가지 개념은 VIM 초보에게는 꽤 어려울 수 있지만, 일단 익숙해지면 여러 개의 파일을 다양한 레이아웃으로 열어놓고 자유롭게 작업할 수 있습니다.

buffer, window, tab

  • 버퍼와 윈도우와 탭의 차이를 알아 봅시다.
  • :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 개임을 알 수 있습니다.

    하나의 탭 안에 여러 개의 윈도우를 배치할 수 있습니다. 좌/우 또는 상/하로 화면을 쪼갤 수 있는 것은 물론이고, 수십 개의 윈도우를 격자 모양으로 배열할 수도 있습니다.

버퍼 사용하기

  • :help buffer-list

파일을 버퍼로 불러오기

  • VIM 실행시에 파일명을 지정해주는 방법.
$ 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만 기억해두면 됩니다.
  • 버퍼 이동시 편집한 내용을 저장하지 않았다면, 경고가 발생합니다.
  • 경고 없이 버퍼 이동을 하고 싶다면 명령어 뒤에 !를 붙여 주면 됩니다.
    • 예: :bn!, :bp!, :bd!
설명 같은 명령
: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 읽기 에러가 발생한 버퍼.

윈도우와 탭 사용하기

윈도우 생성하고 종료하기

  • VIM 실행시에 윈도우를 지정하는 방법
$ # 3개의 파일을 3개의 버퍼로 읽되, 버퍼마다 상하분할된 윈도우로 보여준다. 즉 3 개의 윈도우가 열린다.
$ vim -o file1 file2 file3
$ # 3개의 파일을 3개의 버퍼로 읽되, 버퍼마다 좌우분할된 윈도우로 보여준다. 즉 3 개의 윈도우가 열린다.
$ vim -O file1 file2 file3
  • VIM 내부에서 윈도우를 조작하는 방법
설명 같은 명령
: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 번째 윈도우로 이동한다.

윈도우 이동

  • :help window-moving
설명 같은 명령
<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번째 윈도우)

윈도우 사이즈 조정, 종료

  • :help window-resize
설명 같은 명령
<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 명령어 숫자

참고 자료