2015. 10. 18. 13:31ㆍ개발노트
명령모드(Command mode)
한 문자 또는 두 문자로 구성된 vi 전용 명령어를 사용하는 모드로서 "커서이동/문자삭제/문자(열)교체/문자열검색" 등을 할 수 있는 모드를 의미합니다. vi를 처음 실행하면 명령모드로 시작합니다. vi는 대문자와 소문자 명령을 구분하게 되며 이런 점에 유의하여 잘 사용해야 합니다.
입력모드(Input mode)
vi 편집화면에서 문자를 입력할 수 있는 상태를 의미합니다. 명령모드에서 입력모드로 전환할 수 있는 명령어인 i, a, o, I, A, O, R 등으로 명령을 내리면 입력모드로 전환됩니다. 입력모드로 전환되면, 화면 하단에 "--INSERT--"라고 표시됩니다. 이 상태에서 <Esc> 키를 누르면 다시 명령모드로 전환됩니다.
EX모드(execution mode)
vi의 특별한 명령어를 실행하는 실행모드를 의미합니다. 명령모드에서 콜론(:)을 누르면 vi 화면 하단 좌측에 vi 특수 명령어를 입력할 수 있는 ":"이 나타납니다. 이 상태에서 vi의 특별한 명령어를 사용할 수 있습니다.
이동 명령
vi에서 이동 명령은 앞에서 배운 명령모드 상태에서 이루어집니다.
글자단위 이동
h : 왼쪽으로 한 글자 이동
l : 오른쪽으로 한 글자 이동
k : 아래쪽으로 한 글자 이동
j : 위쪽으로 한 글자 이동
단어단위 이동
W : 다음 단어의 처음으로 이동
B : 현재 단어의 처음으로 이동
E : 다음 단어의 끝으로 이동
행, 문장 및 단락의 처음과 끝으로 이동
0 또는 ^ : 현재 행의 다음 행으로 이동
$ : 현재 행의 맨 끝으로 이동
+ : 다음 행의 처음으로 이동
- : 이전 행의 처음으로 이동
( : 문장의 시작으로 이동
) : 문장의 끝으로 이동
{ : 단락의 시작으로 이동
} : 단락의 끝으로 이동
화면 내에서 행 단위로 이동
H : 현재 화면의 맨 위로 이동
M : 현재 화면의 가운데행으로 이동
L : 현재 화면의 맨 아래로 이동
한 화면씩 스크롤
Ctrl + F : 한 화면 다음으로 이동
n + Ctrl + F : n 화면 다음으로 이동
Ctrl + B : 한 화면 이전으로 이동
n + Ctrl + B : n 화면 이전으로 이동
Ctrl + D : 반 화면 다음으로 이동
n + Ctrl + D : n 행 다음으로 이동
Ctrl + U : 반 화면 이전으로 이동
n + Ctrl + U : n행 이전으로 이동
행 번호를 알 경우
[행번호]G : 원하는 행으로 직접 이동
입력하기
i : 현재 위치부터 입력
I : 현재 행 맨 처음부터 입력
a : 현재 위치 다음부터 입력
A : 현재 행 끝부터 입력
o : 현재 행 다음 행에 입력
O : 현재 행과 앞 행 사이에 입력
저장 및 종료
저장을 하기 위해서는 우선 입력모드에서 빠져 나와 명령모드로 변경해야 합니다. <Esc> 키를 눌러 명령모드로 바꾼 뒤에, ":w test.txt"와 같이 명령을 내리면 test.txt 이름으로 문서가 저장됩니다. 그리고 ":q" 명령을 내리면 vi가 종료됩니다. 다음과 같이 ":wq test.txt"와 같이 혼합하여 사용합니다. 만약 기존 문서를 연 상태라면 ":w", ":q", ":wq" 등의 명령을 내립니다.
명령 뒤에 ":q!"와 같이 "!"을 붙이는 경우도 있는데, 이것은 명령을 강제로 적용할 때 사용합니다. ":q!" 명령은 종료를 강제로 하는 것을 의미합니다. 저장하지 않고는 종료가 불가능하기 떄문에 저장하지 않고 그냥 종료를 원할 때 사용합니다. 그리고 쓰기 권한이 없으나 자신 소유의 파일일 경우에도 "w!"와 같이 강제 명령을 내려서 사용할 수 있습니다.
:w : 불러온 파일명으로 데이터 저장
:w [파일명] : 지정 파일명으로 데이터를 저장
:w >> [파일명] : 지정 파일명으로 데이터를 추가하여 저장
:w! : 강제 저장
:q : 종료
:q! : 저장 없이 강제 종료
:wq : 파일 저장 후 종료. 파일명 지정 가능.
:wq! : 강제로 파일 저장 후 종료. 파일명 지정 가능.
ZZ : 파일을 저장하고 vi 종료
:x : 파일에 변경이 있었다면 파일을 저장하고 vi를 종료
삭제, 수정 및 복사
한 글자 삭제하기
명령모드에서 지우고자 하는 글자에 커서를 이동한 뒤 "x"를 누르면 커서 위치부터 뒷 글자가 한자씩 지워지며 당겨지게 됩니다. 이처럼 "x" 명령은 글자를 한 글자씩 지우는 역할을 하게 됩니다.
한 단어 삭제하기
명령모드에서 "dw" 명령을 내리면 한 단어가 삭제됩니다. 그리고 "cw" 명령을 내리면 한 단어를 삭제하고 다른 내용을 삽입할 수 있도록 합니다. 앞에서 알아본 "x" 명령으로 계속 지운 후 "i"를 이용해서 다시 써야 하는 불편한 경우에 아주 유용합니다.
줄 단위로 삭제하기
명령모드에서 지우고자 하는 행으로 이동한 뒤 "dd" 명령을 입력하면 현재 줄이 삭제되게 됩니다. 그럼 현재 커서가 위치한 행에서 커서 위치 뒷부분의 글들을 모두 지우고 싶을 때는 행의 끝을 가리키는 정규 표현식인 "$"를 함께 사용하면 됩니다.
실행취소(Undo)
Undo 기능은 지금까지 실행한 것들을 역순으로 돌려놓는 것입니다. 명령모드에서 "u"를 실행하여, 앞에서 실행했던 명령을 취소할 수 있습니다.
복사 및 붙이기
우선 복사를 원하는 행으로 이동합니다. 커서가 그 행의 어떤 위치에 있든 상관은 없습니다. "yy"라는 명령은 한 줄을 버퍼에 넣는 명령으로 복사와 비슷합니다. 명령모드에서 "yy"를 입력하면, 버퍼에 현재 행이 복사됩니다. 붙이기를 할 행의 한 줄 전에서 "p"를 입력하면 아래 한 줄이 밀리면서 붙여집니다. 대문자 "P"를 입력하면, 아랫줄이 아닌 윗줄로 붙이기가 됩니다.
두 파일 합치기
두 개의 파일을 합쳐야 할 경우 ":r" 명령을 사용할 수 있습니다. 다음 화면에서 명령 전에 커서가 위치했던 곳 뒷부분에 cut.txt에 저장되었던 세 줄이 붙여졌습니다. 만약 현재 파일의 뒷부분에 내용을 붙이려면 커서를 마지막에 두고 r 명령을 내리면 됩니다.
삭제, 수정 및 복사에 관한 명령들
x : 현재 위치에서 한글자 삭제하기
X : 현재 위치에서 앞글자 삭제하기
dd : 현재 행 지우기
D : 현재 위치에서 행의 끝까지 지우기
dw : 단어 삭제하기
cw : 단어 삭제 후 입력
d$ : 커서가 있는 곳부터 행의 끝까지 지우기
dG : 커서가 있는 곳부터 파일 끝까지 지우기
p : 마지막으로 지워진 내용을 커서의 뒤/아래에 삽입
P : 마지막으로 지워진 내용을 커서의 앞/뒤에 삽입
xp : 두 문자를 바꿈
deep : 두 단어를 바꿈
ddp : 두 줄을 바꿈
yy : 현재 행을 복사
u : 바로 전에 수행한 명령 취소
U : 바로 전에 수행한 행의 모든 명령 취소
r : 다른 파일의 내용을 읽어 들여 붙이기
패턴 찾기
/문자열 : 아래 방향으로 문자열 검색
/ : 이전 패턴에 대해 아래 방향으로 검색을 반복
?문자열 : 위 방향으로 문자열 검색
? : 이전 패턴에 대해 위 방향으로 검색을 반복
n : / 또는 ? 명령에 대해 같은 방향으로 반복 검색
N : / 또는 ? 명령에 대해 반대 방향으로 반복 검색
외부 명령어 실행
콜론(:)을 누른 후에 느낌표(!)를 입력하고 이것을 붙여서 외부 쉘 명령을 입력한 후에 <Enter>를 누르면 외부 명령어가 실행됩니다. 실행된 후에 다시 <Enter>를 누르면 vi 편집 화면으로 돌아갑니다.
화면상태 제어
^L : 화면을 다시 디스플레이
:set nu : 편집 중인 문서의 행 번호를 보여줌
:set number : :set nu와 동일
:set nonu : 편집 중인 문서의 행 번호를 보여주지 않음
:set nonumber : :set nonu와 동일
약자의 사용
:ab short long : short를 long에 대한 약어로 변경
:ab : 현재 약어 목록을 표시.
:una short : 편집 중인 문서의 줄 번호를 보여주지 않음
화면 줄 길이 조정
r <Return> : 문자를 뉴 라인으로 변경
J : 줄의 결합
:set wm=n : 오른쪽으로 n 문자 위치에서 자동적으로 줄 나눔
문자열 치환
:g/search-string/s//replace-string/g : 앞부분의 문자열을 찾아서 뒷부분의 문자열로 대체
:s/str/rep/ : 현재 행의 str을 rep로 대체
:1,.s/str/rep/ : 1부터 현재 행의 str을 rep로 대체
:%s/str/rep/g : 파일 전체 str을 rep로 전부 대체
:.$/aaa/bbb/ : 커서의 위치로부터 파일의 끝까지 있는 모든 aaa를 bbb로 대체
multi file 작업하기
vi * 로 폴더의 모든 파일 열기
:n 다음파일 열기
:n! 다음파일 강제로 열기