vi의 장점

  • 키보드로 모든 것이 가능

  • 가벼우면서도 많은 기능을 내장



vim이란

  • Vi Improved

  • vi의 기본 기능에 충실하면서 vi에는 없는 여러 편리한 기능이 추가

  • 리눅스에는 거의 vim이 탑재되어 있음



vim의 모드

표준모드(normal mode)

  • vim 실행시 시작되는 모드

  • 키 입력을 통해 vim에게 명령을 내리는 모드(편집 X)

  • 커서 이동, 삭제, 복사, 붙이기 등의 작업 수행

  • 입력모드 전환 : <i>, <a>, <o>, <s>, <I>, <A>, <O>, <S>

  • 명령라인 모드 전환 : <:>, </>, <?>


입력모드(edit mode)

  • 실제로 문서를 편집하기 위한 모드

  • 표준모드 전환 : <ESC>


명령라인모드(commandline mode)

  • 명령 입력으로 여러가지 일을 수행할 수 있는 모드

  • vim의 설정 변경, 파일 저장/불러오기, 특정 패턴 찾기/바꾸기, 외부 명령 실행, vim 종료 등의 작업 수행

  • 표준모드 전환 : <ESC>, <Enter>

  • 인입 key

    • <:> : vim 설정 명령이나 파일 관련 명령, ex 편집기 ㅁ여령 등을 입력할 때 사용

    • </> : 특정 패턴 정방향 검색

    • <?> : 특정 패턴 역방향 검색



VI 명령어

VIM 저장 및 종료 (명령라인모드, 표준모드)

  • <:> 이 붙으면 명령라인모드 명령, 붙지 않으면 표준모드 명령
명령 의미
:w 저장
:w sunny.txt sunny.txt 파일로 저장
:w >> sunny.txt sunny.txt 파일에 덧붙여 저장
:q vi 종료
ZZ 저장 후 종료(= :wq)
:wq! 강제 저장 후 종료
:e 현재 파일을 불러옴
:e sunny.txt sunny.txt 파일을 불러옴


VIM 입력 (표준모드)

명령어 의미
a 커서 위치 다음 칸부터 입력
A 커서 행의 맨 마지막부터 입력
i 커서 위치에 입력
I 커서 행의 맨 앞부터 입력
o 커서의 다음 줄에 한 줄을 추가하고 그 곳에 입력
O 커서의 이전 줄에 한 줄을 추가하고 그 곳에 입력
s 커서 위치의 한 글자를 지우고 입력
S
cc
커서 위치의 한 줄 내용을 다 지우고 입력
C 커서가 위치한 한 줄의 커서 위치 후를 다 지우고 입력


VIM 방향 이동

  • 표준모드에서는 화살표 방향키 대신 문자 방향키 이용 가능

  • 화살표 방향키 대신 문자 방향키를 이용하면 키보드의 중심에서 벗어나지 않고 이동이 가능함

h j k l


VIM 이동 (표준모드)

명령어 의미
w 다음 단어의 제일 앞으로 커서 이동
- 공백(띄어쓰기, 줄바꿈) 및 특수문자 기준으로 단어 인식
W 다음 단어의 제일 앞으로 커서 이동
- 공백(띄어쓰기, 줄바꿈) 기준으로 단어 인식
b 이전 단어의 제일 앞으로 커서 이동
- 공백(띄어쓰기, 줄바꿈) 및 특수문자 기준으로 단어 인식
B 이전 단어의 제일 앞으로 커서 이동
- 공백(띄어쓰기, 줄바꿈) 기준으로 단어 인식
e 해당 단어 끝 바로 앞(한 문자 앞)으로 커서 이동
- 공백(띄어쓰기, 줄바꿈) 및 특수문자 기준으로 단어 인식
E 해당 단어 끝 바로 앞(한 문자 앞)으로 커서 이동
- 공백(띄어쓰기, 줄바꿈) 기준으로 단어 인식
<Enter> 다음 줄의 첫 글자로 이동
^ 현재 줄의 첫 글자로 이동
$ 현재 줄의 마지막 글자로 이동
+ 다음 줄의 첫 글자로 이동
- 다음 줄의 마지막 글자로 이동
( 이전 문장의 첫 글자로 이동
) 다음 문장의 첫 글자로 이동
{ 이전 문단으로 이동
} 다음 문단으로 이동
H 커서를 화면 맨 위로 이동
Z<Enter> 현재 줄을 화면 맨 위로 이동
M 커서를 화면 중앙으로 이동
z. 현재 줄을 화면 중앙으로 이동
L 커서를 화면 맨 아래로 이동
z- 현재 줄을 화면 맨 아래로 이동
[n]H 커서를 화면의 위에서 n번째 줄로 이동
[n]L 커서를 화면의 아래에서 n번째 행으로 이동
<CTRL>+u 화면 반을 위로 스크롤
<Ctrl>+d 화면 반을 아래로 스크롤
<Ctrl>+b 화면 하나를 위로 스크롤
<Ctrl>+f 화면 하나를 아래로 스크롤
gg, 1G 문서의 맨 첫 줄로 이동 G 문서의 맨 끝 줄로 이동
[n]G
:[n]
문서의 n번째 행으로 이동


