July 17, 2020
Macがzshになるなら、ZLEを習得するっきゃない! を参考というか丸写しになってしまったがZLEというzshの機能について解説する.
ZLEとはZsh Line Editorの略語で補完機能を自分でカスタマイズできる. 次のコードを.zshrcに記述してみる.
function my_edit_func() {
BUFFER="${BUFFER}xyz"
CURSOR+=1
zle redisplay
}
zle -N my_edit_func
bindkey "^j" my_edit_func
source ~/.zshrc コマンドで.zshrcを再読み込みする. コマンドライン編集部分でCtrl + j を押すとxyzが末尾に追加されるようになる.
操作前
$ abc
^ ^はカーソル位置
操作後
$ abcxyz
BUFFERはコマンドラインで編集している文字列を格納する変数. BUFFERの値を変えることでコマンドラインの文字列も変わる.
CURSORはカーソルがある位置が格納される変数.
zle redisplay 画面のリフレッシュ. 不要な場合も多いがつけると確実
zle -N myedit_func はmy_edit_funcをZLEウィジェットとして登録
bindkey "^j" my_edit_func はctrl + j でmy_edit_funcを発動
応用例. シェルコマンドを活用できる.
function my_edit_func() {
BUFFER=$(echo ${BUFFER} | sh)
CURSOR=${#BUFFER}
zle redisplay
}
zle -N my_edit_func
bindkey "^j" my_edit_func
操作前
$ echo $LANG
^
操作後
$ ja_JP.UTF-8
^
既存のウィジェットと組み合わせて使うこともできる. zsh自体もタブを押した時にexpand-or-completeによって補完を行っている. 単語途中でタブが押されてもスペースを挿入して無理やりその位置で補完を実行する.
function my_edit_func() {
if [[ "${RBUFFER:0:1}" != " " ]]; then
BUFFER="${LBUFFER} ${RBUFFER}"
fi
zle expand-or-complete
zle redisplay
}
zle -N my_edit_func
bindkey "^j" my_edit_func
操作前
$ ls /Apple
^
操作後
$ ls /Applications/ le
^
Undoはctrl + xで. カーソル位置は元に戻らないので注意.
vimなどをCtrl + zで一時的に退避させてfgで元に戻ることができるが, fgではなくctrl + zで戻れるとtoggleしている感覚がいい.
function fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
BUFFER="fg"
zle accept-line
else
zle push-input
zle clear-screen
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z