1. vi 편집기란?
vi는 리눅스 환경에서 가장 많이 쓰이는 문서 편집기로 윈도우에서 메모장 기능을 생각하면 된다.
윈도우는 GUI(Graphical User Interface) 환경으로 마우스 조작이 가능하여 쉽게 사용할 수 있지만 리눅스는 CLI(Command Line Interface) 환경이기 때문에 단축키, 명령어 등을 알아야만 편집을 할 수 있어서 어려움을 많이 느낄 수 있다.
2. 편집기 모드
vi 편집기는 4가지 모드로 구성 되어 있으며 특정 키를 입력해 자유롭게 모드를 변경할 수 있다.
- 명령모드(Command mode) : 명령어를 입력해 vi의 다양한 기능을 사용할 수 있는 모드
- 명령라인모드(Command line mode, ex모드(ex mode), 콜론모드 : ':'뒤에 명령어를 입력하여 특수기능을 사용할 수 있는 모드
- 편집모드, 입력모드(Insert mode) : 메모장과 같은 텍스트를 자유롭게 편집할 수 있는 모드
- 비주얼모드(Visual mode) : 윈도우의 드래그와 같이 문자를 다중선택할 수 있는 모드
3. vi 편집기 실행
vi 편집기는 기본적으로 vi 파일명으로 실행시킬 수 있지만 아래와 같은 방법을 통해 실행시킬 수도 있다.
- vi 파일명
ex) vi.test.sh
- vi /절대경로/파일명
ex) vi /folder1/in/test.sh
- vi 상대경로/파일명
ex) vi ./in/test.sh
4. vi 편집기 명령어, 단축키
vi 편집기에는 수많은 명령어와 단축키가 있으나 모두 외울 수 없으므로 자신이 주로 사용하는 것 위주로 외우면 된다.
모드전환
i : 커서의 위치에 입력모드로 전환
- l : 커서가 위치한 줄의 맨앞에서 입력모드로 전환
a : 커서의 위치에서 뒤로 한칸 이동하여 입력모드로 전환
- A : 커서가 위치한 줄의 맨뒤에서 입력모드로 전환
- o : 커서의 위치에서 아래줄을 추가한 뒤 입력모드로 전환
- O : 커서의 위치에서 윗줄을 추가 한 뒤 입력모드로 전환
- s : 커서가 위치한 글자를 지우고 입력모드로 전환
- S,cc : 커서가 위치한 줄을 지우고 입력모드로 전환
- cw : 커서의 위치에서 오른쪽에 있는 문자를 모두 삭제 후 전환
esc : 현재 작업 중인 내용은 종료하고 명령모드로 전환
커서 이동
h, ← : 커서의 위치에서 왼쪽으로 한칸 이동
l, ← : 커서의 위치에서 오른쪽으로 한칸 이동
k, ↑ : 커서의 위치에서 위쪽으로 한줄 이동
j, ↓ : 커서의 위치에서 아래쪽으로 한줄 이동
- [[ : 맨 위쪽 줄로 이동
- ]] : 맨 아래쪽 줄로 이동
- { : 이전 문단의 시작점으로 이동
- } : 다음 문단의 끝지점으로 이동
- ( : 이전 문장의 시작점으로 이동
- ) : 다음 문장의 끝지점으로 이동
b : 이전 단어의 첫 글자로 이동
- B : 이전 단어의 첫 글자로 이동(특수문자 무시)
w : 다음 단어의 첫 글자로 이동
- W : 다음 단어의 첫 글자로 이동(특수문자 무시)
- e : 다음 단어의 끝 글자로 이동
- E : 다음 단어의 끝 글자로 이동(특수문자 무시)
- H : 현재 보이는 화면의 맨 위쪽으로 이동
- M : 현재 보이는 화면의 중간으로 이동
- L : 현재 보이는 화면의 맨 아래쪽으로 이동
- 0(숫자), ^ : 커서가 위치한 줄의 맨 처음으로 이동
- $ : 커서가 위치한 줄의 맨 끝으로 이동
- '+' : 커서의 위치에서 다음 줄의 맨 처음으로 이동
- '-' : 커서의 위치에서 다음 줄의 맨 끝으로 이동
- 3l(숫자3, 소문자 l) : 커서가 위치에서 3번 째 뒤 글자로 이동(숫자 변경 가능)
- 3H : 현재 보이는 화면의 처음 줄로부터 3줄 아래로 이동
- 3l : 현재 보이는 화면의 마지막 줄로부터 3줄 위로 이동
- gg : 파일의 제일 위쪽 줄로 이동
G : 파일의 제일 아래쪽 줄로 이동
3G, :3 : 파일의 3번째 줄로 이동
- ctrl + d : 반 페이지 위로 이동
- ctrl + u : 반 페이지 아래로 이동
- ctrl + b : 한 페이지 위로 이동
- ctrl + f : 한 페이지 아래로 이동
- 3% : 파일의 3%에 위치한 줄로 이동
- " : 이전 커서 위치로 이동
삭제
- x, dl : 커서 위치에 있는 글자 삭제
- 3x : 커서 위치에 있는 글자포함 3글자 삭제
X, dh : 커서 앞에 있는 글자 삭제
dw : 커서 뒤에 있는 단어 삭제
db : 커서 앞에 있는 단어 삭제
dd : 커서가 위치한 줄 삭제
- 3dd : 커서가 위치한 줄과 아래 2줄 삭제
- dj : 커서가 위치한 줄과 아래 줄 삭제
- 3dj : 커서가 위치한 줄과 아래 3줄 삭제
- dk : 커서가 위치한 줄과 위 1줄 삭제
- 3dk : 커서가 위치한 줄과 위 3줄 삭제
- d$, D : 커서의 위치에서 줄 끝까지 삭제
- d0(숫자0), d^ : 커서의 위치에서 줄 맨 앞까지 삭제
- :3 d : 파일의 3번째 줄 삭제
- :3,10 d : 파일의 3번째 줄부터 10번째 줄까지 삭제
복사 / 붙여넣기
yy : 커서가 위치한 줄 복사
- 3yy : 커서가 위치한 줄과 아래 2줄 복사
yw : 커서 뒤에 있는 단어 복사
- 3yw : 커서 뒤에 있는 3개의 단어 복사
yb : 커서 앞에 있는 단어 복사
- 3yb : 커서 앞에 있는 3개의 단어 복사
p : 복사한 내용을 커서 뒤에 붙여넣음
P : 복사한 내용을 커서 앞에 붙여넣음
- :3 co 10 : 3번째 줄을 복사하여 10번째 줄 아래에 붙여넣음
- :1,3 co 10 : 1~3번째 줄을 복사하여 10번째 줄 아래에 붙여넣음
- :3 m 10 : 3번째 줄을 10번째 줄 아래로 이동
- :1,3 m 10 : 1~3번째 줄을 10번째 줄 아래로 이동
- :r hagsig.txt : 커서가 위치한 줄 아래에 hagsig.txt 파일의 내용을 붙여넣음
- :3 r hagsig.txt : hagsig.txt 파일의 내용을 3번째 줄 아래에 붙여넣음
다중 선택
- v : 커서를 이동해 글자 단위로 블럭 선택 가능
- V : 커서를 이동해 줄 전체를 블럭 선택 가능
- ctrl + v : 마우스 드래그와 같은 형식으로 블럭 선택 가능
다중 선택 중 명령
- y : 선택한 블럭 복사
- d : 선택한 블럭 삭제
- U : 선택한 블럭 안의 소문자를 대문자로 바꿈
- u : 선택한 블럭 안의 대문자를 소문자로 바꿈
- ~ : 선택한 블럭 안의 문자를 대소문자로 전환
- J : 선택한 블럭들의 줄을 합침
- ':' : 선택한 영역들에 ex명령 실행
- esc : 블럭 선택 취소
저장 / 불러오기 / 종료 / 최소화
:w : 파일의 변경 내용을 저장
- :w hagsig.txt : 파일의 변경내용을 hagsig.txt이라는 파일 이름으로 저장
- :w >> hagsig.txt : hagsig.txt 파일에 편집 중인 파일의 내용을 덧붙여서 저장
- :w! : 파일의 변경 내용을 강제로 저장
:q : 파일의 변경 내용을 저장하지 않고 종료
:q! : 파일의 변경 내용을 저장하지 않고 강제로 종료
:wq 파일 이름 : 저장 후 파일 이름 지정
:x, ZZ : 파일의 변경 내용을 저장하고 종료
- :wq!, :x! : 파일의 변경 내용을 강제로 저장하고 종료
- :sh : 편집기 최소화(exit: 편집상태로 돌아올 수 있음)
- :o hagsig.txt, :e hagsig.txt : 편집 중인 파일을 hagsig.txt 파일로 변경
- :e! : 마지막 저장 내용으로 되돌림
- :e# : 바로 이전에 열었던 파일을 불러옴
- :args : 편집 중인 파일 목록 표시
- :n : 다음 파일 편집
- :prev : 이전 파일 편집
검색
/, :/ : 바로 이전에 검색한 문자를 정방향으로 검색
?, :? : 바로 이전에 검색한 문자를 역방향으로 검색
- :/hagsig : hagsig이라는 문자를 정방향으로 검색
- :?hagsig : hagsig이라는 문자를 역방향으로 검색
- :/hagsig/=, :?hagsig?= : hagsig이라는 문자가 위치한 줄 번호 표시
검색 중 명령
n : 검색한 문자가 여러 개일 경우 다음 문자 검색
N : 검색한 문자가 여러 개일 경우 이전 문자 검색
문자 수정
- r : 커서가 위치한 글자 하나를 입력한 값으로 수정
- r _ enter : 커서가 위치한 글자 하나를 지우고 줄 바꿈
- xp : 커서가 위치한 글자 하나아 다음 글자의 위치를 바꿈
- :s/tistory/hagsig : 커서가 위치한 줄에서 tistory를 hagsig으로 수정
:%s/tistory/hagsig : 파일 전체에서 tistory를 hagsig으로 수정
- :1,3 s/tistory/hagsig : 파일의 1~3줄에서 tistory를 hagsig으로 수정
- 1, s/tistory/hagsig : 파일의 1~현재줄까지 tistory를 hagsigdmfh 수정
- :g/tistory/s//hagsig/gc : tistory라는 문자를 hagsig으로 수정할지 물어봄`
문자 수정 시 옵션
- g : 문자 수정 범위를 파일 전체로 잡음(global)
- c : 문자 수정 여부를 물어봄(confirm)
- i : 문자 수정 시 대소문자를 구분하지 않음(ignore-case)
예시
:%s/old/new : 각 행의 처음 나오는 old를 찾아 new로 바꾼다
:%s/old/new/g: 모든 old를 찾아 new로 바꾼다
:%s/old/new/gc: 모든 old를 찾아 new로 바꾸기 전에 물어본다.
- :%s/tistory/hagsig/ig : 파일 전체에서 대소문자를 구별하지 않고 문자 수정
- :1,3 s/tistory/hagsig/c : 문자 수정 여부를 물어본 뒤 처리
- :%s/tistory/hagsig/igc : 파일 전체에서 대소문자를 구변하지 않고 질의 후 문자 수정
화면 분할
- ctrl + w + s, :sp, :split : 현재 편집창을 두 개의 수평 창으로 나눔
- ctrl + w +n, :new : 새로운 수평 편집창 생성
- ctrl + w + ^ : 새로운 수평 편집창에 이전 파일을 표시(다중 편집 시 가능)
- ctrl + w + q, ctrl + w +c, :q, :close : 커서가 위치한 창을 닫음
- ctrl + w + o : 커서가 위치한 창만 남기고 모든 창을 닫음
- ctrl + w + j : 커서가 위치한 창의 아래쪽 창으로 커서 이동
- ctrl + w + k : 커서가 위치한 창의 위쪽 창으로 커서 이동
- ctrl + w + w : 순차적으로 커서를 다음 창으로 이동(정방향)
- ctrl + w + W : 순차적으로 커서를 다음 창으로 이동(역방향)
- ctrl + w + p : 바로 이전에 커서가 위치 했던 창으로 커서 이동
- ctrl + w + t : 제일 위에 있는 창으로 커서 이동
- ctrl + w + b : 제일 아래에 있는 창으로 커서 이동
- ctrl + w + r : 순차적으로 커서가 위치한 창과 다음 창을 바꿈(정방향)
- ctrl + w + x : 바로 이전에 커서가 위치 했던 창과 현재 창의 위치를 바꿈
- ctrl + w + J : 커서가 위치한 창을 제일 아래쪽 창으로 이동
- ctrl + w + K : 커서가 위치한 창을 제일 위쪽 창으로 이동
- ctrl + w + = : 창의 크기를 모두 동일하게 바꿈
- ctrl + w + _ : 커서가 위치한 창을 최대 크기로 바꿈
- ctrl + w + + : 커서가 위치한 창의 크기를 한줄 만큼 증가
- ctrl + w + - : 커서가 위치한 창의 크기를 한줄 만큼 감소
- ctrl + w + 3+ : 커서가 위치한 창의 크기를 3줄 만큼 증가
- ctrl + w + 3- : 커서가 위치한 창의 크기를 3줄 만큼 감소
기타
u : 이전으로 되돌리기 (Undo)
ctrl + r : 되돌리기한 것을 다시 실행 (Redo)
:set number: 행번호를 출력 (간단하게 :set nu)
:set nonumber: 행번호를 숨긴다. (간단하게 :set nonu)
:cd: 현재 디렉토리를 출력
- := : 현재 편집 중인 파일이 총 몇 줄인지 표시
- :!명령어 : 편집기에서 시스템 명령어를 사용(예시 :!ifconfig)
- << : 커서가 위치한 줄
맨 앞의
탭 제거
- >> : 커서가 위치한 줄
맨 앞에
탭 제거
참조