2009. 7. 26. 16:22

[Linux][Vim] 명령어

소개
Vim Emacs 와 더불어 리눅스 최고의 편집기라 일컫어지는 텍스트 편집기이다. Vim 에는 입력모드와 명령모드 두 가지가 있다. 입력모드는 말 그대로 입력모드로 텍스트를 입력할 수 있다. 한편 명령모드는 저장, 복사, 치환 등과 같이 여러 가지 '명령' 을 수행하는 모드 이다. Vim 을 쓰는 방법은 매우 간단하다. 그냥 터미널에서 'vi 파일명' 을 치면 된다. 예를 들어 문서 hello.c 를 편집하고 싶다면 vi hello.c 를 치면 된다. 보통 vi 는 어떠한 리눅스 배포판이여도 기본적으로 깔려 있으므로 뭐 설치는 걱정 안해도 된다.

Vim 에는 자동 완성기능, 파일의 비교 및 병합기능과 통합된 도움말 시스템, 확장된 정규식 표현, 스크립트 언어 (Perl, Python, Ruby, Tcl ) 인터프리팅, gzip, bzip2, zip 등으로 압축된 파일 편집기술과 철자 체크, 창 분할, 구문강조, 유니코드 및 다국어 지원, 검색, 커서 위치기록 등과 같이 수 많은 기능을 가지고 있다. 또한 그 외에도 여러가지 플러그인 들이 상당히 유용하다. 예를 들자면 ctags, cscope, 그리고 대표적으로 taglist 까지 상당히 유용하다. 이 들은 모두 소스코드를 분석할 때 용이하게 쓰일 수 있으며 많이 애용된다. 이 들의 사용방법은 그다지 어렵지 않으므로 인터넷에 쳐 보면 쉽게 알 수 있다. 하지만 Vim 이 절대적으로 편리한 이유는 바로 마우스를 사용하지 않기 때문이다. Vim 에서는 모든 명령을 키보드로 처리하기 때문에 키보드에서 손을 떼어 마우스를 잡은 후 다시 키보드에 손을 대는 이런 귀찮은 행동을 할 필요가 사라진다.

보통 많은 사람들이 Vim 을 그대로 사용하지 않고 여러가지 설정을 해준다. root 계정을 사용하고 있다면 vi /root/.vimrc 를 쳐서 다음과 같은 내용을 입력해준다. (물론 원하는 것만)

set tabstop=2        "탭 간격을 2 칸 으로 지정한다

set shiftwidth=2     " >> << 사용시 들여쓰기 간격을 지정한다
set expandtab " 탭 문자를 공백문자로 변환한다.
set softtabstop=2 "탭 간격을 공백문자로 변환하면 두 칸 단위로 삭제한다
set visualbell " 사용자 실수 경고시 비프음 대산 화면을 한 번 반짝인다.
set nobackup "백업 파일을 생성하지 않는다
set cindent "C 언어 스타일의 들여쓰기를 사용합니다.
set autoindent "자동 들여쓰기를 사용합니다.
set smartindent "좀 더 지능적인 들여쓰기를 사용합니다.
set enc=euc-kr "인코딩을 한글로 지정합니다.
set incsearch
"
키워드 입력시 검색하는 점진 검색을 사용합니다.  (파이어폭스서 사용)

syntax on "구문 강조기능을 사용합니다
filetype on "파일 종류에 따라 구문을 강조합니다.
set background=dark "배경색을 어두운 색으로 설정합니다.
colorscheme evening "VI 색상 테마를 evening  으로 설정합니다
set backspace=eol,start,indent
"줄의 끝, 시작, 들여쓰기서 백스페이스 사용시 이전 줄과 연결
set history=1000 " VI  편집 기록을 1000개 까지 저장합니다.
set hlsearch "검색어 강조 기능을 사용합니다.
set ignorecase "검색, 편집, 치환시 대소문자를 구분하지 않습니다.
set showmatch "() {} 에서 한 괄호만 입력해도 일치하는 괄호를 보여줍니다

