해당 포스팅은 William E. Shotts, Jr.의 오픈소스 저서 The Linux Command Line(링크)를 번역한 내용입니다
미국에는 뉴욕에 온 방문자가 지나가는 행인에게 유명한 클래식 음악 공연장인 카네기 홀로 가는 길을 묻는 상황에 관한 농담이 있습니다:
방문자: 실례합니다. 카네기 홀에 어떻게 가나요?
행인: 연습, 또 연습하세요!
리눅스 커맨드 라인을 배우는 것은 성공적인 피아니스트가 되는 것처럼 하루아침에 이루어지는 것이 아닙니다. 수년간의 연습이 필요한 일이죠. 이번 장에서는 $\texttt{vi}$ ("vee eye"라고 발음) 텍스트 에디터를 소개하겠습니다. 이 에디터는 전통적으로 유닉스의 핵심적인 프로그램들 중 하나입니다. $\texttt{vi}$는 난해한 사용자 인터페이스로 악명이 높은데, 만약 전문가가 키보드로 $\texttt{vi}$를 "연주"하는 것은 굉장한 예술을 보는 것 같은 기분을 느끼게 될 것입니다. 이 장을 공부한다고 전문가가 되지는 않겠지만, "젓가락 행진곡" 정도는 칠 수 있게 될 것입니다.
왜 $\texttt{vi}$를 배워야 할까?
그래픽 기반 에디터와 $\texttt{nano}$와 같은 간단한 에디터의 시대에 살고 있는데 왜 $\texttt{vi}$를 배워야 하는 걸까요? 세 가지 이유가 있습니다.
- $\texttt{vi}$는 거의 항상 사용할 수 있습니다. 원격 서버나 X 윈도우 시스템이 제대로 작동하지 않는 로컬 시스템 같이 그래픽 사용자 인터페이스가 없는 경우에도 사용할 수 있습니다. $\texttt{nano}$도 인기를 얻고 있지만 보편적인 에디터는 아닙니다. 유닉스 시스템 간의 프로그램 호환송을 위한 표준인 POSIX에 따르면 $\texttt{vi}$가 필수적으로 설치되어 있어야 합니다. 이는 유닉스 계열 시스템에 $\texttt{vi}$가 거의 항상 존재한다는 것을 의미합니다.
- $\texttt{vi}$는 가볍고 빠릅니다. 다양한 작업에서 그래픽 기반 텍스트 에디터를 메뉴에서 찾아서 열고 로딩하는 것을 기다리는 것보다 $\texttt{vi}$를 실행하는 것이 훨씬 간편합니다. 또, $\texttt{vi}$는 타이핑 속도를 위해 디자인 되어있습니다. 뒤에 설명하겠지만 숙련된 $\texttt{vi}$ 사용자는 편집하는 동안 키보드에서 손을 뗄 필요가 없게 설계되어 있습니다.
- 다른 리눅스와 유닉스 사용자에게 허접으로 보여서는 안됩니다
음, 두 가지 이유인 걸로 하죠.
약간의 배경지식
첫 번째 버전의 $\texttt{vi}$는 1976년 Bill Joy가 만들었습니다. 그는 UC 버클리 소속이었고 이후에 Sun Microsystems (Java, MySQL, Solaris 등을 개발)의 공동 창업자가 되었습니다,. $\texttt{vi}$는 단어 "visual"에서 따온 이름으로, 비디오 터미널에서 편집할 때 사용하기 위해 만들어졌습니다. 비주얼 에디터(visual editors) 이전에는 라인 에디터(line editors)가 있었습니다. 라인 에디터는 한 번에 한 줄의 텍스트만을 편집할 수 있습니다. 수정을 하고 싶은 경우 라인 에디터가 특정 줄로 이동하도록 한 뒤 텍스트를 수정할 수 있습니다. 비주얼 에디터 출현 이후로 화면을 보면서 실시간으로 텍스트를 편집할 수 있게 되었습니다. $\texttt{vi}$는 $\texttt{ex}$라는 강력한 라인 에디터를 내장하고 있어서 $\texttt{vi}$를 사용하는 동안 라인 에디터의 명령들을 사용할 수 있습니다.
대부분의 리눅스 배포판은 실제 $\texttt{vi}$를 내장하고 있지 않습니다. 대신 Bram Moolenaar가 개발한 더 향상된 대체재인 $\texttt{vim}$이 설치되어 있죠. $\texttt{vim}$은 유닉스 $\texttt{vi}$의 발전된 버전입니다. 리눅스 시스템에서는 보통 $\texttt{vim}$이 $\texttt{vi}$라는 이름으로 심볼릭 링크(또는 alias)로 연결되어 있습니다. 따라서 이후 설명에서는 $\texttt{vi}$라는 프로그램이 실제로는 $\texttt{vim}$이라고 가정하겠습니다.
$\texttt{vi}$ 실행 및 종료하기
$\texttt{vi}$를 실행하는 것은 간단합니다:
$\texttt{vi}$가 실행되면 아래와 같음 화면을 보실 수 있습니다:
$\texttt{nano}$에서 했던 것처럼, 우리가 먼저 배워야할 것은 나가는 방법입니다. $\texttt{vi}$에서 나가기 위해서 아래 커맨드를 입력하세요(콜론도 커맨드의 일부입니다):
쉘 프롬프트가 돌아온 것을 볼 수 있습니다. 만약 모종의 이유로 $\texttt{vi}$가 종료되지 않으면(주로 파일을 수정한 뒤 저장하지 않은 경우), 느낌표를 추가하여 $\texttt{vi}$에게 정말로 종료하고 싶다는 것을 알릴 수 있습니다.
Tip: $\texttt{vi}$에서 헤메고 있다면 $\texttt{Esc}$ 키를 두 번 눌러 $\texttt{vi}$의 커맨드 모드로 돌아올 수 있습니다.
호환성 모드
위 예제 시작화면에서 "Running in vi compatible mode"라는 텍스트를 볼 수 있습니다. 이는 $\texttt{vim}$이 향상된 $\texttt{vim}$의 동작 방식보다는 $\texttt{vi}$에 가깝게 동작한다는 것을 의미합니다. 이 장의 목적을 위해 $\texttt{vim}$의 향상된 동작 방식으로 실행해야 합니다. 이를 위해서 몇 가지 다른 방식을 사용할 수 있습니다. $\texttt{vi}$ 대신 $\texttt{vim}$을 입력하여 실행해보세요. $\texttt{vim}$이 잘 작동되면 $\texttt{.bashrc}$ 파일에 $\texttt{alias vi="vim"}$을 추가해도 됩니다. 또 다른 방법은 아래 명령을 입력하여 $\texttt{vim}$ 설정 파일에 한 줄을 추가하는 것입니다:
$\texttt{echo "set nocp" >> ~/.vimrc}$
리눅스 배포판들은 저마다 $\texttt{vim}$을 패키징하는 방식이 다릅니다. 어떤 배포판들은 한정된 기능만이 포함된 미니멀 버전의 $\texttt{vim}$을 설치합니다. 뒤에 나올 내용들을 따라가면서 기능들이 빠져있는 경우가 있을 수 있습니다. 이런 경우에는 정식 버전의 $\texttt{vim}$을 설치해주세요.
편집 모드
$\texttt{vi}$를 다시 시작해보겠습니다. 이번에는 존재하지 않는 파일의 이름을 넣어보겠습니다. 이렇게하면 $\texttt{vi}$를 이용해서 새로운 파일을 생성할 수 있습니다:
잘 작동했다면 아래와 같은 화면을 볼 수 있습니다:
앞에 나오는 틸데 기호(~)는 해당 행에 텍스트가 없다는 것을 알려주기 위해 있습니다. 즉, 비어있는 파일임을 확인할 수 있습니다. 아직 아무것도 입력하지 마세요!
$\texttt{vi}$에 대해 배워야 할 두 번째로 중요한 것은 $\texttt{vi}$가 모드 에디터(modal editor)라는 것입니다. $\texttt{vi}$가 실행되면 명령 모드(command mode)로 시작됩니다. 이모드에서는 거의 모든 키가 명령으로 동작하며, 이 상태에서 타이핑을 시작하면 $\texttt{vi}$가 이상한 행동을 하며 엉망진창이 되어버릴 것입니다.
입력 모드에 진입하기
파일에 텍스트를 추가하기 위해서는 먼저 입력 모드(insert mode)에 들어가야 합니다. $\texttt{i}$를 누르면 입력 모드에 들어갈 수 있습니다. $\texttt{vim}$이 향상된 버전이라면 아래와 같이 입력 모드라는 것을 확인시켜주는 문구를 확인할 수 있습니다($\texttt{vi}$ 호환 모드에서는 나타나지 않습니다):
이제 텍스트를 입력할 수 있습니다. 아래 내용을 작성해보세요:
입력 모드에서 나가 명령 모드로 돌아가려면 $\texttt{Esc}$ 키를 누르세요.
저장하기
파일을 수정한 내용을 저장하려면 명령 모드에서 ex 명령(ex command)를 입력해야 합니다. 명령 모드에서 $\texttt{:}$ 키를 누르세요. $\texttt{:}$를 누른 뒤에는 화면 하단에 콜론 기호를 볼 수 있을 것입니다.
수정된 파일을 쓰기 위해서 콜론 뒤에 $\texttt{w}$를 추가한 뒤 $\texttt{Enter}$를 누르세요:
파일이 하드 드라이브에 쓰였고 화면 하단에서 아래와 같은 확인 메시지를 확인할 수 있을 것입니다:
Tip: $\texttt{vim}$ 문서를 읽다보면 명령 모드가 일반 모드(normal mode)로, $\texttt{ex}$ 명령들이 명령 모드(command mode)로 설명된 것을 볼 수 있을 것입니다. 주의 하세요.
커서 움직이기
$\texttt{vi}$의 명령 모드에서는 커서 이동과 관련한 다양한 단축키를 사용할 수 있습니다. 일부는 $\texttt{less}$ 프로그램과 공유되기도 합니다. Table 12-1에서 일부 단축키 목록을 확인할 수 있습니다.
Table 12-1: 커서 이동 키
단축키 | 커서를... |
$\texttt{l}$ 혹은 오른쪽 화살표 | 우측으로 한 칸 이동 |
$\texttt{h}$ 혹은 왼쪽 화살표 | 좌측으로 한 칸 이동 |
$\texttt{j}$ 혹은 아래 화살표 | 한 줄 아래로 이동 |
$\texttt{k}$ 혹은 위쪽 화살표 | 한 줄 위로 이동 |
$\texttt{0}$ | 현재 줄의 맨 앞으로 이동 |
$\texttt{^}$ | 현재 줄의 공백이 아닌 첫 번째 문자로 이동 |
$\texttt{\$}$ | 현재 줄의 마지막으로 이동 |
$\texttt{w}$ | 다음 단어의 맨 앞 글자나 구두점으로 이동 |
$\texttt{W}$ | 다음 단어의 맨 앞 글자로 이동 (구두점 무시) |
$\texttt{b}$ | 이전 단어의 맨 앞 글자나 구두점으로 이동 |
$\texttt{B}$ | 이전 단어의 맨 앞 글자로 이동 (구두점 무시) |
$\texttt{Ctrl-f}$ 혹은 $\texttt{Page Down}$ | 한 페이지 아래로 이동 |
$\texttt{Ctrl-b}$ 혹은 $\texttt{Page Up}$ | 한 페이지 위로 이동 |
숫자 + $\texttt{G}$ | 숫자 번째 줄로 이동. 예를 들어 $\texttt{1G}$를 입력하면 파일의 첫 번째 줄로 이동 |
$\texttt{G}$ | 파일의 맨 마지막 줄로 이동 |
왜 $\texttt{h}$, $\texttt{j}$, $\texttt{k}$, $\texttt{l}$ 키가 커서 이동에 사용되는 걸까요? $\texttt{vi}$가 처음 작성되었을 때 모든 비디오 터미널들이 화살표 키가 있었던 것은 아니었고 숙력된 사용자는 키보드에서 손을 떼지 않고 빠르게 커서를 움직일 수 있습니다.
$\texttt{vi}$에서 사용되는 많은 단축키들은 위에서 본 "G" 처럼 숫자를 앞에 붙여 사용할 수 있습니다. 단축키 앞에 숫자를 붙여 해당 명령이 몇 번 실행될 지 명시할 수 있습니다. 예를 들어 "5j"를 입력하면 $\texttt{vi}$는 커서를 다섯 줄 아래로 옮깁니다.
'리눅스 > Part 2 - Configuration and Environment' 카테고리의 다른 글
리눅스 기초 | 11-2. 환경 (0) | 2024.06.05 |
---|---|
리눅스 기초 | 11-1. 환경 (0) | 2024.06.04 |