vi 메뉴얼
OS/리눅스 & 유닉스 2010. 4. 22. 17:12커서의 위치를 움직이는 명령(Move commands)
N에 *가 있는 경우 숫자를 사용할 수 있고, -의 경우 사용할 수 없다.
N | 명령어 | 기능 |
---|---|---|
* | h or ^H or <erase> | 커서를 한칸(N칸) 왼쪽으로 이동시킨다. |
* | j | 커서를 한행(N행) 아래로 이동시킨다. |
* | l or <sp> | 커서를 한칸(N칸) 오른쪽으로 이동시킨다. |
* | k or ^P | 커서를 한행(N행) 위로 이동시킨다. |
* | $ | 커서가 위치한 행(N번째 행)의 끝으로 이동한다. |
- | ^ | 커서가 위치한 행의 처음으로 이동한다. |
* | + or <enter> | 다음행(N행 아래)의 처음으로 이동한다. |
- | 0 | 커서가 위치한 행의 처음으로 이동한다. |
* | | | N번째 column으로 이동한다. |
* | f<char> | 오른쪽으로 N번째 char를 찾는다. |
* | F<char> | 왼쪽으로 N번째 char를 찾는다. |
* | w | 커서부터 오른쪽 N번째 단어의 첫부분. |
* | W | 커서부터 오른쪽 N번째 WORD(tab,space,linefeed 뒤에 있는 단어)의 첫부분. |
* | b | 커서부터 왼쪽 N번째 단어의 첫부분. |
* | B | 커서부터 왼쪽 N번째 WORD의 첫부분. |
* | e | 커서부터 오른쪽 N번째 단어의 끝부분. |
* | E | 커서부터 오른쪽 N번째 WORD의 끝부분. |
* | G | 커서부터 N번째 라인으로.(default 화일의 끝). |
* | H | Screen의 위에서부터 N번째 라인으로. |
* | L | Screen의 아래에서부터 N번째 라인으로. |
- | M | Screen의 중간으로. |
* | ) | N개의 문장 뒤로. |
* | ( | N개의 문장 앞으로. |
* | } | N개의 paragraphs 뒤로. |
* | { | N개의 paragraphs 앞으로. |
- | ]] | 뒤의 N번째 section으로(default 화일의 끝). |
- | [[ | 앞의 N번째 section (default 화일의 처음). |
- | `<a-z> | Mark한 곳으로. |
- | '<a-z> | Mark가 있는 라인의 첫번째 CHAR로. |
- | `` | 가장 최근의 jump(예를 들어 `/'나 `G'를 사용한 jump)를 하기 직전의 위치로. |
- | '' | 가장 최근의 jump(예를 들어 `/'나 `G'를 사용한 jump)를 하기 직전의 라인의 첫 CHAR로. |
- | /<문자열> | 다음으로 <문자열>이 나오는 위치로. |
- | ?<문자열> | /를 반대방향으로 수행. |
- | n | 가장 최근의 `/'|`?' 를 반복한다. |
- | N | n을 반대방향으로의 수행. |
- | % | Braket( { } or [ ] or ( ) )을 찾고 그것의 match를(괄호가 닫힌 쌍)찾는다. |
찾기(Searching)
/<문자열> | 다음으로 <문자열>이 나오는 위치로. |
---|---|
?<문자열> | /를 반대방향으로 수행. |
:[x,y]g/<문자열>/<명령어> | x에서 y까지 <문자열>을 찾고(globally) <명령어>를 실행한다. |
:[x,y]v/<문자열>/<명령어> | x에서 y까지 문자열과 match되지 않는 라인에 <명령어>를 실행한다. |
취소(Undoing changes)
u | 가장 최근에 한 작업을 취소한다. |
---|---|
U | 만약 작업을 한 라인에서 벗어나지 않았다면, 그 라인에서 한 작업들을 모두 취소한다. |
:q! | Save하지 않고 vi를 끝낸다. |
:e! | 현재 편집중인 화일을 버리고 다시 편집한다. |
문자열 삽입(Appending text)
1. <esc>를 누르면 삽입 작업이 끝난다.
2. N에 *가 있는 경우 숫자를 사용할 수 있고, -의 경우 사용할 수 없다.
* | a | 커서의 오른쪽에 쓰기 시작한다. |
---|---|---|
* | A | 커서가 위치한 라인의 맨 끝에 쓰기 시작한다. |
* | i | 커서의 위치부터 쓰기 시작한다. |
* | I | 커서가 위치한 라인의 맨 처음부터 쓰기 시작한다. |
* | o | 커서가 위치한 라인 밑에 새로운 라인을 만들고 거기에 쓰기 시작한다. |
* | O | 커서가 위치한 라인 위에 새로운 라인을 만들고 거기에 쓰기 시작한다. |
* | . | 앞에 실행했던 명령을 N번 반복한다. |
문자열 삭제(Deleting text)
지운 것은 모두 buffer에 저장할 수 있다. 일단 지우는 명령을 실행하기 전에 "를 치고 a-z 중간의 한 문자를 치면 지운 것이 그 문자에 해당하는 buffer에 저장되게 된다. 참고로 Undo buffer는 가장 최근에 바꾼 것만 저장하게 되고, 1-9에 해당하는 buffer는 가장 최근의 9라인을 지운 것을 저장하게 된다.
* | x | 커서 오른쪽의 N개의 문자를 지운다. |
---|---|---|
* | X | 커서 왼쪽의 N개의 문자를 지운다. |
* | d<move> | 커서가 위치한 곳에서부터 <move>로 인해 움직인 위치까지 지운다. |
* | dd | 커서의 위치로부터 밑으로 N개의 라인을 지운다. |
- | D | 커서의 위치로부터 오른쪽의 문자를 모두 지운다. |
* | . | 최근에 실행했던 명령을 N번 반복한다. |
문자열 수정(Changing text)
<esc>를 누르면 바꾸는 작업이 끝난다.
* | r<char> | 커서의 위치로부터 N개의 문자를 <char>로 바꾼다. |
---|---|---|
* | R | 라인의 나머지를 덮어쓴다. |
* | s | N개의 문자를 교체한다. |
* | S | N개의 라인을 교체한다. |
* | c<move> | 커서의 위치로부터 <move>의 위치까지 바꾼다. 예를 들어 cw는 한 단어를 바꾸는 명령이다. |
* | cc | N개의 라인을 바꾼다. |
* | C | 라인의 나머지 부분을 바꾼다. |
- | ~ | 대문자와 소문자를 각각 소문자와 대문자로 바꾼다. |
* | J | N개의 라인을 연결한다. |
* | . | 가장 최근의 명령을 N번 반복한다. |
- | & | 가장 최근의 `ex'의 교체명령을 반복한다. |
- | :[x,y]s/<p>/<r>/<f> | x번째 라인에서 y번째 라인까지 <p>의 문자열을 <r>이라는 문자열로 교체한다. <f>는 여러가지 옵션인데, c는 확인을 요하는 옵션이고 g는 무조건 교체하라는 옵션이다. |
문자열 기억(yanking)
Yanking하기 전에 a-z, A-Z 까지의 문자중 하나를 친 후 yanking하는 경우 기억된 문자열이 각 문자에 해당하는 buffer에 저장된다. 그렇지 않은 경우 단순히 undo를 위한 buffer에 저장된다.
* | y<move> | 커서의 위치로부터 <*><move>후 움직인 위치까지 저장한다. |
* | yy | N개의 라인을 저장한다. |
* | Y | yy와 같은 역할. |
- | m<a-z> | 커서의 위치를 문자로 마크한다. |
저장, 다른 화일의 편집, vi를 끝내기.
:q | Buffer가 변하지 않은 경우 vi를 끝낸다. |
---|---|
:q! | 강제로 vi를 종료한다. |
^Z | vi를 종료한다. |
:w | 화일에 저장한다. |
:w <화일명> | <화일명>으로 저장한다. |
:w >> <화일명> | Buffer의 내용을 <화일명>에 붙인다. |
:w! <화일명> | 편집하고 있는 화일을 <화일명>에 강제로 저장한다. |
:x,y w <화일명> | x부터 y번째 라인의 내용을 <name>에 저장한다. |
:wq | 화일에 저장하고 vi를 끝낸다. 어떤 version에서는 저장이 제대로 되지 않는 경우도 있으므로 그 경우는 ZZ를 사용하면 된다. |
ZZ | Buffer의 내용이 변한 경우 화일에 저장하고 vi를 끝낸다. |
:x [<file>] | ZZ와 같지만, <file>에 저장하고 끝낸다. |
:x! [<file>] | `:w![<file>]' + `:q'. |
:f <화일명> | 현재 편집하고 있는 화일명을 <화일명>으로 바꾼다. |
:cd [<dir>] | 현재 작업하고 있는 디렉토리에서 <dir>로 바꾼다. (default는 홈 디렉토리이다.) |
:cd! [<dir>] | cd와 같지만, 변화를 저장하지 않는다. |
:e<화일명> | <화일명>으로 지정한 화일을 편집한다. |
:e!<화일명> | 현재 편집중인 변경된 화일을 버리고 <화일명>으로 지정한 화일을 편집한다. |
:rew | 최초의 화일로 돌아간다. |
:rew! | 현재 편집중인 변경된 화일을 버리고 최초의 화일로 돌아간다. |
:n [<files>] | 다음의 화일을 편집한다. |
:n! [<files>] | 현재 편집중인 변경된 화일을 버리고 다음의 화일을 편집한다.iting the current buffer. |
Display 명령어
^G | 화일명, 현재 라인의 위치, 전체 화일에 대한 상대적인 위치 등을 나타낸다. |
---|---|
^L | 스크린을 새롭게 한다.(refresh) |
[*]^E | 커서는 자기 자리에 그대로 있고(화면의 바깥으로 나가지 않는 이상) 화면 전체가 밑에서 N라인 위로 이동한다. |
[*]^Y | 커서는 자기 자리에 그대로 있고 화면 전체가 위에서 N라인 밑으로 내려온다. |
[*]^D | N라인 밑으로 scroll한다.(default: page의 반) |
[*]^U | N라인 위로 scroll한다.(default : page의 반) |
[*]^F | N 페이지 밑으로 간다. |
[*]^B | N 페이지 위로 간다. |
명령어와 문자열의 간단한 지정.(Mapping and abbreviation)
:map <생략형> <문자형> | <생략형>에 해당하는 문자(키보드의 키)에 대해 <문자형>에 해당하는 기능으로 변경한다. 예를 들어 :map V 'ap 라고 쓴다면 앞으로 명령모드에서 P라고 칠때마다 a에 해당하는 buffer를 붙이게 된다.(paste) 한가지 중요한 점은 만약 기존의 명령을 mapping하는 경우 기존의 명령보다 mapping한 것을 우선으로 취급하게 되므로 주의해야 한다. |
:map | 모든 mapping을 보여준다. |
:unmap <문자열> | 문자열에 해당하는 mapping을 취소한다. |
:map! <생략형> <문자형> | Append 모드에서 <생략>을 입력하면 무조건 <문자형>으로 치환된다. |
:map! | 모든 append 모드에서의 mapping을 보여준다. |
:unmap! <string> | Deprive <string> of its mapping (see `:unmap'). |
:ab <생략형> <문자형> | Append 모드에서 <생략형>을 입력한 후 ESC나 space, return키를 입력하면 <문자형>으로 전개된다. |
:ab | 모든 생략형을 보여준다. |
:unab <string> | 생략형을 취소한다. |
다른 명령계통으로의 전환 및 shell 명령어의 사용.
(Switch and shell commands)
Q | vi에서 ex 명령으로 전환한다. |
---|---|
: | ex명령어를 vi상에서 사용할 수 있게 한다. |
:vi | ex 에서 vi로 전환한다. |
:sh | 잠시 shell환경으로 나간다. 다시 vi로 돌아오려면 exit를 치면 된다. |
:[x,y]!<명령어> | x에서 y까지의 라인을 input으로 해서 shell의 <cmd>를 수행하여 그 output으로 대체한다. |
:[x,y]!! [<args>] | 가장 최근의 shell명령어를 수행하고 <args>를 붙인다. |
[*]!<move><cmd> | <move>까지의 라인을 input으로 하여 shell의 <cmd>를 수행하고 그 output으로 대체한다. |
[*]!<move>!<args> | <args>를 가장 최근의 <cmd> and execute it, using the lines described by the current <*><move>. |
[*]!!<cmd> | N 라인을 shell의 <cmd>명령어의 input으로 하여 그 output으로 그 라인들을 대체한다. |
:x,y w !<cmd> | x에서 y까지의 라인을 <cmd>의 input으로 한다. (w와 !사이에 space가 있는것에 주의.) |
:r!<cmd> | <cmd>의 output을 새로운 라인에 붙인다. |
:r <화일명> | <화일명>의 화일을 buffer에서 읽어들인다. |
vi를 시작할 때.(option)
vi [<files>] | file의 첫 페이지에서부터 edit하기 시작한다. |
앞서 설명했던 `:set'이나 `:map', `:ab' 등의 설정은 일단 vi를 종료하면 없어진다. 만약 이 설정이 매회 사용하는 것이라면 vi를 가동할 때 마다 이들 명령어를 입력하지 않으면 안된다. vi는 이들 설정을 홈 디렉토리의 `.exrc'라는 화일에 기술해 놓으면 가동시에 자동적으로 `.exrc'를 참조하여 set이나 map, ab등을 설정해 준다. .exrc에는 :이 필요없다. 다음의 예를 살펴보자.
set ai aw nu 자동 인덴트, 자동쓰기, 행 번호의 지정. set ts=4 탭 정지를 4로 지정. map! PO POSTECH PO라고 입력하면 자동적으로 POSTECH으로 변환.
이런 식으로 .exrc 화일을 만들면 된다. 만약 .exrc가 아닌 새로운 설정화일을 사용하려면, vi를 실행시킨 상태에서
:so file
이라고 쓰면 된다. 간단한 설정의 경우라면 `vi +<cmd> file', 의 형태로 vi를 시작할 수 있다.
vi +x file
커서가 x번째 라인으로 위치한 상태에서 vi가 시작된다.
vi +/<문자열> file
<문자열>이 처음 나타나는 위치에서 vi가 시작된다.
vi -t <tag>
지정한 tag를 사용하여 vi가 시작된다.
가끔씩 시스템의 에러로 vi가 비정상적으로 종료할 경우가 있는데, 이때에는 `vi -r file'의 명령을 사용하여 잃어버린 데이타를 찾을 수 있다. 그냥 `vi -r'을 치면 복구할 수 있는 화일의 리스트가 나타난다. 그리고 text를 단순히 보기만 할 경우(no change) `view'를 사용하거나 `vi -R'을 사용해서 text를 볼 수 있다.
중요한 옵션들(The most important options)
ai | autoindent - Indent(단락구분)을 한다. 되돌가갈 때는 <Ctrl>+<d> |
---|---|
aw | autowrite - 자동적으로 화일을 쓰기 시작한다. |
dir=<string> | directory - 임시 화일을 만들 디렉토리.(default /tmp) |
eb | errorbells - 실수를 한 경우 Beeps 음을 울린다.(모든 터미날에서 되는 것은 아니다. |
handtabs | vi의 단말 탭수를 설정한다. |
ic | ignorecase - 정규표현에서 대문자, 소문자의 구별을 하지 않는다. |
list | 탭(<lf>), 행말(`$')을 표시한다. |
mesg | vi가 발생하는 이외의 메시지도 화면에 표시한다. |
nu | number - 행 번호를 표시한다. |
readonly | 편집 화일을 write 금지 상테에서 read한다. 예외로서, `w!'를 실행했을 경우는 강제적으로 write된다. |
redraw | 편집에서의 삭제, 삽입시에 적극적으로 화면을 재표시한다. noredraw(초기설정값)일 때에 삭제, 삽입을 하면 공백분은 @표 표시되며 재표시되지 않는다. redreaw로 설정할 때는 통신 속도가 빠른 상태가 아니면 재표시를 하기 위하여 반응이 둔해지므로 주의해야 한다. |
remap | :map으로 치환된 문자/명령어를 :map에서 다시 다른 문자/명령어로 등록하는 것을 허가한다. |
report | 변경/삭제/대피에 의해 영향받았던 행수가 지정차를 초과하였을 경우, 화면 한단에 그 행수를 표시한다. |
showmatch | 대응하는 괄호끼리 커서를 뛰어넘는 `match 기능'을 ON으로 한다. |
showmode | 화면 우측 아래에 현재의 vi mode를 표시한다. |
terse | 에러 메시지를 약식 표시로 한다. |
warm | 편집에서 변경한 내용을 기록하지 않은 상태에서 `:!'로 시작되는 명령을 실행하였을 때에 `NO write since last change'라는 경고 메시지를 표시하도록 한다. |
wrapscan | 커서 위치에 관계 없이 버퍼 내 모두를 문자열 검색 대상으로 한다. now로 하였을 경우 문자열 검색은 현재의 커서 위치에서 최후의 문자까지 종료한다. |
writeany | 편집한 내용을 화일에 기록할 때의 vi에 의한 안전 체크를 해제한다. |
scroll | <Ctrl>+<Ctrl> <Ctrl>+<u>로 스크롤할 행수를 설정한다. |
tabstop | 화면에 표시되는 외관상의 탭수를 설정한다. |
wrapmargin | 오른쪽 마진을 설정한다. 설정한 마진수를 초과하면 화면이 옆으로 밀리지 않고 리턴으로 개행된다. 0(초기설정치)를 설정하면 이 기능을 OFF로 한다. |
paragraphs | 편집 텍스트 중 단락의 구분을 나타내는 문자조를 설정한다. vi는 이것에 의해 설정된 문자로 둘러싸인 블록을 하나의 단락으로 인식하여 문자조의 사이를 }과 {으로 이동시킬 수 있다. 이 이동에서는 섹션으로 설정된 문자조도 단락으로 간주한다. Default의 설정에서는 .IP, .LP, .PP, .P, .LI, .pp, .lp, .ip, .bp 10개의 문자조가 설정되어 있다. |
ections | paragraphs의 단락에 대해서 섹션은 절을 구획짓는 문자를 설정한다. 절 사이의 이동에는 [과 ]을 사용한다. 이 때 paragraph로 설정된 문자조를 단락으로 간주하지 않는다. Default로는 NH, .SH, .H, .HU, .us, .sh, .+c 의 7문자조가 설정되어 있다. |
옵션의 세팅과 확인.
:set <option> | <option>을 사용함. |
:set no<option> | <option>을 사용하지 않는다. |
:set <option>=<value> | <option>을 <value>값으로 지정한다. |
:set | Default가 아닌 모든 옵션들의 값들을 보여준다. |
:set <option>? | <option>에 해당하는 값을 보여준다. |
:set all | 모든 option과 각각의 값들을 보여준다. |
이 문서는 vi를 사용해 작성했습니다. 이 문서의 원 저자는 [출처] VI 에디터 사용법 II|작성자 튤립정원
Author: Maarten Litmaath <maart@nat.vu.nl> 입니다.