vi를 자주 사용하지만
항상 사용하는 단축키만 사용해서.. 이번기회에 다시 정리해본다
Terminal 설정
% vi 라고 입력했을 때 에러(error)가 나는 경우
csh(C Shell) : .login file에 setenv TERM vt100
sh(Bourne Shell) : .profile file에 TERM=vt100; export TERM
Mode
명령 모드 : 명령을 입력할 수 있는 모드
입력 모드 : ‘I’를 입력하여 입력이 가능한 모드
vi를 이용한 문서 작성
% vi [작성할 file name]
커서의 이동
문자 단위의 이동
대부분의 터미널에서는 화살표키로 이동 가능
만약 화살표카가 지원되지 않는 경우는 다음의 키를 이용
줄단위의 이동
n : 현재 행으로부터 n번째 행으로 이동
+ : 다음 행의 처음으로 이동
- : 이전 행의 처음으로 이동
단어, 문장 절 단위이동
f 문자 : 다음에 나타나는 “문자”로 이동
F 문자 : 이전에 나타나는 “문자”로 이동
( : 문장의 처음으로 이동
) : 문장의 끝으로 이동
; : 같은 방향으로 다음 “문자”로 이동
{ : 커서가 인접한 패러그래프의 시작위치로 이동
} : 커서가 인접한 이전 패러그래프의 시작위치로 이동
화면 단위 이동
^B : 이전 화면으로 이동
^F : 다음 화면으로 이동
^U : 반화면 앞으로 이동
^D : 반화면 뒤로 이동
z :커서의 위치를 화면의 Top으로 스크롤
z. : 커서의 위치를 화면의 중앙으로 스크롤
z- : 커서의 위치를 화면의 bottom으로 스크롤
^L : 화면의 재 출력
삽입과 지우기, 복구, 교체
삽입
i : 현재 커서의 위치부터 삽입
a : 현재 커서의 위치 다음부터 추가 시작
A : 현재 줄의 마지막에 추가 시작
I : 현재 줄의 처음에 추가 시작
o : 현재 라인의 아래에 새로운 라인을 열어준다.
O : 현재 라인의 위에 새로운 라인을 열어준다.
지우기
x : 커서 위치의 한 문자를 지운다.
X : 커서 이전의 한 문자를 지운다.
dd : 현재의 행을 지운다.
ndd : n개의 라인을 지운다.
dG : 현재 행부터 file의 끝까지 지운다
d0(숫자 0) : 행의 시작부터 현재 앞 문자까지 지운다.
d1G : 현재 행부터 file의 시작까지 지운다.
dnG : 현재 행에서 n번째까지 지운다.
복구
p : 버퍼의 내용을 현재 줄 이전에 복구한다.
P : 버퍼의 내용을 현재 줄 다음에 복구한다.
VI -r [작업하던 file name] : 시스템이 갑자기 꺼졌을 때 복구 명령
교체
cw : 현재 위치에서 단어 교체
cfc : 현재 위치에서 'c' 문자까지 변경
' . ' : VI에서 마지막 명령을 반복하라는 뜻이다.
검색 치환
검색
/문자열 : 문자열을 앞으로 검색한다.
?문자열 : 문자열을 뒤로 검색한다.
치환
[범위]s/old/new/[cgi] : old를 new로 치환해 준다.
[범위] : 숫자, $, .(현재 위치)등을 지정한다.
[cgi] : c는 변경시 변경여부를 묻는 플래그
g는 한 줄의 모든 것을 변경하는 것이고 I 는 검색시 대소문자를 구분하지 않는다.
예) 10,$s/old/new/g : 10줄에서 파일의 끝까지 수행
g/foobar/s/bar/baz/g : 전체 file에서 “foobar”를 찾아서 “foobar” 중 bar를 baz로 치환한다.
블록 명령
블록을 file에 저장, 첨가
명령모드 ":" 프롬프트 상에서
: 10,20w [file name] : 블록을 file에 저장
: 10,20w >> [file name] : 블록을 file에 추가
블록 읽어 오기
: 10,20r [file name] : 10에서 20까지에 file을 읽어 현재 줄에 삽입
블록 자르기
여러분이 수정을 하거나 삭제를 하면 버퍼에 그 내용을 복사를 합니다. 여기서 필요한 부분을 버퍼에 복사하는 것을 yank 라 합니다. 이 내용을 나중에 다시 불러와서 사용할 수 있습니다.
buffer에도 이름을 부여하여 블록을 저장할 수 있습니다. ( " 사용)
"name5dd : 현재 줄에서 5줄을 삭제하고 name으로(여러분이 부여한) 버퍼에 기록
블록 복사
yw : 한 단어 버퍼에 기록
y$ : 줄의 끝까지 기록
yy : 현재 줄을 버퍼에 기록
역시 name을 주어 buffer에 기록 할 수 있다.
블록 붙이기
커서를 원하는 곳으로 이동한 후
p : 현재 커서 위치 오른쪽에 추가한다.
P : 현재 커서 위치 왼쪽에 추가한다.
namep : buffer에 있는 name의 블록을 현재 위치에 추가
다른 file 편집
% vi file file file file ......
다른 file로 이동할 때는 : 프롬프트 상에서 :n 이라 입력한다.
: shell 이라 치면 VI를 종료하지 않고 shell 화면으로 나갈 수 있다.
다시 VI로 이동할 때는 exit라 입력한다.
VI 환경 설정
VI에도 환경을 설정할 수 있습니다.
Vi 상태에서 :set all을 입력하면 현재 사용중인 VI의 옵션 지정상태를 볼 수 있습니다.
이러한 옵션은 여러분의 HOME DIRECTORY에 .exrc란 file에 지정하지 않으면 디폴트값을 사용합니다.
다음은 현재 저자의 .exrc 의 내용입니다.
VI 중요한 옵션 옵션
약자
Default Value
의미
autoindent ai noai 자동 들여쓰기, 즉 바로 전의 행과 시작을 같이함
ignorecase ic noic 탐색에 있어 대소문자를 구별하지 않음
magic magic * [ ~ 등을 탐색 또는 정규 표현식의 와일드 카드로 또는 메타문자로 사용
numver nu nonu 에디터 각 행에 행번호가 매겨짐
redraw noredraw 각 문자를 항상 알맞은 위치에 나타내 줌
noredraw은 1200보울 이하의 느린 터미널에 쓰임
tabstap ts ts=8 Tab키 또는 Ctrl-I에 대응되는 공백의 개수 저장
wrapscan ws ws / 또는 ? 연산자로 탐색을 하는 경우 사용됨
wrapmargin wm ws=0 오른쪽 여백의 크기를지정
명령모드 ( ! 대소문자 철저히 구별 ! )
* 커서 이동 하기 *
좌화살표키
커서를 한 위치 앞으로 이동
w
커서를 다음 단어의 첫번째 문자로 이동
우화살표키
커서를 한 위치 뒤로 이동
]]
커서를 다음 단락 경계로 이동
상화살표키
커서를 한 위치 위로 이동
[[
커서를 이전 단락 경계로 이동
하화살표키
커서를 한 위치 아래로 이동
)
커서를 다음 문장의 앞으로 이동
-
커서를 앞 라인 시작위치로 이동
(
커서를 다음 문장의 앞으로 이동
+
커서를 다음 라인 시작위치로 이동
}
커서를 다음 절의 앞으로 이동
0(영)
커서를 현재 라인의 시작위치로 이동
{
커서를 이전 절의 앞으로 이동
$
커서를 현재 라인의 끝으로 이동
H
커서를 편집버퍼의 첫번째 라인으로 이동
^
커서를 현재 라인의 탭으로 이동
L
커서를 편집버퍼의 마지막 라인으로 이동
b
커서를 이전 단어의 처음 문자로 이동
M
커서를 편집버퍼의 중간 라인으로 이동
e
커서를 다음 단어의 마지막 문자로 이동
* 편집버퍼를 통해 이동하기 *
ctrl B
한 화면 위로 이동
nG
n 번째 라인으로 이동
ctrl D
반 화면 아래로 이동
1G
첫번째 라인으로 이동
ctrl F
한 화면 아래로 이동
G
마지막 라인으로 이동
ctrl U
한 화면 위로 이동
* vi 편집 명령 1 *
~
활자체를 변경한다
dd
현재 라인을 삭제한다
move
새 텍스트를 삽입하여 커서 위치에서 대치한다
:line
지정된 라인의 시작으로 간다
cc
새 텍스트를 삽입하여 라인 전체를 대치한다
:lined
지정된 라인을 삭제한다
C
새 텍스트를 라인 끝에 대치한다
D
커서에서 행끝까지 삭제
ddp
두 라인의 순서를 바꾼다
x
커서의 위치에 있는 문자를 삭제
r
한 문자를 대치하나 입력모드로 가지않는다
X
커서의 왼쪽에 있는 문자 삭제
s
삽입에 의해 현재라인을 대치한다
:liner 파일명
지정된 라인뒤에 파일내용 삽입
xP
두 문자의 순서를 바꾼다
:r 파일명
현재 라인뒤에 파일내용 삽입
deep
두 단어의 순서를 바꾼다
:r !command
현재 라인뒤에 명령실행 출력 삽입
.
마지막 명령을 반복한다
:liner !command
지정된 라인뒤에 커맨드 출력 삽입
u
마지막 명령을 취소한다 (uu는취소를 취소)
:linecotarget
지정된 라인을 복사하고 타겟뒤에 삽입
U
현재 라인을 복구
:line,linecotarget
지정된 범위를 복사하고 타겟뒤에 삽입
ctrl I
화면을 리프레쉬
:linemtarget
지정된 라인을 이동하고 타겟뒤에 삽입
dmove
커서의 움직임으로 삭제한다
:line,linemtarget
지정된 범위를 이동하고 타겟뒤에 삽입
dG
현재 라인에서 버퍼의 끝까지 삭제한다
* vi 편집 명령 2 *
:!command
vi를 멈추고 지정된 쉘 명령을 실행
:w
vi를 끝내지 않고 원래 파일에 저장
:!!
vi를 멈추고 이전 쉘 명령을 실행
:w 파일명
지정된 파일명에 저장
:sh
vi를 멈추고 쉘을 시작
:w> 파일명
지정된 파일의 끝에 데이타 저장
:!csh
vi를 멈추고 C쉘을 시작
:q
저장하지 않고 끝내기
ZZ
데이터를 자장하고 끝내기
* vi에서 입력 모드를 호출하는 명령 *
a
현재 커서뒤에 새 텍스트를 추가
I
현재 라인의 처음부터 새텍스트를 삽입
A
현재 라인의 끝에 새 텍스틀 모드를 추가
o
현재 라인의 앞에 새라인을 오픈하고 추가시작
c
변경을 시작한다
O
현재 라인의 뒤에 새라인을 오픈하고 추가시작
C
라인의 끝에서 변경을 시작
R
새문자들로 텍스트를 덮어쓴다
i
커서 위치 앞에서 텍스트를 삽입
vi 환경설정
홈디렉토리에 .exrc파일에서
.. set nocompatible " Vim 디폴트 기능들을 사용함
set backspace=2 " 삽입 모드에서 백스페이스를 계속 허용
set autoindent " 자동 들여쓰기
set cindent " C 언어 자동 들여쓰기
set smartindent " 역시 자동 들여쓰기
set textwidth=76 " 76번째 칸을 넘어가면 자동으로 줄 바꿈
set nowrapscan " 찾기에서 파일의 맨 끝에 이르면 계속하여 찾지 않음
"set nobackup " 백업파일을 만들지 않음
set novisualbell " 비주얼벨 기능을 사용하지 않음
set nojoinspaces " J 명령어로 줄을 붙일 때 마침표 뒤에 한칸만 띔
set ruler " 상태표시줄에 커서 위치를 보여줌
set tabstop=4 " <Tab> 간격
set shiftwidth=4 " 자동 들여쓰기 간격
"set keywordprg=edic " K를 눌렀을 때 실행할 명령어
set showcmd " (부분적인) 명령어를 상태라인에 보여줌
set showmatch " 매치되는 괄호의 반대쪽을 보여줌
set ignorecase " 찾기에서 대/소문자를 구별하지 않음
set incsearch " 점진적으로 찾기
set autowrite " :next 나 :make 같은 명령를 입력하면 자동으로 저장
set title " 타이틀바에 현재 편집중인 파일을 표시