Um plugin de modo vi (vim) melhor e amigável para ZSH.
ZSH
para Agnosticismo. Talvez você tenha experimentado o modo Vi padrão no Zsh, depois de ativar o modo Vi padrão, você gradualmente descobriu que ele tinha muitos problemas, alguns recursos não eram perfeitos ou inexistentes e alguns comportamentos até eram diferentes do Vi nativo (Vim ) modo.
Embora o modo Vi padrão fosse um pouco embaraçoso e desagradável, você continuou a usá-lo e gradualmente perdeu o interesse nele depois de usá-lo por um período de tempo. Eventualmente, você desistiu, desapontado.
Você nunca pensa no modo Vi por muito tempo, um dia você acidentalmente descobriu esse plugin, você leu aqui e percebeu que esse plugin é para resolver os problemas acima e fazer você se apaixonar pelo modo Vi novamente. Um sorriso apareceu de repente em seu rosto, como se você estivesse recuperando uma vida boa.
Se o inverno chegar, a primavera pode estar muito atrasada?
10p
e 4fa
( em andamento ).ZSH: >= 5.1.0
Agrupe zsh-vi-mode
em seu .zshrc
antigen bundle jeffreytse/zsh-vi-mode
Carregue zsh-vi-mode
como um plugin em seu .zshrc
zplug " jeffreytse/zsh-vi-mode "
Inclua o comando load em seu .zshrc
zgen load jeffreytse/zsh-vi-mode
Inclua o comando load em seu .zshrc
zinit ice depth=1
zinit light jeffreytse/zsh-vi-mode
Nota: o uso de depth=1
gelo é opcional, outros tipos de gelo não são recomendados nem suportados oficialmente por este plugin.
Clone zsh-vi-mode
em seu repositório de plug-ins personalizados
git clone https://github.com/jeffreytse/zsh-vi-mode
$ZSH_CUSTOM /plugins/zsh-vi-mode
Em seguida, carregue como um plugin no seu .zshrc
plugins+=(zsh-vi-mode)
Lembre-se de que os plug-ins precisam ser adicionados antes da origem oh-my-zsh.sh
.
Adicione zsh-vi-mode
ao seu arquivo de plugins (por exemplo, ~/.zsh_plugins.txt
)
jeffreytse/zsh-vi-mode
Carregue zsh-vi-mode
como um plugin em seu .zshrc
plug " jeffreytse/zsh-vi-mode "
Carregue zsh-vi-mode
como um plugin em seu .zimrc
zmodule jeffreytse/zsh-vi-mode
Para usuários do Homebrew, você pode instalá-lo através do seguinte comando
brew install zsh-vi-mode
Em seguida, coloque-o em seu .zshrc
(ou .bashrc
)
source $( brew --prefix ) /opt/zsh-vi-mode/share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Para usuários do Arch Linux, você pode instalá-lo através do seguinte comando
yay -S zsh-vi-mode
ou a atualização mais recente (instável)
yay -S zsh-vi-mode-git
Em seguida, coloque-o em seu .zshrc
(ou .bashrc
)
source /usr/share/zsh/plugins/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Para usuários do Nix, a partir de e7e3480530b34a9fe8cb52963ec2cf66e6707e15 você pode obter o plugin através da seguinte configuração
programs = {
zsh = {
interactiveShellInit = ''
source ${ pkgs . zsh-vi-mode } /share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
'' ;
} ;
} ;
Ou se preferir 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
'' ;
} ;
} ;
} ;
Você também pode usar o recurso "plugin" integrado do 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 adiciona aplicativos, atalhos e preenchimento automático ao seu terminal existente.
Instale zsh-vi-mode
com apenas um clique.
Disponível em sobreposição dm9pZCAq
eselect repository enable dm9pZCAq
emerge --sync dm9pZCAq
emerge app-shells/zsh-vi-mode
Em seguida, coloque-o em seu .zshrc
(ou .bashrc
)
source /usr/share/zsh/site-contrib/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Clone este repositório em algum lugar ( $HOME/.zsh-vi-mode
por exemplo)
git clone https://github.com/jeffreytse/zsh-vi-mode.git $HOME /.zsh-vi-mode
Em seguida, coloque-o em seu .zshrc
(ou .bashrc
)
source $HOME /.zsh-vi-mode/zsh-vi-mode.plugin.zsh
Use ESC
ou CTRL-[
para entrar Normal mode
.
Mas algumas pessoas podem gostar da chave de escape personalizada, como jj
, jk
e assim por diante. Se quiser personalizar a chave de escape, você pode aprender mais aqui.
ctrl-p
: comando anterior no históricoctrl-n
: Próximo comando no histórico/
: Pesquisa para trás no históricon
: Repete o último /
Normal mode
é indicado com o cursor de estilo de bloco e Insert mode
com o cursor de estilo de feixe por padrão.
No Normal mode
você pode usar vv
para editar a linha de comando atual em um editor (por exemplo, vi
/ vim
/ nvim
...), porque está vinculado ao Visual mode
.
Você pode alterar o editor pela opção ZVM_VI_EDITOR
, por padrão é $EDITOR
.
$
: Até o fim da linha^
: Para o primeiro caractere não vazio da linha0
: Para o primeiro caractere da linhaw
: [contar] palavras adianteW
: [contar] PALAVRAS para frentee
: Encaminhar para o final da palavra [contagem] inclusiveE
: Avançar para o final do WORD [contagem] inclusiveb
: [contar] palavras para trásB
: [contar] PALAVRAS para trást{char}
: Até antes da [contagem]'ésima ocorrência de {char} à direitaT{char}
: Até antes da [contagem]'ésima ocorrência de {char} à esquerdaf{char}
: Para [contar]'ésima ocorrência de {char} à direitaF{char}
: Para [contar]a ocorrência de {char} à esquerda;
: Repita os últimos tempos f, t, F ou T [contagem],
: Repita o último f, t, F ou T na direção oposta i
: Insere texto antes do cursorI
: Insere texto antes do primeiro caractere da linhaa
: Anexar texto após o cursorA
: Acrescentar texto no final da linhao
: Insira uma nova linha de comando abaixo da atualO
: Inserir nova linha de comando acima da atual Existem 2 tipos de modo de atalho de teclado para operação surround, o padrão é o modo classic
, você pode escolher o modo definindo a opção ZVM_VI_SURROUND_BINDKEY
.
classic
(verbo->s->surround)S"
: Adicione "
para seleção visualys"
: Adicione "
para seleção visualcs"'
: Altere "
para '
ds"
: Excluir "
s-prefix
(s->verbo->surround)sa"
: Adicione "
para seleção visualsd"
: Excluir "
sr"'
: Mude "
para '
Observe que as sequências de teclas devem ser pressionadas em uma sucessão bastante rápida para evitar o tempo limite. Você pode estender esse tempo limite com a opção ZVM_KEYTIMEOUT
.
vi"
: Selecione o objeto de texto entre aspasva(
: Selecione o objeto de texto incluindo os colchetesEntão você pode fazer qualquer operação para a seleção:
vi"
-> S[
ou sa[
=> "object"
-> "[object]"
va"
-> S[
ou sa[
=> "object"
-> ["object"]
di(
ou vi(
-> d
ca(
ou va(
-> c
yi(
ou vi(
-> y
No modo normal, digitar ctrl-a
aumentará para a próxima palavra-chave e digitar ctrl-x
diminuirá para a próxima palavra-chave. A palavra-chave pode estar no cursor ou à direita do cursor (na mesma linha). A palavra-chave pode ser a seguinte:
Por exemplo:
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
Você pode usar as opções abaixo para personalizar a tecla de escape que melhor corresponda ao seu sabor, como jj
ou jk
e assim por diante.
ZVM_VI_ESCAPE_BINDKEY
: A chave de escape vi em todos os modos (o padrão é ^[
=> ESC
)ZVM_VI_INSERT_ESCAPE_BINDKEY
: A chave de escape vi no modo de inserção (o padrão é $ZVM_VI_ESCAPE_BINDKEY
)ZVM_VI_VISUAL_ESCAPE_BINDKEY
: A chave de escape vi no modo visual (o padrão é $ZVM_VI_ESCAPE_BINDKEY
)ZVM_VI_OPPEND_ESCAPE_BINDKEY
: A chave de escape vi no modo pendente do operador (o padrão é $ZVM_VI_ESCAPE_BINDKEY
)Por exemplo:
# 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
Este plugin tem suporte para escolher o mecanismo readkey para leitura e processamento dos principais eventos. É fácil de fazer pela opção ZVM_READKEY_ENGINE
, atualmente os motores abaixo são suportados:
ZVM_READKEY_ENGINE_NEX
: É um mecanismo readkey melhor para substituir o ZLE (Beta).ZVM_READKEY_ENGINE_ZLE
: É o mecanismo readkey padrão do Zsh (ZLE).ZVM_READKEY_ENGINE_DEFAULT
: É o mecanismo padrão deste plugin (agora é o mecanismo NEX).O NEX é um mecanismo melhor para ler e lidar com os principais eventos do que o mecanismo ZLE do Zsh. Atualmente, o mecanismo NEX ainda está em fase beta, você pode voltar para o mecanismo ZLE do Zsh, se desejar.
Por exemplo:
# Change to Zsh's default readkey engine
ZVM_READKEY_ENGINE= $ZVM_READKEY_ENGINE_ZLE
Você pode usar a opção ZVM_KEYTIMEOUT
para ajustar o tempo limite de entrada da chave para aguardar a próxima chave, o padrão é 0.4
segundos.
A tecla Escape é um caso especial e pode ser usada de forma independente. O mecanismo NEX aguarda um período após receber o caractere de escape para determinar se ele é independente ou parte de uma sequência de escape. Enquanto espera, pressionar teclas adicionais faz com que a tecla Escape se comporte como uma meta-chave. Se nenhuma outra tecla for pressionada, isso será tratado como uma fuga autônoma.
Para o mecanismo NEX, podemos usar a opção ZVM_ESCAPE_KEYTIMEOUT
para ajustar o tempo limite de espera da chave de escape, o padrão é 0.03
segundos.
Como existem algumas opções de configuração baseadas em algumas variáveis definidas no plugin, outras não. Precisamos fornecer uma função de entrada de configuração unificada. O nome da função de entrada é armazenado em uma opção chamada ZVM_CONFIG_FUNC
e o valor padrão é zvm_config
, você pode alterar para outros para se adequar ao seu sabor.
Se esta função de configuração existir, ela será chamada automaticamente, você pode fazer algumas configurações neste aspecto antes de adquirir este plugin. Por exemplo:
function zvm_config() {
ZVM_LINE_INIT_MODE= $ZVM_MODE_INSERT
ZVM_VI_INSERT_ESCAPE_BINDKEY=jk
}
source ~ /zsh-vi-mode.zsh
Este plugin forneceu um mecanismo para executar comandos extras, e agora você tem os aspectos abaixo para executar algo:
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=()
Como o modo de inicialização padrão, este plugin irá sobrescrever as combinações de teclas anteriores, o que faz com que as combinações de teclas de outros plugins (ou seja, fzf
, zsh-autocomplete
, etc.) falhem.
Você pode resolver o problema de compatibilidade conforme abaixo:
# Append a command directly
zvm_after_init_commands+=( ' [ -f ~/.fzf.zsh ] && source ~/.fzf.zsh ' )
ou
# 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)
ou
# The plugin will auto execute this zvm_after_init function
function zvm_after_init() {
[ -f ~ /.fzf.zsh ] && source ~ /.fzf.zsh
}
ou se você estiver usando o zinit
:
# For postponing loading `fzf`
zinit ice lucid wait
zinit snippet OMZP::fzf
Por padrão, o recurso de atalhos de teclado está habilitado, todos os atalhos de teclado do modo normal
e visual
devem ser executados pelo zvm_after_lazy_keybindings_commands
. Por exemplo:
# 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
}
Este plugin possui duas funções para você definir widgets e atalhos de teclado personalizados. Em caso de problemas desnecessários, é melhor utilizá-los, principalmente quando você encontrar os principais conflitos.
Para definir um widget personalizado, você deve:
# If [your_custom_widget] were ignored, it will be the same with <your_custom_widget>
zvm_define_widget < your_custom_widget > [your_custom_function]
Para definir um atalho de teclado, você deve:
zvm_bindkey < keymap > < keys > < widget >
Por exemplo:
# 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
}
Este plugin fornece uma variável ZVM_MODE
para você recuperar o modo vi atual e mostrar melhor o indicador.
E atualmente os modos abaixo são suportados:
ZVM_MODE_NORMAL
ZVM_MODE_INSERT
ZVM_MODE_VISUAL
ZVM_MODE_VISUAL_LINE
ZVM_MODE_REPLACE
Para atualizar o indicador do modo vi, devemos adicionar nossos comandos a zvm_after_select_vi_mode_commands
. Por exemplo:
# 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
}
Este plugin oferece algumas opções para os usuários personalizarem o estilo do cursor para melhor compatibilidade do terminal.
ZVM_CURSOR_STYLE_ENABLED
(o padrão é 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 '
}
Podemos usar a opção ZVM_TERM
para definir o tipo de termo do plugin para lidar com sequências de escape de terminal, o padrão é $TERM
. Pode ser xterm-256color
, alacritty-256color
, st-256color
, etc. É importante que alguns emuladores de terminal mostrem o cursor corretamente.
Você pode usar ZVM_VI_HIGHLIGHT_BACKGROUND
, ZVM_VI_HIGHLIGHT_FOREGROUND
e ZVM_VI_HIGHLIGHT_EXTRASTYLE
para alterar os comportamentos de destaque (contornos, linha visual, etc.), o valor da cor pode ser um nome de cor ou um valor de cor hexadecimal .
Por exemplo:
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
Você pode definir o modo inicial da linha de comandos pela opção ZVM_LINE_INIT_MODE
.
Atualmente os modos abaixo são suportados:
ZVM_MODE_LAST
: Iniciando com o último modo (padrão).ZVM_MODE_INSERT
: Iniciando com modo de inserção.ZVM_MODE_NORMAL
: Iniciando no modo normal.Por exemplo:
# Always starting with insert mode for each command line
ZVM_LINE_INIT_MODE= $ZVM_MODE_INSERT
Este plugin oferece suporte ao recurso de atalhos de teclado preguiçosos e está habilitado por padrão. Para desativá-lo, você pode definir a opção ZVM_LAZY_KEYBINDINGS
como false
antes que este plugin seja carregado. Este recurso irá adiar todas as combinações de teclas do modo normal
e visual
para a primeira vez que você entrar no modo normal.
Pode melhorar muito a velocidade de inicialização, especialmente se você abrir o terminal e quiser apenas executar um comando simples.
Para evitar diversos problemas relacionados a atalhos de teclado causados pela sequência de sourcing do plugin, e também manter a mesma funcionalidade deste plugin, a inicialização deste plugin foi adiada para o início da primeira linha de comando.
No entanto, quase todos os plugins são inicializados quando o script é originado. Portanto, este plugin oferece uma opção ZVM_INIT_MODE
para alterar o modo de inicialização.
Por exemplo:
# Do the initialization when the script is sourced (i.e. Initialize instantly)
ZVM_INIT_MODE=sourcing
Problemas e solicitações pull são muito apreciados. Se você nunca contribuiu para um projeto de código aberto antes, ficarei mais do que feliz em orientá-lo sobre como criar uma solicitação pull.
Você pode começar abrindo um problema descrevendo o problema que deseja resolver e prosseguiremos a partir daí.
Este tema está licenciado sob a licença MIT © Jeffrey Tse.