Лучший и дружественный плагин режима 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" ;
}
] ;
} ;
} ;
} ;
Fig добавляет приложения, ярлыки и автозаполнение в существующий терминал.
Установите 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
.
Но некоторым людям может понравиться специальная клавиша escape, такая как jj
, jk
и т. д. Если вы хотите настроить клавишу escape, вы можете узнать больше здесь.
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
: Вперед до конца слова [счетчик] включительно.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
: вставить новую командную строку над текущей. Существует 2 типа режима привязки клавиш для работы с объемным звуком, по умолчанию — classic
режим, вы можете выбрать режим, установив опцию ZVM_VI_SURROUND_BINDKEY
.
classic
режим (глагол->s->surround)S"
: Добавить "
для визуального выделения.ys"
: Добавить "
для визуального выделенияcs"'
: Измените "
на '
ds"
: Удалить "
s-prefix
(s->глагол->surround)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
Вы можете использовать приведенные ниже параметры, чтобы настроить клавишу escape, которая лучше соответствует вашему вкусу, например jj
или jk
и так далее.
ZVM_VI_ESCAPE_BINDKEY
: escape-клавиша vi во всех режимах (по умолчанию ^[
=> ESC
)ZVM_VI_INSERT_ESCAPE_BINDKEY
: escape-ключ vi в режиме вставки (по умолчанию $ZVM_VI_ESCAPE_BINDKEY
).ZVM_VI_VISUAL_ESCAPE_BINDKEY
: escape-клавиша vi в визуальном режиме (по умолчанию $ZVM_VI_ESCAPE_BINDKEY
).ZVM_VI_OPPEND_ESCAPE_BINDKEY
: escape-ключ 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
Этот плагин поддерживает выбор механизма readkey для чтения и обработки ключевых событий. Это легко сделать с помощью опции ZVM_READKEY_ENGINE
, в настоящее время поддерживаются следующие движки:
ZVM_READKEY_ENGINE_NEX
: это лучший механизм чтения ключей для замены ZLE (бета-версия).ZVM_READKEY_ENGINE_ZLE
: это механизм чтения ключей Zsh по умолчанию (ZLE).ZVM_READKEY_ENGINE_DEFAULT
: это движок этого плагина по умолчанию (теперь это движок NEX).NEX — лучший движок для чтения и обработки ключевых событий, чем движок ZLE Zsh. В настоящее время движок NEX все еще находится на стадии бета-тестирования, при желании вы можете вернуться к движку ZLE Zsh.
Например:
# Change to Zsh's default readkey engine
ZVM_READKEY_ENGINE= $ZVM_READKEY_ENGINE_ZLE
Вы можете использовать опцию ZVM_KEYTIMEOUT
, чтобы настроить тайм-аут ввода ключа для ожидания следующего ключа, по умолчанию — 0.4
секунды.
Клавиша выхода — это особый случай, ее можно использовать отдельно. Механизм NEX ожидает некоторое время после получения escape-символа, чтобы определить, является ли он автономным или частью escape-последовательности. Во время ожидания дополнительные нажатия клавиш заставляют клавишу escape вести себя как мета-клавишу. Если никакие другие нажатия клавиш не поступают, это обрабатывается как отдельный выход.
Для движка 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
, чтобы установить тип термина для плагина для обработки escape-последовательностей терминала, по умолчанию — $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
Мы очень ценим проблемы и запросы на включение. Если вы никогда раньше не участвовали в проекте с открытым исходным кодом, я более чем рад рассказать вам, как создать запрос на включение.
Вы можете начать с открытия вопроса, описывающего проблему, которую вы хотите решить, и мы продолжим дальше.
Эта тема распространяется по лицензии MIT © Джеффри Це.