VIM 삭제 (표준모드)

명령어 의미
x, dl 커서 위치(커서 바로 뒤)의 글자 삭제
X. dh 커서 바로 앞의 글자 삭제
dw 한 단어를 삭제
d0 커서 위치부터 해당 커서가 있는 줄 처음까지 삭제
D, d$ 커서 위치부터 해당 커서가 있는 줄 끝까지 삭제
dd 커서가 있는 줄 삭제
dj 커서가 있는 줄과 그 아랫줄 삭제
dk 커서가 있는 줄과 그 윗줄 삭제
dG 커서가 있는 줄부터 그 아랫줄 전체 삭제


VIM 복사와 붙이기 (표준모드)

명령어 의미
yw 현재 커서 위치의 한 단어 복사
[n]yw 현재 커서 위치부터 n개의 단어 복사
yy 현재 커서 위치의 한 줄 복사
[n]yy 현재 커서 위치부터 y개의 줄 복사
p 복사내용 붙여넣기
[n]p 복사내용 n개 붙여넣기


VIM 잘라내기 (표준모드)

  • vi는 총 17개의 레지스터를 가지고 있음

    • 명령라인모드에서 :reg로 확인 가능

    • ””, “0, “1, “2, “3, “4, “5, “6, “7, “8, “9, “-, “., “:, “%, “#, “/

    • ”” : 바로 전에 지워진 내용

    • “1 ~ “9 : 지워진 내용이 큐 형식으로 들어감(“” 후)

    • ”. : 최근까지 타이핑한 내용

    • ”% : 현재 편집하는 파일명

    • ”/ : 가장 최근에 검색한 문자열

    • ”* : 복사한 문자열

  • VIM 잘라내기란?

    • 복사 → 제거 → 붙여넣기 (따로 잘라내기가 없음)
명령어 의미
:reg 레지스터 확인
. 바로 직전 작업 반복


VIM 블록 지정 (비주얼)

  • v : 비주얼모드 진입

  • V : 비주얼모드 - 줄단위 진입 (가로)

  • <Ctrl> + V : 비주얼모드 - 열단위 진입 (세로)

명령어 의미
~ 대소문자 전환
d 삭제
y 복사
c 치환
> 줄 앞 탭 삽입
< 줄 앞 탭 제거
: 선택된 영역에 대해 ex 명령
J 줄 합치기
U 대문자로 만들기
u 소문자로 만들기
<Ctrl> + i 비주얼 모드 - 열 영역 일괄 문자 입력(수정)


VIM 되돌리기, 되돌리기 취소 (표준모드)

명령어 의미
u 되돌리기
<Ctrl> + r 되돌리기 취소


VIM 문자열 찾기 (명령 라인 모드)

명령어 의미
/[찾고자 하는 문자열] 찾고자 하는 문자열 정방향 검색
?[찾고자 하는 문자열] 찾고자 하는 문자열 정방향 검색
n 찾고자 하는 다음 문자열로 이동
N 찾고자 하는 이전 문자열로 이동


VIM 문자열 바꾸기(치환) (명령라인모드)

  • 줄 내 범위 (한 줄 내 어떻게 바꿀 것인지)

    • g : 한 줄에 매칭되는 것 전부 다

    • g를 쓰지 않으면, 한 줄당 한 번만

    • c : 매칭되는 문자열마다 바꿀건지 confirm받기

  • :[범위]/[찾을 문자열]/[바꿀 문자열]/[줄 내 범위]

  • :[범위]/[패턴]/[찾을 문자열]/[바꿀 문자열]/[줄 내 범위]

    • 패턴 : 정규표현식 이용
  • 예제

