概要
例えば ll
と入力すると、勝手に ls``<Return>
してくれるような代物です。
bindkey -s "ll" "ls\n"
だと行頭以外でも発動してしまいますが、下記ソースだと行頭で ll
と入力した場合のみ発動します。
ソース
.zshrc
にコピペしてご利用下さい。
typeset -A aaaliases
aaaliases=(
"ll" "ls"
"gh" "gh"
)
self-insert-aa() {
local self_insert_next
zstyle -s ":self-insert-aa" self-insert-next self_insert_next
local aamatch
local aastroke
local aacommand
local aacontext
local aakey
aamatch=0
for aastroke in "${(@k)aaaliases}"; do
aacommand=$aaaliases[$aastroke]
aacontext=$aastroke[0,-2]
aakey=$aastroke[-1]
if [[ $LBUFFER == $aacontext && $KEYS == $aakey ]]; then
LBUFFER=$aacommand
zle .accept-line
aamatch=1
break
fi
done
if [[ $aamatch == 0 ]]; then
zle "$self_insert_next"
fi
}
self-insert-aa.on() {
# Find self-insert wrapper
# reference: knu/zsh-git-escape-magic (https://github.com/knu/zsh-git-escape-magic)
emulate -L zsh
local self_insert_next="${$(zle -lL | awk '$1=="zle"&&$2=="-N"&&$3=="self-insert"{print $4;exit}'):-.self-insert}"
zle -la "$self_insert_next" || zle -N "$self_insert_next"
zstyle ":self-insert-aa" self-insert-next "$self_insert_next"
zle -A self-insert-aa self-insert
}
zle -N self-insert-aa
self-insert-aa.on
カスタマイズ
aaaliases
に「発動のためのキーストローク」「コマンド」の順で入れます。キーストロークとコマンドは必ずしも一致している必要はありませんが、一致している場合でも明示的に並べて書いて下さい。
例えば、上記ソースの aaaliases
では以下のように置換されます。
-
ll
と入力 →ls
コマンドを自動確定 -
gh
と入力 →gh
コマンドを自動確定 (自分はgit history ...
のエイリアスにしています)
その他
ll
とそのまま打ちたくなった場合
- 最初にスペースを入れてごまかせば発動を回避できます
- quoted-insert を呼び出します。多分こっちの方が正しい方法
- vi mode の場合:
l<C-v>l
と打つ
- vi mode の場合:
url-quote-magic (prezto) と併用する場合
url-quote-magic を先にロードさせて下さい。こちらが後だと url-quote-magic に上書きされてしまいます。
ちなみに、prezto を利用していると自動で url-quote-magic がロードされるようです。こちらも prezto を先にロードさせる必要があるかも知れません。
参考
-
knu/zsh-git-escape-magic
-
self-insert
が既に置き換えられていた場合の挙動が大変参考になりました
-