Desativar qualificadores glob no zsh

5

Existe uma maneira de desativar qualificadores glob com zsh? Parece um recurso útil, mas atrapalha os parênteses normais.

Eu uso ag para pesquisar arquivos, e ag mymethod(param) faz com que zsh reclame sobre missing end of name , e prefiro não ter que citar meus argumentos. Como eu nunca uso qualificadores glob, imaginei que os desativaria, mas meu Google não encontrou nenhum resultado.

    
por Josh 07.08.2014 / 23:25

2 respostas

3

Você pode desativar a sintaxe PATTERN(QUALIFIERS) desmarcando a opção bare_glob_qual :

setopt no_bare_glob_qual

Se a opção extended_glob estiver definida (e você deverá defini-la, a única razão para não configurá-lo é para compatibilidade retroativa com scripts raros que usam sintaxe incomum), então há outra sintaxe para qualificadores glob: PATTERN(#qQUALIFIERS) . Então você ainda pode usar qualifiers glob, que são um dos recursos mais importantes do zsh, mas você terá que digitar um pouco mais.

O Zsh permite que você desabilite a expansão de curingas (globbing), e isso parece uma escolha melhor para você. Se um comando for prefixado por noglob , não será executada globbing em seus argumentos. Por exemplo, para poder digitar URLs contendo ? como argumentos para wget , tenho alias wget='noglob wget' . Se você definir alias ag='noglob ag' , poderá digitar ag mymethod(param) .

Se ag tiver um padrão de pesquisa e nomes de arquivo como argumentos, desabilitar a globbing não será bom. Se você conseguir analisar os argumentos de ag , poderá executar a expansão de curingas neles. Eu não sei a sintaxe de ag , então eu vou dar um exemplo onde eu assumo que ag só pega opções que não aceitam argumentos, e que seu primeiro argumento não-opção é um padrão e o resto são arquivos.

ag () {
local i=1
  while [[ ${(P)i} = -* ]]; do ((++i)); done
  if ((i < $#)); then
    set -- "${(@)@[1,$i]}" $~@[$((i+1)),$#]
  fi
}
alias ag='noglob ag'
    
por 08.08.2014 / 02:52
2

Defina a opção SH_GLOB .

setopt sh_glob

De man zshoptions :

SH_GLOB Disables the special meaning of '(', '|', ')' and '<' for globbing the result of parameter and command substitutions, and in some other places where the shell accepts patterns. If SH_GLOB is set but KSH_GLOB is not, the shell allows the interpretation of subshell expressions enclosed in parentheses in some cases where there is no space before the opening parenthesis, e.g. !(true) is interpreted as if there were a space after the !. This option is set by default if zsh is invoked as sh or ksh.

    
por 08.08.2014 / 00:04

Tags