vim Ankilog 모음


vi 또는 vim의 기초 사용법을 정리한 Ankilog 모음과 관련 포스팅 링크입니다. 

    


Ankilog 모음


다음 파일을 다운 받아 사용하시면 됩니다.


vi 또는 vim 기초 사용법.apkg



관련 블로그 링크


포스팅된 블로그 링크는 다음과 같습니다.


vi 또는 vim을 텍스트 에디터로 선택한 이유

001 vim의 모드(mode) 및 간단한 실행과 종료

002 vim 튜토리얼(vimtutor)을 소개합니다.

003 명령 라인(명령줄)

004 vim의 실행과 종료 및 파일 불러오기와 저장

005 vim 명령 모드와 편집 모드의 전환

006 상하좌우로 커서 이동하기

007 기타 커서 이동(1)

008 기타 커서 이동(2)

009 기타 커서 이동(3)

010 화면 이동(커서 중심 화면변경 및 화면 스크롤)

011 삭제하기

012 복사(yank)와 붙여넣기(put)

013 레지스터(register) 개요

014 vim 레지스터(register)의 종류

015 vim 레지스터(register)에 데이터 저장하기

016 vim 레지스터(register)의 데이터를 붙여넣기 하는 방법

017 잘라내기, 명령취소(undo), 재실행(redo), 이전 작업 반복하기

018 블록 지정의 비주얼 모드

019 블록 지정 후 사용 명령어

020 vim의 옵션 개요

021 vim 옵션 설정 방법

022 탭(tab) 사이즈 조절

023 알아두면 좋은 몇 가지 옵션 설정

024 vim 설정 파일

025 vim 문자열 정렬

026 vim의 문자열 탐색

027 vim의 정규표현식(1) 개요

028 vim의 정규표현식(2) 문자 클래스

029 vim의 정규표현식(3) 점(.)

030 vim의 정규표현식(4) 문자열의 위치

031 vim의 정규표현식(5) or

032 vim의 정규표현식(6) 특수 문자

033 vim의 정규표현식(7) 반복

034 vim의 정규표현식(7) 몇 가지 예제들

035 vim의 정규표현식(8) POSIX 문자 클래스 1

036 vim의 정규표현식(9) 아스키(ASCII) 코드와 문자 클래스

037 vim의 정규표현식(10) POSIX 문자 클래스 2

038 vim의 정규표현식(11) 확장 정규 표현식 1

039 vim의 정규표현식(12) 확장 정규 표현식 2

040 vim의 정규표현식(13) 확장 정규 표현식 3

041 vim의 정규표현식(14) 확장 정규 표현식 4

042 vim 범위 지정 명령하기

043 vim 문자열 바꾸기 기본 형식 및 범위와 옵션

044 vim 문자열 바꾸기에서 슬래쉬(/) 및 정규표현식 사용

045 vim 특정 패턴을 조건으로 문자열 바꾸기

046 vim 여러 파일을 열고 버퍼 확인하기

047 여러 파일들 사이에서 움직이기

048 vim 화면 분할하기 수평분할

049 vim 화면 분할하기 수직 분할

050 vim 화면 분할하여 빈 파일 표시

051 화면을 수평 분할하면서 커서가 위치한 단어를 이름으로 하는 파일을 열기

052 복합 화면 분할 후 이동하기

053 다중 화면과 파일 버퍼

054 다중 분할 화면에서 창들간의 위치 전환

055 다중 화면에서 창 크기 조절

056 다중 화면으로 파일 내용 비교

057 탭 페이지 열고 닫기

058 탭 페이지 이동하기

059 원하는 위치를 마킹해서 이동하기1

060 원하는 위치를 마킹해서 이동하기2

061 단축키 만들기-키 매핑(mapping)

062 매크로 사용하기

063 vim에서 셸 명령 사용하기

064 폴딩 기능

065 기타 기능(탭 끼워넣기, 들여쓰기 자동정렬, 자동완성)