글 수정하기
cc :
한 줄 전체 수정하기
C :
커서의 현재 위치부터 줄의 끝까지 수정하기
cw :
커서의 현재 위치부터 단어의 끝까지 수정하기
J :
아래 줄을 현재 줄과 합치기
:12,24j : 12
줄부터 24줄까지 합치고 각 줄의 공백은 그대로 두기.
~ :
대소문자 전환하기

r :
현재 커서아래에 있는 글자를 다른 문자로 바꾸기
4rx :
현재 커서 이후 4개의 글자를 "x" 문자로 바꾸기
R : ESC
키를 누를때 까지 덮어쓰기
s :
현재 글자를 삭제하고 삽입 모드로 변경하기
S :
현재 줄을 삭제하고 삽입 모드로 변경하기
>> :
현재 줄을 오른쪽으로 들여쓰기 하기
3>> :
세 줄을 오른쪽으로 들여쓰기 하기
>% :
괄호등이 있는 곳에서 실행하며, 괄호의 다른 짝이 되는 부분까지를 오른쪽으로 들여쓰기 하기
>} :
한 문단을 오른쪽으로 들여쓰기 하기
>'m : m
문자로 마크된 줄까지 들여쓰기 하기 (마크는 mx 에서 x를 원하는 마크 문자로 지정해서 한다)
<< :
왼쪽으로 내어쓰기 하기(그 외 다른 기능들은 들여쓰기와 같은 조합을 사용할 수 있음
)

복사와 붙여넣기
yl (
와이엘) : 현재 커서 아래의 글자를 복사하기
nyl : n
개의 문자를 복사하기
yw :
한 단어 복사하기
yy :
현재 줄 복사하기
Y :
현재 줄 복사하기(yy와 동일)
nyy : n
줄 복사하기

y$ :
줄 끝까지 복사하기
y) :
문장(구두점 등으로 끝남) 끝까지 복사하기
y'x :
현재 위치부터 마크 x 까지 복사하기 (마크는 mx 에서 x를 원하는 마크 문자로 지정해서 한다)
y/word :
현재 위치부터 "word"라는 단어 직전까지 복사하기

"ay'm :
현재 위치부터 마크 m까지를 복사하여 버퍼 "a"에 저장하기. ":e filename" 혹은 ":n filename"으로 다른 파일로 이동하여서로 다른 파일간의 복사에 사용될 수 있음.
"ayy :
버퍼 "a"에 현재 줄을 복사하여 저장하기

"a3Y :
버퍼 "a"에 세 줄을 복사하여 저장하기
"A3Y :
버퍼 "a" 3줄을 복사하여 그 이전 버퍼 내용에 이어 저장하기
"ap :
아래 줄에 버퍼 "a"의 내용을 붙여넣기
p :
현재 커서 위치의 오른쪽에 붙여넣기
P :
현재 커서 위치의 왼쪽에 붙여넣기

삭제하기
x :
현재 커서 아래의 문자 삭제하기
dd :
현재 줄 삭제하기
d^ :
현재 위치부터 줄의 처음까지 삭제하기
d$ :
현재 위치부터 줄의 끝까지 삭제하기
dw :
커서의 현재 위치부터 단어의 끝까지 삭제하기
d3w : 3
단어 삭제하기
3dd :
현재 줄포함 아래로 3 줄 삭제하기
d/word :
현재 위치부터 오른쪽으로 "word" 검색하여 그 직전까지 삭제하기
d?word :
현재 위치부터 왼쪽으로 "word" 검색하여 그것을 포함해서 삭제하기
dfx :
현재 위치부터 오른쪽으로 문자 "x" 까지 삭제하기
dFx :
현재 위치부터 왼쪽으로 문자 "x" 까지 삭제하기
D :
현재 위치부터 줄 끝까지 삭제하기
u :
삭제 취소하기
U :
방금 수정했던 줄 전체를 원래 상태로 되돌리기