예제 의미
:s/sunny/cloudy 현재 줄의 처음 나오는 sunny를 cloudy로 바꾸기
:s/sunny/cloudy/g 현재 줄의 모든 sunny를 cloudy로 바꾸기
:10,20s/sunny/cloudy/g 10번째 줄부터 20번째 줄까지 모든 sunny를 cloudy로 바꾸기
:-1,+2s/sunny/cloudy/g 현재 커서 위치에서 1줄 위부터 2줄 아래까지 모든 sunny를 cloudy로 바꾸기
:%s/sunny/cloudy/g 문서 전체에서 sunny를 cloudy로 바꾸기
:%s/sunny/cloudy/gc 문서 전체에서 sunny를 cloudy로 확인(confirm)하며 바꾸기
:g/pattern/s/sunny/cloudy/g parttern이 있는 모든 행의 sunny를 cloud로 바꾸기



VIM 정규 표현식

  • 정규 표현식 내의 vim은 POSIX 문자 클래스를 지원함
정규 표현식 의미
^ 줄의 첫 문자
[] 안으로 들어가면 not의 의미 $ 줄의 끝
. 아무 문자나 1개
\| or
[ ] [] 사이의 문자 중 1개
\{min.max\} min 이상 max 이하 반복
* 앞의 내용이 0번 이상 반복
+ 앞의 내용이 1번 이상 반복
\< 단어의 시작
\> 단어의 끝
\n new line(개행)문자
\t tab 문자



POSIX 문자 클래스

  • POSIX 문자 클래스를 이용하면 정규 표현식에서 사용하기 힘든 제어문자들을 쉽게 사용할 수 있음
문자클래스 의미
[:alnum:] 알파벳과 숫자 [A-Za-z0-9]
[:alpha:] 알파벳 [A-Za-z]
[:cntrl:] 제어문자
[:blank:] tab & 공백
[:digit:] 숫자 [0-9]
[:graph:] 제어문자와 공백문자 제외
[:lower:] 소문자 [a-z]
[:upper:] 대문자 [A-Z]
[:print:] 제어문자 제외 문자 (프린트할 수 있는 문자)
[:punct:] [:graph:] 문자 중 [:alnum:] 제외 문자 (특수문자)
ex) !, @, #, $, …
[:space:] 화이트 스페이스
ex) 공백, 스페이스, 캐리지 리턴, 개행 문자, 수직 탭, 폼 피드
[:xdigit:] 16진수



VIM 확장 정규 표현식

정규표현식 의미
\i 변수 지정에 사용되는 문자 [_0-9A-Za-z]
\I \i와 같지만 숫자 제외
\k 키워드로 사용하는 문자 [_\.\-0-9A-Za-z>]
\K \k와 같지만 숫자 제외
\f 파일명으로 사용하는 문자
\F \f와 같지만 숫자 제외
\p 프린트 가능한 문자
\P \p와 같지만 숫자 제외
\s 화이트 스페이스 문자(공백&탭)
\S 화이트 스페이스가 아닌 문자
\d 숫자 [0-9]
\D 숫자가 아닌 문자 [^0-9]
\x 16진수 숫자 [0-9A-Fa-f]
\X 16진수 숫자가 아닌 문자 [^0-9A-Fa-f]
\o 8진수 숫자 [0-7]
\O 8진수 숫자가 아닌 문자 [^0-7]
\w 영문 단어에서 사용되는 문자 [0-9A-Za-z-]
\W 영문 단어에서 사용되지 않는 문자 [^0-9A-Za-z-]
\h 영문 단어의 시작에 사용되는 문자 [A-Za-z]
\H 영문 단어의 시작에 사용되지 않는 문자 [^A-Za-z]
\a 모든 알파벳 [A-Za-z]
\A 알파벳이 아닌 문자 [^A-Za-z]
\l 소문자 [a-z]
\L 소문자가 아닌 문자 [^a-z]
\u 대문자 [A-Z]
\U 대문자가 아닌 문자 [^A-Z]
\e esc
\t tab
\r 캐리지 리턴
\b 백스페이스
\n 개행 문자