Anki 문장 암기하기 8 - 단순 암기의 발견


 컴퓨터 관련 공부를 생각만큼 하지 못한 이유는 몇 가지가 있다.


 첫 번째는 블로그다. 초기에는 vim이나 HTML/CSS 등을 공부하면서 블로그로 올릴 계획을 세웠다. 하지만 매일 공부한 것을 블로그에 올리려면 스스로 내요을 편집하고 정리해야 하는데, IT 공부는 생각 외로 전혀 단순하지 않았다. 끊임없이 의문점이 나타나고 관련 내용을 찾아보지만 스스로도 신뢰할 수 없었다. 그렇다고 책을 그대로 베껴서 포스팅을 작성할 수 없다고 판단하여 중단하게 되었다. 덕분에 블로그에 올릴 수 있는 다른 공부에 집중하게 되었다. 


 두 번째는 번역이다. 블로그에 포스팅하지 않고, 그냥 공부하려고 했다. 그런데 그럴 때마다 번역이 이상한 책들하고만 인연이 닿았다. 신뢰할 수 없는 번역, 지나치게 이상한 문장 등으로 책을 덮기 일쑤다. 그렇게 공부하기를 포기한 책들이 3~4권정도 된다. 매번 의욕에 차서 공부를 시작했다가 실망하고 덮는 과정이 반복되면서 공부에 대한 의욕도 저하될 수밖에 없었다. 나중에는 번역되지 않은 영어 원서로 공부하고 싶을 정도였다.


 마지막은 Anki에 이공계 관련 과목을 집어넣는 방법이다. 이공계를 비롯하여 IT 분야는 수식과 그림을 적극 활용할 수밖에 없다. 이제껏 한문, 영어 등의 공부는 그저 텍스트로 충분했다. 하지만 이공계 과목은 텍스트로 표현하면 지나치게 길어지고 그 의미를 제대로 전달할 수 없는 경우가 많다. 간단한 기호와 수식이면 그 함의가 정확하고 간결하게 전달된다. Anki에서 기호와 수식 표현으로 사용하기를 권장하는 소프트웨어는 LaTeX이고 제대로 정리하려면 이를 익혀야 했다. 의욕에 차서 공부하려고 책을 폈는데, 그 전에 공부해야할 것이 있다는 것을 발견한 셈이다. 그렇다고 그 공부할 내용이 간단한 것도 아니다. 거의 책 한권 분량이니 부담이 되었다. 공부하고 싶은 내용도 아니니 더더욱 의욕이 꺾였다. 이 경우에도 LaTeX을 습득할지 말지 꽤나 오래 고민했다. 필요하다는 것은 알지만 낯설고 공부할 내용도 많으며 별로 알고 싶은 내용도 아니기 때문이다. 


 다른 방법이 없었다. 어떻게든 정신을 가다듬고 LaTeX을 공부하기로 했다. 스스로에게 필요성을 역설하기 시작했다. 수식 사용이 필요한 다양한 상황을 그려보면서 의욕을 부추겼다. Anki의 카드뿐만 아니라 블로그 포스팅에도 수식을 집어넣어야 하고 아마도 무척 많이 사용할 수 밖에 없다. 수식이 필요할 때마다 사진을 찍거나 파워포인트로 얼기설기 그림을 그리면 카드 만들 때마다 고역이고, 공부할 때도 그 어설픔이 눈에 밟힐 것이다. 게다가 다른 사람들과 공유할지도 모르는 카드이므로 LaTeX을 써서 깔끔하게 조판하는 편이 바람직하다고 스스로를 설득했다. 그렇게 힘들게 LaTeX을 공부하면서 새로운 경험을 하게 되었다.


 유용한 LaTeX 교재를 찾기 어려웠다. LaTeX은 IT 소프트웨어에서 자주 볼 수 있는 특유의 문서(document)가 돌아다니는데, 이러한 문서들은 읽기 쉽지 않다. 문서는 친절한 가이드가 아니고 그저 취지와 각종 명령 사용법 등을 건조하게 제시하는 정도이기 때문이다. 이런 문서들은 하나하나 조작해보면서 씨름을 해야지 겨우 감이 온다. 그것도 어느 정도 개발 경험이 있고, 다른 비슷한 소프트웨어를 써본 경험이 있어야 빠르게 익힐 수 있다. 처음 접하는 사람이 문서로 소프트웨어를 공부하는 것은, 영어를 전혀 모르는 사람이 공부하겠다고 사전을 통째로 외우는 것처럼 막막한 행위가 될 수 있다. 게다가 문서들 대부분 읽기 쉽게 정서된 글도 아니고, 친절하게 하나하나 설명해주는 것도 아니어서 더 까다롭다. 그래서 이런 문서류는 좋아하지 않고 잘 보지도 않는다. 하지만 LaTeX은 적당한 교재를 구하기 어려웠다. 어떤 것은 너무 자세해서 부담스럽고, 어떤 것은 너무 간단해서 이해하기 어려웠다. 전문가가 될 것은 아니므로 적당히 쓸 수준의 간단한 교재를 원했지만 아쉽게도 시중에서 구입하지 못했다. 결국, 이리저리 탐색하다가 포기하고 국내 TeX 사용자 그룹인 KTUG에서 가장 초보자에게 권장하는 lshort-ko를 골랐다. 


 당시에는 지나치게 많은 Anki 카드에 질려서 쓸데없는 카드를 최대한 만들지 말자는 주의였다. 그래서 열심히 문서를 이해하고 중요한 내용만 카드로 옮겨 공부하겠다고 마음먹었다. 하지만 이는 불가능했다. 무엇이 필요하고 무엇이 필요 없는지 전혀 모르는데 어떻게 요약하고 정리할까? 게다가 LaTeX 매뉴얼은 이해하기 어려웠다. 그 서술 방식이 사용자 친화적인 아닌 점도 있지만 생소한 조판에 대해서 다루고 있어서 이기도 하다. 게다가 LaTeX의 버전이 너무 다양해서 혼란스럽고 그 다음에 등장하는 수많은 명령어와 패키지는 이런 혼란을 더욱 가중시켰다. 결국, 이리저리 탐색만 하다 지지부진 진도가 나가지 않고 또 의욕이 꺾였다. 


 아무 것도 하지 못하는 교착된 상태가 시작되면서 잠시 무기력한 나날을 보냈다. 무기력하게 노는 상황과 원래 하던 대로 무조건 외우는 상태를 비교해보니 이미 충분히 시간낭비를 했고, 무기력한 상황이 더 지속되면 더 시간낭비를 할 것 같았다. 결국, 카드를 정리하기를 포기하고 닥치는 대로 외우기 시작했다. 


 IT 관련 Anki 카드를 처음 만드는 상황은 아니다. vim이나 HTML/CSS 관련 카드를 만들어 공부했었다. 그리고 이때는 블로그 포스팅도 같이 했기 때문에 외워야할 내용들이 문장이나 글의 형태로 만들어 단순한 지식이 아닌 종합적이고 입체적인 지식의 형태가 되도록 어느 정도 노력했다. 그런데 LaTeX은 부담스러운 상황에 갑자기 얹어진 반갑지 않은 공부였고, 빨리 끝내고 싶었다. 그래서 lshort-ko 문서에 나온 단순한 설명과 명령어, 부호 등을 최대한 간단하게 다음과 같이 명령어와 해당 결과를 Q/A 식으로 작성했다.


