우분투 터미널 vim 설정: vim-tiny에서 .vimrc 적용까지 직접 확인한 순서

이 글의 핵심

우분투 최소 설치에서 vi를 열었더니 구문 강조가 안 되는 이유는 vim-tiny가 syntax 기능 없이 빌드되어 있기 때문입니다. 컨테이너에서 패키지별 기능을 확인하고, .vimrc의 설정값이 실제로 읽히는지 헤드리스로 검증했습니다.

우분투 서버나 컨테이너에서 vi를 열면 구문 강조가 없는 경험을 한 번쯤 한다. 원인은 vi가 가리키는 프로그램이 일반 vim이 아니라 축소판이기 때문이다. 이 글은 Ubuntu 24.04 컨테이너(aarch64)에서 직접 실행해 확인한 내용만 적는다. Vim 버전은 모두 9.1이었다.

vi가 가리키는 프로그램

vim-tiny만 설치한 상태에서 확인했다.

  • /usr/bin/vi는 /etc/alternatives/vi로 이어지고, 최종 대상은 /usr/bin/vim.tiny였다.
  • vi --version에서 -syntax, -clipboard, -python3이 보였다.

이어서 apt install vim을 한 뒤에는 같은 vi가 /usr/bin/vim.basic을 가리켰고 +syntax, +python3이 되었다. -clipboard는 그대로였다. 기본 이미지에는 vi 자체가 없었고, 어떤 패키지를 넣느냐에 따라 달라진다.

상태vi의 실체syntaxclipboardpython3
vim-tiny만vim.tiny---
vim 설치 후vim.basic+-+

시스템 클립보드를 vim에서 바로 쓰려면 클립보드를 지원하는 빌드를 설치해야 한다. 이 글에서는 그 빌드가 +clipboard인지까지 확인하지 못했으므로, 설치 후 vim --version | grep clipboard로 직접 확인하길 권한다.

최소 .vimrc

터미널에서 일하는 데 필요한 최소 설정이다.

set number
set expandtab tabstop=4 shiftwidth=4
set ignorecase smartcase
set hlsearch incsearch
set mouse=a
syntax on
  • expandtab과 tabstop=4, shiftwidth=4: 탭 키가 공백 4칸으로 들어간다.
  • ignorecase와 smartcase: 소문자로만 검색하면 대소문자를 무시하고, 대문자가 섞이면 구분한다.
  • hlsearch, incsearch: 검색어를 입력하는 도중에 결과를 강조한다.
  • mouse=a: 터미널에서 마우스 선택과 스크롤을 vim이 처리한다.

설정이 실제로 읽히는지 확인하기

.vimrc를 쓰고도 적용이 안 되는 경우가 있어서, 화면을 띄우지 않고 값을 읽어 보는 방법을 썼다.

vim -es -u ~/.vimrc +"redir! > /tmp/o.txt | silent set number? expandtab? tabstop? ignorecase? smartcase? mouse? | redir END" +q
cat /tmp/o.txt

위 .vimrc로 실행한 결과는 number expandtab tabstop=4 ignorecase smartcase mouse=a였다. 설정값이 그대로 읽힌다는 뜻이다. 반대로 -u NONE(설정 파일 없음)으로 같은 질의를 하면 nonumber nohlsearch mouse= compatible이 나왔다. 이때 compatible이 켜져 있는 것은 -u NONE이 vi 호환 모드로 시작하기 때문이라, 설정이 없는 상태의 기본값을 보려면 이 옵션을 쓰지 말고 실제 환경에서 확인해야 한다.

탭이 정말 공백으로 바뀌는지도 확인했다. 탭 한 글자와 x가 든 파일에 :retab을 적용하자 파일이 6바이트(공백 4개, x, 줄바꿈)가 되었다.

플러그인 없이 쓸 수 있는 설정 두 가지

같은 컨테이너(Ubuntu 24.04, Vim 9.1)에서 .vimrc에 아래를 넣고 헤드리스(vim -es)로 동작을 확인했다.

