É possível fazer uma substituição de texto ativa no shell?

2

Eu corro zsh na minha máquina. Eu queria saber se eu posso fazer substituição de texto no shell. Por exemplo, fn[SPACE/TAB] deve ser substituído por function . Em OSX , há a opção de atalhos de teclado, mas eles não são executados em chrome ou shell . Existe uma maneira de ajustar o sistema operacional para que ele interprete fn como function ?

Seria incrível se isso pudesse ser alcançado.

    
por CupOfCoffee 08.08.2017 / 22:26

1 resposta

3

zsh fornece uma grande quantidade de cabos, uma parte da qual é a característica _user_expand para fornecer as chamadas "expansões de usuários" de entradas aleatórias para saídas aleatórias. Por exemplo.

# turn on completion system
autoload -U compinit
compinit
# how to mangle inputs; this is a hash or "associative array" of terms
declare -A manglements
manglements=( fn function )
# register mangler and enable _user_expand
zstyle ':completion:*:user-expand:*' user-expand '$manglements'
zstyle ':completion:*' completer _user_expand _complete _ignored

Com isto configurado em .zshrc ou algo assim, digitar fn guia espaço deve substituir esse texto por function (ou pelo menos por mim introduzindo as linhas acima no zsh 5.3.1, execute como zsh -f para evitar conflitos com qualquer configuração existente. Para reduzir a entrada para apenas fn guia , defina a configuração add-space

zstyle ':completion:*:user-expand:*' add-space 1

mas se você realmente quer um espaço mágico de espaço ao invés de tab , isto requer que a barra de espaço tenha um widget ligado a ele, o que é um pouco mais significativo ( e perigosa) mudança.

declare -A manglements
manglements=( fn function )

function magic-space-bar {
   local -a le_vlapoi

   # split on words, see zshexpn(1)
   le_vlapoi=(${(z)BUFFER})

   # only mangle the first word, not surprisingly in middle of some
   # "echo blah fn ..." sequence (this is the same as the 'alias -g'
   # rake problem waiting to whap you in the face)
   if [[ $#le_vlapoi -eq 1 ]]; then
      local romoi
      romoi=$manglements[$le_vlapoi[-1]]
      if [[ -n $romoi ]]; then
         le_vlapoi[-1]=$romoi
         BUFFER="$le_vlapoi"
      fi
   fi

   # ensure the typed space happens regardless
   BUFFER="$BUFFER ";
   CURSOR=$#BUFFER
}

zle -N magic-space-bar
autoload -U compinit
compinit
bindkey ' ' magic-space-bar
bindkey -M isearch ' ' self-insert
    
por 09.08.2017 / 00:25