Technical Note/etc

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 " 타이틀바에 현재 편집중인 파일을 표시