066 vi 또는 vim 기초 사용법을 마무리하면서(vim Anki 파일 모음)

탭 끼워넣기


작업을 하다보면 들여쓰기 때문에 행의 맨앞에 탭을 삽입해야할 경우가 많이 생긴다. 물론, 그럴 때마다 일일이 행의 처음으로 이동해서 편집 모드로 들어가 탭을 집어넣고 다시 나와서 작업을 해야 한다면 무척 번거로울 것이다.


이런 경우를 위해서 vim에서는 행 앞에 탭을 쉽게 삽입하거나 제거할 수 있게 만들어 놓았다


명령 모드 >>(오른쪽 꺽쇠 2회 누름)

 

현재 커서가 위치한 행의 맨 앞에 탭 하나를 삽입한다.


명령 모드 <<(왼쪽 꺽쇠 2회 누름)

 

현재 커서가 위치한 행의 맨 앞에 있는 탭 하나를 제거한다


위에 소개된 명령은 여러 개의 행에 동시에 적용할 수 있다.

 

명령 모드 [#]>> 

 

현재 커서 위치를 1행으로 해서 아래로 #행까지 행의 맨 앞에 탭 하나를 삽입한다


명령 모드 [#]<< 

 

현재 커서 위치를 1행으로 해서 아래로 #행까지 행의 맨 앞에 탭 하나를 제거한다



들여쓰기 자동정렬


소스코드의 들여쓰기가 잘못되었거나 잘못되었을 경우 이를 제대로 정렬할 수 있는 손쉬운 방법이 있다.

 

비주얼 모드로 들여쓰기를 정렬할 영역을 지정한 후 등호(=) 를 누르면 들여쓰기가 깔끔하게 정렬된다.

 

, 별도로 블록을 지정하지 않고 그냥 소스코드 전체의 들여쓰기를 정렬하려면 명령 모드에서 gg=G라고입력하면 된다.

 


자동완성 기능 사용하기


어떤 변수나 함수를 타이핑할 때 너무 복잡한 이름이거나 잘 모르는 이름일 경우에는 자동 완성 기능을 사용하여 손쉽게 이를 해결할 수 있다.

 

편집 모드 <Ctrl-p>


커서 위치에서부터 위로 자동 완성이 가능한 단어가 있는지 찾아서 제시함


편집 모드 <Ctrl-n>


커서 위치에서부터 아래로 자동 완성이 가능한 단어가 있는지 찾아서 제시함


자동완성 기능을 사용하는 모습은 다음과 같다. 



Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 



폴딩 기능 이용


폴딩 기능은 별로 구태여 볼 필요가 없는 부분을 접어서 보기 편하게 해 주는 기능으로 이렇게 사용한다.


접기(folding)

접고 싶은 부분을 비주얼 모드로 영역 지정한 후 zf 키를 누르면 해당 부분이 접어진다


펴기(unfolding)

접힌 부분에 커서를 위치시키고 zo 키를 눌러주면 접힌 부분이 펴진다


즉, 아래의 사진과 같이 지정된 영역을 접고 편다.




이를 응용해서 함수의 여는 중괄호 ‘{’ 위에 커서를 위치시키고 명령 모드에서 v]}zf 명령을 내리면 비주얼 모드로 진입하여(v) 함수의 코딩된 블록이 지정되어(]}) 접힌다(zf).


함수의 여는 중괄호 '{' 위에 커서를 위치시키고 v]}zf

비주얼 모드로 진입하여(v) 함수의 코딩이 이루어진 블록이 지정되어(]}) 접힌다(zf).




이 키가 다소 복잡하고 자주 사용하므로 아래와 같이 키 매핑을 해두는 것도 좋다. 


map <F1> v]}zf


※ 키 매핑은 앞서 포스팅한 이곳을 참조하면 된다



Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


064 폴딩 기능.apkg

vim 단축키 만들기


