Modifique os valores de $ READLINE_LINE e $ READLINE_POINT no script bash

5

Eu já fiz essa pergunta no stackoveflow , mas não recebeu resposta e muito poucos pontos de vista. Eu pensei que iria postar aqui como deveria haver mais usuários bash e alguém já poderia ter tropeçado neste problema. De acordo com SO Meta , não há problema em fazê-lo, desde que eu faça o link para a postagem do website cruzado. Diga-me se eu estiver errado, e vou deletar essa pergunta.

Eu tentei implementar alguns recursos de ksh path autocompletion em bash vinculando um script personalizado a uma chave. Para fazer isso, meu script leu as informações de bind variables $READLINE_LINE e $READLINE_POINT e tenta atualizar esses valores. Embora eu possa ler o buffer de linha sem problemas, não consigo modificar essas variáveis e atualizar a linha atual.

De acordo com a página mandada, isso deve funcionar:

When shell-command is executed, the shell sets the READLINE_LINE variable to the contents of the readline line buffer and the READLINE_POINT variable to the current location of the insertion point. If the executed command changes the value of READLINE_LINE or READLINE_POINT, those new values will be reflected in the editing state

Eu limitei meu scipt com bind -x '"\t":autocomplete.sh' e fiz algo assim:

#!/bin/bash
#autocomplete.sh
echo $READLINE_LINE $READLINE_POINT   #I can read the current line values
EXPANSION=($(magical_autocomplete $READLINE_LINE))
#we store the desired value for the line in ${EXPANSION[0]}
[[ ${#EXPANSION[@]} -gt 1 ]] && echo ${EXPANSION[@]:1} #we echo the match if there are more than 1

READLINE_LINE=${EXPANSION[0]}
READLINE_POINT=${#READLINE_LINE}
#echo READLINE_LINE READLINE_POINT echoes the correct values found by magical_autocomplete
#however the current line & the current point is not updated

Como estou ecoando algumas informações, não posso apenas redirecionar a saída do meu script para $READLINE_LINE na chamada bind . Por que posso ler as variáveis, mas não escrever nelas?

    
por Aserre 08.08.2014 / 11:52

1 resposta

7

Apenas pela mesma razão pela qual isso não funcionará:

$ export a=1
$ bash -c 'echo $a; let a++'
1
$ echo $a
1

Variáveis de ambiente são herdáveis , não compartilháveis. Como autocomplete.sh é executado como um novo processo filho, ele pode ler todas as variáveis principais, mas não pode enviar novos valores de volta.

Para modificar READLINE_LINE e READLINE_POINT , você precisa executar seu preenchimento automático no mesmo processo - source e as funções ajudarão você.

# autocomplete.sh
# should be sourced from ~/.bashrc or something

autocomplete() {
    echo $READLINE_LINE $READLINE_POINT
    EXPANSION=($(magical_autocomplete $READLINE_LINE))
    #we store the desired value for the line in ${EXPANSION[0]}
    [[ ${#EXPANSION[@]} -gt 1 ]] && echo ${EXPANSION[@]:1}

    READLINE_LINE=${EXPANSION[0]}
    READLINE_POINT=${#READLINE_LINE}
}

Ligação:

if [[ -s "$HOME/.bashrc.d/autocomplete.sh" ]]; then
    source "$HOME/.bashrc.d/autocomplete.sh" 
    bind -x '"\t" : autocomplete'
fi
    
por 08.08.2014 / 12:20