Ein besseres und benutzerfreundlicheres vi(vim)-Modus-Plugin für ZSH.
ZSH
Plugin für Agnostizismus. Vielleicht haben Sie den Standard-Vi-Modus in Zsh erlebt. Nach dem Einschalten des Standard-Vi-Modus stellten Sie nach und nach fest, dass es viele Probleme gab, einige Funktionen nicht perfekt oder nicht vorhanden waren und einige Verhaltensweisen sich sogar vom nativen Vi(Vim) unterschieden )-Modus.
Obwohl der Standard-Vi-Modus etwas peinlich und unangenehm war, haben Sie ihn weiterhin verwendet und nach einiger Zeit allmählich das Interesse daran verloren. Schließlich hast du enttäuscht aufgegeben.
Man denkt lange nicht mehr an den Vi-Modus, eines Tages entdeckt man zufällig dieses Plugin, liest hier und stellt fest, dass dieses Plugin die oben genannten Probleme lösen und dafür sorgen soll, dass man sich wieder in den Vi-Modus verliebt. Plötzlich erschien ein Lächeln auf Ihrem Gesicht, als ob Sie ein gutes Leben wiedererlangt hätten.
Wenn der Winter kommt, kann der Frühling dann lange auf sich warten lassen?
10p
und 4fa
( in Bearbeitung ).ZSH: >= 5.1.0
Bündeln Sie zsh-vi-mode
in Ihrer .zshrc
antigen bundle jeffreytse/zsh-vi-mode
Laden Sie zsh-vi-mode
als Plugin in Ihre .zshrc
zplug " jeffreytse/zsh-vi-mode "
Fügen Sie den Ladebefehl in Ihre .zshrc
ein
zgen load jeffreytse/zsh-vi-mode
Fügen Sie den Ladebefehl in Ihre .zshrc
ein
zinit ice depth=1
zinit light jeffreytse/zsh-vi-mode
Hinweis: Die Verwendung von depth=1
-Eis ist optional, andere Eisarten werden von diesem Plugin weder empfohlen noch offiziell unterstützt.
Klonen Sie zsh-vi-mode
in Ihr benutzerdefiniertes Plugin-Repository
git clone https://github.com/jeffreytse/zsh-vi-mode
$ZSH_CUSTOM /plugins/zsh-vi-mode
Laden Sie es dann als Plugin in Ihre .zshrc
plugins+=(zsh-vi-mode)
Beachten Sie, dass Plugins hinzugefügt werden müssen, bevor oh-my-zsh.sh
bezogen wird.
Fügen Sie zsh-vi-mode
zu Ihrer Plugin-Datei hinzu (z. B. ~/.zsh_plugins.txt
).
jeffreytse/zsh-vi-mode
Laden Sie zsh-vi-mode
als Plugin in Ihre .zshrc
plug " jeffreytse/zsh-vi-mode "
Laden Sie zsh-vi-mode
als Plugin in Ihre .zimrc
zmodule jeffreytse/zsh-vi-mode
Für Homebrew-Benutzer können Sie es mit dem folgenden Befehl installieren
brew install zsh-vi-mode
Geben Sie es dann in Ihrer .zshrc
(oder .bashrc
) ein.
source $( brew --prefix ) /opt/zsh-vi-mode/share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Für Benutzer von Arch Linux können Sie es mit dem folgenden Befehl installieren
yay -S zsh-vi-mode
oder das neueste Update (instabil)
yay -S zsh-vi-mode-git
Geben Sie es dann in Ihrer .zshrc
(oder .bashrc
) ein.
source /usr/share/zsh/plugins/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Für Benutzer von Nix: Ab e7e3480530b34a9fe8cb52963ec2cf66e6707e15 können Sie das Plugin über die folgende Konfiguration beziehen
programs = {
zsh = {
interactiveShellInit = ''
source ${ pkgs . zsh-vi-mode } /share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
'' ;
} ;
} ;
Oder wenn Sie home-manager
bevorzugen:
home-manager . users . [ your username ] = { pkgs , ... } : {
programs = {
zsh = {
initExtra = ''
source ${ pkgs . zsh-vi-mode } /share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
'' ;
} ;
} ;
} ;
Sie können auch die integrierte „Plugin“-Funktion von home-manager
verwenden:
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 fügt Ihrem vorhandenen Terminal Apps, Verknüpfungen und automatische Vervollständigung hinzu.
Installieren Sie zsh-vi-mode
mit nur einem Klick.
Verfügbar im dm9pZCAq-Overlay
eselect repository enable dm9pZCAq
emerge --sync dm9pZCAq
emerge app-shells/zsh-vi-mode
Geben Sie es dann in Ihrer .zshrc
(oder .bashrc
) ein.
source /usr/share/zsh/site-contrib/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Klonen Sie dieses Repository irgendwo (z. B. $HOME/.zsh-vi-mode
).
git clone https://github.com/jeffreytse/zsh-vi-mode.git $HOME /.zsh-vi-mode
Geben Sie es dann in Ihrer .zshrc
(oder .bashrc
) ein.
source $HOME /.zsh-vi-mode/zsh-vi-mode.plugin.zsh
Verwenden Sie ESC
oder CTRL-[
um in Normal mode
zu gelangen.
Aber einige Leute mögen möglicherweise die benutzerdefinierten Escape-Tasten wie jj
, jk
usw. Wenn Sie die Escape-Taste anpassen möchten, können Sie hier mehr erfahren.
ctrl-p
: Vorheriger Befehl im Verlaufctrl-n
: Nächster Befehl im Verlauf/
: Rückwärtssuche im Verlaufn
: Wiederholen Sie das letzte /
Normal mode
wird standardmäßig mit einem Blockcursor und Insert mode
mit einem Balkencursor angezeigt.
Im Normal mode
können Sie vv
verwenden, um die aktuelle Befehlszeile in einem Editor (z. B. vi
/ vim
/ nvim
...) zu bearbeiten, da es an den Visual mode
gebunden ist.
Sie können den Editor mit der Option ZVM_VI_EDITOR
ändern, standardmäßig ist er $EDITOR
.
$
: Bis zum Ende der Zeile^
: Zum ersten nicht leeren Zeichen der Zeile0
: Zum ersten Zeichen der Zeilew
: Wörter vorwärts [zählen].W
: [zählen] WÖRTER vorwärtse
: Vorwärts bis zum Ende des Wortes [Anzahl] einschließlichE
: Vorwärts bis zum Ende von WORD [Anzahl] einschließlichb
: Wörter rückwärts [zählen].B
: [Zähle] WÖRTER rückwärtst{char}
: Bis vor dem [count]ten Vorkommen von {char} rechtsT{char}
: Bis vor dem [count]ten Vorkommen von {char} linksf{char}
: Bis zum [count]ten Vorkommen von {char} rechtsF{char}
: Bis zum [count]ten Vorkommen von {char} links;
: Letzte f, t, F oder T [Zählung] wiederholen,
: Wiederholen Sie spätestens f, t, F oder T in entgegengesetzter Richtung i
: Text vor dem Cursor einfügenI
: Text vor dem ersten Zeichen in der Zeile einfügena
: Text nach dem Cursor anhängenA
: Text am Ende der Zeile anhängeno
: Neue Befehlszeile unterhalb der aktuellen einfügenO
: Neue Befehlszeile über der aktuellen einfügen Es gibt zwei Arten von Tastenbelegungsmodi für den Surround-Betrieb. Der Standardmodus ist der classic
Modus. Sie können den Modus auswählen, indem Sie die Option ZVM_VI_SURROUND_BINDKEY
festlegen.
classic
Modus (Verb->s->surround)S"
"
Zur visuellen Auswahl hinzufügenys"
: Zur visuellen Auswahl "
hinzufügencs"'
: Ändern Sie "
in '
ds"
: Löschen "
s-prefix
Modus (s->verb->surround)sa"
"
Zur visuellen Auswahl hinzufügensd"
: Löschen "
sr"'
: Ändern Sie "
in '
Beachten Sie, dass Tastenfolgen relativ schnell hintereinander gedrückt werden müssen, um eine Zeitüberschreitung zu vermeiden. Sie können dieses Timeout mit der Option ZVM_KEYTIMEOUT
verlängern.
vi"
: Wählen Sie das Textobjekt innerhalb der Anführungszeichen ausva(
: Wählen Sie das Textobjekt einschließlich der Klammern ausDann können Sie eine beliebige Operation für die Auswahl ausführen:
vi"
-> S[
oder sa[
=> "object"
-> "[object]"
va"
-> S[
oder sa[
=> "object"
-> ["object"]
di(
oder vi(
-> d
ca(
oder va(
-> c
yi(
oder vi(
-> y
Im Normalmodus führt die Eingabe ctrl-a
zum nächsten Schlüsselwort und die Eingabe von ctrl-x
zum nächsten Schlüsselwort. Das Schlüsselwort kann am Cursor oder rechts vom Cursor (in derselben Zeile) stehen. Das Schlüsselwort könnte wie folgt lauten:
Zum Beispiel:
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
Mit den folgenden Optionen können Sie die Escape-Taste anpassen, die besser zu Ihrem Geschmack passt, z. B. jj
oder jk
usw.
ZVM_VI_ESCAPE_BINDKEY
: Die vi-Escape-Taste in allen Modi (Standard ist ^[
=> ESC
)ZVM_VI_INSERT_ESCAPE_BINDKEY
: Die vi-Escape-Taste im Einfügemodus (Standard ist $ZVM_VI_ESCAPE_BINDKEY
).ZVM_VI_VISUAL_ESCAPE_BINDKEY
: Die vi-Escape-Taste im visuellen Modus (Standard ist $ZVM_VI_ESCAPE_BINDKEY
).ZVM_VI_OPPEND_ESCAPE_BINDKEY
: Die vi-Escape-Taste im Operator-Pending-Modus (Standard ist $ZVM_VI_ESCAPE_BINDKEY
).Zum Beispiel:
# 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
Dieses Plugin unterstützt die Auswahl der Readkey-Engine zum Lesen und Verarbeiten der Schlüsselereignisse. Mit der Option ZVM_READKEY_ENGINE
ist dies ganz einfach. Derzeit werden die folgenden Engines unterstützt:
ZVM_READKEY_ENGINE_NEX
: Es ist eine bessere Readkey-Engine als Ersatz für ZLE (Beta).ZVM_READKEY_ENGINE_ZLE
: Es ist die Standard-Readkey-Engine (ZLE) von Zsh.ZVM_READKEY_ENGINE_DEFAULT
: Es ist die Standard-Engine dieses Plugins (jetzt ist es die NEX-Engine).Die NEX ist eine bessere Engine zum Lesen und Verarbeiten der Schlüsselereignisse als die ZLE-Engine von Zsh. Derzeit befindet sich die NEX-Engine noch im Beta-Stadium. Sie können bei Bedarf wieder zur ZLE-Engine von Zsh wechseln.
Zum Beispiel:
# Change to Zsh's default readkey engine
ZVM_READKEY_ENGINE= $ZVM_READKEY_ENGINE_ZLE
Sie können die Option ZVM_KEYTIMEOUT
verwenden, um das Zeitlimit für die Tasteneingabe beim Warten auf die nächste Taste anzupassen. Der Standardwert beträgt 0.4
Sekunden.
Die Escape-Taste ist ein Sonderfall, sie kann eigenständig verwendet werden. Die NEX-Engine wartet nach dem Empfang des Escape-Zeichens eine Zeit lang, um festzustellen, ob es eigenständig oder Teil einer Escape-Sequenz ist. Während des Wartens verhält sich die Escape-Taste durch weitere Tastendrücke wie eine Metataste. Wenn keine anderen Tastendrücke eingehen, wird dies als eigenständiger Escapevorgang behandelt.
Für die NEX-Engine können wir die Option ZVM_ESCAPE_KEYTIMEOUT
verwenden, um die Wartezeit für die Escape-Taste anzupassen. Der Standardwert beträgt 0.03
Sekunden.
Da es einige Konfigurationsoptionen gibt, die auf einige im Plugin definierte Variablen angewiesen sind, andere jedoch nicht. Wir müssen eine einheitliche Konfigurationseintragsfunktion bereitstellen. Der Name der Eintragsfunktion wird in einer Option namens ZVM_CONFIG_FUNC
gespeichert und der Standardwert ist zvm_config
. Sie können ihn je nach Geschmack ändern.
Wenn diese Konfigurationsfunktion vorhanden ist, wird sie automatisch aufgerufen. Sie können diesbezüglich einige Konfigurationen vornehmen, bevor Sie dieses Plugin beziehen. Zum Beispiel:
function zvm_config() {
ZVM_LINE_INIT_MODE= $ZVM_MODE_INSERT
ZVM_VI_INSERT_ESCAPE_BINDKEY=jk
}
source ~ /zsh-vi-mode.zsh
Dieses Plugin bietet einen Mechanismus zum Ausführen zusätzlicher Befehle, und jetzt stehen Ihnen die folgenden Aspekte zur Verfügung, um etwas auszuführen:
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=()
Aufgrund des Standardinitialisierungsmodus überschreibt dieses Plugin die vorherigen Tastenkombinationen, was dazu führt, dass die Tastenkombinationen anderer Plugins (z. B. fzf
, zsh-autocomplete
usw.) fehlschlagen.
Sie können das Kompatibilitätsproblem wie folgt lösen:
# Append a command directly
zvm_after_init_commands+=( ' [ -f ~/.fzf.zsh ] && source ~/.fzf.zsh ' )
oder
# 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)
oder
# The plugin will auto execute this zvm_after_init function
function zvm_after_init() {
[ -f ~ /.fzf.zsh ] && source ~ /.fzf.zsh
}
oder wenn Sie zinit
verwenden:
# For postponing loading `fzf`
zinit ice lucid wait
zinit snippet OMZP::fzf
Standardmäßig ist die Funktion „Lazy Keybindings“ aktiviert. Alle Tastenkombinationen im normal
und visual
Modus sollten von zvm_after_lazy_keybindings_commands
ausgeführt werden. Zum Beispiel:
# 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
}
Dieses Plugin verfügt über zwei Funktionen, mit denen Sie benutzerdefinierte Widgets und Tastenkombinationen definieren können. Bei unnötigen Problemen ist es besser, sie zu nutzen, insbesondere wenn Sie auf Schlüsselkonflikte stoßen.
Um ein benutzerdefiniertes Widget zu definieren, sollten Sie:
# If [your_custom_widget] were ignored, it will be the same with <your_custom_widget>
zvm_define_widget < your_custom_widget > [your_custom_function]
Um eine Tastenkombination zu definieren, sollten Sie:
zvm_bindkey < keymap > < keys > < widget >
Zum Beispiel:
# 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
}
Dieses Plugin stellt eine ZVM_MODE
Variable bereit, mit der Sie den aktuellen VI-Modus abrufen und den Indikator besser anzeigen können.
Und derzeit werden die folgenden Modi unterstützt:
ZVM_MODE_NORMAL
ZVM_MODE_INSERT
ZVM_MODE_VISUAL
ZVM_MODE_VISUAL_LINE
ZVM_MODE_REPLACE
Um den VI-Modusindikator zu aktualisieren, sollten wir unsere Befehle zu zvm_after_select_vi_mode_commands
hinzufügen. Zum Beispiel:
# 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
}
Dieses Plugin bietet Benutzern einige Optionen zum Anpassen des Cursorstils für eine bessere Terminalkompatibilität.
ZVM_CURSOR_STYLE_ENABLED
deaktivieren (Standard ist 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 '
}
Wir können die Option ZVM_TERM
verwenden, um den Termtyp für das Plugin festzulegen, um Terminal-Escape-Sequenzen zu verarbeiten. Der Standardwert ist $TERM
. Es könnte xterm-256color
, alacritty-256color
, st-256color
usw. sein. Für einige Terminalemulatoren ist es wichtig, den Cursor richtig anzuzeigen.
Sie können ZVM_VI_HIGHLIGHT_BACKGROUND
, ZVM_VI_HIGHLIGHT_FOREGROUND
und ZVM_VI_HIGHLIGHT_EXTRASTYLE
verwenden, um das Hervorhebungsverhalten (Umrandung, visuelle Linie usw.) zu ändern. Der Farbwert kann ein Farbname oder ein Hex-Farbwert sein.
Zum Beispiel:
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
Sie können den Anfangsmodus der Befehlszeile mit der Option ZVM_LINE_INIT_MODE
festlegen.
Derzeit werden die folgenden Modi unterstützt:
ZVM_MODE_LAST
: Beginnend mit dem letzten Modus (Standard).ZVM_MODE_INSERT
: Beginnend mit dem Einfügemodus.ZVM_MODE_NORMAL
: Beginnend mit dem Normalmodus.Zum Beispiel:
# Always starting with insert mode for each command line
ZVM_LINE_INIT_MODE= $ZVM_MODE_INSERT
Dieses Plugin unterstützt die Funktion „Lazy Keybindings“ und ist standardmäßig aktiviert. Um es zu deaktivieren, können Sie die Option ZVM_LAZY_KEYBINDINGS
auf false
setzen, bevor dieses Plugin geladen wird. Diese Funktion verschiebt alle Tastenkombinationen des normal
und visual
Modus auf das erste Mal, wenn Sie den normalen Modus aufrufen.
Dies kann die Startgeschwindigkeit erheblich verbessern, insbesondere wenn Sie das Terminal öffnen und nur einen einfachen Befehl ausführen möchten.
Um verschiedene Probleme im Zusammenhang mit Tastenkombinationen zu vermeiden, die durch die Plugin-Beschaffungssequenz verursacht werden, und um die gleiche Funktionalität für dieses Plugin beizubehalten, wurde die Initialisierung dieses Plugins auf den ersten Befehlszeilenstart verschoben.
Allerdings werden fast alle Plugins initialisiert, wenn das Skript bereitgestellt wird. Daher bietet dieses Plugin eine Option ZVM_INIT_MODE
zum Ändern des Initialisierungsmodus.
Zum Beispiel:
# Do the initialization when the script is sourced (i.e. Initialize instantly)
ZVM_INIT_MODE=sourcing
Probleme und Pull-Anfragen werden sehr geschätzt. Wenn Sie noch nie an einem Open-Source-Projekt mitgewirkt haben, erkläre ich Ihnen gerne, wie Sie eine Pull-Anfrage erstellen.
Sie können damit beginnen, ein Problem zu eröffnen, in dem Sie das Problem beschreiben, das Sie lösen möchten, und wir werden von dort aus fortfahren.
Dieses Thema ist unter der MIT-Lizenz © Jeffrey Tse lizenziert.