Un complemento de modo vi(vim) mejor y más amigable para ZSH.
ZSH
para agnosticismo. Tal vez haya experimentado el modo Vi predeterminado en Zsh, después de activar el modo Vi predeterminado, gradualmente descubrió que tenía muchos problemas, algunas características no eran perfectas o inexistentes, y algunos comportamientos incluso eran diferentes del Vi nativo (Vim ) modo.
Aunque el modo Vi predeterminado era un poco vergonzoso y desagradable, seguías usándolo y gradualmente perdías el interés después de usarlo por un período de tiempo. Al final, te rendiste decepcionado.
Nunca piensas en el modo Vi durante mucho tiempo, un día descubriste accidentalmente este complemento, leíste aquí y te diste cuenta de que este complemento es para resolver los problemas anteriores y hacer que te enamores del modo Vi nuevamente. Una sonrisa apareció de repente en tu rostro como si recuperaras una buena vida.
Si llega el invierno, ¿puede quedar muy atrás la primavera?
10p
y 4fa
( en progreso ).ZSH: >= 5.1.0
Empaque zsh-vi-mode
en su .zshrc
antigen bundle jeffreytse/zsh-vi-mode
Cargue zsh-vi-mode
como complemento en su .zshrc
zplug " jeffreytse/zsh-vi-mode "
Incluya el comando de carga en su .zshrc
zgen load jeffreytse/zsh-vi-mode
Incluya el comando de carga en su .zshrc
zinit ice depth=1
zinit light jeffreytse/zsh-vi-mode
Nota: el uso de hielo depth=1
es opcional; este complemento no recomienda ni admite oficialmente otros tipos de hielo.
Clona zsh-vi-mode
en tu repositorio de complementos personalizados
git clone https://github.com/jeffreytse/zsh-vi-mode
$ZSH_CUSTOM /plugins/zsh-vi-mode
Luego cárguelo como un complemento en su .zshrc
plugins+=(zsh-vi-mode)
Tenga en cuenta que es necesario agregar complementos antes de obtener oh-my-zsh.sh
.
Agregue zsh-vi-mode
a su archivo de complementos (por ejemplo, ~/.zsh_plugins.txt
)
jeffreytse/zsh-vi-mode
Cargue zsh-vi-mode
como complemento en su .zshrc
plug " jeffreytse/zsh-vi-mode "
Cargue zsh-vi-mode
como complemento en su .zimrc
zmodule jeffreytse/zsh-vi-mode
Para usuarios de Homebrew, pueden instalarlo mediante el siguiente comando
brew install zsh-vi-mode
Luego consígalo en su .zshrc
(o .bashrc
)
source $( brew --prefix ) /opt/zsh-vi-mode/share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Para los usuarios de Arch Linux, pueden instalarlo mediante el siguiente comando
yay -S zsh-vi-mode
o la última actualización (inestable)
yay -S zsh-vi-mode-git
Luego consígalo en su .zshrc
(o .bashrc
)
source /usr/share/zsh/plugins/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Para los usuarios de Nix, a partir de e7e3480530b34a9fe8cb52963ec2cf66e6707e15 pueden obtener el complemento a través de la siguiente configuración
programs = {
zsh = {
interactiveShellInit = ''
source ${ pkgs . zsh-vi-mode } /share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
'' ;
} ;
} ;
O si lo prefieres 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
'' ;
} ;
} ;
} ;
También puede utilizar la función "complemento" incorporada de 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 agrega aplicaciones, accesos directos y autocompletar a su terminal existente.
Instale zsh-vi-mode
con un solo clic.
Disponible en superposición dm9pZCAq
eselect repository enable dm9pZCAq
emerge --sync dm9pZCAq
emerge app-shells/zsh-vi-mode
Luego consígalo en su .zshrc
(o .bashrc
)
source /usr/share/zsh/site-contrib/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Clona este repositorio en algún lugar ( $HOME/.zsh-vi-mode
por ejemplo)
git clone https://github.com/jeffreytse/zsh-vi-mode.git $HOME /.zsh-vi-mode
Luego consígalo en su .zshrc
(o .bashrc
)
source $HOME /.zsh-vi-mode/zsh-vi-mode.plugin.zsh
Utilice ESC
o CTRL-[
para ingresar Normal mode
.
Pero a algunas personas les puede gustar la tecla de escape personalizada, como jj
, jk
, etc. Si desea personalizar la tecla de escape, puede obtener más información desde aquí.
ctrl-p
: Comando anterior en el historial.ctrl-n
: siguiente comando en la historia./
: Buscar hacia atrás en el historialn
: repite el último /
Normal mode
se indica con un cursor de estilo bloque y Insert mode
con un cursor de estilo viga de forma predeterminada.
En Normal mode
puede usar vv
para editar la línea de comando actual en un editor (por ejemplo, vi
/ vim
/ nvim
...), porque está vinculado al Visual mode
.
Puede cambiar el editor mediante la opción ZVM_VI_EDITOR
, por defecto es $EDITOR
.
$
: Hasta el final de la línea^
: Al primer carácter que no esté en blanco de la línea.0
: al primer carácter de la línea.w
: [contar] palabras hacia adelanteW
: [cuenta] PALABRAS adelantee
: Avanzar hasta el final de la palabra [recuento] inclusiveE
: Avanzar hasta el final de WORD [recuento] inclusiveb
: [contar] palabras al revésB
: [cuenta] PALABRAS al revést{char}
: hasta antes de [count]'ésima aparición de {char} a la derechaT{char}
: hasta antes de [count]'ésima aparición de {char} a la izquierdaf{char}
: Hasta [contar] la aparición de {char} a la derechaF{char}
: hasta [contar] la aparición de {char} a la izquierda;
: Repetir las últimas f, t, F o T [cuenta] veces,
: Repetir la última f, t, F o T en dirección opuesta i
: Insertar texto antes del cursorI
: Insertar texto antes del primer carácter de la línea.a
: Agregar texto después del cursorA
: Agregar texto al final de la líneao
: Insertar nueva línea de comando debajo de la actualO
: Insertar nueva línea de comando encima de la actual Hay 2 tipos de modo de combinación de teclas para el funcionamiento envolvente, el modo predeterminado es el modo classic
, puede elegir el modo configurando la opción ZVM_VI_SURROUND_BINDKEY
.
classic
(verbo->s->envolvente)S"
: Añadir "
para selección visualys"
: agregue "
para la selección visualcs"'
: Cambiar "
a '
ds"
: Eliminar "
s-prefix
(s->verbo->envolvente)sa"
: Añadir "
para la selección visualsd"
: eliminar "
sr"'
: Cambiar "
a '
Tenga en cuenta que las secuencias de teclas deben presionarse en una sucesión bastante rápida para evitar un tiempo de espera. Puede ampliar este tiempo de espera con la opción ZVM_KEYTIMEOUT
.
vi"
: Selecciona el objeto de texto dentro de las comillasva(
: Selecciona el objeto de texto incluyendo los corchetesLuego puedes hacer cualquier operación para la selección:
vi"
-> S[
o sa[
=> "object"
-> "[object]"
va"
-> S[
o sa[
=> "object"
-> ["object"]
di(
o vi(
-> d
ca(
o va(
-> c
yi(
o vi(
-> y
En modo normal, escribir ctrl-a
aumentará a la siguiente palabra clave y escribir ctrl-x
disminuirá a la siguiente palabra clave. La palabra clave puede estar en el cursor o a la derecha del cursor (en la misma línea). La palabra clave podría ser la siguiente:
Por ejemplo:
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
Puede utilizar las siguientes opciones para personalizar la tecla de escape que mejor se adapte a su estilo, como jj
o jk
, etc.
ZVM_VI_ESCAPE_BINDKEY
: la tecla de escape vi en todos los modos (el valor predeterminado es ^[
=> ESC
)ZVM_VI_INSERT_ESCAPE_BINDKEY
: la clave de escape vi en modo de inserción (el valor predeterminado es $ZVM_VI_ESCAPE_BINDKEY
)ZVM_VI_VISUAL_ESCAPE_BINDKEY
: La tecla de escape vi en modo visual (el valor predeterminado es $ZVM_VI_ESCAPE_BINDKEY
)ZVM_VI_OPPEND_ESCAPE_BINDKEY
: La clave de escape vi en modo pendiente de operador (el valor predeterminado es $ZVM_VI_ESCAPE_BINDKEY
)Por ejemplo:
# 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 complemento admite la elección del motor readkey para leer y procesar los eventos clave. Es fácil de hacer con la opción ZVM_READKEY_ENGINE
; actualmente se admiten los siguientes motores:
ZVM_READKEY_ENGINE_NEX
: Es un mejor motor de lectura de claves para reemplazar ZLE (Beta).ZVM_READKEY_ENGINE_ZLE
: Es el motor de lectura de claves predeterminado de Zsh (ZLE).ZVM_READKEY_ENGINE_DEFAULT
: es el motor predeterminado de este complemento (ahora es el motor NEX).El NEX es un mejor motor para leer y manejar los eventos clave que el motor ZLE de Zsh. Actualmente, el motor NEX todavía se encuentra en la etapa beta; puede volver a cambiar al motor ZLE de Zsh si lo desea.
Por ejemplo:
# Change to Zsh's default readkey engine
ZVM_READKEY_ENGINE= $ZVM_READKEY_ENGINE_ZLE
Puede usar la opción ZVM_KEYTIMEOUT
para ajustar el tiempo de espera de entrada de clave para esperar la siguiente clave; el valor predeterminado es 0.4
segundos.
La tecla de escape es un caso especial y se puede utilizar de forma independiente. El motor NEX espera un período después de recibir el carácter de escape para determinar si es independiente o parte de una secuencia de escape. Mientras espera, al presionar teclas adicionales, la tecla Escape se comporta como una metatecla. Si no se pulsa ninguna otra tecla, se maneja como un escape independiente.
Para el motor NEX, podemos usar la opción ZVM_ESCAPE_KEYTIMEOUT
para ajustar el tiempo de espera para la tecla de escape, el valor predeterminado es 0.03
segundos.
Dado que hay algunas opciones de configuración que dependen de algunas variables definidas en el complemento, otras no. Necesitamos proporcionar una función de entrada de configuración unificada. El nombre de la función de entrada se almacena en una opción llamada ZVM_CONFIG_FUNC
y el valor predeterminado es zvm_config
, puede cambiarlo por otros que se ajusten a su gusto.
Si esta función de configuración existe, se llamará automáticamente; puede realizar algunas configuraciones en este aspecto antes de obtener este complemento. Por ejemplo:
function zvm_config() {
ZVM_LINE_INIT_MODE= $ZVM_MODE_INSERT
ZVM_VI_INSERT_ESCAPE_BINDKEY=jk
}
source ~ /zsh-vi-mode.zsh
Este complemento ha proporcionado un mecanismo para ejecutar comandos adicionales y ahora tiene los siguientes aspectos para ejecutar 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=()
Dado que el modo de inicialización predeterminado, este complemento sobrescribirá las combinaciones de teclas anteriores, esto hace que las combinaciones de teclas de otros complementos (es decir, fzf
, zsh-autocomplete
, etc.) fallen.
Puede resolver el problema de compatibilidad de la siguiente manera:
# Append a command directly
zvm_after_init_commands+=( ' [ -f ~/.fzf.zsh ] && source ~/.fzf.zsh ' )
o
# 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)
o
# The plugin will auto execute this zvm_after_init function
function zvm_after_init() {
[ -f ~ /.fzf.zsh ] && source ~ /.fzf.zsh
}
o si estás usando el zinit
:
# For postponing loading `fzf`
zinit ice lucid wait
zinit snippet OMZP::fzf
De forma predeterminada, la función de combinaciones de teclas diferidas está habilitada; todas las combinaciones de teclas del modo normal
y visual
deben ser ejecutadas por zvm_after_lazy_keybindings_commands
. Por ejemplo:
# 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 complemento tiene dos funciones para que usted pueda definir widgets y combinaciones de teclas personalizados. En caso de problemas innecesarios, es mejor utilizarlos, especialmente cuando se encuentran conflictos clave.
Para definir un widget personalizado, debe:
# 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 una combinación de teclas, debe:
zvm_bindkey < keymap > < keys > < widget >
Por ejemplo:
# 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 complemento ha proporcionado una variable ZVM_MODE
para que pueda recuperar el modo vi actual y mostrar mejor el indicador.
Y actualmente se admiten los siguientes modos:
ZVM_MODE_NORMAL
ZVM_MODE_INSERT
ZVM_MODE_VISUAL
ZVM_MODE_VISUAL_LINE
ZVM_MODE_REPLACE
Para actualizar el indicador del modo vi, debemos agregar nuestros comandos a zvm_after_select_vi_mode_commands
. Por ejemplo:
# 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 complemento ha proporcionado algunas opciones para que los usuarios personalicen el estilo del cursor para una mejor compatibilidad del terminal.
ZVM_CURSOR_STYLE_ENABLED
(el valor predeterminado es 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 la opción ZVM_TERM
para establecer el tipo de término para que el complemento maneje secuencias de escape de terminal; el valor predeterminado es $TERM
. Podría ser xterm-256color
, alacritty-256color
, st-256color
, etc. Es importante que algunos emuladores de terminal muestren el cursor correctamente.
Puede usar ZVM_VI_HIGHLIGHT_BACKGROUND
, ZVM_VI_HIGHLIGHT_FOREGROUND
y ZVM_VI_HIGHLIGHT_EXTRASTYLE
para cambiar los comportamientos de resaltado (alrededores, líneas visuales, etc.), el valor del color podría ser un nombre de color o un valor de color hexadecimal .
Por ejemplo:
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
Puede configurar el modo inicial de la línea de comando mediante la opción ZVM_LINE_INIT_MODE
.
Actualmente se admiten los siguientes modos:
ZVM_MODE_LAST
: comenzando con el último modo (predeterminado).ZVM_MODE_INSERT
: comenzando con el modo de inserción.ZVM_MODE_NORMAL
: comenzando con el modo normal.Por ejemplo:
# Always starting with insert mode for each command line
ZVM_LINE_INIT_MODE= $ZVM_MODE_INSERT
Este complemento admite la función de combinaciones de teclas diferidas y está habilitada de forma predeterminada. Para deshabilitarlo, puede configurar la opción ZVM_LAZY_KEYBINDINGS
en false
antes de cargar este complemento. Esta función pospondrá todas las combinaciones de teclas del modo normal
y visual
hasta la primera vez que ingrese al modo normal.
Puede mejorar enormemente la velocidad de inicio, especialmente si abre la terminal y solo desea ejecutar un comando simple.
Para evitar varios problemas relacionados con las combinaciones de teclas causadas por la secuencia de obtención del complemento, y también mantener la misma funcionalidad para este complemento, la inicialización de este complemento se pospuso hasta el inicio de la primera línea de comando.
Sin embargo, casi todos los complementos se inicializan cuando se obtiene el script. Por lo tanto, este complemento proporciona una opción ZVM_INIT_MODE
para cambiar el modo de inicialización.
Por ejemplo:
# Do the initialization when the script is sourced (i.e. Initialize instantly)
ZVM_INIT_MODE=sourcing
Se agradecen mucho los problemas y las solicitudes de extracción. Si nunca antes ha contribuido a un proyecto de código abierto, estaré más que feliz de explicarle cómo crear una solicitud de extracción.
Puede comenzar abriendo un problema que describa el problema que desea resolver y continuaremos desde allí.
Este tema tiene la licencia MIT © Jeffrey Tse.