ZSH를 위한 더 좋고 친숙한 vi(vim) 모드 플러그인입니다.
ZSH
플러그인. 아마도 Zsh에서 기본 Vi 모드를 경험해 본 적이 있을 것입니다. 기본 Vi 모드를 켠 후 점차적으로 문제가 많고 일부 기능이 완벽하지 않거나 존재하지 않으며 일부 동작이 기본 Vi(Vim ) 모드.
기본 Vi 모드는 다소 당황스럽고 불쾌했지만, 계속 사용하다 보니 일정 기간 사용하면서 점차 흥미를 잃게 되었습니다. 결국 실망스럽게 포기하셨습니다.
당신은 오랫동안 Vi 모드에 대해 생각하지 않았습니다. 어느 날 우연히 이 플러그인을 발견했습니다. 여기를 읽고 이 플러그인이 위의 문제를 해결하고 당신을 다시 Vi 모드에 빠지게 만들기 위한 것임을 깨달았습니다. 좋은 삶을 되찾은 듯 갑자기 얼굴에 미소가 떠올랐습니다.
겨울이 오면 봄이 훨씬 뒤쳐질 수 있을까?
10p
, 4fa
등의 명령을 반복합니다( 진행 중 ).ZSH: >= 5.1.0
.zshrc
에 zsh-vi-mode
번들로 묶으세요.
antigen bundle jeffreytse/zsh-vi-mode
.zshrc
에 zsh-vi-mode
플러그인으로 로드하세요.
zplug " jeffreytse/zsh-vi-mode "
.zshrc
에 로드 명령을 포함합니다.
zgen load jeffreytse/zsh-vi-mode
.zshrc
에 로드 명령을 포함합니다.
zinit ice depth=1
zinit light jeffreytse/zsh-vi-mode
참고: depth=1
얼음 사용은 선택 사항입니다. 다른 유형의 얼음은 권장되지 않으며 이 플러그인에서 공식적으로 지원하지도 않습니다.
zsh-vi-mode
사용자 정의 플러그인 저장소에 복제하세요
git clone https://github.com/jeffreytse/zsh-vi-mode
$ZSH_CUSTOM /plugins/zsh-vi-mode
그런 다음 .zshrc
에 플러그인으로 로드하세요.
plugins+=(zsh-vi-mode)
oh-my-zsh.sh
소스로 제공되기 전에 플러그인을 추가해야 한다는 점을 명심하세요.
플러그인 파일에 zsh-vi-mode
추가하세요(예: ~/.zsh_plugins.txt
)
jeffreytse/zsh-vi-mode
.zshrc
에 zsh-vi-mode
플러그인으로 로드하세요.
plug " jeffreytse/zsh-vi-mode "
.zimrc
에 zsh-vi-mode
플러그인으로 로드하세요.
zmodule jeffreytse/zsh-vi-mode
Homebrew 사용자의 경우 다음 명령을 통해 설치할 수 있습니다.
brew install zsh-vi-mode
그런 다음 .zshrc
(또는 .bashrc
)에서 소싱하세요.
source $( brew --prefix ) /opt/zsh-vi-mode/share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Arch Linux 사용자의 경우 다음 명령을 통해 설치할 수 있습니다.
yay -S zsh-vi-mode
또는 최신 업데이트(불안정)
yay -S zsh-vi-mode-git
그런 다음 .zshrc
(또는 .bashrc
)에서 소싱하세요.
source /usr/share/zsh/plugins/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Nix 사용자의 경우 e7e3480530b34a9fe8cb52963ec2cf66e6707e15부터 다음 구성을 통해 플러그인을 소싱할 수 있습니다.
programs = {
zsh = {
interactiveShellInit = ''
source ${ pkgs . zsh-vi-mode } /share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
'' ;
} ;
} ;
또는 home-manager
선호하는 경우:
home-manager . users . [ your username ] = { pkgs , ... } : {
programs = {
zsh = {
initExtra = ''
source ${ pkgs . zsh-vi-mode } /share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
'' ;
} ;
} ;
} ;
home-manager
에 내장된 "플러그인" 기능을 사용할 수도 있습니다.
home-manager . users . [ your username ] = { pkgs , ... } : {
programs = {
zsh = {
plugins = [
{
name = "vi-mode" ;
src = pkgs . zsh-vi-mode ;
file = "share/zsh-vi-mode/zsh-vi-mode.plugin.zsh" ;
}
] ;
} ;
} ;
} ;
Fig는 기존 터미널에 앱, 바로가기, 자동완성을 추가합니다.
한 번의 클릭으로 zsh-vi-mode
설치하세요.
dm9pZCAq 오버레이에서 사용 가능
eselect repository enable dm9pZCAq
emerge --sync dm9pZCAq
emerge app-shells/zsh-vi-mode
그런 다음 .zshrc
(또는 .bashrc
)에서 소싱하세요.
source /usr/share/zsh/site-contrib/zsh-vi-mode/zsh-vi-mode.plugin.zsh
이 저장소를 어딘가에 복제하세요(예: $HOME/.zsh-vi-mode
)
git clone https://github.com/jeffreytse/zsh-vi-mode.git $HOME /.zsh-vi-mode
그런 다음 .zshrc
(또는 .bashrc
)에서 소싱하세요.
source $HOME /.zsh-vi-mode/zsh-vi-mode.plugin.zsh
ESC
또는 CTRL-[
사용하여 Normal mode
로 들어갑니다.
그러나 일부 사람들은 jj
, jk
등과 같은 사용자 정의 이스케이프 키를 좋아할 수 있습니다. 이스케이프 키를 사용자 정의하려면 여기에서 자세한 내용을 알아볼 수 있습니다.
ctrl-p
: 기록의 이전 명령ctrl-n
: 기록의 다음 명령/
: 기록에서 뒤로 검색n
: 마지막 반복 /
Normal mode
블록 스타일 커서로 표시되고, Insert mode
빔 스타일 커서로 기본적으로 표시됩니다.
Normal mode
에서는 vv
사용하여 편집기(예: vi
/ vim
/ nvim
...)에서 현재 명령줄을 편집할 수 있습니다. 이는 Visual mode
에 바인딩되어 있기 때문입니다.
ZVM_VI_EDITOR
옵션으로 편집기를 변경할 수 있으며 기본적으로 $EDITOR
입니다.
$
: 줄 끝까지^
: 줄의 공백이 아닌 첫 번째 문자로0
: 줄의 첫 번째 문자까지w
: [계산] 단어 앞으로W
: [count] WORDS 앞으로e
: 단어 [개수]의 끝 부분까지 전달E
: WORD [개수]까지 포함하여 끝까지 전달b
: [계산] 단어 뒤로B
: [count] WORDS 뒤로t{char}
: 오른쪽으로 {char}이 [count]번째 발생하기 전까지T{char}
: 왼쪽으로 {char}이 [count]번째 발생하기 전까지f{char}
: 오른쪽으로 {char}번째 발생 횟수를 [count]합니다.F{char}
: 왼쪽으로 {char}번째 발생을 [count]합니다.;
: 최근 f, t, F 또는 T [count]회 반복,
: 최신 f, t, F 또는 T를 반대 방향으로 반복합니다. i
: 커서 앞에 텍스트 삽입I
: 줄의 첫 번째 문자 앞에 텍스트를 삽입합니다.a
: 커서 뒤에 텍스트 추가A
: 줄 끝에 텍스트를 추가합니다.o
: 현재 명령줄 아래에 새 명령줄을 삽입합니다.O
: 현재 명령줄 위에 새 명령줄을 삽입합니다. 서라운드 작동에는 2가지 종류의 키 바인딩 모드가 있으며, 기본값은 classic
모드이며, ZVM_VI_SURROUND_BINDKEY
옵션을 설정하여 모드를 선택할 수 있습니다.
classic
모드(동사->s->서라운드)S"
: 시각적 선택을 위해 "
추가합니다.ys"
: 시각적 선택을 위해 "
추가합니다.cs"'
: "
'
로 변경합니다.ds"
: 삭제 "
s-prefix
모드(s->동사->서라운드)sa"
: 시각적 선택을 위해 "
추가합니다.sd"
: 삭제 "
sr"'
: "
'
로 변경 시간 초과를 방지하려면 키 시퀀스를 매우 빠르게 연속해서 눌러야 합니다. ZVM_KEYTIMEOUT
옵션을 사용하여 이 시간 초과를 연장할 수 있습니다.
vi"
: 따옴표 안의 텍스트 개체를 선택합니다.va(
: 대괄호를 포함한 텍스트 객체를 선택합니다.그런 다음 선택 항목에 대한 모든 작업을 수행할 수 있습니다.
vi"
-> S[
또는 sa[
=> "object"
-> "[object]"
va"
-> S[
또는 sa[
=> "object"
-> ["object"]
di(
또는 vi(
-> d
ca(
또는 va(
-> c
yi(
또는 vi(
-> y
일반 모드에서 ctrl-a
입력하면 다음 키워드로 증가하고, ctrl-x
입력하면 다음 키워드로 감소합니다. 키워드는 커서 위치에 있거나 커서 오른쪽(같은 줄)에 있을 수 있습니다. 키워드는 아래와 같을 수 있습니다.
예를 들어:
9
=> 10
aa99bb
=> aa100bb
aa100bc
=> aa101bc
0xDe
=> 0xdf
0Xdf
=> 0Xe0
0b101
=> 0b110
0B11
=> 0B101
true
=> false
yes
=> no
on
=> off
T
=> F
Fri
=> Sat
Oct
=> Nov
Monday
=> Tuesday
January
=> February
+
=> -
++
=> --
==
=> !=
!==
=> ===
&&
=> ||
and
=> or
100
=> 99
aa100bb
=> aa99bb
0
=> -1
0xdE0
=> 0xDDF
0xffFf0
=> 0xfffef
0xfffF0
=> 0xFFFEF
0x0
=> 0xffffffffffffffff
0Xf
=> 0Xe
0b100
=> 0b010
0B100
=> 0B011
True
=> False
On
=> Off
Sun
=> Sat
Jan
=> Dec
Monday
=> Sunday
August
=> July
/
=> *
++
=> --
==
=> !=
!==
=> ===
||
=> &&
or
=> and
아래 옵션을 사용하여 jj
또는 jk
등과 같은 취향에 더 잘 맞는 Esc 키를 사용자 정의할 수 있습니다.
ZVM_VI_ESCAPE_BINDKEY
: 모든 모드의 vi 이스케이프 키 (기본값은 ^[
=> ESC
)ZVM_VI_INSERT_ESCAPE_BINDKEY
: 삽입 모드의 vi 이스케이프 키 (기본값은 $ZVM_VI_ESCAPE_BINDKEY
)ZVM_VI_VISUAL_ESCAPE_BINDKEY
: 시각적 모드의 vi 이스케이프 키(기본값은 $ZVM_VI_ESCAPE_BINDKEY
)ZVM_VI_OPPEND_ESCAPE_BINDKEY
: 운영자 보류 모드의 vi 이스케이프 키(기본값은 $ZVM_VI_ESCAPE_BINDKEY
)예를 들어:
# Only changing the escape key to `jk` in insert mode, we still
# keep using the default keybindings `^[` in other modes
ZVM_VI_INSERT_ESCAPE_BINDKEY=jk
이 플러그인은 주요 이벤트를 읽고 처리하기 위해 readkey 엔진을 선택하도록 지원했습니다. ZVM_READKEY_ENGINE
옵션을 사용하면 쉽게 수행할 수 있으며 현재 아래 엔진이 지원됩니다.
ZVM_READKEY_ENGINE_NEX
: ZLE(베타)를 대체하는 더 나은 읽기 키 엔진입니다.ZVM_READKEY_ENGINE_ZLE
: Zsh의 기본 읽기 키 엔진(ZLE)입니다.ZVM_READKEY_ENGINE_DEFAULT
: 이 플러그인의 기본 엔진입니다(현재는 NEX 엔진입니다).NEX는 Zsh의 ZLE 엔진보다 주요 이벤트를 읽고 처리하는 데 더 나은 엔진입니다. 현재 NEX 엔진은 아직 베타 단계이므로 원하는 경우 Zsh의 ZLE 엔진으로 다시 변경할 수 있습니다.
예를 들어:
# Change to Zsh's default readkey engine
ZVM_READKEY_ENGINE= $ZVM_READKEY_ENGINE_ZLE
ZVM_KEYTIMEOUT
옵션을 사용하여 다음 키를 기다리는 동안 키 입력 시간 제한을 조정할 수 있습니다. 기본값은 0.4
초입니다.
Esc 키는 특별한 경우이므로 독립형으로 사용할 수 있습니다. NEX 엔진은 이스케이프 문자를 수신한 후 해당 문자가 독립 실행형인지 또는 이스케이프 시퀀스의 일부인지 확인하기 위해 일정 기간 동안 기다립니다. 기다리는 동안 추가 키를 누르면 Esc 키가 메타 키처럼 작동합니다. 다른 키 누르기가 들어오지 않으면 독립 실행형 탈출로 처리됩니다.
NEX 엔진의 경우 ZVM_ESCAPE_KEYTIMEOUT
옵션을 사용하여 Esc 키의 대기 시간 제한을 조정할 수 있습니다. 기본값은 0.03
초입니다.
그러나 플러그인에 정의된 일부 변수에 의존하는 일부 구성 옵션이 있기 때문에 일부는 그렇지 않습니다. 통일된 구성 입력 기능을 제공해야 합니다. 입력 함수의 이름은 ZVM_CONFIG_FUNC
라는 옵션에 저장되며 기본값은 zvm_config
이므로 취향에 맞게 다른 이름으로 변경할 수 있습니다.
이 구성 기능이 존재하는 경우 자동으로 호출되며, 이 플러그인을 소싱하기 전에 이 측면에서 일부 구성을 수행할 수 있습니다. 예를 들어:
function zvm_config() {
ZVM_LINE_INIT_MODE= $ZVM_MODE_INSERT
ZVM_VI_INSERT_ESCAPE_BINDKEY=jk
}
source ~ /zsh-vi-mode.zsh
이 플러그인은 추가 명령을 실행하는 메커니즘을 제공했으며 이제 무언가를 실행하기 위한 다음과 같은 측면이 있습니다.
zvm_before_init_commands=()
zvm_after_init_commands=()
zvm_before_select_vi_mode_commands=()
zvm_after_select_vi_mode_commands=()
zvm_before_lazy_keybindings_commands=()
zvm_after_lazy_keybindings_commands=()
기본 초기화 모드이므로 이 플러그인은 이전 키 바인딩을 덮어쓰므로 다른 플러그인(예: fzf
, zsh-autocomplete
등)의 키 바인딩이 실패하게 됩니다.
아래와 같이 호환성 문제를 해결할 수 있습니다.
# Append a command directly
zvm_after_init_commands+=( ' [ -f ~/.fzf.zsh ] && source ~/.fzf.zsh ' )
또는
# Define an init function and append to zvm_after_init_commands
function my_init() {
[ -f ~ /.fzf.zsh ] && source ~ /.fzf.zsh
}
zvm_after_init_commands+=(my_init)
또는
# The plugin will auto execute this zvm_after_init function
function zvm_after_init() {
[ -f ~ /.fzf.zsh ] && source ~ /.fzf.zsh
}
또는 zinit
사용하는 경우:
# For postponing loading `fzf`
zinit ice lucid wait
zinit snippet OMZP::fzf
기본적으로 게으른 키 바인딩 기능이 활성화되어 있으며 normal
모드와 visual
모드의 모든 키 바인딩은 zvm_after_lazy_keybindings_commands
에 의해 실행되어야 합니다. 예를 들어:
# The plugin will auto execute this zvm_after_lazy_keybindings function
function zvm_after_lazy_keybindings() {
bindkey -M vicmd ' s ' your_normal_widget
bindkey -M visual ' n ' your_visual_widget
}
이 플러그인에는 사용자 정의 위젯과 키 바인딩을 정의할 수 있는 두 가지 기능이 있습니다. 불필요한 문제가 있는 경우, 특히 주요 충돌을 만날 때 이를 사용하는 것이 좋습니다.
사용자 정의 위젯을 정의하려면 다음을 수행해야 합니다.
# If [your_custom_widget] were ignored, it will be the same with <your_custom_widget>
zvm_define_widget < your_custom_widget > [your_custom_function]
키 바인딩을 정의하려면 다음을 수행해야 합니다.
zvm_bindkey < keymap > < keys > < widget >
예를 들어:
# Your custom widget
function my_custom_widget() {
echo ' Hello, ZSH! '
}
# The plugin will auto execute this zvm_after_lazy_keybindings function
function zvm_after_lazy_keybindings() {
# Here we define the custom widget
zvm_define_widget my_custom_widget
# In normal mode, press Ctrl-E to invoke this widget
zvm_bindkey vicmd ' ^E ' my_custom_widget
}
이 플러그인은 현재 vi 모드를 검색하고 표시기를 더 잘 표시할 수 있도록 ZVM_MODE
변수를 제공했습니다.
현재 아래 모드가 지원됩니다.
ZVM_MODE_NORMAL
ZVM_MODE_INSERT
ZVM_MODE_VISUAL
ZVM_MODE_VISUAL_LINE
ZVM_MODE_REPLACE
vi 모드 표시기를 업데이트하려면 zvm_after_select_vi_mode_commands
에 명령을 추가해야 합니다. 예를 들어:
# The plugin will auto execute this zvm_after_select_vi_mode function
function zvm_after_select_vi_mode() {
case $ZVM_MODE in
$ZVM_MODE_NORMAL )
# Something you want to do...
;;
$ZVM_MODE_INSERT )
# Something you want to do...
;;
$ZVM_MODE_VISUAL )
# Something you want to do...
;;
$ZVM_MODE_VISUAL_LINE )
# Something you want to do...
;;
$ZVM_MODE_REPLACE )
# Something you want to do...
;;
esac
}
이 플러그인은 더 나은 터미널 호환성을 위해 사용자가 커서 스타일을 사용자 정의할 수 있는 몇 가지 옵션을 제공합니다.
ZVM_CURSOR_STYLE_ENABLED
옵션으로 이 기능을 비활성화할 수 있습니다(기본값은 true
). # Disable the cursor style feature
ZVM_CURSOR_STYLE_ENABLED=false
# The prompt cursor in normal mode
ZVM_NORMAL_MODE_CURSOR
# The prompt cursor in insert mode
ZVM_INSERT_MODE_CURSOR
# The prompt cursor in visual mode
ZVM_VISUAL_MODE_CURSOR
# The prompt cursor in visual line mode
ZVM_VISUAL_LINE_MODE_CURSOR
# The prompt cursor in operator pending mode
ZVM_OPPEND_MODE_CURSOR
ZVM_CURSOR_USER_DEFAULT
ZVM_CURSOR_BLOCK
ZVM_CURSOR_UNDERLINE
ZVM_CURSOR_BEAM
ZVM_CURSOR_BLINKING_BLOCK
ZVM_CURSOR_BLINKING_UNDERLINE
ZVM_CURSOR_BLINKING_BEAM
ZVM_INSERT_MODE_CURSOR= $ZVM_CURSOR_BEAM
ZVM_NORMAL_MODE_CURSOR= $ZVM_CURSOR_BLOCK
ZVM_OPPEND_MODE_CURSOR= $ZVM_CURSOR_UNDERLINE
# The plugin will auto execute this zvm_config function
zvm_config () {
# Retrieve default cursor styles
local ncur= $( zvm_cursor_style $ZVM_NORMAL_MODE_CURSOR )
local icur= $( zvm_cursor_style $ZVM_INSERT_MODE_CURSOR )
# Append your custom color for your cursor
ZVM_INSERT_MODE_CURSOR= $icur ' ee]12;reda '
ZVM_NORMAL_MODE_CURSOR= $ncur ' ee]12;#008800a '
}
ZVM_TERM
옵션을 사용하여 플러그인이 터미널 이스케이프 시퀀스를 처리하도록 용어 유형을 설정할 수 있습니다. 기본값은 $TERM
입니다. xterm-256color
, alacritty-256color
, st-256color
등이 될 수 있습니다. 일부 터미널 에뮬레이터에서는 커서를 올바르게 표시하는 것이 중요합니다.
ZVM_VI_HIGHLIGHT_BACKGROUND
, ZVM_VI_HIGHLIGHT_FOREGROUND
및 ZVM_VI_HIGHLIGHT_EXTRASTYLE
사용하여 강조 동작(주변, 시각적 선 등)을 변경할 수 있습니다. 색상 값은 색상 이름 또는 16진수 색상 값일 수 있습니다.
예를 들어:
ZVM_VI_HIGHLIGHT_FOREGROUND=green # Color name
ZVM_VI_HIGHLIGHT_FOREGROUND= # 008800 # Hex value
ZVM_VI_HIGHLIGHT_BACKGROUND=red # Color name
ZVM_VI_HIGHLIGHT_BACKGROUND= # ff0000 # Hex value
ZVM_VI_HIGHLIGHT_EXTRASTYLE=bold,underline # bold and underline
ZVM_LINE_INIT_MODE
옵션으로 명령줄 초기 모드를 설정할 수 있습니다.
현재 다음 모드가 지원됩니다.
ZVM_MODE_LAST
: 마지막 모드부터 시작합니다(기본값).ZVM_MODE_INSERT
: 삽입 모드로 시작합니다.ZVM_MODE_NORMAL
: 일반 모드로 시작합니다.예를 들어:
# Always starting with insert mode for each command line
ZVM_LINE_INIT_MODE= $ZVM_MODE_INSERT
이 플러그인은 게으른 키 바인딩 기능을 지원하며 기본적으로 활성화되어 있습니다. 이를 비활성화하려면 이 플러그인이 로드되기 전에 ZVM_LAZY_KEYBINDINGS
옵션을 false
로 설정하면 됩니다. 이 기능은 normal
모드와 visual
모드의 모든 키 바인딩을 처음 일반 모드에 들어갈 때까지 연기합니다.
특히 터미널을 열고 간단한 명령을 실행하려는 경우 시작 속도를 크게 향상시킬 수 있습니다.
플러그인 소싱 순서로 인해 발생하는 키 바인딩과 관련된 다양한 문제를 방지하고 이 플러그인의 동일한 기능을 유지하기 위해 이 플러그인의 초기화가 첫 번째 명령줄 시작으로 연기되었습니다.
그러나 스크립트가 소스로 제공되면 거의 모든 플러그인이 초기화됩니다. 따라서 이 플러그인은 초기화 모드를 변경할 수 있는 ZVM_INIT_MODE
옵션을 제공합니다.
예를 들어:
# Do the initialization when the script is sourced (i.e. Initialize instantly)
ZVM_INIT_MODE=sourcing
이슈와 Pull Request를 보내주시면 대단히 감사하겠습니다. 이전에 오픈 소스 프로젝트에 기여한 적이 없다면 끌어오기 요청을 만드는 방법을 기꺼이 안내해 드리겠습니다.
해결하려는 문제를 설명하는 문제를 여는 것부터 시작하면 됩니다.
이 테마는 MIT 라이선스 © Jeffrey Tse에 따라 라이선스가 부여됩니다.