본문으로 건너뛰기

"에디터" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

Claude Code 외부 에디터

· 약 5분

터미널에서 긴 프롬프트는 힘들다

Claude Code를 쓰다 보면 몇 줄 넘는 프롬프트를 치고 싶을 때가 종종 있어요. 들여쓰기가 있거나, 코드를 붙이거나, 한글 IME 상태에서 복잡한 편집이 필요한 순간이에요. 터미널의 한 줄 편집기는 이런 상황에 약해요.

이럴 때 Claude Code 프롬프트를 외부 에디터로 열어서 쓸 수 있습니다. 방법 자체는 간단한데, 운용하다 보면 사소한 함정이 하나 있어 같이 정리합니다.

$EDITORCtrl+X Ctrl+E를 쓰는 기본 방법

Claude Code는 프롬프트 입력 중 Ctrl+X 뒤이어 Ctrl+E 를 누르면 $EDITOR 환경변수에 지정된 에디터를 띄웁니다. 내부적으로는 claude-prompt-<uuid>.md 같은 임시 파일을 만들고 그걸 에디터에 넘깁니다. 편집 후 저장하고 닫으면 그 내용이 그대로 프롬프트에 입력됩니다.

가장 단순한 세팅:

# ~/.zshrc
export EDITOR='nvim'

이러면 Ctrl+X Ctrl+E로 nvim이 뜨고, :wq로 닫으면 내용이 Claude Code 프롬프트로 들어옵니다.

참고로 최근 Claude Code 버전은 Ctrl+G도 같은 동작으로 바인딩돼 있습니다. 둘 다 테스트해 보고 손에 맞는 것을 쓰면 됩니다.

전역 EDITOR는 nvim, Claude만 Cursor로

그런데 EDITOR 환경변수는 git, crontab, less 등 여러 곳에서 참조합니다. 저는 이걸 nvim으로 둔 상태가 편해서 바꾸고 싶지 않아요. Claude Code 프롬프트만 GUI 에디터(Cursor, VSCode)로 띄우고 싶을 때는 함수로 감싸서 EDITOR를 이 프로세스 범위에서만 오버라이드하면 됩니다.

~/.zshrc에 들어 있는 것은 이것입니다.

cc() {
# VSCode 쓸 때
# EDITOR="code -w" command claude "$@"

# Cursor 쓸 때
EDITOR="/Applications/Cursor.app/Contents/Resources/app/bin/cursor -w" command claude "$@"
}

중요한 점은 두 가지입니다.

  • command claude: alias나 동명 함수가 걸려 있어도 실제 claude 바이너리를 실행하도록 우회합니다.
  • -w 플래그: Cursor/VSCode는 기본적으로 연 뒤 바로 셸로 제어를 반환합니다. -w(또는 --wait)를 붙여야 에디터 창이 닫힐 때까지 대기합니다. 없으면 Claude Code가 빈 파일을 바로 읽어 갑니다.

이제 터미널에서 cc만 실행하면 Claude Code가 뜨고, 프롬프트 편집 시 Cursor로 열립니다. 다른 툴들은 EDITOR=nvim을 그대로 봅니다.

실제 동작

1. 프롬프트에서 Ctrl+X Ctrl+E

Claude Code 프롬프트에서 Ctrl+X Ctrl+E 입력

2. Cursor에 임시 파일이 열립니다

Cursor에 claude-prompt 임시 파일이 열린 모습

파일명은 claude-prompt-<uuid>.md 형식입니다. 마크다운이라 코드 블록이나 리스트도 편하게 쓸 수 있습니다.

3. 저장하고 닫으면 프롬프트로 들어옵니다

여기서 한 가지 이상한 게 생겼습니다.

![복귀 후 프롬프트에 ^[[O^[I 이상 문자가 끼어든 상태

프롬프트 앞부분의 기존 텍스트와 Cursor에서 쓴 내용 사이에 ^[[O^[[I^[[O^[[I^[[O가 끼어 있습니다. 정체가 무엇일까요?

^[[O, ^[[I의 정체

이 문자들은 Focus Reporting에서 나옵니다.

터미널에는 포커스 리포팅(Focus Reporting) 이라는 기능이 있습니다. ANSI/xterm 스펙의 DEC Private Mode 1004. 이게 켜져 있으면 터미널 창의 포커스가 들어오고 나갈 때 아래 두 이스케이프 시퀀스가 터미널에 주입됩니다.

이벤트시퀀스
포커스 들어옴 (focus-in)ESC [ I (표기상 ^[[I)
포커스 나감 (focus-out)ESC [ O (표기상 ^[[O)

이걸 왜 쓰느냐면, vim/tmux 같은 TUI 앱이 유휴 상태일 때 렌더링을 멈추거나 커서 스타일을 바꾸기 위해 필요합니다. 터미널이 보내주는 이 이벤트로 현재 창이 활성인지 아닌지를 알 수 있습니다.

문제는 이 지점입니다.

  1. Claude Code가 Cursor를 띄웁니다. 이 순간 터미널 포커스가 제 터미널에서 Cursor 윈도우로 이동하고, 터미널이 ^[[O (focus-out)을 내보냅니다.
  2. Cursor에서 저장/종료하면 포커스가 다시 터미널로 돌아옵니다. ^[[I (focus-in)이 내보내집니다.
  3. 창 전환을 두세 번 하다 보면 여러 번의 in/out이 생깁니다.
  4. 이 이스케이프 시퀀스들은 stdin 버퍼에 쌓입니다. Claude Code가 에디터 종료 후 다시 입력 읽기를 시작할 때, 앞서 쌓인 것들을 프롬프트 텍스트로 흡수합니다.

정리하면 Cursor/VSCode 같은 별도 윈도우 GUI 에디터를 띄울 때만 이 현상이 생깁니다. 터미널에서 포커스가 실제로 왔다갔다 하기 때문입니다.

해결 방법

1순위: nvim / vim / helix / micro

같은 터미널 세션 안에서 도는 TUI 에디터는 포커스가 창 단위로 움직이지 않습니다. 창은 하나, 안에서 그냥 화면이 바뀔 뿐입니다. focus-in/out 이벤트 자체가 생기지 않습니다.

export EDITOR='nvim'

제 경험상 이게 제일 안정적이에요. nvim이 충분히 좋은 마크다운 편집기이기도 하고요.

2순위: 그래도 Cursor/VSCode를 쓰고 싶다면

몇 가지 부분 해결책이 있지만 완벽한 건 없습니다.

  • 복귀 후 섞인 ^[[ 시퀀스를 backspace로 수동 제거한 뒤 Enter를 누릅니다.
  • 터미널 앱 설정에서 focus reporting을 비활성화합니다(Ghostty, iTerm2 등에 옵션이 있습니다). 단 vim/tmux 쪽 기능도 같이 잃습니다.
  • Cursor/VSCode를 쓰되 cc 함수 내에서 임시로 focus reporting을 꺼 주는 래퍼를 끼웁니다. 번거로운 방법입니다.

깔끔한 길은 첫 번째예요. 긴 프롬프트 편집에 IDE급 기능이 꼭 필요한 게 아니라면 TUI 에디터 쪽이 나아요.

요약

  • Claude Code 프롬프트는 Ctrl+X Ctrl+E (또는 Ctrl+G)로 $EDITOR를 호출합니다.
  • 전역 EDITOR를 건드리지 않고 싶다면 cc() 함수 패턴으로 Claude에 한정해 오버라이드합니다. -w 플래그를 꼭 붙여야 합니다.
  • Cursor/VSCode를 쓰면 포커스 리포팅 시퀀스가 프롬프트에 섞이는 부작용이 있습니다.
  • 제일 안정적인 조합은 TUI 에디터(nvim 등) + EDITOR=nvim입니다.

참고 링크

Neovim 중급 활용

· 약 4분

이 글은 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처럼 쓰기

참고 자료

Neovim 입문

· 약 4분

이 글은 Neovim 시리즈의 첫 번째 글이에요.

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

Neovim이란?

Neovim은 Vim의 모던 포크(fork)입니다. Vim의 철학(모달 편집, 키보드 중심)을 유지하면서 내부를 현대적으로 재구성했습니다.

Vim과 뭐가 다른가?

VimNeovim
설정 언어VimScriptLua (VimScript도 지원)
비동기 처리제한적내장
내장 LSP없음있음
내장 터미널기본적완전한 터미널 에뮬레이터
플러그인 생태계성숙빠르게 성장 중
설정 파일~/.vimrc~/.config/nvim/init.lua

한 줄로 요약하면 Vim의 편집 철학 + 현대적인 확장성입니다.

설치

macOS

brew install neovim

Rocky Linux / CentOS

# EPEL에서 설치
dnf install -y epel-release
dnf install -y neovim

Ubuntu / Debian

apt install -y neovim

설치 확인:

nvim --version

4가지 모드

Neovim(Vim)이 다른 에디터와 결정적으로 다른 점은 모드가 있다는 것입니다.

Normal 모드

Neovim을 열면 이 모드입니다. 글을 쓰는 게 아니라 글을 조작하는 모드입니다.

  • 커서 이동, 삭제, 복사, 붙여넣기 등
  • 다른 모드에서 Esc를 누르면 항상 Normal로 돌아옵니다

Insert 모드

실제로 글을 타이핑하는 모드입니다.

동작
i커서 앞에 입력
a커서 뒤에 입력
I줄 맨 앞에 입력
A줄 맨 뒤에 입력
o아래에 새 줄 만들고 입력
O위에 새 줄 만들고 입력

Visual 모드

텍스트를 선택하는 모드입니다.

동작
v문자 단위 선택
V줄 단위 선택
Ctrl-v블록(사각형) 선택

Command 모드

:를 누르면 하단에 명령줄이 나타납니다.

:w 저장
:q 종료
:wq 저장 후 종료
:q! 저장하지 않고 종료

커서 이동

Normal 모드에서의 이동이 Vim의 핵심입니다. 처음에는 어색하지만 손에 익으면 마우스보다 빠릅니다.

기본 이동

k
h l
j
방향
h← 왼쪽
j↓ 아래
k↑ 위
l→ 오른쪽

: j의 아래쪽 꼬리를 생각하면 기억하기 쉽습니다.

단어 단위 이동

동작
w다음 단어 시작
b이전 단어 시작
e단어 끝

줄 이동

동작
0줄 맨 앞
$줄 맨 끝
^줄의 첫 글자 (공백 제외)

화면/파일 이동

동작
gg파일 맨 위
G파일 맨 아래
Ctrl-d반 페이지 아래
Ctrl-u반 페이지 위
{숫자}G해당 줄로 이동 (예: 42G)

기본 편집

삭제

동작
x커서 위 문자 삭제
dd줄 삭제
dw단어 삭제
d$ 또는 D커서부터 줄 끝까지 삭제

복사 & 붙여넣기

동작
yy줄 복사 (yank)
yw단어 복사
p커서 뒤에 붙여넣기
P커서 앞에 붙여넣기

실행 취소 & 다시 실행

동작
u실행 취소 (Undo)
Ctrl-r다시 실행 (Redo)

검색과 치환

검색

/검색어 아래 방향으로 검색
?검색어 위 방향으로 검색
n 다음 결과
N 이전 결과

치환

:s/old/new/ 현재 줄에서 첫 번째만
:s/old/new/g 현재 줄에서 모두
:%s/old/new/g 파일 전체에서 모두
:%s/old/new/gc 파일 전체, 하나씩 확인하며

파일 열기

# 터미널에서
nvim filename.txt

# Neovim 안에서
:e filename.txt
:e . 현재 디렉토리 탐색

숫자 + 명령 조합

Vim의 강력한 문법: 숫자 + 동작으로 반복할 수 있습니다.

5j 5줄 아래로
3dd 3줄 삭제
4w 4단어 앞으로
10G 10번째 줄로
2yy 2줄 복사

vimtutor로 연습하기

Neovim에는 대화형 튜토리얼이 내장되어 있습니다.

nvim +Tutor

30분 정도 따라 하면 기본 조작이 손에 익습니다. 처음 Neovim을 설치했다면 반드시 한 번은 해보세요.

다음 글

기본 조작이 익숙해졌다면 텍스트 오브젝트, 매크로, 레지스터 등 생산성을 끌어올리는 기능을 알아봐요.

Neovim 중급: 생산성을 높이는 기능들

참고 자료