1. zsh-vi-mode 란?
- Zsh에서 Vim의 Normal / Insert 모드 개념을 그대로 사용할 수 있게 해주는 플러그인
- 기본 vi keymap(
bindkey -v) 대비 다음과 같은 장점이 있음- 모드 전환을 명확히 인지 가능
- 커서 스타일 변경 지원
- 히스토리 탐색 및 기타
ZLE기능과의 충돌 최소화
ZLE: zsh line editor
zsh에서 사용자가 입력하는 명령줄을
편집/이동/완성/히스토리 탐색할 수 있도록 하는
내장 라인 편집기 서브시스템
기본적으로 Emacs 키맵을 지원하는데, vim 에 익숙한 유저에겐 바꾸는게 낫다.
2025.04.09 - [utils] - [ipython] Shortcut (단축키) - readline editors
[ipython] Shortcut (단축키) - readline editors
ipython 셀은 readline 을 채택해서, 기본 키 바인딩은 emacs 기준임:개인적으론 vi 키바인딩을 선호하지만,대부분의 기본 키 바인딩은 emacs인 경우가 많음기본 shortcuts우선 기본 shortcut은 다음과 같음:Fu
ds31x.tistory.com
2. 설치 방법
2.1 Homebrew (macOS / Linuxbrew)
brew install zsh-vi-mode
설치 후 ~/.zshrc 에 다음을 추가.
source $(brew --prefix)/opt/zsh-vi-mode/share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
어디에 추가할 지는 다음을 참고:
Homebrew source 방식은
source $ZSH/oh-my-zsh.sh 이후,
그리고 p10k(프롬프트) 이전에 두는 것이 정답
...
...
source $ZSH/oh-my-zsh.sh
# ---- zsh-vi-mode (Homebrew) ----
source $(brew --prefix)/opt/zsh-vi-mode/share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
# ---- prompt (p10k) ----
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
다음을 통해 변경된 설정 반영:
source ~/.zshrc
2.2 oh-my-zsh 플러그인 방식
cd ~/.oh-my-zsh/custom/plugins
git clone https://github.com/jeffreytse/zsh-vi-mode
다음으로 해도 됨:
git clone https://github.com/jeffreytse/zsh-vi-mode \
$ZSH_CUSTOM/plugins/zsh-vi-mode
$ZSH_CUSTOM환경변수를 사용함.- backslash 는 line continuation임
이후 ~/.zshrc에 다음을 추가:
plugins=(
...
zsh-vi-mode
)
...는 기존 plugins를 의미함.
다음을 통해 변경된 설정을 반영:
source ~/.zshrc
3. 기본 사용법 (모드 개념)
zsh-vi-mode 는 Vim과 동일하게 Insert 와 Normal 모드를 사용.
vim의 사용법과 거의 동일함
보다 자세한 건 다음을 참고:
Insert Mode
- 일반적인 shell 입력 상태
- 텍스트 입력 중심
- 이 모드에선 Emacs의 단축키들도 먹힘.
Normal Mode
- 커서 이동, 편집 명령 수행
- Vim 스타일 조작
| 키 | 동작 |
i |
Insert 모드 |
Esc |
Normal 모드 |
4. Vim 스타일 편집 요약
Normal Mode 기준:
| 명령 | 의미 |
0 |
줄 맨 앞으로 이동 |
$ |
줄 끝으로 이동 |
w, b |
단어 단위 이동 |
dd |
현재 명령줄 삭제 |
yy |
현재 명령줄 복사 |
복잡한 명령어를 수정하거나 반복 작업을 할 때 효과가 큼:
5. 모드 상태 인식과 커서 스타일 변경
zsh-vi-mode 의 핵심 장점 중 하나는 현재 모드를 시각적으로 확실히 표시할 수 있다는 점 임.
- 커서 모양 전환이 가능함.

5.1 커서 스타일 전환 활성화
다음 설정을 ~/.zshrc 에 추가다.
ZVM_CURSOR_STYLE_ENABLED=true
plugins설정 위에 놓을 것.
이 옵션을 켜면 zsh-vi-mode 가 모드 전환 시 커서 변경을 직접 제어 함.
5.2 ANSI Escape Sequence 기반 커서 지정
문자열 이름 대신 ANSI cursor shape sequence 를 직접 지정하는 것을 권함.
# Normal mode: block cursor
ZVM_NORMAL_MODE_CURSOR=$'\e[1 q'
# Insert mode: beam cursor
ZVM_INSERT_MODE_CURSOR=$'\e[5 q'
의미는 다음과 같음.
| 값 | 커서 형태 |
\e[1 q |
Block cursor (Normal mode) |
\e[5 q |
Beam cursor (Insert mode) |
이 방식의 장점:
- 터미널 종류에 덜 의존적
- Vim / Neovim 의 커서 스타일과 자연스럽게 일치
- iTerm2, Windows Terminal, kitty 등 대부분의 현대 터미널에서 정상 동작함.
5.3 프롬프트 모드 표시 (선택이나 권장)
커서 외에도 프롬프트에 모드를 표시할 수 있음.
ZVM_PROMPT_INDICATOR=true
6. 기본 zsh vi 모드와의 차이
플러그인을 쓰지 않고 기본 vi 모드를 쓰려면 다음으로 가능함:
(ZLE에 내장된 vi 스타일 keymap을 활성화하라는 의미)
bindkey -v
하지만 이 방식은 다음과 같은 제한점이 있음:
- 모드 시각화가 거의 없음
- 커서 변경 불가
- 일부 키 조합에서 예기치 않은 동작
7. 주의사항 및 관련 설정 예
- oh-my-zsh 사용 시, 다른 키 바인딩 플러그인보다 뒤에서 로드하는 것을 추천
sudo플러그인 과 같이 사용하기 어려움.- 터미널 자체 설정에서 cursor style 을 강제하는 옵션이 있다면 충돌 가능
- macOS에서는 iTerm2 / Terminal.app 모두 ANSI cursor sequence 지원
다음은 관련 설정 부분 (.zshrc에서)
# ---- zsh-vi-mode ----
ZVM_CURSOR_STYLE_ENABLED=true
# ZVM_INSERT_MODE_CURSOR=beam
# ZVM_NORMAL_MODE_CURSOR=block
# 문자열 대신 ANSI cursor shape sequence 사용
ZVM_NORMAL_MODE_CURSOR=$'\e[1 q' # block cursor
ZVM_INSERT_MODE_CURSOR=$'\e[5 q' # beam cursor
ZVM_PROMPT_INDICATOR=true
plugins=(
git
# sudo
colored-man-pages
zsh-vi-mode
)
같이 보면 좋은 자료
[zsh] install Zsh and oh-my-zsh:
Zsh 란?Zsh는 1990년에 출시된 유닉스 셸 및 명령어 인터프리터:bash, ksh, tcsh 등 다른 셸의 가장 유용한 기능들을 통합하고 풍부한 테마와 플러그인 생태계를 통해 강력한 사용자 경험을 제공.특히
ds31x.tistory.com
'Linux' 카테고리의 다른 글
| nvim에서 다른 app과 clipboard 같이 쓰기 (Linux의 xclip이용). (0) | 2026.01.09 |
|---|---|
| Linux 커널 관점에서 이해하는 Session, Process Group, Process, Thread와 Job Control의 실제 동작 (0) | 2026.01.09 |
| WSL 배포판(distro) 백업 및 복원하기: export, import (1) | 2026.01.05 |
| WSL (WSL2 포함) 정리 (0) | 2026.01.05 |
| WSL 을 winget으로 설치 및 제거하기 (1) | 2026.01.05 |