zsh で C-r したときスペースを補完語として入力できないという状況を回避するバッドノウハウ
zsh で C-r しているとき、スペースを補完語に使いたくても、スペースを入力した瞬間に bck-i-search: を抜けて、コマンド先頭にスペースが挿入されてしまうという状態になっていた。望む希望としては、スペースを入力したら、スペースも補完語として挿入されてほしい。
これはどうやら、自分で bindkey " " magic-abbrev-expand-and-insert というように、スペースキーに対して独自定義の関数を定義しているとそうなってしまうらしい。
zle_hist.c によると、bck-i-search の間のキー入力はハードコードで分岐していて、既に決まっているものについて書きかえるしかない。
なんとなく magic-space を上書きしてやったら、望む挙動になった。
# abbr
typeset -A abbreviations
abbreviations=(
"L" "| \$PAGER"
"G" "| grep"
"H" "$HOME/project/Hatena-"
"HE" "lib/**/Engine/"
"HM" "lib/**/MoCo/"
"HA" "lib/**/App/"
"HC" "lib/**/Config.pm"
"HEAD^" "HEAD\\^"
"HEAD^^" "HEAD\\^\\^"
"HEAD^^^" "HEAD\\^\\^\\^"
"HEAD^^^^" "HEAD\\^\\^\\^\\^\\^"
"HEAD^^^^^" "HEAD\\^\\^\\^\\^\\^"
# typo
"lkm" "lm"
"it" "git"
"gitp" "git"
"mysql" "mysql -unobody -pnobody -h"
)
magic-abbrev-expand () {
local MATCH
LBUFFER=${LBUFFER%%(#m)[-_a-zA-Z0-9^]#}
LBUFFER+=${abbreviations[$MATCH]:-$MATCH}
}
# BK
magic-space () {
magic-abbrev-expand
zle self-insert
}
magic-abbrev-expand-and-insert () {
magic-abbrev-expand
zle self-insert
}
magic-abbrev-expand-and-insert-complete () {
magic-abbrev-expand
zle self-insert
zle expand-or-complete
}
magic-abbrev-expand-and-accept () {
magic-abbrev-expand
zle accept-line
}
magic-abbrev-expand-and-normal-complete () {
magic-abbrev-expand
zle expand-or-complete
}
no-magic-abbrev-expand () {
LBUFFER+=' '
}
zle -N magic-abbrev-expand
zle -N magic-abbrev-expand-and-magic-space
zle -N magic-abbrev-expand-and-insert
zle -N magic-abbrev-expand-and-insert-complete
zle -N magic-abbrev-expand-and-normal-complete
zle -N magic-abbrev-expand-and-accept
zle -N no-magic-abbrev-expand
zle -N magic-space # BK
bindkey "\r" magic-abbrev-expand-and-accept # M-x RET できなくなる
bindkey "^J" accept-line # no magic
bindkey " " magic-space # BK
bindkey "." magic-abbrev-expand-and-insert
bindkey "^I" magic-abbrev-expand-and-normal-complete