Friday, May 8, 2015

vi

제목: vi/vim notes
글쓴이 : Darin Brezeale
원문 : http://home.comcast.net/~brezeale/vim_notes.html
번역자 : 손권남 Translator : KwonNam Son
작성일 : 05-28-2002

* 글 수정하기
* 복사와 붙여넣기
* 삭제하기
* 외부 명령어
* 삽입하기
* 이동하기
* 검색과 치환
* 옵션들
* 기타
* Tips

글 수정하기
◆ 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 : 현재 줄의 맨 첫칸에 삽입하기
◆ 20I- : 줄의 시작부분에 20개의 빼기기호(-) 삽입하기
◆ a : 현재 문자 뒤에 추가하기
◆ A : 현재 줄의 맨 끝에 추가하기
◆ o : 현재 줄 아래에 새 줄 삽입하고 입력 시작
◆ O : 현재 줄 위에 새 줄 삽입하고 입력시작

이동하기
◆ h : 커서를 한 칸 왼쪽으로
◆ j : 커서를 한 칸 아래로
◆ k : 커서를 한칸 위로
◆ l : 커서를 한 칸 오른쪽으로
◆ 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: 현재 줄을 화면 맨 위로 올린다.
◆ 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/(.*)/1/ : 모든 줄에 있는 문자열을 HTML 로 감싼다.
◆ :s/ (d{1,2}).(d{1,2})(.*)/
1.23 : 현재 커서가 위치한 아래와 같은 줄을 
1.1 Accessing Substring

다음처럼 바꾼다.
1.1 Accessing Substrings

◆ :'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 명령이다.
◆ : : 이전 명령 목록
◆ "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을 누르고 싶다면, 를 치면된다. 실제 Tab이 삽입 될 때는 8 자리로 인식된다(ts=8 때문) (해제는 :set noet sts=0)
◆ set nohlsearch : 검색시 검색어 반전 안함
◆ set guioptions-=m : GVIM에서 메뉴를 없앤다.
◆ set guioptions-=T : GVIM에서 툴바를 없앤다.

기타
◆ ^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은 이미 입력되었던 단어들로 자동완성을 시도한다.
◆ : : 실행했던 명령보기

Tips
◆ au GUIEnter * simalt ~x : _vimrc 파일에 이 내용을 추가하면 Windows에서 최대 화면으로 실행된다.
◆ :e ftp://username@hostname/path/to/filename.txt : FTP 경로상의 파일을 읽고 편집한다. 파일이 없으면 생성된다. 경로는 /가 아니라 사용자 홈디렉토리를 기준으로 한다.
◆ :set backupdir=C:/WINDOWS/Temp,./_backup : ~로 만들어지는 백업파일을 저장할 디렉토리를 지정한다. 이 설정이 없으면 편집하는 파일이 있는 디렉토리에 백업파일을 저장한다.
◆ :set directory=C:/WINDOWS/Temp,./_backup : 파일을 편집할 때 생성되는 파일명.swp 파일이 생성되는 디렉토리를 지정한다. 이 설정이 없으면 편집하는 파일이 있는 디렉토리에 백업파일을 저장한다.(http://www.vim.org/tips/tip.php?tip_id=20
◆ :e ++enc=ENCODING : 현재 버퍼의 문자 인코딩을 변경한다.
◆ :TOhtml 혹은 :runtime! syntax/2html.vim : 현재 버퍼 내용을 HTML로 출력한다. ":10,20TOhtml" 같은 명령도 가능하다.
◆ 파일 드래그 앤 드롭시 항상 탭으로 열기 (7.0 이상)

autocmd VimEnter * tab all
autocmd BufAdd * exe 'tablast | tabe "' . expand( "

◆ 윈도우 Gvim에서 연결 프로그램으로 파일 열 때 탭으로 열기 (7.0 이상) : Windows에서HKEY_CLASSES_ROOT\Applications\gvim.exe\shell\edit\command 키의 실행 옵션에 --remote-tab을 추가하면 연결 프로그램으로 GVim을 지정했을 경우 이미 GVim이 있으면 해당 GVim 창에서 새 탭을 생성해 파일을 열도록 한다.


Vim 7.0 Tab관련 매핑
" Vim 7.0 탭 매핑 from http://www.vim.org/tips/tip.php?tip_id=1221
map th :tabprev
map tl :tabnext
map tn :tabnew
map td :tabclose 

References

1. vi Fast Reference Guide
2. Vim documentation: starting
3. Best of VIM Tips (VIM's best Features)

No comments: