戻る

ZLE解説

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で. カーソル位置は元に戻らないので注意.

Ctrl + zをfgの代わりにする

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