vi는 유닉스에서 오래 쓰인 화면 편집기고, vim은 그 조작을 유지한 채 되돌리기, 문법 강조, 창 나누기를 더한 편집기다. 이름은 Vi IMproved다. 리눅스에서 `vi`를 실행해도 실제 프로그램은 vim인 경우가 많다. 우분투는 작은 빌드인 vim.tiny를 `vi`에 연결해 두고, 문법 강조와 클립보드가 있는 vim은 패키지를 따로 설치한다.
vim --version첫 줄에 `VIM - Vi IMproved`가 보이면 vim이다. `+syntax`처럼 플러스가 붙은 항목은 그 빌드에 들어 있는 기능이다. 마이너스가 붙어 있으면 그 기능은 빠졌다.
이 글의 키는 vim 기준이다. 고전 vi에는 비주얼 모드, 여러 단계 되돌리기, 창 나누기가 없다. 서버에 vim이 없으면 `sudo apt install vim`으로 둔다.
모드
vim은 글자를 누르는 즉시 본문에 넣지 않는다. 보통 모드에서 키는 명령이고, 입력 모드에서만 글자가 들어간다.
- 보통 모드: 이동, 삭제, 복사, 저장. 파일을 열면 여기부터 시작한다. - 입력 모드: `i`나 `a`로 들어간다. 화면 아래에 `-- INSERT --`가 보인다. - 비주얼 모드: `v`로 범위를 잡는다. - 명령행 모드: `:`로 저장과 치환, `/`로 검색을 적는다.
모드를 모르겠으면 Esc를 누른다. Esc는 항상 보통 모드로 돌아온다. 이미 보통 모드이면 짧은 삐 소리만 나고 본문은 바뀌지 않는다.
열고 저장하고 끝내기
vim file.txt
vim +20 file.txt
vim +/error app.log`+20`은 20번 줄에서 연다. `+/error`는 `error`가 처음 나오는 줄에서 연다.
보통 모드에서 `:`를 누르면 화면 아래에서 명령을 받는다.
- `:w`는 저장한다. - `:q`는 끝낸다. 저장하지 않은 변경이 있으면 거부한다. - `:wq`와 `:x`는 저장하고 끝낸다. `:x`는 바뀐 내용이 있을 때만 파일을 다시 쓴다. - `:q!`는 저장하지 않고 끝낸다. - `:w other.txt`는 다른 이름으로 저장한다. 편집 중인 이름까지 바꾸려면 `:saveas other.txt`를 쓴다.
보통 모드의 `ZZ`는 저장하고 끝내고, `ZQ`는 저장하지 않고 끝낸다.
읽기 전용으로 열었거나 권한이 없으면 `:w`가 실패한다. `:w !sudo tee %`처럼 셸로 넘기는 방법은 암호 입력과 파일 교체가 겹쳐 실수하기 쉽다. 권한이 있는 계정으로 다시 여는 편이 분명하다.
이동
보통 모드에서 커서를 옮긴다. 화살표도 되지만 vim의 기본은 오른손 자리에 있는 글자 키다.
- `h` `j` `k` `l`은 왼쪽, 아래, 위, 오른쪽이다. - `w`는 다음 단어 처음, `b`는 이전 단어 처음, `e`는 단어 끝이다. - `0`은 줄의 맨 앞, `^`는 첫 글자, `$`는 줄 끝이다. - `gg`는 파일 처음, `G`는 파일 끝이다. `42G`나 `42gg`는 42번 줄이다. - Ctrl-f와 Ctrl-b는 화면 한 쪽, Ctrl-d와 Ctrl-u는 반 쪽이다. - `%`는 짝이 되는 괄호로 이동한다.
숫자는 반복이다. `5j`는 다섯 줄 아래, `3w`는 단어 세 개 앞이다.
`f`와 `t`는 그 줄 안에서 글자를 찾는다. `fx`는 `x` 위로 가고, `tx`는 `x` 바로 앞에서 멈춘다. 대문자 `F`와 `T`는 반대 방향이다. `;`는 같은 방향으로 다시 찾고, `,`는 반대로 다시 찾는다.
검색은 `/단어`다. Enter로 실행하고, `n`은 다음, `N`은 반대 방향이다. `?단어`는 위로 찾는다. `*`는 커서가 있는 단어를 아래로 찾고 `#`은 위로 찾는다. vim 기능이다.
:set hlsearch
:set incsearch
:set ignorecase smartcase`hlsearch`는 맞은 곳을 칠한다. `incsearch`는 치는 도중에 첫 일치를 보여 준다. `ignorecase`와 `smartcase`를 같이 두면 소문자 검색은 대소문자를 구분하지 않고, 대문자가 하나라도 있으면 구분한다. 강조를 끄려면 `:nohlsearch`다. 설정 자체를 끄려면 `:set nohlsearch`다.
`:set number`는 줄 번호를 보여 준다.
고치기
입력 모드로 들어가는 키가 다르다.
- `i`는 커서 앞에서 입력한다. - `a`는 커서 뒤에서 입력한다. - `I`는 그 줄 첫 글자 앞에서 입력한다. - `A`는 줄 끝에서 입력한다. - `o`는 아래에 빈 줄을 만들고 입력한다. - `O`는 위에 빈 줄을 만들고 입력한다.
입력 모드에서 Enter는 줄을 나눈다. 다시 보통 모드로 나오려면 Esc다.
지우는 명령은 보통 모드에 있다.
- `x`는 커서의 글자 하나다. - `dd`는 한 줄이다. `5dd`는 다섯 줄이다. - `dw`는 단어, `d$`와 `D`는 줄 끝까지, `d0`은 줄 처음까지다. - `cc`는 한 줄을 지우고 입력 모드로 들어간다. `cw`는 단어, `C`는 줄 끝이다. - `r` 다음 글자는 커서 글자만 바꾼다. `R`은 덮어쓰기 모드다.
`u`는 되돌린다. vim은 여러 번 되돌릴 수 있다. Ctrl-r은 되돌린 것을 다시 실행한다. 고전 vi의 되돌리기는 한 단계다.
`.`은 직전 변경을 현재 위치에서 반복한다. `cw`로 단어 하나를 고친 뒤 다음 단어로 이동해 `.`을 누르면 같은 변경이 반복된다.
`J`는 다음 줄을 현재 줄 끝에 붙인다.
`>>`와 `<<`는 들여쓰기와 내어쓰기다. 폭은 `shiftwidth`다.
복사와 붙여넣기
`yy`는 한 줄을 복사한다. `yw`는 단어, `y$`는 줄 끝까지다. `p`는 커서 뒤나 아래에 붙이고, `P`는 앞이나 위에 붙인다. 줄을 복사했으면 줄 단위로 붙고, 글자만 복사했으면 글자 위치에 붙는다.
지운 내용도 같은 레지스터에 들어간다. `dd` 뒤에 `p`를 누르면 줄을 옮긴 것과 같다.
이름 있는 레지스터는 `"ayy`처럼 쓴다. `a`부터 `z`까지다. `"ap`로 붙여 넣는다. 숫자를 붙이지 않은 삭제는 이름 없는 레지스터를 덮어 쓰므로, 복사한 내용을 지키면서 다른 줄을 지울 때는 이름 있는 레지스터를 쓴다.
vim은 기본적으로 시스템 클립보드와 분리되어 있다. 빌드에 `+clipboard`가 있으면 `"+y`와 `"+p`가 그 클립보드다. `vim --version`에 이 기능이 마이너스로 있으면 터미널의 복사 기능을 쓴다. 그때는 `:set paste`로 붙여 넣은 뒤 `:set nopaste`로 돌아온다. `paste`를 켜 두면 자동 들여쓰기가 끼어들지 않는다.
범위 선택
`v`는 글자 단위, `V`는 줄 단위, Ctrl-v는 네모 영역이다. 이동 키로 범위를 넓히고 `d`, `y`, `>`로 지우거나 복사하거나 들여 쓴다. 바꾸려면 `c`다. 선택은 Esc로 취소한다.
네모 선택은 여러 줄의 같은 열을 지울 때 쓴다. 고전 vi에는 없다.
찾기와 바꾸기
명령행의 치환은 이렇게 쓴다.
:%s/old/new/g
:%s/old/new/gc
:10,20s/old/new/g`%`는 파일 전체다. 범위를 적지 않으면 현재 줄만 바꾼다. `g`는 한 줄 안의 나머지도 바꾼다. `c`는 바꿀 때마다 묻는다. `y`는 바꾸고 `n`은 건너뛴다.
`old`는 정규식이다. 점과 `*`는 글자 그대로가 아니다. 글자 그대로 찾으려면 점을 `\.`로 적거나, 패턴 앞에 `\V`를 붙여 특수 문자를 끈다.
:%s/\V./\./g슬래시가 많은 경로는 구분자를 바꾼다.
:%s#/var/log#/data/log#g치환은 저장 전에 `:w`로 확인한다. 되돌리려면 보통 모드에서 `u`다.
여러 파일과 창
vim a.txt b.txt`:n`은 다음 인자, `:prev`는 이전 인자다. `:args`는 목록을 보여 준다.
이미 연 파일은 버퍼다. `:ls` 또는 `:buffers`로 본다. `:bnext`, `:bprev`로 옮기고 `:b 이름`으로 고른다. 저장하지 않은 버퍼는 `:bd`로 바로 없애지 못할 수 있다. `:bd!`는 변경을 버리고 버퍼를 닫는다.
`:split`은 가로로, `:vsplit`은 세로로 창을 나눈다. Ctrl-w 다음에 `w`를 누르면 창을 옮긴다. Ctrl-w와 `h` `j` `k` `l`도 방향이다. `:only`는 현재 창만 남긴다.
`:tabnew file`은 탭이다. `gt`와 `gT`로 옮긴다. 탭은 버퍼와 다르다. 버퍼는 열린 파일이고 탭은 그 파일을 보여주는 칸이다.
설정 파일
매번 칠 설정은 홈 디렉터리의 `.vimrc`에 둔다. vim이 시작할 때 읽는다.
set number
set ignorecase smartcase
set hlsearch
set incsearch
syntax on
set tabstop=4
set shiftwidth=4
set expandtab`tabstop`은 탭 문자를 몇 칸으로 보여줄지다. `shiftwidth`는 `>>`가 밀 칸 수다. `expandtab`은 Tab 키 입력을 스페이스로 저장한다. 이미 들어 있는 탭 문자를 스페이스로 바꾸지는 않는다. 기존 탭을 바꾸려면 `:retab`을 쓴다. 파일이 탭을 의미 있게 쓰는 메이크파일은 `expandtab`을 켜지 않는다.
문법 강조는 `syntax on`이다. vim.tiny에는 없을 수 있다.
지금 파일에서만 쓰려면 `:` 명령으로 켜고, 끝낼 때 저장하지 않으면 다음 실행에는 사라진다. `.vimrc`에 적은 것만 남는다.
서버에서 자주 막히는 지점
글자가 본문에 들어가지 않으면 보통 모드다. `i`를 눌러 입력 모드로 들어간다.
`:q`가 거부되면 저장되지 않은 변경이 있다. 남기려면 `:wq`, 버리려면 `:q!`다.
방향키가 글자 ABCD로 들어가면 그 터미널의 vim이 화살표를 명령으로 받고 있는 것이다. `hjkl`을 쓰거나, vim 패키지를 설치한다.
붙여 넣은 내용이 계단처럼 들여 써지면 `:set paste`를 켜고 다시 붙인다. 끝나면 `:set nopaste`다.
`vi`와 `vim`의 기능이 다르면 `vim`으로 연다. `vi`가 작은 빌드이면 문법 강조와 클립보드, 일부 되돌리기가 없다.
vim 설명서는 편집기 안에서 `:help`로 연다. `:help user-manual`은 사용 설명이고, 키 하나를 보려면 `:help w`나 `:help dd`처럼 적는다. 도움말 창은 `:q`로 닫는다.
COMMENTS
댓글 0
이 글에 대한 의견이나 질문을 남겨 주세요.
댓글은 구글이나 카카오로 시작한 뒤에 남길 수 있습니다.
등록된 댓글이 없습니다.