假设我从手册中复制以下代码块.md
,其中包含一些信息和一些代码块(因此它不是脚本文件):
⇨⇨⇨⇨(
⇨⇨⇨⇨Indented commands...
⇨⇨⇨⇨)
Zshpreexec
函数可用于从原始代码块中删除所有前导空格(通常是制表符,但也可能是空格),并返回其未缩进的版本:
(
commands...
)
据我了解,预执行操作应该包括's/^\s*//g'
.
请分享您将如何通过 preexec 实现这一目标。
答案1
这样做preexec
就太晚了。到那时,代码已经被解析了。如果修改它,则需要再次解析它(并且可能zsh
需要提示更多行来完成代码)。
也许您可以在accept-line
小部件中执行此操作,即在行编辑器将行提供给 shell 解析器之前:
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