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를 사용해 작성했습니다. 이 문서의 원 저자는
Author: Maarten Litmaath <maart@nat.vu.nl> 입니다.

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

crontab(1)  (0) 2010.05.18
vi 에디터  (0) 2010.05.07
grep 명령어  (0) 2010.04.20
리눅스 명령어  (0) 2010.04.20
vi 명령어  (0) 2010.04.20
: