본문 바로가기
리눅스/Part 2 - Configuration and Environment

리눅스 기초 | 12-1. vi 입문

by 객잔주인 2024. 6. 6.

해당 포스팅은 William E. Shotts, Jr.의 오픈소스 저서 The Linux Command Line(링크)를 번역한 내용입니다


미국에는 뉴욕에 온 방문자가 지나가는 행인에게 유명한 클래식 음악 공연장인 카네기 홀로 가는 길을 묻는 상황에 관한 농담이 있습니다:

 

방문자: 실례합니다. 카네기 홀에 어떻게 가나요?
행인: 연습, 또 연습하세요!

 

리눅스 커맨드 라인을 배우는 것은 성공적인 피아니스트가 되는 것처럼 하루아침에 이루어지는 것이 아닙니다. 수년간의 연습이 필요한 일이죠. 이번 장에서는 vi ("vee eye"라고 발음) 텍스트 에디터를 소개하겠습니다. 이 에디터는 전통적으로 유닉스의 핵심적인 프로그램들 중 하나입니다. vi는 난해한 사용자 인터페이스로 악명이 높은데, 만약 전문가가 키보드로 vi를 "연주"하는 것은 굉장한 예술을 보는 것 같은 기분을 느끼게 될 것입니다. 이 장을 공부한다고 전문가가 되지는 않겠지만, "젓가락 행진곡" 정도는 칠 수 있게 될 것입니다.

 

vi를 배워야 할까?

그래픽 기반 에디터와 nano와 같은 간단한 에디터의 시대에 살고 있는데 왜 vi를 배워야 하는 걸까요? 세 가지 이유가 있습니다.

  • vi는 거의 항상 사용할 수 있습니다. 원격 서버나 X 윈도우 시스템이 제대로 작동하지 않는 로컬 시스템 같이 그래픽 사용자 인터페이스가 없는 경우에도 사용할 수 있습니다. nano도 인기를 얻고 있지만 보편적인 에디터는 아닙니다. 유닉스 시스템 간의 프로그램 호환송을 위한 표준인 POSIX에 따르면 vi가 필수적으로 설치되어 있어야 합니다. 이는 유닉스 계열 시스템에 vi가 거의 항상 존재한다는 것을 의미합니다.
  • vi는 가볍고 빠릅니다. 다양한 작업에서 그래픽 기반 텍스트 에디터를 메뉴에서 찾아서 열고 로딩하는 것을 기다리는 것보다 vi를 실행하는 것이 훨씬 간편합니다. 또, vi는 타이핑 속도를 위해 디자인 되어있습니다. 뒤에 설명하겠지만 숙련된 vi 사용자는 편집하는 동안 키보드에서 손을 뗄 필요가 없게 설계되어 있습니다.
  • 다른 리눅스와 유닉스 사용자에게 허접으로 보여서는 안됩니다

음, 두 가지 이유인 걸로 하죠.

약간의 배경지식

첫 번째 버전의 vi는 1976년 Bill Joy가 만들었습니다. 그는 UC 버클리 소속이었고 이후에 Sun Microsystems (Java, MySQL, Solaris 등을 개발)의 공동 창업자가 되었습니다,. vi는 단어 "visual"에서 따온 이름으로, 비디오 터미널에서 편집할 때 사용하기 위해 만들어졌습니다. 비주얼 에디터(visual editors) 이전에는 라인 에디터(line editors)가 있었습니다. 라인 에디터는 한 번에 한 줄의 텍스트만을 편집할 수 있습니다. 수정을 하고 싶은 경우 라인 에디터가 특정 줄로 이동하도록 한 뒤 텍스트를 수정할 수 있습니다. 비주얼 에디터 출현 이후로 화면을 보면서 실시간으로 텍스트를 편집할 수 있게 되었습니다. viex라는 강력한 라인 에디터를 내장하고 있어서 vi를 사용하는 동안 라인 에디터의 명령들을 사용할 수 있습니다.

 

대부분의 리눅스 배포판은 실제 vi를 내장하고 있지 않습니다. 대신 Bram Moolenaar가 개발한 더 향상된 대체재인 vim이 설치되어 있죠. vim은 유닉스 vi의 발전된 버전입니다. 리눅스 시스템에서는 보통 vimvi라는 이름으로 심볼릭 링크(또는 alias)로 연결되어 있습니다. 따라서 이후 설명에서는 vi라는 프로그램이 실제로는 vim이라고 가정하겠습니다.

vi 실행 및 종료하기

vi를 실행하는 것은 간단합니다:

vi가 실행되면 아래와 같음 화면을 보실 수 있습니다:

nano에서 했던 것처럼, 우리가 먼저 배워야할 것은 나가는 방법입니다. vi에서 나가기 위해서 아래 커맨드를 입력하세요(콜론도 커맨드의 일부입니다):

쉘 프롬프트가 돌아온 것을 볼 수 있습니다. 만약 모종의 이유로 vi가 종료되지 않으면(주로 파일을 수정한 뒤 저장하지 않은 경우), 느낌표를 추가하여 vi에게 정말로 종료하고 싶다는 것을 알릴 수 있습니다.

Tip: vi에서 헤메고 있다면 Esc 키를 두 번 눌러 vi의 커맨드 모드로 돌아올 수 있습니다.
호환성 모드

위 예제 시작화면에서 "Running in vi compatible mode"라는 텍스트를 볼 수 있습니다. 이는 vim이 향상된 vim의 동작 방식보다는 vi에 가깝게 동작한다는 것을 의미합니다. 이 장의 목적을 위해 vim의 향상된 동작 방식으로 실행해야 합니다. 이를 위해서 몇 가지 다른 방식을 사용할 수 있습니다. vi 대신 vim을 입력하여 실행해보세요. vim이 잘 작동되면 .bashrc 파일에 alias vi="vim"을 추가해도 됩니다. 또 다른 방법은 아래 명령을 입력하여 vim 설정 파일에 한 줄을 추가하는 것입니다:

echo "set nocp" >> ~/.vimrc

리눅스 배포판들은 저마다 vim을 패키징하는 방식이 다릅니다. 어떤 배포판들은 한정된 기능만이 포함된 미니멀 버전의 vim을 설치합니다. 뒤에 나올 내용들을 따라가면서 기능들이 빠져있는 경우가 있을 수 있습니다. 이런 경우에는 정식 버전의 vim을 설치해주세요.

 

편집 모드

vi를 다시 시작해보겠습니다. 이번에는 존재하지 않는 파일의 이름을 넣어보겠습니다. 이렇게하면 vi를 이용해서 새로운 파일을 생성할 수 있습니다:

잘 작동했다면 아래와 같은 화면을 볼 수 있습니다:

앞에 나오는 틸데 기호(~)는 해당 행에 텍스트가 없다는 것을 알려주기 위해 있습니다. 즉, 비어있는 파일임을 확인할 수 있습니다. 아직 아무것도 입력하지 마세요!

 

vi에 대해 배워야 할 두 번째로 중요한 것은 vi가 모드 에디터(modal editor)라는 것입니다. vi가 실행되면 명령 모드(command mode)로 시작됩니다. 이모드에서는 거의 모든 키가 명령으로 동작하며, 이 상태에서 타이핑을 시작하면 vi가 이상한 행동을 하며 엉망진창이 되어버릴 것입니다.

입력 모드에 진입하기

파일에 텍스트를 추가하기 위해서는 먼저 입력 모드(insert mode)에 들어가야 합니다. i를 누르면 입력 모드에 들어갈 수 있습니다. vim이 향상된 버전이라면 아래와 같이 입력 모드라는 것을 확인시켜주는 문구를 확인할 수 있습니다(vi 호환 모드에서는 나타나지 않습니다):

이제 텍스트를 입력할 수 있습니다. 아래 내용을 작성해보세요:

입력 모드에서 나가 명령 모드로 돌아가려면 Esc 키를 누르세요.

저장하기

파일을 수정한 내용을 저장하려면 명령 모드에서 ex 명령(ex command)를 입력해야 합니다. 명령 모드에서 : 키를 누르세요. :를 누른 뒤에는 화면 하단에 콜론 기호를 볼 수 있을 것입니다.

수정된 파일을 쓰기 위해서 콜론 뒤에 w를 추가한 뒤 Enter를 누르세요:

파일이 하드 드라이브에 쓰였고 화면 하단에서 아래와 같은 확인 메시지를 확인할 수 있을 것입니다:

Tip: vim 문서를 읽다보면 명령 모드가 일반 모드(normal mode)로, ex 명령들이 명령 모드(command mode)로 설명된 것을 볼 수 있을 것입니다. 주의 하세요.

 

커서 움직이기

vi의 명령 모드에서는 커서 이동과 관련한 다양한 단축키를 사용할 수 있습니다. 일부는 less 프로그램과 공유되기도 합니다. Table 12-1에서 일부 단축키 목록을 확인할 수 있습니다.

 

Table 12-1: 커서 이동 키

단축키 커서를...
l 혹은 오른쪽 화살표 우측으로 한 칸 이동
h 혹은 왼쪽 화살표 좌측으로 한 칸 이동
j 혹은 아래 화살표 한 줄 아래로 이동
k 혹은 위쪽 화살표 한 줄 위로 이동
0 현재 줄의 맨 앞으로 이동
^ 현재 줄의 공백이 아닌 첫 번째 문자로 이동
$ 현재 줄의 마지막으로 이동
w 다음 단어의 맨 앞 글자나 구두점으로 이동
W 다음 단어의 맨 앞 글자로 이동 (구두점 무시)
b 이전 단어의 맨 앞 글자나 구두점으로 이동
B 이전 단어의 맨 앞 글자로 이동 (구두점 무시)
Ctrl-f 혹은 Page Down 한 페이지 아래로 이동
Ctrl-b 혹은 Page Up 한 페이지 위로 이동
숫자 + G 숫자 번째 줄로 이동. 예를 들어 1G를 입력하면 파일의 첫 번째 줄로 이동
G 파일의 맨 마지막 줄로 이동

 

h, j, k, l 키가 커서 이동에 사용되는 걸까요? vi가 처음 작성되었을 때 모든 비디오 터미널들이 화살표 키가 있었던 것은 아니었고 숙력된 사용자는 키보드에서 손을 떼지 않고 빠르게 커서를 움직일 수 있습니다. 

 

vi에서 사용되는 많은 단축키들은 위에서 본 "G" 처럼 숫자를 앞에 붙여 사용할 수 있습니다. 단축키 앞에 숫자를 붙여 해당 명령이 몇 번 실행될 지 명시할 수 있습니다. 예를 들어 "5j"를 입력하면 vi는 커서를 다섯 줄 아래로 옮깁니다.