مكون إضافي لوضع vi(vim) أفضل وأكثر ودية لـ ZSH.
ZSH
لللاأدرية. ربما كنت قد واجهت وضع Vi الافتراضي في Zsh، وبعد تشغيل وضع Vi الافتراضي، وجدت تدريجيًا أنه يعاني من العديد من المشكلات، وبعض الميزات لم تكن مثالية أو غير موجودة، وكانت بعض السلوكيات مختلفة عن Vi(Vim) الأصلي ) وضع.
على الرغم من أن وضع Vi الافتراضي كان محرجًا وغير سار بعض الشيء، إلا أنك واصلت استخدامه وفقدت اهتمامك به تدريجيًا بعد استخدامه لفترة من الوقت. في نهاية المطاف، لقد استسلمت بخيبة أمل.
لن تفكر أبدًا في وضع Vi لفترة طويلة، وفي أحد الأيام اكتشفت هذا البرنامج الإضافي عن طريق الخطأ، قرأت هنا وأدركت أن هذا البرنامج الإضافي يهدف إلى حل المشكلات المذكورة أعلاه ويجعلك تقع في حب وضع Vi مرة أخرى. ظهرت ابتسامة فجأة على وجهك وكأنها تستعيد حياة طيبة.
إذا جاء الشتاء، فهل يمكن أن يكون الربيع متأخرًا كثيرًا؟
10p
و 4fa
( قيد التنفيذ ).زش: >= 5.1.0
قم بتجميع zsh-vi-mode
في .zshrc
الخاص بك
antigen bundle jeffreytse/zsh-vi-mode
قم بتحميل zsh-vi-mode
كمكون إضافي في .zshrc
الخاص بك
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
قم بتحميل zsh-vi-mode
كمكون إضافي في .zshrc
الخاص بك
plug " jeffreytse/zsh-vi-mode "
قم بتحميل zsh-vi-mode
كمكون إضافي في .zimrc
الخاص بك
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" ;
}
] ;
} ;
} ;
} ;
يضيف الشكل التطبيقات والاختصارات والإكمال التلقائي إلى جهازك الحالي.
قم بتثبيت وضع 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
: [عد] الكلمات للأمامe
: للأمام حتى نهاية الكلمة [count] ضمنًاE
: الانتقال إلى نهاية الكلمة [العدد] ضمنًاb
: [عد] الكلمات إلى الوراءB
: [عد] الكلمات إلى الوراءt{char}
: حتى قبل ظهور [count] لـ {char} على اليمينT{char}
: حتى قبل ظهور [count] لـ {char} على اليسارf{char}
: إلى [عد] تكرار ظهور {char} على اليمينF{char}
: إلى [عد] تكرار ظهور {char} على اليسار;
: كرر آخر f أو t أو F أو T [عدد] مرات,
كرر f أو t أو F أو T في الاتجاه المعاكس i
: أدخل النص قبل المؤشرI
: أدخل نصًا قبل الحرف الأول في السطرa
: إلحاق نص بعد المؤشرA
: إلحاق نص في نهاية السطرo
: أدخل سطر أوامر جديدًا أسفل السطر الحاليO
: أدخل سطر أوامر جديدًا فوق السطر الحالي هناك نوعان من وضع ربط المفاتيح للتشغيل المحيطي، الوضع الافتراضي هو الوضع 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
وما إلى ذلك.
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
يدعم هذا البرنامج المساعد اختيار محرك القراءة الرئيسي لقراءة ومعالجة الأحداث الرئيسية. من السهل القيام بذلك عن طريق خيار ZVM_READKEY_ENGINE
، حاليًا يتم دعم المحركات التالية:
ZVM_READKEY_ENGINE_NEX
: إنه محرك قراءة أفضل ليحل محل ZLE (بيتا).ZVM_READKEY_ENGINE_ZLE
: إنه محرك القراءة الافتراضي لـ Zsh (ZLE).ZVM_READKEY_ENGINE_DEFAULT
: هذا هو المحرك الافتراضي لهذا البرنامج المساعد (إنه محرك NEX الآن).يعد NEX محركًا أفضل لقراءة الأحداث الرئيسية والتعامل معها من محرك Zsh's ZLE، حاليًا لا يزال محرك NEX في المرحلة التجريبية، ويمكنك العودة مرة أخرى إلى محرك Zsh's ZLE إذا كنت تريد ذلك.
على سبيل المثال:
# Change to Zsh's default readkey engine
ZVM_READKEY_ENGINE= $ZVM_READKEY_ENGINE_ZLE
يمكنك استخدام خيار ZVM_KEYTIMEOUT
لضبط مهلة إدخال المفتاح لانتظار المفتاح التالي، الافتراضي هو 0.4
ثانية.
مفتاح الهروب هو حالة خاصة، ويمكن استخدامه بشكل مستقل. ينتظر محرك NEX لفترة بعد تلقي حرف الهروب لتحديد ما إذا كان مستقلاً أم جزءًا من تسلسل الهروب. أثناء الانتظار، تؤدي الضغطات الإضافية على المفاتيح إلى جعل مفتاح الهروب يعمل كمفتاح تعريف. إذا لم يتم الضغط على أي مفتاح آخر، فسيتم التعامل معه باعتباره هروبًا مستقلاً.
بالنسبة لمحرك NEX، يمكننا استخدام خيار ZVM_ESCAPE_KEYTIMEOUT
لضبط مهلة الانتظار لمفتاح الهروب، الافتراضي هو 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
}
لقد وفر لك هذا البرنامج المساعد متغير ZVM_MODE
لاسترداد وضع vi الحالي وإظهار المؤشر بشكل أفضل.
ويتم حاليًا دعم الأوضاع التالية:
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
لتغيير سلوكيات التمييز (المحيطات والخط المرئي وما إلى ذلك)، ويمكن أن تكون قيمة اللون اسم لون أو قيمة لون سداسية عشرية .
على سبيل المثال:
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
تحظى القضايا وطلبات السحب بتقدير كبير. إذا لم تساهم مطلقًا في مشروع مفتوح المصدر قبل ذلك، يسعدني جدًا أن أرشدك إلى كيفية إنشاء طلب سحب.
يمكنك البدء بفتح مشكلة تصف المشكلة التي تريد حلها وسنبدأ من هناك.
هذا الموضوع مرخص بموجب ترخيص معهد ماساتشوستس للتكنولوجيا © Jeffrey Tse.