손에잡히는 vim (4/4) 인사이트출판사 http://blog.insightbook.co.kr 가메출판사 http://www.kame.co.kr 저자홈페이지 http://sunyzero.tistory.com 김선영 sunyzero@gmail(dot)com 버전 : 2014-11-07
Ch6. 편리한편집기술 쓸만한것은이미다나왔다. - 괴테
word forward/backward 단어경계이동
word forward/backward (con't) 명령어 설명 0 0 번째열 ^ 공백이아닌실제내용이있는시작열 $ 마지막열 ( 행의끝 ) w e b 단어의시작위치혹은문장부호의경계를따라서이동 (words forward) w 와같으나, 단어의끝부분에위치합니다. (end of word) w 와비슷하나진행방향이역방향입니다. (words backward) W, E, B w, e, b 와비슷하지만단어가가진의미를따져서이동합니다. * ^ 와 $ 는정규표현식을생각해보면좀더쉽게이해할수있다.
block, paragraph 괄호, 문단, 블록단위이동 % 가장가까운괄호짝으로이동 ( 프로그래밍시유용한기능 ) (, ) 문장단위의시작위치, 끝위치로이동 {, } 문단단위의시작위치, 끝위치로이동 [[, ]] 블록단위의시작위치, 끝위치로이동
abbreviation 특정단어입력시대체입력하는기능 입력모드에서... " 내멜 " 을입력하면 sunyzero@gmail.com이입력되도록, "prjsrc" 를입력하면 /export/2/local/pjr2/mds/1.294/src가입력되도록, " 시간0" 을입력하면현재날짜와시간이입력되도록, " 시간1" 이라고입력하면로케일 (locale) 에맞는시간이입력되도록하고싶다면
abbreviation (con't) ab, ia 기능을이용 ia는 insert mode에서만작동하는기능 ca는 commandline mode에서만작동하는기능 ab 내멜 sunyzero@gmail.com ab Prjsrc /export/2/local/pjr2/mds/1.294/src ia 시간0 <C-R>=strftime("%Y.%m.%d-%H:%M:%S")<CR> ia tlrks0 <C-R>=strftime("%Y.%m.%d-%H:%M:%S")<CR> ia 시간1 <C-R>=strftime("%c")<CR> ia tlrks1 <C-R>=strftime("%c")<CR>
abbreviation (con't) ca 기능을이용하면한글상태오타를변환할수있다. ca ㅈ ca ㅈㅂ ca ㅂ ca ㅌ w wq q x 한글약어매크로사용시주의점.vimrc 파일의인코딩형식에주의!! 간혹.vimrc 파일이 EUC-KR 로되어있으면 UTF-8 문서편집시작동하지않을수있다.
abbreviation : cmds :ab [lhs] 명령어 설명 현재설정된모든약어목록을출력합니다. lhs 에약어를지정하면해당약어의정보만출력합니다. :ab {lhs} {rhs} 약어 lhs를 rhs로변환합니다. :unab {lhs} 약어 lhs를해제합니다. :abclear 설정된모든약어를해제합니다. :ia {lhs} {rhs} ab와기능은같지만입력모드에서만작동합니다. :ca {lhs} {rhs} ab와기능은같지만명령행모드에서만작동합니다.
register register = vim temp. storage
vim register vim 에서사용하는임시버퍼
vim register : list 레지스터이름 설명 "" 가장최근에복사, 삭제된데이터 "0 가장최근에복사 (yank) 된데이터 "1 ~ "9 가장최근에삭제된데이터 ( 시간순, 1 번이가장최근데이터 ) a~z 사용자지정레지스터
vim register : list (con't) 레지스터이름 설명 "- 가장최근에한라인이내로삭제한데이터 "/ 가장최근에검색한데이터 ": 가장최근에명령행모드에서내린명령어데이터 ( 읽기전용 ) ". 가장최근에입력한데이터 ( 읽기전용 ) 레지스터이름 설명 "% 현재편집중인파일명 ( 읽기전용 ) "# 이전에열었던파일명. <CTRL-^> 을누르면열게될파일. ( 읽기전용 )
register : cmd 레지스터명령어요약 명령어 설명 "{reg}y{motion} {reg} 레지스터에 {motion} 에해당하는부분을복사합니다. "{reg}p "{reg}p "{reg}d{motion} {reg} 레지스터의내용을현재커서뒷부분에넣습니다. ( 레지스터에개행문자가포함된경우는커서의아래행에넣습니다.) {reg} 레지스터의내용을현재커서의앞부분에넣습니다. ( 레지스터에개행문자가포함된경우는커서의윗행에넣습니다.) {reg} 레지스터에 {motion} 에해당하는부분을잘라넣습니다. * 참고 : vim에서삭제하는모든행위는잘라내기로작동합니다. CTRL-R{reg} 입력모드에서만사용하는명령으로 {reg} 레지스터를붙여넣습니다. * 참고 : "{reg} 를생략하면 "" 레지스터를가리킵니다.
Tip! vim register 는 vim 이종료하면? vim register 는.viminfo 파일에저장해두므로, 다음번실행할때도불러오게된다. 윈도용은 _viminfo 파일에기록된다.
Ch7. 자동화 반복은연구의어머니다 - 쇼펜하우어, 문장론
key map nmap < 단축키 > < 명령 > normal mode 에서만작동 imap < 단축키 > < 명령 > insert mode 에서만작동 map < 단축키 > < 명령 > e.g. nmap <F2> :up<cr> e.g. imap <F4> sunyzero@gmail.com
key map : list 명령어 설명 nmap key command 일반모드에서 key를누르면 command를실행합니다. imap key command 입력모드에서 key를누르면 command를실행합니다. vmap key command 비주얼모드에서 key를누르면 command를실행합니다. cmap key command 명령행모드에서 key를누르면 command를실행합니다.
map : example.vimrc 파일 "[ map ] nmap <F2> nmap <F3> nmap <F4> :up<cr> :tabnext<enter> :tabprev<enter>
autocmd 특정상황에서자동으로실행할명령 예를들어 *.c 파일을열때자동으로실행되어야하는명령 autocmd BufRead,BufNewFile *.txt colo evening autocmd BufRead,BufNewFile *.java colo morning set ts=2 sw=2 au SwapExists * let v:swapchoice = 'o' v:swapchoice 스왑파일이존재하는경우의선택 (o : readonly) v:swapchoice 에는 e, q 등등을넣을수있다.
vimrc 의예시 #2.vimrc 예시의발전된형태 " example : vim runtime configuration set ai cindent set ts=4 sw=4 " set nu set fencs=ucs-bom,utf-8,korea colorscheme desert nmap <F2> :w!<enter> nmap <F3> :e.<cr> 현재디렉토리를열어준다. 즉파일선택창이제공된다.
Recording q (recording) @ (execute)
Recording 매크로작업 : 반복작업을녹화후실행 매크로이름은 {register} 를의미한다. q{register} vim register 에작업을녹화 @{register} vim register에기록된작업을실행 @@ 는이전실행을 repeat register 는 a-z 를사용한다.
Practice clientlist.txt 와 clientmail.txt 를준비 1304, Yona Yahav, M, 42, MP1 1294, Kebin Robinson, M, 41, CP1 1601, Steven Choi, M, 34, CP3 1314, TW Yoon, F, 46, CP1 1315, Rina Suzuki, F, 36, MP1 1600, Robert Kim, M, 32, CP3 1297, Rarry Robinson, M, 38, CP2 1600, optiger22@ibn.com 1314, teawooy1@boggle.com 1315, rinzzang@yohoo.co.jp 1601, schoi74@idontcare.net 1304, yoyohave@vimvim.co.kr 1294, braverobb@bettervi.com 1297, rrjr4624@orakle.com
Practice (con't) 분할창으로열기 vim -o clientlist.txt clientmail.txt
Practice (con't) 녹화시작 : a 레지스터에녹화
Practice (con't) 고객번호복사
Practice (con't) clientmail.txt 에서고객번호검색
Practice (con't) 메일주소부분복사
Practice (con't) clientlist.txt 에복사한메일주소붙여넣기
Practice (con't) 녹화된매크로재생
순서Practice 명령어 (fin) 설명 0. qa a 레지스터에녹화를시작합니다. 1. ^ 행의맨앞으로이동합니다. 2. yiw 숫자부분을복사합니다. 3. CTRL-W CTRL-W clientemail.txt 파일로이동합니다. 4. / 검색기능을사용합니다. 5. CTRL-R " 최근에복사한레지스터를검색어로사용합니다. 6. <ENTER> 검색을시작합니다. 7. 2w 문장부호를 2 개를뛰어넘어메일주소부분으로이동합니다. 8. y$ 메일주소를복사합니다. 9. CTRL-W CTRL-W clientlist.txt 파일로돌아갑니다. 10. A 행의맨끝으로이동하면서입력모드로변경합니다. 11., 쉼표를입력합니다. 12. <ESC> 입력모드를종료합니다 ( 레지스터에는 ^[ 로표시됩니다 ). 13. p 앞에서복사한메일주소를붙여넣습니다. 14. q 녹화를종료합니다.
Practice #2 녹화된내용확인
Practice #2 (fin) clientlist.txt 파일을열고 : :%normal! ^^X ^^X : ^ + <CTRL-V><CTRL-X> 어떤일이발생하는가? 이번 5 씩감소시키려면?
Practice #3 녹화된내용의수정 다시녹화를하는것은비효율적이다. 예를들어 clientlist.txt 의매크로에서메일주소부분을 "..." 으로감싸달라고한다. 어떻게해야하는가? 변환전상태에서...
Practice #3 (con't) 녹화된내용을불러온다. ^[ : <ESC> p : put ( 붙여넣기 ) 변경전 : ^[p 변경후 : "^[pa"^[ 수정후행의맨앞에서 "ay$
Practice #3 (con't) 녹화된내용을수정한다.
Tip! 재생할작업이 1,000 개라면? 수동으로 @a 나 @@ 을천번눌러야하나? 두가지방법이존재한다. 반복수지정 1000@a 일반모드의명령을수행하는 :normal 명령을수행 :2,$normal! @a
Recording : cmd 레코딩관련명령어정리 명령어 설명 q{ 매크로이름 } 녹화를시작합니다. 매크로이름은 {a-za-z} 중선택해야합니다. @{ 매크로이름 } 매크로를실행합니다. 매크로이름은 {a-z} 중선택해야합니다. @@ 바로이전에실행된매크로를재실행합니다. :{range}norm! @{ 매크로이름 } {range} 에해당하는범위에매크로를실행한다.
Practice #4 현재디렉터리에있는모든 *.txt 파일에서 유닉스 라는단어를찾아서 리눅스 로바꾸는기능을녹화기능을이용해서완성해봅시다. 순서명령어설명 1. :n *.txt 현재디렉터리의 *.txt 파일을파일목록에등록합니다. 2. qb b 레지스터에녹화합니다. 3. 빈칸유닉스를리눅스로바꿉니다. ( 에러발생시무시합니다.) 4. 빈칸저장합니다. 5. 빈칸다음파일로이동합니다. 6. q 녹화를종료합니다. 7. 999@b b 레지스터를 999 번재생합니다. ( 현재디렉터리의 *.txt 파일이 999 개미만이라고가정합니다.)
Ch8. 프로그래머에게유용 한기능 추가요금없이난자네에게자연의역사에관한많은부분을가르쳐주겠네 - 루이스캐럴
re-indenting 들여쓰기를다시하기 들여쓰기가안되어있거나들여쓰기가밀린경우... 수동으로한땀한땀한다면얼마나걸릴까?
re-indenting (con't) ={motion} motion 에는이동관련키 gg, G, )), ]] 등등을사용할수있다. visualmode + = 비주얼모드로라인선택후 = 키를눌러도된다.
tab vs whitespace tab 문자의가변적인길이때문에공백 # 칸을대신사용 다양한플랫폼에서개발되는프로젝트의경우 일반적으로 tab 대신에공백 4칸을사용하는경우 : ".vimrc (vim runtime config.) set et ts=4 et : expandtab, 탭대신공백사용 ts : tabstop, 탭크기 expandtab 환경에서진짜탭문자를입력하려면 <CTRL-V><TAB> 혹은 <CTRL-V><CTRL-I> 를사용한다.
tab vs whitespace (con't) 기존에작성된탭문자를공백 4 칸으로전환하고싶다면? :set et ts=4 :ret ret (retab) 대신에 re-indenting 기능을사용하는편이좋다. 예제프로그램 int main(int argc, char *argv[]) { if (argc == 1) { printf("argc == 1\n"); } return 0; }
tab vs whitespace (con't) 반대로공백 4 칸을탭문자로변환하려면? :set noet ts=4 :ret!
insert-completion 자동완성기능 /* hellomonkey.c by sunyzero@gmail.com */ #include <stdio.h> #include <stdlib.h> int main() { } printf("hello. Mr. monkey\n"); return 0; mo 까지만입력한뒤에 <CTRL-N> 을누르면?
insert-completion (con't) vim 은 #include 구문도이해한다. <CTRL-N> : 단어완성을위해서현재문서와관련파일을전방탐색 <CTRL-P> : <CTRL-N> 과반대방향으로탐색 <CTRL-N> 으로 단어완성을한결과 = stdlib.h 를탐색한다. 자동완성탐색결과로 "2 개中첫번째 " 임을보여줌
insert-completion (con't) 자동완성기능 ( 특수문자가포함된경우라면?) /* hellomonkey.c by sunyzero@gmail.com */ #include <stdio.h> #include <stdlib.h> int main() { } printf("hello. Mr. monkey\n"); return 0; sunyzero@gmail.com 을검색하려면? suny<ctrl-n><ctrl-x><ctrl-n>...
insert-completion (con't) 사전기반검색, 파일명검색 <CTRL-X> <CTRL-N> 더하기낱말모드로작동하여추가검색을합니다. 원하는낱말이아닌경우에는 <CTRL-N> 을계속누르면됩니다. <CTRL-X> <CTRL-K> <CTRL-N> 사전검색모드로작동합니다. 파일명을몇글자타이핑후에 <CTRL-X><CTRL-F> 을누르면? 파일명검색을할수있다.( 파일명타이핑시오타방지 ) ~/.ba 까지만입력한상태에서파일명검색
Ch9. 플러그인 태양아래새로운것은없나니 - 솔로몬
vim plugin vim 의플러그인은 ~/.vim 디렉터리에넣어두면되는데... 최근에는 plugin 관리툴을사용한다. 예 ) Vundle Vundle 설치법 http://sunyzero.tistory.com/212
유용한플러그인 Vundle : http://sunyzero.tistory.com/212 플러그인을관리하는플러그인 Airline 상태바와화면을예쁘게꾸며주는플러그인 예전에사용되던 powerline 의업그레이드버전 AutoComplPop 자동완성창을띄워주는플러그인 : 프로그래밍시유용
단축키 #1 http://sunyzero.tistory.com/131
단축키 #2 http://sunyzero.tistory.com/131
Practice #4 : solution 현재디렉터리에있는모든 *.txt 파일에서 유닉스 라는단어를찾아서 리눅스 로바꾸는기능을녹화기능을이용해서완성해봅시다. 순서명령어설명 1. :n *.txt 현재디렉터리의 *.txt 파일을파일목록에등록합니다. 2. qb b 레지스터에녹화합니다. 3. :s/unix/linux/ge 유닉스를리눅스로바꿉니다. ( 에러발생시무시합니다.) 4. :w 저장합니다. 5. :n 다음파일로이동합니다. 6. q 녹화를종료합니다. 7. 999@b b 레지스터를 999 번재생합니다. ( 현재디렉터리의 *.txt 파일이 999 개미만이라고가정합니다.) 주의사항 : 유닉스란단어가하나도등장하지않는텍스트파일이있다면에러가발생하고, 매크로실행이즉시중단된다. 이를방지하기위해서교체명령어에에러를무시하도록 플래그를추가한것입니다.