외부 명령어 - 여기 지정된 외부 명령어들은 Unix/Linux의 명령어들이다
:!cmd :
외부 프로그램 실행하기
:%!cmd :
버퍼 내의 모든 내용을 외부 프로그램의 입력으로 제공하고, 외부 프로그램을 실행한 결과로 현재 버퍼를 대체한다.
!! :
현재 줄을 외부 프로그램의 입력으로 제공하고, 외부 프로그램을 실행한 결과로 대체한다
.
!$ :
현재 줄을 외부 프로그램의 입력으로 제공하고, 외부 프로그램을 실행한 결과로 대체한다
.
!L :
현재 커서 위치 줄부터 부터 화면상의 마지막 줄까지를 외부 프로그램의 입력으로 제공하고, 외부 프로그램 실행 결과로 대체한다
.
!23G :
현재 커서 위치 줄부터 23번째 줄까지를 외부 프로그램의 입력으로 제공하고, 외부 프로그램 실행 결과로 대체한다
.
!/word :
현재 줄 부터 해당 "word"가 검색된 줄까지를 외부 프로그램의 입력으로 제공하고, 외부 프로그램 실행 결과로 대체한다
.
!) :
현재 줄 부터 문장 끝까지의 줄을 외부 프로그램의 입력으로 제공하고, 외부 프로그램 실행 결과로 대체한다
.
!} :
현재 줄 부터 문단 끝까지의 줄을 외부 프로그램의 입력으로 제공하고, 외부 프로그램 실행 결과로 대체한다
.
!!date :
현재 줄을 날짜로 대체

!!cut -c41- :
현재 줄에서 처음 40(41 - 1)을 삭제한다.
3!!sort :
현재 줄 부터 3줄을 sort의 입력으로 제공하고, 그 실행 결과로 대체한다
.
!Grev :
현재 줄 부터 끝까지 "rev" 명령의 입력으로 보내고 그 결과로 대체한다. rev 명령은 각 줄의 문자들을 뒤집는다. (
) apple -> elppa)
!}sort :
현재 줄 부터 문단 끝(첫번째 빈 줄 나오는 부분)을 정렬한다
.
:'x,.!sort : mx
명령으로 마크된 줄부터 현재 줄까지를 정렬한다
.
:r !ls : ls
명령의 결과를 현재 줄 다음 줄 부터 삽입한다
.
:'t,'b !spell :
마크 t 부터 마크 b 까지 스펠링 체크

:'t,. !awk '{print $3 " " $2 " " $1}' :
마크 t 부터 현재 줄까지 3 컬럼을 역순으로 배열한다.
:%! sed G :
전체 문서의 각 줄에 빈 줄을 삽입한다
.
:1,5! sed G : 1 - 5
줄에 각각 빈 줄을 삽입한다
.
:'x,.!sed '/^$/d' :
마크 x 줄부터 현재 줄까지 빈 줄을 삭제한다
.

삽입하기
i :
현재 문자 앞에 삽입하기
I :
현재 줄의 맨 첫칸에 삽입하기
a : 현재 문자 뒤에 추가하기
A :
현재 줄의 맨 끝에 추가하기
o :
현재 줄 아래에 새 줄 삽입하고 입력 시작
O :
현재 줄 위에 새 줄 삽입하고 입력시작
20I-<ESC> : 줄의 시작부분에 20개의 빼기기호(-) 삽입하기

이동하기
0 : 커서를 줄의 맨 처음으로
$ :
커서를 줄의 끝으로
w :
한 단어 앞으로(현재 위치에서 오른쪽으로, 구두점이 있으면 구두점 앞까지 단어로 간주)
3w :
세 단어 앞으로

W :
구두점을 무시하고 공백 기준으로 한 단어 앞으로
b :
한 단어 뒤로(현재 위치에서 왼쪽으로, 구두점이 있으면 구두점 앞까지 단어로 간주)
B :
구두점을 무시하고 공백 기준으로 한 단어 뒤로

e :
커서를 단어의 맨 끝으로
E :
구두점을 무시하고 공백을 기준으로 커서를 단언의 맨 끝으로
G :
커서를 파일의 맨 마지막 줄로
nG :
줄번호 n 의 맨 첫칸으로
1G :
파일의 맨 첫 줄로
n| : n
번째 칸으로. | Shift- 를 누르면 나오는 세로 바이다.
f :
현재 줄에서 앞으로로 한 문자 찾아가기

fa :
현재 줄에서 앞쪽으로 문자 "a" 찾아가기
2fa :
현재 줄에서 앞쪽으로 두 번째 문자 "a" 찾아가기
F :
현재 줄에서 뒷쪽으로 문자 찾아가기
Fz :
현재 줄에서 뒷쪽으로 문자 "z" 찾아가기
t :
현재 줄에서 앞쪽으로 지정된 문자의 바로 앞 칸으로
T :
현재 줄에서 뒷쪽으로 지정된 문자의 바로 뒷 칸으로
) :
다음 문장으로(구두점으로 구분)
} :
다음 문단으로(빈 줄로 구분
)
] :
다음 섹션으로

% :
괄호 짝 찾아가기
^B :
한 페이지 뒤로 스크롤한다. (^B Ctrl-B를 의미한다)
^F :
한 페이지 앞으로 스크롤한다
.
^U :
반 페이지 뒤로 스크롤한다
.
^D :
반 페이지 앞으로 스크롤한다
.
z<enter>:
현재 줄을 화면 맨 위로 올린다
.
z. :
현재 줄을 화면 가운데로 옮긴다
.
z- :
현재 줄을 화면 맨 아래로 내린다
.
m :
마크(mark)를 시작한다. m 다음 문자가 마크의 이름이 되며, 문자는 a-z 중 아무것이나 될 수 있다
.
ma :
현재 위치를 문자 "a"로 마크한다
.
'a : "a"
마크의 줄로 이동한다
.
`a : "a"
마크된 문자로 이동한다
.
'' :
직전에 있던 줄로 이동한다.(자동 마크
)
`` :
직전에 있던 문자로 이동한다.(자동 마크
)

검색과 치환
:set ic :
대소문자를 무시한다. noic 는 대소문자 가림. 이 설정에 따라 검색과 치환시 검색어의 대소문자 무시여부가 결정된다.
/word : word
를 앞으로 검색한다
.
?word : word
를 뒤로 검색한다
.
n :
검색한 단어의 앞방향 다음 위치로 이동한다
.
N :
검색한 단어의 뒷방향 다음 위치로 이동한다
.
* :
현재 커서 위치에 있는 단어를 앞으로 검색한다
.(vim)
# :
현재 커서 위치에 있는 단어를 뒤로 검색한다.(단어 단위 일치, 완전한 한 단어로 존재할 경우에만 검색됨
) (vim)
g* :
현재 커서 위치에 있는 단어를 앞으로 검색한다.(부분 일치, 다른 단어의 일부라도 검색됨
) (vim)
g# :
현재 커서 위치에 있는 단어로 뒤로 검색한다.(부분 일치
) (vim)
:noh :
검색된 단어에 대한 강조 표시를 끈다
.
:s/old/new/ :
현재 줄에서 처음 만난 old 문자열을 때 new로 치환한다
.
:s/old/new/g :
현재 줄에 있는 모든 old 문자열을 new로 치환한다
.
:%s/old/new/g :
현재 버퍼에 있는 모든 old 문자열을 new로 치환한다
.
:s/old/new/gc :
치환시 치환여부를 물어본다
.
:%s/^V^M//g : DOS
Carrage Return(^M)을 모두 제거한다. (^V^M Ctrl-V, Ctrl-M을 의미한다
)
:%s/,/^V^M/g :
버퍼 전체에서 쉼표를 새줄로 바꾼다. (DOS Carrage Return 이 추가될 것 같겠지만, UNIX에서는 실제로는 newline 만 추가된다
)
:%s/s*$// :
줄 끝에서 공백을 제거한다
.
:%s/[ ^I]*$/!d :
줄 끝에서 공백을 제거한다.(^I Tab키이다
)
:%s/.*/L&/ :
버퍼 전체를 소문자로 변경한다.(U는 대문자로
)
:s/.*/u&/ :
줄의 첫번재 문자를 대문자로 변경한다
.
:%s/<./u&/g :
현재 버퍼의 모든 단어의 첫번째 문자를 대문자로 변경한다
.
     <
단어의 시작을 의미한다
.
     .
위와 합쳐져서 단어의 첫번째 문자를 의미한다
.
     u VI
에게 치환할 문자열의 다음 문자를 대문자로 바꾸라고 지시한다
.
     &
일치한 나머지 문자열들을 의미한다
.

:s/book{./l&/ : book
을 포함해서, { 직후의 첫번째 문자까지 소문자로 변경한다
.
:'x,.s/([a-z])=/1 =/ :
마크 x 부터 현재 줄까지, 알파벳소문자와= 기호인 문자열을 같은 문자에 한 칸 공백에 = 기호로 바꾼다.
) book= >> book =
::%s/(That) or (this)/2 or 1/ : "That or this"
"this or That"으로 바꾼다
.
::%s/(^\foilhead{(.*)})/%1^M\section{2}/ : "foilhead"
로 시작하는 줄에서 "foilhead"를 주석처리(주석기호는 %)하고, 그 아래줄에 "foilhead" "section"으로 바꾼 줄을 생성해 넣는다. 아래와 같은 예제가 있을 때,

foilhead{haha} 이런저런...
foilhead{hihi}
그럭저럭...


아래처럼 바뀐다.

%foilhead{haha}
section{haha}
이런저런...
%foilhead{hihi}
section{hihi}
그럭저럭...


::%s/(.*)/<a href="1">1</a>/ :
모든 줄에 있는 문자열을 HTML <a>로 감싼다.
:s/ (d{1,2}).(d{1,2})(.*)/<a href="1-2.sh">1.23</a> :
현재 커서가 위치한 아래와 같은 줄을

1.1 Accessing Substring


다음처럼 바꾼다.

<a href="1-1.sh">1.1 Accessing Substrings</a>


:'x,.s/^/#/ :
마크 x 부터 현재줄까지 줄 시작 부분에 # 기호를 넣는다.
:s/edu/edu/ : edu
로 끝나는 줄들을 다음줄과 합친다.(새줄 삭제
)
:& :
직전 치환 명령을 다시 실행한다
.
:g/string/d : string
문자열을 포함한 모든 줄을 삭제한다
.
:g/.c/+|s/^/.cc/ :
모든 ".c" 명령을 찾아서, 그 다음 줄로 가서, 줄 처음에 ".cc"를 삽입한다
.look for all ".c" commands, jump to next line, substitute the beginning of line with ".cc".
:g/^..*/|s//U&/ : "."
으로 시작하는 줄의 모든 문자를 대문자로 바꾼다
.
:v/string/d : string
을 포함하지 않은 모든 줄을 삭제한다
.
:g/.*/m0 :
현재 파일의 모든 줄의 순서를 바꾼다. m0 는 현재 줄을 0번째 줄로 이동하는 ex 명령이다
.
:<up arrow> :
이전 명령 목록

"zyy
그 후에 @z : "zyy 는 현재 줄을 버퍼 z 에 넣는다. 그리고 @z z 버퍼의 내용을 실행한다. 이것을 이용해서 긴 문자열 검색 패턴등이 문서에 있을때 버퍼에 그 패턴을 저장하고, 바로 검색하는 등의 일을 할 수 있다.
:v/./d or :g/^$/d :
빈줄을 삭제한다
.
:g/^s*$/d :
공백만 있는 모든 줄을 삭제한다
.
:v/./.,/./-1join : Replaces multiple blank lines with just one blank line. (
작동안됐음
)
Q:g/^.ds/i
엔터키 .ks 엔터키 :vi : globally look for the pattern ".ds" at the beginning of a line (^), and insert (i) a line before each one and the characters ".ks". The back slash () is used to hide the return. Also global commands that require more than one line have to be done in ex mode, as shown. : 정확히 기능 파악 안됨
Q
엔터키:g/xx/a엔터키these are the엔터키characters xx.엔터키:vi : globally look for the pattern "xx", and append after each the sentence shown. End the sentence with a return. : 정확히 기능 파악 안됨

옵션들
:se ai :
자동 들여쓰기(:se noai 로 끈다)
:se ff=unix :
파일 포맷을 unix 방식으로 지정한다.(dos,mac 가능
)
:set ic :
검색시 대소문자 무시(반대
:set noignorecase)
:se list :
탭과 새줄을 특수문자로 표시해준다
.
:se nu :
줄 번호를 출력한다.(:set nonu 로 끈다
)
:se sm :
대괄호나 괄호 입력시 대응하는 대괄호나 괄호를 보여준다
.
:se smd :
현재 모드를 출력한다
.
:se sw=2 :
들여쓰기를 공백 2개로 설정한다
.
:se tabstop=4 :
탭 크기를 공백 4개로 설정한다
.
^^D :
글 입력 상태에서 입력하며, 현재 줄에서 자동 들여쓰기를 끄고, 다음줄에서는 현재 위치에서 다시 입력을 시작한다.(실제로는 다음줄에서 들여쓰기가 일어나지 않았다
)
0^D :
글 입력 상태에서 입력하며, 자동 들여쓰기를 재설정한다. 왼쪽 끝에서 입력을 다시 시작한다
.
:set nobackup :
백업파일(*~)을 생성하지 않는다
.
:set formatoptions-=r :
주석(//, /* )을 쓰고 엔터를 쳤을 때 다시 주석이 출력되지 않게 한다
.
:set sw=4 sts=4 ts=8 et :
소스코드 인덴트를 공백 4글자로 맞춘다. Tab 키를 눌러도 공백이 들어가게된다. sts(softtabstop) 설정에 따라 공백 개수가 결정되며 et(expandtab) 옵션에 의해 Tab키 대신 공백이 들어가게 된다. 이 상태에서 Tab을 누르고 싶다면, <Ctrl-V><Tab> 를 치면된다. 실제 Tab이 삽입 될 때는 8 자리로 인식된다(ts=8 때문) (해제는
:set noet sts=0)
set nohlsearch :
검색시 검색어 반전 안함

set guioptions-=m : GVIM
에서 메뉴를 없앤다.
set guioptions-=T : GVIM
에서 툴바를 없앤다
.
filetype plugin indent on :
파일 타입에 따라 자동으로 들여쓰기를 한다. 이 옵션이 있어야 소스 코드 편집시 G= 명령으로 자동 들여쓰기가 가능하다
.

기타
^G :
파일명, 상태, 현재 줄번호, 상대적인 위치 등을 출력한다.
^L :
화면 다시 그리기(가끔씩 ^P 혹은
^R)
^Q : MS-Windows
에서 Ctrl-V "붙여넣기" 기능을 할 때 Ctrl-Q Ctrl-V 기능(특수키 입력)으로 대신 사용한다
.(vim)
. :
마지막 명령 재실행

& :
마지막 ex의 치환명령( :s/wrong/good) 재실행한다.
vi +/string filename : vi
를 시작하면서 string 문자열이 처음 나오는 곳으로 이동한다
.
vi -r filename : VI
가 다운됐을 때, 작성중이던 파일을 복구한다
.
vi `cat file` : file
파일에 들어있는 파일 이름들을 모두 연다
.
:r filename :
지정된 파일의 내용을 현재 줄 아래에 삽입한다
.
:1,4w filename : 1
부터 4줄까지를 지정된 파일명으로 저장한다
.
:e filename :
지정된 파일을 편집한다
.
:f filename :
현재 파일명을 filename으로 변경한다
.
:n :
다음 파일을 편집한다
.
:sh :
셸을 실행한다. Ctrl-D를 누르면 셸을 종료하고 VI로 돌아온다
.
:vi : VI
모드
.
@a :
버퍼 "a"에 있는 문자열을 명령으로써 실행한다. VI 모드와 EX 모드 모두에서 작동한다. @a :@a 둘다 된다
.
자동완성 : 입력 모드에서, Ctrl-P Ctrl-N은 이미 입력되었던 단어들로 자동완성을 시도한다
.
:<up arrow> :
실행했던 명령보기




셀 명령어

:!bash : vim을 종료하지 않은 상태에서 shell 로 이동. exit 명령어로 vim으로 복귀

:!ls : ls
명령어 결과를 화면 아래 표시

:r !ls :
파일 중간에 ls결과 표시

 

ctrl + w 3+ : 현재 창의 크기를 3줄 넓히기
ctrl + w 3- :
현재 창으 크기를 3줄 줄이기

 

 


출처 : 실버레이 라이브