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
다운로드

 

vim 바꾸기에서 슬래쉬(/) 사용


바꾸기를 할 때 [바꿀 문자열] 이나 [바뀐 문자열]슬래쉬(/)가 포함되면 어떻게 해야할까? 가령, 다음과 같은 파일의 경로를 바꾸기 하는 경우를 생각해보자. 

 

/home/ubuntu/document  →  /root/document


이를 기본 형식 그대로 :[범위]s/[바꿀 문자열]/[바뀐 문자열]/[바꾸기 옵션] 으로 다음과 같이 명령하면 구분자슬래쉬(/)가 너무 많아 오류가 발생할 것이다


:%s//home/ubuntu/document//root/document/g


이런 경우 해결 방법은 두 가지다. 하나는 구분자를 슬래쉬(/) 대신 (.)으로 쓰는 것이고 다른 하나는 슬래쉬(/)가 구분자로 쓰이지 않도록 앞에 역슬래쉬(\)를 붙여 escape 하는 것이다. 즉 다음과 같다.

 

:%s./home/ubuntu/document./root/document.g 슬래쉬(/) 대신 (.)을 구분자로 사용

:%s/\/home\/ubuntu\/document/\/root\/document/g 슬래쉬(/) 앞에 역슬래쉬(\)를 붙이기



vim 바꾸기에서 정규 표현식 이용하기


정규 표현식에 대해서는 앞서 포스팅한 내용을 참조하기 바란다. 


정규 표현식을 이용하면 바꾸기 기능을 훨씬 더 강력하게 사용할 수 있다


가령, 아래의 모든 행의 맨 앞에 http:// 문자열을 첨가하고 싶다


www.daum.net

www.naver.com

www.google.com


정규표현식을 이용하면 간단하게 만들 수 있다


:%s.^.http://.g

캐럿(^)행의 시작을 의미하므로 모든 행이 시작되는 곳에 http:// 문자열이 첨가된다

 

http://www.daum.net

http://www.naver.com

http://www.google.com


아래에는 휴대폰 번호와 이메일이다. 휴대폰 번호 앞에 편의상 010- 문자열을 뺐는데 이를 다시 붙이려고 한다. 어떻게 해야할까?


deliciouslearning@gmail.com

8258-4838

deliciouslearning@hanamil.net

8348-4584

 

이메일도 섞여 있으므로 앞의 사례처럼 모든 행 앞에 일괄적으로 010- 문자열을 첨가할 수는 없다. 


일단, 전화번호에 해당하는 정규표현식을 찾는다. 가운데 하이픈(-)을 중심으로 숫자가 연속되는 열이므로 다음과 같다.


[0-9]\+-[0-9]\+ → (숫자의 연속)(-)(숫자의 연속) 형태의 문자열

\d\+-\d\+ [0-9]는 \d와 동일함

 

위의 정규 표현식을 [바꿀 문자열]에 사용하면 사례에서 나온 모든 휴대폰 번호를 특정해낼 수 있다.

 

그리고 여기에 010- 이라는 문자열을 앞에 붙여야 한다. [바뀐 문자열]에 이를 어떻게 적어야 할까?


[바뀐 문자열]은 번호마다 전부 다르므로 단순한 문자열을 배치하긴 어렵다. [바꿀 문자열]에서 정규 표현식으로 검색한 각각의 내용을 [바뀐 문자열]에서 바로 재사용할 수 있으면 좋다.

 

[바꿀 문자열]에서 찾은 검색결과를 [바뀐 문자열]에서 재사용하고 싶다면 재사용하고 싶은 부분에 해당하는 표현식을 escape 된 소괄호로 감싸는 형식으로 만들어 주어야 한다. 그러면 [바꿀 문자열]에서 escape 된 소괄호로 둘러싸인 부분을 왼쪽에서 오른쪽으로 순서대로 센 것과 [바뀐 문자열]에서 \1~\9가 다음과 같이 각각 대응하게 된다.

 


[바꿀 문자열] \(표현식1\)\(표현식2\).....\(표현식9\)

[바뀐 문자열] →     \1         \2    .....     \9

 

, [바꿀 문자열]에서 escape 된 소괄호로 둘러싸인 부분[바뀐 문자열]에서 9개까지 순서대로 재사용할 수 있는 것이다.


이를 응용하면 앞에서 전화번호 앞에 010- 문자열을 붙이는 것은 다음과 같다.

 

:%s/\(\d\+-\d\+\)/010-\1/g

 

Anki 파일


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


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


 

