ZSH 用の、より優れたフレンドリーな vi(vim) モード プラグイン。
ZSH
プラグイン。 おそらく、あなたは Zsh のデフォルトの Vi モードを経験したことがあると思います。デフォルトの Vi モードをオンにした後、徐々に多くの問題があり、いくつかの機能が完璧ではなかったり存在しなかったり、一部の動作がネイティブの Vi(Vim) と異なっていたりすることに気づきました。 )モード。
デフォルトの Vi モードは少し恥ずかしくて不快でしたが、それを使い続け、一定期間使用すると徐々に興味を失いました。結局、あなたは残念ながら諦めてしまいました。
長い間 Vi モードのことを考えたこともありませんでしたが、ある日偶然このプラグインを発見し、ここを読んで、このプラグインが上記の問題を解決し、再び Vi モードの虜になることを知りました。良い生活を取り戻したかのように、突然あなたの顔に笑みが浮かびました。
冬が来るなら、春ははるかに遅れているでしょうか?
10p
や4fa
などの繰り返しコマンド (進行中)。ZSH: >= 5.1.0
.zshrc
にzsh-vi-mode
をバンドルします。
antigen bundle jeffreytse/zsh-vi-mode
zsh-vi-mode
.zshrc
にプラグインとしてロードします
zplug " jeffreytse/zsh-vi-mode "
.zshrc
にloadコマンドを含めます。
zgen load jeffreytse/zsh-vi-mode
.zshrc
にloadコマンドを含めます。
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
に入ります。
ただし、 jj
、 jk
などのカスタム エスケープ キーを好む人もいるかもしれません。エスケープ キーをカスタマイズしたい場合は、ここから詳細を学ぶことができます。
ctrl-p
: 履歴内の前のコマンドctrl-n
: 履歴内の次のコマンド/
: 履歴を逆方向に検索しますn
: 最後の/
を繰り返しますデフォルトでは、 Normal mode
ブロック スタイル カーソルで示され、 Insert mode
梁スタイル カーソルで示されます。
Normal mode
では、vv はVisual mode
にバインドされているため、エディター (例: vi
/ vim
/ nvim
...) で現在のコマンド ラインを編集するためにvv
使用できます。
ZVM_VI_EDITOR
オプションでエディタを変更できます。デフォルトでは$EDITOR
です。
$
: 行末まで^
: 行の最初の非空白文字へ0
: 行の先頭文字までw
: [単語数をカウント] 進めますW
: [カウント] ワード分進みますe
: 単語 [count] の終わりまで転送E
: WORD [カウント] の最後まで転送b
: 単語を逆方向に[カウント]しますB
: [単語数を逆に数えます]t{char}
: 右側の [count] 番目の {char} が出現する前までT{char}
: 左にある [count] 番目の {char} が出現する前までf{char}
: 右にある [count] 番目の {char} の出現へF{char}
: 左にある [count] 番目の {char} の出現まで;
: 最新の f、t、F、または T [count] 回繰り返します,
: 最新の f、t、F または T を逆方向に繰り返しますi
: カーソルの前にテキストを挿入しますI
: 行の最初の文字の前にテキストを挿入します。a
: カーソルの後にテキストを追加しますA
: 行末にテキストを追加しますo
: 現在のコマンドラインの下に新しいコマンドラインを挿入します。O
: 現在のコマンドラインの上に新しいコマンドラインを挿入します。 サラウンド操作には 2 種類のキーバインド モードがあり、デフォルトは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
このプラグインは、キー イベントの読み取りと処理のための readkey エンジンの選択をサポートしました。 ZVM_READKEY_ENGINE
オプションを使用すると簡単に実行できます。現在、以下のエンジンがサポートされています。
ZVM_READKEY_ENGINE_NEX
: ZLE (ベータ版) に代わる、より優れた読み取りキー エンジンです。ZVM_READKEY_ENGINE_ZLE
: Zsh のデフォルトの読み取りキー エンジン (ZLE) です。ZVM_READKEY_ENGINE_DEFAULT
: このプラグインのデフォルト エンジンです (現在は NEX エンジンです)。NEX は、Zsh の ZLE エンジンよりも主要なイベントの読み取りと処理に優れたエンジンです。現在、NEX エンジンはまだベータ段階にあり、必要に応じて Zsh の 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
}
このプラグインには、カスタム ウィジェットとキーバインドを定義するための 2 つの関数があります。不必要な問題が発生した場合、特にキーの競合に遭遇した場合には、これらを使用することをお勧めします。
カスタム ウィジェットを定義するには、次のことを行う必要があります。
# 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
}
このプラグインは、現在の vi モードを取得し、インジケーターをより適切に表示するためのZVM_MODE
変数を提供します。
現在、以下のモードがサポートされています。
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
を使用して、ハイライト動作 (周囲、視線など) を変更できます。色の値は、色の名前または16 進数の色の値です。
例えば:
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 ライセンス © Jeffrey Tse に基づいてライセンスされています。