본문 바로가기
목차
Linux

[zsh] zsh-vi-mode 설치 및 사용법

by ds31x 2026. 1. 6.
728x90
반응형

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 의 핵심 장점 중 하나는 현재 모드를 시각적으로 확실히 표시할 수 있다는 점 임.

  • 커서 모양 전환이 가능함.

normal 모드임.

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
)

같이 보면 좋은 자료

https://ds31x.tistory.com/94#zsh%EC%97%90%EC%84%9C-%EC%9E%90%EC%A3%BC-%EC%82%AC%EC%9A%A9%EB%90%98%EB%8A%94-plug-in-%EC%84%A4%EC%B9%98

 

[zsh] install Zsh and oh-my-zsh:

Zsh 란?Zsh는 1990년에 출시된 유닉스 셸 및 명령어 인터프리터:bash, ksh, tcsh 등 다른 셸의 가장 유용한 기능들을 통합하고 풍부한 테마와 플러그인 생태계를 통해 강력한 사용자 경험을 제공.특히

ds31x.tistory.com

 

728x90