vim의 문자열 바꾸기 기본 형식

 

vim에서 문자열 바꾸기를 할 때에는 기본적으로 다음과 같은 형식으로 명령 라인에 명령어를 입력한다

 

:[범위]s/[바꿀 문자열]/[바뀐 문자열]/[바꾸기 옵션]

 

 

위의 명령은 "문서의 이 [범위]에서 [바꾸기 옵션]에 따라 [바꿀 문자열][바뀐 문자열]로 바꾼다."라고 해석한다.

 

[범위] [바꾸기 옵션]

 

우선 [범위][바꾸기 옵션]에 대해서 알아보자.

 

[범위]는 앞서 포스팅한 명령 라인에서 범위지정하기를 그대로 사용하면 된다. 단지, [범위]를 생략할 경우 현재 커서가 위치한 행에서만 문자열 바꾸기가 일어난다는 점이 다르다.

 

 

그리고 [바꾸기 옵션]은 다음과 같다.

 

 

[바꾸기 옵션] 생략 [범위] 내의 각 행에서 처음 일치하는 문자열만 바꿈

g [범위] 내에 행에서 모든 문자열을 바꿈

i 대소문자를 무시하고 바꿈

c 문자열을 바꿀 때마다 바꿀지 여부를 확인

  (y/n/a/q/l/^E/^Y)

  y : 현재 문자열을 바꾸고 다음 바꿀 문자열로 넘어감

  n : 현재 문자열을 바꾸지 않고 다음 바꿀 문자열로 넘어감

  a : 모든 문자열을 바꾸고 종료

  q : 더 이상 바꾸지 말고 모두 종료

  l : 현재 행만 바꾸고 종료

  ^E : [Ctrl+E], 아래로 한 행 화면 스크롤

  ^Y : [Ctrl+Y], 위로 한 행 화면 스크롤

 

일단, 아래의 사례를 참조하자. 아래의 vim 텍스트 맨 앞의 번호들은 행번호이다. :set nu로 행번호를 노출시킨 상태이다. 커서는 1행의 첫 번째 one 바로 옆에 위치해 있다. 이 상황에서 명령어를 입력한다.

 

1 one one One ONE

2 one one One ONE

one one One ONE

one one One ONE

 

우선문자열 one을 two로 바꾸려고 한다따라서 [바꿀 문자열]은 one이고 [바뀐 문자열]은 two가 된다.

 

:s/one/two 현재 커서가 위치한 행에서 one을 찾아 처음 일치하는 문자열two로 바꿈

 

two one One ONE

2 one one One ONE

3 one one One ONE

4 one one One ONE

 

[범위]가 생략되어 커서가 위치해 있던 1행에서만 문자열을 탐색했고 [바꾸기 옵션]이 생략되어 처음 일치하는 one만 two로 바뀜

 

:%s/one/two 문서 전체에서 one과 일치하는 문자열을 찾아 각 행에서 처음 일치하는 문자열two로 바꿈

 

1 two one One ONE

2 two one One ONE

3 two one One ONE

two one One ONE

 

[바꾸기 옵션]이 생략되어 각 행에서 처음 일치하는 one만 two로 바뀜

 

:%s/one/two/g 문서 전체에서 one과 일치하는 문자열 모두two로 바꿈

 

1 two two One ONE

2 two two One ONE

3 two two One ONE

two two One ONE

 

[바꾸기 옵션]이 g이므로 각 행에서 든 일치하는 one 문자열이 two 문자열로 바뀜

 

:%s/one/two/gi 문서 전체에서 대소문자와 상관없이 one과 일치하는 문자열 모두two로 바꿈

 

1 two two two two

2 two two two two

3 two two two two

two two two two

 

[바꾸기 옵션]은 사용하려는 옵션을 붙여서 동시에 옵션을 적용할 수 있어 gi 옵션으로 대소문자 상관없이 모든 행에서 전부 바뀌게 됨

 

:2,3s/one/two/g 2, 3번 행에서 one과 일치하는 문자열 모두two로 바꿈

:+1,+2s/one/two/g 커서가 1행에 있으므로 2(+1), 3(+2)번 행에서 one과 일치하는 문자열 모두 two로 바꿈

 

1 one one One ONE

2 two two One ONE

3 two two One ONE

4 one one One ONE

 

위의 두 가지 명령 모두 2번행과 3번행에 적용됨

 

Anki 파일

 

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

 

 

 

 

043 vim 문자열 바꾸기 기본 형식 및 범위와 옵션.apkg
다운로드

 

