Zsh preexec - Como aparar todos os recuos principais de um codeblock?

3

Digamos que eu copie o seguinte codeblock de um manual .md que contém algumas informações e alguns codeblocks (portanto, não é um arquivo de script):

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

A função Zsh preexec pode ser usada para remover todos os principais espaços em branco (geralmente tabulações, mas talvez também espaços) deste código original, e retornar uma versão sem recuo:

(
commands...
)

Tanto quanto eu entendo, a ação preexec deve incluir 's/^\s*//g' .

Por favor, compartilhe como você alcançaria esse objetivo com o preexec.

    
por JohnDoea 03.05.2017 / 12:27

1 resposta

2

Fazê-lo em preexec seria tarde demais. Por esse tempo, o código já foi analisado. Se você modificá-lo, ele precisaria ser analisado novamente (e possivelmente, zsh precisaria solicitar mais linhas para concluir o código).

Possivelmente aqui você pode fazer isso no widget accept-line , logo antes do editor de linha alimentar a linha para o analisador de 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
    
por 03.05.2017 / 14:41