set undofile undodir=/tmp/vimundo   " 파일을 닫아도 되돌리기 기록을 남긴다
set path+=**                        " :find가 하위 디렉터리까지 찾는다
set wildmenu                        " 명령 줄 탭 완성 목록을 보여 준다
set autoindent
  • undofile: 파일에 one을 쓰고 두 번 수정·저장한 뒤 undodir을 보니 %tmp%t.txt라는 파일이 생겼다. 원래 파일의 전체 경로에서 /가 %로 바뀐 이름이다. undodir로 지정한 디렉터리가 없으면 만들어 두어야 한다. 이 확인에서는 디렉터리를 먼저 만들었다. 저장 뒤에 다시 열어 u로 되돌리는 동작까지는 이 확인에서 해 보지 않았다.
  • path+=** 와 :find: /w/src/a/main.cpp, /w/src/b/util.cpp가 있는 디렉터리에서 /w를 작업 디렉터리로 두고 :find util.cpp를 실행하니 src/b/util.cpp가 열렸다. 파일 탐색기 플러그인 없이 이름만 알면 열 수 있다.

색상 테마는 /usr/share/vim/vim91/colors에 27개가 들어 있었고 blue, darkblue, default, delek, desert 등이 보였다. :colorscheme desert처럼 바꾼다. 배경이 밝은 터미널과 어두운 터미널에서 읽기 편한 테마가 다르므로 직접 몇 개 바꿔 보고 정하면 된다.

헤드리스로 확인한 자주 쓰는 편집 명령

설정이 아니라 편집 기능도 같은 방식(vim -es -u NONE +"명령" +"w! 결과" +q 파일)으로 실행해 결과를 확인했다. 원본은 네 줄짜리 f.txt다.

apple 3
banana 10
cherry 2
banana 7
명령하는 일결과
:%s/banana/BANANA/g파일 전체에서 치환두 banana 줄이 BANANA 10, BANANA 7로 바뀜
:g/cherry/d패턴이 있는 줄 모두 삭제cherry 2 줄만 사라짐
:sort /\a\+ / n첫 단어를 건너뛰고 숫자로 정렬cherry 2, apple 3, banana 7, banana 10 순서
:%normal A;모든 줄에 A;(줄 끝에 ; 추가)를 실행모든 줄 끝에 ;가 붙음
:set sw=4 et 후 :2,3>2~3줄을 공백 4칸 들여쓰기2~3번째 줄만 공백 4칸이 앞에 붙음(cat -A로 확인)
:%s/\(\a\+\) \(\d\+\)/\2 \1/캡처 그룹으로 순서 바꾸기3 apple, 10 banana, 2 cherry, 7 banana
:cq변경을 저장하지 않고 오류 코드로 종료종료 코드 1
  • 숫자 정렬(sort n)은 줄 맨 앞이 숫자가 아니면 의도와 다르게 동작한다. 위 예에서 /\a\+ /로 앞의 단어를 건너뛰고 뒤의 숫자만 기준으로 삼았다. banana 7이 banana 10보다 앞에 온 것이 문자열 정렬이 아니라 숫자 정렬이라는 증거다.
  • :g와 :normal을 조합하면 반복 작업을 스크립트처럼 쓴다. 예를 들어 :g/TODO/normal A (확인 필요)는 TODO가 든 줄 모두에 문구를 붙인다. 이 조합 자체는 이 글에서 따로 실행하지 않았고 위 두 명령을 각각 확인했다.
  • :cq의 종료 코드는 git commit이 에디터로 vim을 열었을 때 커밋 메시지 작성을 취소하는 용도로 알려져 있다. 이 글에서 git과 연결해 시험하지는 않았다. 일반 종료(:q)는 종료 코드 0이다.

시작이 느릴 때

vim -u NONE --startuptime /tmp/st.txt -es +q로 시작 시간 로그를 남길 수 있다. 설정을 읽지 않고 헤드리스로 실행한 이 컨테이너에서 마지막 줄은 000.223 000.000: editing files in windows였다. 이 값을 .vimrc가 있는 상태(-u ~/.vimrc)와 비교하면 설정 때문에 시작이 느려진 구간을 찾을 수 있다. 이 글에서는 .vimrc 포함 시간을 비교하지 않았다.

자주 쓰는 확인 명령

  • :set number?처럼 옵션 뒤에 ?를 붙이면 현재 값이 나온다.
  • :verbose set tabstop?은 그 값을 어느 파일이 마지막으로 정했는지 알려 준다.
  • vim --version | grep -E "syntax|clipboard"로 빌드 기능을 확인한다.

이 글에서 확인하지 못한 것

  • 클립보드를 지원하는 빌드의 동작
  • 플러그인 관리자와 LSP 연동
  • 데스크톱 우분투의 기본 /etc/vim/vimrc 내용

더 넓은 사용법(모드, 이동, 치환, 분할 화면)은 Vi/Vim 가이드에 있다.


같이 보면 좋은 글