Zsh preexec - コードブロックからすべての先行インデントを切り取る方法は?

Zsh preexec - コードブロックからすべての先行インデントを切り取る方法は?

いくつかの情報といくつかのコードブロックを含むマニュアルから次のコードブロックをコピーするとしましょう.md(したがってスクリプトファイルではありません)。

⇨⇨⇨⇨(
⇨⇨⇨⇨Indented commands...
⇨⇨⇨⇨)

Zshpreexec関数を使用すると、元のコードブロックからすべての先行スペース(通常はタブ、スペースでもあります)を削除し、インデントされていないバージョンを返すことができます。

(
commands...
)

私が理解したのは、実行前のタスクです's/^\s*//g'

preexecでこれを達成する方法を共有してください。

答え1

preexec遅すぎるだろう。それまではコードが解析されました。これを修正したら、再解析する必要があります(そしてzshコードを完成させるには、より多くの行をプロンプトする必要があるかもしれません)。

たぶんaccept-lineウィジェットでこれを行うことができます。つまり、ラインエディタがシェルパーサにラインを供給する前に、次のようにすることができます。

accept-line() {
  emulate -L zsh       # default zsh behaviour locally
  set -o extendedglob  # with extendedglob for ## (= ERE +) below

  BUFFER=${BUFFER##[[:blank:]]##} # remove leading blanks

  # remove blanks after newlines in case a multiline buffer is accepted
  # for instance after a safe-paste or a newline entered with <Alt+Ret>
  BUFFER=${BUFFER//$'\n'[[:blank:]]##/$'\n'}

  # call original accept-line
  zle .$WIDGET
}
zle -N accept-line

関連情報