*usr_26.txt* Vim version 7.4 대상. 새로 고침: 2006년 4월 24일 VIM 사용설명서 - Bram Moolenaar 저 정지용 역 반복하기 문서 편집을 하다보면 대개 틀에 박힌 작업을 반복하게 마련입니다. 똑같은 내용을 여러 번 바꿔야하는 경우도 많습니다. 이번 장에서는 변경작업을 쉽게 반복하는 여러 가지 방법을 살펴보겠습니다. |26.1| 시각 모드를 이용한 반복 |26.2| 더하기 빼기 |26.3| 여러 파일의 내용 바꾸기 |26.4| 셸 스크립트에서 Vim 사용하기 다음 장: |usr_27| 찾기 명령과 패턴 이전 장: |usr_25| 서식에 맞추어 편집하기 차례: |usr_toc|
*26.1* 시각 모드를 이용한 반복 시각 모드(Visual mode)를 이용하면 여러 줄의 내용을 쉽게 이리저리 바꿀 수 있습니다. 선택된 영역이 반전되어 표시되므로, 바꿀 영역을 제대로 지정했는지도 쉽게 확인할 수 있습니다. 하지만 매번 선택을 하기 위해 키를 많이 눌러야하는 것이 단점입니다. "gv" 명령은 이전에 선택했던 영역을 다시 선택해줍니다. 같은 영역에 대해 여러 명령들을 수행해야할 때 유용합니다. 여러 줄에 걸친 내용 중에서 "2001"은 "2002"로, "2000"은 "2001"로 바꾸고 싶다고 합시다:2001년의 재정 상황은 2000년보다 낫습니다.
2000년보다 비가 더 많이 왔음에도 불구하고
수입은 50% 증가했습니다.
2000 2001
수입 45,403 66,234
먼저, "2001"을 "2002"로 바꿉시다. 시각 모드에서 영역을 선택해고, 다음 명령을 사용합니다:
:s/2001/2002/g
"gv"로 같은 영역을 다시 선택합니다. 현재 커서가 어디 있는지는 상관없습니다. 그리고 ":s/2000/2001/g" 명령으로 두 번째 변경을 수행합니다. 당연히 다른 명령도 계속해서 반복할 수 있겠지요.
*26.2* 더하기 빼기 숫자들을 이 값 저 값으로 바꾸다보면, 일정한 값을 더하거나 일정한 값을 빼는 경우가 많습니다. 예를 들어, 위에서는 각 연도에 1 씩을 더했습니다. 이 경우 모든 연도에 대해 일일이 바꾸기 명령을 입력할 필요 없이,CTRL-A
명령을 사용하면 됩니다. 위의 예를 다시 보겠습니다. 먼저 연도를 찾습니다:
/19[0-9][0-9]\|20[0-9][0-9]
CTRL-A
를 누릅니다. 연도가 1 증가했을 것입니다:2002년의 재정 상황은 2000년보다 낫습니다.
2000년보다 비가 더 많이 왔음에도 불구하고
수입은 50% 증가했습니다.
2000 2001
수입 45,403 66,234
"n"으로 다음 연도를 찾은 후, "."로CTRL-A
를 반복합니다 (CTRL-A
보다는 "."가 타자 치기 약간 더 편하겠지요). "n"과 "."를 모든 연도에 대해 반복하면 됩니다. 힌트: 'hlsearch'(찾기강조) 옵션을 켜면 바꾸려는 내용이 화면에 강조되어 표시되므로, 좀 더 빨리 살펴보고 바꿀 수 있습니다. 1 보다 큰 수를 더하려면CTRL-A
명령 전에 숫자를 넣으면 됩니다. 다음과 같은 목록이 있다고 합시다:1. 제 4조
2. 제 5조
3. 제 6조
커서를 "1."로 옮긴 후, 다음 명령을 입력합시다:
3
CTRL-A
"1."이 "4."로 바뀝니다. 다른 숫자들에도 "."를 사용하여 반복해주면 됩니다. 다른 예:
006 철수 영희
007 철수 영희
이 숫자들에 대해CTRL-A
명령을 사용하면 다음과 같이 됩니다:007 철수 영희
010 철수 영희
7에 1을 더했는데 10이라니? 이건 숫자 앞에 붙는 0 때문에 Vim이 "007"을 8진법 숫자로 이해했기 때문에 일어난 일입니다. C 프로그램에서 보통 저런 식으로 사용하기 때문이지요. 0이 앞에 붙은 숫자를 8진법으로 해석하지 않도록 하려면 다음 명령을 사용하십시오:
:set nrformats-=octal
CTRL-X
는 숫자를 빼는 명령어로, 같은 방법으로 동작합니다.
*26.3* 여러 파일의 내용 바꾸기 "x_cnt"라는 변수가 있는데, "x_counter"로 바꾸고 싶다고 합시다. 이 변수가 여러 C 파일에서 쓰이고 있어 모든 파일에서 바꿔주어야 한다면 어떻게 해야 할까요? 한번 알아보겠습니다. 먼저 관련된 파일을 모두 인자목록에 넣습니다:
:args *.c
위 명령은 모든 C 파일을 찾아 인자목록에 넣은 후 그 중 첫 번째 파일을 엽니다. 이제 파일들 모두에 대해 바꾸기 명령을 수행하면 됩니다:
:argdo %s/\
<x_cnt\>
/x_counter/ge | update":argdo" 명령은 다른 명령 하나를 인자로 받습니다. 이 명령이 현재 인자 목록에 있는 모든 파일들에 대해 실행됩니다. "%s"는 바꾸기 명령을 파일 전체에 적용하라는 명령입니다. "\
<x_cnt\>
"로 "x_cnt"를 찾습니다. 단어 앞뒤의 "\<"와 "\>
"는 단어 전체가 일치하는 경우에만 바꾸라는 것입니다. "px_cnt"나 "x_cnt2"같은 단어까지 바뀌는 것을 막기 위한 것이지요. 바꾸기 명령어 뒤에는 한 줄 안에서도 여러 번 바뀌도록 "g"를 넣어주었습니다. "e"는 파일에 "x_cnt"가 한 번도 나오지 않는 경우 발생하는 에러를 무시하라는 표시입니다. "e"가 없었다면 "x_cnt"가 한 번도 나오지 않는 파일이 있다면 에러를 내고 처리를 멈추었을 것입니다. "|" 구분자는 두 명령을 연결합니다. "update" 명령은 파일이 변경된 경우에만 저장하는 명령입니다. 만약 "x_cnt"가 하나도 없어서 "x_counter"로 바뀐 곳이 없다면 저장이 되지 않습니다. 모든 창에 대해 인자로 받는 명령을 실행하는 ":windo" 라는 명령도 있습니다. ":bufdo"는 모든 버퍼에 대해 인자로 받는 명령을 실행합니다. 하지만 버퍼에는 생각지도 못한 파일이 들어있을 수도 있으므로 조심하여 사용하십시오. 버퍼 목록은 ":buffers"(또는 ":ls")로 확인할 수 있습니다.
*26.4* 셸 스크립트에서 Vim 사용하기 수많은 파일에서 "-이름-"이란 문자열을 "Jones"로 바꾸고, 인쇄해야 한다고 합시다. 어떻게 해야 할까요? 물론 손이 좀 고달프겠지만 일일이 명령을 입력해서 할 수도 있습니다. 하지만 셸 스크립트를 작성해서 처리하면 더 쉽겠지요. 화면을 보면서 작업하는 경우, Vim의 보통 모드 명령들은 매우 뛰어납니다. 하지만 일괄작업(batch processing)의 경우에는 보통 모드 명령들이 그다지 명확하고 깔끔하지 않습니다. 이때는 Ex 모드 명령어를 써야 합니다. Ex 모드에서는 일괄 작업 파일에 넣기 쉬운 명령줄 인터페이스를 사용할 수 있습니다. ("Ex 명령"은 명령줄(:) 명령의 다른 이름입니다.) 앞서 든 예에서 필요한 Ex 모드 명령어는 다음과 같습니다:
%s/-이름-/Jones/g
write tempfile
quit
이 명령들을 "change.vim"이란 파일에 저장합시다. 이제 Vim으로 일괄작업을 수행하려면 다음 셸 스크립트를 사용하면 됩니다:
for file in *.txt; do
vim -e -s $file < change.vim
lpr -r tempfile
done
for와 done은 셸 스크립트에서 둘 사이에 있는 작업을 반복하기 위한 것입니다. 둘 사이의 작업이 수행될 때, $file 변수에는 매번 다른 파일명이 들어갑니다. 두 번째 줄은 Vim을 $file 파일에 대해 Ex 모드로 실행시키고(-e 인자), "change.vim" 파일의 내용을 읽어 들여 명령을 수행합니다. "-s" 인자는 조용한(silent) 상태로 실행하도록 지시합니다. 즉, ":" 같은 프롬프트를 출력하지 말라는 의미입니다. "lpr -r tempfile" 명령은 앞줄의 결과인 "tempfile"을 인쇄한 후, 삭제합니다(-r 인자의 기능입니다). 표준 입력으로부터 읽기 ---------------------- Vim은 문서를 표준 입력으로부터 읽어 들일 수도 있습니다. 원래 표준 입력으로부터 읽는 내용은 명령으로 해석되므로, 대신 문서를 읽어 들이라고 지정을 해주어야 합니다. 다음과 같이 파일명이 들어갈 위치에 "-" 인자를 넣어주면 됩니다:
ls | vim -
위 명령으로 "ls" 명령의 결과를 다른 파일에 저장할 필요 없이 바로 편집할 수 있습니다. 표준 입력에서 문서를 읽어 들이는 경우, 명령 스크립트 파일을 불러오기 위해서는 "-S" 인자를 사용하면 됩니다:
producer | vim -S change.vim -
보통 모드 스크립트 ------------------ 스크립트에서 보통 모드 명령을 사용하고 싶다면, 다음과 같이 하면 됩니다:
vim -s script file.txt ...
Note:
"-s"는 "-e" 와 함께 쓰이지 않으면 다른 의미를 갖게 됩니다. 여기서는 "script" 파일을 보통 모드 명령으로 읽어 들이라는 의미입니다. "-e"와 함께 쓰이는 경우에는 조용한 상태로 사용하라는 의미가 되고, 뒤에 파일명이 오지 않습니다. "script" 파일 안의 명령들이 마치 직접 타자 친 것처럼 수행됩니다. 파일 내의 줄 바꿈은<Enter>
를 누른 것으로 해석됩니다. 보통 모드에서는 커서를 다음 줄로 옮기는 명령이지요. 스크립트를 만들기 위해서는 빈 파일을 열고 직접 명령을 써넣을 수도 있겠습니다만, 그러려면 문서가 어떻게 처리되는지 일일이 머리로 계산해가며 만들어야 합니다. 골치 아픈 일이지요. 그래서 Vim은 수행하는 명령을 기록하는 기능을 제공합니다. 다음과 같이 하면 됩니다:
vim -w script file.txt ...
입력한 모든 명령이 "script"안에 저장됩니다. 키를 몇 개 잘못 누른 게 있더라도 일단은 계속한 다음, 나중에 스크립트 파일을 열어서 조금 고쳐주면 되겠지요. "-w" 인자는 이미 존재하는 스크립트에 명령들을 덧붙입니다. 따라서 조금씩 조금씩 기록해나갈 때 편리합니다. 만약 이미 저장되어있는 내용을 지우고 처음부터 기록하고 싶다면, "-W"를 사용하십시오. 이미 존재하는 파일의 내용이 지워지고 새로 기록됩니다.
다음 장: |usr_27| 찾기 명령과 패턴 저작권: |manual-copyright| 참고 vim:tw=78:ts=8:ft=help:norl:
Generated by vim2html on 2013. 12. 14. (토) 20:47:01 KST