Plugin mode vi(vim) yang lebih baik dan ramah untuk ZSH.
ZSH
untuk Agnostisisme. Mungkin Anda pernah mengalami mode Vi default di Zsh, setelah mengaktifkan mode Vi default, Anda secara bertahap menemukan bahwa ada banyak masalah, beberapa fitur tidak sempurna atau tidak ada, dan beberapa perilaku bahkan berbeda dari Vi (Vim asli) ) modus.
Meskipun mode Vi default agak memalukan dan tidak menyenangkan, Anda terus menggunakannya dan secara bertahap kehilangan minat setelah menggunakannya selama jangka waktu tertentu. Akhirnya, Anda menyerah dengan kecewa.
Anda tidak pernah berpikir lama tentang mode Vi, suatu hari Anda tidak sengaja menemukan plugin ini, Anda membaca di sini dan menyadari bahwa plugin ini untuk menyelesaikan masalah di atas dan membuat Anda jatuh cinta lagi dengan mode Vi. Senyuman tiba-tiba muncul di wajah Anda seperti mendapatkan kembali kehidupan yang baik.
Jika musim dingin tiba, bisakah musim semi berlalu jauh?
10p
dan 4fa
( Sedang berlangsung ).ZSH: >= 5.1.0
Gabungkan zsh-vi-mode
di .zshrc
Anda
antigen bundle jeffreytse/zsh-vi-mode
Muat zsh-vi-mode
sebagai plugin di .zshrc
Anda
zplug " jeffreytse/zsh-vi-mode "
Sertakan perintah muat di .zshrc
Anda
zgen load jeffreytse/zsh-vi-mode
Sertakan perintah muat di .zshrc
Anda
zinit ice depth=1
zinit light jeffreytse/zsh-vi-mode
Catatan: penggunaan depth=1
ice bersifat opsional, jenis es lainnya tidak direkomendasikan atau didukung secara resmi oleh plugin ini.
Kloning zsh-vi-mode
ke dalam repo plugin khusus Anda
git clone https://github.com/jeffreytse/zsh-vi-mode
$ZSH_CUSTOM /plugins/zsh-vi-mode
Kemudian muat sebagai plugin di .zshrc
Anda
plugins+=(zsh-vi-mode)
Ingatlah bahwa plugin perlu ditambahkan sebelum oh-my-zsh.sh
bersumber.
Tambahkan zsh-vi-mode
ke file plugin Anda (misalnya ~/.zsh_plugins.txt
)
jeffreytse/zsh-vi-mode
Muat zsh-vi-mode
sebagai plugin di .zshrc
Anda
plug " jeffreytse/zsh-vi-mode "
Muat zsh-vi-mode
sebagai plugin di .zimrc
Anda
zmodule jeffreytse/zsh-vi-mode
Bagi pengguna Homebrew, Anda dapat menginstalnya melalui perintah berikut
brew install zsh-vi-mode
Kemudian sumbernya di .zshrc
(atau .bashrc
) Anda
source $( brew --prefix ) /opt/zsh-vi-mode/share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Bagi pengguna Arch Linux, Anda dapat menginstalnya melalui perintah berikut
yay -S zsh-vi-mode
atau update terbaru (tidak stabil)
yay -S zsh-vi-mode-git
Kemudian sumbernya di .zshrc
(atau .bashrc
) Anda
source /usr/share/zsh/plugins/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Untuk pengguna Nix, mulai e7e3480530b34a9fe8cb52963ec2cf66e6707e15 Anda dapat mencari plugin melalui konfigurasi berikut
programs = {
zsh = {
interactiveShellInit = ''
source ${ pkgs . zsh-vi-mode } /share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
'' ;
} ;
} ;
Atau jika Anda lebih suka 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
'' ;
} ;
} ;
} ;
Anda juga dapat menggunakan fitur "plugin" bawaan 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 menambahkan aplikasi, pintasan, dan pelengkapan otomatis ke terminal Anda yang ada.
Instal zsh-vi-mode
hanya dalam satu klik.
Tersedia dalam hamparan dm9pZCAq
eselect repository enable dm9pZCAq
emerge --sync dm9pZCAq
emerge app-shells/zsh-vi-mode
Kemudian sumbernya di .zshrc
(atau .bashrc
) Anda
source /usr/share/zsh/site-contrib/zsh-vi-mode/zsh-vi-mode.plugin.zsh
Kloning repositori ini di suatu tempat ( $HOME/.zsh-vi-mode
misalnya)
git clone https://github.com/jeffreytse/zsh-vi-mode.git $HOME /.zsh-vi-mode
Kemudian sumbernya di .zshrc
(atau .bashrc
) Anda
source $HOME /.zsh-vi-mode/zsh-vi-mode.plugin.zsh
Gunakan ESC
atau CTRL-[
untuk masuk ke Normal mode
.
Namun sebagian orang mungkin menyukai custom escape key seperti jj
, jk
dan lain sebagainya, jika ingin custom escape key, Anda dapat mempelajari lebih lanjut dari sini.
ctrl-p
: Perintah sebelumnya dalam sejarahctrl-n
: Perintah berikutnya dalam sejarah/
: Pencarian mundur dalam sejarahn
: Ulangi yang terakhir /
Normal mode
ditunjukkan dengan kursor gaya blok, dan Insert mode
dengan kursor gaya balok secara default.
Dalam Normal mode
Anda dapat menggunakan vv
untuk mengedit baris perintah saat ini di editor (misalnya vi
/ vim
/ nvim
...), karena terikat pada Visual mode
.
Anda dapat mengubah editor dengan opsi ZVM_VI_EDITOR
, secara default adalah $EDITOR
.
$
: Ke akhir baris^
: Ke karakter pertama yang tidak kosong pada baris0
: Ke karakter pertama barisw
: [menghitung] kata ke depanW
: [menghitung] KATA majue
: Meneruskan ke akhir kata [hitungan] inklusifE
: Maju ke akhir WORD [hitungan] inklusifb
: [menghitung] kata mundurB
: [menghitung] KATA mundurt{char}
: Sampai sebelum [hitungan] kemunculan {char} ke kananT{char}
: Sampai sebelum [hitungan] kemunculan {char} ke kirif{char}
: Untuk [menghitung] kemunculan {char} ke-sebelah kananF{char}
: Untuk [menghitung] kemunculan {char} ke kiri;
: Mengulangi f, t, F atau T [hitungan] kali terakhir,
: Mengulangi f, t, F atau T terakhir dengan arah berlawanan i
: Menyisipkan teks sebelum kursorI
: Menyisipkan teks sebelum karakter pertama pada barisa
: Menambahkan teks setelah kursorA
: Menambahkan teks di akhir bariso
: Sisipkan baris perintah baru di bawah yang sekarangO
: Sisipkan baris perintah baru di atas yang sekarang Ada 2 jenis mode pengikatan tombol untuk pengoperasian surround, defaultnya adalah mode classic
, Anda dapat memilih mode dengan mengatur opsi ZVM_VI_SURROUND_BINDKEY
.
classic
(kata kerja->s->surround)S"
: Tambahkan "
untuk pemilihan visualys"
: Tambahkan "
untuk pemilihan visualcs"'
: Ubah "
menjadi '
ds"
: Hapus "
s-prefix
(s->kata kerja->surround)sa"
: Tambahkan "
untuk pemilihan visualsd"
: Hapus "
sr"'
: Ubah "
menjadi '
Perhatikan bahwa rangkaian tombol harus ditekan secara berurutan dengan cepat untuk menghindari batas waktu. Anda dapat memperpanjang batas waktu ini dengan opsi ZVM_KEYTIMEOUT
.
vi"
: Pilih objek teks di dalam tanda kutipva(
: Pilih objek teks termasuk tanda kurungKemudian Anda dapat melakukan operasi apa pun untuk pemilihan:
vi"
-> S[
atau sa[
=> "object"
-> "[object]"
va"
-> S[
atau sa[
=> "object"
-> ["object"]
di(
atau vi(
-> d
ca(
atau va(
-> c
yi(
atau vi(
-> y
Dalam mode normal, mengetik ctrl-a
akan bertambah ke kata kunci berikutnya, dan mengetik ctrl-x
akan berkurang ke kata kunci berikutnya. Kata kuncinya bisa berada di kursor, atau di sebelah kanan kursor (pada baris yang sama). Kata kuncinya bisa seperti di bawah ini:
Misalnya:
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
Anda dapat menggunakan opsi di bawah ini untuk menyesuaikan kunci escape yang lebih sesuai dengan selera Anda, seperti jj
atau jk
dan seterusnya.
ZVM_VI_ESCAPE_BINDKEY
: Kunci escape vi di semua mode (defaultnya adalah ^[
=> ESC
)ZVM_VI_INSERT_ESCAPE_BINDKEY
: Kunci escape vi dalam mode penyisipan (defaultnya adalah $ZVM_VI_ESCAPE_BINDKEY
)ZVM_VI_VISUAL_ESCAPE_BINDKEY
: Kunci escape vi dalam mode visual (defaultnya adalah $ZVM_VI_ESCAPE_BINDKEY
)ZVM_VI_OPPEND_ESCAPE_BINDKEY
: Kunci escape vi dalam mode menunggu operator (defaultnya adalah $ZVM_VI_ESCAPE_BINDKEY
)Misalnya:
# 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
Plugin ini telah mendukung pemilihan mesin readkey untuk membaca dan memproses peristiwa penting. Ini mudah dilakukan dengan opsi ZVM_READKEY_ENGINE
, saat ini mesin di bawah ini didukung:
ZVM_READKEY_ENGINE_NEX
: Ini adalah mesin readkey yang lebih baik untuk menggantikan ZLE (Beta).ZVM_READKEY_ENGINE_ZLE
: Ini adalah mesin readkey default Zsh (ZLE).ZVM_READKEY_ENGINE_DEFAULT
: Ini adalah mesin default plugin ini (Sekarang adalah mesin NEX).NEX adalah mesin yang lebih baik untuk membaca dan menangani peristiwa-peristiwa penting dibandingkan mesin ZLE milik Zsh, saat ini mesin NEX masih dalam tahap beta, Anda dapat mengubah kembali ke mesin ZLE milik Zsh jika Anda mau.
Misalnya:
# Change to Zsh's default readkey engine
ZVM_READKEY_ENGINE= $ZVM_READKEY_ENGINE_ZLE
Anda dapat menggunakan opsi ZVM_KEYTIMEOUT
untuk menyesuaikan batas waktu input kunci untuk menunggu kunci berikutnya, defaultnya adalah 0.4
detik.
Kunci escape merupakan case khusus, dapat digunakan secara mandiri. Mesin NEX menunggu beberapa saat setelah menerima karakter escape, untuk menentukan apakah karakter tersebut berdiri sendiri atau bagian dari rangkaian escape. Sambil menunggu, penekanan tombol tambahan membuat tombol escape berfungsi sebagai kunci meta. Jika tidak ada penekanan tombol lain yang dilakukan, ini ditangani sebagai pelarian mandiri.
Untuk mesin NEX, kita dapat menggunakan opsi ZVM_ESCAPE_KEYTIMEOUT
untuk menyesuaikan batas waktu tunggu untuk kunci escape, defaultnya adalah 0.03
detik.
Karena ada beberapa opsi konfigurasi yang bergantung pada beberapa variabel yang ditentukan dalam plugin, namun ada juga yang tidak. Kita perlu menyediakan fungsi entri konfigurasi terpadu. Nama fungsi entri disimpan dalam opsi yang disebut ZVM_CONFIG_FUNC
dan nilai defaultnya adalah zvm_config
, Anda dapat mengubahnya ke yang lain agar sesuai dengan selera Anda.
Jika fungsi konfigurasi ini ada, maka akan dipanggil secara otomatis, Anda dapat melakukan beberapa konfigurasi pada aspek ini sebelum Anda mencari plugin ini. Misalnya:
function zvm_config() {
ZVM_LINE_INIT_MODE= $ZVM_MODE_INSERT
ZVM_VI_INSERT_ESCAPE_BINDKEY=jk
}
source ~ /zsh-vi-mode.zsh
Plugin ini telah menyediakan mekanisme untuk menjalankan perintah tambahan, dan sekarang Anda memiliki aspek di bawah ini untuk menjalankan sesuatu:
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=()
Karena mode inisialisasi default, plugin ini akan menimpa pengikatan kunci sebelumnya, hal ini menyebabkan pengikatan kunci dari plugin lain (yaitu fzf
, zsh-autocomplete
, dll.) gagal.
Anda dapat mengatasi masalah kompatibilitas seperti di bawah ini:
# Append a command directly
zvm_after_init_commands+=( ' [ -f ~/.fzf.zsh ] && source ~/.fzf.zsh ' )
atau
# 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)
atau
# The plugin will auto execute this zvm_after_init function
function zvm_after_init() {
[ -f ~ /.fzf.zsh ] && source ~ /.fzf.zsh
}
atau jika Anda menggunakan zinit
:
# For postponing loading `fzf`
zinit ice lucid wait
zinit snippet OMZP::fzf
Secara default, fitur pengikatan tombol malas diaktifkan, semua pengikatan kunci mode normal
dan visual
harus dijalankan oleh zvm_after_lazy_keybindings_commands
. Misalnya:
# 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
}
Plugin ini memiliki dua fungsi bagi Anda untuk menentukan widget khusus dan pengikatan tombol. Jika terjadi masalah yang tidak perlu, lebih baik menggunakannya, terutama ketika Anda menemui konflik utama.
Untuk menentukan widget khusus, Anda harus:
# If [your_custom_widget] were ignored, it will be the same with <your_custom_widget>
zvm_define_widget < your_custom_widget > [your_custom_function]
Untuk menentukan pengikatan kunci, Anda harus:
zvm_bindkey < keymap > < keys > < widget >
Misalnya:
# 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
}
Plugin ini telah menyediakan variabel ZVM_MODE
bagi Anda untuk mengambil mode vi saat ini dan menampilkan indikator dengan lebih baik.
Dan saat ini mode di bawah ini didukung:
ZVM_MODE_NORMAL
ZVM_MODE_INSERT
ZVM_MODE_VISUAL
ZVM_MODE_VISUAL_LINE
ZVM_MODE_REPLACE
Untuk memperbarui indikator mode vi, kita harus menambahkan perintah kita ke zvm_after_select_vi_mode_commands
. Misalnya:
# 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
}
Plugin ini telah menyediakan beberapa opsi bagi pengguna untuk menyesuaikan gaya kursor untuk kompatibilitas terminal yang lebih baik.
ZVM_CURSOR_STYLE_ENABLED
(Defaultnya adalah 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 '
}
Kita dapat menggunakan opsi ZVM_TERM
untuk mengatur tipe istilah plugin untuk menangani urutan escape terminal, defaultnya adalah $TERM
. Bisa jadi xterm-256color
, alacritty-256color
, st-256color
, dll. Penting bagi beberapa emulator terminal untuk menampilkan kursor dengan benar.
Anda dapat menggunakan ZVM_VI_HIGHLIGHT_BACKGROUND
, ZVM_VI_HIGHLIGHT_FOREGROUND
dan ZVM_VI_HIGHLIGHT_EXTRASTYLE
untuk mengubah perilaku sorotan ( surround, garis visual, dll.), nilai warna dapat berupa nama warna atau nilai warna hex .
Misalnya:
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
Anda dapat mengatur mode awal baris perintah dengan opsi ZVM_LINE_INIT_MODE
.
Saat ini mode di bawah ini didukung:
ZVM_MODE_LAST
: Dimulai dengan mode terakhir (Default).ZVM_MODE_INSERT
: Dimulai dengan mode penyisipan.ZVM_MODE_NORMAL
: Dimulai dengan mode normal.Misalnya:
# Always starting with insert mode for each command line
ZVM_LINE_INIT_MODE= $ZVM_MODE_INSERT
Plugin ini telah mendukung fitur pengikatan kunci yang lambat, dan diaktifkan secara default. Untuk menonaktifkannya, Anda dapat mengatur opsi ZVM_LAZY_KEYBINDINGS
ke false
sebelum plugin ini dimuat. Fitur ini akan menunda semua pengikatan tombol mode normal
dan visual
ke saat pertama kali Anda masuk ke mode normal.
Ini dapat sangat meningkatkan kecepatan startup, terutama Anda membuka terminal dan hanya ingin menjalankan perintah sederhana.
Untuk mencegah berbagai masalah terkait pengikatan kunci yang disebabkan oleh urutan sumber plugin, dan juga menjaga fungsi yang sama untuk plugin ini, inisialisasi plugin ini ditunda hingga baris perintah pertama dimulai.
Namun, hampir semua plugin diinisialisasi saat skrip diambil. Oleh karena itu, plugin ini menyediakan opsi ZVM_INIT_MODE
untuk mengubah mode inisialisasi.
Misalnya:
# Do the initialization when the script is sourced (i.e. Initialize instantly)
ZVM_INIT_MODE=sourcing
Masalah dan Permintaan Tarik sangat dihargai. Jika Anda belum pernah berkontribusi pada proyek sumber terbuka sebelumnya, saya dengan senang hati akan memandu Anda tentang cara membuat permintaan tarik.
Anda dapat memulai dengan membuka masalah yang menjelaskan masalah yang ingin Anda selesaikan dan kita akan mulai dari sana.
Tema ini dilisensikan di bawah lisensi MIT © Jeffrey Tse.