Q : 다음 레이텍 명령의 결과는? \AE 

A : Æ

    

Q : 다음 레이텍 출력을 만드는 명령은? Æ

A : \AE 


 첫 번째 Q/A는 명령어의 작동 결과를 묻고, 두 번째 Q/A는 특정 결과를 만들어내는 명령어를 묻는 방식이다. 대부분의 카드를 이런 방식으로 간단하게 신속하게 만들었다. 기존에 하던 것처럼 프로그램 내부의 작동이나 배경, 조판 용어 설명 등을 추가로 찾아보지 않고, 그저 필수적인 몇몇 간단한 개념과 필요한 기능을 나열해서 외운 것이다. 물론, 카드는 많이 만들어졌다. 모든 특수문자와 명령어를 전부 카드로 옮겼기 때문이다. 

 

 이건 상당히 재미있는 경험이었다. 단답형의 카드들은 너무나 쉽고 빠르게 흡수되었다. 문장과 글을 곱씹어 외우는 방식을 살펴보면 처음 공부하는 새 카드는 대략 짧게는 3~4분에서 길게는 15분 정도 걸린다. 하지만 단답형 카드들은 5~10초 정도면 학습이 된다. 너무 쉽게 진도가 나가니 즐겁고 상쾌했다. 복습은 더 빨랐다. 보통 1초면 하나의 카드를 복습하고 넘어갈 수 있었다. 단순한 사실들을 상기하면서 빠르게 복습할 수 있게 되니 Anki에 수백 개의 복습 카드가 있어도 전혀 부담스럽지 않다. 오히려 상쾌했다. 외우고 곱씹는 방식에서는 느낄 수 없는 빠른 카드 클리어는 속도감을 주어 지루하지 않았고, 너무 쉽게 답을 기억해낼 수 있어서 공부에 대한 부담감을 줄이고 자존감도 살짝 올려주었다. 


 덕분에 진도가 빠르게 나아갔다. LaTeX 공부는 필요한 부분인 수식 조판을 다루는 부분까지만 공부했다. 이는 메뉴얼 절반에 해당하는 부분으로 70페이지 정도 된다. 다른 공부라면 최소 2달은 걸렸을 분량이지만 이 경우는 10일 정도로 공부를 끝낼 수 있었다. 끝내주는 속도감이었다.


 게다가, 단순히 매뉴얼을 눈으로 볼 때는 이상할 정도로 손에 잡히지 않던 내용들이 자잘 자잘한 명령어와 특수기호 사용법을 외우면서 빠르게 친숙해지고 손에 딱 달라붙기 시작했다. 단순 암기를 시도했을 때는 미리 단순한 명령들을 암기하고 다시 LaTeX 매뉴얼을 보면서 몸에 익히려는 계획이었다. 하지만 단순 암기만 했음에도 막막했던 LaTeX을 어떻게 사용해야하는지 손에 잡힐 듯 감이 오기 시작했다.


 종합하자면 LaTeX 공부 경험은 빠르게 진행되는 즐겁고 가벼운 공부라고 할 수 있다. 공부 결과도 매우 좋았다. 빠르게 LaTeX을 필요한 부분까지 익혔고 잘 사용한다. 무엇보다도 어떻게 사용할지 감이 잡혀 매우 만족하고 있다.


 왜 그 동안 한 번도 이렇게 상쾌하게 만족스럽게 공부하지 못했을까? 그것은 바람직한 공부는 주입식으로 단순 지식을 암기하지 말아야 한다고 믿었기 때문이고 그것에 더하여 지금껏 공부해온 내용들이 이런 공부에 적합하지 않았기 때문으로 보인다.


 스스로 믿는 바람직한 공부는 지식과 정보를 다른 지식과 정보와 연계시켜 입체적으로 살아있는 지식을 익히는 공부다. 그러면 해당 지식이 자연스럽게 응용되고 장기간 기억하기 편해진다고 생각한다. 그래서 문장이나 글 형태로 외우고, 그림이나 시청각 자료를 동원해서 익힌다. 어찌 보면 흔히 듣게 되는 교육 모델이랑 비슷하다. 쉬운 개념부터 차근차근 접근하고 다양한 교보재와 시청각 자료를 이용해서 생생하게 인지시키고, 개념을 추출해 심화시키는 식의 교육법이다. 이러한 교육법은 뇌 속의 다양한 신경들을 자극한다. 그 결과 지식과 활동들이 탄탄하게 결속되어 효과적으로 장기 기억을 형성하고 죽은 지식이 아닌 언제든 응용 가능한 살아있는 지식을 형성하게끔 도와준다고 여겨진다. 그리고 이런 믿음에 따라서 글이나 문장 형태로 외워보니 비록 속도가 느리기는 하지만 깊은 충족감을 느낄 수 있었다. 결국, 믿음과 경험이 공부방식이 옳다고 확신시켜주었다.


 하지만 단순 지식으로 외운 경험은 새로운 가능성을 보여주었다. 단순 지식으로 외웠다는 것은 그냥 명령어와 기호 쓰는 법 등 개별적이고 파편화된 지식으로 공부했다는 것이다. 공부하기 싫고 최소한으로 빨리 끝내려는 마음이었기 때문에 이전의 공부처럼 명령어가 작동하는 원리를 찾거나 이렇게 조판하는 이유를 더 이해해보려고 노력하는 등의 노력을 일체 하지 않았다. 처음에는 어떻게 쓰는지 전혀 모르고 중요성을 분별할 수도 없으니 일단, 외우고 매뉴얼을 다시 읽거나 실제로 사용하면서 정말 필요한 것만 하나하나 들여다보자는 심산이었다. 그런데 외웠더니 그 다음 부터는 바로바로 원하는 대로 사용할 수 있었고, 더 이상의 추가적인 공부가 필요 없었다. 깊게 공부하지 않았음에도 머릿속에 흡수된 단순 지식들이 알아서 서로 상호작용하면서 LaTeX 수식 작성이라는 체계를 세웠기 때문이다. 


 이는 어떻게 가능했을까? 두 가지 요인을 추정할 수 있었다. 그것은 머릿속에 있는 지식들의 상호작용과 암기의 힘이다. 


 일단, 머릿속에 들어온 지식들은 서로 상호작용한다. 이 점은 문장과 글을 곱씹어 외우는 과정에서 확연하게 알 수 있었다. 따라서 단순한 지식들도 흡수하면 머릿속에서 서로 상호작용하면서 하나의 체계를 구축한다고 말할 수 있다. 하지만 이런 상호작용을 과대평가할 수는 없다. 경험에 따르면 머릿속의 지식들이 상호작용하여 체계를 구축하는데 상당한 시간이 걸린다. 또, 모든 지식들이 상호작용하여 체계를 구축하지도 않는다. 사례를 들면, 문득 깨닫는 경험들이 머릿속에서 지식들이 저절로 상호작용하여 체계를 구축하는 경험인데, 인위적인 노력을 하지 않을 경우 보통 2년의 시간이 걸린다. 그리고 문득 깨닫는 경험은 1년에 2~3번 있을까 말까하니 극히 일부의 지식과 정보만 체계화된다고 봐야 할 것이다. 지식이나 정보가 중복되거나 서로 모순될 경우 잘 기억되지 않거나 기억된 내용이 왜곡되는 등 상호작용이 바로 일어나지만 서로 연관이 없는 파편화된 단순 지식들이 상호작용하여 하나의 체계를 형성하는 경우는 많지 않아 보인다.


 그래서 그 다음으로 파악한 원인은 암기의 힘이다. 무엇을 암기의 힘이라고 하는가? 암기를 하다보면 굳이 외우지 않은 것들이 자연스레 기억이 되는 경험을 한다. 가령, 장황한 근거를 제시하고 추론 과정을 거쳐서 컴퓨터가 TV와 같은 바보상자라고 논증하는 글을 생각해보자. 글을 열심히 읽고 글의 결론에 동의하며 “컴퓨터는 TV와 같이 사람들을 바보로 만든다.” 라는 문장 하나만 외운다. 그러면 신기하게도 이 문장만 되새겨도 글에서 제시한 근거와 논리들이 상당히 선명하게 머릿속에 떠오른다. 즉, 본인이 직접 읽고 요약하여 필요한 내용들을 암기하면 요약하지 않은 다양한 맥락들이 머릿속에서 생생하게 살아있게 된다. 암기한 문장이나 지식이 마치 키워드처럼 작동하여 암기하지 않은 수많은 내용과 맥락들을 떠올릴 수 있게 해준다. 


 추정하면, LaTeX 공부에서 벌어진 일이 이런 일이었다. 단순한 내용들만 간단간단하게 외웠지만 이러한 내용들을 암기하면서 그 주위의 맥락을 전부 흡수한 것이다. 덕분에 머릿속은 LaTeX 수식 작성에 필요한 단순한 명령어와 파일, 환경들을 엮어서 나만의 총체적인 수식 작성 요령을 만들어냈다. 


 글이나 문장을 곱씹어 외우려고 했던 이유가 단순한 지식들과 그 지식들이 엮이어 만드는 다양한 맥락, 함의 등을 명시적으로 표현하고 전부 흡수하기 위함이었다. 그런데 LaTeX 공부를 하면서 단순 지식을 외우는 것만으로 이러한 맥락이 저절로 흡수된다는 점을 깨달았다. 깨달은 순간부터 곱씹어 외우기가 지나치게 시간과 노력을 잡아먹는 사치스러운 공부로 보이기 시작했다.

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 단축키 만들기


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

 

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

 