<부수한자 네글자 052: 鼓(북 고), 黽(맹꽁이 맹, 힘쓸 민), 鼠(쥐 서), 鼎(솥 정)>



부수한자 214개 전체 자료실 페이지 가기


 (북 고)


북채로 을 치고 있는 모양을 형상화


부수로써 의미 : 북, 장구의 종류


 (맹꽁이 맹, 힘쓸 민)


배가 뚱뚱하게 나온 맹꽁이의 모습을 형상화한 것인데 후에 가차되어 '힘쓰고 노력한다'는 의미로도 사용됨


부수로써 의미 : 맹꽁이나 자라 등 물가에 사는 동물


 (쥐 서)


위에는 뾰족한 주둥이와 큰 앞니를, 아래는 배와 굽어있는 등과 긴 꼬리 모양을 그려 의 모양을 형상화


부수로써 의미 : 쥐, 두더지, 다람쥐, 족제비


 (솥 정)


왕실에서 제사를 지낼 때 사용하는 존귀한 세발솥을 형상화


부수로써 의미 : 솥의 종류나 솥의 부분



 Anki 학습파일


Anki 학습파일은 아래와 같이 한자와 독음만 간단하게 암기할 수 있는 한자연습글자의 생성원리나 부수의 의미 기타 사항 등을 공부하는 심화학습의 2종류로 나누어 첨부했습니다. 


부수한자연습_052.apkg


부수한자심화학습_052.apkg



부수한자 214개 전체 자료실 페이지 가기




<부수한자 네글자 051: 黃(누를 황), 黑(검을 흑), 黍(기장 서), 黹(바느질할 치)>



부수한자 214개 전체 자료실 페이지 가기


 (누를 황)


본래 사람이 허리에 차는 패옥을 의미했는데, 패옥 색깔이 노란 것으로 인해 '노란색'의 의미로 가차됨


부수로써 의미 : 누렇다, 노란색


 (검을 흑)


그을음이 가득한 굴뚝의 형상으로 그을음을 통해서 검은색을 얻었기에 '검정색'이라는 의미를 나타냄


부수로써 의미 : 검정색


 (기장 서)


곡식을 의미하는 禾(벼 화)와 물을 의미하는 水(물 수)가 결합하여 물기와 찰기가 많은 기장을 의미함


부수로써 의미 : 기장


 (바느질할 치)


바느질로 수를 놓는 모양을 나타낸 글자로 '바느질하다, 바느질한 옷감' 등의 뜻을 나타냄


부수로써 의미 : 바느질



 Anki 학습파일


Anki 학습파일은 아래와 같이 한자와 독음만 간단하게 암기할 수 있는 한자연습글자의 생성원리나 부수의 의미 기타 사항 등을 공부하는 심화학습의 2종류로 나누어 첨부했습니다. 


부수한자연습_051.apkg


부수한자심화학습_051.apkg



부수한자 214개 전체 자료실 페이지 가기



<부수한자 네글자 050: 麻(삼 마), 麥(보리 맥), 魚(물고기 어), 鳥(새 조)>



부수한자 214개 전체 자료실 페이지 가기


 (삼 마)


천을 짜기 위해서 껍질을 벗긴 을 집에서 햇빛에 말리고 있는 형상으로 ''의 의미로 쓰임


부수로써 의미 : 삼과 관련된 의미


 (보리 맥)


위의 싹에서부터 아래 뿌리까지 보리의 모양을 형상화


부수로써 의미 : 보리, 곡식, 양식


 (물고기 어)


위에서부터 차례로 물고기의 머리, 비늘 달린 몸통, 지느러미를 형상화


부수로써 의미 : 물고기


 (새 조)


의 머리, 부리, 날개, 꼬리, 다리 등을 형상화하여 긴 꽁지 새를 의미했으나 후에 와서는 명확한 구분을 하지 않고 ''라는 의미로 쓰임


부수로써 의미 : 새, 긴 꽁지 새



 Anki 학습파일


Anki 학습파일은 아래와 같이 한자와 독음만 간단하게 암기할 수 있는 한자연습글자의 생성원리나 부수의 의미 기타 사항 등을 공부하는 심화학습의 2종류로 나누어 첨부했습니다. 


부수한자연습_050.apkg


부수한자심화학습_050.apkg



부수한자 214개 전체 자료실 페이지 가기



<부수한자 네글자 049: 鬥(싸울 투), 髟(머리털 표), 鹵(소금밭 로), 鹿(사슴 록)>



