いくつかの情報といくつかのコードブロックを含むマニュアルから次のコードブロックをコピーするとしましょう.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