vim에는 정말 다양한 기능과 굉장히 많은 명령어가 있다. 하지만 이 많은 기능과 명령어를 모두 사용할 줄 알아야 하는 것은 아니다. 오히려 이러한 다양한 명령과 기능들을 둘러보고 나서 자신에게 필요한 것만 최적화 하는 것이 바람직하다. 특히, 자주 쓰는 명령어나 기능들을 간단한 키로 실행할 수 있도록 만들어 놓으면 작업이 대단히 수월해질 것이다. 이 때 자주 쓰는 명령어나 기능들을 간단한 키로 만들어주는 것이 키 매핑(mapping)이다. , 사용자 지정 단축키인 셈이다.

 

우선 어떤 키 매핑들이 사용되고 있는지 확인해보자


명령 라인에 :map 사용 중인 키 매핑 리스트를 화면에 표시한다.


실행해 보면 굉장히 많은 키 매핑이 사용중인 것을 볼 수 있을 것이다. 이미 지정된 키 매핑을 사용하는 것은 나중 문제로 하고 일단, 우리가 원하는 키 매팽을 해보는게 좋을 것 같다. 


위에서 사용한 명령라인에 :map 명령어 뒤에 [단축한 키][단축될 명령어]를 다음과 같이 배치하면 [단축될 명령어][단축한 키]매핑(mapping) 시킨다.


명령 라인에 :map [단축한 키] [단축될 명령어]


[단축될 명령어][단축한 키]매핑(mapping)


가령, 다음과 같다.


명령 라인에 :map <F2> :tabnew<CR>


기능키인 <F2> 키에 :tabnew<CR>매핑(mapping) 

명령 모드에서 기능키 <F2>를 누르면 :tabnew 명령어가 실행되어 새로운 탭이 열리면서 이름 없는 빈 파일이 표시됨


※ <CR>vim 내에서 [Enter]키를 입력했음을 의미한다. 만일, 위의 사례에서 <CR>을 집어넣지 않은 채로 매핑을 하면 <F2>키를 눌렀을 때 명령 라인에 :tabnew 명령어가 나타나지만 [Enter]명령어가 입력되지 않으므로 아무 일도 일어나지 않는다.



.vimrc 에 설정한 키 매핑 기록하기


지금 열심히 키 매핑으로 원하는 단축키를 만들어놨어도 vim을 끄고 다시 켜면 처음부터 다시 설정을 해줘야 한다. 단축키는 앞으로도 지속적으로 사용할 것이므로 vim의 설정 파일인 .vimrc에 설정한 키 매핑을 기록하여 매번 vim을 실행할 때마다 다시 설정하지 않도록 조치할 필요가 있다. 


우리는 앞서 vim의 설정 파일인 .vimrc에 대해서 간단하게 둘러본 바가 있으니 이를 참조하기 바란다.


~/.vimrc 파일을 열어 다음 내용을 가장 마지막 행에 추가한다


map <F2> :tabnew<CR>

.vimrc에 기록할 때는 명령 라인에 명령어를 입력할 때 앞에 붙는 콜론(:)을 쓰지 않는 점에 주의


이제 vim을 닫고 다시 열어서 명령 라인에 :map 을 입력하여 사용중인 키 매핑 리스트를 확인하면 아래과 같이 등록된 것을 확인할 수 있다.



Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


061 단축키 만들기-키 매핑(mapping).apkg


원하는 위치를 마킹해서 이동하기


우리가 이동하고 싶은 위치를 마킹하고 해당 위치로 빠르게 이동하면서 작업을 하면 무척 효율적인 작업이 가능해질 것이다.

 

원하는 위치를 마킹하는 방법과 마킹한 위치로 이동하는 방법은 다음과 같다.

 

원하는 위치에 커서를 두고 명령 모드에서 m[임의의 알파벳]

 → 해당 위치를 알파벳으로 마킹


