터미널 커서 스타일 적용 계층

#WezTerm#terminal#cursor-style#IME#zsh-vi-mode
• • •

TL;DR: 터미널 커서 스타일은 터미널 에뮬레이터 기본값, 쉘 플러그인, 응용프로그램(예: Neovim), 운영체제 IME 렌더링 등 여러 계층이 중첩되어 적용되며, 최종 표시는 가장 낮은 수준의 렌더링 계층(주로 IME)에 의해 결정될 수 있어 문제 진단이 복잡하다.

터미널에서 커서 모양(block, underline, bar)을 제어하는 설정은 단일 지점이 아니라 여러 소프트웨어 계층이 경합하는 영역이다. WezTerm 설정 파일(default_cursor_style)은 터미널 에뮬레이터의 기본값을 정의하지만, 이는 쉘이나 텍스트 편집기가 자신의 모드에 따라 DECSCUSR 시퀀스를 통해 커서를 덮어쓸 경우 무시된다.

실제 문제 진단 시 고려해야 할 주요 계층과 그 우선순위(높은 계층이 낮은 계층을 덮어씀)는 다음과 같다:

  1. 운영체제 IME 렌더링 계층: macOS 등에서 한글/일본어 등 조합형 입력 시, 문자 확정 전의 "preedit" 상태를 표시하는 방식. 이 계층은 터미널 에뮬레이터나 응용프로그램의 커서 설정과 독립적으로 동작할 수 있다. WezTerm 문서에 따르면 macOS에서는 IME preedit를 WezTerm이 직접 렌더링하며, ime_preedit_rendering = "System" 설정도 현재 효과가 없다고 명시되어 있다. 따라서 IME 조합 중에 보이는 커서(예: block 형태)는 상위 계층 설정으로 변경하기 어려운 경우가 많다.
  2. 응용프로그램 계층 (예: Neovim): Neovim은 guicursor 옵션을 통해 내부 편집 모드(normal, insert, replace 등)별로 커서 스타일을 터미널에 지시한다. 예를 들어 vim.opt.guicursor = "n-v-c:block,i-ci-ve:hor20" 설정은 normal 모드에선 block, insert 모드에선 underline을 보여준다. 이 지시는 터미널 기본값보다 우선하지만, IME 렌더링에는 영향을 주지 못할 수 있다.
  3. 쉘/플러그인 계층 (예: zsh-vi-mode): zsh-vi-mode와 같은 쉘 플러그인은 쉘의 명령줄 편집 모드(insert/normal)에 따라 커서 스타일을 변경한다. 예를 들어 ZVM_INSERT_MODE_CURSOR=$ZVM_CURSOR_UNDERLINE 설정으로 insert 모드 커서를 underline로 고정할 수 있다. 이는 터미널 기본값을 덮어쓰지만, Neovim 실행 중에는 Neovim의 guicursor에 다시 덮어쓰인다.
  4. 터미널 에뮬레이터 기본값 계층: WezTerm의 config.default_cursor_style과 같은 설정. 위의 모든 계층이 커서를 변경하지 않을 때 적용되는 최후의 기본값이다.

이러한 계층 구조를 이해하면, "설정을 바꿔도 커서가 변하지 않는다"는 문제를 체계적으로 진단할 수 있다. 먼저 문제가 발생하는 정확한 컨텍스트(쉘 프롬프트인지, Neovim 내부인지, IME 조합 중인지)를 확인한 후, 해당 컨텍스트를 제어하는 계층의 설정을 조정해야 한다. WezTerm에서 한글 입력 시 IME 조합 중 block 커서가 보이는 문제는, Neovim의 guicursor가 insert 모드를 underline로 설정해도 IME 렌더링 계층이 독립적으로 동작하기 때문에 완전히 해결하기 어려울 수 있다. 이 경우 현실적인 접근법은 IME 조합이 아닌 일반 입력 상태(확정 후)의 체감 불편을 줄이기 위해 상위 계층(Neovim, zsh-vi-mode)의 insert 모드 커서를 underline이나 bar로 통일하는 것이다.

관련 항목

  • DECSCUSR (터미널 커서 스타일 제어 시퀀스)
  • 터미널 에뮬레이터의 IME 처리 방식
  • Neovim guicursor 옵션
  • zsh-vi-mode 커서 스타일 설정

참고자료

Open questions

  • macOS 이외의 플랫폼(Linux, Windows)에서 WezTerm의 IME preedit 렌더링과 커서 스타일 상호작용은 어떻게 다른가?
  • IME preedit 표시를 block이 아닌 다른 형태(underline, bar)로 렌더링할 수 있는 터미널 에뮬레이터나 시스템 수준의 설정이 존재하는가?
published 9 days ago · last updated 9 days ago