Zsh preexec - 如何修剪代码块中的所有前导缩进?

Zsh preexec - 如何修剪代码块中的所有前导缩进?

假设我从手册中复制以下代码块.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

相关内容