이 글은 Neovim 시리즈의 두 번째 글이다.

  1. Neovim 입문: Vim을 넘어서는 첫걸음
  2. Neovim 중급: 생산성을 높이는 기능들 ← 현재 글
  3. Neovim 고급: 플러그인과 LSP로 IDE처럼 쓰기
  4. 나의 Neovim 설정 전체 공개

텍스트 오브젝트

Vim의 진짜 힘은 동사 + 대상 조합이다. 텍스트 오브젝트는 “대상"에 해당한다.

문법

{동사}{범위}{대상}
  • 동사: d(삭제), c(변경), y(복사), v(선택)
  • 범위: i(inner, 안쪽), a(around, 바깥 포함)
  • 대상: w(단어), ", ', ), }, ], t(태그) 등

실전 예시

커서가 단어 중간에 있을 때:

명령동작
ciw단어를 지우고 입력 모드 (Change Inner Word)
diw단어 삭제
yiw단어 복사

따옴표 안에 커서가 있을 때:

명령동작
ci"따옴표 안의 내용을 지우고 입력
di"따옴표 안의 내용 삭제
da"따옴표까지 포함해서 삭제

괄호 안에 커서가 있을 때:

명령동작
ci(괄호 안 내용을 변경
da{중괄호를 포함해서 삭제
vi[대괄호 안 내용을 선택

i vs a의 차이

print("hello world")

커서가 hello 위에 있을 때:

  • di"print("") (따옴표 안 내용만 삭제)
  • da"print() (따옴표까지 삭제)

텍스트 오브젝트를 익히면 편집 속도가 비약적으로 올라간다.

버퍼, 윈도우, 탭

버퍼

파일을 열면 버퍼에 로드된다. 여러 파일을 동시에 열어둘 수 있다.

:e file1.lua        파일 열기 ( 버퍼)
:ls                 열린 버퍼 목록
:bn                 다음 버퍼
:bp                 이전 버퍼
:bd                 버퍼 닫기
:b {숫자}           해당 번호 버퍼로 이동

윈도우 (분할)

화면을 분할해서 여러 버퍼를 동시에 볼 수 있다.

:split              가로 분할 (또는 Ctrl-w s)
:vsplit             세로 분할 (또는 Ctrl-w v)
Ctrl-w h/j/k/l      분할   이동
Ctrl-w =            분할  크기 균등화
:close              현재  닫기

여러 윈도우 레이아웃을 탭으로 관리할 수 있다.

:tabnew              
:tabn               다음  (또는 gt)
:tabp               이전  (또는 gT)
:tabclose            닫기

실무 팁: 버퍼 + 윈도우 분할을 주로 쓰고, 탭은 맥락이 완전히 다른 작업을 분리할 때 쓰면 좋다.

매크로

반복 작업을 녹화해서 재생하는 기능이다.

기본 사용법

  1. q{레지스터} — 녹화 시작 (예: qa)
  2. 원하는 작업 수행
  3. q — 녹화 중지
  4. @{레지스터} — 재생 (예: @a)
  5. @@ — 마지막 매크로 재생
  6. {숫자}@a — N번 반복 재생

실전 예시

모든 줄 끝에 세미콜론을 추가하고 싶다면:

qa          q 레지스터에 녹화 시작
A;          줄 끝에 ; 추가
Esc         Normal 모드로
j           다음 줄로
q           녹화 중지
99@a        99번 반복

레지스터

Vim의 복사/붙여넣기는 레지스터라는 저장소를 사용한다. 클립보드가 여러 개 있는 것과 같다.

주요 레지스터

레지스터설명
""기본 레지스터 (마지막 yank/delete)
"0yank 전용 레지스터
"+시스템 클립보드
"a ~ "z이름 지정 레지스터
"_블랙홀 레지스터 (버리기)

사용법

"ay        a 레지스터에 복사
"ap        a 레지스터에서 붙여넣기
"+y        시스템 클립보드에 복사
"+p        시스템 클립보드에서 붙여넣기
"_dd       줄을 삭제하되 레지스터에 저장하지 않음

레지스터 확인: :reg

: dd로 줄을 지우면 기본 레지스터가 덮어씌워진다. 복사한 내용을 유지하려면 "0p(yank 레지스터)를 쓰거나, 삭제 시 "_dd(블랙홀)를 쓰면 된다.

Marks

특정 위치를 북마크해두고 바로 이동할 수 있다.

ma          현재 위치를 a 마크로 저장
'a          a 마크의 줄로 이동
`a          a 마크의 정확한 위치로 이동
:marks      모든 마크 목록
  • 소문자(a-z): 파일 내 마크
  • 대문자(A-Z): 파일 간 글로벌 마크

비주얼 블록 모드

Ctrl-v로 사각형 영역을 선택할 수 있다. 여러 줄을 동시에 편집할 때 유용하다.

여러 줄 앞에 텍스트 추가

1. Ctrl-v       블록 선택 시작
2. j/k로 줄 선택
3. I            줄 앞에 입력 모드
4. 텍스트 입력
5. Esc          모든 선택된 줄에 적용

여러 줄 뒤에 텍스트 추가

1. Ctrl-v       블록 선택 시작
2. j/k로 줄 선택
3. $            줄 끝까지 선택 확장
4. A            줄 뒤에 입력 모드
5. 텍스트 입력
6. Esc          적용

내장 터미널

Neovim 안에서 터미널을 열 수 있다.

:terminal           터미널 열기

터미널에서 Normal 모드로 전환: Ctrl-\ Ctrl-n

나는 내장 터미널 대신 vim-floaterm 플러그인을 사용한다. Ctrl-;로 플로팅 터미널을 토글할 수 있어서 더 편하다.

기본 설정 시작하기

Neovim 설정 파일은 ~/.config/nvim/init.lua다. 간단한 설정부터 시작하자:

-- 줄 번호 표시
vim.opt.number = true
vim.opt.relativenumber = true

-- 탭 설정 (2칸)
vim.opt.tabstop = 2
vim.opt.shiftwidth = 2
vim.opt.expandtab = true

-- 검색 설정
vim.opt.ignorecase = true
vim.opt.smartcase = true
vim.opt.incsearch = true

-- 스크롤 여유
vim.opt.scrolloff = 10

-- 마우스 지원
vim.opt.mouse:append("a")

이 정도만 설정해도 기본 Neovim보다 훨씬 쾌적해진다.


다음 글

기본기가 탄탄해졌다면, 플러그인과 LSP를 설정해서 Neovim을 IDE처럼 사용하는 방법을 알아보자.

Neovim 고급: 플러그인과 LSP로 IDE처럼 쓰기