부수한자 214개 전체 자료실 페이지 가기


 鬥(鬪) (싸울 투)


두 사람이 주먹을 들고 싸우는 모양을 형상화


부수로써 의미 : 싸우다, 다투다


싸울 투자는 단독으로 쓰일 때는 의 형태로 쓰임


 (머리털 표)


長(길 장)彡(터럭 삼)이 결합하여 머리카락이 길게 늘어져 멋있는 것을 나타냄


부수로써 의미 : 머리털이나 수염 관련


 (소금밭 로)


그릇에 소금이 담겨있는 모양을 형상화


부수로써 의미 : 소금 관련, 짠맛


 鹿 (사슴 록)


멋진 뿔을 가진 사슴을 형상화


부수로써 의미 : 사슴, 동물



 Anki 학습파일


Anki 학습파일은 아래와 같이 한자와 독음만 간단하게 암기할 수 있는 한자연습글자의 생성원리나 부수의 의미 기타 사항 등을 공부하는 심화학습의 2종류로 나누어 첨부했습니다. 


부수한자연습_049.apkg


부수한자심화학습_049.apkg



부수한자 214개 전체 자료실 페이지 가기



복사(copy가 아닌 yank)


vim에서는 복사copy라 하지 않고 '확 잡아당긴다'라는 뜻의 yank라고 부른다. 따라서 복사에 관련된 단축키도 y다. 


명령 모드에서 다음과 같이 키를 누르면 정해진 방식에 따라서 복사(yank)한다. 


yw → 현재 커서 위치에서 다음 단어 첫글자 바로 전까지 복사(yank)

yy or Y  현재 커서가 위치한 행 전체를 복사(yank)


※ 엄밀하게 말하면 복사가 아닌 레지스터로 잡아당기는(yank) 것이다. 레지스터에 대해서는 나중에 다시 설명한다.



붙여넣기(paste가 아닌 put)


복사했으면 이제 붙여넣기를 할 차례다. vim에서는 복사한 것을 붙여넣기 하는 것을 물건 따위를 어딘가에 놓는다라는 의미의 put으로 보고 관련된 단축키도 p


명령 모드에서 다음과 같이 키를 누르면 정해진 방식에 따라서 복사된 내용을 붙여넣기(put)한다.


소문자 p 현재 행에서 커서 다음 칸부터 붙여넣는다(put)

          붙여넣을 내용이 행 전체를 복사한 것일 경우 현재 행의 아래 행에 붙여넣는다.


대문자 P 현재 행에서 커서 위치부터 붙여넣는다(put)

          붙여넣을 내용이 행 전체를 복사한 것일 경우 현재 행의 위쪽 행에 붙여넣는다.



복사와 붙여넣기를 반복하기


복사붙여넣기는 다른 단축키들과 마찬가지로 숫자를 이용하여 반복시킬 수 있다.


10yw 현재 커서 위치에서 10개의 단어를 복사

5yy 현재 커서 위치에서 5개의 행을 복사

5p → 소문자 p5번 반복함

9P → 대문자 P9번 반복함



Anki 파일


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



<부수한자 네글자 048: 骨(뼈 골), 鬼(귀신 귀), 馬(말 마), 鬯(술이름 창)>



부수한자 214개 전체 자료실 페이지 가기


 (뼈 골)


윗 부분은 살을 발라내어 가 드러난 모양이고 아래는 고기를 의미하는 肉(月)(고기 육)자로 '살이 붙은 뼈'를 의미함


부수로써 의미 : 뼈와 관련된 신체 부위나 물건


 (귀신 귀)


커다란 머리의 가면을 쓴 모양을 형상화


부수로써 의미 : 귀신, 영혼


 馬 (말 마)


갈기를 휘날리며 달리는 의 모양을 형상화


부수로써 의미 : 말과 관련된 의미


 (술이름 창)


그릇(凵) 안에 여러 가지 곡물(※)을 넣어 빚은 숟가락(匕)으로 뜨는 것을 의미함


부수로써 의미 : 술 빚는 재료로 쓰이는 풀, 무성하다



 Anki 학습파일


Anki 학습파일은 아래와 같이 한자와 독음만 간단하게 암기할 수 있는 한자연습글자의 생성원리나 부수의 의미 기타 사항 등을 공부하는 심화학습의 2종류로 나누어 첨부했습니다. 


부수한자연습_048.apkg


부수한자심화학습_048.apkg



부수한자 214개 전체 자료실 페이지 가기



+ Recent posts