LabHub
배우기 러닝패스 코스

vim and tmux

vim Is a Grammar, Not a List of Commands

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

한 줄 요약

vim 의 키는 외워야 할 목록이 아니라 조합해서 쓰는 문법이다. {횟수}{동작}{범위} 라는 공식 하나를 알면 배우지 않은 조합도 만들어 쓸 수 있다.

Concept map: 문법 · 모드를 분리한 덕분에 알파벳 키 하나하나가 명령이 될 수 있었다. · 동사 + (전치사) + 명사 · 안쪽

왜 이게 필요했나

vim 을 "종료하는 법을 모르는 편집기"로 기억하는 사람이 많다. 그런데 SSH 로 들어간 서버, docker 컨테이너 안, 임베디드 장비 - GUI 가 없는 거의 모든 곳에 vi 계열이 이미 깔려 있다. 설정 파일 한 줄을 고치자고 파일을 로컬로 내려받았다 다시 올리는 일이 반복된다면, 그건 도구의 문제가 아니라 문법을 몰라서다.

vim 이 1976년 vi 에서 출발해 지금까지 살아남은 이유는 하나다. 모드를 분리한 덕분에 알파벳 키 하나하나가 명령이 될 수 있었다. 다른 편집기가 Ctrl 조합에 명령을 우겨넣는 동안, vim 은 d, y, c, w, $ 같은 한 글자짜리 어휘를 갖게 됐고, 그 어휘들이 조합되면서 표현력이 곱셈으로 늘었다.

어떻게 동작하나

핵심 공식은 이것 하나다.

{횟수}{operator}{motion 또는 text object}

품사로 읽으면 동사 + (전치사) + 명사 구조다.

조합 읽는 법 하는 일
3dd 3번 · 삭제 · 줄 세 줄 삭제
d3w 삭제 · 3단어 단어 세 개 삭제
ci" 변경 · inner · 따옴표 따옴표 안쪽만 갈아 끼우기
da( 삭제 · around · 괄호 괄호까지 통째로 삭제
yi{ 복사 · inner · 중괄호 블록 안 내용 복사

여기서 i(inner)와 a(around)가 전치사 역할을 한다. 이 두 글자를 알면 "따옴표 안 문자열만 교체", "함수 인자 전체 삭제", "태그 안 내용 선택" 같은 작업이 두 글자로 끝난다.

중요한 성질 하나 - vim 에서 삭제는 잘라내기다. dd 로 지운 줄은 레지스터에 들어가 있어 p 로 붙여넣을 수 있다. 그래서 ddp(아래 줄과 자리 바꾸기)나 yyp(줄 복제) 같은 관용구가 생긴다.

모드는 네 개만 알면 시작할 수 있다. Normal(기본, 명령), Insert(입력), Visual(선택), Command-line(: 로 시작하는 ex 명령). 방향을 잃으면 언제나 Esc 다. 초심자에게는 이게 생존 법칙 1번이다.

현장에서 만나는 모습

설정 파일에 값 하나 넣기. /etc/nginx/nginx.conf 에서 worker_connections 값을 바꾸는 일. /worker_conn 으로 찾아가 ciw 로 단어만 갈아 끼우고 :wq. 마우스도, 스크롤도 필요 없다.

들여쓰기가 깨진 YAML 정리. gg=G 는 파일 전체를 문법에 맞게 재정렬한다. 한 글자씩 스페이스를 세는 것보다 안전하다.

설정 파일은 vim 이 실제로 읽어야 의미가 있다. .vimrc 에 옵션을 적어 놓고 오타가 나면 그 줄만 조용히 무시된다. set number? 처럼 물음표를 붙여 물어보면 vim 이 지금 적용 중인 값을 알려 준다. 실습의 첫 단계가 이걸 확인하는 이유다.

. 을 잊지 말 것. 마지막 편집을 그대로 반복한다. ciw새단어<Esc> 한 뒤 다음 위치로 가서 . 하나면 같은 편집이 반복된다. 매크로를 쓰기 전에 먼저 시도해 볼 도구다.

낯선 서버에서 살아남는 최소한

자기 노트북의 vim 은 설정이 되어 있지만, 들어간 서버의 vim 은 아무것도 없거나 아예 vi 만 있을 수 있다. 그래서 설정이 없어도 되는 것들을 따로 알아 두면 어디서든 일할 수 있다.

먼저 무엇을 열고 있는지 확인한다. :f 는 지금 파일의 이름과 상태를 알려 준다. 그리고 읽기 전용으로 열 수 있으면 그렇게 연다. view 파일 이나 vim -R 파일 로 열면 실수로 고치고 저장하는 사고가 애초에 일어나지 않는다. 운영 서버에서 설정을 확인만 하려는 경우가 실은 대부분이다.

되돌리기를 믿을 수 있게 한다. u 는 되돌리고 Ctrl-r 은 다시 하는 것이다. 여러 번 되돌린 뒤 방향을 잃었다면 :e! 로 저장 이후의 변경을 전부 버리고 파일을 다시 읽을 수 있다. 저장하기 전에는 언제든 원래 파일로 돌아갈 수 있다는 것이 마음 편히 편집하게 해 준다.

저장이 안 될 때 당황하지 않는다. 권한이 없어 저장이 거부되는 상황이 흔하다. 이때 편집 내용을 버리고 다시 열 필요는 없다. 다른 이름으로 저장했다가 옮기거나, 권한을 얻어 그 자리에서 저장하는 방법이 있다. 가장 나쁜 것은 :q! 로 나가서 처음부터 다시 하는 것이다.

그리고 원본을 남기는 습관이 낯선 서버에서 특히 값지다. 설정 파일을 고치기 전에 날짜를 붙여 사본을 하나 떠 두면, 무언가 잘못됐을 때 되돌리는 데 몇 초면 된다. vim 자체에도 백업 파일을 만드는 설정이 있지만, 남의 서버에서는 그 설정이 켜져 있으리라고 기대할 수 없으므로 손으로 하는 편이 확실하다.

마지막으로 여러 사람이 같은 파일을 열면 vim 이 알려 준다. 스왑 파일이 남아 있다는 경고가 그것이고, 다른 사람이 지금 편집 중이거나 앞서 편집하던 세션이 비정상 종료된 것이다. 이 경고를 습관적으로 넘기면 남의 작업을 덮어쓰게 되므로, 누가 열고 있는지 먼저 확인하는 것이 맞다.

다음 실습에서 할 것

.vimrc 를 만들고 vim 이 그 설정을 실제로 적용하는지 확인한 뒤, 줄 삭제·복제·자리바꿈 같은 기본 편집을 결과 파일로 남긴다. 마지막 두 단계에서는 편집 명령 자체를 파일로 저장해 채점기가 원본에 다시 적용해 보게 한다. 결과뿐 아니라 절차까지 재현 가능해야 진짜 익힌 것이다.