Vi, 어렵지 않게 시작하기

2020. 1. 24. 03:47BACKEND/Linux

안녕하세요! 이 번에는 Vi 편집기를 다루는 간단한 명령어들을 알아볼까 합니다.

 

 

VI? VIM?

vi? vim? 은 무엇일까요❓ 

window나 mac에서 문서를 편집할 때, 어떤 프로그램을 쓰시나요? 

주로 word나 hwp를 사용하지 않을까 예상되네요 〰️ 

 

그런데, 우리가 사용하는 문서 편집기는 모두 GUI(Graphic User Interface)로 구성되어 있어요.

그럼, CLI(Command Line Interface) 운영체제에서는 문서편집을 어떤 것으로 할까요❓ 

눈치채셨나요? 맞아요 바로 vi(vim)입니다 〰️

 

CLI 운영체제 뿐만 아니라, window나 mac을 사용하는 유저도 이미 Vim에 익숙하신 분들은  코딩을 포함한 문서  편집을 할 때 자주 사용하시죠 ~.~ 

실제로, 몇 몇의 IDE에는 VIM 편집기 기능이 있습니다 ❗️  

 

vim은 무엇일까요? VI iMproved의 약자로 vi 편집기에서 기능들이 추가된 편집기입니다. 그래서 vim의 명령어들은 vi 명령어를 모두 포함하고 있습니다. 

 

 

자, 그럼 이제 같이 시작해보겠습니다.

일단, 시작하려면 vim 에디터가 필요합니다. mac/linux에서는 기본적으로 설치가 되어있고, window는 따로 설치해주셔야 합니다.

 

 

 

모드형 편집기  VS  비모드형 편집기

편집기에는 모드형과 비모드형이 있습니다. 이 둘의 차이는 입력 모드명령 모드가 구분되어 있는지, 구분되어 있지 않은지의 차이입니다.

 

입력 모드는 텍스트를 입력할 수 있는 상태입니다. 

명령 모드는 텍스트를 수정하거나 삭제, 복사 및 붙여넣기 등 편집하는 상태입니다.

 

✔️ 모드형 

입력모드와 명령모드가 구분되어 있으며, 같은 글자라도 입력모드인지 명령모드인지에 따라서 다르게 실행됩니다. 

예를 들어 " i " 라는 글자가 있을 때, 입력 모드에서는 텍스트인 " i " 가 출력되고, 명령 모드일 때에는 '글자 입력'이라는 편집 상태를 만들어 줍니다. 

가장 대표적으로는 지금부터 알아볼 vi 가 있습니다.

 

✔️ 비모드형

입력 모드와 명령 모드가 구분되어 있지 않습니다.

예를 들어 Ctrl이나 Alt 등과 사용하는 단축키들! 이미 여러분들 머릿 속에 있는 그 단축키를 사용하는 편집기를 말합니다.

가장 대표적으로는 워드나 한글 등이 있습니다.

 

 


동작모드

modes

그림과 같이 vi에서는 세 가지 모드로 동작합니다.  그림에 자세히 설명되어 있으므로 추가적인 설명은 생략하겠습니다.

 

 

자! 이제 Vi 에디터를 시작해볼까요?

 

$ vi [file name]

 

원하는 위치에서 위와 같은 명령어를 실행하면 [file name]의 제목을 가진 파일이 하나 생성됩니다. 이때, [file name]을 적지 않고 그냥 vi 만 사용하며 제목이 없는 파일이 하나 생성됩니다. 편집을 할 때 제목을 지정해주어야 합니다.

( 본 포스팅에서는 mac os를 사용하지만, 명령어는 다른 os와 차이가 없습니다. )

vi 편집기로 잘 들어와졌나요?

 

그럼 이제부터 vi 편집기를 사용하는 방법에 대해서 다음과 같은 순서로 알아봅시다!

 

1. vi 편집기 종료하기

2. 문서 작성하기

3. 커서 이동하기

4. 문서 편집하기

5. 내용 검색하기

6. 편집기 설정하기

 

 

첫 번째,  vi 편집기 종료하기

일단 vi 편집기에 들어왔다면 나가는 법도 알아야겠죠? 사실 위의 그림으로 나타나져있습니다.

대소문자를 구별하니 아래의 명령어를 따라할 때 주의해주세요! 

 

저장하기

:w [file name]

 

종료하기

:q, :q! ( 강제로 종료하려면 느낌표를 붙이세요 )

 

저장하고 종료하기

:wq, :wq! ( 강제로 저장・종료 ), ZZ 

 

 

두 번째,  문서 작성하기

이제 글을 작성하는 해보겠습니다. 명령어가 많으므로 한 번에 외운다기 보다는 사용할 때 참고하면서 하나씩 익숙해지는 것도 좋은 방법 같습니다!

I, i, A, a, O, o 은 입력 모드로 변경해줍니다. 이 중에 하나를 누르게 되면 키보드로 누르는 글자들이 텍스트로 쓰여지게 됩니다.

만약 위의 키를 누르지 않고 키보드를 누르게 되면 명령모드이기 때문에 다른 명령들이 실행되게 되니 주의하셔야 합니다.

 

 

 

 

세 번째, 커서 이동하기

이제 글을 작성할 때 원하는 위치로 이동해 편집하는 경우가 빈번합니다. 그래서 커서를 옮기는 단축키를 몇 개 알아두면 편리합니다.

 

가장 기본적으로 커서의 위치를 위 아래로 움직이는 단축키는 위의 그림과 같습니다. 그리고, 우리가 자주 사용하는 방향키를 사용해서 이동할 수도 있습니다. 기본적으로 위의 단축키를 외웠다면, 부가적으로 사용하기 편리한 단축키를 알아볼까요?

 

 

갑자기 복잡한 그림이 나와서 당황하셨죠😅 

하나씩 설명을 해드리자면, 

 

' H ' 는 커서의 위치를 맨 위로 이동합니다. 

' M ' 는 커서의 위치를 중간로 이동합니다. 

' L ' 는 커서의 위치를 맨 아래로 이동합니다. 

 

이 세 개는 high, middle, low 로 외우면 쉽게 외워지더라구요!

 

' 0 ', ' ^ ' 는 커서 위치의 맨 앞으로 이동합니다. 흔히 정규식을 사용할 때 '^'는 맨 앞을 의미하는데, 연관지으니 잘외워지더라구요!

' $ ' 는 커서 위치의 맨 뒤로 이동합니다. 이 것도, 정규식에서 '$'은 맨 뒤를 의미하기 때문에 잘외워진 키 중 하나였습니다 ~

 

' - '는 커서 위치의 이 전행 맨 앞으로 이동합니다.

' + ', ' enter ' 는 커서 위치의 다음 행 맨 앞으로 이동합니다. enter는 이미 우리에게 익숙하기 때문에 외우는 데에 큰 어려움 없을 거라 생각합니다.

 

혹은, 특정 행으로 바로 이동할 수도 있습니다. 

 

'G' , ' :$ ' 을 입력하면 파일의 가장 끝으로 이동할 수 있습니다. 

' 행 번호G ', ' :행 번호 '  를 입력하면 해당 행으로 커서가 바로 이동합니다.

 

행 번호가 보이지 않아서 실습하기 어려우신가요?

마지막 쯤 알려드리겠지만 일단 명령모드( 마지막줄 모드 )에서 ' :set number '를 입력한다면 행 번호가 나타나게 됩니다!

 

이 번에는 단어 사이의 이동을 알아볼까 합니다.

설명은 그림에 자세히 해두었으니, 잘 사용하시길 바랍니다!

 

 

 

네 번째, 문서 편집하기

어느 정도 문서를 만들고, 작성하고 저장하고 마칠 수 있게 되었습니다. 👏🏻👏🏻👏🏻

이 번에는 문서를 자르고 복사하고 붙여넣는 방법에 대해서 알아봅시다.

 

 

먼저, 수정하는 방법부터 알아볼까요?

' r ' 은 한 글자만을 수정합니다.

 

' cw ' 는 현재 커서의 위치부터 현재 단어의 끝까지를 수정합니다.  

' #cw ' 만약 한 단어가 아닌 여러 단어를 수정하고 싶다면 cw 앞에 숫자를 붙이면 됩니다. 만약 위의 그림에서 '3cw'를 입력하면 'ove is forever' 가 지워지고 수정할 수 있는 입력모드로 바뀝니다.

 

' s ' 는 Esc를 입력할 때까지 수정이 됩니다.

' #s '  만약 특정 글자를 수정하고 싶다면 s앞에 숫자를 붙이면 됩니다. 만약 '5s'를 입력하게 되면 'ove i'를 다른 글자들로 채울 수 있으며 멈추고 싶다면 마찬가지로 Esc를 입력하면 됩니다.

 

' cc '를 입력하면 커서가 위치한 행을 전부 수정할 수 있습니다. 추가로 말씀드리자면 두 글자가 반복되면 '행 단위'의 명령이 되는 경우가 많습니다!

' C ' 현재 커서 위치부터 행 끝까지 수정할 수 있습니다.

 

 

다음으로 글자를 삭제하는 방법에 대해 알아보도록 합시다.

' x ' 는 한 글자만을 삭제합니다.

' #x ' 만약 여러 글자를 한 번에 지우고 싶다면 'x' 앞에 숫자를 입력하면 됩니다. 예를 들어 명령모드에서 '2x'를 입력하면 'ov'가 지워지겠죠?

 

' dw ' 는 커서의 위치부터 단어의 끝까지 지웁니다. 위 그림에서 'ove'가 지워지게 됩니다.

' #dw ' 만약 여러 단어를 한 번에 지우고 싶다면 'dw'앞에 숫자를 붙여주면 됩니다. 예를 들어 명령모드에서 '2dw'를 입력하면 'ove is'가 삭제됩니다. 

 

' dd ' 두 글자가 반복해서 나왔습니다! 행 단위의 명령일 가능성이 높다는 게 이젠 보여지시나요? 행을 전부 지워주는 명령입니다.

' D ' 현재 커서의 위치부터 행 끝까지를 삭제해 줍니다.

 

 

다음으로는 복사, 붙여넣기를 알아봅시다.

 

' yy ' 커서가 위치한 행을 복사합니다. y는 yank의 앞 글자인데 '잡아두다' 쯤으로 생각하면 될 것 같네요!

' #yy ' 여러 행을 복사하고 싶다면 'yy' 앞에 숫자를 붙입니다. 예를 들어 '3yy'면 현재 커서가 위치한 행부터 아래로 세 번째 행까지 복사합니다.

 

' p ' 커서가 위치한 다음 행에 복사됩니다.

' P ' 커서가 위치한 이전 행에 복사됩니다.

 

' dd ' 커서가 위치한 행을 잘라둡니다.

' #dd ' 잘라둘 행의 수를 지정합니다. 예를 들어 '2dd'를 입력하면 현재 커서가 위치한 행부터 아래로 두 번째 행까지를 잘라둡니다.

 

마지막 행 모드로 편집을 하는 경우도 있습니다.

 

' :#y ' 특정 행을 복사하고 싶다면, 마지막 행 모드를 사용해 보세요! 예를 들어 ':2y'는 두 번째 행을 복사합니다. 

' :<범위>y ' 여러 줄을 복사하고 싶다면 범위를 사용할 수 있습니다. 범위는 '시작 행, 마지막 행'으로 표현합니다. 몇 가지 예를 들어보겠습니다.

 

범위

1 ~ 3 행을 복사하고 싶다면 ' :1,3y '이라는 명령어를 사용할 수 있습니다. 

1 ~ 마지막 행을 복사하고 싶다면 ' :1,$y '을 사용하면 됩니다. 여기서 $  마지막 행을 나타내는 기호로 보시면 됩니다!

1 ~ 현재 행을 복사하고 싶다면 ' :1,.y '으로 표현할 수 있습니다. 여기서 .  현재 행을 나타내는 기호로 보시면 됩니다!

현재 행 ~ 이전 행을 복사하고 싶다면 ' :,-2y ' 이런 식으로 표현할 수 있습니다. 현재 행부터 위로 2번 째행까지 복사됩니다. 여기서 조금 헷갈릴 수 있는 것은 현재행이 10행이라면 8, 9, 10행이 복사되어 3개의 행이 복사됩니다.

 

' :#d ' 특정 행을 잘라내고 싶을 때 사용합니다. 예를 들어 ':2d'는 두 번째 행을 잘라냅니다.

' :<범위>d ' 여러 줄을 잘라내고 싶을 때에는 위에서 본 범위를 사용하여 잘라낼 수 있습니다.

 

 

 

네임드 버퍼 VS 언네임드 버퍼

네임드 버퍼는 단어만 해석해보면 이름이 붙여진 버퍼라는 의미입니다. 말 그대로, 이름이 붙여 사용하는 버퍼인데요. 복사하고자하는 것에 이름을 붙여두어 구별할 수 있습니다. 그렇게 되면 하나만 복사되는 것이 아니라 독립적으로 복사되어 골라 사용할 수 있게 되죠.

 

반대로 언네임드 버퍼는 위에서 사용한 "이름이 없는" 버퍼입니다. 네임드 버퍼와는 다르게 하나만 복사됩니다.

 

그럼 네임드 버퍼는 어떻게 사용할까요?

사용법은 굉장히 간단합니다! 

 

'  "(큰 따옴표)+[버퍼 이름]+yy  '로 사용합니다. 예를 들어 버퍼 이름을 a로 한다고 하면  명령모드에서 "ayy 라고 입력하면 a라는 버퍼에 현재 커서를 복사해 보관하겠다는 의미가 됩니다.

숫자를 이름으로 적어도 됩니다. 그렇다면 "1yy의 형태가 되겠죠? 

 

'  #"(큰 따옴표)+[버퍼 이름]+yy  ' 여러줄을 복사하고 싶다면 버퍼 이름을 적기 전에 얼마나 복사할지를 입력하면 됩니다. 예를 들어 2"ayy 라는 명령을 입력하면 'a라는 버퍼에 현재 커서부터 아래로 두 번째 행까지 복사해 넣겠다'라는 의미가 되는 것입니다. 

 

반대로, 붙여넣을 때에는 ' "(큰 따옴표)+[버퍼 이름]+p ' 를 사용하여 붙여넣습니다. 예를 들어 "ap 를 입력하면 a라는 버퍼에 있는 내용을 붙여넣겠다는 의미가 됩니다. 

 

 

명령을 취소하고 싶을 때에는 어떻게 할까요?

 

' u ' 명령 모드에서 u를 입력하면 명령이 취소됩니다.

' U ' 해당 행에서 한 모든 명령을 취소합니다.

' :e! ' 마지막으로 저장한 내용 이후의 것을 버리고 새로 작업합니다.

 

 

 

다섯 번째, 내용 검색하기

 

자, 여기까지 잘 따라오셨나요? 이제는 윈도우에서 ctrl+f, 맥에서 command+f 로 사용하던 검색하기를 해보겠습니다. 한 번쯤 큰 파일에서 단어를 찾을 때가 있지 않나요? vi에서도 위의 단축키처럼 간다하게 찾을 수 있습니다. 

 

' /[찾고자 하는 문자열] ' 문자열을 현재 커서부터 아래 방향로 찾습니다. 

' ?[찾고자 하는 문자열] ' 문자열을 현재 커서부터 위 방향로 찾습니다. 

 

' n ' 문자열을 아래로 다음 문자열을 검색합니다.

' N ' 문자열을 위로 다음 문자열을 검색합니다.

 

이제는 문자열을 찾고 다른 문자열로 바꾸는 명령어를 알아볼까요?

 

' s/[바꿀 문자열]/[대체 문자열] ' 커서가 위치한 곳부터 바꿀 문자열을 가장 먼저 나오는 단어 하나를 찾아  대체 문자열로 바꿔줍니다. 

' %s/[바꿀 문자열]/[대체 문자열]/g ' 커서가 위치한 곳부터 바꿀 문자열모두 찾아  대체 문자열로 바꿔줍니다. 

처음에 '%'와 마지막에 'g'가 붙었다는 사실을 잊지 마세요!

 

' <범위>s/[바꿀 문자열]/[대체 문자열] ' 범위 내에서 바꿀 문자열가장 먼저 나오는 단어 하나 찾아  대체 문자열로 바꿔줍니다. 

' <범위>s/[바꿀 문자열]/[대체 문자열]/g ' 범위 내에서 바꿀 문자열 모두 찾아  대체 문자열로 바꿔줍니다. 

' <범위>s/[바꿀 문자열]/[대체 문자열]/gc ' 범위 내에서 바꿀 문자열 모두 찾아 대체 문자열로 바꿀 지 물어봅니다.

 

 

 

여섯 번째, 편집기 설정하기

편집기를 사용하면서 설정할 수 있는 사항이 몇 가지 있습니다. 

일단, 자신의 vi 편집기에 어떤 설정이 되어있는 지 확인해볼까요?

 

' :set ' 마지막 행 모드를 사용해서 자신이 지금 사용하는 편집기에 어떤 설정이 되어있는 지 확인할 수 있습니다.

다음과 같은 설정들이 나타납니다. 더 자세한 설정들을 보고 싶다면 ' :set all '을 입력해 보세요!

 

설정으로 두 가지를 변경해 보려고 합니다.

첫 번째는 행 번호를 출력시킬 수 있게 만들어 보겠습니다. 

' :set nu ' 을 사용하면 번호가 나타납니다. 혹은 ' :se nu '를 입력해도 됩니다.

다음과 같이 행 번호가 보이게 됩니다.

 

' :set nonu '를 하게 되면 반대로 행번호가 사라집니다.

 

두 번째는 보이지 않는 특수문자를 출력시킬 수 있게 만들겠습니다. 예를 들어 문장의 끝($)이나 탭 문자(^I)와 같은 특수문자를 뜻합니다.

' :set list ' 를 사용하면 보이지 않는 특수문자를 다음과 같이 출력시킵니다.

 

' :set nolist ' 를 사용하면 다시 보이지 않게 됩니다.

 

 

지금까지 vi 편집기를 사용하는 방법을 간단히 살펴보았습니다.

어느 정도 사용할 수 있게 되셨길 바랍니다 

'BACKEND > Linux' 카테고리의 다른 글

LINUX, 사용자 사용량 관리하기  (0) 2020.09.03
LINUX, 특수 권한  (2) 2020.09.03
LINUX, 권한 관리하기  (0) 2020.08.28
정규식, 제대로 사용하기 - 심화  (4) 2020.08.16
정규식, 어렵지 않게 사용하기 - 기본  (0) 2020.07.07