home search
OS
Linux
[Vim] Vim editor 사용법
2022. 02. 23

Vim

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 에디터의 입력으로 주어 해당 파일을 만든다는 이야기이다.


Modes 및 이동

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) 이전 명령어 반복. 같은 작업을 여러번 하게 될 때 사용한다.

범위 지정 (range)

command-line 모드에서 범위를 지정해 명령할 수 있으며, 특정 행 범위의 삭제 및 편집에 편리하다. 범위 연산의 meta character은 아래와 같다.

기호 설명
. 현재 행
$ 문서의 맨 마지막 행
% 문서 전체
+# 현재 위치에서 #만큼 아래 행
-# 현재 위치에서 #만큼 위 행
#,# 범위를 지정

사용 예시는 아래와 같다.

명령어 설명
:#d #번 행을 삭제
:#,#d 지정한 행의 범위 부분을 삭제
:#,$d #부터 마지막 행까지 삭제
:-#,+#d 현재 행부터 위로 #행, 아래로 #행을 삭제
:%y 문서 전체를 복사. % = 1,$
:.,+#y 현재 행부터 아래로 #행을 복사
:#pu #번 행에 레지스터의 내용을 붙여넣기

visual mode

① 블록 지정 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

vim의 종류

vim의 종류에 따라 아래와 같이 종류가 있다.

  • vi: vi 호환의 vim이며, vim 종류 중 가장 적은 기능을 가지고 있다. 지금은 거의 사용하지 않는다. (= compact vim, tiny vim)
  • vim: 일반적인 vim을 의미하며, 프로그래밍에 많이 사용된다. vi에 추가적 기능, 플러그인이 사용 가능하다. (= enhanced vim)
  • vimx: 가장 많은 기능을 가진 vim으로, 클립보드 + X window 클립보드 기능을 포함하고 있다.

각 기능별로 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)로 vivim으로 잡혀있다. 따라서 터미널에 vi만 쳐도 빔이 실행된다. 단 루트 유저의 경우 둘이 서로 다르다.

vimx

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로 붙어넣을수 있다.


vim의 옵션

① 옵션 설정의 확인 및 설정, 해제

명령어 내용
: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은 붙이지 않아도 된다.


vim 메뉴얼

빔은 온라인 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의 에러

어떤 파일을 vim 명령어로 열었는데 다음과 같이 생긴 에러 메시지가 나올 수 있다. (이미 다른 빔에서 편집중인 같은 파일을 열었을 때이다.)

윗쪽 문장을 보면 swap 파일(.swp)을 하나 발견했다고 한다. 빔에서 문서를 열면 swap 파일을 만드는데, 같은 파일명의 파일을 열었다면 또 만들려고 한다며 기존 swap 파일을 발견했다 알린 것이다.

swap file의 경우 편집하려는 문서명 맨 앞에 .을 붙이고 맨 뒤에 .swp을 붙여 명명한다.

중간에 케이스가 두 가지가 나타나는데, 첫 번째 케이스는 이미 다른 프로그램에서 해당 파일이 실행중임을 나타낸다. 바로 위에 process ID를 보면 still running(아직 실행중)이라고 뜬다. 하단에 제시된 바와 같이, 읽기전용으로 계속 보고 싶다면 O, 그냥 나가고 싶다면 Q를 입력한다.

두 번째 케이스는 프로세스 아이디에 Still running이 없다. 해당 프로세스 아이디를 가진 파일을 편집하다가 문제가 발생해 비정상적으로 종료되어 버린 경우이다. 이 경우 R로 복구할 수 있다.


문자열 관련 기능

formatting

center, right, left 정렬이 가능하며, width를 기준으로 정렬을 한다. :center을 한 것과 :center 50을 한 것은 다르다.

검색: find

문자 한 개를 검색한다.

명령어 설명
fc 문자 c를 전방에서 검색한다
Fc 문자 c를 후방에서 검색한다
; 최근 검색을 재검색한다
, 최근 검색을 반대 방향으로 검색한다

fa를 하면 a를 현재 위치에서 오른쪽, 아래로 가며 검색하며, ;를 누르면 계속해서 a를 찾아나간다.

normal 모드 검색

① 명령어

명령어 설명
/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을 모두 찾고, 정규표현식의 매직 해석을 금지하는 검색이다.

교체 (substitute)

빔에 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 구문의 헤더파일도 인식한다.


파일 인코딩

fencs

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

현재 파일의 인코딩 방식을 지정한다. 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와 비슷하나 단어가 가진 의미 따져 이동함
% 최근접 괄호 짝으로 이동
( , ) 문장 단위의 시작/끝으로 이동
{ , } 문단 단위의 시작/끝으로 이동
[[ , ]] 블록 단위의 시작/끝으로 이동

^, $는 정규표현식에 기반하여 이해하면 쉽다.

약어 (abbreviation)

특정 단어 입력 시 대체 입력되는 기능이다. 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

단축키 (key map)

명령어 설명
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

특정 상황에서 자동으로 실행할 명령을 지정할 수 있다. autocmdau로도 쓸 수 있다.

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(읽기 전용), qquit로 그냥 나가기를 지정한다. 중복 파일을 열었을 때 앞에서 본 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

vim-bootstrap

자동으로 vimrc를 만들어주는 곳이다. 여기서 만들어진 .vimrc를 수정해서 사용하는 사람들이 많다.

arrow_upward arrow_downward
loading