명령 라인에서 범위 지정 명령하기 개요


vim에서는 특정한 범위를 지정하여 해당 부분에만 명령을 적용할 수 있다. 이에 따라 다양한 범위지정 방식을 갖고 있는데 이러한 범위 지정 방식과 명령어들을 결합하여 효과적인 명령을 내릴 수 있다. 앞서 배운 비주얼 모드, 비주얼 라인 모드, 비주얼 블록 모드도 일종의 범위 지정에 해당하지만 지금부터 공부할 것은 명령 라인에 명령어를 입력할 때 필요한 범위를 지정하는 것이다


명령 라인에 범위를 정하여 명령어를 입력하는 형식은 다음과 같다


:[시작하는 행],[끝마치는 행][명령어]


[시작하는 행]시작하는 행의 행수이고, [끝마치는 행]끝마치는 행의 행수이며 쉽표(,)로 구분한다. 가령, 20,30 은 문서에서 20행에서 30행까지 명령어를 적용하라는 뜻이다.

만일, [시작하는 행],[끝마치는 행] 형식이 아니고 그냥 행수 하나만 있을 경우 해당 행에만 명령어를 적용하라는 뜻이다. 다음의 사례들을 보자.

 

:10d 10번 행 삭제

:20y 20번 행 복사

:1,9d 1번행에서 9번행까지 삭제


범위 지정에 쓰이는 특수기호를 이용하면 좀 더 편하게 범위를 지정할 수 있다. 다음은 범위 지정에 쓰이는 특수 기호들이다. 


(.) 현재 행을 의미

달러($) 마지막 행을 의미

+# 현재 위치에서 #만큼 아래 행을 의미

-# 현재 위치에서 #만큼 위의 행을 의미

퍼센트(%) 현재 편집중인 문서(파일) 전체(1,$)


다음은 특수 기호를 이용하여 범위를 지정한 사례들이다.


:%y → 문서 전체 복사

:1,$d → 문서 전체 삭제

:.,+10y → 현재 행에서 다음 아래 10까지 복사

:-2,+3d → 위의 2에서 아래 3까지 삭제


Anki 파일


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



+ Recent posts