리눅스 환경에서 사용할 수 있는 Vi(Vim) 편집기의 기본적인 사용법에 대해서 정리해두려고 한다. 기록을 남겨두면 추후에 필요할 때 찾아볼 수 있고 동시에 머리속에 정리 또한 가능하니 일석이조이다. 당장 다 외우지 않더라도 시간을 들여 앞으로 천천히 하다보면 익숙해지지 않을까?
$ vi
: vi / vim 시작하기$ vi aaa.txt
: aaa.txt 파일을 편집하면서 vi 시작$ vi -R aaa.txt
: 읽기 전용으로 열기명령대기상태 -> 편집상태
: 삽입명령어(아래참조)편집상태 -> 명령대기상태
: Esc
명령대기상태 -> 명령줄입력
: :
또는 /
(아래참조)명령줄상태 -> 명령대기상태
: Esc
또는 Enter
(아래참조)h
, l
, j
, k
: 왼쪽(←, Back space)
, 오른쪽(→, space)
, 위(↑)
, 아래(↓)
b
, w
: 이전 단어의 첫 글자로 / 다음 단어의 첫 글자로 이동.B
, W
: 이전 단어의 첫 글자로 / 다음 단어의 첫 글자로 이동. (문장부호 무시)e
: 다음 단어의 끝 글자로 이동.E
: 다음 단어의 끝 글자로 이동. (문장부호 무시)H
, M
, L
: 화면의 맨 위 / 중간 / 맨 아래로0
: 그 줄의 맨 처음으로 (숫자 0이다)$
: 그 줄의 맨 끝으로+
: 다음 줄의 처음으로-
: 윗 줄의 처음으로3|
: 현재 줄의 3번째 열로4H
: 화면 상의 처음 줄부터 4줄 밑으로4L
: 화면 상의 마지막 줄부터 4줄 위로(
, )
: 이전 문장의 시작으로 / 다음 문장의 시작으로{
, }
: 이전 문단의 시작으로 / 다음 문단의 시작으로[[
, ]]
: 이전 섹션의 시작으로 / 다음 섹션의 시작으로^F
, ^B
: 한 화면 앞으로 / 뒤로 (^
는 Ctrl
를 의미)^D
, ^U
: 반 화면 앞으로 / 뒤로4^B
: 4화면 위로 이동4^F
: 4화면 아래로 이동7^U
: 7줄 위로 이동7^D
: 7줄 아래로 이동^Y
: 커서는 현재 위치 그대로 화면만 한 줄씩 아래로 이동^E
: 커서는 현재 위치 그대로 화면만 한 줄씩 위로 이동:0
: 파일의 첫 번째 행으로 가기 (숫자 0):10
: 10번째 행으로 가기:$
: 파일의 마지막 행으로 가기G
: 파일의 마지막 행으로 가기10G
: 10번째 행으로 가기i
: 커서 위치부터 삽입 시작a
: 커서 위치 오른쪽부터 삽입 시작A
: 현재 줄의 맨 끝부터 삽입 시작I
: 현재 줄의 맨 처음부터 삽입 시작o
: 커서 아래에 행 삽입O
: 커서 위에 행 삽입x
: 현재 커서위치의 한 문자 삭제X
: 현재 커서 왼쪽의 한 문자 삭제dd
: 한 줄 지우기4dd
: 4 줄 지우기dw
: 한 단어 지우기d2w
: 2 단어 지우기D
: 커서 오른쪽 행 삭제:5 d
: 5 째 행 삭제:5,10 d
: 5-10째 행 삭제:wq
: 저장 후 vi 종료:w
: 저장 (종료는 하지 않고 계속 편집):q!
: 저장하지 않고 vi 빠져나가기:w filename
: filename
으로 저장 후 계속 편집ZZ
: 변경사항 저장 후 vi 종료yy
: 현재의 행 복사5yy
: 현재의 행 위치부터 5행 복사p
: 아래(오른쪽)에 붙여넣기P
: 위(왼쪽)에 붙여넣기f4yy
: 현재의 행 위치부터 4행을 f
라는 이름의 버퍼에 복사fp
: f
라는 이름의 버퍼에 복사된 내용을 현재 행 위치에 붙여넣기:3 co 7
: 1-3 행을 7행 다음으로 복사:3 m 7
: 3행을 7행 다음으로 이동:1,3 m 7
: 1-3행을 7행 다음으로 이동J
: 현재 행과 아래 행 결합3J
: 3줄 합치기u
: 이전 명령 취소cw
: 단어 변경cc
: 행 변경C
: 커서 오른쪽의 행 변경s
: 커서가 위치한 문자열 대체r
: 한 글자만 변경 (입력 모드로 바뀌지 않음)R
: 입력하는 대로 겹쳐써서 변경xp
: 커서 위치 문자와 오른쪽 문자 교환-
: 문자형(대, 소문자) 변경U
: 행 변경사항 취소:u
: 이전의 최종행 취소.
: 마지막 명령 반복2.
: 마지막 명령 2회 반복u
: 마지막 명령 취소U
: 현재 줄을 저장:set nu
: 행 번호 표시:set nonu
: 행 번호 숨기기:=
: 현재 줄번호 보여주기:/pattern/ =
: pattern이 위치한 줄번호 보여주기vi -r
: 되살릴 수 있는 모든 파일 이름 보여주기vi -r file.txt
: vi를 시작하여 지정한 파일 되살리기:r filename
: 커서 다음에 파일 삽입:20 r filename
: 파일을 20번째 행 다음에 삽입:e file.txt
: file.txt 편집하기:e!
: 현재의 편집중인 내용 무시하고 가장 최근에 편집한 내용 다시 편집하기% vi file1 file2 file3
혹은
:e file1 file2 file3
했을 때,
:args
: 편집 중인 파일목록 보여주기:n[ext]
: 다음 파일로 넘어가기:prev[ious]
: 이전 파일로 넘어가기 (단, 편집 중인 파일이 저장되지 않으면 다음 파일로 넘어갈 수 없다)/aaa
: 'aaa' 찾기 (현재 위치부터 뒤로)?aaa
: 'aaa' 역방향 찾기 (현재 위치부터 앞으로)/
: 가장 최근에 검색한 문자열 다시 검색?
: 가장 최근에 검색한 문자열 다시 역방향 검색:set noh
: 문자열 검색 후 문자열 강조 끄기vi
에서 치환은 정규표현식
이 이용된다(실제로 이 상태에서 실행하는 명령어는 ed
나 ex
라는 프로그램이 처리하게 되는데, 그래서 보통 이 상태를 "ed-모드"
라고 한다). 문서에서 원하는 패턴을 찾으려면 바로 위에 '문자열 탐색' 에서 설명된 바와 같이 /문자열
이나 ?문자열
을 사용한다. 문자치환 명령은 다음과 같다.
[형식] :범위s/변경전/변경후/수정자
'범위'
는 명령이 실행될 범위(예: 10,20 이면 10행 부터 20행 까지)를 나타낸다. 's'
는 치환(substitute)
의 약자이며 '수정자'
는 치환 명령의 세부사항을 결정한다. 필요한 것만 뒤에 적어주면 된다. (중복 가능)
g
(global) - 한 줄에서 일치하는 부분을 여러개 찾았을 때 전부 치환한다. 이것을 사용하지 않으면 처음 것만 치환.c
(confirm) - 만족하는 정규표현식을 찾았을 때 치환하기 전에 확인한다.i
(ignore-case) - 대소문자를 구별하지 않는다."변경전"
과 "변경후"
에 치환할 내용을 입력한다. "변경전"
에 정규표현식을 적는다. 정규표현식으로 .
, *
, ^
, $
, []
, \(...\)
, \<...\>
, POSIX.2
단축 표현을 사용할 수 있다. 여기서 여러 문자를 묶어서 단위를 만들고 찾은 내용을 기억하는 특수문자가 \(
, \)
임을 주의해야 한다. 반대로 (
, )
가 일반문자이다. vim(VI iMproved)
에서는 vi
에 추가로 |
, +
, (?와 같은) =
, {n,m}
을 사용할 수 있지만, 앞에 \
를 붙여야 한다. 또, vim
에는 \i
, \k
, \p
, \s
등의 단축 표현들이 있다.
"변경후"
에 \n
과 &
를 사용할 수 있다. \n
는 "변경전"
에서 n
번째 \(...\)
에 대응하는 부분이고, &
는 "변경전"
에 만족한 전체를 나타낸다. 예를 들어,
:%s/\([0-9][0-9]*\) \([Cc]hapter\)/\2 \1/
는 문서에서 12 Chapter같은 부분을 Chapter 12와 같이 치환하고,
:%s/F[1-9][12]*/&/g
는 HTML 문서에서 "F1"
~ "F12"
란 단어 모두를 굵은 체로 바꾼다. (주의! &
는 정규표현식의 특수문자는 아니지만 vi
의 특수문자이므로, 문자그대로의 &
를 사용하려면 대신 \&
를 사용해야 한다) 이외에도 (뒤를 모두 대문자로) \u
나 (뒤를 모두 소문자로) /l
같은 기능이 있다.
:%s/aaa/bbb/g
- 파일 전체(g)에서 'aaa'을 'bbb' 로 치환:%s/^M//g
- 파일 전체(g)에서 ^M
을 삭제. ^M
은 Ctrl+V+Enter
로 입력한다.:s/aaa/bbb/
- 현재 행에서 'aaa'을 'bbb' 로 치환:1,10 s/aaa/bbb/
- 1행부터 10행 까지 'aaa'을 'bbb' 로 치환:1,. s/str/rep/
- 1부터 현재행까지 'aaa'를 `'bbb' 로 전부 바꾸기:g/감자/s//바위/gc
- 각 발생 확인 후 대체주의할 점은 치환명령어가 /
문자로 각 부분을 구분하기때문에 "변경전"
이나 "변경후"
에 / 문자
를 사용하려면 \/
같이 써야한다.
필요하다면 /
대신 다른 문자를 사용해도 된다. 예를 들어,
:%s/\/usr\/local\/bin\//\/usr\/bin\//g
대신
:%s#/usr/local/bin/#/usr/bin/#g
가 알아보기 더 쉽다.
출처 : VI 편집기 사용법