`[마킹한 알파벳] 해당 알파벳이 마킹된 위치이동


작은 따옴표(')와 비슷해 보이는 ` 이 표시는 backquote 또는 backtick 이라고 부른다작은 따옴표(')와는 다르므로 주의해야 한다. 키보드에서는 숫자키 1번 바로 왼쪽에 있는 키이다



마킹할 때 사용하는 알파벳은 대문자인지 소문자인지에 따라서 지역 마킹과 전역 마킹으로 그 성격이 다르다.


알파벳 소문자인 a~z로 마킹하면 지역 마킹이 된다.


지역 마킹이란 같은 파일 내부에서만 마킹한 위치로 이동할 수 있는 마킹이다. , test.txt에서 마킹을 했다면 test.txt 파일에서 작업을 할 때만 마킹한 위치로 이동할 수 있다.

 

알파벳 대문자인 A~Z로 마킹하면 전역 마킹이 된다.


전역 마킹이란 다른 파일에서도 전역 마킹으로 지정된 위치로 이동할 수 있는 마킹이다

서로 다른 파일들 사이에서도 얼마든지 이동이 가능하다는 것이다. 이게 어느 정도 수준이냐면, 전역 마킹으로 지정한 위치는 해당 파일을 별도로 열지 않아도 마킹한 곳으로 이동이 가능하다. 가령, test.txt 파일에 전역 마킹 A로 위치를 지정해 놓았을 때, test.txt 파일을 열지 않아도 다른 파일에서 명령 모드 `A 키를 누르면 test.txt 파일이 열리면서 해당 위치로 이동한다.

 


숫자 0~9로 마킹된 파일 마킹


파일 마킹은 우리가 직접 지정하는 것이 아니라 ~/.viminfo 파일에서 자동으로 지정하는 것으로 vim이 알아서 지정하는 것이다. 우리가 파일 마킹을 할 수는 없지만 명령모드에서 `1과 같이 입력하면 해당 파일로 이동할 수 있다. 

 

 

마킹한 위치와 마킹에 사용된 알파벳들은 파일을 닫아도 그대로 유지되므로 언제든지 재사용할 수 있다. 


이것이 재사용될 수 있는 이유는 해당 마킹에 대한 정보가 .viminfo 파일에 저장되기 때문이다.

 

아래는 .viminfo 파일에 저장된 마킹관련 정보들이다.



 

마킹으로 이동하기에 대한 간단한  사용례는 다음과 같다. 


명령 모드에서 ma 

 → 현재 파일의 현재 커서 위치를 지역 마킹 a지정


명령 모드에서 `a

 → 지역 마킹 a로 지정된 위치이동(, 현재 파일에 지정되어 있을 경우)


명령 모드에서 `4 

 → 파일 마킹 4번의 위치이동(파일이 열려있지 않더라도 해당 파일이 열리면서 화면이 이동한다.)


명령 모드에서 mB 

 → 현재 파일의 현재 커서 위치를 전역 마킹 B지정


명령 모드에서 `B 

 → 전역 마킹 B로 지정된 위치이동(파일이 열려있지 않더라도 해당 파일이 열리면서 화면이 이동한다.)


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 



복합 화면 분할


복합 화면 분할은 화면을 분할하고 분할해서 수직과 수평 분할을 복합적으로 한 것을 말한다. 화면을 복합적으로 분할하는 방법은 매우 간단하다. 커서가 위치한 창에서 앞서 배운 수평분할이나 수직분할을 반복하면 창이 계속 분할된다


아래의 사진은 먼저 test1.txt를 열고 그 상태에서 다시 :vs test2.txt 명령으로 절반으로 수직분할하면서 test2.txt 파일을 오픈한 후 이 상태에서 다시 :sp test3.txt 명령으로 이 창을 절반으로 수평분할하면서 test3.txt 파일을 오픈한 모습이다. 




분할된 화면에서 창 사이 이동하기


<Ctrl-w>를 누르고 화살표키(←↑→↓)를 더하거나 <Ctrl-w>h, j, k, l 을 덧붙이면 커서 위치를 기준으로 그 방향에 있는 창으로 간단하게 이동할 수 있다


명령 모드에서 <Ctrl-w>+h 또는 <Ctrl-w>+


왼쪽 창으로 이동(현재 커서 위치의 왼쪽에 창이 있을 경우)


명령 모드에서 <Ctrl-w>+j 또는 <Ctrl-w>+


아래쪽 창으로 이동(현재 커서 위치의 아래쪽에 창이 있을 경우)


명령 모드에서 <Ctrl-w>+k 또는 <Ctrl-w>+


위쪽 창으로 이동(현재 커서 위치의 위쪽에 창이 있을 경우)


명령 모드에서 <Ctrl-w>+l 또는 <Ctrl-w>+


오른쪽 창으로 이동(현재 커서 위치의 오른쪽에 창이 있을 경우)



<Ctrl-w>를 누르고 화살표키(←↑→↓)를 더하거나 <Ctrl-w>에 h, j, k, l 를 붙여 화면간 이동은 아래 그림을 참조하라.




test1.txt 에서는 아래와 오른쪽 창이 없으므로 당연히 아래 창으로 이동(<Ctrl-w>+j 또는 <Ctrl-w>+)이나 오른쪽 창으로 이동(<Ctrl-w>+l 또는 <Ctrl-w>+)되지 않는다.

 

또한, test1.txt 에서 왼쪽 창으로 이동(<Ctrl-w>+h 또는 <Ctrl-w>+) 할 때 커서의 위치왼쪽의 수평 분할선을 기준으로 상단에 있으면 test3.txt로 이동하고 하단에 있으면 test2.txt로 이동하게 된다.


 

그 외에 다른 화면 이동은 다음과 같다


명령 모드에서 <Ctrl-w>+w


왼쪽 최상단에서 오른쪽 최하단까지 순차적으로 이동


명령 모드에서 <Ctrl-w>+p


바로 이전에 있었던 창으로 이동

두 개의 화면에서 계속 교대로 작업할 경우 <Ctrl-w>+p 키만 반복으로 누르면 편하게 이용할 수 있다


명령 모드에서 <Ctrl-w>+t


왼쪽 최상단 창으로 이동(최상위 창)


명령 모드에서 <Ctrl-w>+b


오른쪽 최하단 창으로 이동(최하위 창)


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


052 복합 화면 분할 후 이동하기.apkg


유용한 화면분할


앞에서는 단순히 화면을 분할해서 여는 방법만 설명했지만 사실, 화면 분할은 원하는 도움말을 열거나, 원하는 파일을 열거나, 소스코드를 탐색하기 위해서 임시로 화면을 분할해서 파일을 열고 참조했다가 다시 닫는 등의 활동을 간단하게 할 수 있어 매우 유용하다.

 

이번 포스팅에서는 이러한 유용한 화면분할 기능인 화면을 수평 분할하면서 커서가 위치한 단어를 이름으로 하는 파일을 여는 <Ctrl-w>+f 키를 익혀본다.


 <Ctrl-w>+f 키 

 

<Ctrl-w>+f

: 현재 커서가 위치한 창의 상단에 새로운 수평창이 열리고 커서 위치의 단어이름으로 하는 파일정해진 경로(PATH)에서 찾아서 표시


가령, 커서가 test.txt 라는 문자열 위에 있을 때 <Ctrl-w>+f를 누르면 화면 상단에 test.txt 파일이 표시되는 수평창이 나타난다.

 

어떻게 사용하는지 구체적으로 살펴보자.

 

준비된 파일에서 printf 라는 문자열 위에 커서를 두고  <Ctrl-w>+f 키를 눌러보고, test.txt 라는 문자열에 커서를 두고  <Ctrl-w>+f 키를 눌러볼 계획이다.



printf 함수명 위에 커서를 놓고 <Ctrl-w>+f 키를 누른 결과


printf 라는 함수명 위에 커서를 두고  <Ctrl-w>+f 키를 누른 결과 path에서 "printf" 파일을 찾을 수 없다는 내용의 오류 표시가 화면 하단에 나타난다.

 



이를 통해 한 가지를 알 수 있는데 <Ctrl-w>+f 키를 눌러서 커서가 위치한 단어동일한 이름의 파일을 열 때, 어떤 정해진 경로(path)그 단어에 해당하는 파일이 있어야만 해당 파일이 열린다는 것이다.



test.txt 라는 문자열에 커서를 놓고 <Ctrl-w>+f 키를 누른 결과


앞의 사례가 있으므로 경로(PATH)에 해당하는 홈 디렉터리에 있는 test.txt 파일을 이용하여 실습한다. 
 

그리고 test.txt 라는 문자열 위에 커서를 놓고 <Ctrl-w>+f 키를 누른 결과 다음과 같이 수평 분할이 이루어지면서 위의 창에 test.txt 파일이 열리는 것을 확인할 수 있다.




Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


051 화면을 수평 분할하면서 커서가 위치한 단어를 이름으로 하는 파일을 열기(4개 카드).apkg


파일 사이에서 이동


바로 앞의 포스팅에서 여러 개의 파일을 동시에 열고 해당 파일이 들어있는 파일 버퍼를 확인하는 방법을 배웠다. 그렇다면 이제 여러 파일들 사이를 오가면서 작업을 하기 위하여 파일들 사이를 오가는 방법을 알아야 한다


우선, 다음과 같이 명령하여 test1.txt, test2.txt, test3.txt 3개 파일을 다시 열어보자


$ vim test1.txt test2.txt test3.txt


명령 실행으로 처음 화면에 표시되는 파일은 첫 번째 파일인 test1.txt 이다. 이제 다음 명령어를 입력하여 파일 버퍼와 파일리스트를 확인해보자. 


:buffers 또는 :ls 또는 :files

1  %a  "test1.txt 2

2      "test2.txt"  0

3      "test3.txt"  0


현재, 화면이 표시되고 있는 첫 번째 파일1번 버퍼이고 현재 화면에서 표시되어 있다는 뜻에서 %a 파일 버퍼 번호 옆에 표시되어 있다.


이제, 간단하게 파일들 사이를 이동하는 방법을 알아보자명령 라인에 다음과 같이 명령어를 입력하면 된다 


:[#]n 다음 파일# 이동함(#이 없을 때는 1)

:[#]N 이전 파일# 이동함(#이 없을 때는 1)


파일을 이동하는 :[#]n :[#]N 명령으로는 가장 작은 파일 버퍼 번호 이전으로는 이동할 수 없고, 가장 큰 파일 버퍼 번호 이후로도 이동할 수 없다.

 

이번에는 명령 라인에 :n을 입력하여 다음 파일로 넘어가 다시 파일 버퍼와 파일 리스트를 다시 확인해보자.

 

:buffers 또는 :ls 또는 :files

1 #  "test1.txt 2

2 %a "test2.txt"  1

3    "test3.txt"  0


첫 번째 파일에서 다음 파일로 넘어온 것이므로 두 번째 파일이 현재 화면에 표시된 파일이고 따라서 2번 옆에 %a 표시가 있다. 그리고 파일 버퍼 번호 1 옆에는 # 표시가 새로 생겨난 것을 알 수 있다. # 표시는 파일 버퍼 번호 1의 파일이 바로 직전에 열렸던 파일이라는 뜻이다.

 

파일 버퍼 번호 2에 위치한 현재 상황에서 다시 이전 파일로 넘어가는 방법은 다음과 같다. 


:e # 이전 파일연다.

명령 모드 <Ctrl-^> 이전 파일을 연다


아무래도 <Ctrl-^> 키를 사용하는 것이 편하다. 특히, 딱 두 개의 파일을 이용하여 작업을 할 경우에는 <Ctrl-^> 키만 누르면 바로바로 파일을 스위치하면서 사용할 수 있어 매우 편하다



파일 버퍼 사이에서 이동


현재 화면에 표시되는 파일 버퍼를 이동하여 원하는 파일로 이동할 수 있다.

 

파일 버퍼를 이동하는 방법은 다음과 같이 명령 라인에 명령어를 입력하는 것이다.

 

:b# 파일 버퍼 번호 #에 해당하는 버퍼로 이동한다.

:bp[#] 이전 버퍼로 이동, #을 붙이면 #번만큼 이전 버퍼로 이동

:bn[#] 이후 버퍼로 이동#을 붙이면 #번만큼 이후 버퍼로 이동

:bf 첫 번째 버퍼로 이동

:bl 마지막 버퍼로 이동


버퍼를 이동하는 :bp[#] :bn[#] 명령은 첫 번째 버퍼와 마지막 버퍼에서 다시 순환하므로 :n이나 :N 명령이 오류가 나는 것과는 달리 명령이 계속 적용된다.



Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 



vim에서 여러 개의 파일 열고 파일 버퍼 확인하기


프로그래밍 소스 코드는 보통 여러 개의 파일로 이루어져 있다. 따라서 동시에 여러 개의 파일을 열고 작업해야 하는 경우가 비일비재하다. 따라서 vim에서도 여러 개의 소스 코드 파일을 다룰 수 있는 방법들이 준비되어 있다.

 

우선, vim에서 여러 개의 파일을 여는 방법부터 알아볼 필요가 있다. 하나는 다음과 같이 명령라인에서 순차적으로 파일을 하나씩 여는 것이다


:e test1.txt test1.txt 파일이 열린다.

:e test2.txt test2.txt 파일이 열린다.

:e test3.txt test3.txt 파일이 열린다.

※ 명령 라인에 :e [파일명] 형식으로 파일을 불러올 경우 파일이 있으면 해당 파일을 불러오고 해당 파일이 없으면 새로운 파일이 임시로 만들어진다.


두 번째 방법은 vim을 실행하면서 한꺼번에 여는 것이다


$ vim test1.txt test2.txt test3.txt


여러 개의 파일을 열었지만 현재 화면에 보이는 파일은 하나밖에 없을 것이다이러니 여러 개의 파일을 열었다고는 하지만 전혀 실감이 나지 않는다. 여러 개의 파일이 열렸다는 것을 어떻게 확인할 수 있을까?

 

vim은 열린 파일들을 파일 버퍼에 임시로 저장하여 사용한다. 따라서 다른 파일들이 파일 버퍼에 들어있는지를 확인하면 여러 개의 파일이 열려있는 것이다. 이를 확인하려면 명령 라인에 :buffers 또는 :ls 또는 :files 라고 명령어를 입력하여 파일 버퍼(buffer)를 확인하면 다음과 같이 결과가 출력된다


:buffers 또는 :ls 또는 :files

1 %a + "test.1.txt"  1

2      "test.2.txt"  0

3      "test.3.txt"  0


순서대로 1번 버퍼test1.txt 파일이 있고 2번 버퍼test2.txt3번 버퍼test3.txt 파일이 들어있는 것이 확인된다.


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 



 

특정 패턴을 조건으로 문자열 바꾸기

 

앞서 vim의 문자열 바꾸기는 특정 패턴의 문자열을 원하는 문자열로 바꾸는 방법에 대해서 간단히 알아보았다.

 

 

그런데 문자열을 바꿀 때, 단순히 문자열 패턴을 찾아서 바꾸는 것만으로 부족한 경우가 있다

 

가령 아래와 같이 이름과 거주지 그리고 그 사람의 집 전화번호를 데이터로 기록했는데 이 전화번호에 지역 번호가 빠져 있어 지역별로 지역번호를 부여해야하는 경우다. 

 

이름    거주지    전화번호

철수     서울     888-8888

영희     광주     888-8888

재범     서울     777-7777

선영     부산     888-8888

호동     서울     666-6666

 

우리가 하고 싶은 것은 전화번호 앞에 지역번호를 붙이는 것이다. 그런데 이 지역번호는 살고 있는 거주지에 따라서 달라진다. 가령, 서울의 지역번호는 02이므로 서울에 사는 철수, 재범, 호동은 전화번호 앞에 02- 라는 문자열이 첨가되어야 한다. 이와 같은 경우는 우리가 찾고자 하는 문자열 패턴과 우리가 바꾸고자 하는 문자열 패턴이 다르기 때문에 문제가 된다.

 

이렇게 찾는 문자열 패턴바꿀 문자열 패턴다른 경우 찾는 문자열 패턴을 조건으로 바꿀 문자열바뀐 문자열로 바꾸면 된다. 

 

이는 다음과 같은 형식으로 명령 라인에 명령어를 입력하면 된다

 

:g/[찾을 문자열]/s/[바꿀 문자열]/[바뀐 문자열]/[바꾸기 옵션]

 

이를 해석하면 문서 전체에서 [찾을 문자열]이 있는 행을 모두 찾아서 그 행에 [바꿀 문자열]이 있으면 이를 [바꾸기 옵션]에 따라서 [바뀐 문자열]로 바꾼다로 해석한다. 

 

[바꿀 문자열], [바뀐 문자열], [바꾸기 옵션]앞서 포스팅한 내용대로 하면 적용된다. [찾을 문자열]도 [바꿀 문자열]과 마찬가지이다. 명령의 가장 맨 앞에 g는 항상 입력하도록 하자. g를 생략할 경우도 작동하지만 별로 쓸모가 있는 것 같지는 않다.

 

위의 명령에서 [바꿀 문자열]을 생략하면 [찾을 문자열]이 [바꿀 문자열]의 역할을 한다.

 

:g/[찾을 문자열]/s//[바뀐 문자열]/[바꾸기 옵션]

= :%s/[찾을 문자열]/[바뀐 문자열]/[바꾸기 옵션]

즉, 모두 문서 전체에서 [찾을 문자열]을 찾아 [바꾸기 옵션]에 따라서 [바뀐 문자열]로 바꾸라는 명령이다. 

 

이제까지 설명한 방식에 따라서 위의 서울에 거주하는 사람들의 전화번호 앞에 지역번호를 추가하는 명령어는 다음과 같다.

 

:g/서울/s/\(\d\+-\d\+\)/02-\1/g

문서 전체에서 '서울' 이라는 문자열이 있는 행에서만 숫자의 연속 하이픈(-) 숫자의 연속 형태의 문자열을 그 앞에 '02-' 라는 문자열을 붙인 형태로 다음과 같이 바꾼다

 

이름    거주지    전화번호

철수     서울     02-888-8888

영희     광주     888-8888

재범     서울     02-777-7777

선영     부산     888-8888

호동     서울     02-666-6666

 

만일, 다음과 같이 명령어를 입력한 경우라면 내용이 조금 달라진다.

 

:g/\(\d\+-\d\+\)/s//02-\1/g

이것은 :%s/\(\d\+-\d\+\)/02-\1/g 와 동일하므로 [찾을 문자열]이 숫자의 연속 하이픈(-) 숫자의 연속 형태의 문자열이고 동시에 [바꿀 문자열]이 되므로 다음처럼 모든 전화번호 앞에 '02-' 라는 문자열이 첨가된 형태로 바뀐다.

 

이름    거주지    전화번호

철수    서울    02-888-8888

영희    광주    02-888-8888

재범    서울    02-777-7777

선영    부산    02-888-8888

호동    서울    02-666-6666

 

Anki 파일

 

아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 

 

 

 

045 vim 특정 패턴을 조건으로 문자열 바꾸기.apkg
다운로드

 

+ Recent posts