Un plugin de mode vi(vim) meilleur et convivial pour ZSH.
ZSH
pour l'agnosticisme. Peut-être avez-vous expérimenté le mode Vi par défaut dans Zsh, après avoir activé le mode Vi par défaut, vous avez progressivement constaté qu'il présentait de nombreux problèmes, que certaines fonctionnalités n'étaient pas parfaites ou inexistantes, et que certains comportements étaient même différents du Vi natif (Vim ).
Bien que le mode Vi par défaut soit un peu embarrassant et désagréable, vous avez continué à l'utiliser et avez progressivement perdu tout intérêt après l'avoir utilisé pendant un certain temps. Finalement, vous avez abandonné avec déception.
Vous ne pensez jamais au mode Vi depuis longtemps, un jour vous avez accidentellement découvert ce plugin, vous lisez ici et réalisez que ce plugin est destiné à résoudre les problèmes ci-dessus et à vous faire retomber amoureux du mode Vi. Un sourire est soudainement apparu sur votre visage, comme si vous retrouviez une belle vie.
Si l’hiver arrive, le printemps peut-il être loin derrière ?
10p
et 4fa
( en cours ).ZSH : >= 5.1.0
Regroupez zsh-vi-mode
dans votre .zshrc
antigen bundle jeffreytse/zsh-vi-mode
Chargez zsh-vi-mode
en tant que plugin dans votre .zshrc
zplug " jeffreytse/zsh-vi-mode "
Incluez la commande de chargement dans votre .zshrc
zgen load jeffreytse/zsh-vi-mode
Incluez la commande de chargement dans votre .zshrc
zinit ice depth=1
zinit light jeffreytse/zsh-vi-mode
Remarque : l'utilisation de glace depth=1
est facultative, les autres types de glace ne sont ni recommandés ni officiellement supportés par ce plugin.
Clonez zsh-vi-mode
dans votre dépôt de plugins personnalisé
git clone https://github.com/jeffreytse/zsh-vi-mode
$ZSH_CUSTOM /plugins/zsh-vi-mode
Chargez ensuite en tant que plugin dans votre .zshrc
plugins+=(zsh-vi-mode)
Gardez à l’esprit que les plugins doivent être ajoutés avant que oh-my-zsh.sh
ne soit recherché.
Ajoutez zsh-vi-mode
à votre fichier de plugins (par exemple ~/.zsh_plugins.txt
)
jeffreytse/zsh-vi-mode
Chargez zsh-vi-mode
en tant que plugin dans votre .zshrc
plug " jeffreytse/zsh-vi-mode "
Chargez zsh-vi-mode
en tant que plugin dans votre .zimrc
zmodule jeffreytse/zsh-vi-mode
Pour les utilisateurs Homebrew, vous pouvez l'installer via la commande suivante
brew install zsh-vi-mode
Ensuite, sourcez-le dans votre .zshrc
(ou .bashrc
)
source $( brew --prefix ) /opt/zsh-vi-mode/share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Pour les utilisateurs d'Arch Linux, vous pouvez l'installer via la commande suivante
yay -S zsh-vi-mode
ou la dernière mise à jour (instable)
yay -S zsh-vi-mode-git
Ensuite, sourcez-le dans votre .zshrc
(ou .bashrc
)
source /usr/share/zsh/plugins/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Pour les utilisateurs de Nix, à partir de e7e3480530b34a9fe8cb52963ec2cf66e6707e15, vous pouvez sourcer le plugin via la configuration suivante
programs = {
zsh = {
interactiveShellInit = ''
source ${ pkgs . zsh-vi-mode } /share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
'' ;
} ;
} ;
Ou si vous préférez 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
'' ;
} ;
} ;
} ;
Vous pouvez également utiliser la fonctionnalité "plugin" intégrée 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 ajoute des applications, des raccourcis et une saisie semi-automatique à votre terminal existant.
Installez zsh-vi-mode
en un seul clic.
Disponible en superposition dm9pZCAq
eselect repository enable dm9pZCAq
emerge --sync dm9pZCAq
emerge app-shells/zsh-vi-mode
Ensuite, sourcez-le dans votre .zshrc
(ou .bashrc
)
source /usr/share/zsh/site-contrib/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Clonez ce référentiel quelque part ( $HOME/.zsh-vi-mode
par exemple)
git clone https://github.com/jeffreytse/zsh-vi-mode.git $HOME /.zsh-vi-mode
Ensuite, sourcez-le dans votre .zshrc
(ou .bashrc
)
source $HOME /.zsh-vi-mode/zsh-vi-mode.plugin.zsh
Utilisez ESC
ou CTRL-[
pour passer en Normal mode
.
Mais certaines personnes peuvent aimer la touche d'échappement personnalisée telle que jj
, jk
et ainsi de suite, si vous souhaitez personnaliser la touche d'échappement, vous pouvez en savoir plus ici.
ctrl-p
: Commande précédente dans l'historiquectrl-n
: Commande suivante dans l'historique/
: Recherche en arrière dans l'historiquen
: Répétez le dernier /
Normal mode
est indiqué par défaut avec un curseur de style bloc et Insert mode
avec un curseur de style poutre.
En Normal mode
vous pouvez utiliser vv
pour éditer la ligne de commande actuelle dans un éditeur (par exemple vi
/ vim
/ nvim
...), car elle est liée au Visual mode
.
Vous pouvez changer l'éditeur par l'option ZVM_VI_EDITOR
, par défaut c'est $EDITOR
.
$
: Jusqu'à la fin de la ligne^
: Au premier caractère non vide de la ligne0
: Au premier caractère de la lignew
: [compter] mots en avantW
: [compter] MOTS en avante
: Avancer jusqu'à la fin du mot [count] inclusE
: Avancer jusqu'à la fin du MOT [count] inclusb
: [compter] les mots à l'enversB
: [compter] MOTS à l'enverst{char}
: jusqu'à avant [count]ième occurrence de {char} à droiteT{char}
: Jusqu'à avant [count]ième occurrence de {char} à gauchef{char}
: à la [count]ième occurrence de {char} à droiteF{char}
: à la [count]ième occurrence de {char} à gauche;
: Répéter les dernières fois f, t, F ou T [count],
: Répéter le dernier f, t, F ou T dans la direction opposée i
: Insérer du texte avant le curseurI
: Insérer du texte avant le premier caractère de la lignea
: Ajouter du texte après le curseurA
: Ajouter du texte en fin de ligneo
: Insérer une nouvelle ligne de commande sous l'actuelleO
: Insérer une nouvelle ligne de commande au-dessus de l'actuelle Il existe 2 types de mode de raccourci clavier pour le fonctionnement surround, le mode par défaut est le mode classic
, vous pouvez choisir le mode en définissant l'option ZVM_VI_SURROUND_BINDKEY
.
classic
(verbe->s->surround)S"
: Ajouter "
pour la sélection visuelleys"
: Ajouter "
pour la sélection visuellecs"'
: Remplacez "
par '
ds"
: Supprimer "
s-prefix
(s->verb->surround)sa"
: Ajouter "
pour la sélection visuellesd"
: Supprimer "
sr"'
: Remplacez "
par '
Notez que les séquences de touches doivent être enfoncées assez rapidement pour éviter un délai d'attente. Vous pouvez prolonger ce délai avec l'option ZVM_KEYTIMEOUT
.
vi"
: Sélectionnez l'objet texte à l'intérieur des guillemetsva(
: Sélectionnez l'objet texte, y compris les crochetsEnsuite, vous pouvez effectuer n'importe quelle opération pour la sélection :
vi"
-> S[
ou sa[
=> "object"
-> "[object]"
va"
-> S[
ou sa[
=> "object"
-> ["object"]
di(
ou vi(
-> d
ca(
ou va(
-> c
yi(
ou vi(
-> y
En mode normal, taper ctrl-a
augmentera jusqu'au mot-clé suivant, et taper ctrl-x
diminuera jusqu'au mot-clé suivant. Le mot-clé peut être au niveau du curseur, ou à droite du curseur (sur la même ligne). Le mot-clé pourrait être le suivant :
Par exemple:
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
Vous pouvez utiliser les options ci-dessous pour personnaliser la touche d'échappement qui pourrait mieux correspondre à votre saveur, comme jj
ou jk
, etc.
ZVM_VI_ESCAPE_BINDKEY
: La touche d'échappement vi dans tous les modes (la valeur par défaut est ^[
=> ESC
)ZVM_VI_INSERT_ESCAPE_BINDKEY
: La clé d'échappement vi en mode insertion (la valeur par défaut est $ZVM_VI_ESCAPE_BINDKEY
)ZVM_VI_VISUAL_ESCAPE_BINDKEY
: La touche d'échappement vi en mode visuel (la valeur par défaut est $ZVM_VI_ESCAPE_BINDKEY
)ZVM_VI_OPPEND_ESCAPE_BINDKEY
: La clé d'échappement vi en mode opérateur en attente (la valeur par défaut est $ZVM_VI_ESCAPE_BINDKEY
)Par exemple:
# 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
Ce plugin a pris en charge le choix du moteur readkey pour lire et traiter les événements clés. C'est facile à faire grâce à l'option ZVM_READKEY_ENGINE
, actuellement les moteurs ci-dessous sont pris en charge :
ZVM_READKEY_ENGINE_NEX
: C'est un meilleur moteur de lecture de clé pour remplacer ZLE (Beta).ZVM_READKEY_ENGINE_ZLE
: Il s'agit du moteur de lecture de clé par défaut de Zsh (ZLE).ZVM_READKEY_ENGINE_DEFAULT
: C'est le moteur par défaut de ce plugin (C'est le moteur NEX maintenant).Le NEX est un meilleur moteur pour lire et gérer les événements clés que le moteur ZLE de Zsh. Actuellement, le moteur NEX est encore en phase bêta, vous pouvez revenir au moteur ZLE de Zsh si vous le souhaitez.
Par exemple:
# Change to Zsh's default readkey engine
ZVM_READKEY_ENGINE= $ZVM_READKEY_ENGINE_ZLE
Vous pouvez utiliser l'option ZVM_KEYTIMEOUT
pour ajuster le délai d'expiration de la saisie de la clé pour attendre la clé suivante, la valeur par défaut est 0.4
seconde.
La touche d'échappement est un cas particulier, elle peut être utilisée de manière autonome. Le moteur NEX attend un certain temps après avoir reçu le caractère d'échappement pour déterminer s'il est autonome ou s'il fait partie d'une séquence d'échappement. En attendant, des pressions supplémentaires sur une touche font que la touche d'échappement se comporte comme une touche méta. Si aucune autre pression sur une touche n'intervient, l'opération est traitée comme une évasion autonome.
Pour le moteur NEX, nous pouvons utiliser l'option ZVM_ESCAPE_KEYTIMEOUT
pour ajuster le délai d'attente pour la touche d'échappement, la valeur par défaut est 0.03
seconde.
Comme certaines options de configuration dépendent de certaines variables définies dans le plugin, d'autres non. Nous devons fournir une fonction d'entrée de configuration unifiée. Le nom de la fonction d'entrée est stocké dans une option appelée ZVM_CONFIG_FUNC
et la valeur par défaut est zvm_config
, vous pouvez en changer pour d'autres selon votre goût.
Si cette fonction de configuration existe, elle sera appelée automatiquement, vous pouvez faire quelques configurations dans cet aspect avant de sourcer ce plugin. Par exemple:
function zvm_config() {
ZVM_LINE_INIT_MODE= $ZVM_MODE_INSERT
ZVM_VI_INSERT_ESCAPE_BINDKEY=jk
}
source ~ /zsh-vi-mode.zsh
Ce plugin a fourni un mécanisme pour exécuter des commandes supplémentaires, et vous disposez désormais des aspects ci-dessous pour exécuter quelque chose :
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=()
Étant donné le mode d'initialisation par défaut, ce plugin écrasera les raccourcis clavier précédents, ce qui entraînera l'échec des raccourcis clavier des autres plugins (c'est-à-dire fzf
, zsh-autocomplete
, etc.).
Vous pouvez résoudre le problème de compatibilité comme ci-dessous :
# 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 si vous utilisez le zinit
:
# For postponing loading `fzf`
zinit ice lucid wait
zinit snippet OMZP::fzf
Par défaut, la fonctionnalité de raccourcis clavier paresseux est activée, toutes les raccourcis clavier des modes normal
et visual
doivent être exécutés par zvm_after_lazy_keybindings_commands
. Par exemple:
# 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
}
Ce plugin a deux fonctions pour vous permettre de définir des widgets et des raccourcis clavier personnalisés. En cas de problèmes inutiles, il est préférable de les utiliser, surtout lorsque vous rencontrez des conflits clés.
Pour définir un widget personnalisé, vous devez :
# If [your_custom_widget] were ignored, it will be the same with <your_custom_widget>
zvm_define_widget < your_custom_widget > [your_custom_function]
Pour définir une combinaison de touches, vous devez :
zvm_bindkey < keymap > < keys > < widget >
Par exemple:
# 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
}
Ce plugin a fourni une variable ZVM_MODE
pour vous permettre de récupérer le mode vi actuel et de mieux afficher l'indicateur.
Et actuellement, les modes ci-dessous sont pris en charge :
ZVM_MODE_NORMAL
ZVM_MODE_INSERT
ZVM_MODE_VISUAL
ZVM_MODE_VISUAL_LINE
ZVM_MODE_REPLACE
Pour mettre à jour l'indicateur de mode vi, nous devons ajouter nos commandes à zvm_after_select_vi_mode_commands
. Par exemple:
# 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
}
Ce plugin a fourni aux utilisateurs certaines options permettant de personnaliser le style du curseur pour une meilleure compatibilité du terminal.
ZVM_CURSOR_STYLE_ENABLED
(la valeur par défaut est 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 '
}
Nous pouvons utiliser l'option ZVM_TERM
pour définir le type de terme permettant au plugin de gérer les séquences d'échappement du terminal, la valeur par défaut est $TERM
. Il peut s'agir de xterm-256color
, alacritty-256color
, st-256color
, etc. Il est important que certains émulateurs de terminal affichent correctement le curseur.
Vous pouvez utiliser ZVM_VI_HIGHLIGHT_BACKGROUND
, ZVM_VI_HIGHLIGHT_FOREGROUND
et ZVM_VI_HIGHLIGHT_EXTRASTYLE
pour modifier les comportements de surbrillance (entourements, ligne visuelle, etc.), la valeur de couleur peut être un nom de couleur ou une valeur de couleur hexadécimale .
Par exemple:
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
Vous pouvez définir le mode initial de la ligne de commande grâce à l'option ZVM_LINE_INIT_MODE
.
Actuellement, les modes ci-dessous sont pris en charge :
ZVM_MODE_LAST
: Commencer par le dernier mode (par défaut).ZVM_MODE_INSERT
: Démarrage avec le mode insertion.ZVM_MODE_NORMAL
: Démarrage en mode normal.Par exemple:
# Always starting with insert mode for each command line
ZVM_LINE_INIT_MODE= $ZVM_MODE_INSERT
Ce plugin a pris en charge la fonctionnalité de raccourcis clavier paresseux et elle est activée par défaut. Pour le désactiver, vous pouvez définir l'option ZVM_LAZY_KEYBINDINGS
sur false
avant le chargement de ce plugin. Cette fonctionnalité reportera toutes les combinaisons de touches du mode normal
et visual
à la première fois que vous entrez en mode normal.
Cela peut considérablement améliorer la vitesse de démarrage, en particulier si vous ouvrez le terminal et souhaitez simplement exécuter une commande simple.
Afin d'éviter divers problèmes liés aux raccourcis clavier causés par la séquence de sourcing du plugin, et également de conserver les mêmes fonctionnalités pour ce plugin, l'initialisation de ce plugin a été reportée au premier démarrage de la ligne de commande.
Cependant, presque tous les plugins sont initialisés lors de la création du script. Par conséquent, ce plugin fournit une option ZVM_INIT_MODE
pour changer le mode d'initialisation.
Par exemple:
# Do the initialization when the script is sourced (i.e. Initialize instantly)
ZVM_INIT_MODE=sourcing
Les problèmes et les demandes de tirage sont grandement appréciés. Si vous n'avez jamais contribué à un projet open source auparavant, je serai plus qu'heureux de vous expliquer comment créer une pull request.
Vous pouvez commencer par ouvrir un ticket décrivant le problème que vous cherchez à résoudre et nous partirons de là.
Ce thème est sous licence MIT © Jeffrey Tse.